.
Anmeldung | Registrieren | Hilfe

.NET-Blogs Archiv Juni 2011

StyleCop Upgrade Dialog verhindern

30.06.2011 20:33:00 | Martin Hey

StyleCop ist ein wirklich gutes Tool zur Unterstützung der Durchsetzung von Coding Guidelines. Mit Version 4.5 ist es auch nicht mehr notwendig zusätzlicher AddOns zu installieren, damit es sich automatisch in Resharper integriert - das übernimmt alles die Installationsroutine von StyleCop.
 
Seit der Installation beglückt mich StyleCop nun aber jeden Morgen mit der freudigen Nachricht, dass es wieder eine neue Version zum Herunterladen gibt, die ich doch bitte installieren soll. Vielleicht waren die Releasezyklen von StyleCop auch bisher so kurz und ich habe es nur nicht gemerkt, weil es dieses Check-Feature bisher nicht gab. Auf jeden Fall kann dieser Dialog ganz schön nervig sein, da er wenn man ihn denn mit Nein beantwortet, bei jedem Start von Visual Studio wieder kommt und es keine offensichtliche Möglichkeit gibt, diesen zu unterbinden.
 
Für das Problem gibt es zwei Lösungen:
Die erste Lösung setzt voraus, dass man Resharper installiert. In diesem Fall gibt es in den Optionen von Resharper unter dem Punkt Tools/StyleCop die Möglichkeit, einzustellen, ob und wann StyleCop nach Upgrades suchen soll. Im Standard ist hier "Every Time Visual Studio starts" aktiviert.
Die zweite Lösung ist das manuelle Setzen der Einstellungen in der Registry. Die Einstellungen finden sich dort unter HKEY_CURRENT_USER\Software\CodePlex\StyleCop.
 
Wenn man der Diskussion auf Codeplex und der dort genannten Releaseplanung Glauben schenken darf, wird es in Version 5.0 von Stylecop auch eine Möglichkeit geben, diese Einstellung direkt über einen von StyleCop mitgelieferten Konfigurationsdialog zu editieren (für all die Anwender, die kein Resharper haben).

Treffen der .NET Developer Group Braunschweig - ASP.NET MVC Lokalisieren

30.06.2011 04:32:00 | Lars Keller

Die DNUG Braunschweig trifft sich am 15.06.2011 um 19:00 Uhr im Restaurant Zucker (Tagungsraum). Uns kommt Daniel Fisher mit einem Vortrag über ASP.NET MVC besuchen.

Abstract:
Die neue Plattform zum Entwickeln von Web-Anwendungen auf der .NET Plattform bringt viele neue und produktivitätssteigernde Features mit sich. Dabei bleibt es nicht aus, dass einige alte Konzepte über Bord geworfen werden. Die Lokalisierung von Web-Anwendungen wie sie zu *klassischen ASP.NET* Zeiten ablief ist eines davon. Daniel Fisher zeigt Ansätze und Lösungen aus der MVC-Praxis für den Alltag.

BIO:
Daniel entwickelt seit 1995 Software (seit 1999 auf der .NET Plattform) und verfügt über Projekterfahrung als Entwickler, Architekt, Projektleiter und Berater aus den Branchen Versicherung, Großhandel, Mobilfunk und Bankwesen. Er ist Leiter der .NET-Entwickler-User-Group Niederrhein (www.netug-niederrhein.de) und Vorstand der Just Community e.V. (www.justcommunity.de), dem Veranstalter des größten regionalen Community-Events für Software-Entwickler und IT-Professionals (www.nrwconf.de). Sie finden sein Blog unter www.lennybacon.com.

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

Service Pack 1 für MS Office 2010, SharePoint 2010 und Office 365 sind released

28.06.2011 13:54:00 | Lars Keller

Ab heute gibt es das Service Pack 1 für MS Office und SharePoint 2010 zum Download:

 

Alle Infos, was in den Service Pack enthalten sind, findet Ihr bei den Links. Außerdem ist heute Office 365 released wurden. Endlich! :-)

Ein kleiner Kindheitstraum koennte in Erfuellung gehen!

27.06.2011 16:16:29 | Kay Giza

Ein kleiner Kindheitstraum könnte in Erfüllung gehen! Ich bin gerade auf dem Weg nach Dortmund und Köln, wo ich während deutschlandweiten Roadshow von MSDN für Entwickler, der MSDN on Tour, mich freue Sie begrüßen zu dürfen und Sie mit dem einen oder anderen Trick sowie Informationen versorgen zu dürfen während meines Vortrags: "MSDN unplugged - Tipps & Tricks für Entwickler Schneller zum Ziel in wenigen Schritten". Aber zurück zum Kindheitstraum: Ich wollte schon immer... [... mehr in diesem Blogeintrag auf Giza-Blog.de]

This post is powered by www.Giza-Blog.de | Giza-Blog.de: RSS Feed
© Copyright 2006-2011 Kay Giza. All rights reserved. Legal
Subscribe

Neu: Die MSDN Coding Class - fuer Programmiereinsteiger

27.06.2011 15:11:36 | Kay Giza

Das Lernangebot von MSDN Online Deutschland ist um ein weiteres kostenloses Angebot reicher. Neben zahlreichen Fortbildungsangeboten, wie beispielsweise MSDN Solve, die MSDN Webcasts oder die MSDN Library hat heute offiziell die MSDN Coding Class gestartete. Sie richtet sich an Programmiereinsteiger und möchte diese bei den ersten Schritten in der Welt des Programmierens bestmöglich unterstützen. Computer und Software sind aus unserem täglichen Leben nicht mehr wegzudenken. Vielleicht haben Sie sich ja schon einmal gefragt, wie ein Programm erstellt wird, wie es aufgebaut ist, oder ob sie vielleicht sogar selbst lernen könnten, Software zu programmieren. Egal was Ihre Beweggründe sein mögen: die Coding Class des Microsoft Developer Networks (MSDN) möchte Sie bei den ersten Schritten in die aufregende Welt des Programmierens unterstützen... [... mehr in diesem Blogeintrag auf Giza-Blog.de]

This post is powered by www.Giza-Blog.de | Giza-Blog.de: RSS Feed
© Copyright 2006-2011 Kay Giza. All rights reserved. Legal
Subscribe

.NET Information Day 2011–Ich bin dabei!

26.06.2011 02:37:00 | Lars Keller

Ich freue mich, dass ich das zweite Mal beim .NET Information Day dabei bin. Dieser findet am 28.06.2011 in Darmstadt statt. Ein Tag lang wird über die Vielfältigkeit von .NET gesprochen. Die Themen sind von Windows Phone 7, Lightswitch, Multithreading, Windows Azures, Nuget, MEF, ASP.NET/MVC, Zukunftsaussichten HTML5/Windows 8 bis zur MS Office Entwicklung mit VSTO! Diese Veranstaltung richtet sich an Einsteiger, Fortgeschrittene, Profi, Hobbyisten und Studenten.

Was mich besonders freut ist, dass hinter der Veranstaltung MS Studenten und die DNUG Frankfurt stecken. Community informiert! :-)

Wir sehen uns da!

Webcast Serie: Einführung in die Workflow Foundation 4–Die ersten Schritte…

22.06.2011 11:09:03 | Gregor Biswanger

Nach meiner ersten Webcast Serie “Silverlight in Deep” ist ab heute meine zweite Webcast Serie gestartet. Diesmal handelt es sich allerdings nicht um Silverlight, sondern um ein weiteres spannendes Thema mit der neuen Workflow Foundation 4.

Überblick der Serie “Einführung in die Workflow Foundation 4”:

Teil 1 – Die ersten Schritte

Teil 2 – Hosting und Activities

Teil 3 – Bookmarks und Workflow Extensions

Teil 4 - Workflows persistieren

Teil 5 - WCF Workflow Services

http://www.microsoft.com/germany/msdn/webcasts/serien/MSDNWCS-1106-02.mspx

 

Die ersten Schritte

Die erste Folge dieser Einführungsserie zeigt den technischen Aufbau der neuen Workflow Foundation 4.0 (WF) und geht auf wichtige Architekturaspekte der komponentenorientierten Entwicklung ein. Dazu gibt Gregor Biswanger einen allgemeinen Überblick.

image

http://www.microsoft.com/germany/msdn/webcasts/library.aspx?id=1032487426

Neuer Download: MSDN und TechNet Hilfe- und Support-Flyer (3. Auflage)

21.06.2011 17:51:01 | Kay Giza

Eine kompakte Zusammenstellung aller kostenfreien und kostenpflichtigen Microsoft-Supportleistungen für Entwickler wie auch für IT-Professional liefert unser - am heutigen Dienstag 21.06.2011 - neu aufgelegter Hilfe- & Support-Flyer, der im PDF- sowie XPS-Format zum kostenfreien Download bereitsteht... [... mehr Informationen + Download-Link in diesem Blogeintrag auf Giza-Blog.de]

This post is powered by www.Giza-Blog.de | Giza-Blog.de: RSS Feed
© Copyright 2006-2011 Kay Giza. All rights reserved. Legal
Subscribe

404 Fehlerbehandlung in BlogEngine.NET 2.0

19.06.2011 15:59:00 | Klaus Bock

BlogEngine.NET

Wie ich bereits in den beiden früheren Artikeln BlogEngine.NET und 404 Fehler sowie Eine bessere 404 Fehlerbehandlung in Blogengine.NET beschrieben habe, gibt die 404-Fehlerbehandlung von BlogEngine.NET immer wieder Anlass zur Kritik. Auch in der aktuellen Version 2.0 hat sich daran kaum etwas geändert. Zwar wird per Standard in der web.config richtigerweise die Methode ResponseRewrite zur Weiterleitung auf die Fehlerseite angegeben, aber damit erschöpft es sich auch schon in einer sauberen Behandlung von 404-Fehlern.

Als gröbsten Fehler sehe ich hier den zurückgelieferten Statuscode 200 OK an, wenn die Fehlerseite error.aspx angezeigt wird. Für einen Benutzer mag das keine Rolle spielen, aber die Bots von Suchmaschinen sehen das ganz anders. Da wird die angezeigte Fehlerseite statt der falsch angeforderten Seite in den Index eingetragen. Für die Suchmaschinen ist demzufolge die eigentlich nicht vorhandene Seite sehr wohl vorhanden.
Dem kann leicht abgeholfen werden, in dem mit der Fehlerseite error404.aspx auch der Statuscode 404 ausgeliefert wird. Dazu einfach, am Ende der Methode Page_Load, den Statuscode 404 an die Eigenschaft StatusCode des Response-Objekts übergeben.

Page.Title += Server.HtmlEncode(" - " + "Seite nicht gefunden");
Response.StatusCode = (int)HttpStatusCode.NotFound;

Diese kleine Maßnahme zeigt sofort den gewünschten Effekt. Ohne 302-Weiterleitung wird sofort der Status 404 zurückgegeben.

Statuscode 404 mit ResponseWrite

Eine weitere, sehr unschöne, Tatsache stellt der Versuch der Verwendung des Wertes aspxerrorpath aus dem QueryString dar. Dieser Wert wird bei der Verwendung der ResponseWrite Methode von ASP.NET nicht mehr erzeugt. Somit wurde ein sehr schönes Feature der Seite error404.aspx, die Suche nach ähnlichen Seiten wie der angegebenen, komplett ausgehebelt.
Nun, mit einem kleinen Eingriff in die Fehlerseite error404.aspx lässt sich dieser Umstand wieder beheben wie folgender Screenshot zeigt. Dabei wird bei der, aus obigem Screenshot, falsch angeforderten Seite BlogEngine.NET Update auf Version 2.0.0.69 die richtige Seite BlogEngine.NET Update auf Version 2.0.0.66 vorgeschlagen.

error404.aspx

Da, wie bereits oben angesprochen, der Eintrag aspxerrorpath im QueryString nicht mehr zur Verfügung steht, muss der Pfad der falsch angeforderten Seite auf andere Weise ermittelt werden. Am besten eignet sich hierfür die Eigenschaft Message der zuletzt geworfenen Ausnahme. Da ASP.NET auf die Fehlerseite eines 404-Fehlers umgeleitet hat, sollte auch ein solcher von der Methode GetLastError des Server-Objekts der aktuellen Seite zurückgegeben werden. Jetzt muss nur noch der Pfad der nicht gefundenen Seite aus der Fehlernachricht extrahiert werden und der Ablauf kann erfolgen wie bisher. Um den Pfad der falsch angeforderten Seite für die gesamte Klasse zur Verfügung zu stellen, speichere ich diesen in einer klassenweiten Variablen.
Um die Änderungen ersichtlicher zu gestalten, habe ich den ursprünglichen Code nur auskommentiert. Als erstes wird die Methode Page_Load angepasst:

/// <summary>
/// Hält den Pfad der falsch angeforderten Seite
/// </summary>
/// <remarks>n/a</remarks>
private string errorPath;
protected void Page_Load(object sender, EventArgs e)
{
    this.errorPath = this.Request.QueryString["aspxerrorpath"];
    var ex = this.Server.GetLastError();
    if (string.IsNullOrEmpty(this.errorPath) && ex != null)
    {
        var index = ex.Message.IndexOf("/post/");
        var temp = ex.Message.Substring(index);
        this.errorPath = temp.Substring(0, temp.IndexOf(" "));
    }
    //if (Request.QueryString["aspxerrorpath"] != null
    //  && Request.QueryString["aspxerrorpath"].Contains("/post/"))
    if (!string.IsNullOrEmpty(this.errorPath) && this.errorPath.Contains("/post/"))
    {
        DirectHitSearch();
        divDirectHit.Visible = true;
    }
    else if (Request.UrlReferrer == null)
    {
        divDirectHit.Visible = true;
    }
    else if (Request.UrlReferrer.Host == Request.Url.Host)
    {
        divInternalReferrer.Visible = true;
    }
    else if (GetSearchKey() != string.Empty)
    {
        SearchTerm = GetSearchTerm(GetSearchKey());
        BindSearchResult();
        divSearchEngine.Visible = true;
    }
    else if (Request.UrlReferrer != null)
    {
        divExternalReferrer.Visible = true;
    }
    Page.Title += Server.HtmlEncode(" - " + "Seite nicht gefunden");
    Response.StatusCode = (int)HttpStatusCode.NotFound;
}

Damit mögliche passende Seiten vorgeschlagen werden können, muss auch die Methode DirectHitSearch eine kleine Änderung erfahren:

private void DirectHitSearch()
{
    string from = this.errorPath; //Request.QueryString["aspxerrorpath"];
    int index = from.LastIndexOf("/") + 1;
    string title = from.Substring(index)
        .Replace(".aspx", string.Empty).Replace("-", " ");
    List<IPublishable> items = Search.Hits(title, false);
    if (items.Count > 0)
    {
        LiteralControl result = new LiteralControl(
            string.Format(
                "<li><a href=\"{0}\">{1}</a></li>",
                items[0].RelativeLink.ToString(),
                items[0].Title));
        phSearchResult.Controls.Add(result);
    }
}

 

Fazit:

Dies war bestimmt nicht die letzte Anpassung von Fehlerseiten unter BlogEngine.NET.
Für Heute oder Morgen war ursprünglich der Release Kandidat für BlogEngine.NET 2.5 angekündigt. Da im Moment das Repository auf CodePlex beschädigt ist, wird sich die Veröffentlichung ein wenig verzögern.
BlogEngine.NET hat sich seit der Veröffentlichung der Version 2.0 sehr zum Positiven verändert. Es wurde und wird viel für eine breitere Akzeptanz getan. Doch solange sich solche “Feature” im Code verbergen, wird sich an der breiten Meinung: “nur für .NET Bastler” nicht viel ändern.

Technorati-Tags: | | |

Premier Support for Developers (PSfD): Entwicklerunterstuetzung von Microsoft [Gastartikel]

18.06.2011 12:55:51 | Kay Giza

Gastartikel von Armin Wegner: Mit Premier Support for Developers (PSfD) bieten wir Ihnen als Entwicklungsabteilung im Unternehmen ein hochwertiges Leistungspaket an, das genau auf den Bedarf von Softwareentwicklern abgestimmt ist: Beratung und Support für den gesamten Entwicklungszyklus Ihrer Software-Projekte.Als Entwickler benötigen Sie zur Sicherung Ihrer Projekte und Ihres technologischen Vorsprungs laufenden Transfer von Know How und Produkt-Support aus erster Hand. Damit können Sie sich darauf konzentrieren, Lösungen für Ihre Kunden noch schneller und mit noch höherer Qualität zu entwickeln.Ihr zentraler Ansprechpartner bei Premier Support for Developers ist der Application Development Consultant. Er berät Sie individuell nach Ihren Anforderungen und bei allen Fragen rund um das Entwickeln mit Microsoft Technologien. Zusätzlich beinhaltet PSfD Zugang zum Microsoft Produkt-Support, der Ihnen jeden Tag und rund um die Uhr für die Lösung von technischen Problemen zur Verfügung steht. In diesem Artikel erfahren Sie alle Informationen über die Premier Support for Developers (PSfD) von Microsoft Mitarbeiter Armin Wegner... [... mehr]

This post is powered by www.Giza-Blog.de | Giza-Blog.de: RSS Feed
© Copyright 2006-2011 Kay Giza. All rights reserved. Legal
Subscribe

Wie kann ich meine BlogEngine.NET Erweiterungen lokalisieren?

15.06.2011 17:09:00 | Klaus Bock

BlogEngine.NET

Die unter BlogEngine.NET verwendeten Extensions, zum Erweitern des Funktionsumfangs, bieten keine der üblichen Möglichkeiten um die Textausgabe dieser Erweiterungen zu lokalisieren. Diese Erweiterungen sind im Normalfall Klassen, die mit dem Extension-Attribut versehen und im App_Code-Ordner einer BlogEngine Installation im Unterordner Extensions abgelegt werden. Eine klassenbezogene Lokalisierung ist im .NET Framework nicht vorgesehen.
BlogEngine bietet lediglich die Methode Translate der Utils-Klasse um Zeichenfolgen mit Hilfe der globalen Ressourcen zu übersetzen. Um diese Option zu nutzen, müssen alle zu verwendenden Zeichenfolgen in den globalen Ressourcen der Webanwendung vorhanden sein.
Also auch kein gangbarer Weg, da der Aufwand bei Aktualisierungen der globalen Ressourcen einfach zu groß währe.

Ich entschied mich für die Verwendung von statischen Klassen als geschachtelte Typen innerhalb meiner Erweiterungen. Eine anwendungsweite Lösung erschient mir nicht praktikabel, da gerade Erweiterungen oft einzeln verteilt und verwendet werden. Wenn jetzt noch jedes mal eine zusätzliche Assembly mit verteilt werden soll, kann die einfache Handhabung der Erweiterungen schnell unübersichtlich und unnötig kompliziert werden.

In meinem Ansatz mache ich mir die Tatsache zu nutze, dass in den Einstellungen des Blog jederzeit die verwendete Spracheinstellung abrufbar ist. Von der ausgegebene Einstellung, z.B.: de-DE, verwende ich lediglich das Sprachschema. Auf die regionalen Unterschiede zwischen de-DE und de-AT habe ich bewusst verzichtet, da ich nur Zeichenfolgen darstellen will.
So kann in einem switch/case-Block, entsprechend der eingestellten Sprache, die jeweils zugehörige Zeichenfolge ermittelt werden.
Da die geschachtelte Klasse als statisch deklariert ist, können die enthaltenen Eigenschaften, wie von der Resource-Klasse gewohnt, einfach direkt verwendet werden.

/// <summary>
/// Konvertiert die Style-Attribute von Html-Images in
/// eine entsprechende CSS-Klasse.
/// </summary>
/// <remarks>n/a</remarks>
[Extension(
    "Converts the style attributes of Html-Images to the corresponding CSS class.",
    "1.5.0.0",
    "<a href=\"http://blog.klaus-b.net/\">klaus_b</a>")]
public class ConvertStyleToCss
{
    // Hier andere Member der Klasse
    #region Methods
    private static void InitialiceSettings()
    {
        var settings = new ExtensionSettings("ConvertStyleToCss") { IsScalar = true };
        settings.AddParameter(
            "leftImg",
            LocalResources.LeftImg,
            50,
            true,
            false,
            ParameterType.String);
        settings.AddValue("leftImg", "leftImg");
        settings.AddParameter(
            "rightImg",
            LocalResources.RightImg,
            50,
            true,
            false,
            ParameterType.String);
        settings.AddValue("rightImg", "rightImg");
        settings.AddParameter(
            "centerImg",
            LocalResources.CenterImg,
            50,
            true,
            false,
            ParameterType.String);
        settings.AddValue("centerImg", "centerImg");
        settings.AddParameter(
            "cleanWlwDivs",
            LocalResources.CleanWlwDivs,
            4,
            false,
            false,
            ParameterType.Boolean);
        settings.AddValue("cleanWlwDivs", false);
        // TODO: Hilfe erzeugen und einfügen
        ConvertStyleToCss.setting = ExtensionManager.InitSettings(
            "ConvertStyleToCss",
            settings);
    }
    #endregion Methods
    #region Nested Types
    /// <summary>
    /// Stellt lokalisierte Zeichenfolgen als Ressourcen bereit.
    /// </summary>
    /// <remarks>Wird nur von der übergeordneten Klasse verwendet.</remarks>
    private static class LocalResources
    {
        #region Fields
        /// <summary>
        /// Hält die eingestellte Kultur des Blogs.
        /// </summary>
        /// <remarks>n/a</remarks>
        private static readonly string blogCulture = BlogSettings.Instance.Culture;
        /// <summary>
        /// Hält die zu verwendende Sprache des Blogs.
        /// </summary>
        /// <remarks>n/a</remarks>
        private static readonly string culture = blogCulture.Substring(0, 2);
        /// <summary>
        /// Hält den zu verwendenden Hilfetext.
        /// </summary>
        /// <remarks>n/a</remarks>
        private static string helpText;
        #endregion Fields
        #region Properties
        internal static string CenterImg
        {
            get
            {
                switch (culture)
                {
                    case "de":
                        return "Die CSS-Klasse für zentrierte Bilder:";
                    default:
                        return "CSS class for centered images:";
                }
            }
        }
        internal static string CleanWlwDivs
        {
            get
            {
                switch (culture)
                {
                    case "de":
                        return "WLW DIVs bereinigen:";
                    default:
                        return "Clean WLW DIVS:";
                }
            }
        }
        internal static string HelpText
        {
            get
            {
                if (string.IsNullOrEmpty(helpText))
                {
                    switch (culture)
                    {
                        case "de":
                            helpText = CreateGermanHelpText();
                            break;
                        default:
                            helpText = CreateEnglishHelpText();
                            break;
                    }
                }
                return helpText;
            }
        }
        internal static string LeftImg
        {
            get
            {
                switch (culture)
                {
                    case "de":
                        return "Die CSS-Klasse für links ausgerichtete Bilder:";
                    default:
                        return "CSS class for left aligned images:";
                }
            }
        }
        internal static string RightImg
        {
            get
            {
                switch (culture)
                {
                    case "de":
                        return "Die CSS-Klasse für rechts ausgerichtete Bilder:";
                    default:
                        return "CSS class for right aligned images:";
                }
            }
        }
        #endregion Properties
        #region Methods
        private static string CreateEnglishHelpText()
        {
            var sb = new StringBuilder();
            // TODO: create english help text
            return sb.ToString();
        }
        private static string CreateGermanHelpText()
        {
            var sb = new StringBuilder();
            // TODO: deutschen Hilfetext erzeugen
            return sb.ToString();
        }
        #endregion Methods
    }
    #endregion Nested Types
}

Im Moment habe ich die switch/case-Blöcke so gestaltet, dass bei allen anderen Sprachen außer Deutsch, ein englischer Text ausgegeben wird. Da ich die Konfigurationsoberfläche meiner Erweiterungen gerne in der Sprache meines Blog darstelle, denke ich eine gangbare Lösung für Anwender meiner Erweiterungen gefunden zu haben, die andere Sprachen bevorzugen.

Fazit:

Die Lokalisierung von Oberflächen, Meldungen und anderen Textausgaben sollte eigentlich schon lange den Kinderschuhen entwachsen sein. Leider muss ich immer wieder feststellen, dass dem nicht so ist. Entweder liegt dieser Umstand an den jeweiligen Entwicklern die es nicht für nötig erachten ihre Anwendungen zu lokalisieren, oder aber die entsprechenden Technologien erscheinen zu kompliziert um in jeder Anwendung einfach verwendet werden zu können.

Technorati-Tags: | | |

Download: Visual Studio 2010 and .NET Framework 4 Training Kit June 2011 Release

15.06.2011 08:14:41 | Kay Giza

1,75 GB, über 19.000 Dateien - das ist der Download des 'Visual Studio 2010 and .NET Framework 4 Training Kit' June 2011 Release. Der kostenfreie Download beinhaltet Hands-on Labs und Demos zu Visual Studio 2010, .NET Framework 4 und vielen anderen Technologien und Services. Umfassende Informationen und Download-Links sowie weiterführende Informationen finden Sie in diesem Blogeintrag auf Giza-Blog.de... [... mehr]

This post is powered by www.Giza-Blog.de | Giza-Blog.de: RSS Feed
© Copyright 2006-2011 Kay Giza. All rights reserved. Legal
Subscribe

Jürgen und Silverlight - XAML Braindumps

15.06.2011 01:58:00 | Jürgen Gutsch

Seit letztem November darf ich mich in Silverlight rein arbeiten und seit Februar produktiv eine vorhandene verteilte Anwendung auf Silverlight migrieren.

Das ist mit ein Grund, wieso es hier in meinem Blog in Sachen ASP.NET (und generell) etwas ruhiger geworden ist. Der zweite Grund ist, dass ich seit April stolz zweifacher Vater bin und die Familie einen noch größeren Stellenwert einnimmt als sie es bisher schon getan hat :-)

Wieder zurück zu Silverlight: Das zweite Steckenpferd ist das Windows Phone 7, bzw. die Entwicklung von Anwendungen für das WP7. Aus diesem Grund habe ich mich dazu entschlossen auch etwas über Silverlight und WP7 zu schreiben. Allerdings werde ich das nicht hier in diesem Blog tun, sonder in Englischer Sprache in einem separaten Blog, das mir vom englischsprachigen DotnetKicks-Team zur Verfügung gestellt wurde: http://blogs.dotnetkicks.com/juergengutsch

Das zum Teil schlechte English ist zu entschuldigen, aber dieser Blog soll auch dazu dienen mehr Routine in mein schriftliches Englisch zu bringen. Ist also in erster Linie als Ablage und als Plattform zur Weiterentwicklung für mich persönlich gedacht.

Wer dennoch Interesse an den Themen hat, ist herzlich eingeladen mit zu lesen :-)

PS:
Wo wir doch gerade beim WP7 waren. Pünktlich zur See# Party habe ich auch meine erste Anwendung passend zur Konferenz veröffentlicht. Mehr dazu im letzten Post

DotNetKicks-DE Image

Neues von der See# Party 2011

15.06.2011 01:56:00 | Jürgen Gutsch

Auch zur See# Party 2011 gibt es einiges Neues zu erzählen:

Die Anmeldung ist offen

Wer sich also Günstig informieren möchte, viele Top-Sprecher erleben möchte und abwechslungsreiche Beiträgen lauschen möchte, sollte sich umgehend anmelden. Dank unseren Sponsoren gibt es auch wieder viele tolle Gewinne, die am Ende der Veranstaltung unter allen Teilnehmern verlost werden.

Direkt zur Anmeldung: http://www.seesharpparty.de/anmeldung

.NET-Coding-Dojo

Auch dieses Mal wird es wieder ein .NET-Coding-Dojo geben, das am Abend stattfindet und von Golo Roden und David Tielke moderiert wird. Auch das ist nur unseren Sponsoren zu verdanken, denn auch Abend will gegessen und getrunken werden. Freut euch also auf einen unterhaltsamen und Leerreichen Abend auf der See# Party 2011.

Die Windows Phone 7 App zur See# Party

Wer die Agenda auf dem Windows Phone 7 ansehen möchte und wer seine eigene Agenda auf einem Blick haben möchte, kann sich die See# Party auf sein Gerät holen.

         

Ladet euch die App auf euer Phone und seit immer auf dem aktuellen Stand. Mehr zur WP7-App kann man auf der zugehörigen Webseite erfahren.

Ein kleiner Auszug aus unseren Sponsoren

   InterSystems Platinsponsor    

DotNetKicks-DE Image

Bilder, Videos, Preise, Infos und vieles mehr der ersten Tour-Termine von: MSDN on Tour - Sommer Edition - Juni 2011

14.06.2011 19:00:36 | Kay Giza

Die ersten Tage der MSDN on Tour - Sommer Edition - Juni 2011 (http://www.msdn-on-tour.de/)- sind nun vorbei - und etwas salopp und positiv formuliert, es ist der 'helle Wahnsinn auf 4 Rädern'. Wir sind überwältigt über die extrem tolle Resonanz, die vielen tausend Besucher und den regen Austausch mit Ihnen! Vielen herzlichen Dank! In diesem Blogeintrag finden Sie einige ausgewählte Impressionen, Video und weiterführende Informationen rund um unsere Deutschland-Tour für Entwickler... [... mehr in diesem Blogeintrag auf Giza-Blog.de]

This post is powered by www.Giza-Blog.de | Giza-Blog.de: RSS Feed
© Copyright 2006-2011 Kay Giza. All rights reserved. Legal
Subscribe

In Zukunft nur mit deutschsprachigen Inhalten?

14.06.2011 15:54:14 | dotnet-kicks.de Blog

P5302288_(www[1].aboutpixel.de)Peter Amendt sagte einmal: „Wirkliche Umwälzungen beginnen damit, dass nicht wir den Stein umwälzen, sondern der Stein uns.“ In dieser Metapher ist die .NET-Community der metaphorische Stein: Websites die für die Community gemacht wurden, wie auch dotnet Kicks, wollen nicht die Community nach ihren Vorstellungen und Wünschen formen, sondern sich denen der Community anpassen. Klar ist natürlich auch, dass man es nie allen damit recht machen kann. Doch genau aus diesem Grund wollen wir die Community – Euch! – in unsere Überlegungen und Entscheidungen mit einbeziehen.

Bei unserer heutigen Umfrage geht es um das Thema „Internationalisierung“: Als wir vor etwas über zwei Jahren diese Community-Seite gegründet haben, wollten wir die vielerorts verstreuten deutschsprachigen Artikel betreffend dem .NET-Framework sammeln und zur Verfügung stellen. Ganz unabhängig von der Thematik, ob Entwickler / Programmierer alle der englischen Sprache mächtig sind – oder es vielleicht sein sollten? – wollten wir eine deutschsprachige Alternative für die im englischen Sprachraum massenhaft verfügbaren Seiten bereitstellen.

Uns ist jetzt in letzter Zeit vermehrt aufgefallen, dass neben deutschsprachigen Artikeln vermehrt englische Beiträge vorgeschlagen werden; nicht nur englischsprachige Artikel in vornehmlich deutschen Blogs sondern auch ausschließlich englische Blogs. Dadurch gehen die deutschsprachigen Artikel teilweise unter. Unsere heutige Frage an unsere Community lautet daher:

Wie sollen nicht-deutschsprachige Artikel auf dotnet-kicks.de behandelt werden?

  • Alle Artikel dürfen eingestellt werden, man muss sie ja nicht kicken

  • Nur deutschsprachige Artikel (keine maschinelle Übersetzung) dürfen eingestellt werden

Sagt uns eure Meinung zu dem Thema in den Kommentaren und gebt eure Stimme bei der Umfrage ab, damit wir dotnet Kicks weiter nach euren Wünschen anpassen können!

Wie sollen nicht-deutschsprachige Artikel auf dotnet-kicks.de behandelt werden?Market Research

Erste deutschsprachige BlogEngine.NET Community

14.06.2011 10:37:22 | Klaus Bock

Deutsche BlogEngine.NET Community

Am 07 Juni 2011 ging das erste deutschsprachige BlogEngine.NET Community Portal online.
Betreiber und Verantwortlicher der Webseite ist Hans-Peter Schelian. Als Moderatoren stehen ihm Roland Schumacher aka GENiALi und meine Wenigkeit zur Seite.

Die Idee, oder besser der Entschluss das Portal zu eröffnen, entstand in einem Twitter-Gespräch zwischen Hans-Peter und mir, das in etwa so ablief:

SchelianHP: Kennst du eine #BlogEngine Community außer der auf #CodePlex?
klaus_b0: Nein, aber wenn du eine findest gib mir bitte Bescheid
SchelianHP: Da gibt es wirklich nichts
klaus_b0: Hättest du Interesse eine eigene Seite aufzuziehen?
SchelianHP: Wäre eine Option, habe schon mal ein anderes Forum hochgezogen…
klaus_b0: Ich helfe dir gerne moderieren, administrieren udgl.
SchelianHP: Das habe ich gehofft. Oder soll ich sagen, das hoffe ich doch. Das kriegen wir…
klaus-b0: Wenn das Forum konkret wird, Plattform, Bereiche udgl., schick mir einfach ne DM.

Es folgten noch ein paar Mails hin und her. Darin beschlossen wir auch GENiALi zu fragen, ob er Interesse hätte mit an Board zu kommen. Roland erschien mir eine gute Wahl, da er einer der wenigen deutschsprachigen Entwickler ist die sich mit BlogEngine.NET befassen und er auch schon die ein oder andere Anpassung an der Codebasis vorgenommen hat. Roland sagte zu und so stand das Basisteam fest.
Hans-Peter registrierte die Domäne dotnetblogengine.de, in Anlehnung an den Original Domänennamen von Mads Kristensen dem Gründer des Open Source Projekts, und stellte den Webserver zur Verfügung. Als Plattform für die Community-Seite wurde DotNetNuke gewählt, da Hans-Peter aus dieser Richtung kommt und einiges an Erfahrung mit der Plattform mitbringt. Mir war es egal welche Plattform verwendet wird. Hauptsache .NET basierend und für Anpassungen Zugang zum Quellcode.

Den Mittelpunkt des Portals wird ziemlich sicher das enthaltene Forum darstellen. In diesem Forum sollen die gängigsten Themen rund um BlogEngine.NET behandelt werden. Dabei ist der Schwerpunkt nicht auf Entwickler gerichtet, sondern auf den Endanwender. Egal ob Probleme bei der Installation auftreten, Themes, Widgets oder Erweiterungen angepasst werden sollen.
Entwickler die sich schon jetzt oder erst zukünftig mit BlogEngine.NET befassen wollen, sind natürlich herzlich Willkommen.

Eine FAQ befindet sich gerade in Arbeit. In ihr werden die häufigsten Fragen zur BlogEngine zusammengetragen und beantwortet. Wenn ihr schon jetzt Fragen zur BlogEngine habt die euch unter den Nägeln brennen, scheut euch nicht sie im Forum zu stellen. Wenn ihr noch kein Mitgliederkonte eingerichtet habt, hier geht’s direkt zur Registrierung.

Als dringlichstes Ziel haben wir uns gesetzt, BlogEngine.NET als Blog-System bekannter und attraktiver zu machen. Mit Eröffnung der BlogEngine.NET Gallery ist von Seiten der BlogEngine Entwickler ein Schritt in die richtige Richtung getan. Die Gallery füllt sich stetig mit neuen Inhalten. Die einfache Installation der Themen, Widgets und Erweiterungen direkt in der Verwaltung eines Blog sollte uns in unserem Vorhaben unterstützen.

Ein weiterer wichtiger Punkt den wir in Angriff nehmen, ist die Unterstützung bei der Portierung von bestehenden Blogs aus anderen System. Hier sehen wir noch dringenden Handlungsbedarf.
Das bloße Übertragen der bestehenden Artikel und Kommentare via BlogML ist noch keine erfolgreiche Portierung. Bestehende Verknüpfungen dürfen nicht verloren gehen, sondern müssen auf die neue Linkstruktur weitergeleitet werden. Hier ist noch viel Arbeit nötig.

Oft wird die schlechte Lokalisierung von BlogEngine Installationen mit Recht angeprangert. Auch hier soll Abhilfe geschaffen werden.
In Sachen SEO ist die Engine nicht das was sie leisten könnte, obwohl mit kleinen Änderungen schon viel erreicht werden kann.
Die Leistung von BlogEngine basierenden Blogs lässt auch oft zu wünschen übrig. Auch hier kann geholfen werden.

Wir sind uns noch nicht einig ob wir eine, für den deutschen Sprachraum, überarbeitete und dahingehend angepasste Version zur Verfügung stellen sollen. Die fortlaufenden Änderungen der originalen Version würden natürlich eingepflegt.
Bevor wir uns jedoch einen Haufen Arbeit auf die Schultern laden, könntet ihr uns einfach mitteilen ob überhaupt Interesse eurerseits besteht. Wenn ja, was stellt ihr euch vor?
Besucht uns auf unserem Portal und teilt uns eure Meinung mit.

Technorati-Tags: |

Download: Internet Explorer 9 Produktleitfaden (Deutsch)

14.06.2011 07:28:47 | Kay Giza

Während meines Urlaubs hat das MSDN Online-Team bereits am 06.06.2011 eine 84 Seiten starke Einführung in den Internet Explorer 9 veröffentlicht. Dieser Produktleitfaden beschreibt in einer umfangreichen Broschüre die neuen Funktionen von Internet Explorer 9, bespricht die wichtigsten dieser Funktionen und stellt zusätzliche Informationen zu Funktionen speziell für Endbenutzer, Entwickler und IT-Experten bereit. Eine Übersicht für Web-Entwickler, Downloads und weiterführende Informationen finden Sie in diesem Blogeintrag auf Giza-Blog.de... [... mehr]

This post is powered by www.Giza-Blog.de | Giza-Blog.de: RSS Feed
Visit:  Giza-Blog.de Facebook-Page | Follow Kay Giza on Twitter
Daily News on MSDN:  MSDN Aktuell
© Copyright 2006-2011 Kay Giza. All rights reserved. Legal
Subscribe

Double Content durch Posts mit und ohne Datum

12.06.2011 18:05:00 | Klaus Bock

BlogEngine.NET

In letzter Zeit sind mit in den Google Webmaster-Tools vermehrt Warnungen zu doppelten Titeln und doppelter Beschreibung aufgefallen. Die Ursache ist im Verhalten von BlogEngine.NET begründet, dass die URL zu einem Artikel sowohl mit angegebenem Datum als auch ohne dieses akzeptiert wird. Demzufolge wird für beide URLs, sowohl mit als auch ohne Datum, der selbe Inhalte zurückgegeben.

Um BlogEngine.NET dieses Verhalten auszutreiben, ist nur ein kleiner Eingriff in die Methode RewritePost der Klasse UrlRewrite im Namensraum BlogEngine.Core.Web.HttpModules nötig.

if (post == null)
{
    return;
}
// HACK: um double content mit URLs ohne Datum zu vermeiden.
if (!haveDate && !url.Contains("/FEED/"))
{
    context.Response.RedirectPermanent(
		post.AbsoluteLink.ToString(),
		true);
    return;
}
context.RewritePath(
    url.Contains("/FEED/")
        ? string.Format(
			"syndication.axd?post={0}{1}",
			post.Id,
			GetQueryString(context))
        : string.Format(
			"{0}post.aspx?id={1}{2}",
			Utils.ApplicationRelativeWebRoot,
			post.Id,
			GetQueryString(context)),
    false);

Nach der Überprüfung, ob ein passender Artikel gefunden wurde, wird mit der Variablen haveDate überprüft ob kein Datum im URL vorhanden ist und auch kein Feed angefordert wurde. Sind beide Bedingungen erfüllt, wird mittels 301 auf den URL mit Datum umgeleitet. Das Vorkommen von double Content, zwecks URL mit und ohne Datum, sollte sich mit dieser Maßnahme erledigt haben.

Fazit:

Kleine Maßnahme, große Wirkung.
Traurig nur, dass man überhaupt erst zu solchen Maßnahmen greifen muss. Die Entwickler von BlogEngine.NET scheinen noch immer nicht verstehen, dass zu einem Blog-System mehr gehört als nur Artikel und Kommentare zu verarbeiten.

Technorati-Tags: | |

Treffen der DNUG Braunschweig - Agil 2.0 – das Agile Development Framework (ADF)

12.06.2011 10:50:00 | Lars Keller

Die DNUG Braunschweig trifft sich am 15.06.2011 um 19:00 Uhr im Restaurant Zucker (Tagungsraum). Uns kommt der MVP Golo Roden mit einem Vortrag über ADF besuchen.

Scrum, XP & Co – bestehende agile Methoden bedienen jeweils verschiedene Zielgruppen und Aspekte der Softwareentwicklung, doch eine einzelne agile Methode genügt in der Praxis häufig nicht. Was also fehlt, ist ein umfassendes Rahmenwerk, das die erfolgreichen Elemente der bestehenden agilen Methoden vereint, das jedoch – wenn erforderlich – auch eigene Pfade einschlägt.
Das Agile Development Framework (ADF) tritt an, dieses Problem zu lösen, indem es Individuen, Teams und Unternehmen während des gesamten Entwicklungsprozesses von qualitativ hochwertiger Software unterstützt, unter Berücksichtigung der einzelnen Rollen und deren jeweiligen Interessen.
Golo Roden stellt ADF und dessen Konzepte in einem kompakten Überblick vor, zeigt an Hand von praktischen Beispielen den Verlauf des Prozesses von ADF, und beschreibt Migrationspfade von Scrum und XP.

Bio:
Golo Roden ist freiberuflicher Wissensvermittler und Technologieberater für .NET, Codequalität und agile Methoden. Zu diesen Themen berät er Firmen bei der Evaluierung, Erforschung und Verwendung geeigneter Technologien und Methoden. Darüber hinaus ist er journalistisch für Fachzeitschriften und als Referent und Content Manager für Konferenzen tätig. Für sein qualitativ hochwertiges Engagement in der Community wurde Golo von Microsoft als Most Valuable Professional (MVP) für C# ausgezeichnet.

Zurück von der IT & DevConnections aus Karlsruhe

12.06.2011 10:30:00 | Lars Keller

Ich sitze gerade im Zug zurück und lasse die IT & DevConnections Konferenz Revue passieren. Zum ersten Mal (jedenfalls wo ich das wahrgenommen habe) waren viele Sprecher von der Microsoft Corp. bei einer Konferenz zu erleben. Genau diese Mischung habe ich immer bei anderen Konferenzen vermisst, einfach einmal (teilweise) Deep Dive Infos aus der MS Corp. zu bekommen. Ein weiterer netter Nebeneffekt war es, dass ich viele Buchautoren live erleben konnte. Ich sag nur Wrox Verlag (dicke rote gute Bücher). Scott Guthrie @ IT & DevConnections Karlsruhe

Ein besonderes Highlight für mich war natürlich die Keynote von “the legend of the red polo” Scott Guthrie. Scott, der jetzt beim Auzres Team arbeitet, hat uns die Cloudsicht von Microsoft erklärt, recht interessant, aber Neues war leider nichts dabei.

Natürlich waren auch viele aus der Community anwesend, so dass sich die spontane Abendveranstaltung in Karlsruhe feucht fröhlich gestaltete. Danke nochmals an die Stadtführer. ;-)

Mein Konferenzfazit fällt positiv aus und ich hoffe, dass wir nun regelmäßig in Deutschland so ein Sprecheraufgebot aus der MS Corp. bekommen können.

Windows Phone 7 App veröffentlicht: Brainstorming

10.06.2011 08:39:55 | Gregor Biswanger

BackgroundVor einigen Tagen wurde meine erste Windows Phone 7 App “Brainstorming” auf dem Marketplace veröffentlicht.

Mit Brainstorming können Sie Ihren Gedanken freien Lauf lassen und diese als Mind-Map (Business Mapping) festhalten. Somit können Sie Ihre Ideen einfach und schnell handhaben und präzise strukturieren. Durch die einfachen Änderungsmöglichkeiten wird die Zusammenarbeit in der Gruppe gefördert und die Kreativität gesteigert. Durch unterschiedliche Formatierungen können Gedanken besser gewichtet werden.


In der Testversion können Sie maximal 2 Projekte speichern und das Mind-Map nicht als Bild anlegen. 

Features: 
- Priorisierung von Notes 
- Freie Farbauswahl für Notes
- Bilder für Notes hinzufügen
- URL-Support für Notes
- Multi-Touch-Support
- Mind-Map als Bild speichern
- Mind-Map per E-Mail senden

 

Video

Screenshots

01    02    03    04

05    06     07    08

brainstorming-example

 

Feature- & Bug-liste

Sie haben einen Fehler gefunden? oder einen Feature Wunsch? Einfach Bug oder Feature-Wunsch auf Google Moderator posten und abstimmen lassen. Die Einreichung mit den höchsten votes, wird bevorzugt behandelt.

 

image

> WP7 - Brainstorming App - Wish & Bug list

 

Facebook-Gruppe: WP7 - Brainstorming App

In Facebook hab ich extra eine Brainstorming App Gruppe eröffnet. Hier könnt ihr jederzeit weitere Informationen zu Updates erhalten.

http://www.facebook.com/home.php?sk=group_222587804437502&ap=1

 

Download

wp7_152x50_blue

BlogEngine.NET Update auf Version 2.0.0.66

09.06.2011 13:10:17 | Klaus Bock

Logo

Mit BlogEngine.NET ab Version 2.0.0.62 ist die volle Unterstützung für Themes enthalten, die den Razor-Syntax verwenden wollen. Das bedeutet spätestens ab jetzt ist ASP.NET in der Version 4 angesagt, wie auch die Änderungen an den unterschiedlichen web.config Dateien unschwer erraten lassen. Neu ist auch die Unterstützung für das IIS Rewrite Modul. Die verwendete jQuery-Version wurde auf Version 1.5.2 aktualisiert. Neu hinzugekommen ist die Unterstützung mehrere Blogs unter einer Installation. Ebenfalls neu ist die Möglichkeit, die Angabe von Webseiten in den Kommentaren zu verbieten.

Bevor man aber die vielen neuen Feature nutzen kann, ist erst einmal ein Datenbankupdate fällig. Das SQL-Script für dieses Datenbankupdate trägt bereits die Bezeichnung From2.0To2.5. Mit diesem Update werden folgende Änderungen vorgenommen:

  • Diverse Fremdschlüssel entfernt.
  • In die Tabelle be_Users eine neue Spalte BlogID eingefügt.
  • In die Tabelle be_UserRoles eine neue Spalte Role eingefügt.
  • In die Tabelle be_StopWords eine neue Spalte BlogID eingefügt.
  • In die Tabelle be_Settings die neuen Spalten SettingRowId und BlogID eingefügt.
  • In die Tabelle be_Roles eine neue Spalte BlogID eingefügt.
  • In die Tabelle be_Rights die neuen Spalten RightRowId und BlogID eingefügt.
  • In die Tabelle be_RightRoles die neuen Spalten RightRoleRowId und BlogID eingefügt.
  • In der Tabelle be_Referrers die neuen Spalten ReferrerRowId und BlogID eingefügt.
  • In der Tabelle be_Profiles eine neue Spalte BlogID eingefügt.
  • In der Tabelle be_Posts die neuen Spalten PostRowID und BlogID eingefügt.
  • In der Tabelle be_PostTag eine neue Spalte BlogID eingefügt.
  • In der Tabelle be_PostNotify eine neue Spalte BlogID eingefügt.
  • In der Tabelle be_PostComment die neuen Spalten PostCommentRowID und BlogID eingefügt.
  • In der Tabelle be_PingService eine neue Spalte BlogID eingefügt.
  • In der Tabelle be_Pages die neuen Spalten PageRowID und BlogID eingefügt.
  • In der Tabelle be_DataStoreSettings die neuen Spalten DataStoreSettingRowId und BlogId eingefügt.
  • In der Tabelle be_Categories die neuen Spalten CategoryRowID und BlogID eingefügt.
  • Eine neue Tabelle be_Blogs erstellt.
  • Diverse neue Indizes erstellt.

Wer sich unter BlogEngine.NET mit einem eigenem Razor-Theme versuchen möchte, findet im Ordner themes mit Garland-Revisited bereits eine nette Vorlage. Wer bereits mit einem eigenem Theme arbeitet, kann davon einen Screenshot anfertigen und diesen im PNG-Format in das Verzeichnis des jeweiligen Themas unter dem Namen theme.png mit einer Breite von 480 Pixel ablegen. In der Blogverwaltung wird dieser Screenshot als Vorschau in der Themenauswahl angezeigt, Das ist kein Muss, aber ein nettes Gimmick.

Themes Einstellungen

Die Suche nach verfügbaren Themen für BlogEngine.NET wurde durch eine eigene Gallery stark vereinfacht. In den Einstellungen zu den Themen einfach auf den Link Gallery klicken und eine Auswahl an verfügbaren Themen wird direkt in der Einstellungsseite angezeigt. Sollte ein Thema gefallen, einfach auf Install klicken und Dank der Verwendung von NuGet wird das gewählte Thema auf dem Server installiert.

Ähnlich einfach wurde die Installation verfügbarer Erweiterungen und Widgets.
Im Dashboard prangt einem jetzt sofort eine Auswahl verfügbarer Erweiterungen und Widgets entgegen.

Widgets und Erweiterungen

Hinter dem Dienst, sowohl für die Themen als auch für die Widgets und Erweiterungen, steht die blogenginge.net gallery. Wer seine Erweiterungen, Widgets oder Themen zur Verfügung stellen will, kann sie in der Gallery veröffentlichen.

Wer seinen Besuchern wie bisher erlauben will, ihre Webseiten in den Kommentaren anzugeben, sollte nicht vergessen unter Einstellungen/Kommentare den Hacken bei
Enable Website in Comments
zu setzen.

Erlaube Webseiten in Kommentaren

Diese Einstellung ist standardmäßig deaktiviert. Die bisher eingetragenen Verknüpfungen zu Webseiten bleiben von dieser Einstellung unberührt, aber bei allen neuen Kommentaren wird die Verknüpfung zur Webseite nicht gespeichert, wenn diese Option nicht gesetzt wird.

Trotz der vielen Neuerungen sind viele, schon ältere, Fehler nicht gefixt. So funktioniert z.B.: die Übersichtsliste im Archiv noch immer nicht. Hier müsste nur der Anker korrekt gesetzt werden.

Auch neue Fehler sind hinzugekommen.
Wer ein Fehler-Logging aktiv hat, dem wird folgende Fehlermeldung auffallen:

Error loading compiled extensions from assembly BlogEngine.Core, Version=2.0.0.66, Culture=neutral, PublicKeyToken=fed3cbd6fd4e62d0: Unable to load one or more of the requested types. Retrieve the LoaderExceptions property for more information.

Diese Fehlermeldung ist etwas irreführen, denn sie bezieht sich nur im weiteren Sinn auf einen Fehler beim Laden der Erweiterungen. Vielmehr wird hier ein Problem mit der Zugriffssicherheit abgeleiteter Typen bemängelt, welches erst bei Verwendung der Assembly Blogengine.Core unter der .NET Version 4 auftritt. Im einzelnen sind alle Klassen im Namensraum BlogEngine.Core.Compilation.Design betroffen. Hier schafft das setzten des Attribut SecurityRules mit dem Wert Level1 der SecurityRuleSet-Enumeration auf die Assembly Abhilfe. Dazu einfach in der AssemblyInfo.cs folgende Zeile einfügen:

[assembly: SecurityRules(SecurityRuleSet.Level1)]

Von da an, werden die Sicherheitsregeln wieder wie unter .NET Version 2 auf die Assembly angewendet.

Ein weiterer, aus meiner Sicht, Fehler ist der etwas gedankenlose Umgang mit einem ungeprüften Ergebnis einer String.IndexOf Abfrage in der Methode RewriteDefault der Klasse UrlRewrite. Da wird im else-Block ungeprüft das Ergebnis an eine String.SubString Methode übergeben. Wenn hier die überprüfte Zeichenfolge default.aspx nicht gefunden wird, wird der Wert –1 an die String.SubString Methode übergeben, was in einer IndexOutOfRangeException endet. Hier hilft als Hack, bis zum Fix, ein Ternär-Operator:

else
{
    string newUrl = url.Replace("Default.aspx", "default.aspx");  // fixes a casing oddity on Mono
    // HACK: ternary operator um eine IndexOutOfRangeExcption zu vermeiden
    int defaultStart = url.IndexOf("default.aspx") == -1 ? 0 : url.IndexOf("default.aspx");
    newUrl = Utils.ApplicationRelativeWebRoot + url.Substring(defaultStart);
    context.RewritePath(newUrl);
}

FAZIT:

Die BlogEngine mausert sich immer mehr zu einer richtigen Blog-Anwendung.
Vielen Anwenderwünschen wird langsam Rechnung getragen, wie etwa die einfachere Installation von Themen, Widgets oder Erweiterung. Ich will hoffen, dass sich durch Eröffnung der blogengine.net gallery auch die Anzahl ansprechender Themen langsam erhöht. Dies war bisher immer einer der Hauptargumente um die BlogEngine.NET nicht zu verwenden.

Technorati-Tags: | |

RSS-Feeds an eigene Bedürfnisse anpassen

08.06.2011 20:23:00 | Martin Hey

In meinem letzten Post hab ich eine kleine Einführung in das Thema RSS-Feeds mit .NET erzeugen gegeben. Nun sind aber nicht alle Inhalte, die man per RSS-Feed übertragen möchte in den Standard-Elementen unterzubringen, die die RSS-Spezifikation definiert. Typische Beispiele dafür sind zusätzliche Geodaten oder Daten zu Medieninhalten in Podcasts. Um auch dieser Anforderung gerecht zu werden, bieten die beiden vorgestellten Klassen SyndicationFeed und SyndicationItem noch die Möglichkeit eigene Attribute oder eigene Elemente zu definieren. Wie das geht, soll an einem kleinen Beispiel gezeigt werden:

Eigene Elemente zum Item hinzufügen

Möchte man einfach nur zusätzliche Elemente zu den Items hinzufügen, kommt man recht schnell ans Ziel. Schlüssel sind die ElementExtensions. Im Beispiel werden jedem Item noch die Elemente Latitude und Longitude zur Definition einer Geokoordinate hinzugefügt.

var item = new SyndicationItem
{
    Id = "http://myfeeds/2011/06/" + i,
    Title = SyndicationContent.CreatePlaintextContent("Wichtige Mitteilung"),
};

item.ElementExtensions.Add("Latitude", null, 34.2543);
item.ElementExtensions.Add("Longitude", null, 14.2545);

Das Resultat ist, dass wie gewünscht das Item-Element über die definierten Sub-Elemente verfügt.

<item>
    <guid isPermaLink="false">http://myfeeds/2011/06/0</guid>
    <title>Wichtige Mitteilung</title>
    <Latitude>34.2543</Latitude>
    <Longitude>14.2545</Longitude>
</item>

Den gleichen Weg kann man dann auch beim Einlesen der Daten wieder verwenden: In der Auflistung ElementExtensions befinden sich die hinzugefügten Elemente mit den jeweiligen Namen und Inhalten. Mit Hilfe der generischen Methode GetObject kann man dann auf die Inhalte zugreifen.

var feed2 = SyndicationFeed.Load(reader);
foreach (var item in feed2.Items)
{
    var latitudeElementExtension = item
        .ElementExtensions
        .Single(e => e.OuterName == "Latitude");
    var latitude = latitudeElementExtension.GetObject<double>();
}

Analog zu den ElementExtensions gibt es die AttributeExtensions, die (wie sollte es anders sein) keine Elemente sondern Attribute erzeugen.

Eigene komplexe Objekte zum Item hinzufügen

ElementExtensions erlauben nicht nur das Hinzufügen primitiver Datentypen sondern auch komplexer Objekte - Bedingung: Sie müssen xml-serialisierbar sein und es muss ein passender XML-Serializer existieren oder es muss sich um einen DataContract handeln. In meinem Fall definiere ich mir nun eine neue Klasse GeoCoordinate, die sich als Location serialisiert.

[XmlRoot("Location", Namespace = "http://ns.uniquesoftware.de/location")]
[Serializable]
public class GeoCoordinate
{
public GeoCoordinate()
{
}

 public GeoCoordinate(double lat, double lon)
 {
     Latitude = lat;
     Longitude = lon;
 }

 [XmlElement("Latitude")]
 public double Latitude { get; set; }
 [XmlElement("Longitude")]
 public double Longitude { get; set; }
}

Im Anschluss definiere ich wie vorhin auch eine ElementExtension und füge dieser der Auflistung des Elements hinzu.

var item = new SyndicationItem
{
    Id = "http://myfeeds/2011/06/" + i,
    Title = SyndicationContent.CreatePlaintextContent("Wichtige Mitteilung"),
};
item.ElementExtensions.Add(
    new GeoCoordinate(34.2543, 14.2545), 
    new XmlSerializer(typeof(GeoCoordinate)));

Das resultierende XML im Feed beinhaltet nun wie erwartet die eben definierten Tags, die über die definierten Namespaces verfügen.

<item>   
    <guid isPermaLink="false">http://myfeeds/2011/06/0</guid>
    <title>Wichtige Mitteilung</title>
    <Location 
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xmlns:xsd="http://www.w3.org/2001/XMLSchema"
        xmlns="http://ns.uniquesoftware.de/location">
        <Latitude>34.2543</Latitude>
        <Longitude>14.2545</Longitude>
    </Location>
</item>

Eigene Namespaces verwenden

Häufig trifft man auf Konstrukte, in denen der Namespace nicht explizit jedes Mal wieder als Attribut im Element definiert wird, sondern wo nur noch eine Namespace-Referenz existiert. Nichts einfacher als das: Dazu fügt man einfach die XML-Namespace-Deklaration der AttributeExtensions-Auflistung des SyndicationFeed-Objektes hinzu. Im folgenden Beispiel habe ich dafür den Namespace "my" deklariert.

// create new syndication feed 
var feed = new SyndicationFeed(
    "Mein Blog Feed",
    "Wissenwertes über ASP.NET, WPF und Silverlight",
    new Uri("http://feeds.feedburner.com/discoveringmicrosofttechnologies"))
    {
        Language = "de-DE",
        Copyright = new TextSyndicationContent("Unique Software"),
        Generator = "Unique Software News Generator"
    };
feed.AttributeExtensions.Add(
    new XmlQualifiedName("my", "http://www.w3.org/2000/xmlns/"), 
    "http://ns.uniquesoftware.de/location");

Der Effekt ist, dass nun der Namespace im XML-Element channel definiert und dann automatisch eine Namespace-Referenz aufgebaut wird.

<item>
    <guid isPermaLink="false">http://myfeeds/2011/06/0</guid>
    <title>Wichtige Mitteilung</title>
    <my:Location>
        <my:Latitude>34.2543</my:Latitude>
        <my:Longitude>14.2545</my:Longitude>
    </my:Location>
</item>

Zusammenfassung

ElementExtensions und AttributeExtensions sind eine gute Möglichkeit, RSS-Feeds flexibel auf die eigenen Bedürfnisse anzupassen und mit Hilfe des Objektmodells typsicher auf die Objekte beinhalteten Objekte zuzugreifen. Besonders bei XML-Strukturen, die nur noch sehr entfernt etwas mit dem ursprünglichen Feed-Objektmodell zu tun haben, wird es wohl immer wieder eine Abwägung von Aufwand und Nutzen sein, ob man ElementExtensions und die Syndication-Objekte verwendet oder ob man die XML-Struktur "schnell eben selbst" per Linq-To-Xml zusammenbaut. Ich persönlich finde die sich bietenden Möglichkeiten wieder recht umfangreich und finde es schade, dass die Klassen so ein unbeachtetes Dasein fristen. 

Englische Version Englische Version

RSS-Inhalte mit .NET erzeugen

08.06.2011 20:18:00 | Martin Hey

Das Erzeugen einer XML-Struktur, die der RSS-Spezifikation entspricht ist gar nicht so kompliziert - erst recht nicht, seitdem man mit Linq-To-Xml recht einfach durch XML-Dokumente navigieren und diese auch modifizieren kann. Nachteil ist: Man muss die Spezifikation immer griffbereit haben, denn ganz schnell kommt man zu Fragen wie: "Wie hieß noch gleich das XML-Element für das Erstellungsdatum und in welchem Format muss es ausgegeben werden?" Was bisher aber nur wenige zu wissen scheinen: So viel Arbeit muss man sich gar nicht mehr machen. Seit dem .NET Framework 3.5 gibt es den Namespace System.ServiceModel.Syndication, dessen Klassen einen Großteil der Arbeit abnehmen. Die Erstellung ist ganz einfach: Zunächst erstellt man sich ein Objekt vom Typ SyndicationFeed. Dieses Objekt repräsentiert den eigentlichen Feed und dessen Eigenschaften.
 
// create new syndication feed  
var feed = new SyndicationFeed("Mein Blog Feed",
 "Wissenwertes über ASP.NET, WPF und Silverlight",
 new Uri("http://feeds.feedburner.com/discoveringmicrosofttechnologies"))
  {
     Language = "de-DE",
     Copyright = new TextSyndicationContent("Unique Software"),
     Generator = "Unique Software News Generator"
  };
 
Die Klasse SyndicationItem ermöglicht es dann, ebenfalls über das Objektmodell, die eigentlichen Einträge zu erzeugen, die mit Hilfe des Feeds übermittelt werden sollen. Diese werden dann dem Feed-Objekt nur noch zugewiesen.
 
// create syndication items which should be delivered
var items = new List<SyndicationItem>();
for (var i = 0; i < 5; i++)
{ 
 var item = new SyndicationItem
     {
         Id = "http://myfeeds/2011/06/" +  i,
         PublishDate = DateTime.Now,
         Title = SyndicationContent
             .CreatePlaintextContent("Wichtige Mitteilung"),
         Content = SyndicationContent
             .CreateHtmlContent("Meine wichtige Nachricht an alle Leser"),
         Summary = SyndicationContent
             .CreatePlaintextContent("Zusammenfassung meiner Mitteilung")
     };
     items.Add(item);
}
feed.Items = items;
 
Das war's auch schon fast: Letzter Schritt ist die Umwandlung in XML. Dafür gibt es auf dem Feed-Objekt die Methoden SaveAsAtom10 und SaveAsRss20, die diese Arbeit übernehmen.
 
var builder = new StringBuilder();
using (var writer = XmlWriter.Create(builder))
{
 feed.SaveAsRss20(writer);
 writer.Flush();
 writer.Close();
}
var xml = builder.ToString();
 
Im Hintergrund kommen hier je nach Methode die Atom10FeedFormatter-Klasse bzw. die Rss20FeedFormatter-Klasse zum Einsatz. Und mit diesem XML kann man nun das gleiche machen, was man sonst mit dem XML gemacht hätte, das man mit Linq-To-Xml zusammengebaut hätte: Man liefert es aus.

Englische Version Englische Version

RSS-Feeds an eigene Bedürfnisse anpassen

08.06.2011 19:30:00 | Martin Hey

In meinem letzten Post hab ich eine kleine Einführung in das Thema RSS-Feeds mit .NET erzeugen gegeben. Nun sind aber nicht alle Inhalte, die man per RSS-Feed übertragen möchte in den Standard-Elementen unterzubringen, die die RSS-Spezifikation definiert. Typische Beispiele dafür sind zusätzliche Geodaten oder Daten zu Medieninhalten in Podcasts. Um auch dieser Anforderung gerecht zu werden, bieten die beiden vorgestellten Klassen SyndicationFeed und SyndicationItem noch die Möglichkeit eigene Attribute oder eigene Elemente zu definieren. Wie das geht, soll an einem kleinen Beispiel gezeigt werden:

Eigene Elemente zum Item hinzufügen
Möchte man einfach nur zusätzliche Elemente zu den Items hinzufügen, kommt man recht schnell ans Ziel. Schlüssel sind die ElementExtensions. Im Beispiel werden jedem Item noch die Elemente Latitude und Longitude zur Definition einer Geokoordinate hinzugefügt.

var item = new SyndicationItem
{
Id = "http://myfeeds/2011/06/" + i,
Title = SyndicationContent.CreatePlaintextContent("Wichtige Mitteilung"),
};

item.ElementExtensions.Add("Latitude", null, 34.2543);
item.ElementExtensions.Add("Longitude", null, 14.2545);

items.Add(item);

Das Resultat ist, dass wie gewünscht das Item-Element über die definierten Sub-Elemente verfügt.

<item>
<guid isPermaLink="false">http://myfeeds/2011/06/0</guid>
<title>Wichtige Mitteilung</title>
<Latitude>34.2543</Latitude>
<Longitude>14.2545</Longitude>
</item>

Den gleichen Weg kann man dann auch beim Einlesen der Daten wieder verwenden: In der Auflistung ElementExtensions befinden sich die hinzugefügten Elemente mit den jeweiligen Namen und Inhalten. Mit Hilfe der generischen Methode GetObject kann man dann auf die Inhalte zugreifen.

var feed2 = SyndicationFeed.Load(reader);
foreach (var item in feed2.Items)
{
var latitudeElementExtension = item.ElementExtensions.Single(e => e.OuterName == "Latitude");
var latitude = latitudeElementExtension.GetObject<double>();
}

Analog zu den ElementExtensions gibt es die AttributeExtensions, die (wie sollte es anders sein) keine Elemente sondern Attribute erzeugen.

Eigene komplexe Objekte zum Item hinzufügen
ElementExtensions erlauben nicht nur das Hinzufügen primitiver Datentypen sondern auch komplexer Objekte - Bedingung: Sie müssen xml-serialisierbar sein und es muss ein passender XML-Serializer existieren oder es muss sich um einen DataContract handeln. In meinem Fall definiere ich mir nun eine neue Klasse GeoCoordinate, die sich als Location serialisiert.

[XmlRoot("Location", Namespace = "http://ns.uniquesoftware.de/location")]
[Serializable]
public class GeoCoordinate
{
public GeoCoordinate()
{
}

public GeoCoordinate(double lat, double lon)
{
Latitude = lat;
Longitude = lon;
}

[XmlElement("Latitude")]
public double Latitude { get; set; }
[XmlElement("Longitude")]
public double Longitude { get; set; }
}

Im Anschluss definiere ich wie vorhin auch eine ElementExtension und füge dieser der Auflistung des Elements hinzu.

var item = new SyndicationItem
{
Id = "http://myfeeds/2011/06/" + i,
Title = SyndicationContent.CreatePlaintextContent("Wichtige Mitteilung"),
};

item.ElementExtensions.Add(new GeoCoordinate(34.2543, 14.2545), new XmlSerializer(typeof(GeoCoordinate)));

Das resultierende XML im Feed beinhaltet nun wie erwartet die eben definierten Tags, die über die definierten Namespaces verfügen.

<item>
<guid isPermaLink="false">http://myfeeds/2011/06/0</guid>
<title>Wichtige Mitteilung</title>
<Location xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://ns.uniquesoftware.de/location">
<Latitude>34.2543</Latitude>
<Longitude>14.2545</Longitude>
</Location>
</item>


Eigene Namespaces verwenden
Häufig trifft man auf Konstrukte, in denen der Namespace nicht explizit jedes Mal wieder als Attribut im Element definiert wird, sondern wo nur noch eine Namespace-Referenz existiert. Nichts einfacher als das: Dazu fügt man einfach die XML-Namespace-Deklaration der AttributeExtensions-Auflistung des SyndicationFeed-Objektes hinzu. Im folgenden Beispiel habe ich dafür den Namespace "my" deklariert.

// create new syndication feed
var feed = new SyndicationFeed("Mein Blog Feed",
"Wissenwertes über ASP.NET, WPF und Silverlight",
new Uri("http://feeds.feedburner.com/discoveringmicrosofttechnologies"))
{
Language = "de-DE",
Copyright = new TextSyndicationContent("Unique Software"),
Generator = "Unique Software News Generator"
};

feed.AttributeExtensions.Add(new XmlQualifiedName("my", "http://www.w3.org/2000/xmlns/"), "http://ns.uniquesoftware.de/location");

Der Effekt ist, dass nun der Namespace im XML-Element channel definiert und dann automatisch eine Namespace-Referenz aufgebaut wird.

<item>
<guid isPermaLink="false">http://myfeeds/2011/06/0</guid>
<title>Wichtige Mitteilung</title>
<my:Location>
<my:Latitude>34.2543</my:Latitude>
<my:Longitude>14.2545</my:Longitude>
</my:Location>
</item>


Zusammenfassung
ElementExtensions und AttributeExtensions sind eine gute Möglichkeit, RSS-Feeds flexibel auf die eigenen Bedürfnisse anzupassen und mit Hilfe des Objektmodells typsicher auf die Objekte beinhalteten Objekte zuzugreifen. Besonders bei XML-Strukturen, die nur noch sehr entfernt etwas mit dem ursprünglichen Feed-Objektmodell zu tun haben, wird es wohl immer wieder eine Abwägung von Aufwand und Nutzen sein, ob man ElementExtensions und die Syndication-Objekte verwendet oder ob man die XML-Struktur "schnell eben selbst" per Linq-To-Xml zusammenbaut.
Ich persönlich finde die sich bietenden Möglichkeiten wieder recht umfangreich und finde es schade, dass die Klassen so ein unbeachtetes Dasein fristen.

RSS-Inhalte mit .NET erzeugen

08.06.2011 17:37:00 | Martin Hey

Das Erzeugen einer XML-Struktur, die der RSS-Spezifikation entspricht ist gar nicht so kompliziert - erst recht nicht, seitdem man mit Linq-To-Xml recht einfach durch XML-Dokumente navigieren und diese auch modifizieren kann. Nachteil ist: Man muss die Spezifikation immer griffbereit haben, denn ganz schnell kommt man zu Fragen wie: "Wie hieß noch gleich das XML-Element für das Erstellungsdatum und in welchem Format muss es ausgegeben werden?"

Was bisher aber nur wenige zu wissen scheinen: So viel Arbeit muss man sich gar nicht mehr machen. Seit dem .NET Framework 3.5 gibt es den Namespace System.ServiceModel.Syndication, dessen Klassen einen Großteil der Arbeit abnehmen. Die Erstellung ist ganz einfach: Zunächst erstellt man sich ein Objekt vom Typ SyndicationFeed. Dieses Objekt repräsentiert den eigentlichen Feed und dessen Eigenschaften.

// create new syndication feed 
var
feed = new SyndicationFeed("Mein Blog Feed",
"Wissenwertes über ASP.NET, WPF und Silverlight",
new Uri("http://feeds.feedburner.com/discoveringmicrosofttechnologies"))
{
Language = "de-DE",
Copyright = new TextSyndicationContent("Unique Software"),
Generator = "Unique Software News Generator"
};

Die Klasse SyndicationItem ermöglicht es dann, ebenfalls über das Objektmodell, die eigentlichen Einträge zu erzeugen, die mit Hilfe des Feeds übermittelt werden sollen. Diese werden dann dem Feed-Objekt nur noch zugewiesen.

// create syndication items which should be delivered
var items = new List<SyndicationItem>();
for (var i = 0; i < 5; i++)
{
var item = new SyndicationItem
{
Id = "http://myfeeds/2011/06/" + i,
PublishDate = DateTime.Now,
Title = SyndicationContent.CreatePlaintextContent("Wichtige Mitteilung"),
Content = SyndicationContent.CreateHtmlContent("Meine wichtige Nachricht an alle Leser"),
Summary = SyndicationContent.CreatePlaintextContent("Zusammenfassung meiner Mitteilung")
};
items.Add(item);
}
feed.Items = items;

Das war's auch schon fast: Letzter Schritt ist die Umwandlung in XML. Dafür gibt es auf dem Feed-Objekt die Methoden SaveAsAtom10 und SaveAsRss20, die diese Arbeit übernehmen.

var builder = new StringBuilder();
using (var writer = XmlWriter.Create(builder))
{
feed.SaveAsRss20(writer);
writer.Flush();
writer.Close();
}
var xml = builder.ToString();

Im Hintergrund kommen hier je nach Methode die Atom10FeedFormatter-Klasse bzw. die Rss20FeedFormatter-Klasse zum Einsatz. Und mit diesem XML kann man nun das gleiche machen, was man sonst mit dem XML gemacht hätte, das man mit Linq-To-Xml zusammengebaut hätte: Man liefert es aus.

Erich Gamma jetzt im Visual Studio Team!

08.06.2011 14:52:02 | Christian Binder

Erich Gamma war Distinguished Engineer in der Rational Software Abteilung der IBM Software Group mit Sitz in Zürich, wo er am Projekt Jazz / Rational Team Concert arbeitete. Zuvor leitete er die Entwicklung der Eclipse IDE. Erich wird ab August in Zürich die Leitung eines neuen Visual Studio Labs übernehmen.  Weitere Informationen gibt’s auf Jason Zanders blog. Herzlich willkommen !!!

Briefing SharePoint 2010 – noch freie Plätze in Köln am 20. Juni

07.06.2011 18:47:19 | Peter Kirchner

Im April haben wir die aktuellen Trainings zu SharePoint 2010 angekündigt und es freut mich, dass für das Briefing in Köln noch freie Plätze zur Verfügung stehen. Das Entwickler Camp in Unterschleißheim ist dagegen bereits ausgebucht und Anmeldungen führen leider nur noch auf die Warteliste.

Was erwartet Sie im Briefing?

Briefing zu neuen Geschäftspotentialen für Entscheider am 20.06.2011 in Köln

  • Potenziale für Partner durch SharePoint 2010 und Office 365
  • Integration von SharePoint in Partnerlösungen
    • Grundlagen, Vertrieb und Integration mit Visio
  • Integrationsszenarien SharePoint inhouse und Office 365 – Vorteile für Kunden
  • Technische Abgrenzung: wo macht SharePoint in Partnerlösungen Sinn?
  • SharePoint 2010 – eine durchgehende Entwicklerstory für Partner
    • Welches Know-How Ihre Entwickler aufbauen sollten
    • VS 2010, Sandboxed Solutions, Developer Dashboard, Office Integration/Entwicklung

Zum Briefing anmelden...

Ist Boxing und Unboxing böse?

04.06.2011 14:38:25 | Klaus Bock

Evil jack in a box drawing - ©2007-2011 ~mr-biggs (deviantArt)

In einem aktuellen Projekt machte mich NDepend auf einen übermäßigen Gebrauch von Boxing und Unboxing aufmerksam. Hauptsächlich wurde dabei eine Klasse angemeckert, welche die Einstellungen aus der web.config für eine Anwendung verfügbar macht, die keinen Zugriff auf die hostende Webanwendung hat. In besagter Klasse wurden diverse Einstellungswerte verschiedenen Typs in einer Object Collection gehalten und beim Abruf aus dieser in den entsprechenden Wertetyp gecastet. Also jede Menge Boxing- und Unboxing-Vorgänge. Bei der Recherche zu dem Thema, warum man Boxing und Unboxing denn vermeiden solle, stieß ich immer wieder auf die Aussage: Boxing/Unboxing ist sehr rechenintensiv und kann sich daher negativ auf die Gesamtleistung einer Anwendung auswirken.
In der MSDN heißt es unter anderem im Artikel Leistung (C# und Visual Basic) im Absatz über Boxing und Unboxing:

Wenn ein Wertetyp mittels Boxing konvertiert wird, muss ein völlig neues Objekt erstellt werden.Dies kann bis zu 20-mal länger dauern als eine einfache Zuweisung eines Verweises.

Das war es Wert näher untersucht zu werden.
Für den Anfang beschränkte ich meinen Versuch auf die Primitiven. Der Einfachheit halber verwende ich hier Int32-Werte, welche in ein Array vom Typ Object geschrieben werden. Anschließend werden die Werte aus diesem Object-Array mit verschiedenen Methoden in ein Array vom Typ Int32 geschrieben und die Ergebnisse verglichen. Das Object-Array wird immer mit 1 Millionen Werten von 0 aufsteigend gefüllt.

Als erstes habe ich ein einfaches Boxing verwendet um das Object-Array mit Int32-Werten zu füllen. Anschließend werden via Unboxing die Werte aus dem Object-Array in das Int32-Array übertragen.

namespace BoxingUnboxingTest
{
    using System;
    using System.Diagnostics;
    using System.Globalization;

    class Program
    {
        private static object[] container;
        private static int[] result;
        private const int MaxItems = 1000000;

        static void Main(string[] args)
        {
            container = new object[MaxItems];
            result = new int[MaxItems];
            var sw = new Stopwatch();
            sw.Start();

            FillArrayWithInt();
            sw.Stop();
            var timeToFill = sw.ElapsedMilliseconds;
            sw.Start();
            FillResult(false, false);
            sw.Stop();
            var timeToTransfer = sw.ElapsedMilliseconds - timeToFill;
            var totalTime = sw.ElapsedMilliseconds;
        }

        private static void FillArrayWithInt()
        {
            for (int i = 0; i < MaxItems; i++)
            {
                container[i] = i;
            }
        }

        private static void FillResult(bool useParse, bool useConvert)
        {
            if (useParse)
            {
                for (int i = 0; i < MaxItems; i++)
                {
                    result[i] = int.Parse(container[i].ToString(), CultureInfo.InvariantCulture);
                }

                return;
            }

            if (useConvert)
            {
                for (int i = 0; i < MaxItems; i++)
                {
                    result[i] = Convert.ToInt32(container[i], CultureInfo.InvariantCulture);
                }

                return;
            }

            for (int i = 0; i < MaxItems; i++)
            {
                result[i] = (int)container[i];
            }
        }
    }
}

Das Ergebnis war erst einmal verblüffend. Ich erwartete, auf Grund der vielen boxing/unboxing Operationen ein katastrophales Ergebnis. Statt dessen wurde mir ein sehr flottes Resultat angezeigt: Für das Füllen des Object-Array, das Boxing, wurden im Schnitt 50 Millisekunden benötigt. Für das Umkopieren der Werte in das Int32-Array mittels Unboxing lediglich 15 Millisekunden im Mittel.

Da ich ja vom Boxing/Unboxing weg sollte, probierte ich als nächstes eine Version mit der Convert-Klasse in der ich das boxing in das Object-Array beibehielt, das unboxing mit einer Überladung der ToInt32-Methode ersetzte. Das Ergebnis war ernüchternd. Anstatt schneller zu werden, ich hatte ja auf das böse unboxing verzichtet, benötigte diese Variante satte 1250 Millisekunden im Mittel.

Die Verwendung der Methode int.Parse war, mit 1850 Millisekunden im Mittel, die langsamste Variante.

Als nächstes startete ich den gleichen Versuch mit Werten des Typs DateTime. Auch hier begann ich mit dem Boxing/Unboxing und füllte das Object-Array wieder mit 1 Millionen Werten. Das Füllen des Array dauerte diesmal rund 1500 Millisekunden im Mittel. Das Umkopieren via Unboxing benötigte etwa 15 Millisekunden. Das Unboxing von DateTime-Werten geht also genauso schnell wie das Unboxing von einfachen Int32-Werten.

Als nächstes testete ich das Verhalten mit der Convert-Klasse in dem ich die ToDateTime Methode verwendete und dieser die Werte als Typ Object übergab. Auch hier wieder das gleiche Ergebnis wie bei den Int32-Werten: etwa 1250 Millisekunden im Mittel.

Auch bei DateTime-Objekten benötigte die Parse-Methode DateTime.Parse mit rund 4000 Millisekunden am längsten.

Erstes Zwischenfazit:
Für den reinen Transport von öfter wechselnden Werten verschiedenen Typs in einem Container mit einer Auflistung vom Typ Object, ist die Verwendung von Boxing/Unboxing die erste Wahl.
Ich konnte keine Methode finden, welche die Aufgabe schneller und einfacher erledigt.

Aber damit ist das Thema noch nicht ausgereizt. Boxing/Unboxing wird auch innerhalb des Framework in den verschiedensten Methoden, für den Benutzer oft vollkommen transparent, verwendet. Ein typischer Vertreter dieser Art ist die oft verwendete Methode String.Format mit ihren diversen Überladungen.
In folgendem Beispiel werden die beiden Integer Werte in ein Object geboxt und anschließend die Methode Object.ToString aufgerufen.

var output = string.Format(
    CultureInfo.InvariantCulture,
    "Dies ist Wert Nr.{0} von {1} Werten insgesamt.",
    5,
    100);

Um hier das Boxing zu vermeiden könnte anstatt der Integer Werte, die jeweilige Darstellung als Zeichenfolge an die Methode übergeben werden:

var output = string.Format(
    CultureInfo.InvariantCulture,
    "Dies ist Wert Nr.{0} von {1} Werten insgesamt.",
    5.ToString(CultureInfo.InvariantCulture),
    100.ToString(CultureInfo.InvariantCulture));

Da die Methode int.ToString ein Member der int Struktur ist, wird hier kein Boxing benötigt. Ob dieses Vorgehen einen Vorteil gegenüber der direkten Angabe der Integer Werte darstellt, gilt es zu ermitteln.

Als erstes habe ich ein Array vom Typ string mit 1 Millionen Werten mit der Methode string.Format gefüllt, in dem ich den jeweiligen Wert zwischen 0 und 999999 als Integer Wert an die Methode übergeben habe. Dieses Verfahren benötigte im Schnitt 3700 Millisekunden.

Die Angabe der Zeichenfolge mit Hilfe der int.ToString Methode gegenüber der direkten Angabe der Integer Werte brachte auch dieses mal keine Verbesserung der Leistung. Diese Variante benötigte zur Erstellung der 1 Millionen Werte etwa 5000 Millisekunden im Mittel.

Zweites Zwischenfazit:
Für Zahlenwerte jeglicher Art scheint die Verwendung von Boxing/Unboxing die schnellste und effizienteste Art zu sein, die jeweiligen Werte zwischen verschiedenen Objekten zu übertragen oder als formatierte Zeichenfolge darzustellen.

Als letzten Versuch möchte ich mich einer anderen Art der Wertetypen zuwenden, dem enum. Enumerationen sind oft ein heißes Diskussionsthema: Die einen lieben und die anderen hassen sie. Manche bezeichnen sie gar als böse. Diese Diskussion soll hier außen vor bleiben. Ich betrachte sie für diesen Versuch als das was sie sind: Ein weiterer Wertetyp.

Für diesen Versuch verwende ich wieder die Methode string.Format um eine formatierte Zeichenfolge darzustellen, in der der Wert einer Enumeration verwendet wird.
Bei der Zeichenfolgendarstellung einer Enumeration mit den Mitteln des Framework, wird immer ein Boxing durchgeführt. Egal ob in der Methode string.Format oder mit der ToString Methode einer Enumeration. Ein Blick in den IL-Code des folgenden Beispiel zeigt dieses Verhalten sehr schön. Zuerst der Code in C#:

static void Main(string[] args)
{
    var output = TestEnum.Entry8.ToString();
}

Und anschließend der erzeugte IL-Code:

.method private hidebysig static 
	void Main (
		string[] args
	) cil managed 
{
	// Method begins at RVA 0x2050
	// Code size 14 (0xe)
	.maxstack 1
	.entrypoint
	.locals init (
		[0] string output
	)
	IL_0000: nop
	IL_0001: ldc.i4.8
	IL_0002: box BoxingUnboxingTest.TestEnum
	IL_0007: callvirt instance string [mscorlib]System.Object::ToString()
	IL_000c: stloc.0
	IL_000d: ret
} // end of method Program::Main

In Zeile 15 und 16 ist gut zu sehen, wie zuerst der Wert der Enumeration in ein Object geboxt und anschließend die Methode Object.ToString aufgerufen wird.
Zum füllen eine Array vom Typ String mit 1 Millionen Werte benötigte die Methode string.Format mit dem Boxing im Schnitt etwa 13800 Millisekunden.

Im das Boxing zu vermeiden, habe ich mich für eine Erweiterungsmethode entschieden, welche in einem switch/case-Block die Zeichenfolgendarstellung des angegebenen Wertes der Enumeration zurückgibt:

internal static string GetName(this TestEnum value)
{
    switch (value)
    {
        case TestEnum.Entry1:
            return "Entry1";
        case TestEnum.Entry2:
            return "Entry2";
        case TestEnum.Entry3:
            return "Entry3";
        case TestEnum.Entry4:
            return "Entry4";
        case TestEnum.Entry5:
            return "Entry5";
        case TestEnum.Entry6:
            return "Entry6";
        case TestEnum.Entry7:
            return "Entry7";
        case TestEnum.Entry8:
            return "Entry8";
        case TestEnum.Entry9:
            return "Entry9";
        default:
            return "None";
    }
}

Wenn nun das vorangegangene Beispiel mit dieser Erweiterungsmethode wiederholt wird, sollte das Boxing aus dem IL-Code verschwunden sein.

.method private hidebysig static 
	void Main (
		string[] args
	) cil managed 
{
	// Method begins at RVA 0x2050
	// Code size 9 (0x9)
	.maxstack 1
	.entrypoint
	.locals init (
		[0] string output
	)
	IL_0000: nop
	IL_0001: ldc.i4.8
	IL_0002: call string BoxingUnboxingTest.Extensions::GetName(valuetype BoxingUnboxingTest.TestEnum)
	IL_0007: stloc.0
	IL_0008: ret
} // end of method Program::Main

Im Gegensatz zum vorherigen IL-Code Beispiel wird in Zeile 15 kein Boxing mehr durchgeführt, sondern statt dessen die Erweiterungsmethode aufgerufen die ja den erwarteten String zurückgibt.

Ist die Vermeidung des Boxings dieses mal messbar?
Ja, ist es. Die Variante unter Verwendung der Erweiterungsmethode benötigte rund 9270 Millisekunden. Sie ist rund ein Drittel schneller als die Vorherige Variante in der Boxing verwendet wird.

Fazit:

In den meisten Fällen, zumindest wenn Primitiven oder Zahlenwerte verwendet werden, braucht auf das Boxing und Unboxing keine besondere Rücksicht genommen werden.
Doch bereits bei der Verwendung von Werten aus Enumerationen ändert sich das Bild. Hier sollte im Einzelfall geprüft werden, wie sich der erzielte Nutzen im Verhältnis zum Aufwand verhält. Bei deutlich komplexeren Strukturen sind Tools wie etwa NDepend sehr hilfreich um festzustellen, ob und wo eventuell Boxing oder Unboxing verwendet wird,

Für mich ist das Boxing und Unboxing nun nicht mehr so böse, wie es oft dargestellt wird.
Natürlich können in verschiedenen Situationen Leitungseinbußen durch das Boxing oder Unboxing entstehen. Aber deshalb dieses überaus hilfreiche Compiler Feature per se als böse zu bezeichnen, schießt doch etwas über das Ziel hinaus.

Technorati-Tags: | | | | |

Windows 8 als Erster entdecken: BUILD - die Zukunft beginnt hier

03.06.2011 18:22:26 | Kay Giza

Mitte September 2011 haben Sie als Software- oder Hardware-Entwickler jetzt als eine(r) der Ersten die Chance, in die Tiefen des kommenden Betriebssystems von Microsoft einzutauchen, Codename Windows 8. Hierfür laden wir vom 13. bis 16. September 2011 die weltweite Entwicklergemeinde zur Fachkonferenz BUILD nach Anaheim (Kalifornien, USA) ein: Nutzen Sie die Gelegenheit, registrieren Sie sich JETZT und sichern Sie sich einen der begehrten Plätze. Die erste offizielle Demo des neuen Systems... [.. mehr in diesem Blogeintrag auf Giza-Blog.de]

This post is powered by www.Giza-Blog.de | Giza-Blog.de: RSS Feed
Visit:  Giza-Blog.de Facebook-Page | Follow Kay Giza on Twitter
Daily News on MSDN:  MSDN Aktuell
© Copyright 2006-2011 Kay Giza. All rights reserved. Legal
Subscribe

Die neue Windows 8 Shell

03.06.2011 13:48:03 | Albert Weinert

Windows8_2Windows 8 bekommt eine neue Shell, sie wird als Standard-Shell anstelle des klassischen Windows Explorer zu Einsatz kommen. Die Shell ist dass neue Start-Menu, sofern es der Rechner zulässt. Ob man den Windows Explorer als Start-Shell festlegen kann ist derzeit nicht bekannt. Kann mir aber die eine oder andere Gruppenrichtlinie dazu vorstellen.

Bedienung

Neben der Optimierung auf Touch Bedienung werden die dort ausgeführten Anwendungen im Vollbildmodus betrieben und sollen sich wohl dem Metro-Design verschreiben. Doch auch die Tastatur und Maussteuerung ist möglich. Windows8_4Die Oberfläche kommt ohne Hardwaretasten aus, es besteht für die Hersteller jedoch die Möglich Funktionen wie “Start”, “Suchen” etc. auf Hardwaretasten zu legen.

Durch den Vollbild-Modus ist der Focus auf eine Anwendung gegeben. Dies ist in der heutigen Zeit des Informationsüberflusses auch gar nicht mal so übel. Zusätzlich hat man die Möglichkeit auch eine zweite in einem 1/4 des Bildschirm einzublenden. Dies jedoch nur wenn man einen Widescreen Bildschirm hat. Somit ist zu erwarten dass sich Tablets mit Windows 8 zum Großteil im 16:9 (bzw. 16:10) Format geben wird. Heutige Monitore und und Laptops sind auch fasst nur noch so zu bekommen.

Windows8_6Nicht immer zwei Anwendungen

Hat man nur einen 4:3 Bildschirm, so fällt die Möglichkeit der zweiten Anwendung weg. Durch Windows als Grundlage ist jedoch echtes Multitasking vorhanden und eine Anwendung kann im Hintergrund weiterlaufen. Jedoch sollte man sich als Entwickler der Anwendung drüber nachdenken wie man im Hintergrund entweder nichts, oder nur sehr wenig machen kann um z.B. beim Einsatz auf einem Tablet das Akku zu schonen.

Back to the Roots

Unterschreitet man eine gewisse Auflösung (z.B. bei kleinen Netbooks) steht das Metro-Vollbild-UI nicht zu Verfügung und es wird nur der Windows-Explorer als Start-Shell genommen. Dies macht für mich aktuell nicht wirklich Sinn.

Der klassische Windows Explorer bindet sich in die neue Start-Shell als Vollbildanwendung ein, darauf laufen die ganzen Anwendungen die nicht für die neue Shell gedacht sind und natürlich alle “alten” Anwendungen. Aktuell ist dies der Windows Explorer wie unter Windows 7 mit ein paar kleineren Anpassungen. Eine Ribbon-Bar und der klick auf den Start-Bubble führt zurück zur neuen Start-Shell. Wir werden sehe ob sich da noch etwas weiter beweget.

Alles in allen gefällt mir das Konzept für Tablets, es ist nicht so Start wie das iOS auf dem iPad, jedoch nicht ganz so flexibel wie bei Android 3.x Tablets.  Wie es sich als Start-Menü mit Maus- und Tastatur macht wird man erfahren müssen.

Begeisterung durch Entwicklung mit HTML5, JavaScript

Will man sich in die Start-Shell Integrieren, so bedient man sich HTML5 und JavaScript. Diesen Schritt finde ich hervorragend. Microsoft hätte keine bessere Wahl treffen können als die Erweiterung und Entwicklung mit HTML5 und JavaScript zuzulassen. Ich hoffe dass im gleichen Schritt beim Internet Explorer 10 ein entsprechendes Erweiterungsmodel kommt.

Wohin ein einfach zugängliches Erweiterungsmodell führen kann zeigt uns das Ökosystem rund um Firefox und Chrome. Erweiterungen ohne Ende in jeglicher Prägung. Natürlich auch in jeglicher Qualität. Auf dem Internet Explorer ist dies eher stiefmütterlich, schwierig und erfordert eine Entwicklungsumgebung. Bei Chrome und Firefox ist dies durch JavaScript, HTML und XML viel einfacher.

Wie das App-Model für die neue Start-Shell genau aussieht, welche Möglichkeiten es genau gibt wird sich zeigen. Ich erwarte mir davon einen erheblichen Gewinn für Windows 8. Da eben so auch nicht die “üblichen” Entwickler sich einbringen können,  da die Einstiegshürden viel geringer sind. Viele gute Ideen scheitern einfach daran dass sie keiner Umsetzt.

Ob es ein weiteres Model für die Entwicklung dafür gibt ist bis jetzt nicht bekannt, ich gehe davon aus dass sich wenigstens mit eigenen Vollbild-Anwendungen in die Start-Shell einklinken kann.

In Aktion

Alles in allem ein riesen Schritt, auch in die richtige Richtung.

Windows 8 und die Sache mit HTML5 und JavaScript

02.06.2011 19:53:04 | Albert Weinert

Tja, da wurde am 2. Juni in der Nacht Windows 8 auf der D9-Konferenz vorgestellt.

Neuer Startbildschirm, per Touch (sowie Maus- und Tastatur) steuerbar. Alles fließt und wechselt schnell, das Paradigma ist Vollbild und Metro Design. Steven Sinofsky erklärte dass man dafür in HTML5 und JavaScript entwickeln wird und dafür eine API zu Verfügung steht um auch “richtige” Anwendungen in HTML5/JS zu machen.

Einige .NET Entwickler sehen direkt ihre Felle wegschwimmen. 10 Jahre .NET, 3 Jahre Silverlight/WPF einfach wegschmeißen. Nun muss man in HTML5/JS die Anwendung entwickeln damit sie gut aussieht, so deren Meinung.

Doch wissen tuen sie es nicht, ich auch nicht. Jedoch gehe ich nicht vom schlimmsten aus, dass man nur noch in JavaScript entwickeln kann. So dämlich kann Microsoft gar nicht sein. Wenn man wie die Gerüchtelage derzeit ist vom Windows 8 Release in Q2 2012 ausgeht wäre es von der BUILD-Konferenz bis zum Release gerade mal maximal 9 Monate in der Entwickler Zeit haben was dafür zu machen. Und die Entwickler zu vergraulen in dem man ihnen HTML5/JS vorsetzt halte ich gelinde gesagt für Humbug.

Ja, das Startmenü wird man in HTML5/JS erweitern und ansprechen müssen, auch wird es in HTML5/JS möglich sein Anwendungen schreiben. Aber dies wird sicher nicht der einzige Weg sein.

Es spricht nichts dagegen dass man Anwendungen in Silverlight/OOB schreibt, man kann Anwendungen auch in WPF, WinForms, Win32/MFC schreiben. Es ist halt ein Windows. Alles was jetzt läuft wird auch dann laufen. Und Microsoft wird den Entwicklern zumindest in Sliverlight und WPF Controls zu Verfügung stellen die dem Metro-Look entsprechen. Dies machen sie heute schon in Windows Phone 7. Da hat man auch zwei Systeme, einmal das Native Windows Phone UI und Silverlight mit eigenen Controls. Win32/MFC wird man den ThirdParty Herstellern überlassen.

Das neue Startmenü ist meines Erachtens nicht nur ein einfacher UI Aufsatz. Es ist der zentrale Container, dieser Container beinhaltet alle Anwendungen, jeweils im Vollbild zum umschalten. Der jetzige Windows Desktop ist auch nur eine Anwendung in diesem Container. Dies zeigt sich daran dass er genauso wie die neuen Anwendungen ins System fließt. Man kann ihn genauso ein- und ausblenden, umschalten wie die neuen Anwendungen. Auch das teilen der des Bildschirms ist mit ihm ebenso möglich. Auf diesem Desktop werden alle normalen Anwendungen laufen.

Ich gehe davon aus dass man seine nicht JavaScript Anwendungen den Look & Feel der neuen Anwendungen verpassen kann, in der von sich bevorzugten und von Microsoft unterstützen Plattform (.NET, Silverlight und Win32). Und man wird der Anwendung per Manifest oder Code mitgeben können dass sie sich doch ebenso in den Startmenü Container integrieren soll wie der Windows Desktop, jedoch nicht auf diesem sondern einen eigenen Screen. Dann kann man genauso zwischen allen Anwendungen umschalten wie man es dann von Windows 8 gewohnt ist. Mehr ist es nicht.

Bleibt nur die Sache mit den Live-Tiles, da denke ich dass man diese mit HTML5/JS machen muss, da wird man nicht drum herum kommen. So muss man nur mit seiner Anwendung kommunizieren und die gewünschten Informationen darstellen. Und so ein kleines Live-Tile in HTML5 zu machen wird keinen Entwickler vor eine großer Herausforderung stellen.

So, nur mal meine 2 Cents.

Preview von Windows 8 vorgestellt

02.06.2011 14:23:24 | Oliver Scheer

Am 1. Juni 2011 wurde auf der Technologiekonferenz “D9 – All Things D” zum allerersten Mal die nächste Generation von Windows demonstriert. Die nächste Version trägt immer noch den Codenamen “Windows 8”.  Die Demonstration (Video unten) zeigte einige Möglichkeiten wie die Benutzeroberfläche der Zukunft auf Touch-basierten Geräten aussehen kann. Schnell, flüssig und dynamisch, das gesamte Benutzererlebnis wurde erneuert, und dennoch bleiben die Fähigkeiten, die Flexibilität und Konnektivität vom klassischen Windows erhalten. Einige neue Oberflächen-Features Schnell startende Apps von einem Tile-basierten Startbildschirm, ähnlich wie in Windows Phone 7, der das klassische Startmenu ersetzen kann (nicht muss), skalierbar für das Betreiben von Anwendungen im Vollbildmodus. Live Tiles (oder Livekacheln) mit Benachrichtigungen, ähnlich wie man sie bereits von Windows Phone 7 her kennt. Diese stellen aktuelle Informationen aus den Apps dar. Flüssiges, natürliches Wechseln zwischen laufenden Anwendungen. Bequemes andocken, “snappen”, vergrößern und verkleinern von Apps an den Bildschirmrändern, so das man mehre Anwendungen gleichzeitig sehen kann und echtes Multitasking nutzen kann. Verbindungen mit dem Web und webbasierte Apps die mit HTML5 und JavaScript die vollen Fähigkeiten von Windows nutzen können. Vollständig touch-basiertes browsen, mit der vollen Hardwarebeschleunigung des Internet Explorer 10. Startbildschirm Eine Vorabversion des Startbildschirms. Auf einen Blick sieht man das aktuelle Datum, die Uhrzeit, den nächsten Termin und die Anzahl der Emails in den verschiedenen Postfächern. Windows Phone 7 nutzt einen ähnlichen Startbildschirm. Durch einfaches “Raufschieben” gelangt man an den Anmeldebildschirm. Neue Navigation Live-Tiles bzw.Live-Kacheln zeigen Anwendungen und aktuelle Informationen zu diesen Anwendungen an. Z.B. nächste Termine, Wetter oder Fußballergebnisse. Ähnlich wie im Windows Phone arbeitet man mit einem nach links und rechts schiebbaren Panorama, durch das man sich durch eine unendliche Anzahl von Bildschirmen “scrollen” kann. Tiles erlauben es wesentlich mehr Informationen darzustellen, als klassische Icons. Man kann sie als Mini-Apps bezeichnen, das sie auch durchaus interaktiv sein können und wechselnde Inhalte anzeigen kann. Icons sind leider nur statische Symbole. Touch-Apps Apps in “Windows 8” sind für Touch ausgelegt. Können allerdings auch weiterhin mit Maus und Keyboard gesteuert werden. Apps können wunderbar im Vollbildmodus ausgeführt werden und mit einem guten Layout auf verschiedensten Bildschirmen präsent sein. Obwohl die neue Benutzeroberfläche für Touch-Eingabe optimiert ist, funktionieren die Apps ebenso gut mit Maus und Keyboard. Dieser Ansatz erfordert keine Kompromisse, man kann mit jedem bevorzugtem Gerät, die Anwendungen ausführen die man möchte. Damit ermöglicht man auch in Zukunft innovative Eingabemöglichkeiten und –Geräte für optimale Erlebnisse mit für jeden PC-Benutzer auf der Welt. Touch-Keyboard Für die Eingabe von Text, steht ein Touch-Keyboard zur Verfügung.   Bestehende Windows-Anwendungen Bereits bestehende Windows Anwendungen werden ganz normal geöffnet und stellen sich dann in der bekannten Windows 7-Oberfläche dar. “Neue” und “Alte” Apps lassen sich dennoch nebeneinander darstellen (Bild unten). Man kann sich nahtlos zwischen bestehenden Windows-Anwendungen und Windows 8-Apps bewegen. Die vollen Fähigkeiten von Windows bleiben erhalten, einschließlich des Windows Explorer und des klassischen Desktops. Alle PCs, Anwendungen und Geräte die das Windows 7 Logo-Zertifikat haben, sollen auch für “Windows 8” genutzt werden können. Mehrere Anwendung gleichzeitig im Vordergrund Mehrere Apps lassen sich einfach und bequem nebeneinander ausführen. Internet Explorer 10 Der Internet Explorer 10 ist Touch-optimiert worden, so dass man mit Fingern surfen kann. Windows für Entwickler Windows 8-Apps verwenden die Leistungsfähigkeit von HTML5, kombiniert mit den nativen Möglichkeiten von Windows in dem man JavaScript und HTML verwenden kann, um neuartige Erlebnisse zu schaffen. Die neuen Windows 8 Apps sind Vollbild- und Touch-optimiert, und können einfach mit den Fähigkeiten der neuen Windows 8-Oberfläche kombiniert werden. Es gibt sehr viel mehr in der neuen Plattform, den Fähigkeiten und Werkzeugen zu entdecken als auf der D9 gezeigt wurde. Windows 8 bringe eine neue innovative Plattform und Werkzeuge für Entwickler. Windows 8-Apps können auf ein sehr breites Spektrum von Bibliotheken und Steuerelementen zugreifen, die flüssige Benutzerinteraktionen und einfache Internetkonnektivität ermöglichen. Apps können neue Features in Windows und in andere Anwendungen integrieren und sich mit anderen Apps in der neuen Oberfläche verbinden. Und es dreht sich nicht ausschließlich um touch-basierte PCs. Das neue Windows Erlebnis wird von Anwendungen und Geräten profitieren, ein Erlebnis über verschiedene Geräte hinweg. Die Benutzeroberfläche und die neuen Apps, werden auch ohne Keyboard und Maus auf einer Vielzahl von Geräten verfügbar und bedienbar sein. BuildWindows – Die Konferenz zur nächsten Version von Windows Weit mehr Informationen und Details zu “Windows 8” wird auf der Entwicklerkonferenz BUILD vom 13.9. bis 16.9. in Anaheim, Kalifornien, vorgestellt.   Die offizielle Pressemitteilung von Microsoft BUILD – Entwicklerkonferenz 13. – 16.9. Anaheim Demovideo auf YouTube – Jensen Harris, Director of PM Windows User Experience...(read more)

Regeln | Impressum