Erste Schritte: Windows Phone 8 Apps

Der Einstieg in die Windows Phone App-Programmierung fiel mir sehr viel einfacher als in die Windows Store App-Programmierung, was aber sicherlich an einer gewissen Ähnlichkeit liegt. Prinzipiell geht es auch hier um Seiten, zwischen denen navigiert wird. Interessant fand ich den relativ ähnlichen Ansatz zur Settings-Speicherung – beide arbeiten mit Dictionaries, die automatisch gespeichert werden.

Windows Store App

Object obj;
ApplicationDataContainer roamingSettings = ApplicationData.Current.RoamingSettings;
roamingSettings.Values.TryGetValue("Key", out obj);
...
roamingSettings.Values["Key"] = obj;

Windows Phone App

Object obj;
IsolatedStorageSettings appSettings = IsolatedStorageSettings.ApplicationSettings;
appSettings.TryGetValue("Key", out obj);
...
appSettings.Values["Key"] = obj;

Eine Batch-Datei als Dienst ausführen?

Ohne Hilfsmittel geht das meines Wissens nicht. Aber warum will man das überhaupt? In diesem Fall möchte ich gerne den Minecraft-Server „Bukkit“ als Dienst auf einem anderen Rechner ausführen, um ihn dort automatisch mit dem System starten zu lassen und mit net start/stop einfach steuern zu können.

Im Netz werden einige Tools als „Service-Wrapper“ vorgeschlagen, aber da ich selbst mal swrap programmiert habe, nutze ich dieses Tool einfach mal (fürs erste). Leider fiel mir dabei auch gleich ein Bug auf, der über die Jahre nicht entdeckt wurde: Wenn die Registry den Basisschlüssel der Anwendung (unter HKEY_LOCAL_MACHINE\Software) nicht enthält, wird immer mit einem Initialisierungsfehler (SWERR_1) abgebrochen. Auf der anderen Seite ist es aber schön zu sehen, dass das Tool auch noch unter „Win8 64-bit“ out-of-the-box läuft.

Nach Ergänzung des Schlüssels „HKEY_LOCAL_MACHINE\Software\Wow6432Node\netShore\Services“ war der Rest einfach:

swrap /c "BUKKIT-Server" "cmd /c ""c:\bukkit server\run.bat"""

Dazu noch die „run.bat“ erweitern:

c:
cd "c:\bukkit server"
"c:\program files\java\jre6\bin\java.exe" ... -jar "c:\bukkit server\craftbukkit.jar" ...
pause

Und schon taucht „BUKKIT-Server“ im Dienstemanager auf und kann gestartet werden. Leider funktioniert hier das Beenden noch nicht, da „swrap“ den gestarteten Prozess (hier: cmd) beendet und nicht den durch die BAT-Datei gestarteten Java-Prozess. Für mein konkretes Problem werde ich über eine gezielte Implementierung eines Dienstes nachdenken. Das Grund-„Problem“ (Batch-Datei als Dienst ausführen) ist aber prinzipiell lösbar.

ASP.NET 4.5 auf IIS 7.5 mit SQL Server Express 2012 einrichten

Hier mein Vorgehen nach langem und frustrierendem Herumprobieren:

IIS vorbereiten

  1. Verzeichnis für App anlegen und App hineinkopieren
  2. App im IIS-Manager zum Beispiel als neue Site hinzufügen (mit eigenem AppPool)
  3. Anonyme Authentifizierung auf „AppPool-Identity“ festlegen
  4. AppPool-Grundeinstellungen auf .NET 4.0 (integriert) festlegen
  5. Erweiterte AppPool-Einstellungen auf „Benutzerprofil laden = True“ und „Identität = AppPool-Identity“ festlegen
  6. In der Kommandozeile folgende Befehle ausführen:
    icacls <app-path> /grant "IIS APPPOOL\<apppool-name>":(OI)(CI)(RX)
    icacls <app-path>\App_Data /grant "IIS APPPOOL\<apppool-name>":(OI)(CI)(F)

SQL Server vorbereiten

  1. Mit den folgenden Befehlen den SQL Server Express aktualisieren:
    CREATE LOGIN [IIS APPPOOL\<apppool-name>] FROM WINDOWS
    GRANT CREATE DATABASE TO [IIS APPPOOL\<apppool-name>]

Der passende Connection String

Beim Connection String kann es dann wieder etwas hakelig werden, aber der folgende Eintrag funktioniert ganz gut:
Data Source=.\SQLEXPRESS; Initial Catalog=<db-name>; Integrated Security=SSPI; AttachDBFilename=|DataDirectory|<db-name>.mdf; User Instance=true

IIS 7 + SQL Server Express 2008

Leider, leider scheint das bei dieser Kombo nicht so „einfach“ zu sein, denn mit „User Instance=true“ kommt es zu Impersonation-Fehlern und ohne fehlen die Rechte im App_Data-Verzeichnis…

Letzteres lässt sich aber korrigieren, indem man dem User „<host-name>\SQLServerMSSQLUser$<host-name>$SQLEXPRESS“ Vollzugriff auf App_Data gewährt – dann kann „User Instance“ komplett weggelassen werden.

WWW-Authenticate (Basic) in ASP.NET

Mit nur wenigen Zeilen lässt sich die Basic Authentication (http://de.wikipedia.org/wiki/HTTP-Authentifizierung) in C# umsetzen:

const String KEY = "BasicAuthKey";
const String Basic = "Basic ";

if (Session.Contents[KEY] == null)
{
    Response.BufferOutput = true;

    String auth = Request.Headers["Authorization"] ?? String.Empty;
    auth = System.Text.Encoding.UTF8.GetString(
        Convert.FromBase64String(auth.StartsWith(Basic)
        ? auth.Substring(Basic.Length) : String.Empty));
    if (auth == "username:password")
    {
        Session.Contents.Add(KEY, new Object());
    }
    else
    {
        Response.Clear();
        Response.Headers.Set(
            "WWW-Authenticate",
            "Basic realm=\"RegisteredUsers@domain.tld\"");
        Response.SetStatus(HttpStatusCode.Unauthorized);
        Response.End();
    }
}

SQL Server Express (localdb) per OleDB ansprechen

Der Zugriff auf die SQL Server Express 2012 Instanz „(localdb)\v11.0“ ist leider nicht über den OleDB-Provider „SQLOLEDB“ möglich. Stattdessen muss „SQLNCLI11“ (der Native Client) verwendet werden. Mit „Trusted_Connection=yes“ kann dann noch die Windows-Authentifizierung aktiviert werden. Der vollständige ConnectionString könnte dann so aussehen:

Provider=SQLNCLI11;
Data Source=(localdb)\v11.0;
Initial Catalog=<DB_NAME>;
Integrated Security=SSPI;
Trusted_Connection=yes;

SQL Server-Datenbank lässt sich nicht wiederherstellen

Das Wiederherstellen (RESTORE) einer auf einem SQL-Server (Standard 2008) gesicherten Datenbank auf einem anderen SQL-Server (Express 2012 – localdb\v11.0) führte heute bei mir zu Fehlermeldungen und Serverabstürzen. Ob neue Datenbank automatisch anlegen lassen oder in vorhandene importieren, machte keinen Unterschied – die MDF- und LDF-Dateien waren vorhanden und auch mit Daten gefüllt, aber die Datenbank ließ sich nicht laden. Leider wusste kein Forum von einer echten Lösung zu berichten, stattdessen wurde mit esoterischen Skripten aufgewartet, die rein gar nichts brachten. Ziemlich frustriert entschied ich mich dann dazu, den letzten Import per „Detach“ im Management Studio aus dem Server zu lösen und dann wieder per „Attach“ neu hinzuzufügen et voíla: die Datenbank war online!

StartSSL – kostenlose SSL-Zertifikate

SSL-Zertifikate müssen nichts kosten! StartSSL bietet einfache SSL-Zertifikate kostenlos an und das Verfahren ist einfach und schnell. Zum Nachweis, dass man eine Domain besitzt, erhält man einen Code wahlweise an hostmaster, postmaster oder webmaster@eigenedomain.tld zugesandt und erst nach Eingabe des Codes auf der StartSSL-Homepage geht es weiter.

Flexible HTML5 Frontends mit Foundation 3

Responsives Design, ein anpassungsfähiges Layout, dessen Aufbau sich nach den Gegebenheiten des jeweiligen Endgerätes richtet und so Anordnung und Darstellung der Elemente entsprechend verändert, ist bei der Vielzahl der möglichen Geräte (PC, Notebook, Tablet, Smartphone, etc.), die eine Webseite heute nutzen, ein immer interessanter werdendes Thema. Statt gezielt einzelne Geräte zu adressieren und so ggf. mehrere Versionen einer Seite vorzuhalten, ermöglichen entsprechende Frameworks eine Version, die auf Basis der Möglichkeiten von HTML5 und CSS3 (und Javascript) an die Erfordernisse der jeweiligen Situation angepasst wird. Foundation 3 ist ein solches Framework und soll im Folgenden anhand eines kleinen Beispiels kurz vorgestellt werden. Eine umfangreiche Einführung findet sich in der Dokumentation auf der Homepage des Herstellers.

Layout-Grundlagen

Die Grundlage des Foundation 3-Layouts ist das „Grid“, ein Gitter aus Zeilen und Spalten, das auch Verschachtelungen unterstützt. Zeilen enthalten dabei Spalten, von denen immer 12 ein Ganzes bilden. Die Breite einer Spalte ist relativ zum verfügbaren Platz und letztendlich in Prozent definiert. Über CSS-Klassen wird angegeben, wie viele Spalten ein bestimmter Inhalt breit sein soll (1 bis 12 Spalten, 1/12 bis 12/12 der verfügbaren Breite, also 8,3333% bis 100%).

Ein einfaches, dreispaltiges Layout

Ein einfaches, dreispaltiges Layout ist schnell realisiert:

<div class="row">
    <div class="two columns">
        <h3>Linke Spalte</h3>
        <p>z.B. Navigation</p>
    </div>
    <div class="eight columns">
        <h1>Mittlere Spalte</h1>
        <p>für Inhalt</p>
    </div>
    <div class="two columns">
        <h3>Rechte Spalte</h3>
        <p>z.B. für weiterführende Informationen</p>
    </div>
</div>

Das Ergebnis

Hier mit markierter Zeile:

und hier mit markierten Spalten:

und bei reduzierter Breite offenbart sich das responsive Layout:

Erweitertes Layout

Unter http://demo.jochenlinnemann.de/foundation/ habe ich ein erweitertes Layout hochgeladen. Hier kommen die Top-Bar und die Breadcrumbs von Foundation 3 zum Einsatz. Wie im obigen Beispiel zu sehen ist, ist eine Zeile auf 940px Breite vorkonfiguriert. Im erweiterten Layout habe ich durch eine eigene Klasse die Spaltenbreite auf 100% des Dokumentes festgelegt. Standardmäßig wechselt das Layout unterhalb einer Breite von 768px in den „Mobilgerätemodus“. Dies habe ich auch im erweiterten Layout beibehalten. Lediglich für die Top-Bar habe ich den Umbruch des Layouts auf 340px heruntergesetzt, da bis dahin genug Platz für alle Buttons bleibt.

Zwei Zeilen, zwei Spalten und Schachtelungen

<header class="row full-width">
    <div class="twelve columns">
    </div>
</header>

<div class="row full-width">
    <div class="eight columns">
        <div class="row">
            <div class="four columns">
            </div>
            <div class="four columns">
            </div>
            <div class="four columns">
            </div>
        </div>
    </div>
    <div class="four columns">
    </div>
</div>

Das Ergebnis

Bei höherer Breite:

Und bei reduzierter Breite:

Ausblick

Zukünftige Entwicklungen halten noch ganz andere Möglichkeiten bereit. Ein Ausblick wird in diesem Artikel gegeben: http://www.webkrauts.de/artikel/2012/css3-flexbox-abloesung-fuer-float-layouts

WebMatrix, Razor und IIS7-Deployment

WebMatrix ist ein großartiges Tool, um Webseiten schnell zu erstellen und zu bearbeiten – egal ob in PHP, ASP, Razor, etc. Durch die vielen Templates fällt der Einstieg besonders leicht. Und der eingebaute IIS Express ermöglicht sofortiges Testen. Leider kam es beim Deployment meines ersten WebMatrix-Razor-Projektes zu einem Problem: die erweiterungslosen URLs („/Default“ statt „/Default.cshtml“), die noch im IIS Express funktionierten, führten im IIS7 zu 403- und 404-Fehlern. Nach ein wenig Suchen im Netz konnte ich aber eine einfache Lösung finden; einfach die Web.config um den folgenden Eintrag erweitern:

<system.webServer>
    <modules runAllManagedModulesForAllRequests="true"/>
</system.webServer>

Weitere Problemlösungen finden sich unter http://www.iis.net/learn/develop/using-webmatrix/webmatrix-beta-2-release-readme

PowerShell-WGET

Bislang habe ich mir auf der Kommandozeile mit den UnxUtils das Leben erleichtert, doch inzwischen gewinnt die PowerShell mehr und mehr an Bedeutung für mich. Ein hin und wieder benötigtes Kommando ist „wget“ (vor allem, wenn man auf einem Server ungern die IE-Sicherheitseinstellungen runterschrauben will) – in der PowerShell lässt es sich in seiner einfachsten Form (dem Runterladen einer Datei) leicht nachbilden:

$wget = new-object System.Net.WebClient
$wget.DownloadFile("http://jochenlinnemann.de/favicon.ico", ".\jl-favicon.ico")