Breadcrumb-Ansicht in SharePoint 2013

Um in SharePoint 2013 die von vielen Menschen liebgewonnene Breadcrumb-Ansicht oder anders ausgedrückt Brotkrümel-Ansicht anzuzeigen, wird im folgenden Artikel die Vorgehensweise beschreiben.

Es empfiehlt sich den SharePoint Designer 2013, nachfolgend SPD 2013 genannt, hierfür zu benutzen.

Hinweis: Damit die nachfolgenden Schritte funktionieren, ist es zuvor notwendig, die nachfolgend als Screenshot aufgeführten Features einzuschalten. Darüber hinaus muss auch eine entsprechende Website-Struktur erstellt worden sein (Untersites) und die Navigationseinstellungen bearbeitet worden sein (Unterwebsites anzeigen aktivieren)

1. Homepage aufrufen (Website der obersten Ebene), Features aktivieren

Einstellungen -> Websiteeinstellungen -> Websitesammlungsverwaltung -> Websitesammlungsfeatures -> SharePoint Server-Veröffentlichungsinfrastruktur

clip_image002

Einstellungen -> Websiteeinstellungen -> Websiteaktionen -> Websitefeatures verwalten -> SharePoint Server-Veröffentlichung

clip_image004

Hinweis: Das SharePoint Server-Veröffentlichungsfeature muss auf jeder Unterwebsite aktiviert werden. Des Weiteren ist die Navigationsvererbung einzuschalten.

2. Nachdem die Verbindung im SPD 2013 hergestellt worden ist, wird im Navigationsbereich links unter Websiteobjekte der Punkt Gestaltungsvorlagen aufgerufen.

3. Standardmäßig wird die seattle.html Masterpage verwendet. Hier gilt es die seattle.html aufzurufen, nicht die seattle.master.

Nun sucht man im Code am besten mittels Tastenkombination Strg + F nach „ms-breadcrumb-box

clip_image006

4. Hier wird die Eigenschaft unter „Visible“ statt false auf „true“ gesetzt.

5. Danach wird in der Code-Ansicht nach der passenden Stelle gesucht, an der die folgenden zwei Code-Zeilen eingefügt werden:

<!--MS:<asp:sitemappath runat="server" sitemapproviders="SPSiteMapProvider,SPXmlContentMapProvider" rendercurrentnodeaslink="false" hideinteriorrootnodes="true">-->

<!--ME:</asp:sitemappath>-->

In meinem Beispiel habe ich die Breadcrumb-Ansicht unterhalb des Titels der jeweiligen Website eingefügt. Der Bildausschnitt zeigt, an welcher Stelle es vorgenommen werden muss.

clip_image009

Jetzt wird die Masterpage gespeichert und die Website aktualisiert. Das fertige Ergebnis sieht dann folgendermaßen aus:

clip_image012

Unterhalb des Titels wird als Pfad angezeigt, welche Unterwebsites geöffnet wurden.

TSQL - Der bessere Replace

Ab und zu sieht man den Wald vor lauter Bäumen nicht. Dieses Mal stand ich vor der Aufgabe aus einer Spalte bestimmte Werte zu ersetzen. Die Liste der zu ersetzenden Werte war doch etwas länger. Mit einem simplen Replace komme ich nicht besonders weit, da sich ja nur ein Wert ersetzen lässt.  Grübel grübel.. Doch es ist ganz simpel.

Das Prinzip:

Wir weisen einer Variablen einen per Replace bereinigten Wert zu.  Anschliessend wird auf das Ergebnis wiederum ein weiterer Replace angewendet (mit einem anderen zu ersetzenden Wert) und dann wiederum der Variable zugewiesen. Das machen wir solange bis wir alle zu ersetzenden Werte durch haben.  Das geht pfeilschnell.

Das ganze packen wir noch in eine Funktion und schon haben wir einen besseren Replace:

CREATE FUNCTION  dbo.BetterReplace (@str NVARCHAR(4000))
RETURNS nVARCHAR(4000) AS
BEGIN
    SET @str = REPLACE (@str,'>',' ')
    SET @str = REPLACE (@str,';',' ')
    SET @str = REPLACE (@str,'&',' ')
    SET @str = REPLACE (@str,':',' ')
    SET @str = REPLACE (@str,'<',' ')
    SET @str = REPLACE (@str,'/',' ')
    SET @str = REPLACE (@str,'\',' ')
    SET @str = REPLACE (@str,',',' ')
    SET @str = REPLACE (@str,'*',' ')
    SET @str = REPLACE (@str,'^',' ')
    SET @str = REPLACE (@str,'ü','ue')
    SET @str = REPLACE (@str,'ä','ae')
    SET @str = REPLACE (@str,'ö','oe')
    SET @str = REPLACE (@str,'"',' ')

  RETURN @str    
END

Zum Beispiel:

declare @str as varchar(100)
set @str='<Tel>+49\8677-98890'

select dbo.BetterReplace (@str)

Ergebnis:

Tel +49 8677-98890

Einfach und wirkungsvoll!

Open Source: Plötzlich spielt es eine Rolle

Vor rund zwei Jahren habe ich hier im Blog eine Diskussion losgetreten. Völlig frustriert von der miesen Qualität diverser Bibliotheken und fehlender Dokumentation habe ich Dampf abgelassen. Die Aussage: “Es ist mir scheißegal, ob Open Source oder nicht.”

Im Bezug auf die aktuellen Geschehnisse um OPENSSL und den #heartbleed Bug muss ich meine Meinung revidieren. Es ist plötzlich wichtig #OPENSOURCEFREE auf das Produkt-Paket gedruckt zu bekommen. Um es klar zu sagen, dies war kein Einzelfall:

  • Heartbleed, unentdeckt für ca 2 Jahre, schlimmster Sicherheitsunfall in der Geschichte des Internets
  • GnuTLS blieb 10 Jahre unentdeckt
  • Eine fehlende Codezeile im Random Number Bug über 2 Jahre
  • TCP-32764 Backdoor, dessen Urheber bis heute unklar ist

Damit gilt das oft zitierte Statement als widerlegt. In der Wissenschaft reicht ein Negativbeweis. Die Diskussion über Open Source als Sicherheitsrisiko, speziell im Unternehmenseinsatz, ist über 10 Jahre alt, wird aber von den Verfechtern negiert.

"Weil aber Open Source die Offenlegung des Quellcodes bedeutet, können Anwendungen von allen Nutzern ständig weiterentwickelt werden. Auch Fehler lassen sich so meist schneller beheben."

"Der Vorteil von Open Source: Schadsoftware, Bugs oder Sicherheitslücken können in der Regel schneller entdeckt werden. Es reicht allein der Verdacht, und Tausende von EntwicklerInnen nehmen den betreffenden Code ganz genau unter die Lupe", sagt Grote. Die größere Gefahr bestehe vielmehr in den unfreien Komponenten, etwa proprietären Modemtreibern oder Firmware, die meist von den Herstellern kommen und deren Sicherheit niemand überprüfen kann."

Nun stehen zwei Konzepte gegenüber: Open Source und Closed Source. Warum ich glaube, dass Closed Source die bessere Wahl sein kann:

Kosten

Es wird argumentiert, dass bei Open Source die Lizenzkosten wegfallen. Das Beispiel der Stadt München hat bewiesen, dass man mit mehr finanziellem Aufwand ein qualitativ weniger hochwertiges Ergebnis erreichen kann - bei höherem zeitlichem Aufwand. Open Source kann nur seriös eingesetzt werden, wenn das Know-how und die Ressourcen vorhanden sind, den Code zu pflegen. Niemals kann man sich darauf verlassen, dass jemand für immer und gratis seine Bibliothek weiter pflegt oder das jemand ganz automatisch mit Freude und völlig unentgeltlich diesen Job übernimmt. Persönlich schmerzlich erfahren mit dotnetopenauth.

Sicherheit

Ganz generell gesprochen gibt es keinen schlüssigen Zusammenhang zwischen Sicherheit und Open Source. Ein Vier-Augen-Prinzip erhöht die Sicherheit in jedem Softwareprojekt, allerdings ist es auch ein Leichtes, in ein Open Source-Projekt Programmierer einzuschleusen, die andere Ziele verfolgen. Dabei hat sich gezeigt, dass die Entdeckung von Sicherheitslücken über Parsing Tools  und nicht per Code-Analyse erfolgte.

Verantwortung

Der letzte Punkt ist mir erst in den letzten Tagen so richtig klar geworden. Niemand übernimmt die Verantwortung. Gerade in einem Land wie Deutschland, in dem sich jeder gegen jedwede Risken versichert, in dem unglaublicher Aufwand getrieben wird den kleinsten Parksünder dingfest zu machen, kann es sich eigentlich niemand leisten, nicht zu wissen, wer eigentlich Schuld trägt.

Das ist sowohl rechtlich in Fragen der Gewährleistung als auch gesellschaftlich ein unhaltbarer Zustand.

Stellen Sie sich mal vor eine Airline würde Metallteile verbauen, die sie auf der Straße findet.  Dann hätten wir nicht nur eine MH370, sondern jeden Tag zehn. Verantwortungslos.

Fazit

Open Source wurde immer durch Gebrauch des englischen Begriffs "free" mit gratis verwechselt. Nachdem dieser Irrtum erwiesen ist und die erheblichen Risiken nicht mehr zu leugnen sind, müsste man folgerichtig ein EU-Verbot fordern. Oder zumindest abschreckende Warnaufdrucke, ähnlich der Zigarettenschachteln. Die werden auch nicht weniger schädlich, wenn man das billige Kraut raucht.

PS: Auch Microsoft hatte seine Sicherheitsgaus - bis vor etwa 10 Jahren (SQLSlammer), danach nicht mehr.

Das April-Update für Windows 8.1 und Server 2012 R2

Zeitgleich mit dem Ende vom Support für Windows XP (und dem damit verbundenen letzten Patchday für eben dieses) veröffentlichte Microsoft am 8. April 2014 ein erstes größeres Update für Windows 8.1 und Windows Server 2012 R2:

http://support.microsoft.com/kb/2919355

Entgegen den Erwartungen bringt dieses Patch das "alte" Startmenü nicht zurück (dies soll mit einem weiteren Update vermutlich im Herbst nachgeliefert werden), hat aber dennoch einige Verbesserungen an Bord. Diese zielen vor allem darauf ab, die Bedienung mit Tastatur und Maus zu verbessern. Dazu gehören u.a. folgende Veränderungen:

  • Das System unterscheidet bei einigen Aktionen, ob diese mit der Maus oder dem Touchscreen ausgelöst wurden
  • Fährt man mit der Maus in einer geöffneten Modern UI App an den oberen Bildschirmrand, erscheint eine Box zum Minimieren und Schließen, so wie man es aus klassischen Fenster-Anwendungen kennt
  • Am unteren Bildschirmrand wird die Taskleiste eingeblendet
  • Ein Rechtsklick auf eine Kachel liefert diverse häufig genutzte Optionen
  • Verknüpfungen zu Modern UI Apps können auf der Taskleiste abgelegt werden
  • Auf der Startseite gibt es jetzt einen eigenen Button für den Shutdown, zusätzlich einen für die Suche

Neben diesen Änderungen werden eine ganze Reihe bekannter Probleme behoben. Welche genau kann man im TechNet KB Artikel nachlesen:

http://support.microsoft.com/kb/2919355/en-us

Das Update ist knapp 890MB groß und wird u.a. über Windows Update verteilt.

Data Annotations Webforms und Bootstrap ausgereizt

Auf dem Weg zum Lazy Web Developer habe ich dieses Mal den Data Annotations auf den Zahn gefühlt. In Silverlight war das richtig geiler Scheiss.

Man kann einer Klasse per Property-Attributen Regeln mitgeben. Diese werden Data Annotations genannt. Die Regeln können sich auf Darstellung, Reihenfolge oder Gültigkeit eines Propertys beziehen.

   1:  Public Class daten1
   2:      <Key()>
   3:      Property id As Integer
   4:      <Required(ErrorMessage:="brauche Daten")>
   5:      <EmailAddress(ErrorMessage:="brauche email")>
   6:      Property email As String
   7:      <Required(ErrorMessage:="musse haben")>
   8:      Property name As String
   9:  End Class

In der richtigen Umgebung werden diese Klassenattribute ausgewertet.

ASP.NET nutzt die Klassenattribute über Dynamic Data. Eingebettet in ein Datensteuerelement wertet das DynamicEntity-Steuerelement das gebundene Objekt (Itemtype) aus.

   1:      <link href="../Content/bootstrap.css" rel="stylesheet" />
   2:      <script src="../Scripts/jquery-2.0.3.js"></script>
   3:      <script src="../Scripts/bootstrap.js"></script>
   4:  </head>
   5:  <body>
   6:      <form id="form1" runat="server">
   7:      <div>
   8:          <asp:FormView ID="FormView1" DataKeyNames="id" 
ItemType="daten1"
   9:               runat="server" DefaultMode="Insert">
  10:              <InsertItemTemplate>
  11:                  <asp:DynamicEntity runat="server" ID="eins" 
Mode="Insert"/>
  12:                  <asp:Button runat="server" CommandName="Insert" 
Text="insert" class="btn btn-default"/>
  13:              </InsertItemTemplate>
  14:          </asp:FormView>
  15:      </div>
  16:      </form>
  17:  </body>

 

Die Magie geschieht im Verzeichnis Dynamic Data. Je nach Mode (hier insert), wird das Template aus EntityTemplate geladen.

image

Dieses Template wurde von mir leicht angepasst, um den Bootstrap 3 Formular-Regularien zu folgen.

   1:  <asp:EntityTemplate runat="server" ID="EntityTemplate1">
   2:      <ItemTemplate>
   3:          <div class="form-group">
   4:              <asp:Label ID="Label1" runat="server" OnInit="Label_Init"
   5:                  OnPreRender="Label_PreRender" 
CssClass="col-sm-2 control-label" />
   6:              <div class="controls">
   7:                  <asp:DynamicControl runat="server" ID="DynamicControl"
   8:                      Mode="Edit" OnInit="DynamicControl_Init" />
   9:              </div>
  10:          </div>
  11:      </ItemTemplate>
  12:  </asp:EntityTemplate>

 

Das DynamicControl-Element wird dann passend zum Datentypen durch ein Template aus dem Verzeichnis FieldTemplate ersetzt. In diesem Beispiel Integer_Edit, Text_Edit und EMailAddress_Edit.

Folgendes deklarative ASP.NET Code-Beispiel zeigt das Text-Template. Wichtig ist Display Dynamic einzustellen, um den Platz in der Darstellung nicht zu verbrauchen, wenn keine Fehlermeldung angezeigt wird. Außerdem verwendet Bootstrap für sein error HTML Template die CSS-Klasse help-block. Ergebnis ist roter Text.

   1:  <asp:TextBox ID="TextBox1" runat="server" Text='<%# FieldValueEditString %>'
   2:       CssClass="form-control"></asp:TextBox>
   3:   
   4:  <asp:RequiredFieldValidator runat="server" ID="RequiredFieldValidator1" 
CssClass="help-block" ControlToValidate="TextBox1" Display="Dynamic" Enabled="false" />
   5:  <asp:RegularExpressionValidator runat="server" ID="RegularExpressionValidator1" 
CssClass="help-block" ControlToValidate="TextBox1" Display="Dynamic" Enabled="false" />
   6:  <asp:DynamicValidator runat="server" ID="DynamicValidator1" 
CssClass="help-block" ControlToValidate="TextBox1" Display="Dynamic" />
   7:   

Die ASP.NET Validation Controls haben allerdings ein Feature, das hier stört. Diese können mit einem Stern die Fehlerposition  und den beschreibenden Fehlertext in einem ValidationSummary Control anzeigen. Wir wollen aber den Fehlertext direkt unterhalb der Eingabe sehen.

Folgender übler Trick ersetzt per VB.NET Code im Page Load Event des ASCX Files den Stern und damit wird der volle Text gezeigt:

   1:  RegularExpressionValidator1.Text = ""
   2:  RequiredFieldValidator1.Text = ""
   3:  DynamicValidator1.Text = ""

Dann füge ich noch eine JavaScript-Datei hinzu, die CSS-Attribute austauscht für has-errors wenn die Eingabe nicht valid ist. Dies ist in einem anderen Blog-Artikel beschrieben.

   1:  var proxied = window.ValidatorValidate;
   2:   
   3:  window.ValidatorValidate = function () {
   4:   
   5:      var result = proxied.apply(this, arguments);
   6:      onAfter(arguments);
   7:   
   8:  };
   9:   
  10:  var onAfter = function (arguments) {
  11:      var control = document.getElementById(arguments[0].controltovalidate);
  12:      var validators = control.Validators;
  13:      var isValid = true;
  14:   
  15:      for (var i = 0; i < validators.length; i++) {
  16:          if (!validators[i].isvalid) {
  17:              isValid = false;
  18:              break;
  19:          }
  20:      }
  21:   
  22:      if (isValid) {
  23:          $(control).closest('.form-group').removeClass('has-error');
  24:      } else {
  25:          $(control).closest('.form-group').addClass('has-error');
  26:      }
  27:  };

Bei einem Submit des Formulars sieht das im Internet Explorer  so aus:

image

Sehr cool, was die ASP.NET Steuerelemente zusammen mit Bootstrap hier so zaubern. Allerdings sind sie einen Hauch zu intelligent. Es werden nämlich auch korrekt die neuen HTML5 Input-Typen gerendert (Type=”number” und Type=”email”). Moderne Browser validieren dann auch gleich mal selber was im IE bei falscher E-Mail-Adresse so aussieht:

image

Zuerst erscheint ein browserspezifisches Popup und wenn man das Feld per TAB verlässt, wird es rot eingerahmt.

Da wir uns hier in den Händen des Browsers befinden, sieht das dann Chrome auch deutlich anders. Die fehlerhafte Eingabe wird gar nicht mehr hervorgehoben und die Nummer wird von einem Updown Icon begleitet.

image

In den Bootstrap-Foren wurde das Thema auch diskutiert und dann geschlossen. Theoretisch wäre auch das Required-Attribut ein HTML5-Standard, hier erzeugt ASP.NET aber stattdessen ein DIV. Optisch besser aber nicht konsistent. Bei meiner Recherche habe ich ein Plugin gefunden, habe aber ein wenig Probleme für das Framework, das für die Unzulänglichkeiten von CSS erfunden wurde, ein Plugin zu verwenden, das die Unzulänglichkeiten des Frameworks fixed. Im ersten Test gibt es einen Konflikt mit meiner eigenen JS Library. Selbst wenn ich das fixe, kann schon morgen mit dem nächsten Nuget-Update wieder alles hin sein.

Form-Validierung für Bootstrap

Es gibt verdammt viele Möglichkeiten, um Benutzereingaben zu validieren. Im Webumfeld werden es sogar mehr statt weniger. Hinzu kommen Anforderungen an das Design. Client oder Server? Ganz schön viel für einen kleinen Blogartikel, der sich um ASP.NET-Formulare in Verbindung mit Bootstrap 3 kümmert.

Bootstrap ist ein Framework für einfacheres Webdesign. Responsive Design fast ohne CSS anzufassen. Microsoft setzt in Visual Studio 2013 und seinem One ASP.NET Template auf die aktuelle Version Bootstrap 3. Ist also schon drin. Ideal also für eine schnelle Validierung am Client.

Das HTML Template setzt sich aus geschachtelten DIV zusammen und vor allem dem Attribut has-error. In der  Version 2 lautete das noch control-group und error.

   1:   <div class="form-group has-error">
   2:          <label class="control-label" for="text1">Feldbeschreibung
</label>
   3:          <div class="controls">
   4:              <input type="text" class="form-control" id="text1">
   5:              <span class="help-block">Fehlermeldung</span>
   6:          </div>
   7:  </div>

und sieht dann so aus. Der Fehler ist sozusagen hart verdrahtet.

image

Nun stellt sich sowohl für den ASP.NET MVC und auch den Webforms Frontend Designer die Frage, wie man die Validation Controls bzw. HTML Validation Helper dazu bewegt da mitzuspielen. Das Problem liegt vor allem darin, dass die Fehlermeldung einen übergeordneten Node im HTML Dom verändern muss. Aus Programmierersicht ist es ohnehin verpönt, Elemente (oder Objekte) in Abhängigkeit zu stellen.

Die Alternative, komplett neue Steuerelemente zu entwickeln, erscheint wenig verlockend.

Betrachten wir die Eingabevalidierung mit ASP.NET Web Forms unter Anwendung der vorigen Bootstrap HTML Vorlage. Es soll geprüft werden, ob die Eingabe eine gültige E-Mail-Adresse ist. Visual Studio schlägt in den Control-Eigenschaften die passende Regular Expression vor.

   1:  <div class="form-group" id="test1">
   2:          <asp:Label ID="Label2" runat="server" Text="Beschriftung"
   3:           CssClass="col-sm-2 control-label" />
   4:          <div class="controls">
   5:              <asp:TextBox ID="TextBox1" runat="server" 
CssClass="form-control">
   6:  </asp:TextBox>
   7:              <asp:RegularExpressionValidator 
ID="RegularExpressionValidator1" runat="server"
   8:                  SetFocusOnError="true"
   9:                  ErrorMessage="RegularExpressionValidator" 
ControlToValidate="TextBox1"
  10:  ValidationExpression="\w+([-+.']\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*">
  11:  </asp:RegularExpressionValidator>
  12:          </div>
  13: </div>    

Als nächstes kommt JavaScript und JQuery Magic zum Einsatz. Mein großes Problem war herauszufinden, wo man während der Validierung einhaken kann. Das Validator Control blendet dynamisch ohne Postback die Fehlermeldung ein bzw. aus - dank moderner unobtrusive Validation von ASP.NET Webforms auch mit JQuery Validierung. Im HTML Code wird ein SPAN Element erzeugt. Data-Attribute werden für die Validierung verwendet.

   1:   <input name="ctl00$Inhalt$TextBox1" type="text" 
id="Inhalt_TextBox1"
   2:  class="form-control" />
   3:   
   4:  <span data-val-controltovalidate="Inhalt_TextBox1" 
data-val-focusOnError="t"
   5:  data-val-errormessage="RegularExpressionValidator" 
   6:  id="Inhalt_RegularExpressionValidator1" data-val="true" 
   7:  data-val-evaluationfunction="RegularExpressionValidator
EvaluateIsValid"
   8:  data-val-validationexpression="\w+([-+.&#39;]\w+)*@\w+
([-.]\w+)*\.\w+([-.]\w+)*"
style="visibility:hidden;">
RegularExpressionValidator</span>
   9:          </div>

Bleibt die Frage, wie man aus dem SPAN da, oder nicht da, auf ein übergeordnetes DIV kommt. Ginge, aber ich habe ein Event gefunden, das schon seit Ewigkeiten in der Library existiert, ValidatorValidate.

Diese Methode wird dann überschrieben, wie man das aus OOP so kennt, um seine eigene Logik (onAfter) hinten dran einzufügen. Dann wird die CSS Klasse has-error zugewiesen, wenn ein Fehler auftritt.

   1:  <script>
   2:   var proxied = window.ValidatorValidate;
   3:         window.ValidatorValidate = function () {
   4:          var result = proxied.apply(this, arguments);
   5:          onAfter(arguments);
   6:         };
   8:         var control = document.getElementById(arguments[0].
controltovalidate);
   9:         var validators = control.Validators;
   7:         var onAfter = function (arguments) {
  10:         var isValid = true;
  11:         for (var i = 0; i < validators.length; i++) {
  12:                  if (!validators[i].isvalid) {
  13:                      isValid = false;
  14:                      break;
  15:                  }
  16:              }
  17:             if (isValid) {
  18:                  $(control).closest('.form-group').
removeClass('has-error');
  19:              } else {
  20:                  $(control).closest('.form-group').
addClass('has-error');
  21:              }
  22:          };
  23:  </script>

 

Um ehrlich zu sein, bin ich mir nicht sicher, was ich mir im Detail damit einhandle. Falls es unter den Lesern welche gibt die dazu Feedback haben, per mail an hannesp at ppedv.de oder Facebook.com/preishuber.

Jedenfalls ist der Aufwand nun überschaubar. Einfach als JS-Datei ausgelagert und am besten in der Masterpage included.

Build-Ankündigungen für Microsoft Azure

Auf der Build-Konferenz, die in dieser Woche in San Francisco stattfand, gab es einige neue Meldungen, natürlich auch zum Thema Microsoft Azure, wie sich die Cloud-Lösung seit dieser Woche nennt.

  • Neues Portal

Seit Donnerstag Abend steht unter https://portal.azure.com/ das neue Portal für Microsoft Azure als Preview zur Verfügung. Dieses neue Portal verknüpft dabei Microsoft Azure und Visual Studio Online. Es soll im Laufe der Zeit um weitere Tools von Microsoft und deren Partnern erweitert werden und auch auf die Wünsche der Kunden angepasst werden.

  • Neue Basiskategorie für Web Sites

Die neue Einsteigerkategorie für Web Sites (Basic) bietet Unterstützung für small, medium und large Virtual Machines. Gegenüber der Standardedition liegen die Preise um 33 % niedriger. Die folgende Grafik zeigt einen Vergleich der verschiedenen Angebote:

Wie Sie aus der Grafik auch erkennen können, wurden die Standardinstanzen auch verbessert. So können Kunden ohne weitere Kosten fünf SNI (Server Name Indication) und ein IP SSL Zertifikat hochladen und nutzen. Automatische Skalierung auf bis zu 10 virtuellen Instanzen und tägliche Backups runden das Angebot ab.

  • Basic Tier auch für Compute Instanzen

Auch im Bereich Cloud-Dienste wird neben der Standardversion eine Basicversion angekündigt, die um 26,67% günstiger sein wird, jedoch kein Loadbalancing und automatische Skalierung unterstützt. Diese Instanzen sind vor allem als Testserver und während der Entwicklung geeignet.

  • Azure Active Directory Premium

Azure Active Directory Premium ist ab sofort generell verfügbar. Alle Kunden, die diesen Service in der Preview genutzt haben, können sich bis zum 1. Juli 2014 entscheiden, ob sie den Dienst bezahlen wollen oder danach das normale Azure Active Directory kostenlos nutzen wollen. Die Premiumversion unterstützt Synchronisation mit dem lokalen Active Directory, Single Sign On und Multifactor Authentifizierung.

  • Scheduler-Dienst verfügbar

Auch ein Scheduler-Dienst ist ab sofort verfügbar. Mit dem Scheduler können Sie Jobs in der Cloud erstellen, die zuverlässig Dienste inner- und ausserhalb der Cloud aufrufen können.

  • Autoskalierung

Applikationen können jetzt so konfiguriert werden, dass sie automatisch auf Basis der aktuellen Nutzung hoch oder auch runterskalieren. Autoskalierung ist möglich für Virtuelle Maschinen, Cloud-Dienste, Web Sites und Mobile Services.

  • weitere verfügbare Dienste

Des Weiteren wurden folgende Dienste generell verfügbar gestellt:

- Visual Studio Online

- Virtual Network Dynamic Routing Gateway und Point-to-Site VPN

- Azure Automation

- Azure Backup 

Evolution statt Revolution

Nachdem der Staub sich rund um die alljährlichen Ankündigungsreigen der Redmonder Software-Schmiede zu legen beginnt, ist es Zeit ein erstes Fazit zu ziehen. Was bringt uns die Zukunft bzw. was stellt sich Microsoft darunter vor?

Wenn man es ganz nüchtern betrachtet, bleibt eigentlich nur ein Windows Update für 8.1, ein Phone Update von 8 auf 8.1 und eine Reihe von Detail-Änderungen übrig. Daneben noch die faktisch folgenlose Veröffentlichung des Quellcodes einiger neuer Bibliotheken, heute Open Source genannt.

Wer eine Dekade zurückblickt, wird sich erinnern, dass die TechEd Developer sich mit aktuellen und ganz nahen Technologien beschäftigte und die PDC, die Vorgängerin der BUILD, mit den über die nächsten ca. 18 Monaten kommenden. Die BUILD 2014 präsentierte am 2.April ein kleines Windows Update, das am 8.April öffentlich verfügbar sein wird. So ist die Welt heute. Gerade mal eine Woche Zukunft. Roadmaps konnte man in den Slides keine entdecken.

Vor rund fünf Jahren war Windows Mobile 6.5 angesagt. Mit einem kolportierten Marktanteil von ca. 19%. Allerdings war Apple unaufhaltsam auf dem Vormarsch und so entschlossen sich die Redmonder zu einem radikalen Schnitt: es den Jungs aus Cupertino gleich zu tun.

Ich erinnere mich noch gut an ein frühes Meeting bei Microsoft. Ein Kreis erlauchter externer Experten, eine Handvoll Microsofties und meine Wenigkeit. Das Produkt, das da vorgestellt wurde, hatte alle Nachteile von Apple gewonnen und die Vorteile von Microsoft verloren. Ich werde heute noch auf meine unbarmherzige Kritik angesprochen. Und ich habe mit jedem Strich und Punkt Recht behalten. Meine damaligen Vorschläge werden jetzt umgesetzt. Der Marktanteil dümpelt heute noch unterhalb des damaligen Windows Mobile rum. Dennoch hatte auch Microsoft Recht. Es musste ein harter Kurswechsel her. Windows Mobile hatte kein Marktpotential für die Zukunft.

Rund zweieinhalb Jahre später, auf der ersten BUILD, wurde dann Windows 8 angekündigt. Ich war persönlich in Anaheim dabei und habe mich von der Begeisterung anstecken lassen. In einem persönlichen Dialog mit einem Produktmanager wurde die Problematik des Rollouts angesprochen. Er war überzeugt, dass der Appstore-Zwang von den Kunden angenommen wird. Ich nicht. Ein anderer wichtiger Produktmanager war überzeugt, dass bald ohnehin nur mehr touchfähige Devices ausgeliefert werden. Ein folgenschwerer Irrtum, wie sich aus heutiger Sicht zeigt. Der wesentlichste Fehler ist uns und damit meine ich Microsoft und mich, in der  Einschätzung der Verbreitung von Windows 8 und Devices unterlaufen. Meine persönliche Prognose war: 100 Millionen Touch Devices bis 31.Dezember des Erscheinungsjahrs, sonst wird Balmer seinen Hut nehmen müssen. Es waren bei weitem nicht so viele und Balmer ist Geschichte.

Ganz wesentlich ist aber die falsche Consumer-Strategie. Consumerization von IT ist zwar Tatsache, wie auch bei HTML5, aber deren Folgen sind völlig falsch eingeschätzt worden. Die Unternehmen haben keine APPS erstellt. Punkt.

Windows 8 hatte nie ein Qualitätsproblem. Es war schön, modern, einfach zu bedienen. Auf Tablets für den Neueinsteiger völlig intuitiv. Eine Sensation ohne Startbutton. Es sind die über 1 Milliarde Microsoft-Benutzer, die nicht mitspielen. Folgerichtig kann man in den Blogs und Tweets im Tenor lesen, was es eh jeder schon die ganze Zeit sagt: Hört den Kunden zu. Steve Jobs und Steven Sinofsky waren anderer Meinung: Innovation kommt nicht aus Marktforschung.

Ganz anders die Keynotes der BUILD 2014. Wir haben zugehört, hier habt Ihr das Resultat. Auch ein Startmenü gibt es dazu. Und wir nehmen euch euer geliebtes .NET und XAML nicht weg. JavaScript erwähnen wir gar nicht, weil ihr es hasst.

Die Teilnehmer sind begeistert. Twitter quillt über von positiven Feeds: Beste BUILD ever. Vor allem die gemeinsame Codebasis für Phone und Windows wird gelobt. Auch die vereinfachte Sideloading Policy, die faktisch den Store aushebelt, stößt auf Begeisterung.

Die Realität bildet das aber nur zum Teil ab. Weite Teile des Developer Eco Systems beschäftigen sich heute mit HTML5 als Frontend-Technologie. Ich halte diese zwar für grottig, aber vorhanden. Da das Problem mit dem Standard und Browsern systemimmanent ist, erwarte ich keine relevante Besserung. In Angesicht dessen bin ich immer wieder erstaunt, welche großartigen Ergebnisse trotz widriger Umstände erzielt werden.

Diese Community wird auch mit dem Honig Open Source und Nuget kaum kleben bleiben. Das sind die Leute, die nicht auf die BUILD gehen.

Aus dem Applaus und den Besucherzahlen der aufgezeichneten Sessions lassen sich ein paar Trends erkennen. C# und .NET sind weiter top angesagt. Multiplattform-Entwicklung auf dem .NET-Technologiestack wird eindeutig gewünscht und von XAMARIN bedient. Azure ist trotz Scott Guthrie bei weitem nicht das führende Thema.

Schon im Vorfeld hat Microsoft eine Art Office für die Apple-Plattform gelauncht. Ein Eingeständnis der schwindenden Bedeutung von Windows. Dies wird auch mit einem Startmenü nicht besser werden. Die Fokussierung auf das angestammte Publikum, die Vereinheitlichung der Plattform Xbox, Windows und mobile werden helfen, nicht noch weitere Kunden zu vergraulen.

Die nächste Welle wird allerdings woanders an den IT-Strand laufen: das Internet of Things, oft ohne UI, aber damit mit hohem Bedarf an Service-Kommunikation. Davon sah man im BUILD-Programm recht wenig.

Hannes Preishuber besucht seit rund 15 Jahren Microsoft-Konferenzen. Er war Teilnehmer der legendären Hailstorm PDC, deren Visionen und Produkte nie Realität wurden. Auch Projekt Oslo und die Programmiersprache M kennt heute keiner mehr. Obwohl Clippy das selbe Schicksal erleiden musste, war er kein PDC Announcement. 2003 diskutierte er auf der PDC in Los Angeles mit dem noch unbekannten Miguel de Icaza über .net und dessen von Microsoft ungewünschte Implementierung als Mono. Die BUILD Konferenz 2014 besuchte er nur virtuell. Trotz entsprechender Gerüchte nicht wegen des Essens.

Weitere Preissenkungen bei Microsoft Azure

Zum 1. Mai wird Microsoft die Preise für Block-BLOB-Speicher deutlich senken. Für lokal redundanten Speicher wird der Preisnachlass 65 Prozent sein, während der Preisnachlass für geographisch redundanten Speicher 44 Prozent beträgt.

Auch die Preise für Virtuelle Maschinen der Kategorie A5 und A7 werden zu diesem Zeitpunkt gesenkt. Linux Virtuelle Maschinen werden zu diesem Zeitpunkt um 35 Prozent billiger werden, während der Preis für die Windows Virtuellen Maschinen um 27 Prozent gesenkt wird.

Ab dem heutigen Tag wird es für Compute bereits eine neue Basic-Konfiguration geben, die der Standardinstanz sehr ähnlich ist, jedoch um 26,67 Prozent günstiger ist.

Pünktlich zur Build-Konferenz unterstreicht Microsoft damit das Streben immer mehr auf Cloudtechnologien zu setzen. Auch die Bereitschaft günstige Preise für ihre Kunden anzubieten ist durch diese und auch bereits in der Vergangenheit getätigte Preisreduzierungen sichtbar. Im Vergleich zu Amazon Web Services bietet Microsoft für die oben genannten Produkte mindestens den gleichen aber häufig auch einen günstigeren Preis an.

Mehr Infos dazu erhalten Sie unter http://blogs.msdn.com/b/windowsazure/archive/2014/03/30/microsoft-azure-innovation-quality-and-price.aspx.

 

 

Webseiten mit Bild-Slider

Immer mehr (so beginnt jeder gute Artikel in einer Frauenzeitschrift) Webseiten beinhalten einen Image Slider. Und immer mehr gewinne ich den Eindruck, dass der aktuelle HTML5, CSS, JS-Weg das wiederholt was zu Visual Basic 4-Zeiten passiert ist: Komplexität in OCXen Widgets zu verstecken. Mein neuestes Fundstück ist in Bootstrap das Carousel.

Das Carousel Widget aus Bootstrap 3 kann ein oder mehrere Bilder durch Sliding-Effekte wechselnd darstellen. Da man mit HTML arbeitet, muss es kein Bild sein, sondern kann alles sein, was in ein DIV so passt (Item). Zur Steuerung bzw. zum direkten Sprung kann der Benutzer den Indikator verwenden. Dieser kann direkt wie ein Pager benutzt werden oder auch mit einer Next-Logik versehen werden. Dies macht Sinn, wenn es wesentlich mehr Bilder sind. Außerdem befindet sich rechts und links ein Carousel-Control. Dazu kommt eine Überschrift, die auch außerhalb des Bild-Bereiches platziert werden kann.

image

Das Ganze als HTML. Mit den Attributen wird Intervall in Millisekunden, und das Verhalten am Ende der Bild-Liste gesteuert.

Die Indikator-Elemente werden als direkte Navigationselemente verwendet.

   1:      <div class="carousel slide" id="carousel-example-generic"
data-ride="carousel" data-interval="3000" wrap="true">
   2:         
   3:          <ol class="carousel-indicators">
   4:              <li data-slide-to="0" 
data-target="#carousel-example-generic"></li>
   5:              <li class="active" data-slide-to="1" 
data-target="#carousel-example-generic"></li>
   6:              <li data-slide-to="2" d
ata-target
="#carousel-example-generic"></li>
   7:          </ol>
   8:   
   9:          <div class="carousel-inner">
  10:              <div class="item">
  11:                  <img alt="PX" src="img/px.png">
  12:                  <div class="carousel-caption">
  13:                      <h3>Vespa PX 200E</h3>
  14:                      <p>Modernere Bauart</p>
  15:                  </div>
  16:              </div>
  17:              <div class="item active">
  18:               <a href="http://www.ppedv.de">
  19:                  <img alt="LX" src="img/lx.png"></a>
  20:                  <div class="carousel-caption">
  21:                      <h3>Vespa LX</h3>
  22:                      <p>jüngere 50er und 125er</p>
  23:                  </div>
  24:              </div>
  25:              <div class="item">
  26:   
  27:                  <img alt="GS" src="img/gs.png">
  28:                  <div class="carousel-caption">
  29:                      <h3>Vespa GS 150</h3>
  30:                      <p>alter Klassiker</p>
  31:                  </div>
  32:              </div>
  33:          </div>
  34:   
  35:         
  36:          <a class="left carousel-control" 
href="#carousel-example-generic" data-slide="prev">
  37:              <span class="glyphicon glyphicon-chevron-left"></span>
  38:          </a>
  39:          <a class="right carousel-control" 
href="#carousel-example-generic" data-slide="next">
  40:              <span class="glyphicon glyphicon-chevron-right"></span>
  41:          </a>
  42:      </div>

Natürlich lässt sich per CSS das visuelle Erscheinungsbild noch verändern. Da die Styles natürlich in bootstrap.css vordefiniert sind, muss die Definition nachgelagert erfolgen.

   1:    <style>
   2:          .carousel-caption {
   3:              position:absolute;
   4:              top:-10px;
   5:              left:auto;
   6:              right:20px;
   7:              bottom:0;
   8:              height: auto;
   9:              z-index: 30;
  10:              background: none;
  11:          }
  12:   
  13:          .carousel-indicators {
  14:              top: 20px;
  15:          }
  16:   
  17:              .carousel-indicators li {
  18:                  width: 12px;
  19:                  height: 12px;
  20:                  margin: 0 3px;
  21:                  background: #555;
  22:                  opacity: 0.3;
  23:                  border: none;
  24:                  transition: all 0.3s;
  25:              }
  26:   
  27:                  .carousel-indicators li.active {
  28:                      width: 12px;
  29:                      height: 12px;
  30:                      margin: 0 3px;
  31:                      opacity: 1;
  32:                      background-color: #555;
  33:                  }
  34:      </style>

Warum erinnert mich das an die VB-Zeiten? Damals sprangen unzählige Control-Hersteller in die Unzulänglichkeiten von Microsoft ein. Schon mit Releasewechsel waren die Controls nicht mehr funktionsfähig. Die allermeisten Hersteller existierten nur sehr kurz. Ein Control in einem Projekt durch ein anderes zu ersetzen überstieg den Aufwand der ursprünglichen Implementierung. 

Was ist der Unterschied, VB 6-Anwendungen laufen auch noch nach 10 Jahren. Das wird keiner mit einer Bootstrap, JQuery und sonst was basierten Seite auch nur 2 Jahre schaffen.

Kurs: SQL Server 2014 Umstieg, SQL Server 2014 Neuerungen, SQL Server Schulung SQL Server Training, SQL Server Seminar, SQL Server Kurs,  SQL Server Schulung, Weiterbildung, Fortbildung, Datenbankadministration

Month List