Johannes Renatus: Eine AngularJs 1.x SPA mit TypeScript 1.4 erstellen

In meinem letzten Eintrag habe ich bereits einen kurzen Einblick in die Verwendung von TypeScript und Visual Studio gegeben. Da ich in einem Großteil meiner Projekte AngularJs verwende hat mich ebenfalls interessiert, wie man mit TypeScript 1.4 und AngularJs 1.x eine Anwendung schreibt und in der Anwendung z.B. “alte” JavaScript Direktiven verwendet. Ich verwende in […]

Norbert Eder: #fotomontag #21

Jeden Montag ein Foto. Der #fotomontag.

Einmal im Monat gibt es einen Fotoausflug vom Knipserklub. So auch wieder gestern, Motto: 50mm. Im ersten Teil des “Ausfluges” gingen wir durch die Stadt und schossen was uns vor die Linse kam. Eigentlich als Side-Action gedacht, enstand dieses Foto:

Watching Photographer

Watching Photographer

Bildinformationen:
50mm
ISO 320
f/4
1/320
Canon EOS 6D

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

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

Marco Scheel: Links for 2015-05-22 [del.icio.us]

Holger Sirtl: Azure News on Friday (KW22/15)

Auch diese Woche gab’s wieder einige Nachrichten zu Azure AD, Virtual Machines und weiteren Azure Services. Hier sind nähere Infos dazu…

Datum Nachricht
21.05. Azure Friday: Azure PowerShell 101 - Managing Virtual Machines
In dieser Folge von Azure Friday geht’s um die Möglichkeiten, Virtuelle Maschinen von der PowerShell-Konsole aus zu erstellen und zu verwalten.
20.05. Blogpost: Azure AD zusammen mit mit privaten Windows 10 Geräten
Dieser Artikel beschreibt, wie Windows 10 mit privaten und geschäftlichen Accounts, die in Azure AD verwaltet sind, genutzt werden kann.
20.05. Neuer MVA-Kurs: Microsoft Azure – Basic Services
In diesem Kurs der Microsoft Virtual Academy geht es um die Grundlagen zu Azure Compute Services, Azure Data Services und Azure Networking.
19.05. Blogpost: Big Data braucht eine Big Cloud
Brian Mitchell gibt in diesem Artikel Hinweise für die Implementierung von Big Data Lösungen. Dazu gehören Storage-Strategien, Partitionierung, Fehlertoleranz bis hin zu einer skalierbaren Gesamtarchitektur.

Norbert Eder: Street-Fotografie – Eine Leidenschaft

Meine Leser haben ja schon mitbekommen, dass das Thema Fotografie in der letzten Zeit sehr stark im Vordergrund steht. Wie wohl alle anderen Interessierten auch, durchlebe ich so eine Phase nach der anderen. Das fängt mit Landschaft an, geht dann hin zur Architektur und wandert dann wohl weiter zu einer anderen Richtung. Mich hat es mit der Street-Fotografie erwischt.

Graz Hauptbahnhof

Graz Hauptbahnhof

Besonders angetan bin ich auch von der Schwarz-Weiß-Fotografie, was sich ja auch hinsichtlich Street ganz gut trifft. Jetzt ist es aber so, dass es gar nicht so einfach ist, nahe an Menschen ran zu gehen. Da habe auch ich noch einiges an Überwindung zu leisten, aber es wird besser. Viele beginnen hier mit größeren Brennweiten und tasten sich mit der Zeit näher an das Objekt heran. Da ich mit 35mm (Crop 1,5 – entspricht in etwa 50mm Kleinbild) angefangen habe, bin ich von Grund aus recht nahe dran. Damit geht es mir ganz gut, auch wenn ich manches Mal dann doch lieber etwas mehr Abstand hätte.

Graz - Annenpassage - Rolltreppe

Graz – Annenpassage – Rolltreppe

Wichtig ist – und daran versuche ich mich zu halten – viele Fotos zu schießen, d.h. regelmäßig zu “trainieren”. Aus diesem Grund habe ich meine Kamera fast immer mit dabei, auch wenn ich damit Freunde, Familie usw. durchaus einmal nerve. Den einen oder anderen Treffer konnte ich so aber schon landen. Durch das Training und eine entsprechende Nachbearbeitung wird auch am eigenen Stil gearbeitet. Natürlich dauert das seine Zeit, dennoch merke ich, dass ich immer wieder auf ein ähnliches Setting komme.

Wenn auch du dich für Street-Fotografie interessierst, dann kann ich dir die E-Books von Thomas Leuthard ans Herz legen. Auch sein Kurs Street Fotografie: Erfolgreich auf der Straße fotografieren auf Udemy ist sehr empfehlenswert. Ich hatte das Glück, diesen Kurs über einen Promo-Code recht günstig zu bekommen. Im Grunde helfen aber auch schon die E-Books ganz gut weiter.

Generell kann ich empfehlen, vielen andere Street Fotografen zu folgen, deren Tutorials auf Youtube anzusehen und selbst viel zu probieren. In kurzer Zeit können wirklich gute Fortschritte gemacht werden und Tipps helfen ungemein weiter.

In diesem Sinne: Bist du mal in Graz und möchtest mit der Kamera durch die Strassen ziehen, dann melde dich, vielleicht geht sich eine Runde aus. Gut Licht.

The post Street-Fotografie – Eine Leidenschaft appeared first on Norbert Eder.

Jürgen Gutsch: TagHelper in ASP.NET 5

Hoch gelobt und viel beschrieben sind die neuen TagHelper, die mit ASP.NET 5 eingeführt werden. Auch einige kritische Stimmen gab es hin und wieder zu lesen. Grund genug die Dinger selber mal auszuprobieren.

Im Grunde ermöglichen TagHelper das Erstellen eigene Tags in den Razor-Views die Serverseitig interpretiert werden. Analog zu CustomControls im klassischen ASP.NET, allerdings weit weniger komplex, vielleicht sogar eher vergleichbar mit einfachen PartialViews, nur das C# statt Razor genutzt wird.

In der Razor-View werden die TagHelper wie ganz normale Tags dargestellt. TagHelper definieren allerdings nicht nur neue Tags, sondern erweitern auch vorhandene Tags. Als Beispiel sei der AnchorTagHelper genannt, der folgenden HtmlHelper ersetzt:

@Html.ActionLink(“About me”, “About”, “Home”)

Die neue Schreibweise in Form eines TagHelpers:

<a asp-controller=”Home” asp-action=”About”>About me</a>

Das Ergebnis ist in beiden Fällen:

<a href=”/Home/About”>About me</a>

TagHelper sind einfache Klassen die von der Klasse TagHelper ableiten und die Methoden Process, bzw. ProcessAsync überschreiben. dort passiert die Konfiguration des gerenderten Outputs. Das interessante hierbei ist, das auch hier wird mit Konventionen gearbeitet wird:

  • Hat der Klassenname das Postfix “TagHelper” wird es als solches erkannt. Der Teil vor dem Postfix wird als Tag-Name erkannt: “EnvironmentTagHelper” steht für den Tag <environment />. “MyOctoAwesomeTagHelper” wird zu <my-octo-awesome />
  • Öffentliche Properties werden als Attribute erkannt und enthalten automatisch die Werte die in der View gesetzt werden.
  • Tagnamen können mit dem Attribut TargetElementAttribute explizit gesetzt werden, wenn die Namenskonvention nicht passen sollte
  • Attribut-Namen können mit dem HtmlAttributeNameAttribute gesetzt werden, wenn die Namenskonvention nicht passen sollte.
  • Mit dem Attribut TargetElementAttribute  kann über die Eigenschaft Attributes zusätzlich festgelegt werden, welche Attribute in der View auf jeden fall gesetzt werden müssen, damit der Tag mit dem passenden TagHelper verarbeitet wird.

Mein etwas sinnfreies Beispiel sieht wie folgt aus:

[TargetElement("hi", Attributes = "first-name,last-name")]
public class HelloTagHelper : TagHelper
{
    [HtmlAttributeName("first-name")]
    public string Name { get; set; }

    public string LastName { get; set; }
       
    public override void Process(TagHelperContext context, TagHelperOutput output)
    {
        output.TagName = "p";
        output.Attributes.Add("id", context.UniqueId);
        var content = string.Format("Hello {0} {1}, Time is now: {2}",
            Name, LastName, DateTime.Now.ToString("HH:mm"));
        output.Content.SetContent(content);
    }
}

Die Nutzung des TagHelpers in der View:

<hi first-name="Neuer" last-name="Tester"> </hi>

Das gerenderte Ergebnis im Browser:

<p id="f9af1a8136df44f493dea1e46d395226">Hello Neuer Tester, Time is now: 07:45</p>

Interessant ist hier, dass ich diesen Tag nicht selbst-schließend nutzen darf, da sonst der Content nicht gesetzt wird. Leider wird keine entsprechende Fehlermeldung beim Zugriff auf die Eigenschaft “Content” ausgegeben. Der Tag “p” und das Attribut “id” werden allerdings richtig ausgegeben. Nur der Content fehlt.

Konsequent ist das ja: Wird kein Content in der View definiert, so wird auch keiner Ausgegeben. Das wiederum heißt, ich müsste auf den vorhandenen Content auch zugreifen können. Schauen wir uns das mal genauer an. Ich möchte den Tag nun so umbauen, dass er wie folgt aussieht:

<hi>Neuer Tester</hi>

Die Ausgabe soll allerdings die gleiche bleiben.

Über das Argument output lässt sich ein PreContent und ein PostContent setzen. Der fertige TagHelper sieht nun sogar noch etwas einfacher aus:

[TargetElement("hi")]
public class HelloTagHelper : TagHelper
{
    public override void Process(TagHelperContext context, TagHelperOutput output)
    {
        output.TagName = "p";
        output.Attributes.Add("id", context.UniqueId);

        output.PreContent.SetContent("Hallo ");
        output.PostContent.SetContent(string.Format(", Time is now: {0}"
                DateTime.Now.ToString("HH:mm")));
    }
}

Das Anwendungsfeld ist nun enorm. Wer mit Twitter Bootstrap arbeitet, kennt sicher die DIV-Konstrukte die man schreiben muss um Panels, collapsable Panels, Dialoge, etc. zu erstellen. Dabei geht die Übersicht in den Views vor lauter verschachtelter HTML-Elemente schnell mal verloren. Schöner wäre doch sicher so etwas:

<bootstrap-modal title="New modal window" size="medium">
    <p>My octo awesome window content</p>
</bootstrap-modal>

Der entsprechende TagHelper ist gar nicht mal so komplex:

public class BootstrapModalTagHelper : TagHelper
{
    public string Title { get; set; }

    public override void Process(TagHelperContext context, TagHelperOutput output)
    {
        output.TagName = "div";
        output.Attributes.Add("class", "modal fade");

        output.PreContent.SetContent(@"
<div class=""modal-dialog"">
    <div class=""modal-content"">
        <div class=""modal-header"">
            <button type=""button"" class=""close"" data-dismiss=""modal"" aria-label=""Close""><span aria-hidden=""true"">×</span></button>
            <h4 class=""modal-title"">"
+ Title + @"</h4>
        </div>
        <div class=""modal-body"">"
);


            output.PostContent.SetContent(@"
        </div>
        <div class=""modal-footer"">
            <button type=""button"" class=""btn btn-default"" data-dismiss=""modal"">Close</button>
        </div>
    </div>
</div>"
);
    }
}

Es bleibt allerdings jedes Mal abzuwägen, wie viel HTML-Code man in C# Klassen verstecken möchte, oder ob nicht doch besser eine PartialView angebracht ist. In Falle von Bootstrap sind das in der Regel immer die selben Strukturen und kann durchaus in einen TagHelper verpflanzt werden. Alternativ könnten die CSS Classen ebenfalls per Property gesetzt werden.

Wer zusätzlich den ViewContext etc. in seinen TagHelpern benötigt, kann sich diesen über Dependency Injection in bereitgestellte Properties injizieren lassen:

[Activate]
protected internal ViewContext Context { get; set; }

Somit kann einfach auf den ViewContext zugegriffen werden.

TagHelper sind also nicht nur leichtgewichtig und flexibel, sondern vor allem tatsächlich auch recht praktisch :)

Ralf Westphal: Rezension: Macht, was ihr liebt!

Schon wieder ist es passiert: Ich habe ein Buch des Autorenduos Förster & Kreuz gelesen. Beim letzten Mal ist es “Nur Tote bleiben liegen” gewesen. Das hatte ich dann zufällig und positiv in einem Blogartikel erwähnt - und schon wurde ich nun angesprochen, ob ich nicht auch das neueste Buch rezensieren möchte. Da der Verlag - diesmal nicht Campus, sondern Pantheon - mir sogar eine eBook-Version

Golo Roden: Gelesen: "Common Lisp: A Gentle Introduction to Symbolic Computation"

Der US-amerikanische Entwickler Eric S. Raymond hat einmal gesagt, Lisp sei selbst dann eine lernenswerte Sprache, wenn man sie niemals verwenden werde. Der Erkenntnisgewinn führe dazu, ein allgemein besserer Entwickler zu werden. Es liegt daher nahe, sich die Sprache näher anzusehen.

Dmitrij Doberstein: Angstrom >>> install GlassFish

I found a good instruction on java.net. But it is uncomplete.


Step 0 - 2 are OK. 

But now you have to add enviroment variable to end of /etc/profile or ~/.profile.

PATH=/opt/glassfish4/bin:$PATH


As next  you have to change permissions of asadmin.

>>>chmod 755 ~/glassfishv4/bin/asadmin


For information:
  • Default GlassFish Server’s port number: 8080
  • Default administration server’s port number: 4848
  • Administration user name: admin; password: none

And now you can forward with step 3...


The start-domain command has an optional domain name parameter, but the default is "domain1":
asadmin start-domain

The domains available are listed with the following command:

asadmin list-domains


Similarly to starting the domain, it can also be stopped with asadmin:

asadmin stop-domain

Jürgen Gutsch: Logging mit ASP.NET 5

Mit ASP.NET 5 kommt – unter anderem auch als Abhängigkeit von Microsoft.AspNet.StatiFiles und Microsoft.AspNet.Server.WebListener – ein einfaches Logging in Form des Packages Microsoft.Framework.Logging mit. Dieses wird im Hintergrund schon für das Dependency Injection registriert – welches ebenfalls in ASP.NET 5 enthalten ist.

Dependency Injection war auch in den alten ASP.NET Versionen schon enthalten, allerdings nicht wirklich einheitlich für ASP.NET MVC, Web API und SignalR. In ASP.NET 5 ist es für alle Techniken der gleiche Dependency Injection Container.

In diesem Beitrag möchte ich kurz beschreiben, wie dieser Logging-Mechanismus aufgebaut ist und wie man den vorhandenen Logger durch einen eigenen ersetzen kann

ILoggerFactory

Die Factory ist die Schaltzentrale. Über die Factory werden neue ILogger erstellt und weitere ILoggerProvider hinzugefügt. Überall dort wo manuell geloggt werden soll, oder die Factory konfiguriert werden soll, kann eine Instanz der ILoggerFactory per “Constructor Injection” geholt und genutzt werden. So passiert das auch in der Startup.cs in der Methode Configure(). Standardmäßig wird dort bei einem neuen ASP.NET Projekt der ConsoleLogger Provider aktiviert:

loggerfactory.AddConsole();

Für diesen Blogbeitrag habe ich mal den LogLevel auf LogLevel.Information gesetzt:

loggerfactory.AddConsole(LogLevel.Information);

ILogger

Der Logger entspricht wohl eher einer Kategorisierung oder einer Kanalisierung der Log-Einträge. Letztendlich laden alle Log-Einträge im selben Output. Mit der ILoggerFactorie wird ein neuer benannter Logger erstellt, dessen Meldungen dann im Output mit dem LoggerNamen versehen:

public class HomeController : Controller
{
    private readonly ILogger _logger;

    public HomeController(ILoggerFactory loggerFactory)
    {
        _logger = loggerFactory.CreateLogger("HomeController");
    }

    public IActionResult Index()
    {
        _logger.LogInformation("Entering Action 'index'");
    }
}

Dieser Code führt nun beim Start zu folgender Ausgabe:

image

Wie an sieht, sind schon einige weitere Logger durch vorhandene Komponenten aktiv, wie z. B. Microsoft.Net.Http.Server.WebListener. Unser Logger mit dem Namen “HomeController” arbeitet ebenfalls wie gewünscht

ILoggerProvider

Über den ILoggerProvider kann ein eigener Logger oder ein anderes Logging-Tool (z. B. NLog, Log4Net, etc.) bereitgestellt werden. Er ist dafür zuständig den eigenen ILogger zu instanziieren und zu liefern.

Beispiel für einen eigenen Logger:

Dieses Beispiel erstellt einen weiteren ConsoleLogger, der die Ausgabe noch ein bisschen Bunter mache, als der vorhandene. Etwas sinnfrei, allerdings geht es ums Prinzip, so kann der Logger beliebig ausgebaut werden, z. B. intern auf ein anderes Logging-Tool verweisen.

Zuerst benötigen wir einen Provider für unseren Logger, der den Minimum LogLevel entgegen nimmt und eine CreateLogger-Methode enthalten muss, in der die Instanz des Loggers erstellt wird:

internal class ColorfullLoggerProvider : ILoggerProvider
{
    private readonly LogLevel _logLevel;

    public ColorfullLoggerProvider()
    {
        _logLevel = LogLevel.Verbose;
    }

    public ColorfullLoggerProvider(LogLevel logLevel)
    {
        _logLevel = logLevel;
    }

    public ILogger CreateLogger(string name)
    {
        return new ColorfullLogger(name, _logLevel);
    }
}

Der eigentliche Logger kann dann wie folgt aussehen:

internal class ColorfullLogger : ILogger
{
     private readonly LogLevel _logLevel;
     private readonly string _name;

     public ColorfullLogger(string name, LogLevel logLevel)
     {
         _name = name;
         _logLevel = logLevel;
     }

    public IDisposable BeginScope(object state)
    {
         return null
    } 

    public bool IsEnabled(LogLevel logLevel)
    {
         return _logLevel == logLevel;
    }

    public void Log(LogLevel logLevel, int eventId, object state, Exception exception, Func<object, Exception, string> formatter)
    {
         var message = formatter(state, exception);
         var oldColor = Console.ForegroundColor;

         switch ((int)logLevel) 
         {
              case 5:
                   Console.ForegroundColor = ConsoleColor.Red;
                   break;
              case 4:
                   Console.ForegroundColor = ConsoleColor.Yellow; 
                   break;
              case 3:
                   Console.ForegroundColor = ConsoleColor.Green;
                   break;
              default:
                   Console.ForegroundColor = ConsoleColor.Gray;
                   break
        }

        Console.WriteLine("{0}: [{1}] {2}", logLevel.ToString(), _name, message);

        Console.ForegroundColor = oldColor;
    }
}

Um die Einbindung noch etwas bequemer zu machen, erstelle ich zwei ExtensionMethoden auf das ILoggerFactory Interface. Einmal mit der Möglichkeit einen Minimum-LogLevel anzugeben und einmal ohne:

internal static class ILoggerFactoryExtension
{
    public static ILoggerFactory AddColorfullLogger(this ILoggerFactory loggerFactory)
    {
        loggerFactory.AddProvider(new ColorfullLoggerProvider());
        return loggerFactory;
    }
    public static ILoggerFactory AddColorfullLogger(this ILoggerFactory loggerFactory, LogLevel logLevel)
    {
        loggerFactory.AddProvider(new ColorfullLoggerProvider(logLevel));
        return loggerFactory;
    }
}

So kann ich meinen Logger auf die gleiche Art einbinden wie den vorhandenen ConsoleLogger:

loggerfactory.AddColorfullLogger(LogLevel.Information);

Stelle ich den vorhandenen ConsoleLogger nun ab, indem ich den Aufruf in der Startup.cs entferne, erhalte ich nun eine farbenfrohe Ausgabe in der Konsole:

image

Fazit

Wie man sieht, ist ASP.NET 5 beliebig erweiterbar und konfigurierbar und macht es uns sehr einfach das Framework auf unsere Bedürfnisse anzupassen. Der Logger ist allerdings nur eine mögliche Stelle an der Anpassungen vorgenommen werden können. In einem weiteren Blog-Artikel möchte ich den IoC Container austauschen.

Marco Scheel: Links for 2015-05-20 [del.icio.us]

Dmitrij Doberstein: Angstrom >>> install Oracle JDK

In the search for "How can i install Oracle JDK on Angstrom" i found this instruction. It is for BeagleBon.

  • Visit the JDK download page.
    • For Angstrom, download the "Linux ARM v6/v7 VFP Soft Float ABI" version.
    • For Debian, download the "Linux ARM v6/v7 Hard Float ABI" version.
  • Copy jdk-7u40-linux-arm-vfp-*.gz to your BeagleBone Black
  • Perform 'tar xzf jdk-7u40-linux-arm-vfp-*.gz' to extract the JDK
  • Perform 'export PATH=$PATH:/home/root/jdk1.7.0_40/bin' to add the JDK to your path
  • Perform 'export JAVA_HOME=/home/root/jdk1.7.0_40' to set the JAVA_HOME on your installation
  • Perform 'java -version' to verify your installation

Here i see that need "Linux ARM v6/v7 VFP Soft Float ABI". After all steps i typed "java -version" and had next error:




The cause for this error is that my board has not Software FPU but Hardware FPU... After installation of right version everything worked well...




The next problem i had is that enviroment variables are away after reboot. Also i had to add enviroment variables to my .profile. In BeagleBon .profile is in home directory. But on my board i have only a "system wide .profile" also /etc/profile.



After i changed /etc/profile and reboot everything worked well...

Holger Sirtl: Neuer MVA-Kurs: Microsoft Azure - Basic Services

Malte Lantin und ich haben in den letzten Wochen unser Cloud Camp als Kurs in der Microsoft Virtual Academy produziert. Dieser Kurs ist jetzt verfügbar und kann über den folgenden Link absolviert werden:

http://www.microsoftvirtualacademy.com/training-courses/microsoft-azure-basic-services

In dem Kurs behandeln wir die zentralen Dienste von Microsoft Azure, d.h. die Dienste, die wohl die meisten Anwender primär nutzen:

  • Azure Compute Services
  • Azure Data Services
  • Azure Networking

Der Kurs ist aufgeteilt in vier Module, neben einem Überblick je ein Modul pro Service-Gruppe:

  • Modul 1: Überblick
    Dieses Modul gibt einen allgemeinen Überblick über Cloud Computing, Microsoft Azure und Einsatzszenarien für die Dienste aus Microsofts Cloud Plattform.
  • Modul 2: Azure Compute Services
    Hier geht es um die einzelnen Dienste zur Ausführung eigener Anwendungslogik. Behandelt werden unter anderem: Virtual Machines, Cloud Services und Web Apps.
  • Modul 3: Azure Data Services
    In diesem Modul wird ein Überblick über die Dienste zur Datenspeicherung gegeben. Dazu gehören unter anderem: SQL IaaS, SQL Database, DocumentDB, Table Storage, Blob Storage, Files, Disks, Redis Cache, StorSimple.
  • Modul 4: Azure Networking
    Im letzten Modul gibt es einen Überblick über Azure Networking. Behandelte Services sind unter anderem: Azure Loadbalancer, Virtual Network, ExpressRoute.

Weitere Informationen

Christian Binder [MS]: Artikel – Für Automobilhersteller wird Softwareentwicklung zunehmend zur Kernkompetenz

Die rapide Digitalisierung der Automobilindustrie führt zu dem unvermeidbaren Trend, dass Automobilhersteller sich zunehmend auf Softwareentwicklung als Kernkompetenz konzentrieren. Dynamische Märkte und die hohe Wertschöpfung durch Software im Auto erfordert auch ein Umdenken, wie Entwicklungsprozesse hier optimal diese Veränderung unterstützen können. Vor diesem Hintergrund ist ein Artikel in Zusammenarbeit mit Porsche Consulting, Conplement AG, Elektrobit und Microsoft entstanden, um die Möglichkeiten und Potentiale agiler Praktiken und Prinzipien in diesem Kontext zu beleuchten.

Artikel – Adaptive Automobilentwicklung oder als PDF zum Download hier

Viel Spass
Christian Binder

Fabian Deitelhoff: Verlosung: Als auf der Welt das Licht ausging

Nun steht endlich eine weitere Verlosung an. Dieses Mal möchte ich gerne das Buch Als auf der Welt das Licht ausging von Tom DeMarco verlosen. Das Buch an sich habe ich bereits ausführlich in einer Rezension hier in meinem Blog rezensiert. Deswegen möchte ich nicht noch einmal großartig auf den Inhalt eingehen.

Zum Buch

Im Grunde ist die Story schnell zusammengefasst: die Welt entwickelt sich, aufgrund von anhaltenden Konflikten, nicht gut. Ganz vorne mit dabei sind die USA, die einem langjährigen Gegner endlich einen Schlag versetzen möchten. Obwohl durch Simulationen vorausberechnet werden konnte, dass dieses Vorhaben komplett schief gehen kann, hört keiner der Verantwortlichen auf die Gruppe von Wissenschaftlern, die an den Simulationen gearbeitet hat. Das Resultat ist ein nahender Atomkrieg, der aber von der gleichen Gruppe Wissenschaftlern verhindern werden kann.

Als auf der Welt das Licht ausging - Ein Wissenschafts-Thriller

Zur Verlosung

Und wieder einige obligatorische Informationen zur Verlosung. Das Buch wurde mir freundlicherweise vom Hanser Verlag zur Verfügung gestellt. Ich habe es einmal gelesen. Das Buch ist somit in einem recht guten Zustand. Oben rechts hat sich leider ein kleiner Fleck gebildet, der aber auf den Seiten nicht zu sehen ist. Woher der kommt, ist mir ein Rätsel.

Das Buch wird von mir verschickt. Alle Kosten übernehme selbstverständlich ich. Bis auf eine Adresse brauche ich dann auch nichts weiter. Dazu melde ich mich allerdings noch mal beim Gewinner beziehungsweise der Gewinnerin per E-Mail, die beim Kommentar mit angegeben werden muss. Die E-Mail Adresse ist natürlich nur von mir einsehbar.

Wer gewinnen möchte, hinterlässt bitte einen Kommentar, warum er oder sie das Buch gerne hätte. Das muss nichts Besonderes sein. Ich möchte nur gerne vermeiden, dass Kommentare auftauchen, die offensichtlich dadurch entstanden sind, das einmal von links nach rechts mit dem Gesicht über die Tastatur gerollt wurde. :-)

Aus allen Kommentaren fische ich dann per Zufall einen heraus, so wie ich das bei den letzten Verlosungen auch gemacht habe. Die Verlosung läuft von heute, den 20. Mai 2015 bis zum 27. Mai 2015 um 12:00 Uhr. Die Teilnahme ist ab 18 Jahren möglich und der Rechtsweg ist wie üblich ausgeschlossen.

Bei Fragen zum Buch oder sonstigen Angelegenheiten zur Verlosung freue ich mich immer über Kommentare und Nachrichten.

Vielen Glück allen!

Hans-Peter Schelian: Fritz!Box – Wenn mehr drinsteckt als außen drauf steht (LTE Fallback inklusive)

Letzte Woche suchte ich nach einer Lösung, um in einem Geschäft die Internet Versorung, auch dann zu gewährleisten, wenn der DSL Anschluß ausfällt.

Das war zwingend notwendig geworden, da es sich bei dem Geschäft um ein Cafe handelt, dass auf meine Empfehlung hin, nun mit einer, in der Cloud gehosteten Software sein Tagesgeschäft erledigt.
Der Ausfall der DSL Leitung würde bedeuten, mann müsste die Blöcke und Stifte raus nehmen und wieder alles per Hand machen, was, wenn der Laden richtig voll ist (was sehr häufig so ist), eigentlich nicht zu schaffen ist,

Nun aber genug des geschwafels, jetzt geht es an die Erläuterung der technisches Umsetzung.

Vorab muss ich aber noch erwähnen, das wir uns als „Endlösung” für einen Hybrid-Anschluß der Telekom entschieden haben, der uns genau die Hohe Verfügbarkeit für unseren Internet Zugang “out of the box” liefert die wir hier benötigen.

Aber, um die Internet Versorung sicherzustellen, bis der Hybrid-Anschluß funktioniert und vor allem auch an dem Tag, an dem der Hybrid Anschluß geschaltet wird und wir an dem Tag ganz sicher keinen funktionierenden DSL Anschluß haben werden, musste erst einmal eine Lösung her.

Ich hatte meine Kollegen über Twitter gefragt ob Sie irgendewelche Lösungen für mich hätten und habe auch einige Ideen genannt bekommen.

Unter anderem war da auch der Dualband Wireless-AC1900 Gigabit-Router als eine Lösung genannt worden.

Nachdem nun aber feststand dass wir uns für die Hybrid Lösung der Telekom und damit einhergehend sowieso einen neuen Router bekommen würden kam ein weiterer neuer Router für kurze Zeit eigentlich nicht in Frage.

Aktuell wurde dort eine Fritz!Box 7390 betrieben.

Also habe ich mich umgeschaut ob es nicht auch eine Lösung mit der vorhandenen Fritz!Box gibt.

Und siehe da, die Fritz!Box bietet tatsächlich auch eine Lösung an, man sieht diese Option allerdings erst dann, wenn mann auch einen Mobilen Stick per USB an die Fritz!Box anschließt.

In meinem Fall habe ich einen Telekom Speedstick LTE verwendet.

Einfach den Stick (der natürlich mit einer entsprechenden SIM Karte bestückt sein und konfiguriert sein muss) in die Fritz!Box stecken und schon sieht das Menü der Fritz!Box, wie im nachfolgenden Bild dargestellt, um den Menüpunkt „Mobilfunk“ erweitert aus.

Nun wird man noch aufgefordert den PIN der SIM Karte einzugeben und damit ist die Konfiguration eigentlich auch schon abgeschlossen.
(Wer möchte und sich damit sicherer fühlt: Eine detailierte Einrichtungs-Anweisung findet man direkt hier bei AVM )

Anschließend muss man nur noch angeben wann und ob die Mobilfunkverbindung aktiv sein soll und fertig,

Technik und Sicherheit, kann doch so einfach sein.

Norbert Eder: Thinktecture IdentityServer3 UI Lokalisierung

Ich setze in mehreren Projekten den IdentityServer3 ein. Für alle die sich darunter nichts vorstellen können:

IdentityServer is a .NET/Katana-based framework and hostable component that allows implementing single sign-on and access control for modern web applications and APIs using protocols like OpenID Connect and OAuth2. It supports a wide range of clients like mobile, web, SPAs and desktop applications and is extensible to allow integration in new and existing architectures.

Im Rahmen eines Projektes mussten die Views jedoch in unterschiedlichen Sprachen zur Verfügung gestellt werden. Dies unterstützt IdentityServer3 nicht von Haus aus. Alle Views werden ausschließlich in Englisch angeboten. Bei Bedarf können Schnittstellen á la IViewService und Co. implementiert werden.

Damit man eben das nicht tun muss, gibt es nun das Projekt IdentityServer3.Contrib.Localization.UI. Dieses implementiert alles Notwendige und stellt eine einfach Möglichkeit der Einbindung dar. Die Übersetzungen werden über PO-Files zur Verfügung gestellt.

Via NuGet steht ebenfalls ein Package bereit:

PM> Install-Package IdentityServer3.Contrib.Localization.UI

Aktuell ist nur das Notwendigste implementiert und es stehen die Sprachen Deutsch und Englisch bereit.

Weitere Informationen stehen auf GitHub zur Verfügung.

The post Thinktecture IdentityServer3 UI Lokalisierung appeared first on Norbert Eder.

Dmitrij Doberstein: Angstrom >>> set static IP address

To set static IP address install next connman packages:

  • connman
  • connman-angstrom-settings
  • connman-client
  • connman-dbg
  • connman-tests
  • connman-tools

In the next step get the name of your interface (service). All interfaces (services) you can see under /var/lib/connman. In my case it is ethernet_001523d5a38d8_cable.

Now to set static IP type next line:

$connmanctl config <service> --ipv4 manual  <ip address> <netmask> <gateway>

also for example

$connmanctl config ethernet_001523d5a38d8_cable --ipv4 manual  
   192.168.10.101 255.255.254.0 192.168.10.1



For more information see:

Dmitrij Doberstein: Angstrom >>> change keyboard layout

To set another keyboard layout in console for example to german, use

>>> setxkbmap de

but after reboot the previous keyboard layout is back.


For permanent change you must manipulate /etc/X11/xorg.conf. Add next lines to end of file:

Section "InputClass"
Identifier "keyboard"
MatchIsKeyboard "yes"
Option "XkbLayout" "de"
Option "XkbVariant" "nodeadkeys"
EndSection


Dmitrij Doberstein: Angstrom >>> install packages

To install packages under Anstrom make next steps:

- update the list of available packages

>>> opkg update

'opkg' is the default package manager in Angstrom.


To search a package in the list use:

>>> opkg list | grep <package-name>

To install a package use:

>>> opkg install <package-name>


To see if a particular package is installed use

>>> opkg list-installed | grep <package-name>

Jürgen Gutsch: ASP.NET 5 auf dem Raspberry PI laufen lassen.

Im Beitrag .NET Core auf dem Raspberry PI installieren habe ich gezeigt, wie man .NET Core auf dem Raspberry PI installiert. Das ist die Voraussetzung um ASP.NET 5 auf dem Raspberry PI zu starten.

Der Einfachheit halber habe ich unter Windows ein ASP.NET 5 Projekt mit dem Visual Studio 2015 RC erstellt. Das Projekt kann dann per Git oder noch einfacher per USB Stick auf den Raspberry PI geschoben werden. Ich persönlich bevorzuge Git, da ich somit auch eine Versionierung und eine Änderungshistorie für meine Arbeit habe. Selbst für persönliche kleine Projekte macht das für mich immer Sinn.

1. ASP.NET 5 Projekt vorbereiten

Bevor ein mit Visual Studio erstelltes Projekt unter Linux läuft, muss die project.json noch etwas angepasst werden. Wir benötigen zwei weitere NuGet Packages: Microsoft.AspNet.Hosting und Kestrel. Diese Packages dienen dazu, den Webserver Kestrel zu starten und ASP.NET 5 unter Kestrel laufen zu lassen.

  • "Microsoft.AspNet.Hosting": "1.0.0-beta4"
  • "Kestrel": "1.0.0.0-beta4”

Weiterhin müssen wir einen weiteres Kommando hinzufügen. Zusätzlich zu “web” und “gen” (die unter Linux nicht benötigt werden) fügen wir das Kommando mit dem Namen “kestrel” hinzu. (Der Name ist beliebig, sollte aber irgendwie schon einen Sinn ergeben)

  • "kestrel": "Microsoft.AspNet.Hosting --server Kestrel --server.urls http://localhost:5004"

2. .NET Utilities installieren

In diesem und dem nächsten Schritt, kommen nun die Console Tools zum Einsatz die ich in Neue Console Tools für ASP.NET 5 beschrieben habe:

Befindet sich das Projekt auf dem Raspberry PI müssen wir in das Projektverzeichnis wechseln und die .NET Utilities installieren

$cd ~/projects/dnc15/Sensors/src/Sensors
$dnvm install latest

Dieser Befehl sorgt dafür, dass die Kommandos der aktuellsten .NET Utilities in die Umgebungsvariablen der aktuellen Session aufgenommen werden.

“dnvm install latest” schaut im Internet nach der neuesten Runtime und lädt diese ggf. herunter. Alternativ kann man mit “dnvm list” schauen welche Runtimes vorhanden sind und die gewünschte per Alias installieren. z. B: “dnvm install default”.

Das nachfolgende Kommando stellt alle Abhängigkeiten wieder her, das betrifft nicht nur NuGet Packages, sondern auch Abhängigkeiten zu NPM und Bower. DNU ist also etwas mehr als nur ein NuGet Manager:

$dnu restore

Je nach Größe des Projektes und Auslastung der Leitung kann das eine Weile gehen.

3. ASP.NET 5 Anwendung starten

$dnx . kestrel

Dieser einfache Aufruf startet den Webserver Kestrel im aktuellen Verzeichnis. Fertig. Es sollte noch der Hinweis erscheinen, dass Kestrel gestartet ist und nun kann die Anwendung auf dem Raspberry PI unter http://localhost:5004/ gestartet werden oder von außen unter der IP-Adresse des Raspberry PI.

Code-Inside Blog: Microsoft Web Camp Talk in German about ASP.NET now and ASP.NET 5

I did two sessions today about the current ASP.NET Stack and the upcoming ASP.NET 5 at the Microsoft Web Camp in Zurich. The talk was in German and so are most of the slides, but for the record I will link the slides and the code.

State of the Art Web Development mit ASP.NET

Code on GitHub

ASP.NET 5

Code on GitHub

Happy coding and thanks to Microsoft Switzerland for the nice event.

Florian Geisenhof: Hyper-V per Kommando (de-)aktivieren

Normalerweise arbeite ich mit VirtualBox. Dies ist allerdings nur bedingt möglich, wenn man Apps für Windows Phones entwickelt. Dafür wird Hyper-V benötigt. Der Haken an der Sache ist, dass beide Systeme nicht gleichzeitig auf einem Computer laufen. Ist Hyper-V aktiviert, laufen die VirtualBox-PCs nicht mehr hoch. Dies kann jedoch leicht umgangen werden, indem […]

Jürgen Gutsch: Wo sind die ASP.NET Bundles in ASP.NET 5?

Wer mit dem Visual Studio 2015 RC ein Standardprojekt öffnet wird die ASP.NET Bundles vermissen, mit denen bisher JavaScript und CSS Dateien zusammengefasst (bundled) und komprimiert (minified) wurden.

Es gibt keine BundleConfig mehr im Projekt und die ASP.NET Bundles werden in ASP.NET 5 nicht mehr enthalten sein.

Warum?

Beim näheren hinschauen eigentlich klar. Mit ASP.NET 5 wurde das Arbeiten im Frontend komplett überarbeitet: ASP.NET ist hier nicht mehr zuständig.

Ab jetzt sollen Web Frontend Tools für das Web Frontend zum Einsatz kommen ;)

Ab Jetzt wird im Web Frontend Grunt und/oder Gulp verwendet um Dateien zusammenzufassen oder zu komprimieren. Jetzt wird Bower verwendet um abhängige JavaScript und CSS Bibliotheken zu managen. Folglich werden die ASP.NET Bundles nicht mehr benötigt.

In den ASP.NET MVC Views werden Referenzen nun nicht mehr über @Styles.Render() oder @Scripts.Render() eingebunden, sondern über die neuen Environment TagHelper:

<environment names="Development">
    <link rel="stylesheet" href="~/lib/bootstrap/css/bootstrap.css" />
    <link rel="stylesheet" href="~/lib/bootstrap-touch-carousel/css/bootstrap-touch-carousel.css" />
    <link rel="stylesheet" href="~/css/site.css" />
</environment>
<environment names="Staging,Production">
    <link rel="stylesheet" href="http://www.aspnetzone.de//ajax.aspnetcdn.com/ajax/bootstrap/3.0.0/css/bootstrap.min.css"
          asp-fallback-href="~/lib/bootstrap/css/bootstrap.min.css"
          asp-fallback-test-class="hidden" asp-fallback-test-property="visibility" asp-fallback-test-value="hidden" />
    <link rel="stylesheet" href="http://www.aspnetzone.de//ajax.aspnetcdn.com/ajax/bootstrap-touch-carousel/0.8.0/css/bootstrap-touch-carousel.css"
          asp-fallback-href="~/lib/bootstrap-touch-carousel/css/bootstrap-touch-carousel.css"
          asp-fallback-test-class="carousel-caption" asp-fallback-test-property="display" asp-fallback-test-value="none" />
    <link rel="stylesheet" href="~/css/site.css" />
</environment>

Weitere Infos

Weitere Details, Hintergründe und vor allem wie man die Environment TagHelper steuert, könnt ihr in folgendem Blog-Artikel von Jeff Fritz nachlesen: http://www.jeffreyfritz.com/2015/05/where-did-my-asp-net-bundles-go-in-asp-net-5/

Sven Hubert: AIT auf den Karlsruher Entwicklertagen

Golo Roden: Ich kenne was, was Du nicht kennst: Cheerio

Webseiten zu analysieren ist eine gängige Anforderung: Es lässt sich beispielsweise nutzen, um Links zu validieren, Bilder zu extrahieren oder Preise zu analysieren. Die Herausforderung dabei liegt im Parsen von HTML-Dateien und dem Traversieren des DOMs. Das Modul Cheerio schafft Abhilfe.

Holger Sirtl: Azure News on Friday (KW21/15)

Auch diese Woche gab’s wieder viele Nachrichten zu Azure Table Storage, Media Services, Site Recovery, Cloud Services, Azure AD, Virtual Machines, SQL Server und Azure SQL DB, Azure Search, Azure App Service und viele weitere Azure Services. Hier sind nähere Infos dazu…

Datum Nachricht
14.05. Azure Friday: Azure Table Storage 101
In dieser Folge gibt Jai Haridas einen Überblick über einen der ältesten Azure Services: Table Storage.
14.05. Ankündigung: Hyperlapse für Azure Media Services
Mit Hyperlapse können lange Videos, die z.B. mit einer Helmkamera aufgenommen wurden, überarbeitet und zeitlich komprimiert werden. Dabei werden Technologien zur Bildstabilisierung eingesetzt, um z.B. Wackler im Ausgangsmaterial heraus zu rechnen und als Ergebnis ein stabiles Bild zu erhalten.
13.05. Azure Site Recovery auf der Ignite 2015
Dieser Blogpost listet alle Ignite-Sessions zum Thema Azure Site Recovery auf.
13.05. Unterstützung von Cloud Services im Azure Preview Portal
Endlich unterstützt das Preview Portal auch Cloud Services. Diese können nun auch von dort aus erstellt, überwacht und verwaltet werden. Passend zu dieser Ankündigung gibt’s auf Channel 9 eine entsprechende Episode der Cloud Cover Show.
13.05. Azure Active Directory und Windows 10
Windows 10 wird zahlreiche Funktionen besitzen, die durch Azure Active Directory ermöglicht werden. Unter anderem Self-provisioning neuer Geräte durch deren Nutzer, Verwendung von Azure-AD-Accounts zum Login, Enterprise-ready Windows Store etc. Dieser Blogpost geht auf all das genauer ein.
12.05. MVA: Microsoft Azure Fundamentals: Virtual Machines
In diesem Kurs der Microsoft Virtual Academy dreht sich alles um Azure-IaaS, genauer: um Virtual Machines.
12.05. Channel 9: Video-Serie zu SQL Server 2016
In dieser Video-Serie geht’s um Microsofts SQL Server 2016. Themen sind:
SQL Server 2016 AlwaysOn
SQL Server 2016 Row Level Security
SQL Server 2016 Always Encrypted
SQL Server 2016 Managed Backup
SQL Server 2016 Upgrade Advisor
SQL Server 2016 Query Store
07.05. Channel 9: Azure SQL DB Transactional Replication
In diesem Video erklärt Jean-Yves Devant, was es mit Azure SQL DB Transactional Replication auf sich hat. Damit lässt sich Azure SQL DB als Abonnent für einen SQL Server Transactional Replication zum Datenaustausch mit einem On-premises SQL Server konfigurieren.
12.05. Channel 9: SQL Server Stretch DB
George Li zeigt in diesem Video, wie sich mit Stretch DB Tabellen aus einem lokalen SQL Server nach Azure SQL DB ausdehnen lassen.
12.05. MVA: Adding Microsoft Azure Search to Your Websites and Apps
In diesem Kurs der Microsoft Virtual Academy dreht sich alles um Azure Search und die Möglichkeiten, diese Such-Engine in eigenen Websites und Apps zu verwenden.
11.05. Zusammenspiel zwischen Visual Studio Code und Azure App Service
Dieser Blogpost zeigt, wie sich in beliebigen Client-Plattformen mit Visual Studio Code sehr einfach eigene Web Apps erstellen und dann nach Azure App Service deployen lassen.

Lars Keller: Vortrag bei der DNUG Hamburg

Am kommenden Mittwoch 20.05.2015, 18 Uhr bin ich bei der DNUG Hamburg zu besuch! Ich werde einen Vortrag zu Leap Motion, Perceptual Computing und Kinect halten.

http://dotnet-usergroup-hamburg.de/2015/04/net-user-group-treffen-mai-2015-herr-der-gesten/

Wir sehen uns dort! :-)

Lars Keller: DNUG Braunschweig Treffen - Internet of Things, und Industrie 4.0 mit Microservices Approach

Die DNUG Braunschweig trifft sich am 21.05.2015 um 19:00 im Restaurant Zucker (Tagungsraum). Dieses Mal kommt uns Damir Dobric besuchen:

Die Themen „Cloud“, „Internet of Things“ und Microservices spielen eine immer größere Rolle in unserem Alltag. An diesem Abend werden wir für einige Stunden die neuen Technologien vorstellen, die genannten Technologien abdecken. Wir werden zuerst eine Einführung in die Themen „Internet of Things“ und, „Industrie 4.0“ geben. Hier werden wir sehen, warum diese Themen plötzlich wichtig geworden sind und welche Herausforderungen sie für Entwickler und Architekten darstellen. Wir werden viele Demos sehen. Allerdings, wir werden nicht die Hobby-Szenarien im Fokus haben. Unser Ziel ist es IoT und IN4.0 aus der Industrie Blickwinkel zu beleuchten um diese in den Projekten umsetzen zu können.

Technologisch fangen wir mit .NET Micro Framework und sog. System on Module Devices (Netduino, FEZ Spider, und Molecule.) an. Wir zeigen, wie diese „Dinge“ mit Visual Studio, C# und Gadgeteer programmiert werden können. Als nächstes demonstrieren wir Windows 10 mit Pi2 und Universal Windows Plattform.
Und anschließend beleuchten wir die, wie die „Dinge“ in komplexere, verteilte Systemen angebunden werden können, die in hybriden Umgebungen miteinander interagieren können.
Soweit die Zeit reicht, begeben wir uns in die Welt von Actor Programming Model und Service Fabric und zeigen wie IoT Lösungen von Actor Model und Microservices Approach profitieren können.
Im Fokus: Windows Universal Apps fuer Win10 mit IoT Extension, Messaging mit HTML5/JS, .NET Micro Framework, Azure Service Bus, Service Fabric, Gadgeteer, Pi2, Windows10 und vielleicht mehr.

Wie immer ist die Veranstaltung kostenlos!
Weitere Informationen zur DNUG Braunschweig können hier gefunden werden: http://www.dotnet-braunschweig.de

Norbert Eder: #fotomontag #20

Jeden Montag ein Foto. Der #fotomontag.

Wahnsinn! Wie die Zeit vergeht. Das ist bereits der 20. #fotomontag. Hier ein Foto aus einem kleinen Mittagspausen-Spaziergang. Es zeigt die Feuerwehrleiter einer P+R-Anlage aus einer Perspektive, die man nicht so oft sieht, sofern man da nicht extra hingeht. Gerade diese nicht alltäglichen Perspektiven sind es, die den Blick länger auf einem Foto verweilen lässt.

Feuerwehrleiter

Feuerwehrleiter

Bildinformationen:
35mm
ISO 100
f/11
1/200
Sony Alpha 6000

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

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

Jürgen Gutsch: .NET Core auf dem Raspberry PI installieren.

 

Anforderungen:

  • Raspberry PI 2 mit installiertem Raspian (Debian Wheezy) und konfigurierter Netzwerkverbindung
    • Der Raspberry PI sollte auf Internet zugreifen können sollte von einem anderen Rechner aus erreichbar sein.
  • Putty oder ein anderer SSH Client auf Windows

image

Die aktuelle Mono-Version benötigt sehr viel Arbeitsspeicher. Daher ist reicht der Raspberry PI B+ nicht mehr aus. Die Mono-Version die per apt-get geholt wird, sollte auf den alten Geräten noch gehen, reicht allerdings nicht mehr für ASP.NET 5.

1. System aktualisieren

$ sudo apt-get update
$ sudo apt-get upgrade

2. Mono 4 installieren

$sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 3FA7E0328081BFF6A14DA29AA6A19B38D3D831EF
$echo "deb http://download.mono-project.com/repo/debian wheezy main" | sudo tee /etc/apt/sources.list.d/mono-xamarin.list
$sudo apt-get update
$sudo apt-get install mono-complete

ASP.NET 5 benötigt Mono 4, daher das Paket aber auf offiziellem Weg noch nicht verfügbar ist, muss dieses direkt von Xamarin bezogen werden.

Der Aufruf der Mono-Versionsinformationen überprüft, ob die Installation funktioniert hat:

$ mono –V

3. Zertifikate für NuGet installieren

$sudo certmgr -ssl -m https://go.microsoft.com
$sudo certmgr -ssl -m https://nugetgallery.blob.core.windows.net
$sudo certmgr -ssl -m https://nuget.org
$sudo certmgr -ssl -m https://www.myget.org
$mozroots --import –sync

4. Libuv für den Kestrel Webserver installieren

$sudo apt-get install gyp
$wget http://dist.libuv.org/dist/v1.4.2/libuv-v1.4.2.tar.gz
$tar -xvf libuv-v1.4.2.tar.gz
$cd libuv-v1.4.2/
$./gyp_uv.py -f make -Duv_library=shared_library
$make -C out
$sudo cp out/Debug/lib.target/libuv.so
$usr/lib/libuv.so. 1.4.2
$sudo ln -s libuv.so. 1.4.2 /usr/lib/libuv.so.1

Libuv ist die Grundlage für Kestrel, der den Webserver für ASP.NET 5 unter Linux darstellt

5. NodeJs, Grunt & Bower installieren

NodeJs, Grund und Bower werden benötigt um Abhängigkeiten für das Web Frontend zu lösen, bzw. Aufgaben (wie z.B: TypeScript, LESS, SASS Kompilierungen) vorzunehmen. Ggf. sollte auch Gulp installiert werden.

$wget http://node-arm.herokuapp.com/node_latest_armhf.deb
$sudo dpkg -i node_latest_armhf.deb
$sudo npm install -g grunt
$sudo npm install -g bower

6. .NET Version Manager installieren

Der .NET Version Manager verwaltet die .NET Core Run-Times und installiert die .NET Utilities

$curl -sSL https://raw.githubusercontent.com/aspnet/Home/dev/dnvminstall.sh | DNX_BRANCH=dev sh && source ~/.dnx/dnvm/dnvm.sh
$dnvm upgrade

Zum Testen muss anschließend einfach das dnvm Kommando aufgerufen werden:

$ dnvm

dnvm_pi

Fertig

Das war’s dann auch schon. Somit ist die Voraussetzung geschaffen um .NET Core Applikationen und ASP.NET 5 auf dem Raspberry PI 2 laufen zu lassen. Wie man eine ASP.NET 5 Applikation auf dem Raspberry PI 2 zum laufen bringt, zeige ich in einem weiteren Beitrag.

Johannes Renatus: TypeScript 1.4+ mit Visual Studio 2013

Bisher hatte ich mir TypeScript noch nicht genauer angeschaut, aber mit der Ankündigung das Angular 2.0 auf TypeScript setzt, habe ich auch TypeScript ausprobiert, vor allem die Einbindung in Visual Studio 2013. Prinzipiell muss ich sagen ich bin begeistert, es gibt zwar hier und da noch ein paar Ecken und Kanten aber es macht durchaus […]

Holger Schwichtenberg: Windows 10 für alles – auch für das Hinterteil

In einer Pressemitteilung verkündet Microsoft die "Windows 10 Po"-Edition.

Marco Scheel: Links for 2015-05-14 [del.icio.us]

codefest.at [MS]: DataGrids Everywhere - mit C#, Xamarin Forms und DevExpress

clip_image002[1]

In meinem letzten Xamarin Workshop haben wir eine WinForms Applikation mit Xamarin auf die drei führenden mobilen Plattformen konvertiert. Natürlich war wieder mal ein DataGrid in der Applikation, welches auch unbedingt auf den mobilen Devices dargestellt werden musste. Nun, da hat sich gleich einmal angeboten das neue DevExpress DataGrid-Control für Xamarin anzutesten, welches sich derzeit in Beta befindet.

Es untertützt alle drei Plattformen, also Windows Phone 8.1, iOS und Android (und auch Portable Libraries) und ist frei verfügbar.

Was wollen wir bauen?

Natürlich eine mobile Applikation mit einem Datengrid. Da bietet sich gleich der Codefest.at RSS-Feed an, welcher die letzten Blog-Einträge anzeigt. Das fertige Resultat sollte (und wird) in etwa so aussehen:

clip_image004[1] SNAGHTMLf494240
Windows Phone Client mit/ohne Gruppierung und Filter im Emulator

clip_image008[1] clip_image010[1]
Android Client, ungefilterte und gefilterte Ansicht im Emulator

Ich werde nachfolgend zwei Varianten implementieren, eine Lösung mit XAML und eine zweite Version ohne XAML, d. h. alle Controls werden im Code erzeugt. Sieht das nicht wirklich überzeugend aus? Dann wollen wir doch gleich loslegen.

Voraussetzungen

Bevor wir ans Eingemachte gehen können, benötigen wir natürlich ein paar Dinge auf dem Rechner vorinstalliert:

  • Xamarin mit Xamarin.Forms (dieses Beispiel wurde mit der Build 1.4.2.6359 entwickelt)
  • Visual Studio, bzw. Xamarin Studio (ich verwende den VS 2015 RC, wegen dem von Haus aus mitgelieferten Android Emulator)
  • DevExpress Grid Control für Xamarin – derzeit Beta und gratis verfügbar.

Der Download für die DevExpress Grid-Komponente geht mit dem eigenen Xamarin Account aus dem Xamarin Component Store flott von der Hand: https://components.xamarin.com/view/devexpress-grid

Source Code

Für die ungeduldigen unter euch steht der komplette Source Code hier zur Verfügung:
https://github.com/BerndtHamboeck/XamDataGridSample

Erstellen der Applikation

Zuerst wird eine Xamarin.Forms Portable Applikation mit dem Namen XamDataGridSample erzeugt.

clip_image012[1]

Xamarin.Forms Update

Im nächsten Schritt sollte Xamarin.Forms auf die aktuellste Version upgedatet werden, das kann entwender über die Solution, oder für jedes Projekt einzeln durchgeführt werden.

clip_image013[1]

Die aktuellste (stabile) Version von Xamarin.Forms ist derzeit 1.4.2.6359.

clip_image015[1]

Bitte kontrolliert abschließend alle mobilen Projekte, ob die Xamarin.Forms DLLs auch wirklich auf dieser Version sind, die Versionen sollten auf keinen Fall auseinander laufen, um unvorhergesehene Effekte zu vermeiden.

Windows Phone Projekt auf 8.1 Upgraden

Der nächste Schritt ist die Migration der Windows Phone APP auf Version 8.1, da das DevExpress Datengrid erst ab 8.1 funktioniert.

clip_image017[1]

Referenzen für das DataGrid

Nun werden die Referenzen für das DevExpress DataGrid hinzugefügt. Diese sind in der devexpress-grid-15.1.3.0.zip-Datei, im Folder devexpress-grid-15.1.3.0\lib für die jeweilige Plattform zu finden.

clip_image018[1]

Nachfolgend sind die Screenshots für die beiden Projekte, nämlich die Portable Library und das Windows Phone 8.1 Projekt zu sehen. Für die beiden anderen Plattformen (Android und iOS) ist die DevExpress.Mobile.Grid.WinPhone.v15.1.dll ebenfalls als Referenz (aus dem korrekten Verzeichnis) hinzuzufügen.

clip_image019[1] clip_image020[1]

Hinzufügen von Microsoft.Net.Http

Da von codefest.at eine XML-Datei angefordert wird, sollte das gleich so passieren, wie das in mobilen APPs Stand der Dinge ist, nämlich asynchron. Dazu wird über NuGet in der Portable Class Library das Microsoft.Net.Http Package installiert.

clip_image022[1]

Sollte beim installieren des Microsoft.Net.Http-Paketes folgende Fehlermeldung auftreten, dann startet bitte Visual Studio neu, und zwar als Administrator und öffnet danach die Package Manager Console (Tools -> Nuget Package Manager -> Package Manager Console).

clip_image023[1]

Danach setzt ihr die ExecutionPolicy auf unrestricted:

clip_image024[1]

Nun bitte erneut versuchen das Paket zu installieren, das sollte nun klappen. Wenn das nun klappt, bzw. es schon beim ersten Mal der Fall war, dann ist das ein Grund zur Freude, denn es kann weiter gehen.

Initialisieren in der MainPage.xaml.cs

Die DevExpress Komponente möchte gerne initialisiert werden, sollte das vergessen werden, dann bekommt man beim Ausführen entweder ein leeres Datengrid, oder seltsame Zeichen anstatt der gewünschten Texte. Da beides nicht das ist, was erreicht werden soll, kommt eine Code-Zeile in die MainPage.xaml.cs im Windows Phone 8.1 Projekt:

DevExpress.Mobile.Forms.Init();

clip_image025[1]

Das gilt übrigens auch für die Android und iOS Projekte. Im Android Projekt kommt die Zeile in die MainActivity.cs Datei. Im iOS Projekt kommt die Zeile für die Initialisierung in die Main.cs Datei.

clip_image026[1]clip_image027[1]

Soweit so gut, jetzt kann es mit dem eigentlichen Kodieren weiter gehen – wir bauen uns einen RSS-Reader.

Die Implementierung des RSS Readers

Bevor etwas angezeigt werden kann, muss etwas gelesen werden. Das soll der RSS-Feed von codefest.at sein. Dazu benötigen wir eine Klasse, die die einzelnen RSS-Einträge bereithält, oder besser gesagt, die Informationen, die später im Datengrid angezeigt werden sollen. Das wird die RssEntry-Klasse sein.

clip_image028[1]

Zum befüllen schreiben wir uns eine Klasse, die den Feed asynchron abholt und das Ergebnis in eine Liste von RssEntry-Objekten retourniert.

clip_image029[1]

Das war es eigentlich, jetzt wird noch die Xamarin.Forms Page benötigt, die die gelesenen Daten abholen kann.

Xamarin.Forms Page ohne XAML

Das Datengrid wird auf einer eigenen Page liegen, möglicherweise mit weiteren Controls. Fügen wir also dem Portable Projekt eine Forms ContentPage hinzu.

clip_image031[1]

Diese Xamarin.Forms ContenPage soll 2 Überschriften darstellen – schließlich sollen die Anwender auch sehen, was denn hier so Sache ist. Während die Daten asynchron gelesen werden, wäre ein ActivityIndicator eine feine Sache, dann tut sich auch etwas auf dem Device. Dann kann es eigentlich auch schon los gehen. Die Daten müssen gelesen werden.

clip_image032[1]

Dazu wird der RSS Reader verwendet, der zuvor zammengebaut wurde. Sind die Daten angekommen, so wird ein neues Grid Control angelegt und drei Spalten hinzugefügt. Eine für das Datum, eine weitere für den Autor und der Titel wäre bestimmt auch hilfreich. Danach wird der ActivityIndicator noch entfernt, da die Daten schon hier sind.

clip_image033[1]

In der App.cs-Datei im Portable-Projekt wird die Startseite der Applikation erzeugt, diese soll nun unsere MainPage sein, d. h. hier ist noch eine kleine Anpassung notwendig, diese soll nun so aussehen:

clip_image034[1]

Jetzt kann das Projekt gestartet werden und je nach Startprojekt kann die APP im Windows Phone 8.1, iOS, oder Android Emulator, bzw. Device bewundert werden.

Xamarin.Forms Page mit XAML

Das gleiche klappt natürlich auch hervorragend über XAML. Das soll mit einer zweiten Page dargestellt werden, diese soll auch das Filtern ermöglichen und das Datum gruppiert darstellen (das kann gerne auch in die erste Lösung nachträglich eingebaut werden, das wäre einfach, da nur ein paar Properties im Code zu setzen wären). Beginnen wir aber mit dem hinzufügen einer Forms Xaml Page zu unserem bestehenden Portable Projekt:

clip_image036[1]

Füllen wir die XAML-Datei mit Leben, der Namespace für das DevExpress Grid muss hinzugefügt werden, danach die Controls für den Header, bzw. SubHeader und der ActivityIndicator ist sicherlich ebenfalls nett anzusehen, während der Feed abgeholt wird. Abschließend noch das Datengrid mit den drei Spalten und die Page ist fertig.

clip_image037[1]

Die Code-Behind-Datei ist hier natürlich dramatisch kürzer, da hier nur die Daten gelesen werden und gebunden werden:

clip_image038[1]

Abschließend ist noch die Start-Page in der App.cs-Datei umzusetzen und die Applikation kann schon mit der XAML Page gestartet werden.

clip_image039[1]

Zusammenfassung

Ein Datengrid macht möglicherweise auf den ersten Blick auf einem Mobiltelefon wenig Sinn, aber bestehende Applikationen, die auf mobile Devices migriert werden sollen, können von so einem Control aber mit Sicherheit profitieren. Sortieren, Filtern, aber auch Dateneingaben werden damit auch auf den mobilen Devices ermöglicht. Richtig Spaß macht so ein Datengrid natürlich erst auf einem Tablet, hier spielt es auch so richtig seine Stärken aus. Ich finde wir finden hier wieder eine wunderbare Bereicherung für unsere Entwicklung vor, um tolle Lösungen mit C# und Xamarin.Forms auf alle möglichen Devices zu zaubern!


Berndt Hamböck ist seit 2007 MCT, darüber hinaus befasst er sich mit Lösungen für komplexe Anwendungsszenarien mit den neuesten Microsoft Technologien. Die Erfahrungen aus der Projektarbeit gibt er in Vorträgen und Trainings weiter und begleitet Entwicklerteams in Softwareunternehmen bei Projekten im Microsoft Umfeld.

Das ist ein Gastbeitrag. Die Meinung des Autors muss sich nicht mit jener von Microsoft decken. Durch den Artikel ergeben sich keinerlei Handlungsempfehlungen. Microsoft übernimmt keine Gewähr für die Richtigkeit oder Vollständigkeit der Angaben.

Hans-Peter Schelian: WordPress Blog auf Windows Server – Plugins und Themes Aktualisierungen schlagen fehl

Von Heute auf Morgen hat die Aktualisierung von Plugins und Themes auf meinem WordPress Blog, welcher auf einem Windows Server W2K8 betrieben wird, nicht mehr funktioniert.

Dieses Problem hatte ich nun schon weit über 1 Jahr und konnte keine echte Lösung dafür finden.

Ich hatte zwar eine Interimslösung ermittelt, aber die war wirklich nicht sehr komforrabel.

Als Interimslösung war mir folgendes eingefallen:
Nachdem die Aktualisierung eines Plugins fehlgeschlagen war, musste ich den IIS neu starten und konnte dann das Plugin neu installieren.

Ich sagte ja, nicht wirklich komfortabel

Letzte Woche war ich mit @Sascha unterwegs zu einer Community Veranstaltung in Köln.
Während der Fahrt erzählt er mir von genau dem gleichen Phänomen auf seinem Blog.
Ich sagte ihm, dass ich das gleiche Problem schon seit längerer Zeit auf meinem Blog habe und bisher keine Lösung dafür gefunden hätte.

Ein paar Tage später, während eines Telefonats erzählt mir Sascha das er eine Lösung für sein Problem gefunden hat.
Voller freudiger erwartung habe ich versucht die gleiche Lösung bei mir zu verwenden, musste jedoch feststellen dass bei meiner verwendeten Infrastruktur das Problem mit „seiner” lösung nicht behoben werden konnte.

Aber …..
Es lag nahe, dass mein Problem im selben Bereich zu suchen war wie Saschas Problem, und es lediglich an den unterschiedlichen Plattformen und Versionen liegt dass nicht exakt die gleiche Lösug bei uns beiden funktioniert.

Hier geht es übrigens zur (Azure) Lösung von Sascha

Ich vermutetet also, dass mein Problem, wie bei Saschas Beitrag beschrieben, auch etwas mit dem Caching von PHP Seiten auf dem IIS zu tun haben könnnte.

Eine Suche in den Diensten meines Windows Server hat gezeigt, dass es tatsächlich einen extra Dienst, den „Window Cache Extension Service“ gibt, der genau für diese Aufgabe zuständig ist.

Ich habe dann einfach diesen Dienst deinstalliert und bingo – mein Problem war nun auch gelöst.

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

Jürgen Gutsch: Neue Console Tools für ASP.NET 5

Mit der Beta 4 hat Microsoft die Console Tools für ASP.NET 5 umbenannt und deren Argumente leicht angepasst. Was früher die “K” Tools waren, sind heute die “.Net Utilities”

  • KVM wurde zu DNVM (.NET Version Manager) und dient der Verwaltung der aktuell genutzten .NET Core Runntime
  • KPM wurde zu DNU und ist der NuGet Package Manager. Allerdings werden mit $ dnu restore auch alle anderen Abhängigkeiten wie NPM und Bower geholt
  • K wurde zu DNX und dient der Interaktion mit der aktuellen Applikation, zum Beispiel dem Starten des Webservers:
    $ DNX . kestrel

dnvm

Unter Linux ist übrigens die Beta 5 der .NET Utilities aktiv:

dnvm_pi

Eine weitere Änderung ist - unter Linux - die Abhängigkeit zum kürzlich erschienenen Mono 4, was weitere Probleme machen kann.

Übrigens lohnt sich ein Blick in die aktualisierten ASP.NET Projekt Templates auch hier gibt es einige sehr schönen Änderungen die ich in weiteren Beiträgen etwas intensiver beleuchten möchte.

Sascha Dittmann: WordPress auf Microsoft Azure – Plugin Aktualisierung fehlgeschlagen

WordPressSeit einigen Wochen schlug die Aktualisierung von WordPress-Plugins bzw. Themes in meinem – in Microsoft Azure gehosteten – Blog fehl. Die Suche im Internet führte leider auch zu keiner Lösung, da meistens nur auf die Rechte im Dateisystem verwiesen wurde.
Doch heute bin ich durch einen Zufall auf die Lösung gestoßen…

Ende letzten Jahres hatte ich meinen Blog von der BlogEngine.NET auf WordPress, und von den Azure Cloud Services auf die Azure Web Apps (aka Azure Web Sites), umgezogen.

Alles lief wunderbar, und ich war mit dem Ergebnis vollkommen zufrieden.

Das Problem

Vor wenigen Wochen konnte ich urplötzlich weder WordPress-Plugins noch Themes aktualisieren.
Die WordPress Engine aktualisierte sich allerdings weiterhin ohne Probleme.

Genauer gesagt, konnten beim Aktualisieren der Plugins, die Alte Version nicht mehr entfernt werden.

Downloading update from http://downloads.wordpress.org/plugin/<plugin>.zip
Unpacking the update
Deactivating the plugin
Removing the old version of the plugin
Could not remove the old plugin
Plugin upgrade Failed

Nachdem die Aktualisierung fehlgeschlagen war, waren auch die Plugins verschwunden.

Leider ging anschließend auch die Neuinstallation der betroffenen Plugins nicht mehr.
Hier bekam ich die Fehlermeldung, dass für das Plugin relevante Verzeichnisse nicht mehr angelegt werden konnten.

Die einzige "Lösung" war ein Neustart der Web App.
Danach ging auch die Re-Installation wieder.

Bei meiner Suche im Internet stieß ich immer wieder auf Rechteprobleme im Dateisystem.

Dies führte allerdings zu keiner Lösung, da der Blog zum Einen auf Windows (und nicht Linux) gehostet wird und zum Anderen ausreichende Rechte vorhanden waren.

Endlich die Lösung

Heute bin ich endlich auf die Lösung gestoßen…
Danke an Cory Fowler für den Tipp!

Vor kurzem wurden Änderungen an der WinCache Extension for PHP durchgeführt, welche Anfragen ans Dateisystem, wie beispielsweise is_dir, is_file und file_exists, an WinCache umleiten.
Somit kann es passieren, dass bereits gelöschte Dateien »kurzfristig« als Vorhanden an PHP Skripte zurückgemeldet werden.

Diese Umleitungen können ganz einfach deaktiviert werden:

  1. Falls noch nicht vorhanden, muss eine Datei mit dem Namen .user.ini Im Stammverzeichnis des Blogs angelegt werden.
    Das wäre bei den Azure Web Apps: d:\home\site\wwwroot
  2. Dort muss die Zeile wincache.reroute_enabled=0 hinzugefügt werden.
  3. Sicherheitshalber hatte ich anschließend die Web App neu gestartet

Nachdem ich die Umleitungen deaktiviert hatte, lief auch das Aktualisieren der Plugins wieder.

Der Beitrag WordPress auf Microsoft Azure – Plugin Aktualisierung fehlgeschlagen erschien zuerst auf Sascha Dittmann.

Manfred Steyer: AngularJS mit TypeScript 1.5 und ES6-Modulen nutzen

Eine lästige Angelegenheit bei der Entwicklung von Web-Anwendungen ist die Tatsache, dass sich der Entwickler darum kümmern muss, sämtliche direkt sowie auch indirekt verwendete JavaScript-Dateien über Script-Tags zu referenzieren. EcmaScript 6 löst dieses Problem durch ein Modul-System, bei dem jede Datei einen eigenen Namensraum erhält und Konstrukte für andere Dateien exportieren kann.

TypeScript 1.5 unterstützt dieses Modul-System. Das ist jedoch nur die halbe Miete, denn zur Laufzeit benötigt man auch einen Module-Loader, der in der Lage ist, die referenzierten Module zu laden. Ein solcher Module-Loader ist System.js, welcher sich sehr elegant gemeinsam mit dem Package-Manager JSPM einsätzen lässt. Letzterer kümmert sich bei diesem Zusammenspiel nicht nur um das Beschaffen der benötigten Bibliotheken, sondern stellt diese auch als Modul zur Verfügung und konfiguiert auch eine Konfigurationsdatei für System.js.

Die nachfolgenden Ausführungen beziehen sich auf Visual Studio 2013 mit installiertem TypeScript 1.5. Das gezeigte Beispiel findet sich hier.

Schritt für Schritt

  1. Stellen Sie sicher, dass Sie NodeJS installiert haben (nodejs.org)
  2. Stellen Sie sicher, dass Sie TypeScript 1.5 für Visual Studio installiert haben (http://www.typescriptlang.org)
  3. Stellen Sie sicher, dass Sie die folgenden Werkzeuge installiert haben:
    • TypeScript: npm install typescript -g
    • JSPM: npm install jspm -g
  4. Erstellen Sie ein neues Web-Projekt in Visual Studio
  5. Geben Sie in den Projekteinstellung an, dass TypeScript AMD-konforme Module erstellen soll
    Wechseln Sie auf der Kommandozeile in das Projektverzeichnis und initialisieren Sie JSPM. Die gestellten Fragen können Sie dabei mit ENTER beantworten: jspm init
  6. Installieren Sie AngularJS via jspm jspm install angular
  7. Fügen Sie die erhaltenen Dateien zu Ihrem Projekt hinzu (Ordner jspm_packages, config.js, package.json)
  8. Editieren Sie die Datei config.js, sodass als baseUrl der aktuelle Pfad . definiert wird (Versionsnummer können abweichen). Beachten Sie dabei auch, dass diese Datei im unteren Bereich den Modul-Namen angular definiert und auf entsprechende Modul-Dateien abbildet.
    System.config({
    "baseURL": ".",
    "paths": {
     "*": "*.js",
     "github:*": "jspm_packages/github/*.js"
    }
    });
    System.config({
    "map": {
     "angular": "github:angular/bower-angular@1.3.15",
     "traceur": "github:jmcriffey/bower-traceur@0.0.87",
     "traceur-runtime": "github:jmcriffey/bower-traceur-runtime@0.0.87"
    }
    });
  9. Laden Sie via NuGet die Typ-Definitionen für AngularJS herunter. Diese haben die NuGet-Id angularjs.TypeScript.DefinitelyTyped
  10. Erstellen Sie im Ordner app eine Datei DemoCtrl.ts.
    export class DemoCtrl {
    message: string;
    constructor() {
        this.message = "Hallo Welt";
    }
    }
  11. Erstellen Sie im Ordner app eine Datei app.ts, die DemoCtrl aber auch angular importiert. Die Definition für angular entnimmt TypeScript der Typdefinitionsdatei, welche als Kommentar zu referenzieren ist. Zur Laufzeit lädt System.js hingegen angular aus dem Ordner jspm_packages. Das liegt daran, dass jspm beim Beziehen von AngularJS einen entsprechenden Verweis in der Datei config.js platziert hat.
    /// <reference path="../scripts/typings/angularjs/angular.d.ts" />
    import { DemoCtrl } from './DemoCtrl';
    import * as angular from 'angular';
    var app = angular.module('app', []);
    app.controller('DemoCtrl', DemoCtrl);
    angular.element(document).ready(() => {
    angular.bootstrap(document, ['app']);
    });
  12. Erstellen Sie eine Index.html, welche unter anderem mit der von System.js bereitgestellten Funktion System.import die Datei app lädt.
    <!DOCTYPE html>
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head>
    <title></title>
    </head>
    <body>
    <div ng-controller="DemoCtrl as demo">
        <h1>{{demo.message}}</h1>
    </div>
    <script src="jspm_packages/system.js"></script>
    <script src="config.js"></script>
    <script>
        System.import('app/app').catch(console.error.bind(console));
    </script>
    </body>
    </html>
  13. Starten Sie Ihre Web-Anwendung. Sie sollten nun die Ausgabe Hallo Welt sehen.

    Download

    Das hier betrachtete Beispiel kann hier bezogen werden.

Jürgen Gutsch: Connecting the Raspberry PI without an existing network

Im Zuge meines Vortrages bei der dotnet Cologne 2015 stellte sich mir die Frage, was ich für ein Setup fahren soll, um mich auf meinem RPI zu verbinden und um auch die Demos laufen zu lassen.

Einige Überlegungen standen im Raum:

  • Sollte ich einen kleinen Router besorgen um ein Netzwerk aufzusetzen?
    • Das würde heißen ich muss noch mehr Elektronik mitnehmen. Das würde aber auch die sicherste Variante sein
    • Außerdem muss ich mich einmal in den RPI mit einem Bildschirm anmelden um die aktuelle IP herauszufinden.
  • Ein USB to Serial Adapter wäre zumindest eine Möglichkeit direkte Kommandos auf dem RPI auszuführen und auch Apps laufen zu lassen.
    • Allerdings ist es nicht möglich über diese Verbindung eine Website über Port 80 von Außen aufzurufen
    • Aber für alltäglichere Anforderungen ohne UI würde das der perfekte Weg sein.
  • Ein vorhandenes Netzwerk nutzen
    • Auch mit dieser Methode muss ich mich einmal mit einem Bildschirm auf den RPI verbinden um die aktuelle IP zu erhalten.

Im laufe der Recherche bin ich auf kleine Tools gestoßen, mit dem man unter Windows 8.1 ein WLAN einrichten und betreiben kann. Zuerst fand ich das kostenlose in .NET geschriebene Tool Virtual Router, das auf Anhieb funktionierte, allerdings musste ich auch hier entweder dem RPI eine statische IP vergeben (was nicht sofort gelang) oder ich muss mich ebenfalls über einen Bildschirm mit dem Gerät verbinden um die IP zu erhalten.

Die Lösung war dann ein Tool namens MyPublicWiFi, das die verbundenen Clients und deren IP Adresse anzeigt. Zudem kann man explizit einstellen ob die existierende Netzwerkverbindung an die WiFi Clients geteilt werden darf oder nicht. Somit konnte ich nun ganz normal per SSH mit dem RPI kommunizieren und das Gerät hat die Möglichkeit auf das Internet zuzugreifen um weitere Abhängigkeiten zu laden.

Weiterhin habe ich mein RPI so eingerichtet, dass er sich automatisch nach dem Systemstart mit dem existierenden WLAN Adapter am vordefinierten WLAN anmeldet.

Das reduziert nun mein Reisegepäck und ich habe vor Ort weniger Konfigurationsaufwand

Ich muss also nur

  1. das WiFi starten
  2. den RPI hochfahren
  3. die IP Adresse auslesen
  4. mich mit Putty per SSH am RPI anmelden

Kenne ich die IP, so kann ich also wie gewohnt mit dem RPI arbeiten. :)

Wie sich während dem Vortrag herausstellte, funktionierte dieses Setup einwandfrei und einige Teilnehmer nutzten sogar das WiFi um die Demo App direkt von Ihren Devices aufzurufen. :)

Jürgen Gutsch: Working with Git – Part 4: Pull Requests

Inhalt der Serie

Warum?

In verteilten Teams, wie es z. B. bei Open Source Projekten üblich ist, aber auch in anderen Projekten mit externen Entwicklern, hat sich der Pull-Request als Review-Werkzeug durchgesetzt.

Im Grunde geht es darum, eine Anfrage zu erstellen, um seine Änderung am Code in den Hauptzweig übernehmen zu lassen. Das funktioniert in der Regel so, das man seinen Feature-Branch auf den Server pusht und die Verantwortlichen fragt, dass sie die Änderungen anschauen und ggf. übernehmen.

Im Gegensatz zu dem vorherigen Blog-Artikel zu den Feature-Branches, wird der Branch nicht gleich in den Hauptzweig zurückgeführt, sondern erst den Reviewern zur Verfügung gestellt. In den meisten Fällen eben, indem der Branch auf den Server gepusht wird.

Pull-Requests sind kein eigentliches Git Feature, sondern werden von Plattformen wie Github oder Bitbucket bereitgestellt. Auch einige weitere Git-Hosting-Plattformen unterstützen Pull-Request. Ob der TFS das ebenfalls unterstützt, kann ich zum jetzigen Zeitpunkt nicht sagen.

Die einfachste Art eines Pull-Requests (sollte man nicht über einen entsprechendes Git-Hosting verfügen) ist es, eine Email an das Team, oder dem entsprechenden Verantwortlichen Reviewer zu schreiben, mit der Bitte um ein Review des Codes im entsprechenden Feature-Branch. Der Reviewer, kann dann den Änderungen entweder zustimmen oder ablehnen. Im Falle dass er zustimmt, kann er die Änderungen dann gleich in den Hauptzweig übernehmen.

In Bitbucket (und auf Github) funktioniert das über eine Web-UI. Auf Bitbucket wird der zuletzt gepushte Feature-Branch beim erstellen eines Pul-Requests vorausgewählt. Man wählt dann den Ziel-Branch und beschreibt dann den Pull-Request mit einem Titel und einer optionalen Beschreibung. Abschließend werden die Reviewer zugeordnet. Der Review passiert ebenfalls in der Web-UI. Auf Bitbucket hilft die Möglichkeit Kommentare im Review für den Autor direkt an einer diskussionswürdigen Code-Stelle zu hinterlegen. Antworten auf die Kommentare lassen eine direkte Kommunikation zu.

Pull-Requests im Projekt-Alltag

Im Gegensatz zu Open-Source-Projekten, gibt es vielen Projekten kein Kernteam, das für das Review verantwortlich ist. Bei der YooApps z. B. ist das gesamte Projekt-Team verantwortlich. Was auch externe Entwickler mit einbezieht. Auch steht kein offizieller Reviewer zur Verfügung. Aus diesem Grund ist jeder im Team auch ein Reviewer. Der Autor des Pull-Requests fügt mehrere mögliche Reviewer hinzu. Der nächste der Zeit hat, schaut sich den Code an und nur einer muss dem Pull-Request zustimmen. Anders ist das kaum zu lösen, da die Pull-Requests zu lange liegen würden, während in der Zwischenzeit weitere Änderungen passieren. Immerhin wird der Code so von mindestens vier Augen angesehen. Fragen zum Code sollten nach Möglichkeit direkt besprochen werden, aber auch das ist nicht immer möglich, daher werden die Kommentarfunktionen eher genutzt.

Der Merge in den Hauptzweig wird dann allerdings wieder vom Autor übernommen und nicht vom Reviewer. Das ist deshalb so, weil wir – wie im Beitrag über die Feature-Branches beschrieben – die letzten Änderungen des Hauptzweiges vor dem Merge in den Feature-Branch übernehmen um Merge-Konflikte nicht im Hauptzweig lösen zu müssen. Der Reviewer müsste also sonst den Feature-Branch des Autors ggf. lokal auf seine Maschine holen. Nachdem dem Pull-Request also zugestimmt wurde, kommt der Autor wieder dran und führt seien Feature-Branch sauber wieder zurück in den Hauptzweig. Bitbucket bietet die Möglichkeit, den Pull Request auch direkt über die Web-UI zu mergen, allerdings wird dass dann schwieriger, wenn es zu Konflikten kommt. Daher sagen wir, dass der Autor auch für den Merge verantwortlich ist. Eine nützliche Funktion auf Bitbucket dagegen ist die Möglichkeit den reviewten Feature-Branch nach dem merge in den Entwickler-Zweig zu löschen. Dadurch bleibt die Branch-Liste auf dem Server klein.

Nochmal im Schnelldurchlauf

  1. Feature-Branch erstellen
  2. Implementieren
  3. Den aktuellen Stand des Entwickler-Branches holen und in den Feature-Branch mergen
    (Die Punkte 2. und 3. wiederholen sich ggf. mehrfach)
  4. Den Feature-Branch pushen
  5. Pull-Request erstellen
  6. Nach dem Review ggf. nachbessern
  7. Den aktuellen Stand des Entwickler-Branches holen und in den Feature-Branch mergen
  8. Den Feature-Branch in den Entwickler-Branch mergen
  9. Änderungen im Entwickler-Branch pushen
  10. Feature-Branch lokal ggf. löschen

Hier sieht man, dass vor jedem Push auf jeden Fall der aktuelle Stand des Entwickler-Branches in den Feature-Branch geholt wird. Das macht das Review einfacher und der Aufwand für den Merge verringert sich, da die Unterschiede zwischen dem Feature-Branch und dem Entwickler-Branch nicht so groß sind.

Fazit

Soviel zu der Art wie ich mit Git arbeite. Eigentlich recht einfach, oder? Wer weitere Hilfe oder Tipps benötigt, ist im Netz eigentlich bestens aufgehoben. Unmengen von Tipps und Tricks, Tutorials und Dokumentationen helfen einem beim schnellen Einstieg in das Thema Git. In meinem Fall halte ich es pragmatisch: Git hat eine umfangreiche API mit fielen Befehlen und Möglichleiten, allerdings mache ich mit nicht die Mühe alle zu kennen. Die wichtigsten zehn Kommandos schreibe ich blind, den Rest schaue ich nach. Schließlich muss man nicht alles Wissen, sondern nur wo die nötigen Informationen zu finden sind. ;)

BTW: Git lässt sich sehr gut üben und kann z. B. perfekt mit einer Code-Kata in einem Codeing-Dojo verknüpft werden. Definiert einfach jede Anforderung als Feature und setzt konsequent Feature-Branches um, vieleicht sogar Pull-Requests, wenn es die Infrastruktur zulässt ;)

BTW2: Wer Unterstützung benötigt, um in das Thema Git hinein zu kommen, kann mich sehr gerne kontaktieren. Einzelfragen antworte ich sehr gerne direkt. Intensivere Git-Schulungen können wir von der YooApps aus sehr gerne anbieten und natürlich bin ich auch immer gerne für eine Session bei einer Usergroup zu haben.

Norbert Eder: #fotomontag #19

Jeden Montag ein Foto. Der #fotomontag.

Dieses Foto stammt aus dem Herbst vergangenen Jahres. Ich war zu Besuch in Leipzig und flanierte durch die Stadt. Eines der unzähligen Motive dieser Stadt ist das Kunstwerk Unzeitgemäße Zeitgenossen.

Unzeitgemäße Zeitgenossen

Unzeitgemäße Zeitgenossen

Bildinformationen:
22mm
ISO 100
f/4
1/60

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

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

Marco Scheel: Links for 2015-05-10 [del.icio.us]

Jürgen Gutsch: Slides zu meinem Vortrag auf der dotnet Cologne 2015

Die Slides zu meinem Vortrag zu ASP.NET 5 auf dem Raspberry PI auf der diesjährigen dotnet Cologne 2015 vom 8. Mai könnt ihr unter folgender URL ansehen oder herunterladen:

http://de.slideshare.net/juergengutsch/aspnet-on-the-raspberry-pi-2

Die gezeigte ASP.NET 5 App findet ihr unter https://github.com/JuergenGutsch/dnc-iot-rpi-demos. Dieser Link wäre nicht wirklich empfehlenswert, wenn nicht in älteren Commits die funktionierenden Beispiele für die Anbindung an die GPIOs enthalten wäre ;) Auch werde ich hier in Kürze diese Beispiele mit Frank Pfattheichers GPIO Treibern aktualisieren und comitten.

Ein Familientreffen

Die dotnet Cologne hat mir auch dieses Jahr wieder viel Spass gemacht und es hat mich gefreut mit einem Vortrag ein Teil dieser großartigen Konferenz zu sein. Besonders freut es mich jedes Mal die bekannten Gesichter wieder zu sehen, die das Event zu einer Art von Familientreffen werden lassen. :)

Jürgen Gutsch: Learning by Doing – Code-Katas und Coding-Dojos

Das Thema ist bereits älter, aber immer noch sehe ich diese Lernmethode kaum in irgendwelchen Firmen implementiert. Als Grund dafür wird oftmals fehlende Zeit genannt, allerdings möchte ich dieses Argument nicht gelten lassen. Daher möchte ich mit diesem Beitrag die Coding-Dojos noch mal beschreiben und noch mal zeigen wie diese Lernmethode in den Alltag integriert werden kann.

Dojos und Katas

Die Begriffe stammen bekanntlich aus dem Asiatischen Kampfsport. Ein Dojo bezeichnet einen Ort an dem man sich zum üben von Katas trifft. Eine Kata wiederum entspricht einer Kampfsport-Übung. Auf die Programmierung angewendet ist das ein Dojo ein Raum oder ein Zeitraum in dem man sich trifft um gemeinsam kleine Programmier-Aufgaben zu lösen. Wie auch im Kampfsport, kann man bei jedem Training immer wieder die selbe Aufgabe lösen, bis man diese perfekt beherrscht. Damit es allerdings nicht langweilig ist, kann man dabei jedes Mal einen anderen Focus setzen, wie z. B. konsequentes TDD, SOLID, konsequente Nutzung eines Tools oder einfach nur das Weglassen der Maus.

Warum?

Gemeinsames Lernen unterstützt den Teamgeist, steigert die Motivation und fördert ein gemeinsames Qualitätsbewusstsein. Daher sollte jedes Team die Zeit finden und die Zeit auch bekommen gemeinsam zu lernen Dinge besser und effektiver zu tun und neues zu lernen.

Es sollte nicht schwer sein, die benötigte Zeit freizuschaufeln. Eine Stunde pro Woche, pro Entwickler sollte reichen. Eine Stunde ist nicht teuer, wenn man bedenkt, dass dadurch eine Produktionssteigerung in der restlichen Zeit wahrscheinlich ist.

“Abwechslung bringt Kraft”

Das weiß jeder, der längere Zeit am selben Problem hängt und unmotiviert anfängt sich selber abzulenken. Eine Unterbrechung der Arbeit kann zur Lösung des aktuellen Problems beitragen. Das weiß jeder, dem beim Kaffee holen, auf dem WC, beim Schwätzchen mit dem Kollegen oder kurz vorm Einschlafen die zündende Idee kommt.

Warum also nicht eine Stunde pro Woche investieren um etwas Abwechslung zu verschreiben und dabei die Weiterbildung zu fördern?

Wie?

Die Zeit reicht aus im ein Coding-Dojo zum implementieren, indem sich das Team regelmäßig trifft um eine Code-Kata zu lösen. Dabei können 50 Minuten für das Coding reserviert werden und 10 Minuten für eine abschließende Retrospektive.

Die Katas sollten nach Möglichkeit keinen Bezug zur aktuellen Arbeit haben, um den nötigen Abstand zur Arbeit zu bekommen und um den Spaß an der Sache zu erhalten. Der Focus dem man beim ausführen der Kata setzt, darf natürlich schon einen Bezug haben. Neutrale Katas findet man im Internet Unmengen.

Im Grunde ist es Egal wie das Kata tatsächlich angegangen wird. Ist das Problem komplexer, macht es Sinn, ein gemeinsames Brainstorming zur Architektur zu machen. Dieses sollte allerdings nicht zu lang gehen, um noch Zeit zum Coden zu haben. Ist das Problem trivial und fokussiert man sich auf bestimmte Praktiken und Prinzipien der Softwareentwicklung kann man direkt mit der Programmierung starten.

BTW: Heute Abend zeige ich bei der .NET Usergroup Nordwest-Schweiz in Basel, wie so ein Coding Dojo funktioniert und wie ein Coding Dojo als regelmäßige Fortbildungsmaßname im Unternehmen eingeführt werden kann. Wie immer bin sehr ich gerne bereit das Prinzip auch in weiteren Usergroups vorzustellen. Natürlich bietet die YooApps auch sehr gerne eine Einführungsschulung zu diesem Thema an.

Sascha Dittmann: dotnet Cologne 2015 – Azure Service Fabric

dotnet Cologne 2015Das Event »von Entwicklern für Entwickler« fand dieses Jahr zum siebten mal statt und war – wie auch in den vergangenen Jahren – eine großartige Veranstaltung.
Auch ich durfte wieder mit einer Session aus dem Azure-Themenbereich dabei sein.
Diesmal drehte es ich in meiner Session um die Erstellung von Microservices mit der Azure Service Fabric.

Mittlerweile hat sich die Veranstaltung als eine der größten deutsche Community-Konferenzen für Entwickler im Microsoft-Umfeld etabliert.

Mit über 40 großartigen Sessions, in 7 Tracks, war es wieder ein besonders Erlebnis für alle Teilnehmer.
Ein großer Dank an das Orga-Team, die Sprecher und natürlich die vielen Helfer dafür!

Ich freue mich schon auf's nächste Jahr, wenn sich am 06. Mai 2016 wieder die Pforten der dotnet Cologne öffnen!

Azure Service Fabric – Erstellen von leichtgewichtigen Microservices

Neben den Slides und Code-Beispielen, möchte ich in diesem Jahr zusätzlich eine Aufnahme meiner Session bereitstellen…

Slides

Video

Der Beitrag dotnet Cologne 2015 – Azure Service Fabric erschien zuerst auf Sascha Dittmann.

Manfred Steyer: AngularJS-1.x-Code mit ES7-Dekoratoren kürzer und prägnanter gestalten – und dabei an 2.0 angleichen

Das neue EcmaScript-Sprachelement für Dekoratoren kommt zwar erst 2016 mit EcmaScript 7, jedoch findet man dafür jetzt schon breite Unterstützung. Beispielsweise unterstützen es Transpiler wie Babel genauso wie TypeScript 1.5. Und auch Angular 2 wird sich darauf stützen. Aus diesem Grund spricht auch nichts dagegen, heute schon Dekoratoren einzusetzen, um AngularJS-1.x-Code kürzer und prägnanter zu gestalten. Ganz nebenbei kann man damit auch den Code ähnlich wie Angular-2.0-Code gestalten und sich somit auf eine künftige Migration vorbereiten. Das hier gezeigte Beispiel soll veranschaulichen, wie der Entwickler das Registrieren von Controller mit Dekoratoren übernehmen kann. Es handelt sich um eine erweiterte Version meines Beispiels, welches die Nutzung des neuen Component Routers mit EcmaScript 6 und AngularJS 1.x zeigt. Dieses Beispiel nutzt eine Klasse AppController, welche Routen einrichtet. Da sich der Component Router am Prinzip Convention-over-Configuration orientiert, ist hierfür nicht allzu viel Code nötig:

class AppController {
     constructor($router) {
        $router.config([
            { path: '/',            component: 'home' },
            { path: '/flugbuchen',  component: 'flugBuchen' }
        ]);
    }
}

Wenn es jedoch um das Registrieren der Controller für den Router und seine Sub-Router geht, muss der Entwickler hingegen ein wenig mehr tippen. Das liegt unter anderem daran, dass AngularJS 1.x ein eigenes Modul-System hat. Dieses gilt es mit dem Modul-System von EcmaScript 6 in Einklang zu bringen. Zu diesem Zweck sind die einzelnen Controller über das EcmaScript-6-Modul-System zu beziehen und danach beim Angular-Modul der Wahl zu registrieren:

import angular from 'angular';
import newRouter from 'node_modules/angular-new-router/dist/router.es5';
import { HomeController } from 'home/home';
import { FlugBuchenController } from 'flug-buchen/flug-buchen';
import { PassagierController } from 'passagier/passagier';
import { FlugController } from 'flug/flug';
import { BuchenController } from 'buchen/buchen';
import { PassagierEditController } from 'passagier-edit/passagier-edit';
[…]
app.controller('AppController', AppController);
app.controller('HomeController', HomeController);
app.controller('FlugBuchenController', FlugBuchenController);
app.controller('PassagierController', PassagierController);
app.controller('FlugController', FlugController);
app.controller('BuchenController', BuchenController);
app.controller('PassagierEditController', PassagierEditController);

Dabei fällt auf, dass jeder Controller insgesamt dreimal erwähnt werden muss. Mit einem Dekorator, der sich um das Registrieren der Controller bei AngularJS kümmert, kann diese monotone und somit auch fehleranfällige Aufgabe vereinfacht werden. Ein solcher Dekorator findet sich im nächsten Listing. In Anlehnung an Angular 2 nennt er sich Component. Er nimmt vom Entwickler optional den Namen des AngularJS-Moduls, in dem der Controller einzurichten ist, entgegen. Gibt er diesen Namen nicht an, kommt der Modul-Name app zum Einsatz. In weiterer Folge besteht die Aufgabe von Component darin, den Controller einem Registry-Objekt bekannt zu machen. Zusätzlich setzt er die Eigenschaft $inject, um dem DI-Mechanismus von Angular 1.x die Namen der zu injizierenden Objekte bereit zu stellen, sofern der Entwickler Informationen hierfür über die Eigenschaft injectables übergeben hat. Auch dieser Name wurde in Anlehnung an Angular 2 gewählt. Die Methode toModule der Registry übernimmt sämtliche registrierten Controller in das festgelegte AngularJS-Modul. Somit hat der Entwickler die Möglichkeit, durch Aufruf dieser Methode festzulegen, wann das Registrieren des Controllers erfolgen soll. Dies ist notwendig in Fällen, wo die Definition der Controller vor der Definition des Angular-Moduls erfolgt.

import angular from 'angular';

export function Component(options) {

    if (!options) options = {};
    moduleName = options.module || 'app';
    return function(target) {
        Registry.controllers.push({
            controller: target,
            name: target.name,
            moduleName: moduleName
        });

        if (options.injectables) {
            target.$inject = options.injectables;   
        }
    }
}

export var Registry = {
    controllers: [],
    toModule(angularModule) {
        angular.forEach(Registry.controllers, (entry) => { 

            angular
                .module(entry.moduleName)
                .controller(entry.name, entry.controller);

            this.controllers = [];

        });    
    }
}

Um Controller mit dem gezeigten Dekorator zu registrieren, muss der Entwickler sie lediglich damit annotieren. Die Angabe der injectables ist dabei optional. import { Component } from 'decorators/ng-decorators';

@Component({
    injectables: ["$log"]
})
export class HomeController {
    constructor($log) {
        this.$log = $log;
        $log.log("HomeController wurde gestartet");
    }
}

Beim Start der Anwendung sind zunächst die gewünschten Controller via import einzubinden. Im Zuge dessen definiert der Code die Controller und bringt somit auch den Controller-Dekorator zur Ausführung. Im Anschluss daran ist das AngularJS-Modul zu erzeugen. Die besprochene Methode Registry.toModule kümmert sich um das Registrieren der Controller.

import angular from 'angular';
import newRouter from 'node_modules/angular-new-router/dist/router.es5';
import { HomeController } from 'home/home';
import { FlugBuchenController } from 'flug-buchen/flug-buchen';
import { PassagierController } from 'passagier/passagier';
import { FlugController } from 'flug/flug';
import { BuchenController } from 'buchen/buchen';
import { PassagierEditController } from 'passagier-edit/passagier-edit';
import { Registry } from 'decorators/ng-decorators';

var app = angular.module('app', ['ngNewRouter']);
Registry.toModule(app);

Die hier beschriebene Idee wurde auch schon von der Community aufgegriffen. Eine umfangreiche Implementierung, welche neben Controller auch anderen Angular-Konstrukte wie Direktiven, Services oder Filter unterstützt, findet man unter [1]. Das hier gezeigte Beispiel ist unter [2] zu finden.

Links

Holger Sirtl: Azure News on Friday (KW20/15)

Auch diese Woche gab’s wieder viele Nachrichten zur Data Factory, SQL Database, Azure Storage, Service Fabric, Application Insights, Blob Storage, DocumentDB und viele weitere Azure Services. Hier sind nähere Infos dazu…

Datum Nachricht
07.05. Azure Friday: Azure Search mit Liam Cavanagh
Diese Woche gibt’s auch wieder zwei Azure Friday Videos zu Azure Search:
Azure Search 104 - Multilingual Azure Search
Azure Search 103 - Azure Search Suggestions
07.05. Cloud Foundry auf Azure
Cloud Foundry ist eine Open Source PaaS Plattform, die unabhängig von einer konkreten Cloud Plattform ist und verschiedene Sprachen wie Java, Ruby, Python etc. unterstützt. Auf diesem Blog gibt’s nähere Infos zu Cloud Foundry auf Azure.
07.05. Neue grafische und textuelle Authoring-Features für Azure Automation
Mit Azure Automation lassen sich administrative Arbeiten in Azure einfach als Workflows (Runbooks) definieren und entsprechend ausführen. Neu sind Tools, die die Erstellung solcher Runbooks vereinfachen.
07.05. Power BI Ausgaben ist jetzt Public Preview in Azure Stream Analytics
07.05. Neue DocumentDB SQL Schlüsselwörter, Operatoren und Funktionen
Zu den neuen Schlüsselwörtern gehören “IN” und “BETWEEN”. Zu den neuen Operatoren gehören “Ternary(?)”, “Coalesce (??)” und bitweise Shift-Operationen.
05.05. Neue Networking Funktionen
Zu den neuen Funktionen gehören ExpressRoute Premium, ExpressRoute for Office 365, User Defined Routes und Parallelbetrieb von Site-to-Site VNet und ExpressRoute.
05.05. Gründe, aus denen Unternehmen ihr Data Warehouse auf Azure betreiben sollten
Dieser Blog gibt einen Überblick über einige Funktionen von Azure SQL Data Warehouse und beschreibt deren Vorteile für Unternehmen.
05.05. Neue Import-Möglichkeiten für DocumentDB
Die neuen Möglichkeiten umfassen Imports aus Azure Table Storage, und JSON-, CSV- und MongoDB-Datenquellen, die über eine URL zugreifbar sind.
04.05. Neuer MVA-Kurs: Windows Azure Pack: Database as a Service (DBaaS)
In diesem Kurs der Microsoft Virtual Academy dreht sich alles rund um die Möglichkeiten, Datenbanken als Service im eigenen Rechenzentrum bereitzustellen.
04.05. Neuer MVA-Kurs: Developing Solutions with Azure DocumentDB
Dieser Kurs der Microsoft Virtual Academy hat den Schwerpunkt Azure DocumentDB und zeigt, wie damit komplexe Anwendungen erstellt werden können.
01.05. Azure Data Factory unterstützt jetzt Azure Batch Prozesse
ADF unterstützt jetzt auch eigene .NET Activities, die über Azure Batch ausgeführt werden.

Manfred Steyer: Unterlagen zu meiner Session über moderne Security-Szenarien mit OAuth 2.0, OpenId Connect und ASP.NET von DotNet Cologne

Nachfolgend die Unterlagen zu meiner Session über moderne Security-Szenarien mit OAuth 2.0, OpenId Connect und ASP.NET von DotNet Cologne.

Download

friends header

bloggers headline

links header

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