ppedv Team Blog: Windows 10 Preview Build 9926 in Deutsch - Cortana aktivieren

Wenn man sich die kürzlich erschienene Build 9926 der Windows 10 Preview heruntergeladen und “aus Versehen” oder vielleicht auch absichtlich auf Deutsch installiert hat, steht der persönliche Sprachassistent “Cortana” nicht zur Verfügung.

Ich möchte im Folgenden Erklären, was nötig ist, um Cortana doch nutzen zu können.

Zunächst muss über die Einstellung “Region und Sprache” (u.a. über das Startmenü zu erreichen, einfach danach suchen) die Region auf “Vereinigte Staaten” und die Sprache auf “English (United States)” gestellt werden:

cortana0

cortana1

Dabei muss zunächst die Sprache über “Sprache hinzufügen” hinzugefügt und dann über “Als primär festlegen” als Standardsprache definiert werden.

Das allein genügt aber noch nicht!

Als nächstes müssen die Sprachdateien heruntergeladen werden. Dazu öffnet man die “Optionen” der Sprache Englisch. Dort kann man dann das “Sprachpaket herunterladen”:

cortana2

Nachdem auch das erledigt ist, muss u.U. noch das “Input Personalization Dictionary” heruntergeladen werden. Wenn dieses Paket fehlt, bekommt man bei der Benutzung von Cortana den Fehler 0x80070102:

cortana2b

Das Dictionary wird als Windows Update angeboten und verteilt:

cortana3

Abschließend muss Cortana noch aktiviert bzw. zugelassen werden. Dazu klickt man am einfachsten in die weiße Suchbox unten links:

cortana5 

Nun sollte Cortana zur Verfügung stehen. Dies ist daran zu erkennen, dass in dem Suchfeld unten links ein Mikrofon zu sehen ist:

cortana4

Bei Bedarf kann man nun auch noch in den Cortana-Einstellungen aktivieren, dass sich Cortana alleine durch das Aussprechen von “Hey Cortana” aktiviert und auf Spracheingaben reagiert. Dazu müssen die Cortana-Einstellungen in der oberen linken Ecke des aktivierten Suchfeldes verwendet werden:

cortana6    cortana7

Der Download der aktuellen Preview kann über diesen Link erfolgen: http://windows.microsoft.com/de-de/windows/preview-iso

ppedv Team Blog: HTML5 Hash Bang

Was ist Hash und macht Bang? Zwei Zeichen aus dem ASCII Alphabet - das # und der !. In Kombination werden Sie als Hashbang bezeichnet und werden zur Client Seitigen Steuerung von Web Anwendungen verwendet.

Das Problem von Hashbangs beginnt bereits mit dem #. Im Grunde genommen versteckt die Technik die eigentlichen Seiteninhalte. Die Angaben nach dem Hash  werden vom Browser nicht mehr an den Server übergeben. Der Teil nach dem Hash wird als Fragment Identifier bezeichnet und ist genau genommen nicht Bestandteil der URL.
Speziell in Single Pages Applications wird ein Routing Konzept benötigt, das es am Client erlaubt die Url auszuwerten. Facebook und auch Twitter haben davon, in der Vergangenheit, ausgiebig gebrauch gemacht.

Mit der Url https://twitter.com/#!/ppedv wird stand heute allerdings auf die Adresse https://twitter.com/ppedv umgeleitet.

Wie das Fiddlertool zeigt, wird im Initialen Request der Hash nicht an den Server übermittelt. Erst mit einem weiteren Request initiiert durch JavaScript aus dem ersten Request, wird die eigentliche URL geladen.

image

Twitter scheint den SPA Ansatz damit nur kurz zu nutzen um den Hashbank auszulesen und wechselt dann auf Server generierten HTML Code. Die Daten stecken also nicht in JSON sondern ganz klassisch im HTML Code.

Mit HTML5 wird von diesem Missbrauch des Anchor Tags nun obsolet. Es existiert der sogenannte PushState (aus der Session History Api). Dieser wird von Frameworks wie Angular.js auch verwendet um Client seitiges URL Routing zu nutzen. Man muss es aktuell bei Angular i JavaScript Code auch aktivieren. Damit lässt sich die Url in der Browser Leiste beliebig schreiben und lesen.

Ralf Westphal: Die Selbstlern-Challenge - Mitmachen und gewinnen!

500€ gibt es zu gewinnen. Ingesamt jedenfalls. Die bin ich bereit, als “Preisgeld” auszusetzen für diejenigen, die erfolgreich mitmachen. Die Herausforderung Ich suche 10 Freiwillige, die bereit sind, 10 Wochen lang sich im Selbststudium mit Flow Design auseinanderzusetzen. Das habe ich in einigen Büchern und vielen Blog-Artikeln ausführlich beschrieben. Dazu gehören Themen wie: Radikale

codefest.at [MS]: Kostenfreies eBook Developers Guide to the New .NET

Auf .NET Developer kommt viel Neues zu. Der Tools-Hersteller Telerik bietet ein kostenfreies eBook an, welches über die wichtigsten Neuerungen in .Net informiert. Das ansprechende eBook wurde von Michael Crump und Sam Basu geschrieben und ist 49 Seiten stark.

Es ist nur eine Angabe des Namens, einer E-Mail Adresse und des Landes erforderlich, dann startet der Download des 16MB eBooks: The Developer’s Guide to the New .NET

image

Die Zukunft des “neuen” .NET startete letzten November mit der Open Source-Ankündigung auf dem Connect(); Microsoft Visual Studio vNext & Azure Online-Event (siehe auch unsere Zusammenfassung hier).

image

Das eBook informiert über .NET, Roslyn (die .NET Compiler Platform), .NET Native, Just-In-Time Compilers, die .NET  Foundation (die mit Build 2014 ins Leben gerufen wurde), Apache Cordova (Cross Platform) und ASP.NET vNext (Open Source, mit MVC 6 und den letzten Versionen von WebPages, Web API, SignalR und Entity Framework) und natürlich über die aktuellen Tools bis hin zu Windows 10 (mit animierten Screens).

image

Für alle .NET Developer: Runterladen und durchlesen! Zwinkerndes Smiley

Danke an Oliver Michalski, Azure Community Deutschland, für den Tipp zum eBook!

Christian Binder [MS]: Whiteboard Sessions - Treffen Sie die MTC Architekten auf den ALM Days 2015

 

image

Erstmalig haben wir auf den ALM Days die Architekten des  MTC Teams vor Ort mit 60 minütigen Whiteboard Sessions.

Sie kommen mit Ihrem Szenario und Ihren Diskussionsthemen zu uns und wir nehmen uns Zeit für Sie und Ihre Fragen.“

Hier die Themen:

Cloud

Alles rund um Microsoft Azure Active Directory
Development mit Microsoft Azure PaaS Diensten
Infrastruktur in der Cloud mit Microsoft Azure IaaS Diensten

Office

Microsoft Office und Microsoft Office 365 Development
Hybride Szenarien mit Microsoft Office 365
Alles rund um Microsoft SharePoint Server und Microsoft Office 365 SharePoint Online
Alles rund um Microsoft Office 365 Delve

.NET 

Alles rund um das .NETFramework und Development

Windows

Client Strategie - mit einem Windows für alle Geräte in die Zukunft
Device Management - Durchblick und den Durchgriff behalten
Evolution im Rechenzentrum - Cloud oder eigene Server oder beides?
„End of Support“ - Jetzt der Windows Server 2003. Optionen?

Die Whiteboard Sessions sind für alle Besucher der ALM Days kostenfrei – Interessiert? Email an cbinder@microsoft.com

Norbert Eder: #fotomontag #4

Jeden Montag ein Foto. Der #fotomontag.

Diese Aufnahme stammt vom Göstinger Ruinenberg und zeigt das Nordportal des Plabutschtunnels (Pyhrn Autobahn, A9). Das Foto wurde an der Stelle aufgenommen, an der Anna von Gösting in den Tod gestürzt sein soll. Dies tat sie, nachdem ihre Liebe im Zweikampf mit einem anderen Ritter erschlagen wurde.

Ausblick Jungfernsprung

Ausblick Jungfernsprung

Hast du eine Meinung zum Foto? Ja? Dann lass sie mich doch bitte wissen und bewerte es in den Kommentaren.

The post #fotomontag #4 appeared first on Norbert Eder.

Karsten Kempe: Visual Studio Online erfüllt ISO 27001 Norm

TeamFoundationService_2Am 15.01.2015 hat Microsoft eine Meldung veröffentlicht, die ein sehr sensibles und wichtiges Thema betrifft – Datenschutz in der Cloud. Durch die Zertifizierung der ISO 27001 Norm hat sich Microsoft nun von einer unabhängigen Instanz bestätigen lassen, dass die Sicherheitsmechanismen von Visual Studio Online den Anforderungen besagter ISO-Norm entsprechen. Darüber hinaus wurden die sogenannten „European Model Clauses“ (Klauseln zum europäischen Datenschutz) in die Vertragsbedingungen des Services aufgenommen.

Während wir als Privatperson im Zeitalter von Facebook, Instagram, Amazon oder OneDrive unsere Daten oftmals gedankenlos preisgeben und einfach darauf vertrauen, dass sie nicht missbräuchlich verwendet werden, brauchen Firmen hunderprozentige Aufklärung darüber, was mit den jeweiligen Daten geschieht und wo diese aufbewahrt werden. Besonders europäische Firmen achten sehr stark auf die Einhaltung der Datenschutzrichtlinien und stehen den Cloud-Angeboten (unabhängig vom Provider) eher zurückhaltend gegenüber. Für mich ist es daher auch nicht verwunderlich, dass die gehostete Variante des Team Foundation Servers – Visual Studio Online – nach wie vor ein Randthema für deutsche Unternehmen ist. Allzu oft habe ich Fragen zum Thema „Datensicherheit und VSO“ gehört und gestellt bekommen: „Kann ich beeinflussen wo meine Daten geographisch abgelegt werden?“ „Woher weiß ich, dass Microsoft mit meinen Daten sensibel umgeht?“, etc.

Nachdem Microsoft bereits im Oktober 2014 die Verfügbarkeit einer VS Online Instanz in der Region „West Europa“, genauer gesagt in den Niederlanden, verkündet hat und Benutzer diese Region nun bei der Erstellung eines Visual Studio Online Accounts auswählen können, wurde zumindest die Geographie-Frage geklärt. Allerdings blieb Microsoft bisher noch den Beweis für die Sicherheit der Daten und vor allem für die Einhaltung der Sicherheitsanforderungen in den jeweiligen VS Online Regionen schuldig.

Brian Harry, Corporate Vice President, hat nun vor kurzem auf seinem Blog veröffentlicht, dass Visual Studio Online seit Dezember 2014 ISO 27001 zertifiziert ist und damit einen für Microsoft wichtigen Meilenstein erreicht hat. Denn durch dieses Zertifikat ist Microsoft erstmals in der Lage, seine Anstrengungen in Richtung Datenschutz zu belegen. Außerdem wurden die Datenschutzrichtlinien der EU aus dem Jahr 2012 Vertragsbedingungen von VS Online aufgenommen.

ISO 27001 (Quelle: TÜVRheinland)

„ISO 27001 ist ein weltweit anerkannter Standard für die Bewertung der Sicherheit von Informationen und IT-Umgebungen. Der Standard beschreibt die Anforderungen an die Umsetzung sowie die Dokumentation eines Informationssicherheitsmanagement-Systems (ISMS) bis ins Detail. Mit einer ISO 27001 Zertifizierung identifizieren und beseitigen Sie IT-Risiken und etablieren IT- Sicherheitsverfahren, die zur nachhaltigen Optimierung der Qualität Ihrer Systeme beitragen.“

Natürlich kann dieses Zertifikat nicht dafür sorgen, dass Skepsis und Verunsicherung schlagartig weichen. Es ist vielmehr ein kleines Puzzle-Stück in einem langen Prozess. Microsoft und Visual Studio Online müssen sich das Vertrauen verdienen und möglichst ohne Sicherheitslecks oder Datenskandale auskommen. Die Entscheidung, die gehostete Variante des TFS zu verwenden oder nicht, wird immer auch ein großes Stück aus dem Bauchgefühl heraus getroffen werden.

Werdet Ihr in Zukunft eher auf Visual Studio Online setzen oder seht Ihr noch weitere Gründe oder Bedenken VSO nicht zu verwenden?

[1] http://www.tuv.com/de/deutschland/gk/managementsysteme/informationstechnologie/iso_27001_informationssicherheit/iso_27001.jsp

[2] http://blogs.msdn.com/b/bharry/archive/2015/01/15/visual-studio-online-iso-27001-certification-and-european-model-clauses.aspx

[3] http://blogs.msdn.com/b/bharry/archive/2014/10/28/visual-studio-online-is-in-europe.aspx

[4] http://ec.europa.eu/justice/data-protection/article-29/documentation/opinion-recommendation/files/2012/wp196_en.pdf

Golo Roden: Hin und her: io.js und Node.js parallel betreiben

Am 14. Januar 2015 wurde io.js 1.0 veröffentlicht, das zahlreiche neue Funktionen und Unterstützung für verschiedene Sprachmerkmale von ES6 enthält. Das sind ausreichend Gründe, um sich die neue Plattform näher anzusehen. Doch was, wenn zusätzlich auch Node.js benötigt wird?

Norbert Eder: Virtuelle Maschinen auf externer HDD betreiben

In Ubuntu-Box zur Softwareentwicklung gesucht habe ich das Intel NUC Kit dem Apple Mini gegenübergestellt. Ziel war es, eine günstige Box für die Softwareentwicklung mit Ubuntu zusammen zu stellen bzw. Feedback zu erhalten. Das kam dann auch via Twitter und Facebook recht flott.

In der Argumentation ging es sehr schnell in die Richtung, aus der ich eigentlich kam: In Richtung VMs. Aber genau da lag ja eigentlich mein Problem.

Die Geschichte

Meine VMs habe ich aus Gründen des Speicherplatzes und der Portabilität auf einer externen Festplatte liegen. Ich setze dazu eine Samsung 840 Series Basic ein, die mit entsprechendem Gehäuse am USB 3.0-Anschluss hängt. Das sollte eigentlich genug Power liefern. Entsprechende Messungen zeigten auch ganz gute Werte.

VM installiert und gleich während des ersten Bootens war die Platte weg, sie lief, wurde mit Strom versorgt, aber das System kannte sie nicht mehr. Erst nach einem Neustart war sie wieder verfügbar. Zusätzlich kam es zu Schreibfehlern bzw. wurde mir angezeigt, Daten wären geschrieben worden, wurden sie teilweise nicht. Zuerst dachte ich, dass die HDD defekt wäre. Tests auf anderen Geräten zeigten, dass sie OK sein sollte. Nächster Verdacht war mein USB-Anschluss, aber andere Platten und Devices laufen einwandfrei darauf. Blieb also nur mehr das Gehäuse. Insgesamt habe ich schlussendlich 3 Gehäuse getestet und mit keinem war das zufriedenstellend. Daher vor einigen Tagen die oben verlinkte Post.

Der Zufall

Kurz nach den Gesprächen habe ich dann über die Samsung Portable SSD T1 gelesen. Was ich da las hat mir ganz gut gefallen und so habe ich im lokalen Geschäft meines Vertrauens zugeschlagen und habe das erste und zugleich letzte Gerät des Stores gekauft :)

Hier ein paar Bilder der Samsung Portable SSD T1 250GB:

Samsung Portable SSD T1 Bild 1

Samsung Portable SSD T1 Bild 1

Samsung Portable SSD T1 Bild 2

Samsung Portable SSD T1 Bild 2

Samsung Portable SSD T1 Bild 3

Samsung Portable SSD T1 Bild 3

Samsung Portable SSD T1 Bild 4

Samsung Portable SSD T1 Bild 4

Es läuft

Nun habe ich das Szenario damit nochmals getestet und siehe da, alles funktioniert einwandfrei. Die 840er hat ein Zuhause im Laptop meiner Frau gefunden und läuft dort wie geschmiert. Ich denke so kann ich wieder einige Zeit ordentlich arbeiten und habe zudem eine Menge Geld gespart.

Hier noch der Vergleich zwischen meiner aktuellen, internen SSD und der Samsung Portable SSD T1:

Samsung 830-Series 256 GB (intern)

Samsung 830-Series 256 GB (intern)

Performance Samsung Portable SSD T1

Performance Samsung Portable SSD T1

Von Samsung wird eine eigene Software mitgeliefert. Mit dieser wird die SSD quasi installiert. Die Messung danach brachte bessere Werte, allerdings war das Alignment nicht korrekt, was zu einer kürzeren Lebensdauer der Festplatte führt. Das habe ich geändert, dafür sind die Werte für 4K-64Thrd eingebrochen:

Performance Samsung Portable SSD T1 - Falsches Alignment

Performance Samsung Portable SSD T1 – Falsches Alignment

Nichts desto trotz sieht das nicht so schlecht aus und funktioniert bis dato auch ganz gut. Hoffentlich bleibt das auch so.

The post Virtuelle Maschinen auf externer HDD betreiben appeared first on Norbert Eder.

Marco Scheel: Links for 2015-01-24 [del.icio.us]

ppedv Team Blog: Verwandtschaftssuche – Funktionen zur statistisch semantische Suche

Im vorhergehenden Artikel Statistisch semantische Suche haben wir das notwendige Werkzeug für den SQL Server eingebunden: Die Semantik Datenbank und den Microsoft Office Paketfilter.

imageimage

Nun soll die Semantik auch mal für uns tun. Mit Hilfe 3er Funktionen können wir einiges herausfinden:

Funktion 1: SEMANTICKEYPHRASETABLE

SEMANTICKEYPHRASETABLE hilft uns dabei die Schlüsselwörter aus Dokumenten herauszufinden.

Der Funktionsrumpf sieht dabei so aus:

SEMANTICKEYPHRASETABLE ( table, { column | (column_list) | * } [ , source_key ] ) --So zum Beispiel DECLARE @DocID hierarchyid SELECT @DocID = path_locator from Akten where name = 'Workflow.docx'; SELECT SEMANTIKTAB.keyphrase, SEMANTIKTAB.score from SEMANTICKEYPHRASETABLE ( Akten, file_stream, @DocID ) AS SEMANTIKTAB ORDER BY SEMANTIKTAB.score DESC;

Und hier mein Ergebnis dazu:

imageimage

So finden wir schon mal raus, welche Schlüsselwörter ein Dokument enthält und in welcher Gewichtung. So könne wir schon mal rausfinden welche Dokumente ähnlich sind.

Funktion 2: SEMANTICSIMILARITYTABLE

Die Funktion gibt als Ergebnis die Dokumente zurück, die aufgrund der Semantik dem angegeben ähneln, sprich sich in den Schlüsselwörtern inkl Gewichtung ähnlich sind.

SEMANTICSIMILARITYTABLE ( table, { column | (column_list) | * }, source_key ) --Zunächst suchen wir uns die Idee des Dokuments raus.. DECLARE @DocID hierarchyid SELECT @DocID = path_locator from Akten where name = 'Workflow.docx'; SELECT mft.name, sst.score FROM SEMANTICSIMILARITYTABLE ( Akten, file_stream, @DocID ) AS sst INNER JOIN Akten mft ON path_locator = matched_document_key ORDER BY score DESC


Und so sieht mein Ergebnis hier aus..

image

Je höher der Score, umso ähnlicher das Dokument.

Ach ja.. Wenn zwei oder mehr Dokumente den gleichen Score aufweisen, kann man davon ausgehen, dass es sich um Kopien handelt Zwinkerndes Smiley

Funktion 3: SEMANTICSIMILARITYDETAILSTABLE

Warum ist dieses Dokument eigtl ähnlich mit einem anderen. Die Funktion SEMANTICSIMILARITYDETAILSTABLE schlüsselt uns das etwas genauer aus:

SEMANTICSIMILARITYDETAILSTABLE ( table, source_column, source_key, matched_column, matched_key ) DECLARE @DocID hierarchyid DECLARE @DocIDVergleich hierarchyid SELECT @DocID = path_locator from Akten where name = 'Workflow.docx'; SELECT @DocIDVergleich = path_locator FROM Akten WHERE name = 'Security.docx'; SELECT TOP(5) TAB.keyphrase, TAB.score FROM SEMANTICSIMILARITYDETAILSTABLE ( Akten, file_stream, @DocID, file_stream, @DocIDVergleich ) AS TAB ORDER BY TAB.score DESC;

 

image

Voila.. und das ist unser Ergebnis. vermutlich hatte alles was mit Sharepoint zu tun Zwinkerndes Smiley

Die Semantik belastet natürlich unseren Volltext ein Stück mehr, aber die Möglichkeiten, die sich daraus ergeben sind unerschöpfllich, vor allem, wenn man bendekt wie extrem schnel ldie Volltextindizierung geworden ist.

Sven Hubert: Warum sich das Treffen der Dodnedder am 29.01.2015 um 19:00 in Erlangen lohnt

Gemeinsam mit der dodned Usergroup Franken bzw. den “Dodneddern” laden wir herzlich zum ersten Treffen der fränkischen Developer- und Microsoft-Community ein. Es wird neben dem Social Networking den Vortrag “Ein Date auf der ALM oder lieber in der Cloud? “ von Benjamin Boost (@BenjaminBoost) und Thomas Rümmler (@thomas_ruemmler) geben.

Datum & Zeit:

Donnerstag, 29. Januar 2015 ab 19:00

Ort:

CLEAR GROUP, Am Weichselgarten 21

91058 Erlangen

Ein Besuch lohnt in mehrfachem Sinne, denn es gibt auch noch etwas zu gewinnen! – Lasst euch überraschen.

Anmeldung:

Die Anmeldung erfolgt über die dodnedder-Seite. Der Link ist die REGISTRIERUNG oben rechts. Bitte meldet euch zeitnah an, nicht erst 42 Minuten vor Vortragsbeginn – denn dann wirds ein bisschen schwer mit der Catering-Planung.

Auf der Seite findet ihr auch in gewohnter Weise eine Anfahrtsbeschreibung. Wir freuen uns auf das gemeinsame Community-Event!

Zum Inhalt des Vortrags:
Seit der ersten Vorstellung des Team Foundation Services auf der Build-Konferenz 2011 ist eins klar: Wer sich mit modernem Application-Lifecycle-Management auseinandersetzen möchte, muss sich auch mit der ominösen Cloud auseinandersetzen. Drei Jahre später kann man festhalten, dass es nicht nur eine fixe Idee von Microsoft war, den TFS in der Cloud verfügbar zu machen. Aus den Team Foundation Services ist Visual Studio Online geworden und den Kinderschuhen längst entwachsen. Es wird also höchste Zeit sich zu fragen: Wo und wie kann ich die Cloud sinnvoll in (m)eine ALM-Umgebung integrieren?

Grundsätzlich sind hierbei 4 Szenarien denkbar:

  1. Gar nicht – Sie sind zufrieden mit ihrer lokalen Umgebung und sehen keinen Bedarf etwas zu ändern. Kommen Sie trotzdem, und Sie werden am Ende doch ein paar Ideen zu möglichen Cloud-Erweiterungen mitnehmen.
  2. Erweiterung einer lokalen ALM-Umgebung mit Cloud-Diensten für zum Beispiel Build- und/oder Test-Automatisierung
  3. Erweiterung einer Cloud-ALM-Umgebung mit lokalen Ressourcen für Builds o.ä.
  4. Bereitstellung einer kompletten ALM-Umgebung in der Cloud

Im Rahmen des Vortrages werden für die verschieden Szenarien Möglichkeiten aber auch Risiken aufgezeigt. Die üblichen Fallstricke die bei der ersten Umsetzung auftauchen, bleiben natürlich auch nicht unerwähnt. Und zu guter Letzt wird es keine reine Slide-Show. Es wird eine Menge Live-Demos und Einblicke in bestehende Systeme geben welche hoffentlich für viel Anregungen und Diskussionsstoff sorgen.

Warum sich das Treffen der Dodnedder am 29.01.2015 um 19:00 in Erlangen lohnt is a post from: AIT Blog

ppedv Team Blog: G Serie jetzt auch in der Region Us East 2 verfügbar

Nach der Region US West sind die neuen virtuellen Maschinen der G-Serie nun auch im Rechenzentrum US-Ost öffentlich verfügbar. Sie bieten mehr Speicher und mehr SSD-Speicherplatten als die bisher verfügbaren Azure virtuellen Maschinen. Außerdem sind Sie mit dem neuen Intel Xeon Processor E3 bestückt. Die G-Serie ist in fünf unterschiedlichen Instanzen G1-G5 verfügbar beginnend bei 2 Kernen 28 GB RAM und 412 GB SSD bis hin zur stärksten Maschine mit 32 Kernen, 448 GB RAM und 6.596 GB SSD-Platte. Die Preise hierzu finden Sie unter http://azure.microsoft.com/en-us/pricing/details/virtual-machines/.

Passend dazu bietet die ppedv Kurse zum Entwickeln von Azurelösungen an. Mehr Infos finden Sie unter http://www.ppedv.de/schulung/kurse/Azure-CloudAnwendungenentwickeln.aspx.

ppedv Team Blog: Statistisch semantische Suche

Ja richtig gehört: Statistisch semantische Suche. Ein schönes Wort. In Wikipedia liest man dazu “.. Bedeutung sprachlicher Zeichen..”  Und das triffts auch schon fast. Die statistisch semantische Suche extrahiert relevante Phrasen per Volltextsuche aus Spalten oder Filetables und gewichtet diese.

imageimage

Sehen wir uns mal gewichtete Phrasen eines Dokuments an.

Man ganz gut erkennen, dass hier in einem Dokument folgende Begriffe gefunden wurden und je nach Score der eine wohl wichtiger (häufiger) zu sein scheint, als ein anderer. In diesem Beispiel geht es also wohl um Workflows, Stichwörter und Sharepoint.

Tatsächlich muss der Begriff nicht als einzelnes Wort vorkommen, sondern durchaus in Kombinationen. In diesen Text geht es beispielsweise auch um Unternehmensstichwörter.

Aber wie kommt die statistisch semantische Suche in den SQL Server?

Dazu brauchts ein ordentliches Rezept mit folgenden Zutaten: Eine Semantikdatenbank, evtl. das Microsoft Office Filter Paket, die Volltextsuche, ein wenig TSQL und einen Neustart der Volltextsuche.

Punkt 1: Semantikdatenbank einbinden

Auf der DVD des SQL Servers findet sich im Verzeichnis \1031_DEU_LP\x64\Setup die Installationsdatei SemanticLanguageDatabase.msi für die Datenbank. Das Setup entpackt lediglich die Datenbank in ein Verzeichnis. Um die Semantikdatenbank in die SQL Serverinstanz einzubinden, muss die Datenbank noch angefügt werden. Entweder per GUI im SSMS oder per Script. Anschließend die Datenbank für die semantische Suche registrieren.

Punkt 2: Office Filter Paket einbinden

Da SQL Server keine aktuellen Office Versionen out-of-the-box supportet,  kann man das schnell ändern indem man sich das Office Filter Paket 2010 downloaded: http://www.microsoft.com/de-de/download/details.aspx?id=17062. Nach der Installation muss das Filterpaket noch der Volltextsuche bekannt gemacht werden

--SemantikDb DB extrahieren (\1031_DEU_LP\x64\Setup) --und attachen.....msi-File CREATE DATABASE semanticsdb ON (FILENAME = 'C:\Microsoft Semantic Language Database\semanticsdb.mdf') FOR ATTACH -- und registrieren EXEC sp_fulltext_semantic_register_language_statistics_db @dbname = N'semanticsdb'; --Welche Sprachen werden unterstützt select * from sys.fulltext_semantic_languages --Filterpackage installiert?? Exsitiert für Office 2007 und Office 2010 --Aktivieren der iFilter für Volltextsuche Sp_fulltext_service 'Load_os_resources', 1 --Anzeige der indizierbaren Dokumente select * from sys.fulltext_document_types

 

Nun Steht die Volltextsuche inkl semantischer Suche voll zur Verfügung. 

image

In den Volltexteigenschaften der Tabelle nur noch Häkchen setzten und den richtigen Typ wählen.

File_type für den Inhalt der Dokumente. In diesem Screenshot handelt es sich um eine Filetable.

 

image

Marco Scheel: Links for 2015-01-23 [del.icio.us]

ppedv Team Blog: SASS Mixins für CSS3 Media Queries

Im heutigen WebDesign Zeitalter ist es so gut wie unvorstellbar geworden ohne CSS PreCompiler oder gar CSS3 zu leben. CSS3 bietet einen enormen Funktions als auch Design Umfang wie z. B. Animationen, Transitions (übergangs Animationen), 3D Darstellun uvvvvm. Die CSS PreCompiler hingegen erweitern nicht die Möglichkeiten von CSS oder fügen gar neue Design möglichkeiten hinzu, sondern sie erweitern die CSS-Syntax. Dies ermöglicht uns nun mit Variablen, Funktionen, Ableitungen und derartigen Möglichkeiten unsere geschriebenen CSS Regeln oder Files wieder zu verwenden um uns somit unzählige graue Haare zu ersparen. Zu alle dem kommt noch die SmartPhone Ära hinzu (AlwaysOn), diese verlangt von uns WebEntwicklern –/ Designern die Layouts welche wir erstellen nun auch noch Responsive (empfänglich für diverse Browserauflösungen) zu erstellen.

Zu diesem Thema habe ich mir ein wenig Gedanken gemacht und das kam dabei heraus:

Die Mixins

   1: @mixin xs-media ($target: all){
   2:   @media #{$target} and (max-width: 360px) {
   3:     @content;
   4:   }
   5: }
   6:  
   7: @mixin sm-media ($target: all){
   8:   @media #{$target} and (min-width: 361px) and (max-width: 767px) {
   9:     @content;
  10:   }
  11: }
  12:  
  13: @mixin md-media ($target: all){
  14:   @media #{$target} and (min-width: 768px) and (max-width: 991px) {
  15:     @content;
  16:   }
  17: }
  18:  
  19: @mixin lg-media ($target: all){
  20:   @media #{$target} and (min-width: 992px) and (max-width: 1199px) {
  21:     @content;
  22:   }
  23: }
  24:  
  25: @mixin xlg-media($target: all) {
  26:   @media #{$target} and (min-width: 1200px) {
  27:     @content;
  28:   }
  29: }

Diese Mixins sind weder großartig komplex, noch schwer nach zu vollziehen…. sie sind einfach nur NÜTZLICH. Ähnlich wie CodeSnipptes in VisualStudio. Diese 5 @Media Mixins erleichtern den Umgang mit MediaQueries für Responsive Layouts. Das erste Mixin (max-width; 360px) {} wird man jedoch nicht all zu häufig verwenden müssen, da es strengstens empfohlen ist diese sog. Responsive Layouts mit der ‘Mobile First’ Variante zu erstellen. D. h. man fängt mit dem Design für kleinere Geräte an und skalliert dann nach oben. Dies hat wieder mehrere Vorteile:

1. Man fokusiert sich auf das wichtigste, den CONTENT! Da man nicht viel Platz für sonstigen Schnick-Schnack hat.

2. Es ist ohne probleme möglich nach oben hin weiter bzw. bis zur unendlichkeit zu skalieren. Stichwort SmartTV’s mit einer 4K Auflösung z. B. Wobei solche Auflösungen z. Z. noch von den wenigsten unterstützt bzw. angepasst werden.

Anwendung

Wie man nun diese oben gezeigten SASS-Mixins verwendet sieht folgendermaßen aus:

   1: div {
   2:   /*Diese attribute treffen auf xs-screens zu*/
   3:   .
   4:   .
   5:   .
   6:   
   7:   @include sm-screen {...};
   8:   
   9:   @include md-screen {...};
  10:  
  11:   @include lg-screen {...};
  12:  
  13:   @include xlg-screen {...};
  14: }

Ich hoffe diese kleinen Helferlein werden euch bei der Erstellung von vielen Responsive Websites helfen und Spaß machen Smiley

Unter http://codepen.io/MT-WebDev/pen/XJgjqN gibt es noch ein Beispiel wie das ganze dann in der Realität aussehen könnte.

Falls nun euer/dein Interesse geweckt ist, schau doch mal auf http://ppedv.de/web vorbei. Dort lösst sich bestimmt der richtige Kurs finden!

Holger Schwichtenberg: TypeScript 1.4 erschienen

Mit der Version 1.4 der Sprache TypeScript nähert sich Microsoft dem kommenden ECMAScript-6-Standard für JavaScript weiter an.

Norbert Eder: Das Product Backlog ist unschuldig

In vielen Diskussionen wird dem Product Backlog eine böse Rolle zugeschrieben und es mehr oder weniger verdammt. Damit macht man es sich – aus meiner Sicht – auch etwas zu einfach. Ich glaube nicht an die “Schuld” des Backlogs, sondern vielmehr an den falschen Umgang damit. In diesem Beitrag möchte ich typische Probleme aufführen und bereinigen helfen.

Backlog != Strategie

In einem Unternehmen oder hinsichtlich eines einzelnen Produktes/Kunden sind Entscheidungen zu treffen und festzulegen. Das kann niemals aufgrund einiger Stories, Wünsche und Ideen eines Backlogs funktionieren. Zu jedem Produkt bestehen (hoffentlich) Visionen und Ziele, die zu erreichen sind. Das Backlog selbst sollte hier nur die Schritte in naher Zukunft dahin, nicht das Rahmenwerk festlegen. Ein Blick über den Tellerrand hinaus ist wichtig.

Das Backlog sollte die Strategie widerspiegeln, nicht umgekehrt.

Platz für Ideen schaffen

Lange Listen haben die Angewohnheit immer länger zu werden. Wird anfangs noch abgearbeitet wird das gerne weniger wenn immer mehr hinzugefügt wird. Das frustiert und man verliert die Lust. Noch schlimmer wird es, wenn eine Grundordnung innerhalb der Liste fehlt.

Eine höhere Chance auf Abarbeitung besteht bei der Verwendung von mehreren Listen für unterschiedliche Anforderungen. Normalerweise gibt es einen Ablauf, einen Prozess, der kann ja abgebildet werden. D.h. ein Eintrag muss dann durch unterschiedliche Listen (Idee, Entwurf, Grooming, …) durch, bis er schlussendlich im Backlog landet. Damit sieht man auch gut, in welchem Status ein Punkt gerade ist, wie weit er schon getrieben wurde. Über Tools wie Atlassian Jira lässt sich dergleichen gut abdecken.

Wird nicht gemacht? Löschen!

Es ist nicht einfach mit Dingen abzuschließen. Oft wurde in Konzepte, Definitionen, Ideen etc. viel Zeit investiert, eventuell auch von einem selbst. Möglicherweise ist einem der Punkt wichtig und will ihn daher noch nicht ganz abhaken, sondern zu einem späteren Zeitpunkt erneut vorbringen. Gerne wird er daher noch im Backlog belassen, selbst wenn es einen gemeinschaftlichen Beschluss gibt, dass die Story nicht durchgeführt wird.

Ballast abwerfen vermindert Frustration und fördert Produktivität.

Eine derartige Story ist aus dem Backlog zu entfernen. Ich empfehle eine generelle Löschung, da daraus gerne eine Liste von nicht ausgeführten Stories entsteht mit der dann auch wieder etwas getan werden muss. Das mausert sich zu einer Last und dies blockiert.

Ist nicht wichtig? Löschen!

Ein Punkt wurde bereits das x-te Mal nach unten geschoben. Immer ist etwas anderes wichtiger. Seit mehreren Sprints schon. Was sagt uns das? Diese Anforderung ist einfach nicht wichtig genug. Besteht die Chance, dass sie auch in den kommenden Sprints geschoben wird, dann ist eine Umsetzung mehr als unrealistisch. Besonders gut zeigt sich das, wenn sich das Team bereits über diese Anforderung lustig macht.

Was nicht wichtig ist, muss weg.

Es ist allen (und vordergründig dem Backlog) geholfen, den Punkt zu entfernen. Sollte das darin enthaltene irgendwann wichtig werden, kommt dies ans Tageslicht und gelangt zur Umsetzung.

Zähneputzen!

Wie man sich jeden Tag die Zähne putzen muss, um spätere Zahn- und Kieferprobleme zu vermeiden, ist es auch mit einem Backlog. Es will regelmäßig gepflegt werden. Die Pflege endet jedoch nicht bei der Priorisierung der Punkte:

  • Bestehende Informationen wollen aktualisiert werden, wenn sich etwas ändert. Nichts ist schlimmer, als in einem der Meetings herauszufinden, dass die Informationen nicht aktuell sind und sofort hektisch begonnen wird, diese auf den aktuellen Stand zu bringen.
  • Verwaltung der Status, Zuführung der Punkte/Stories in die richtigen Gremien (siehe Grooming, Estimation, etc.)
  • Aufarbeitung der Kommunikation, klären von offenen Fragen (z.B. Kommentare etc.)
  • Konsolidierung der vorhandenen Einträge

Bei Änderungen ist darauf zu achten, dass diese nachvollziehbar sind und die Story erneut zumindest in eine Estimation geht – manches Mal kann es auch zurück ins Grooming gehen, je nachdem.

Das Backlog ist kein Archiv, es ist vielmehr die Arbeitsstätte des Product Owners.

Fazit

Das Backlog beschreibt die umzusetzenden Punkte/Stories durch das Entwicklungsteam. Gerne wird es jedoch als Sammelsurium für alle möglichen Anforderungen und Ideen verwendet. Damit verstopft es im Laufe der Zeit wie ein Siphon der nicht gereinigt wird. Eigene Listen für Ideen, Vorschläge und “Work in Progress” helfen hier weiter. So wie der Product Owner das Backlog nicht als Archiv zu sehen hat, ist es legitim, dass das Entwicklungsteam den Product Owner auf Missstände im Product Backlog hinweist.

Wie sind deine Erfahrungen mit Product Backlogs?

The post Das Product Backlog ist unschuldig appeared first on Norbert Eder.

Norbert Eder: Link-o-licious #8

In der achten Ausgabe von Link-o-licious habe ich zahlreiche Beiträge zum Thema Softwareentwicklung unter Linux mit Node.js, WebStorm etc.

WebStorm

Node.js

MongoDB

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

Uli Armbruster: Interview mit Ralf Westphal und Stefan Lieser

Am 22.1. werde ich abends ein Online Interview mit den Clean Code Koryphäen Ralf Westphal und Stefan Lieser führen. Die Fragen werden thematisch weit gestreut sein. Ein kleiner Vorgeschmack gefällig?

Macht Clean Code Sinn, wenn die Kollegen nicht mitziehen?

oder

Community vs. Freizeit: Wie ist das vereinbar?

oder

Woher weiß ich, wann ich es mit Clean Code übertreibe?

Das Video veröffentliche ich dann auf meinem YouTube Channel. Ihr könnt die die Richtung des Gesprächs mitgestalten, indem ihr bis ca. 15 Uhr eure Fragen in die Kommentare postet.


Einsortiert unter:German, Misc Tagged: Interview, Video

Holger Schwichtenberg: Microsoft veröffentlicht Visual Studio 2015 CTP 5

Unter dem Namen Visual Studio 2015 Community Technology Preview (CTP) 5) hat Microsoft eine weitere Vorschauversion der nächsten Ausgabe seiner integrierten Entwicklungsumgebung kostenfrei bereitgestellt.

ppedv Team Blog: Ansichten in SharePoint

Eine Ansicht bietet die Möglichkeit, Elemente einer Bibliothek oder Liste zu Filter, Sortieren oder in irgendeiner anderen Art und Weise zu bearbeiten. Im Grunde alle Arten die “Sicht” auf Daten unseren Bedürfnissen anzupassen.

Dabei stehen uns grundlegend ein paar Formate zur Verfügung:

Die Standardansicht

In 95% aller Fälle benutzt, bietet sie die gängigsten Optionen zum Betrachten von Bibliotheken und Listen. Bei dieser Ansicht werden die einzelnen Elemente untereinander angezeigt.

Eine Standardansicht

 

Die Standardansicht mit erweiterten Ereignisserien

Besonders zu empfehlen, wenn man sich jede Instanz einer Ereignisserie anzeigen lassen möchte.

Standardansicht mit Terminserie

 

Kalenderansicht

Mit dieser Ansicht lassen sich Daten aus Listen bzw. Einträgen chronologisch darstellen oder Datumsangaben visuell darstellen. Gerade für den Einsatz in Projektumgebungen oft verwendet, um einen Überblick über vergangene und kommende Ereignisse zu erhalten.

 Eine Kalenderansicht

 

Datenblatt

Diese Ansicht ist ähnlich einer EXCEL-Tabelle und auch vergleichbar mit der quick-edit Ansicht. Dadurch lassen sich viele Datensätze komfortabel bearbeiten.

Eine Datenblattansicht

 

Gantt

Benannt nach Henry L. Gantt lassen sich mit dieser Ansicht Daten mithilfe von Balken so darstellen, dass eine Nachverfolgung des Verlaufes möglich ist. Diese Ansicht findet vor allem Verwendung in der Projektarbeit, um frühzeitig Probleme zu erkennen, wie zum Beispiel sich überlappende Aufgaben, welche aber einer Person zugeordnet sind.

Eine Gantt-Ansicht

codefest.at [MS]: Ready for BUILD 2015

Bald ist es wieder soweit: Die BUILD Conference 2015 findet dieses Jahr wieder in San Francisco statt und zwar von 29. April bis 1. Mai 2015. BUILD ist die Konferenz für Software-Developer. Die Location ist dieselbe wie die beiden Jahre zuvor, im Moscone Center.

image

Die Registrierung für BUILD eröffnet diesen Donnerstag, am 22. Jänner, um 18:00 Uhr (unsere Zeitzone)!

Für alle jene, die dabei sein wollen, empfiehlt es sich wieder, sich rasch zu registrieren, da die Konferenz in den letzten Jahren immer rasch ausverkauft war (siehe auch unsere Berichte über BUILD hier).

Wie auf Twitter angekündigt, gibt es für Studenten heuer eine limitierte Anzahl an kostenlosen Eintrittskarten! Für mehr Infos zu den Studententickets, könnt ihr uns auch schreiben.

Wir erwarten viel spannende Themen rund um Windows, Windows Phone, Web und natürlich Microsoft Azure! CU there.

ppedv Team Blog: Stand-alone DHCP-Server plus DHCP-Server in Domäne gleich Problem?!

Wenn man einen DHCP-Server betreibt, dann sollte dies bevorzugter Weise in einer Domäne geschehen – also mit dem DHCP-Server als Mitglied des Active Directory. Dort benötigt dieser eine Autorisierung, welche dafür sorgt, dass dieser Server dann auf eingehende Anfragen (DHCP Request) reagiert. Solange er nicht autorisiert ist, vergibt er auch keine Adressen. Soweit so gut.

Wenn man einen DHCP-Server NICHT in Active Directory integriert, kann man ihn auch nicht autorisieren, er verrichtet dennoch seine Dienste – bis er auf einen autorisierten Server trifft!

Dann nämlich wird der nicht autorisierte Server (der nicht Mitglied der Domäne ist) seinen Dienst einstellen und selbst wenn man ihn wieder manuell aktiviert sich sofort wieder abschalten.

dhcp_rogue_2

dhcp_rogue_1

Damit ist es also nicht so ohne Weiteres möglich, zwei DHCP-Server im selben Netz zu betreiben. Nun kann es aber sein, dass genau das gewünscht ist – weil die Server z.B. Adressen für unterschiedliche MAC-Adressen verteilen. Hier muss man also eingreifen und den nicht-autorisierten DHCP Server daran hindern, sich abzuschalten.

Das “Zauberwort” hier heißt “Rogue Detection” – und genau die muss deaktiviert werden.

Dies geht nicht über eine GUI, sondern muss über eine Registrierungswert geändert werden. Dieser heisst

KEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\DHCPServer\Parameters
\DisableRogueDetection

dhcp_rogue_3

Mittels des folgenden Aufrufs lässt sich der Eintrag recht schnell anlegen:

reg add HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Services\DHCPServer\Parameters /v DisableRogueDetection /t REG_DWORD /d 1

Dieser Schlüssel ist sehr oberflächlich in folgendem KB-Artikel bei Microsoft beschrieben:

https://support.microsoft.com/kb/949530

codefest.at [MS]: Global Game Jam Graz

Für Game Developer steht dieses Wochenende viel Action bevor. Die Global Game Jam findet wieder in verschiedenen Städten statt. Auch in Graz wird heuer wieder die Global Game Jam Graz vom 23. – 25. Jänner stattfinden.

Wenn du ein Wochenende lang mit anderen Developern, Game Designer und Artists selbst ein Spiel entwickeln möchtest, dann melde dich gleich an. Die Anmeldung geht nur noch bis zum 22. Jänner.

Alle, die in Wien und Umgebung sind, können an der Austria Game Jam im Rahmen der Central European Games Conference teilnehmen.

image

Falco Ostermann: Display a Favicon in SharePoint without Masterpage customizations

Für einen ansprechenden Internet- oder Intranetauftritt auf Basis von Microsoft SharePoint, ist eine eigene Masterpage zwingend erforderlich. Soll SharePoint lediglich für Dokumentenablage oder Teamräume eingesetzt werden und das Unternehmen kann sich mit eines der Standard Themes identifizieren, so ist natürlich keine eigene Masterpage erforderlich. Doch wirft man einen Blick auf die Adresszeile so wird das Blau-Weiße SharePoint Favicon auffallen. Wie dieses anpassen?

Wird eine eigene Masterpage verwendet, so kann dies über HTML-Bordmittel realisiert und ausgetauscht werden. Bei der Verwendung einer Standard Masterpage ist dies leider nicht so einfach, aber trotzdem möglich! Und genau diesen Lösungsweg möchte ich hier kurz vorstellen.

Display a Favicon using Delegate Control

Was macht solch ein Delegate Control? Dieses wird während der Laufzeit gerendert und kann Code-Fragmente im HTML Page Head platzieren. Und genau dies wollen wir uns für das Setzen des Favicons zu nutze machen.

Zu Beginn habe ich ein neues SharePoint 2013 Projekt vom Typ Farm-Solution erstellt und anschließend ein neues Delegate Control hinzugefügt. Dieses muss auf die ID AdditionalPageHead und auf die später zu schaffende Klasse verweisen. Die Klasse beinhaltet schließlich die Logik, welche wie folgt ausschaut:

public class FaviconControl: WebControl
{
    private string FaviconPath = "/_layouts/15/.....";

    protected override void OnLoad(EventArgs e)
    {
        // Check if the Favicon Path is configured
        if (!String.IsNullOrEmpty(FaviconPath) && !String.IsNullOrWhiteSpace(FaviconPath))
        {
            // remove the default SharePoint Favicon, incause of IE issues
            foreach (Control htmlHeadChildControl in Page.Header.Controls)
            {
                if (htmlHeadChildControl is SPShortcutIcon)
                {
                    htmlHeadChildControl.Visible = false;
                    break;
                }
            }
        }
    }

    protected override void Render(System.Web.UI.HtmlTextWriter writer)
    {
        // Check if the Favicon Path is configured and should shown
        if (!String.IsNullOrEmpty(FaviconPath) && !String.IsNullOrWhiteSpace(FaviconPath))
        {
            // create a new Favicon with the configured path
            SPShortcutIcon favicon = new SPShortcutIcon();
            favicon.IconUrl = new Uri(SPUrlUtility.CombineUrl(SPContext.Current.Site.Url, FaviconPath));

            // render the favicon
            favicon.RenderControl(writer);
        }

        base.Render(writer);
    }
}

Schließlich muss dieses Delegate Control noch mit einem Site Collection Feature assoziiert werden, damit es für alle Seiten angewandt wird.

Navigiert man schließlich zu der gewünschten Seite, auf welcher das Feature aktiv ist, so wird das individuelle Favicon erscheinen. Und all das ohne Masterpage anpassungen :)

Fazit

Auf vielen Internetauftritten auf Basis von SharePoint wurde das Favicon vergessen. Und da ist es ja bei vielen Menschen sogar der erste Blickfang. Von daher hoffe ich, dass diese relativ einfache und unkomplizierte Lösung bei den einen oder anderen Anklang findet. Und wie immer bin ich natürlich für Fragen oder Verbesserungsvorschläge offen!

Fabian Deitelhoff: eBook: Implementierung von Lizenzmodellen in .NET

Nun habe ich es auch mal gewagt. Ende letzten Jahres ist ein kleines Buch beziehungsweise eBook von mir erschienen. Das Thema lautet Implementierung von Lizenzmodellen in .NET und ist in der Reihe der Devbooks der developer media erschienen. Es kann über den Shop direkt als PDF oder ePub gekauft werden. Zudem ist das eBook auch über zahlreiche weitere Shops wie beispielsweise Amazon verfügbar.

Mit diesem Beitrag folgt nun endlich meine eigene Werbung zum eBook ;) sowie eine kurze Erläuterung, was das eBook ist und was nicht.

Was das eBook ist…

Das eBook behandelt im Großen und Ganzen meinen Pluralsight-Kurs zum gleichen Themengebiet, geht aber in einigen Bereichen darüber hinaus. Der Inhalt ist die folgenden fünf Teile aufgeteilt. Diese Teile sind jeweils noch in diverse Kapitel unterteilt, die zu umfangreich sind, um sie hier aufzuführen. Amazon erlaubt aber einen Blick in das Buch, wozu auch das vollständige Inhaltsverzeichnis gehört.

  1. Teil I: Einleitung
  2. Teil II: Was ist eine Lizenz?
  3. Teil III: Bibliotheken und Methoden
  4. Teil IV: Vergleich der Bibliotheken und Methoden
  5. Teil V: Ausblick und Fazit

Implementierung von Lizenzmodellen in .NET

Neben einem theoretischen Teil, der sich über die ersten beiden Teile erstreckt, gibt es eine große Portion praktischen Input. Dieser Input behandelt sowohl verschiedene Möglichkeiten, Lizenzinformationen zu generieren, als auch vergleichsweise simple Implementierungen und Bibliotheken, mit denen sich diese Lizenzinformationen rasch generieren und überprüfen lassen. So ist es möglich, sich für die eigene Anwendung ein Lizenzmodell auszudenken und dieses auch direkt zu implementieren.

Dazu habe ich Beispiele zu allen vorgestellten Methoden und Bibliotheken mit C# und Visual Studio 2013 erstellt, die selbstverständlich als Listings im eBook mit enthalten sind. Wenn hierzu Fragen aufkommen, freue ich mich immer eine Nachricht – im Fall von Fehlern gerne mit Fehlermeldung und entsprechenden Code-Ausschnitt, wenn das rechtlich möglich ist.

Was das eBook nicht ist…

Das geballte Wissen zum Thema Lizenzmodelle in ein eBook zu bekommen ist allerdings ein schwieriges Unterfangen, selbst beim Fokus auf das .NET-Umfeld. Das eBook konzentriert sich daher auf den Client-Bereich und wählt dort einige methodische Vorgehensweisen sowie Möglichkeiten zur Implementierung aus.

In Zukunft möchte ich das noch gerne um weitere methodische Vorgehensweisen, Bibliotheken und Implementierungen erweitern, sowie die Server-Seite mit einbeziehen, entweder gebündelt in einer überarbeiteten Auflage oder in einem zweiten Band – da bin ich mir momentan noch überhaupt nicht sicher.

Aktuell sammle ich Ideen und Vorschläge. Auch auf meinen Pluralsight-Kurs bekomme ich einiges an Fragen und Feedback, das bereits in meine Arbeit rund um die Implementierung von Lizenzmodellen eingeflossen ist und auch weiterhin einfließen wird.

Wenn auch Ihr mir dazu Feedback geben möchtet: zögert doch bitte nicht mich zu kontaktieren.

Fazit

Mir hat das Schreiben des devbooks umheimlich Spaß gemacht. Es war mal etwas ganz anderes, als kleinere Artikel zu verfassen. Sollte der eine oder andere von Euch sich mit dem Gedanken tragen, auch ein Buch zu schreiben — ich helfe gerne mit dem einen oder anderen Tipp.

An das Feedback habe ich gerade schon erinnert. Mache ich gerne noch einmal, denn das ist mir extrem wichtig, weil es ohne Feedback keine Weiterentwicklung gibt oder sich das Ganze in eine Richtung entwickelt, die für den einen oder anderen nicht ganz so spannend ist. :)

In diesem Sinn freue ich mich auf Euer Feedback. :)

Norbert Eder: #fotomontag #3

Jeden Montag ein Foto. Der #fotomontag.

Mit zahlreichen Kollegen aus dem Knipserklub sind wir am 10. Jänner hinauf auf den Fürstenstand am Plabutsch und haben den Sonnenaufgang an diesem Tag festgehalten. Für mich war das der erste Sonnenaufgang, den ich bewusst fotografierte. Anfangs hatte ich recht große Probleme mit der Schärfe, habe das dann zwar so einigermaßen hin bekommen, bin aber mit den Ergebnissen nicht ganz zufrieden. Jedenfalls habe ich viel für den nächsten Versuch gelernt.

Und hier nun eines der vielen Fotos die ich gemacht habe:

Sonnenaufgang Graz/Schlossberg (Plabutsch)

Sonnenaufgang Graz/Schlossberg (Plabutsch)

Hast du eine Meinung zum Foto? Ja? Dann lass sie mich doch bitte wissen und bewerte es in den Kommentaren.

The post #fotomontag #3 appeared first on Norbert Eder.

codefest.at [MS]: Kostenfreie Tools für Student Developers

In der Open-Source Development Community werden viele Projekte in GitHub bereitgestellt. Microsoft beginnt nun ebenso diese populäre Plattform zu nutzen und stellt viele Open Source Projekte auf GitHub bereit, wie etwa das .NET Core Framework.

Für Studenten gibt es nun ein ganz aktuelles Angebot von Microsoft, welches eine Vielzahl an tollen Tools und Services von GitHub zur kostenfreien Verfügung stellt, das GitHub Student Developer Pack und Visual Studio Community 2013.

Diese Pakete sind ganz auf Studenten zugeschnitten, schreibt Steve “Guggs” Guggenheimer in
Microsoft & GitHub: Free tools for student developers.

image

Die Leistungen des Student Developer Pack umfassen natürlich ein kostenloses GitHub Konto mit bis zu fünf private repositories, Cloud Hosting (Digital Ocean), Live programming helps (HackHands), DNS management (dnsimple), Screen Sharing Tools (Screenhero), Email-Server (SendGrid), Text Editor (Atom) und vieles mehr. Alle Pakete sind auf https://education.github.com/pack ersichtlich.

In der Microsoft Virtual Academy (MVA) helfen die Webcasts Using Git with Visual Studio 2013 Jump Start für den raschen Einstieg in die coolen Tools. Open Source Questions Answered  in der MVA beantwortet viele Fragen zum Thema Open Source.

Zusätzlich zur kostenfreien Visual Studio Community 2013 Edition erhalten Studenten Visual Studio Tools und Designer, Visual Studio Online Tools und eine Microsoft Azure Subscription mit 10 freien Websites und 10 freien Mobile Services. Damit kann man schon was anfangen… Zwinkerndes Smiley

Microsoft bietet für Studenten schon lange verschiedene Programme wie Dreamspark an um professionelle Entwickler- und Designertools kostenlos zu beziehen (siehe u.a. hier).

image

Im Dreamspark.com Software-Catalog sind alle Angebote für Studenten aufgelistet, von Visual Studio über Office 365 University, Imagine Cup und vieles mehr.

Für Startups gibt es übrigen das Microsoft BizSpark Programm, das kostenlose Software, kostenlosen Support und erhöhte Sichtbarkeit bietet um bei der Unternehmensgründung zu unterstützen.

Viel Spaß mit dem GitHub Student Developer Pack und Visual Studio Community 2013!

ppedv Team Blog: Microsoft DNS-Server: Einträge massenweise “umziehen”

Wenn man mit einem Webserver zu einem anderen Provider wechselt oder aus sonstigen Gründen neue (öffentliche) IP Adressen zugewiesen bekommt, dann müssen natürlich auch die entsprechenden DNS-Einträge geändert werden. Wenn es sich hierbei nur um eine Hand voll handelt, könnte man dies auch manuell machen. Ab einer gewissen Menge ist das einfach nicht mehr praktikabel, da es a) zu lange dauert und b) auch sehr fehleranfällig wäre.

Als sinnvolle Lösung bietet sich hier die PowerShell an – vorausgesetzt, man hat einen Microsoft Windows Server als DNS-Server und auf diesem das entsprechende DNSServer Modul für die PowerShell verfügbar.

Das Skript, welches am Ende des Beitrages zum Download angeboten wird, sieht so aus:

<#
.Synopsis
   This script changes DNS A Records according to a CSV file - use at your own risk!
.DESCRIPTION
   This script changes DNS A Records according to a CSV file.

   The csv file should look like this:

   "OldIP","NewIP"
    "1.2.3.4","5.6.7.8"
    "2.4.6.8","1.3.5.7"

    to change all DNS records with "1.2.3.4" as value for "5.6.7.8" and "2.4.6.8" for "1.3.5.7"

.EXAMPLE
   Replace-DNSServerRecords.ps1 -CSVFile H:\OldAndNewIps.txt

   Replaces the DNS A records on the localhost DNS server according to the CSV-File H:\OldAndNewIps.txt
.EXAMPLE
   Replace-DNSServerRecords.ps1 -CSVFile H:\OldAndNewIps.txt -DNSServer mydns.domain.local -Verbose

   Replaces the DNS A records on the DNS server "mydns.domain.local" according to the CSV-File H:\OldAndNewIps.txt and writes verbose output
#>

Param(
    [Parameter(Mandatory=$True)]
    [ValidateScript({Test-Path $_ -PathType 'Leaf'})]
    [string]$CSVFile,
    [string]$DNSServer = "localhost"
)

Write-Warning "This script will possibly change a lot of DNS records. If you wish to cancel, press [CTRL]+[C], otherwise press [Enter]!"
Read-Host

# just in case of old PowerShell
Import-Module DNSServer

$CSVData = Import-CSV $CSVFile

$OldDNSRecordData = $CSVData.OldIP
$NewDNSRecordData = $CSVData.NewIP

$AllDNSZones = (Get-DnsServerZone -ComputerName $DNSServer | Where-Object IsReverseLookupZone -eq $False).ZoneName

$TotalChanges = 0

ForEach($CurrentDNSZone in $AllDNSZones)
{

    Write-Verbose "Processing current zone $CurrentDNSZone..."

    $AllDNSARecordsInZone = Get-DnsServerResourceRecord -ZoneName $CurrentDNSZone -RRType A -ComputerName $DNSServer
    Write-Verbose "Found $(($AllDNSARecordsInZone | Measure-Object).Count) DNS Records in current Zone"    

    ForEach ($CurrentRecord in $AllDNSARecordsInZone) {

        for($i=0; $i -lt $OldDNSRecordData.Length; $i++){

            If($CurrentRecord.RecordData.IPv4Address -eq $OldDNSRecordData[$i]) {

                Write-Verbose "Found an old DNS Record:"
                Write-Verbose "$($CurrentRecord.HostName) with $($CurrentRecord.RecordData.IPv4Address) in Zone $CurrentDNSZone"

                $NewRecord = $CurrentRecord.Clone()
                
                $NewRecord.RecordData.IPv4Address = $NewDNSRecordData[$i]

                Set-DnsServerResourceRecord -OldInputObject $CurrentRecord `
                                            -NewInputObject $NewRecord `
                                            -ZoneName $CurrentDNSZone `
                                            -ComputerName $DNSServer
                $TotalChanges++
            }
        }
    }
}

Write-Host "Changed Records: $TotalChanges"

 

Das Skript durchläuft alle Forward-DNS-Zonen und prüft dabei nacheinander alle vorhandene A-Records gegen die Liste der zu ändernden Einträge. Wenn ein entsprechender Eintrag gefunden wird, wird für diesen die IP-Adresse gegen die neue ausgetauscht. Am Ende gibt das Skript aus, wieviele Einträge insgesamt geändert wurden. Aus Sicherheitsgründen ist nach dem Start noch einmal zu bestätigen, dass das Skript seine Arbeit verrichten soll.

Das fertige Skript kann hier heruntergeladen werden:

Replace-DNSServerRecords.zip

Die Benutzung geschieht auf eigene Gefahr!

Sie wollen lernen, wie dieses Script im Detail funktioniert oder derartige Scripte selber schreiben? Dann besuchen Sie unseren PowerShell-Kurs!

Marco Scheel: Links for 2015-01-17 [del.icio.us]

Norbert Eder: Ubuntu-Box zur Softwareentwicklung gesucht

Ich habe schon lange keinen Desktop mehr. Ein Dell XPS 13 reichte bis dato vollkommen. Darauf ist Windows 8.1 installiert und alles was ich halt so an Tools und Entwicklungsumgebung benötige. Ubuntu und Fedora laufen in virtuellen Maschinen. Das geht mir mittlerweile tierisch auf den Nerv und daher möchte ich für die Entwicklung unter Linux eine eigenständige Hardware.

Nun will ich aber kein zweites Laptop. Genausowenig möchte ich mir einen richtig fetten Desktop hinstellen. Also musste eine Recherche her. Das sind die Anforderungen:

  • Mini-PC, soll wirklich wenig Platz benötigen
  • Passable Hardware damit ich Projekte auf diesem Technologie-Stack umsetzen kann
  • Ich will keine Unmengen für die Hardware ausgeben, Schmerzgrenze € 700
  • Soll nicht hässlich sein

Nach einer ersten Recherche habe ich zwei Kandidaten gefunden.

Inzwischen habe ich diese Idee wieder verworfen und eine weit günstigere Lösung gefunden, die für mich nun auch so funktioniert. Weiter zum Beitrag.

Mini-PC – Intel® NUC-Kit D54250WYK

Das Intel NUC-Kit D54250WYK hat folgende Daten:

  • Intel® Core™ i5-4250U Prozessor der vierten Generation (verlötet) mit Aktivkühler
  • Intel® HD-Grafik 5000
  • Zwei SO-DIMM-Steckplätze für max. 16 GB 1600/1333-MHz-1,35-V-DDR3L-Speicher
  • Ein Mini Displayport 1.2 und 1.4a
  • 4 USB 3.0, 2 USB 2.0
  • Intel® Gigabit-Ethernet-Controller
  • HDMI

Hier das RAM-Maximimum ausschöpfen und eine SSD hinein, das könnte durchaus was werden. Blank kann man das Gerät zum aktuellen Zeitpunkt mit knapp über 300 Euro bekommen. Preislich wäre ich damit ziemlich gut im Rennen.

Und so sieht das aus:

NUC-Kit D54250WYK Rückansicht

NUC-Kit D54250WYK Rückansicht

NUC-Kit D54250WYK Vorderansicht

NUC-Kit D54250WYK Vorderansicht

Last but not least ein sehr interessanter Artikel zu NUC und Linux.

Mac mini

Die Alternative zum NUC-Kit wäre wohl ein Mac mini. Bei Apple schlägt natürlich gleich der Preis volle Kanne rein, deswegen geht sich da wohl nur das kleinste Modell aus. Um etwas RAM zu haben, muss man tief in die Tasche greifen, denn beim Mac mini 2014 kann der Speicher nicht getauscht werden. Aber die Festplatte lässt sich tauschen.

Und das wäre das Setup:

  • 1,4 GHz Dual-Core Intel Core i5 (Turbo Boost bis zu 2,7 GHz)
  • 8 GB LPDDR3 SDRAM mit 1600 MHz
  • 500 GB Serial-ATA-Festplatte mit 5400 U/Min.
  • Intel HD Graphics 5000
  • 4 USB 3.0
  • HDMI
  • Bluetooth 4.0
  • Gigabit Ethernet
  • 802.11ac WLAN

Die Kosten liegen hier bei € 599 (zum Zeitpunkt des Beitrages). Eine SSD würde hier noch hinzukommen, womit die Kosten knapp über 700 Euro liegen würden, wenn ich eine 250er nehme.

Mac mini 2014

Mac mini 2014

Aktueller Stand der Dinge

Die Hardware-Beschaffung eilt nicht. Ein wenig halte ich schon noch via VM durch. Auf Dauer ist das aber nichts für mich. Insgesamt zieht es mich aktuell mehr in Richtung Intel NUC-Kit. Zwar scheint hier die schwächere CPU an der Arbeit zu sein, dafür kann ich 16GB RAM hinein packen. Für die Gewissheit ob diese Rechnung aufgeht, werde ich mir noch einige Benchmark-Ergebnisse ansehen.

Hast du einen Tipp für mich? Bitte hinterlasse mir einen Kommentar!

The post Ubuntu-Box zur Softwareentwicklung gesucht appeared first on Norbert Eder.

ppedv Team Blog: Flexible Layouts: CSS3 Flexbox

Das Flexible Box Layout Module oder kurz Flexbox genannt, ist ein ausgesprochen mächtiges Layout-Modul in CSS3. Es ermöglicht vieles, was mit klassischem CSS gar nicht oder nur durch Tricksereien möglich wäre.

- Elemente beliebig mehrzeilig horizontal oder vertikal anordnen

- Anordnung der Elemente ganz genau steuern und den Leerraum auf verschiedene Arten verteilen

- Reihenfolge und Ausmaße der Elemente können beliebig bestimmt und flexibel festgelegt werden

Andererseits ist der Umgang mit dem Flexible Box Layout Modul auch relativ komplex. Schwierigkeiten können vor allem durch den unterschiedlichen Support in den verschiedenen Browsern entstehen, da sich die CSS Notation über die Jahre stark verändert hat. Die unterschiedlichen Schreibweisen sind hier angeführt.

- Aktuelle Syntax: display: flex;

- Hybrid Syntax 2011: display: flexbox;

- Alte Syntax 2009: display: box;

In der nachfolgenden Tabelle, von caniuse entlehnt, soll ein kurzer Überblick über den Browsersupport der aktuellen Flexbox Variante display: flex; gegeben werden.

Flexbox flex

Als Unterstützung in der Stylesheet Entwicklung bietet es sich an, Hilfsmittel wie beispielsweise einen Autopräfixer für ältere CSS Versionen zu verwenden, der automatisch den notwendigen Code erzeugt. Ein solches Tool findet sich unter dem nachfolgenden Link:

http://jsbin.com/gufoko/quiet 

In diesem Blogbeitrag widmen wir uns der aktuellen Flexbox Variante in CSS3. Bei der Arbeit mit dem CSS Flexible Box Layout wird ein eigenes Vokabular verwendet. Als Flexcontainer wird das umfassende Element bezeichnet, indem sich die sogenannten Flexitems befinden. .Die Steuerung und Ausrichtung der einzelnen Elemente erfolgt schließlich über CSS Klassen. Das anschließende Codesegment soll einen kurzen Überblick geben. Hier werden die Flexitems innerhalb des Flexcontainers automatisch nebeneinander angeordnet und sind gleich hoch.

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8" />
    <title>Flexbox Beispiel</title>
    <style>
        p {
            padding: 2em;
            color: white;
            font-family: sans-serif;
        }
        .uno {
            background-color:red;
        }
        .due {
            background-color:gold;
        }
        .tre {
            background-color:green;
        }
        .flexbox {
            /* Starten der Flexbox */
            display: flex;
        }
    </style>
</head>
<body>
    <div class="flexbox">
        <p class="uno">Uno</p>
        <p class="due">Due</p>
        <p class="tre">Tre</p>
    </div>
</body>
</html>

 

Das Flexbox-Ergebnis sieht schließlich so aus, dass die Kind Elemente nebeneinander angeordnet werden und die gleiche Höhe haben.

Flexbox

Standardmäßig ist hier das Attribut flex-direction: row vorausgewählt. Um die Elemente untereinander anzuordnen, muss hier die CSS Eigenschaft flex-direction: column gewählt werden. Ein weiterführendes Beispiel zum Thema Flexbox finden Sie im untenstehenden Link.

http://jsfiddle.net/kkonstantin/8o03s30e/

Wenn Sie mehr zum Thema Möglichkeiten der Verwendung von CSS3 und Responsive Design erfahren möchten, raten wir zur aktuellen Schulung: Responsive Design mit CSS3. Viel Spaß und gutes Gelingen beim Ausprobieren des CSS Flexible Box Layout Moduls!

Johannes Renatus: AngularJS ng-pattern mit CamelCase Pattern als Beispiel

AngularJS bietet die unterschiedlichsten Direktiven zum Validieren von Eingabefeldern an und darunter befindet sich auch die Direktive “ng-pattern” mit der Eingabewerte über Reguläre Ausdrücke validiert werden können. Da ich mit Regulären Ausdrücken nicht so viel zu tun habe, habe ich mich bei der ersten Verwendung etwas schwer getan und leider gab es auch kein direktes […]

Manfred Steyer: Globalisierung von AngularJS-Anwendungen mit Globalize

Während ich in unserer AngularJS-Tipps-und-Tricks-Kolumn bei Heise Developer auf die Umsetzung mehrsprachiger AngularJS-Anwendungen mittels angular-translate eingehe, zeige ich hier eine Möglichkeit, in globalisierten Anwendungen verschiedene Zahlen- und Datumsformate zu unterstützen. Hierzu gibt es ja bereits ein paar einfache Filter, wie date oder number, in AngularJS. Diese helfen jedoch nur bei der Ausgabe von Daten. Möchte man eine ähnliche Unterstützung auch für Eingabeformulare haben, muss man zu anderen Frameworks greifen. Eines davon ist Globalize (https://github.com/jquery/globalize#0.x-fixes), welches auch in der Lage ist, Werte in Hinblick auf die Gepflogenheiten einer Sprache und/oder eines Landes zu parsen.

Als der vorliegende Text verfasst wurde, hat das AngularJS-Team angekündigt, mit der künftigen Version 1.4 mehr Möglichkeiten für die Internationalisierung von Single Page Applications out-of-the-box bieten zu wollen.

Überblick zu Gobalize

Das im Umfeld der populären JavaScript-Bibliothek jQuery entwickelte Globalisierungs-Framework Globalize stellt unter anderem Formatierungsinformationen für zahlreiche Kulturen zur Verfügung, wobei der Begriff Kultur in diesem Kontext als Kombination von Region und Sprache zu verstehen ist. Beispiele dafür sind Deutsch/Deutschland (de-DE), Deutsch/Österreich (de-AT), Deutsch/Schweiz (de-CH) oder Englisch/Großbritannien (en-GB).

Als der vorliegende Text verfasst wurde, lag Globalize in zwei Versionssträngen vor: 0.x und 1.x. Letzterer befand sich noch in einer Alpha-Phase, weswegen hier mit dem praxiserprobten Versionsstrang 0.x vorliebgenommen wird. Die beiden Versionsstränge unterscheiden sich in erster Linie durch die Art der Definition der unterstützten Kulturen. Während 0.x hierzu ein eigenes auf JSON-basiertes Format nutzen, nutzt 1.x die Dateien aus dem Unicode Common Locale Data Repository (CLDR, http://cldr.unicode.org/).

Um die hier betrachtete Version von Globalize via Bower zu installieren, verwendet der Entwickler die folgende Anweisung: bower install globalize#0

Um Globalize zu nutzen, bindet der Entwickler das Skript globalize.js sowie die Skripte mit den Formatierungsinformationen für die zu unterstützenden Kulturen ein. Das Beispiel im nachfolgenden Listing referenziert zum Beispiel die Formatierungsinformationen für de-DE, de-CH und de. Letztere bezieht sich auf keine spezielle Region und kommt als Fallback für von der Anwendung nicht unterstützte deutschsprachige Regionen zum Einsatz. Im betrachteten Fall wäre Liechtenstein ein Beispiel für solch eine Region, zumal keine Datei mit Formatierungsinformationen für Deutsch/Liechtenstein eingebunden ist. Wäre auch die Datei globalize.culture.de.js nicht referenziert, würde Globalize in diesem Fall mit der von JavaScript standardmäßig verwendeten Kultur vorlieb nehmen und sich am amerikanischen Englisch orientieren.

<script src="~/Scripts/jquery.globalize/globalize.js"></script>
<script src="~/Scripts/jquery.globalize/cultures/globalize.culture.de-DE.js"></script>
<script src="~/Scripts/jquery.globalize/cultures/globalize.culture.de-CH.js"></script>
<script src="~/Scripts/jquery.globalize/cultures/globalize.culture.de-AT.js"></script>
<script src="~/Scripts/jquery.globalize/cultures/globalize.culture.de.js"></script>

Um Globalize auf eine Kultur einzustimmen, ist deren Bezeichner an die Funktion Globalize.culture zu übergeben:

Globalize.culture("de-AT");

Anschließend kann der Entwickler die Funktion Globalize.format zum Formatieren von Zahlen und Datumswerten verwenden. Dazu übergibt er an diese Funktion den zu formatierenden Wert und eine Formatierungszeichenfolge. Beispiele dafür finden sich im nächsten Listing. Eine detaillierte Übersicht über die unterstützten Formatierungszeichenfolgen findet sich in der Dokumentation von Globalize unter https://github.com/jquery/globalize.

// Zahl ohne Kommastellen
alert(Globalize.format(123456789.88, "n"));
// Zahl mit drei Kommastellen
alert(Globalize.format(123456789.888888, "n3"));
// Zahl mit fünf Kommastellen
alert(Globalize.format(3.888888, "n5"));
var firstContact = new Date(2063, 4, 5, 17, 3);
// Datumsformat der gewählten Kultur
alert(Globalize.format(firstContact, "d"));
// Zeitformat der gewählten Kultur
alert(Globalize.format(firstContact, "t"));
// Angegebenes Datumsformat
alert(Globalize.format(firstContact, "dd.MM.yyyy HH:mm"));

Neben dem Formatieren von Ausgaben unterstützt Globalize auch das Parsen von Eingaben. Dazu bietet es die Funktionen Globalize.parseInt, Globalize.parseFloat und Globalize.parseDate. Diese Funktionen nehmen einen String mit einer Zahl bzw. mit einem Datum im Format der gewählten Kultur entgegen und geben eine Zahl ohne Nachkommastellen (parseInt), eine Zahl mit Nachkommastellen (parseFloat) oder ein Date-Objekt (parseDate) zurück:

var date = Globalize.parseDate("5.4.2063");
var anInt = Globalize.parseInt("1.000");
var aFloat = Globalize.parseFloat("1.000,95");

Über einen optionalen zweiten Parameter kann der Entwickler an diese Funktionen eine Formatierungszeichenfolge übergeben.

Globalize-Wrapper für AngularJS bauen

Um Globalize in AngularJS-Anwendungen zu nutzen, empfiehlt es sich, hierfür Direktiven und Filter bereitzustellen. Dieser Abschnitt geht darauf ein. Wer die hier gezeigten Konstrukte einfach nutzen möchte, kann das Modul i18n aus dem angehängten Beispiel übernehmen und mit dem nächsten Abschnitt, der zeigt, wie die hier vorgestellten Konstrukte zu nutzen sind, fortfahren.

Das Beispiel im nachfolgenden Listing zeigt ein Modul i18n mit einer solchen Direktive. Sie richtet für ein Eingabefeld einen Parser sowie einen Formatter ein. Ersterer parst die Eingabe des Benutzers unter Berücksichtigung der konfigurierten Kultur und wandelt diese in eine Zahl um. Letzterer formatiert eine Zahl unter Berücksichtigung dieser Kultur für die Ausgabe im Eingabefeld. Hierzu kommt Globalize zum Einsatz. Der Parser meldet darüber hinaus auch via $setValidity einen eventuell entdeckten Fehler als Validierungsfehler an AngularJS.

Zusätzlich zum Parser und Formatter richtet die Direktive auch eine Ereignisbehandlungsroutine für das Ereignis i18n.cultureUpdated ein. Durch das Auslösen dieses Ereignisses kann die Anwendung über den Wechsel der konfigurierten Sprache informieren. Die betrachtete Ereignisbehandlungsroutine formatiert in diesem Fall den gebundenen Wert aus dem Model erneut unter Nutzung sämtlicher registrierter Formatter. Auf diese Weise ergibt es ein String, der den gebundenen Wert unter Berücksichtigung der neuen Kultur wiederspiegelt. Damit das jeweilige Eingabefeld diesen String anzeigt, übergibt ihn die betrachtete Ereignisbehandlungsroutine an die Funktion $setViewValue und ruft anschließend $render auf. Erstere legt den in der View anzuzeigenden Wert fest; letztere führt zum Aktualisieren des Eingabefelds mit diesem Wert.

var i18n = angular.module("i18n", []);

i18n.directive('gnumber', function ($log) {
    return {
        require: 'ngModel',
        link: function (scope, elm, attrs, ctrl) {

            var format = attrs.gnumber;

            ctrl.$parsers.unshift(function (viewValue) {
                var number = Globalize.parseFloat(viewValue);
                if (!isNaN(number)) {
                    ctrl.$setValidity('gnumber', true);
                    return number;
                }
                else {
                    ctrl.$setValidity('gnumber', false);
                    return undefined;
                }
            });

            ctrl.$formatters.push(function (value) {
                return Globalize.format(value, format);
            });

            scope.$on("i18n.cultureUpdated", function() {
                var value = ctrl.$modelValue;
                for(var i = ctrl.$formatters.length-1; i>=0; i--) {
                    var formatter = ctrl.$formatters[i];
                    value = formatter(value);
                }
                ctrl.$setViewValue(value);
                ctrl.$render();
            });

        }
    };
});

Der Vollständigkeit halber zeigt das nächste Listing eine analoge Direktive, welche sich unter Verwendung von Globalize um Datums-Werte kümmert. Der Formatter prüft zusätzlich, ob das zu formatierende Datum tatsächlich in Form eines Date-Objekts oder als String vorliegt. Letzteres ist zum Beispiel der Fall, wenn das Datum in Form von JSON von einem HTTP-Service abgerufen wurde, zumal es in JSON keine direkte Möglichkeit zur Darstellung von Datumswerten gibt. Handelt es sich um einen String, wandelt der Formatter diesen in ein Date-Objekt um. Dazu nutzt er die Konstruktorfunktion Date.

i18n.directive('gdate', function ($log) {

    return {
        require: 'ngModel',
        link: function (scope, elm, attrs, ctrl) {

            var fmt = attrs.gdate;

            ctrl.$parsers.unshift(function (viewValue) {
                var d = Globalize.parseDate(viewValue);
                if (d) {
                    ctrl.$setValidity('gdate', true);
                    return d;
                }
                else {
                    ctrl.$setValidity('gdate', false);
                    return undefined;
                }
            });

            ctrl.$formatters.push(function (value) {
                if (typeof value === "string") {
                    value = new Date(value);   
                }
                var formatted = Globalize.format(value, fmt);
                return formatted;
            });

            scope.$on("i18n.cultureUpdated", function() {
                var value = ctrl.$modelValue;
                for(var i = ctrl.$formatters.length-1; i>=0; i--) {
                    var formatter = ctrl.$formatters[i];
                    value = formatter(value);
                }
                ctrl.$setViewValue(value);
                ctrl.$render();
            });
        }
    };
});

Das Formatieren von Ausgaben mit Globalize übernimmt der Filter im nächsten Listing. Er nimmt den zu formatierenden Wert sowie das gewünschte Format entgegen und delegiert an Globalize.format. Da das Ergebnis dieses Filters nicht nur von diesen übergebenen Werten, sondern auch von der via Globalize konfigurierten Kultur abhängt, ist die hinter dem Filter stehende Funktion mit einer Eigenschaft $stateful, die den Wert true aufweist, zu versehen. Dies führt dazu, dass AngularJS den Filter im Zuge jeder Digest-Phase ausführt - unabhängig davon, ob sich die an den Filter übergebenen Werte geändert haben.

i18n.filter('globalize', function () {
    var filterFunction = function (input, format) {
        return Globalize.format(input, format);
    };
    filterFunction.$stateful = true;
    return filterFunction;
});

Die Direktive im nächsten Listing kümmert sich um dieselbe Aufgabe, wie der zuvor beschriebene Filter. Allerdings gestaltet sich diese performanter, zumal sie die Ausgabe nur aktualisiert, wenn sich der gebundene Wert ändert oder die Anwendung über das Ereignis i18n.cultureUpdated darüber informiert, dass sich die via Globalize konfigurierte Kultur geändert hat. Die betrachtete Direktive legt fest, dass ein an das Attribut gformat übergebener Wert an die Scope-Eigenschaft gformat zu binden ist. Mehr Details dazu finden sich in Kapitel 13, welches auf die Möglichkeiten hinter benutzerdefinierten Direktiven eingeht. Die Funktion link, welche die Direktive aktiviert, definiert eine Funktion render. Diese delegiert an Globalize.format und übergibt dabei den an gformat gebundenen Wert sowie den Wert des Attributs format, welches das gewünschte Format der Ausgabe wiederspiegelt. Den auf diese Weise erhaltenen String platziert die Direktive mit der Funktion html als Inhalt jenes Elements, auf das die Direktive angewendet wird. Diese Funktion kommt auch schon innerhalb von link zur Ausführung. Außerdem registriert link diese Funktion als Handler für das Ereignis i18n.cultureUpdated, sodass sie beim Wechsel der konfigurierten Kultur erneut zur Ausführung kommt. Da diese Funktion auch nach einer Änderung des gebundenen Werts erneut anzustoßen ist, übergibt das betrachtete Beispiel die Funktion render auch unter Angabe der hierfür verwendeten Scope-Eigenschaft an $watch.

i18n.directive("gformat", function($log) { 

    return { 
        scope: { 
            "gformat": "=",
        },
        link: function(scope, elem, attrs) {

            var render = function() {
                var value = Globalize.format(scope.gformat, attrs.format);
                elem.html(value);
            };

            render();

            scope.$on("i18n.cultureUpdated", render);
            scope.$watch("gformat", render);
        }
    };

});

Globalize-Wrapper in AngularJS-Anwendung nutzen

Die Beispiele in den nächsten Listings zeigen, wie der Entwickler die zuvor beschriebenen Konstrukte, welche an Globalize delegieren und sich im Modul i18n befinden, nutzen kann. Es richtet ein Modul demo ein, welches das das Modul i18n referenziert und legt in der an run übergebenen Funktion, die AngularJS nach dem Konfigurieren des Moduls zur Ausführung bringt, den Wert de-DE als zu nutzende Kultur fest. Der Controller richtet im Scope eine Eigenschaft model ein. Das dahinter stehende Objekt beinhaltet eine Eigenschaft culture, welche die vom Benutzer konfigurierte Kultur wiederspiegelt und eine Funktion setCulture, welche Globalize unter Verwendung dieser Kultur konfiguriert. Außerdem löst diese Funktion das Ereignis i18n.cultureUpdated aus, damit sich die Direktiven unter Verwendung der neuen Kultur aktualisieren.

var app = angular.module("demo", ["i18n"]);

app.run(function() { 
    Globalize.culture("de-DE");
});

app.controller("DemoCtrl", function($scope, $rootScope) { 
    $scope.model = {};
    $scope.model.culture = Globalize.culture().name;
    $scope.model.setCulture = function() {
        Globalize.culture($scope.model.culture);
        $rootScope.$broadcast("i18n.cultureUpdated");
    }
    $scope.model.date = new Date(); 
    $scope.model.num = 13.7603;

});

Das Beispiel im nächsten Listing nutzt die zuvor vorgestellten Direktiven gdate und gnumber, um Werte aus dem Scope in formatierter Form an Eingabefelder zu binden. Außerdem verwendet es die Direktive gformat und den Formatter globalize, um Werte aus dem Scope formatiert auszugeben.

Über das Eingabefeld im oberen Bereich, welches an model.culture gebunden ist, kann der Benutzer eine andere zu nutzende Kultur erfassen. Durch Klick auf die daneben platzierte Schaltfläche, welche an die Funktion model.setCulture gebunden ist, kann der die Eingabe dieser Kultur bestätigen und diese aktivieren.

<div ng-app="demo" ng-controller="DemoCtrl">
    <input ng-model="model.culture"><input type="button" value="Ok" ng-click="model.setCulture()">
    <div>
        <form name="form">
            <div>
                <input ng-model="model.date" gdate="d" name="date">
                <span ng-show="form.date.$invalid">*</span>
            </div>
            <div>
                <input ng-model="model.num" gnumber="n2" name="num">
                <span ng-show="form.num.$invalid">*</span>                
            </div>
        </form>
    </div>
    <div gformat="model.date" format="d"></div>
    <div>{{ model.date | globalize:'d' }}</div>
</div>


Quellcode (1,2MB)

codefest.at [MS]: Visual Studio 2015 CTP 5 ist da

Das Visual Studio Team hat gestern die Verfügbarkeit von Visual Studio 2015 CTP 5 bekanntgegeben. Nach der Preview Release vom November sind hier neue Features und Verbesserungen im Debugging, Diagnostics, im XAML language service, das neue Timeline Tool und ASP.NET 5 sowie einige Bugfixes enthalten, siehe hier.

In dieser Version wurde basierend auf der .NET Compiler Platform ("Roslyn") das XAML language service neu geschrieben, sodass “fast and reliable XAML editing experience” mit IntelliSense möglich ist. Gleich mal testen, wie sich das anfühlt… Zwinkerndes Smiley

Mit dem Timline Tool können Probleme in WPF und Windows 8.1 Apps analyisiert und debuggt werden.

The new Timeline tool

In ASP.NET 5 können nun u.a. auch References zu Standard (Nicht ASP.NET 5) Projekten hinzugefügt werden, es gibt damit auch IntelliSense und Validation in HTML, CSS und JavaScript Editoren. Nett finde ich, dass nun auch der Browser gewechselt werden kann, wenn das Projekt bereits läuft.

aspnet-debug-dropdown_optimized

Im Blogpost Visual Studio 2015 CTP 5 Available und in visualstudio.com/news werden die Neuerungen beschrieben.

Der Download ist unter Visual Studio 2015 CTP 5 bzw. direkt hier verfügbar:

Viele coole Features! Viel Spaß mit VS 2015 CTP 5!

Norbert Eder: Spam-Kommentare in WordPress ohne Timeout löschen

Bei aktiviertem Kommentar-System in WordPress dauert es nicht lange und hunderte, wenn nicht tausende Spam-Kommentare werden täglich abgegeben. Zur Spam-Erkennung gibt es einige Anbieter/Möglichkeiten, wie beispielsweise Akismet oder Antispam Bee. Offensichtliche Spam-Kommentare werden als Spam markiert und in einer eigenen Liste ausgewiesen.

Über die Schaltfläche Empty Spam kann die gesamte Liste gelöscht werden, das kann aber mitunter sehr lange dauern. Das Resultat ist häufig ein Timeout und eine sehr negativ auffallende Performance der Website.

Wer direkten Zugriff auf die Datenbank hat, kann ausgewiesene Spam-Kommentare so löschen:

delete from wp_comments WHERE comment_approved ="1";

Ist kein direkter Zugriff vorhanden, oder möchte man lieber ein Plugin für diese Arbeit, dann empfiehlt sich die Installation des Plugins Batch Comment Spam Deletion. Wie es der Name schon sagt, werden die Kommentare nun in Blöcken gelöscht (voreingestellt sind 200 Spam-Kommentare pro Ausführung). Dadurch werden Timeouts vermieden und der Server wird geschont.

Nachfolgend ist die Seite während der Ausführung der Batches ersichtlich. Es erfolgt ein automatisches Redirect auf die Kommentar-Seite, wenn alle Spam-Kommentare gelöscht wurden.

Batch Comment Spam Deletion Plugin für WordPress

Batch Comment Spam Deletion Plugin für WordPress

Das Plugin wird übrigens auf GitHub gepflegt.

Die meisten Plugins bieten auch die Möglichkeit, Spam-Kommentare sofort zu löschen. Wer die als Spam markierten Kommentare nicht sichtet, um etwaige false positives zu finden, sollte diese Möglichkeit ins Auge fassen.

The post Spam-Kommentare in WordPress ohne Timeout löschen appeared first on Norbert Eder.

Marco Scheel: Links for 2015-01-16 [del.icio.us]

ppedv Team Blog: Windows 10 – der nächste Schritt

Windows 10 ist bereits seit längerem in diversen Preview-Version erhältlich und soll im Laufe diesen Jahres endgültig freigegeben werden. Auf dem Weg dorthin hat Microsoft für den 21. Januar 2015 eine Pressekonferenz angekündigt, auf der einige Neuigkeiten zu Windows 10, verbunden mit der nächsten Vorab-Version, bekannt gegeben werden. Die Pressekonferenz startet 09:00 PST, was 18:00 Deutscher Zeit entspricht. Sie kann online unter folgender Adresse verfolgt werden:

http://news.microsoft.com/windows10story/

Mit etwas Glück werden auch Neuigkeiten zum Windows Server 2015 / vNext bekannt gegeben oder gar eine neue Preview veröffentlicht. Es bleibt also spannend!

Sven Hubert: TFS ASAP 2013.4 released

We are proud to present the new release for the TFS Automated Servicing and Administration Platform powered by AIT. Beside some minor bug fixes, this version supports the update 4 of  Microsoft Team Foundation Server 2013. Thus we are now offering TFS ASAP for every update of TFS 2013. For TFS 2012 the updates 2 and 3 are supported.

TFS version

availability of TFS ASAP

TFS 2012

no

TFS 2012 Update 2

yes

TFS 2012 Update 3

yes

TFS 2013

yes

TFS 2013 Update 2

yes

TFS 2013 Update 3

yes

TFS 2013 Update 4

yes

 

TFS ASAP is a reliable platform for advanced administration and extensions of Microsoft’s Team Foundation Server. It serves as a central management location for server-side event-based and scheduled automations such as aggregations as well as administrative extensions such as self-service team project creation and configuration web pages.

For further Information about TFS ASAP please refer to http://tfsasap.com or contact us at support@tfsasap.com.

For those who are already using VisualStudioOnline, there is our online version TFS ASAP online. This one is free of charge and does not require any installation. To take a closer look an TFS ASAP online please visit http://tfsasaponline.aitag.com.

TFS ASAP 2013.4 released is a post from: AIT Blog

Sven Hubert: TFS ASAP 2013.4 veröffentlicht

Seit dem 13. Januar 2015 ist die TFS Automated Servicing and Administration Platform powered by AIT nun auch für das Update 4 des Microsoft Team Foundation Servers 2013 verfügbar. Damit unterstützt TFS ASAP alle Updates des TFS 2013 sowie die Updates 2 und 3 des TFS 2012.

TFS version

availability of TFS ASAP

TFS 2012

no

TFS 2012 Update 2

yes

TFS 2012 Update 3

yes

TFS 2013

yes

TFS 2013 Update 2

yes

TFS 2013 Update 3

yes

TFS 2013 Update 4

yes

 

TFS ASAP bietet eine Plattform zur Erweiterung des Funktionsumfangs des Microsoft Team Foundation Servers. Die Anwendung stellt eine zentrale Verwaltung für Server-seitige Dienste bereit. Dabei kann es sich um Event-basierte oder zeitlich gesteuerte Automationen, zum Beispiel zur Aggregation von Werten, handeln. Weiterhin können administrative Aufgaben wie die Erzeugung von Teamprojekten abgebildet werden.

Im Techtalk “Episode 25 – TFS Automation mit TFS ASAP” stellen Christian Binder (Technical Evangalist bei Microsoft Deutschland) und Thomas Rümmler (Senior Consultant bei der AIT GmbH & Co. KG) TFS ASAP im Detail vor und diskutieren diverse Einsatz-Szenarien:  http://channel9.msdn.com/Blogs/TechTalk/Episode-25-TFS-Automation-mit-TFS-ASAP. Weiterführende Informationen zu TFS ASAP finden Sie unter http://tfsasap.com oder schreiben sie uns: support@tfsasap.com

Für Nutzer der Cloud-Variante des TFS, VisualStudioOnline, existiert ebenfalls eine Version: TFS ASAP online. Diese ist komplett kostenfrei und bedarf keinerlei Installation. Sie müssen sich lediglich registrieren und Ihre VisualStudioOnline-Instanz verknüpfen. TFS ASAP online sowie die Beschreibung zur Einrichtung finden Sie unter http://tfsasaponline.aitag.com.

TFS ASAP 2013.4 veröffentlicht is a post from: AIT Blog

Norbert Eder: Technologiewahl für mein Projekt

Vor einigen Tagen habe ich um eure Meinung gebeten und wollte wissen, welche Technologien ihr einsetzen würdet. Viele Antworten habe ich erhalten und möchte in diesem Beitrag meine Entscheidung bekannt geben und diese auch etwas ausführen.

Hier nochmals die Anforderungen, die ich im verlinkten Beitrag definiert hatte:

  • Angedacht sind Apps für iOS, Android und Windows Phone (Benachrichtigungen sind wichtig; Zugriff auf Kamera, Mikrofon etc. wird nicht benötigt)
  • Zugriff via Web soll ebenfalls möglich sein
  • Daten werden über APIs von Drittanbietern abgegriffen
  • Eigene API für Einstellungen, Daten etc.
  • Riesige Datenmengen sind anfangs nicht zu erwarten

Aus meinen Gedanken und den vielen erhaltenden Antworten habe ich mich nun für die Technologien/Frameworks/Libraries etc. entschieden, die ich einsetzen möchte. Vermutlich bin ich zu einer Entscheidung gelangt, die so einige wohl nicht erwartet haben.

Backend

Am Backend werden sich auf jeden Fall REST-Services befinden. Umsetzen wollte ich diese anfangs mit Go, wollte dann aber gemäß dem Motto “Schuster bleib bei deinen Leisten” weiter auf .NET setzen. Aber auch das habe ich verworfen. So wird am Backend Node.js eingesetzt werden. Erste Erfahrungen damit habe ich durch das eine oder andere Projekt damit bereits sammeln können.

Von Azure, Amazon AWS und Co. bin ich wieder abgekommen, da ich mich (im Moment) zu sehr an diese Services binden würde. Das mag irgendwann eine Option sein, gestartet wird jedoch ohne.

Als DBMS werde ich anfangs – so wie es aussieht – MySQL einsetzen.

Warum habe ich .NET verworfen?

Ich mag .NET und auch das Ökosystem. Aber irgendwie bin ich mit der Idee zu .NET zu greifen nicht ganz warm geworden. Wenn dann hätte ich zu ASP.NET 5 gegriffen, aber das ist noch nicht weit genug fortgeschritten, um ein Projekt möglichst flott produktiv zu bekommen. Davon abgesehen ist das Thema Hosting hierbei nicht einfacher. Aber das bedeutet ja nicht, dass es nicht vielleicht doch bei einem anderen Projekt eine Chance bekommt.

Frontend

Für mobile Endgeräte werde ich Ionic und Apache Cordova einsetzen. Damit kann ich meine Ziele wohl sehr schnell umsetzen und kann zudem Erfahrung mit den genannten Frameworks sammeln. Dass hier AngularJS mit von der Partie ist, ist natürlich positiv, da ich damit ganz gute Erfahrungen habe.

Begründung

Mir wird es zunehmend egal, auf welcher Plattform ich mich bewege. Sie muss mir zusagen und das was ich machen möchte schnell und zuverlässig erledigen. Das kann sich dann schon auch einmal (kurzfristig) ändern. Daher möchte ich eine Entwicklungsumgebung, die auf jeder Plattform ohne Probleme laufen kann. Mit dem gewählten Stack bringe ich in gewissen Bereichen Erfahrung mit, habe aber auch sehr viel zu lernen (warum ich das schlussendlich auch mache).

Ich bin auf jeden Fall schon gespannt, wohin die Reise tatsächlich gehen wird.

Zum Schluss noch ein dickes Dankeschön an alle die mir (egal über welchen Kanal) Feedback gegeben haben.

Danke Community!

The post Technologiewahl für mein Projekt appeared first on Norbert Eder.

ppedv Team Blog: ASP.NET Webforms Custom Controls

Seit Ewigkeiten habe ich keine Web Forms Controls mehr geschrieben. Mit Angular.JS Direktiven wird HTML erweitert und man erhält funktionell ein HTML Control. Das kann man natürlich auch Server gerendert, mit ASP.NET.

Die Programmieraufgabe lautet ein Validierungs Control selber zu schreiben. Eine übliche Aufgabe ist ein Prompt der die Daten eventuell noch einmal anzeigt und per JA und Nein bestätigt werden kann.

Dafür benötigt man allerdings einen Mix aus Server und Client Code. Um eine einheitliche Programmier Experience zu haben, wird JavaScript um eine String.format Funktion ala .net erweitert. Das ist geklauter Code, oder wie man auch gerne sagt Open Source.

   1:   String.format = function () {
   2:              var theString = arguments[0];
   3:   
   4:              for (var i = 1; i < arguments.length; i++) {
   5:                  // "gm" = RegEx options for Global search (more than one instance)
   6:                  // and for Multiline search
   7:                  var regEx = new RegExp("\\{" + (i - 1) + "\\}", "gm");
   8:                  theString = theString.replace(regEx, arguments[i]);
   9:              }
  10:              return theString;

 

Als nächstes wird eine Klasse von CustomValidator geerbt. Im Kern muss nur die Prerender Methode überschrieben werden, die HTML und JavaScript in den Client rendert.

   1:  Imports System.ComponentModel
   2:   
   3:  <DefaultProperty("PromptMessage")>
   4:  Public NotInheritable Class PromptValidator
   5:      Inherits CustomValidator
   6:      <DefaultValue("")>
   7:      Public Property PromptMessage() As String
   8:   
   9:   
  10:      Protected Overrides Sub OnPreRender(e As EventArgs)
  11:          Dim message = String.Concat("""", Me.PromptMessage, """")
  12:   
  13:          If PromptMessage.Contains("{0}") AndAlso Me.ControlToValidate <> "" Then
  14:              message = String.Concat("String.format(""", Me.PromptMessage, """, args.Value)")
  15:          End If
  16:   
  17:          Me.ClientValidationFunction = String.Concat("
new Function('sender', 'args', 'args.IsValid = confirm("
, message, ")')")
  18:          Me.EnableClientScript = True
  19:          MyBase.OnPreRender(e)
  20:      End Sub

 

Bereits ab diesem Zeitpunkt  befindet sich das neue Control in der Werkzeugleiste von Visual Studio und kann per Drag&Drop auf das Web Formular gezogen werden.

image

Auch wenn der Designer nicht perfekt ist, zeigt er das Steuerlement korrekt an. Im Quellecode kann man das registrierte Präfix erkennen.

   1:  <%@ Register Assembly="WebApplication5" Namespace="WebApplication5" TagPrefix="ppedv" %>
   2:  <html xmlns="http://www.w3.org/1999/xhtml">
   3:  <head runat="server">
   4:  ...    </head>
   5:   
   6:  <body>
   7:  <form id="form1" runat="server">
   8:  <asp:TextBox runat="server" ID="text1"></asp:TextBox>
   9:  <ppedv:PromptValidator runat="server" PromptMessage="Ihr Wert {0}?"
  10:           ErrorMessage="Ganz falsch" ControlToValidate="text1" 
  11:          ValidateEmptyText="true"/>
  12:          

Profis werden Ihre Controls in Assemblys kompilieren und das registrieren zentral in der web.config vornehmen. Alles in allem trotz fehlender Übung schnell und einfach von der Hand gegangen.

Übrigens werden Web Forms Schulungen noch immer gebucht.

ppedv Team Blog: Azure Wartungsarbeiten und Azure Bootcamp

Ab dem 19. Januar werden bei den Azure Cloud Services automatische Wartungsarbeiten durchgeführt die SSL 3.0 deaktivieren. Für alle Abonnenten die automatische Updates aktiviert haben werden ab diesem Datum regelmäßige automatische Security Updates  durchgeführt. Ohne dass die Kunden selbst aktiv werden müssen, werden Ihnen monatlich die aktuellen Security Fixes installiert, falls die Kunden automatische Updates gewählt haben. Wie bereits angekündigt wird im Januar Update SSL 3.0, neben weiteren Sicherheitsfixes, deaktiviert. Innerhalb von zwei Wochen soll das Januarupdate dann in allen Regionen installiert sein.

Um Kompatibilitätsprobleme vorzeitig zu erkennen, können Kunden das Tool MicrosoftFixit51024.msi bei Microsoft herunterladen um zu überprüfen ob die Dienste noch korrekt laufen.

Am 25. April 2015 findet wieder weltweit das Azure Bootcamp statt. Die Veranstaltungen in unserem Raum finden für Deutschland in Bad Homburg und für Österreich in Linz statt. Mehr Informationen finden Sie unter http://global.azurebootcamp.net/.

 

Marco Scheel: Links for 2015-01-13 [del.icio.us]

Falco Ostermann: Copy a OneNote notebook in SharePoint programmatically

Für ein Kundenprojekt bestand das Problem darin bestimmten Inhalt aus einer Bibliothek in eine neue zu kopieren. Dieser Vorgang sollte Site Collection übergreifend erfolgen, wodurch die Standard Move und Copy Methoden nicht verwendet werden konnten. Es wurde somit ein iteratives Skript geschrieben, welches alle Ordner und die darin enthaltenen Dateien an eine neue Stelle kopiert. An sich klingt das doch relativ einfach, doch mal wieder steckt der Teufel im Detail ;-)

Die Bibliothek enthielt etliche OneNote Notebooks, welche natürlich auch mehrere Abschnitte beinhalteten. Beim Ausführen des Skriptes ist mir erst so richtig bewusst geworden, dass ein OneNote Notebook in einer SharePoint-Bibliothek als Ordner abgebildet und die einzelnen Abschnitte als Dateien abgelegt wurden. Daher wurde dieser Ordner “brav” vom Skript kopiert und die OneNote Referenz ist dabei verloren gegangen. Das war natürlich nicht zielführend und so musste eine Lösung her, welche im folgenden kurz vorgestellt wird. Ich werde allerdings nur auf die Hauptprobleme eingehen und nicht näher erläutern, wie Dateien oder Ordner in SharePoint kopiert werden können, da es dafür schon diverse Beispiele im Internet gibt.

Check if the Folder is an OneNote Notebook

Da ein OneNote Notebook/ Ordner keinen eigenen Contenttype besitzt, musste ein anderes Attribut gefunden werden. Nachdem alle Attribute am SPFolder Objekt analysiert wurden, bin ich zu folgender Lösung gekommen:

SPFolder folder = //get-your-folder
bool isOneNote = !String.IsNullOrEmpty(folder.ProgID) &&
    folder.ProgID.Equals("OneNote.Notebook", StringComparison.InvariantCultureIgnoreCase);

Diese Zeilen liefern einen Wahrsheitswert, ob es sich bei dem untersuchten Ordner um ein OneNote Notebook handelt.

Convert a Folder to an OneNote Notebook

Natürlich ist es auch denkbar über eine Solution OnteNotes im SharePoint zu provisionieren. Je nach Art und Weise kann es passieren, dass auch dabei der Ordner nicht als OneNote Notebook erkannt wird. Daher muss diese Referenz manuell bzw. programmatisch gesetzt werden. Dies geschieht mittels der folgenden Zeilen:

SPFolder folder = //get-or-create-your-folder
folder.Item.ProgId = "OneNote.Notebook";
folder.Item.Update();

Wird anschließend die Seite neu geladen, so wird der Ordner als OneNote Notebook erkannt und bei Klick öffnet sich entsprechend auch die OneNote Anwendung oder die Office Web Apps.

Fazit

Zu Beginn dachte ich, dass OneNote Notebooks genauso wie normale Dateien im SharePoint kopiert werden können. Doch wird dieses genauer betrachtet, so stellt man fest, dass es sich dabei sogar um einen Ordner handelt. Doch dank der Eigenschaft ProgId kann schnell identifiziert werden, ob es sich bei dem Ordner um ein OneNote Notebook handelt und entsprechend reagiert werden. Auch das Konvertieren eines Ordners in ein OneNote Notebook ist somit möglich. Natürlich funktioniert all dies auch mit dem CSOM :-) . Ich hoffe wie immer, dass dieser Beitrag einigen Hilft und freue mich natürlich auf Feedback.

Hans-Peter Schelian: JetBrains 0xDBE verbindet sich nicht mit SQLExpress

Wer versucht sich auf einer Standardinstallation eines SqlExpress Server mit dem Datenbank Tool 0xDBE von Jetbrains zu verbinden wird leider nicht sofort Erfolg haben.
Es gibt 2 kleine Hürden die man zuerst überwinden muss, die ich hier in diesem Artikel beschreiben möchte.

TCP/IP Protokoll aktivieren

Bei der Standardinstallation eines SQLExpress ist das TCP/IP Protokoll nicht aktiviert, um mit 0xDBE arbeiten zu können muss das TCP/IP Protokoll aktiviert werden.
Hierzu öffnen wir den "Sql Server Configuration Manager" (danach nicht schließen wir brauchen ihn noch einmal), wählen auf der linken Seite den SQL Server aus, welchen wir konfigurieren wollen und aktivieren auf der rechtern Seite das TCP/IP Protokoll (siehe nachfolgende Abbildung).


Wenn die Sache mit dem TCP/IP Protokoll sicherlich noch von vielen als selbstverständlich angesehen wird und bereits aktiviert wurde ist der zweite Schritt sicherlich der entscheidende und nicht so offensichtliche.

SQL Server Browser

Bei einer Standardinstallation des SQLExpress Server wird der Dienst "SQL Server Browser“ installiert, aber weder ativiert noch gestartet.
Um mit 0xDBE eine Verbindung mit einem SQLExpress Server herzustellen ist es aber notwendig dass dieser Dienst läuft.
Hierzu gehen wir wie folgt vor:
Wir öffnen wieder (oder besser noch wir haben ihn noch auf) den "Sql Server Configuration Manager".


Wählen auf der linken Seite die "SQL Server Services" aus und doppelklicken auf der rechten Seite auf den "SQL Server Browser"


Dort wählen wir den Karteireiter „Service" aus und ändern den "Start Mode" von „Disabled" auf „Automatic".
Abschließend starten wir noch den Dienst "SQL Server Browser".

Nun klappt es auch mit 0xDBE und dem SQLExpress!

Martin Richter: Ein böser Bug…

Ein böser Bug.

Ich konnte ihn gerade noch in meiner Brotdose als Testfeld isolieren, bevor ich mit der Korrektur angefangen habe… :)

Und so sieht das ganze nun nach dem Fix aus… :8):

Der schwerwiegende Felhler nach dem Fix

Der schwerwiegende Fehler nach dem Fix


Copyright © 2010 Martin Richter
Dieser Feed ist nur für den persönlichen, nicht gewerblichen Gebrauch bestimmt. Eine Verwendung dieses Feeds bzw. der hier veröffentlichten Beiträge auf anderen Webseiten bedarf der ausdrücklichen Genehmigung des Autors.
(Digital Fingerprint: bdafe67664ea5aacaab71f8c0a581adf)

Norbert Eder: #fotomontag #2

Jeden Montag ein Foto. Der #fotomontag.

Vor einigen Tagen wollte ich eigentlich in die Innenstadt von Graz um meinen neuen Graufilter zu testen. Wie es der Zufall so wollte, hatte ich meine Geldtasche vergessen und konnte daher nirgends parken. Da es unbedingt ein Foto von der Mur sein sollte, fuhr ich also nach Norden, denn da kannte ich einen Zugang zur Mur und eine Parkmöglichkeit.

Was ich jedoch nicht wusste, dort versteckt sich hinter Büschen und Bäumen das Laufkraftwerk Weinzödl. Das nachfolgende Foto ist dann aber doch ohne Graufilter.

Laufkraftwerk Weinzödl

Laufkraftwerk Weinzödl

Hast du eine Meinung zum Foto? Ja? Dann lass sie mich doch bitte wissen und bewerte es in den Kommentaren.

The post #fotomontag #2 appeared first on Norbert Eder.

Roberto Bez: React Flux

Flux ist eine Architektur, die Facebook für client-seitige Web Applikationen verwendet. Es ist also kein Framework oder Bibliothek die eingebunden werden kann, sondern viel mehr eine Ergänzung eines unidirektionalen Datenflusses zu den React View Komponenten.

Flux Applikationen bestehen aus mehreren Komponenten: Actions, Dispatcher, Stores und Views (die eigentlichen React Komponenten).

React Flux Architektur - unidirectional data flow

  • Actions: Hilfsmethoden um Daten an den Dispatcher zu transportieren. Beispiel: updateText(todoId, newText)
  • Dispatcher: Erhält Actions und broadcasted das Payload zu den registrierten Callbacks (Stores).
  • Stores: Enthalten den Application State und die Logik und haben Callbacks auf den Dispatcher registriert.
  • Controller Views: React Komponenten welche sich den state von den Stores holen und diesen als props den child-Komponenten weiterreichen.

Der Unterschied zu klassischen Patterns wie MVC (Model View Controller) ist liegt im Datenfluss. Wenn ein Benutzer mit der React View interagiert, so sendet diese eine Action durch den zentralen Dispatcher hin zu den verschiedenen Stores, welche den state und die business Logik beinhalten. Die Stores wiederum aktualisieren alle betroffenen Views.

Der View Schicht ist es nicht erlaubt den state direkt zu ändern – sie muss fire-and-forget Anweisungen an den Dispatcher senden. Mit diesem Weg haben Views keine andere Verantwortung als den aktuellen state der Anwendung zu rendern.

Ein fluxiges Beispiel bei Facebook

Ein gutes Beispiel von Facebook zeigt, warum dieser Weg sinnvoll ist:
Sendet jemand eine neue Nachricht, so erscheint in der Menüleiste ein rotes Bubble-Icon das auf nicht gelesene Nachrichten hinweist. Gleichzeitig erscheinen die Nachrichten auch im Chat-Fenster. Wird nun die Nachricht gelesen, so verschwindet das rote Hinweis-Icon.
Dieses Szenario in MVC abzubilden würde bedeuten, dass zum einen das Nachrichten-Model und das Nicht-gelesene-Nachrichten-Model aktualisiert werden müssten. Diese Abhängigkeiten sowie solche kaskadierenden Aktualisierungen sind keine Ausnahme bei großen Webanwendungen und führen oft zu komplexen Datenströmen und unvorhersehbaren Ergebnissen.

Mit Flux hingegen würde die View eine neue Action generieren und diese durch den zentralen Dispatcher senden. Die einzelnen darauf registrierten Stores können dann entscheiden, was sie mit dem Update machen (beispielsweise das Hinweis-Icon wieder auszublenden wenn alle Nachrichten gelesen wurden). Keine Komponente außerhalb des Stores weiß, wie dieser intern die Daten für seine Domäne verwaltet, was für eine klareres “Separation of Concerns” spricht.

Ein einzelner Dispatcher

In einer Flux Applikation ist der Dispatcher das zentrale Hub, welches den gesamten Datenfluss verwaltet. Er besitzt selbst keine großartige Logik, sondern erhält Actions aus verschiedenen Stellen (Benutzerinteraktion in den Views, Server/API, …) und verteilt diese auf die einzelnen Stores, welche sich mit einem Callback registriert haben.

Flux Dispatcher - Store Callbacks

Der Dispatcher kann die Abhängigkeiten zwischen den einzelnen Stores verwalten, indem er beispielsweise die registrierten Callbacks in einer gewissen Reihenfolge ausführt oder auf Updates wartet, bevor er fortfährt.

var Dispatcher = require('flux').Dispatcher;
var AppDispatcher = new Dispatcher();

AppDispatcher.handleViewAction = function(action) {
  this.dispatch({
    source: 'VIEW_ACTION',
    action: action
  });
}

module.exports = AppDispatcher;

Die handleViewAction-Methode ruft die dispatch Methode auf, welche den Action-Payload an alle registrierten Callbacks weitergibt. Die view Action Angabe ist sinnvoll um view von server oder API Actions zu unterscheiden.

Flux Stores

Die Aufgabe eines Flux Stores ist einem klassischen MVC Model ähnlich. Allerdings verwaltet ein Store nicht nur ein Model, wie das bei ORM Models der Fall ist, sondern den state von mehreren Objekten. Es soll aber auch keine Collection, wie das aus Backbone bekannt ist, sein, sondern viel mehr der application State für eine bestimmte Domäne innerhalb der Anwendung.

Wie bereits erwähnt, registriert sich ein Store mittels eines Callbacks eigenständig beim Dispatcher. Der Callback wiederum bekommt die Action als ein Parameter mit. Innerhalb dieses Callbacks wird mit einem switch-Statement auf den actionType abgefragt, welche interne Methoden ausgeführt werden:

var AppDispatcher = require('../dispatcher/AppDispatcher');
var EventEmitter = require('events').EventEmitter;
var TodoConstants = require('../constants/TodoConstants');
var assign = require('object-assign');
var _todos = {};

var TodoStore = assign({}, EventEmitter.prototype, {

  getAll: function() {
    return _todos;
  },

  emitChange: function() {
    this.emit(CHANGE_EVENT);
  },

  addChangeListener: function(callback) {
    this.on(CHANGE_EVENT, callback);
  },

  removeChangeListener: function(callback) {
    this.removeListener(CHANGE_EVENT, callback);
  }
}

AppDispatcher.register(function(action) {
  var text;

  switch(action.actionType) {
    case TodoConstants.LOAD_TODOS:
      // Call internal method like loadTodos...
      _todos = action.data;
      TodoStore.emitChange();
      break;

    // ...
  }
});

module.exports = TodoStore;

Wenn sich ein Store aktualisiert hat, wird mit einem Event eine Statusaktualisierung an die Views übertragen, sodass sich diese mit dem neuen state aktualisieren können.

Wichtig ist beim Beispiel, dass der Store von NodeJS’s EventEmitter erweitert wird, sodass die Stores auf Events hören oder Events senden können. Gleichzeitig können die View Komponenten auf diese Events lauschen und sich bei Änderungen aktualisieren und neu rendern.

Actions und Action Creators

Action Creators sind semantische Hilfsmethoden, welche eine Action zum Dispatcher senden. Um beispielsweise den Text eines ToDo Items zu ändern, kann eine action updateText(todoId, newText) erstellt werden:

var AppDispatcher = require('../dispatcher/AppDispatcher');
var TodoConstants = require('../constants/TodoConstants');
var TodoActions = {
  updateText: function(id, text) {
    AppDispatcher.dispatch({
      actionType: TodoConstants.TODO_UPDATE_TEXT,
      id: id,
      text: text
    });
  }
};
module.exports = TodoActions;

Action Creators werden in der Regel in den Eventhandlers der Views ausgeführt, um auf Benutzerinteraktionen zu reagieren. Aber auch wenn neue Daten vom Server gesendet werden, können diese hilfreich sein.

Abhängigkeiten mit waitFor

Wenn ein Teil der Anwendung von einem anderen abhängig ist, so lässt sich dies mit der waitFor Methode im Dispatcher Modul umsetzen. Allerdings muss erst noch der Rückgabewert der Registrierungsmethode im Store gesetzt werden:

PrependedTextStore.dispatchToken = Dispatcher.register(function (payload) {
  // ...
});

Anschließend kann im ToDo-Store die waitFor mit Angabe des dispatchTokes verwendet werden:

case 'TODO_CREATE':
  Dispatcher.waitFor([
    PrependedTextStore.dispatchToken,
    YetAnotherStore.dispatchToken
  ]);

Fazit

Zusammengefasst kann folgendes Diagramm den Datenfluss in Flux noch einmal erklären:

Facebook React/Flux Architektur

Die Flux Implementierung von Facebook ist nicht die einzige: Es gibt mittlerweile weitere wie Fluxxor, RefluxJS oder Yahoo’s fluxible-app Ansatz.

Wenn die erste Anwendung mit Flux erst einmal entwickelt ist, fühlt sich React ohne Flux gleich wie DOM Manipulationen in JavaScript ohne jQuery vor ein paar Jahren an ;-)

Note: There is a rating embedded within this post, please visit this post to rate it.

friends header

bloggers headline

links header

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