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

Martin Richter: Das ewige Leid mit ausländischen Bestellungen und Rechnungen…

Es war mal wieder soweit und ich musste bei Adobe (eigentlich keine kleine Firma) ein Update bestellen.
Dank Firmenkreditkarte war das kein Problem. Und so fing das Leid an:

20.03.2015 –
Ich bestelle ein Update eines typischen Adobe-Tools. Ich gehe den Bestellvorgang durch und schwupps ist der Kauf getätigt.
Alles super. Aber ach… :( ein paar Stunden später kommt die Rechnung und die stimmt nicht. Ich denke ich kaufe bei Adobe-Deutschland, aber dem war nicht so. Ich bekomme das Produkt aus Irland und scheinbar war in meinem Adobe Konto keine Umsatzsteuer ID enthalten. :oops: Mea culpa, mea maxima culpa…
Ich geistere durch mein Konto bei Adobe, kann aber die verfluchte Stelle nicht finden wo die Umsatzsteuer ID einzutragen ist.
Ein Anruf bei der Hotline ergab, dass ich am Besten die Bestellung storniere. Bei der Gelegenheit hat der gute Mann an der Hotline auch die gültige Umsatzsteuer Id eingetragen.

23.03.2015-
Ich habe nun Aufgrund der Empfehlung der Hotline die Bestellung storniert. Natürlich ist die Kreditkarte schon belastet. Nochmal bei der Hotline angerufen und wirklich geklärt, dass eine Umsatzsteuer ID eingetragen ist.
Jetzt wurde eine neue Bestellung aufgegeben. Betrag stimmt schon mal in der Anzeige, aber das hatten wir schon.
Ein paar Stunden später die Überraschung. :shock: Die Rechnung weist die Mehrwertsteuer schon wieder aus, unsere Umsatzsteuer ID steht nicht auf der Rechnung. Wie kann das sein? Und noch besser: Eigentlich ist die Umsatzsteuer in Irland 21%. Die Rechnung zeigt aber 19% Mehrwertsteuer… jetzt ist es aber ganz wild.
Anruf bei der Hotline. Der kann sich das nicht erklären. Die Bestellung ist richtig. Die Umsatzsteuer ID ist eingetragen! Und noch besser: die Kreditkarte wurde nur mit dem Betrag ohne Mehrwertsteuer belastet. Gibt es so was?
Die Fakten in kürze: Rechnung falsch mit deutscher Mehrwertsteuer, Rechnung kommt aus Irland und trotz angegebener Umsatzsteuer ID steht da eine MwSt. Aber bezahlt habe ich die nicht… Ich werde vertröstet. Der Vorgang liegt nun bei der Fachabteilung.

27.03.2015 –
Die Stornierung der ersten Bestellung wurde akzeptiert. Wenigstens schon mal was ;)

29.03.2015 –
Wow. Nach 9 Tagen habe ich wenigstens das Geld für die erste Bestellung zurück.

05.04.2015 –
Meine Buchhaltung wird sauer und möchte eine Rechnung haben. Ich gebe den Vorgang soweit ich ihn habe inkl. falscher Rechnungen weiter.

18.04.2015 –
JAAAA! Eine Reaktion. Ich bekomme eine Email. Betreff meine Bestellung. Anhang: Eine PDF mit mir bereits bekannten FALSCHEN Rechnung. Auch hier 19% Steuer (statt irländischer 21%), die aber wegen Angabe der Umsatzsteuer ID nicht da stehen dürfte… :mad:
Kein Text, keine Signatur nichts! Eigentlich eine Frechheit.
Kommt jetzt auch noch eine Kartennachberechnung… oder was? :(

23.04.2015 –
Die Buchhaltung setzt sich mit Adobe wieder in Verbindung. Der Man von der Hotline ist wieder nett und sieht den ganzen Vorgang. Er kann aber nichts machen.
Kurze Zeit später erhalte ich wieder eine Bestätigung, dass mein Vorgang an die entsprechende Fachabteilung weitergereicht wurde. Hatten wir das nicht schon vor 1 Monat.

Mittlerweile Frage ich mich, an wen man sich eigentlich wenden kann, wenn eine Firma eine definitiv falsche Rechnung ausstellt. Laut Auskunft meiner Buchhaltung müsste man ja diesen Betrag verbuchen, denn die Rechnung weißt diesen ja aus. Aber abgebucht wurde ein anderer Betrag. Also haben wir nun Schwarzgeld in der Kasse? :) OK ich bin kein Buchhalter und das ist gut so…

Mein Urteil über Adobe? Am Besten fragt mich keiner…

To be continued…


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

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

Auch diese Woche gab’s wieder viele Nachrichten zu HDInsight, Azure Machine Learning, DocumentDB, Service Fabric, Media Services und vieles weitere.

Datum Nachricht
23.04. Azure Friday Video: Azure PowerShell 101
Guang Yang zeigt in diesem 13-minütigen Video die Grundlagen zu PowerShell und deren Möglichkeiten, Azure zu administrieren.
23.04. Azure Friday Video: Azure Resource Manager 101 mit PowerShell
In diesem 10-minütigen Video zeigt Guang Yang die Konzepte, die hinter Azure Resource Manager stecken, mit denen via PowerShell unter anderem automatisiert neue Umgebungen aufgesetzt werden können.
22.04. Auswertung von SharePoint Nutzungsdaten mit Application Insight
Dieser Azure Blog Artikel beschreibt, wie mit Hilfe von Application Insights das Nutzungs- und Performanzverhalten von SharePoint Sites ausgewertet werden kann.
22.04. Azure AD Application Proxy unterstützt jetzt eigene Domain-Namen
In diesem Active Directory Blog-Artikel werden diese Neuerungen genauer beschrieben.
21.04. Azure Architecture Guidance auf GitHub
Dieser Leitfaden der Patterns & Practices Group geht auf verschiedene Aspekte des Entwurfs Azure-basierter Anwendungssysteme ein. Der Leitfaden steht auf GitHub zum Download zur Verfügung
20.04. Administrations-Client für Azure Media Services
William Zhang stellt ein Werkzeug vor, mit dessen Hilfe Media Services administriert, und überwacht werden können. Es deckt Funktionalitäten wie Live- und On-demand-Streaming, Absicherung von Medieninhalten, Verschlüsselung etc. ab. Das Tool steht auf GitHub zum Download zur Verfügung.
20.04. Ankündigung: Azure Service Fabric – Verteilung und Management von Microservices auf einer bestehenden Cloud-Infrastruktur
Mark Russinovich stellt mit der Azure Service Fabric einen neuen Dienst vor, mit dessen Hilfe Microservices intelligent auf eine bestehende Infrastruktur verteilt, dort ausgeführt, skaliert und verwaltet werden können.
20.04. Ausführen von R-Skripten auf Azure Batch
Karan Batta, Program Manager Azure, zeigt in diesem Blogpost, wie sich R-Skripte skalierbar auf einer Azure-Batch-Clusterumgebung ausführen lassen.
17.04. Cloud Cover Show (174): Big Data with Lara Rubbelke and James Baker
In dieser Episode stellen Chris Risner, Haishi Bai, Lara Bubbelke und James Baker ein konkretes Azure-Projekt vor, bei dem Kafka, Storm, DocumentDB, HBase, Azure Machine Learning, Storage, HDInsight und Power BI zum Einsatz kamen.

Weitere Informationen

Norbert Eder: Von Lightroom nach 500px veröffentlichen

Wer seine Fotos mit Adobe Lightroom verwaltet und entwickelt, der möchte einige davon vermutlich auch publizieren. Hierzu sind ja bereits einige Dienste wie Flickr bereits angebunden. Ich verwende aber unter anderen auch 500px. Ein entsprechendes Add-On ist im offiziellen Add-On-Katalog jedoch nicht vorhanden. Glücklicherweise stellt 500px ein Publish-Add-On zur Verfügung.

Nach dem Download muss das Add-On auf die Festplatte entpackt werden. Der Ort ist beliebig, ich empfehle hier jedoch einen eigenen Ordner innerhalb des Dokumente-Ordners. Viele legen die Add-Ons in einen Unterordnung der LR-Installation ab. Dies ist gerade hinsichtlich Backup, Neuinstallation, Upgrade etc. problematisch.

Nun in Lightroom den Zusatzmodul-Manager öffnen:

Lightroom Zusatzmodul-Manager

Lightroom Zusatzmodul-Manager

Dort nun via Hinzufügen den Ordner auswählen, in welches das Add-On entpackt wurde. Nach der Auswahl sollte das Add-On installiert werden und die Add-On-Informationen angezeigt werden:

Lightroom 500px Add-On

Lightroom 500px Add-On

Bitte beachten: Die Versionsnummer kann sich natürlich unterscheiden. Wichtig ist, dass das Add-On aktiviert wurde. Damit sollte der Vorgang erfolgreich abgeschlossen worden sein.

Wenn alles funktioniert hat, sollte 500px in der Liste der Veröffentlichungsdienste aufscheinen:

Lightroom Veröffentlichungsdienste 500px

Lightroom Veröffentlichungsdienste 500px

Muss muss der Dienst noch eingerichtet werden, dies funktioniert jedoch analog zu allen anderen Diensten.

Noch zu erwähnen ist die Möglichkeit die Bilder aus dem 500px-Profil synchronisieren zu können. Dabei werden alle Sets heruntergeladen und können vollständig aus LR heraus gepflegt werden.

The post Von Lightroom nach 500px veröffentlichen appeared first on Norbert Eder.

Johannes Renatus: Blokierende Parallele AJAX Requests und ASP.NET

Bis gestern dachte ich eigentlich das ich mich in ASP.NET ganz gut auskenne, aber da wollte es mir ASP.NET mal wieder richtig zeigen, das man auch hier nie auslernt. Denn wenn man mehrere AJAX Requests parallel startet um die Daten für einen View asynchron zu laden und in einem der Requests in die Session schreibt, […]

codefest.at [MS]: Schnell und einfach zum Microsoft //build Keynote-Streaming!

Schnell und einfach zum Microsoft //build Keynote-Streaming

Vom 29. April bis zum 1. Mai findet auch heuer wieder die //build statt. Für alle Entwickler ist die //build ein "Must Event". Das zeigt sich auch Jahr für Jahr daran, dass diese Veranstaltung regelmäßig ausverkauft ist. So auch heuer wieder.

Wie schon in den Blogposts “Live dabei sein mit dem Microsoft //build Keynote-Streaming!” und “Was Spannendes, was zum Rumspielen und was zum Naschen!! …” beschrieben laden wir Euch ein mit uns gemeinsam die Keynote in Kinos in Wien, Linz und Graz zu erleben!

Wo & Wann: 29. April 2015 um 17:15 Uhr im

Alles was Ihr dazu braucht ist einfach nur einen der folgenden Online-Kurse in der Microsoft Virtual Academy (MVA) abzuschließen. Die kostenlosen Online-Trainings der Microsoft Virtual Academy (MVA) unterstützen Euch dabei, Euer Know-How zu aktuellen Technologien zu erweitern.

Ein paar von Euch haben gemeint ob sie auch alternativ einen anderen Kurs machen könnten. Klar doch, machen wir gerne für Euch. Wie wäre es denn mit den folgenden:

Und wenn es wirklich schnell gehen soll:

Als Nachweis bitte einfach Eure absolvierten Kurse im Profil veröffentlichen. Dazu:

  1. auf https://www.microsoftvirtualacademy.com/MyMVA/MyProfile.aspx im Abschnitt Persönliche Daten “Meine Profildaten für alle Nutzer freigeben“ und
  2. in Mein Status in der MVA die „Tracks“ aktivieren.

Bei der Anmeldung gebt bitte als Einladungscode die Nummer Eures MVA-Profils an. Diese findet Ihr z.B. wenn Ihr Zum öffentlichen Profil navigiert Also z.B. “123456” wenn das Euer Profillink ist: http://www.microsoftvirtualacademy.com/Profile.aspx?alias=123456

Und BITTE: gebt EURE eigene  MVA ID ein. Ja, wir schauen uns Eure Einreichungen echt an. Smile

Bei Fragen, Wünschen und Komplikationen aller Art erreicht Ihr mich wie gewohnt unter meiner E-Mail Adresse.

Wir sehen uns im Kino!

Gerhard Göschl, Marketing Leiter - IT-Spezialisten und Software Entwickler

Microsoft Österreich GmbH
Gerhard.Goeschl@Microsoft.com

PS: Ihr möchtet die Entwicklungsprodukte von Microsoft vorab schon einmal ausprobieren? Im MSDN Evaluierungscenter finden Ihr kostenlose Testversionen aller wichtigen Produkte für Entwickler. Probiert doch auch den kostenfreien Testzugang zu Microsoft Azure

Holger Schwichtenberg: PowerShell 5.0 mit Unit Testing unf für Windows 7 und Server 2008 R2

Im Rahmen der PowerShell-Community-Konferenz in Essen verkündete Microsoft Neuigkeiten zur nächsten PowerShell-Version.

Christian Binder [MS]: Microsoft Speaker auf der ADC C++ 2015

Die ADC C++ findet am 5 und 6.Mai statt. Von dem Microsoft C++  Team werden mit dabei sein:

Steve Carroll Visual C++ Team | Principal Group Software Engineering Manager
James McNellis Visual C++ Team | Senior Software Development Engineer

mit folgenden Sessions:

- Keynote: Microsoft Visual C++ Strategy
- What is new in Visual Studio 2015 
- Modernizing Legacy C++ Code
- Cross-platform development with C++ and Visual Studio 2015
- Graphics debugging in Visual Studio 2015

PS: Ich werde mit Gunter Logemann auch vor Ort sein. Gunter ist unser IoT und Windows (10) Spezialist und mein Thema ist ja ALM (TFS, VS, Git, TVCS usw.)  Ihr könnt uns am Microsoft Stand treffen und Eure Fragen mitbringen Smile

Chris

Uli Armbruster: Product Owner optimiert eure Engpässe

Das ist Teil 2 meiner Serie: 3 einfache Tricks für Product Owner mit großer Wirkung.

flask-304943_1280Wenn wir Software entwickeln, dann erstellen wir – wenn auch virtuell – ein Produkt. Produktentwicklung respektive der dafür eingesetzte Prozess wird immer einen oder mehrere Engpässe haben. Besonders Lean Management bzw. das darauf basierende Kanban zielen auf die Optimierung solcher Durchsatzprobleme ab (vgl. Theory of Constraints).

An allen Softwareprodukten, an denen ich mitentwickelt habe, war ein Engpass im Bereich der Entwicklung. Ideen und Wünsche haben die Kunden, Projektmanager und Product Owner viele. Natürlich können sie diese schneller formulieren als die Entwickler sie implementieren können.

Deshalb ist es wichtig genau diesen Abschnitt des Entwicklungsprozesses optimal auszulasten. Alternativ könnte der Engpass durch massive Aufstockung der Mitarbeiter vollständig aufgelöst werden, aber das ist allein aus Kostengründen unrealistisch.

 

Vorbereitung ist alles

Deshalb gilt: Je besser die Vorarbeitet ist, d.h. Wunsch-Features durchdacht, formuliert und präpariert werden, desto weniger Zeit muss der Entwickler dafür aufwenden. Unternehmen sprechen typischerweise auch vom Anforderungsmanagement. In einem späteren Beitrag werde ich die Einzelschritte und die Rollen in einem Softwareentwicklungsprozess beleuchten. Es gilt das Gleiche wie beim Essen: Je besser die Nahrung im Mund vorgekaut wird, desto einfach kann der Magen sie verdauen. Das heißt nicht, dass nicht weiter der Entwickler einbezogen werden soll oder dass weniger miteinander geredet werden soll, aber meiner Erfahrung nach werden immer wieder wenig durchdachte Anwendungsszenarien den Entwicklern über den Zaun geworfen. Im Sinne von “die werden dann schon mal machen”. Wird dann seitens der Entwickler nachgefragt, wundert sich der fachliche Verantwortliche gerne mal “was denn daran nicht klar sei”. In dem Zuge sei auf die Wichtigkeit einer gemeinsamen Sprache hingewiesen. Wie gesagt ist die Kommunikation wichtig und die Fachexperten können nicht an alles denken. Manches wissen sie auch nicht. Viele Probleme können aber im Vorfeld durchaus vermieden werden. Statt nach Lösungen zu suchen, kann es oft sinnvoller sein die tatsächliche Ursache des Problems zu untersuchen. Wo genau funktioniert der Geschäftsprozess nicht?

 

Evolvierbarkeit

Darüber hinaus muss jedem Produktverantwortlichen klar sein, dass eine Änderung nachweislich teurer wird, je später selbige erfolgt. Das betrifft die sogenannte Evolvierbarkeit. Obwohl Software nicht wie ein Auto verschleißt oder für Änderungen physikalisch auseinander gebaut werden muss, kosten späte Korrekturen mehr als frühe.

 

Schnelles Feedback

Bei Scrum und Kanban macht es sich ebenfalls bemerkbar, wie schnell erledigte User Stories vom Product Owner abgenommen werden. Ich habe für die Projekte, in denen ich Scrum Master bin, mit dem PO vereinbart, dass spätestens am Vormittag des Folgetages das Feedback kommen muss, ob die User Story korrekt umgesetzt wurde. Mir ist unter anderem von Microsoft bekannt, die nach einer Einführung einer 4-Stunden-Abnahmefrist der Durchsatz der tatsächlich abgeschlossenen Aufgaben signifikant gesteigert wurde.

 

Leerlauf vermeiden

Zu guter Letzt gibt es noch den Fall, dass die Arbeit so gut läuft, dass neue Wünsche schneller umgesetzt werden können als erwartet. Dann sollten die nächsten ToDos vorbereitet sein, damit die Software Ingenieure nicht Leerlauf haben.

 

Fazit

Der Entwicklungsprozess sollte auf die Engpässe zugeschnitten sein. Häufig ist das die Entwicklung. Diesem Engpass muss sich der Rest des Prozesses unterordnen. Das Prinzip ist seit langem bekannt, wissenschaftlich belegt und kann eine erhebliche Beschleunigung der Produktentwicklung bewirken.


Einsortiert unter:CIO Topics, German Tagged: Agile Development, Prozessmanagement, Scrum

Manfred Steyer: AngularJS mit EcmaScript 6 & Starter-Kit

Mein Kollege Vildan Softic, mit dem ich gemeinsam an unserem AngularJS-Buch gearbeitet habe, hat vor einiger Zeit in unserer Kolumne bei Heise Online über das Zusammenspiel von AngularJS und EcmaScript 6 geschrieben. Dabei zeigt er, wie man mit dem Transpiler Babel und einem Gulp-Task EcmaScript 6 nach EcmaScript 5, das heute schon in jedem Browser läuft, transpilieren kann.

Als Ergänzung dazu zeige ich hier anhand einer Schritt-für-Schritt-Anleitung, wie man solch ein Projekt einrichtet.

Starter-Kit

Wer die hier beschriebene Schritt-für-Schritt-Anleitung nicht durchmachen, sondern gleich AngularJS und EcmaScript nutzen möchte, findet das Ergebnis dieser Anleitung in Form eines Starter-Kits hier. Die nötigen Informationen zur Nutzung dieses Starter-Kits finden sich in der darin enthaltenen Datei readme.md.

Vorbereitung

Zunächst benötigt man den Package-Manager jspm. Im Gegensatz zu bower hat diese Implementierung die nette Eigenschaft, auch den Modul-Loader System.js zu konfigurieren, sodass er die heruntergeladenen Bibliotheken laden kann. Die Installation erfolgt über npm:

npm install jspm

Anschließend benötigt man noch die Konfigurationsdatei Package.json. Die wird wie folgt erstellt. Die dabei gestellten Fragen kann man mit Enter bestätigen. Um das von uns verwendete Starter-Paket zu bekommen, sollte man lediglich bei der Frage bezüglich des zu nutzenden Transpilers die Option Babel wählen.

npm init
jspm init
[…]
Which ES6 transpiler would you like to use, Traceur or Babel? [traceur]:Babel
[…]

Danach können die benötigten Bibliotheken mit jspm bezogen werden:

jspm install angular --save
jspm install bootstrap --save

Projekt

Um das Ganze zu testen, benötigt man eine einfache AngularJS-Anwendung, die sich auf EcmaScript 6 stützt. Die einzelnen JavaScript-Dateien sind im Ordner src abzulegen. Die Datei index.html sollte im Root der Anwendung platziert werden:

//demo-vm.js
export class DemoVM {
    info;
    constructor($log) {
        $log.log("DemoCtrl has been created ...");
        this.info = "Hallo Welt!";
    }
}

Die Datei app.js importiert AngularJS sowie das View-Model und definiert das Angular-Moduls samt Controller. Darüber hinaus kümmert sie sich um das Bootstrapping von AngularJS mittels angular.bootstrap. Letzteres ist notwendig, da hier AngularJS nicht mit der üblichen Direktive ng-app gestartet werden kann. Der Grund dafür ist, dass der Module-Loader zunächst das Modul der betrachteten Datei app.js laden muss und erst darauf hin AngularJS über import einbindet.

// app.js
import angular from 'angular';
import {DemoVM} from 'demo-vm';

var app = angular.module('angular-es6', []);

app.controller('demoVM', DemoVM);

angular.element(document).ready(function() {
  angular.bootstrap(document, ['angular-es6']);
});

Die Datei index.html bindet System.js sowie die Konfigurationsdatei config.js ein und lädt anschließend das Modul in der Datei app.js mit System.import.

<!--index.html -->
<!doctype html>
<html>
  <head>
    <link rel="stylesheet" type="text/css" href="jspm_packages/github/twbs/bootstrap@3.3.4/css/bootstrap.min.css">
  </head>
  <body>
    <div class="container" ng-controller="demoVM as vm">
        <h1>Angular-ES6-Demo</h1>

        <p>{{vm.info}}</p>

        <script src="jspm_packages/system.js"></script>
        <script src="config.js"></script>
        <script>
            System.import('app').catch(function(err) { console.error(err); });
        </script>
  </body>
</html>

Laufzeit-Transpilierung

Für eine Transpilierung zur Laufzeit ist die Datei config.js anzupassen, sodass sie die nachfolgenden Einträge wiederspiegelt. Wichtig dabei ist die Abbildung von * auf src/*.js. Hieraus geht hervor, dass der Module-Loader sämtliche JavaScript-Dateien im Ordner src findet, sofern kein anderes Mapping angegeben wurde.

System.config({
  "baseURL": "/",
  "transpiler": "babel",
  "babelOptions": {
    "optional": [
      "runtime",
      "es7.decorators"
    ]
  },
  "paths": {
    "*": "src/*.js",
    "github:*": "jspm_packages/github/*.js",
    "npm:*": "jspm_packages/npm/*.js"
  }
});
[...]

Danach kann man die Anwendung starten und index.html aufrufen.

Kompilierung vor Ausführung

Für die Transpilierung vor der Ausführung nutzt das hier gezeigte Beispiel das gulp. Dieses Build-Tool kann samt der benötigten Anweisungen via npm bezogen werden. Die Anweisung gulp-babel delegiert an den Transpiler Babel, gulp-plumber verhindert, dass im Fehlerfall ein Gulp-Task abbricht und gulp-sourcemaps ist für das Erstellen der Source-Maps, dank derer EcmaScript 6 Code in Browsern, wie Chrome oder Internet Explorer debugget werden kann, verantwortlich.

npm install gulp --save
npm install gulp-babel --save
npm install gulp-plumber --save
npm install gulp-sourcemaps --save

npm install lru-cache --save
npm install sigmund --save
npm install core-util-is --save

Den Gulp-Task findet man nachfolgend.

// gulpfile.js
var gulp = require('gulp');
var babel = require('gulp-babel');
var sourcemaps = require('gulp-sourcemaps');
var plumber = require('gulp-plumber');

var babelOptions = {
  modules: 'system',
  moduleIds: true,
  stage: 2,
  optional: [
    "es7.decorators",
    "asyncToGenerator"
  ]
};

var source = "src/**/*.js";
var html = "src/**/*.html";
var css = "src/**/*.css";
var resources = [html, css];
var destination = "app";

gulp.task('default', function () {
  gulp.src(source)
    .pipe(plumber())
    .pipe(sourcemaps.init())
    .pipe(babel(babelOptions))
    .pipe(sourcemaps.write('.'))
    .pipe(gulp.dest(destination));

  gulp.src(resources)
    .pipe(gulp.dest(destination));

});

gulp.task('watch', ['default'], function() {
  var watcher = gulp.watch([source, html, css], ['default']);
  watcher.on('change', function(event) {
    console.log('\n\nFile ' + event.path + ' was ' + event.type + ', running tasks...');
  });
});

Da der Gulp-Task das Ergebnis der Kompilierung im Ordner app ablegt, ist nun noch die Datei config.js anzupassen:

System.config({
  "baseURL": "/",
  "paths": {
    "*": "app/*.js",
    "github:*": "jspm_packages/github/*.js",
    "npm:*": "jspm_packages/npm/*.js"
  }
});
[...]

Danach kann die Kompilierung durch Aufruf von gulp erfolgen. Mit gulp watch kann man hingegen angeben, dass der Ordner src zu überwachen ist. In diesem Fall führt eine Änderung einer Datei in diesem Ordner zu einem erneuten Kompilieren. Zum Testen ruft man die index.html auf.

Manfred Steyer: Folien und Beispiel zur Session 'Moderne Weblösungen für alle Plattformen mit AngularJS' auf der JAX 2015 in Mainz

Nachfolgend der Link zu den Folien und dem Beispiel meines Vortrages, den ich gestern auf der JAX 2015 in Mainz zum Thema AngularJS gehalten habe.


Manfred Steyer: Folien und Beispiele zu meiner Session 'Fünf Dinge, die Sie beim Erstellen moderner Browseranwendungen wissen sollten'

Nachfolgend der Link zu den Folien und den Beispielen meines Vortrages, den ich heute auf der JAX 2015 in Mainz zum Thema 'Fünf Dinge, die Sie beim Erstellen moderner Browseranwendungen wissen sollten' gehalten habe.

Christian Binder [MS]: C++ and Windows Kernel Internals, Filter Driver and Debugging

My friend T.Roy from CodeMachine, USA (http://codemachine.com), will be visiting Munich to present at the ADC++ conference in May 2015. He will be available during 6 - 8, May, to meet up and discuss the Windows training courses offered by CodeMachine as well as present an hour long brownbag seminar on cool debugging tips and tricks. You can reach him at contact@codemachine.com to schedule a meeting and presentation. Please note that the presentation will be in English.

If you are interested in such deep Dives I highly recommend to contact T.Roy Smile

Chris

Johnny Graber: Mein Technologieradar für 2015

Seit der Veröffentlichung meines ersten Technologieradars ist schon mehr als ein Jahr vergangen. Somit ist es höchste Zeit für einen Rückblick, ein Fazit und die Erstellung der nächsten Version.

 

Was brachte mir der Technologieradar?

Der grösste Pluspunkt für mich war die erzwungene Fokussierung. Ein bewusstes Einteilen von verschiedenen Technologien in die einzelnen Ringe hat mir sehr geholfen. Ganz wesentlich war der Ring Hold, in den alles hinein geht mit dem ich mich nicht beschäftigen wollte. Dadurch konnte ich mich auf die Technologien fokussieren, die ich als wichtig erachte und hatte dennoch genügend Zeit um auch auf Neues reagieren zu können.

Ein einmal erstellter Technologieradar ist kein starres Konstrukt. Wie ein richtiges Radar soll dieser vielmehr auf die Umgebung reagieren und wichtiges hervorheben.
Strukturierte Logmeldungen sind so ein neues Thema, das aus der vagen Idee von “Log as Data” und “Business Event Tracking” entstanden ist und zu einigen Blog Posts führte.

 

Mein neuer Technologieradar

Wie im letzten Jahr habe ich wiederum das Projekt Techradar von Brett Dargan verwendet. Die Ringe sind ebenfalls unverändert und folgen der Idee von ThoughtWorks:

  • Hold (abwarten): Keine neuen Projekte mit diesen Technologien starten.
  • Assess (einschätzen): Genauer hinschauen ob sich daraus etwas entwickelt.
  • Trial (ausprobieren): In kleineren und weniger wichtigen Projekten Erfahrungen sammeln.
  • Adopt (umsetzen): Bereit um in kritischen Anwendungen verwendet zu werden.

Mit der 2. Ausgabe macht es nun auch Sinn zwischen bestehenden und sich bewegenden Themen zu unterscheiden. Die Kreise stehen dabei für unveränderte Technologien, während die Dreiecke Neuigkeiten oder grosse Veränderungen markieren.

Techradar_2015

 

Techniken, Verfahren & Methoden

Techradar_2015_Techniques
In diesem Quadranten gibt es wenige Veränderungen. Das neue Thema der strukturierten Logmeldungen sowie Exploratory Testing sind aus meiner Sicht bereit für den produktiven Einsatz und können bei der Fehlervermeidung und Eingrenzung sehr hilfreich sein. Für die konkrete Umsetzung der strukturierten Logmeldungen in .Net hat sich Serilog als äusserst hilfreich erwiesen, während BugMagnet einem beim Exploratory Testing viel Arbeit abnimmt.

Die Visualisierung von Metriken ist ein Thema zu dem ich noch zahlreiche Abklärungen machen muss. Die Ideen dahinter sind sehr spannend, allerdings führen falsch verwendete Metriken zu grossen Problemen. Daher ist hier besondere Vorsicht geboten.

 

Infrastruktur, Plattformen & Services

Techradar_2015_Infrastructure
Beim letzten Radar zögerte ich noch mit der Empfehlung von RavenDB. Mit Version 3 sind diese Bedenken nun ausgeräumt. Fall ein Projekt eine NoSQL-Datenbank benötigt und darauf mittels C# oder einer REST-API zugreifen will, ist RavenDB meine favorisierte Lösung.

Docker ist ein spannender Ansatz um ganze Systemumgebungen auf Anwendungsebene zu virtualisieren. Diese unabhängigen Container vereinfachen nicht nur den Betrieb, sondern auch die Entwicklung. Mit den Ankündigungen von Microsoft für eine Implementierung auf Basis von Windows dürfte Docker auch bald in der .Net Welt eine grosse Rolle spielen. Somit ist es Zeit für einen genaueren Blick auf Docker.

Konkretes zu SharePoint 2016 wird Anfangs Mai zu erfahren sein. Je nach neuen Funktionen und Verbesserungen könnte SharePoint 2016 ein interessantes Thema werden. Mehr dazu wird man allerdings erst nach der Ignite-Konferenz wissen.

 

Sprachen und Frameworks

Techradar_2015_Languages
Eine sehr grosse Änderung kommt mittels ASP.Net 5 (ehemals ASP.Net vNext) auf die .Net Webentwickler zu. Grundlegende Änderungen in der Projektstruktur, eine komplett auf Mono lauffähige Umgebung und ein eine neue Verteilung der Aufgaben zwischen MVC und WebAPI führen zu einem grossen Lernbedarf. Ob sich dieser lohnt wird nicht zuletzt beim Migrationspfad entschieden. Je aufwändiger es ist eine Anwendung zu migrieren, desto länger werden die alten Versionen verwendet.

AngularJS ist ein Framework mit vielen offenen Fragen. Die inkompatible Version 2 setzt auf TypeScript, den JavaScript-Aufsatz den ich immer noch sehr skeptisch betrachte. Falls AngularJS so gut wird wie manche erhoffen, muss ich meine Position zu TypeScript überdenken. Allerdings könnte AngularJS genauso gut aus meinem Technologiestack fallen…

Bezüglich neuer Programmiersprachen sehen Swift und Go sehr interessant aus, allerdings hat auch C# 6 einige Neuerungen die man nicht verpassen sollte. Daher kann ich derzeit noch nicht abschätzen mit was ich mich am Ende mehr beschäftigen werde.

 

Tools

Techradar_2015_Tools
Balsamiq Mockups und Octopus Deploy sind 2 grandiose Werkzeuge, die einem viel Arbeit abseits der Entwicklung abnehmen. Mit den Mockups in Balsamiq lassen sich Anforderungen und Ideen einfach sammeln, während Octopus das Deployment auf wenige Klicks reduziert.

Entity Framework 7 wird Microsofts nächster Anlauf für einen OR-Mapper. Da erneut grundlegende Funktionen (wie Lazy-Loading) fehlen erinnert einem dies sehr stark an die Einführung von EF 4. Ob der Ansatz eines OR-Mapperers sowohl für relationale wie auch NoSQL-Datenbanken die fehlende Abwärtskompatibilität aufwiegt? Auch hier muss sich erst noch zeigen wie gut die veröffentlichte Version wirklich ist.

Microsoft hat in diesem Bereich in den letzten Jahren sehr viel begonnen und kaum etwas langfristig unterstützt. Durch diese fehlende Kontinuität sind Micro ORMs wie Dapper für mich sehr interessant. Diese kommen ohne grosses Framework aus und liefern einen einfachen Zugang zu relationalen Datenbanken.

 

Fazit

Mit all den Neuerungen in der .Net und Microsoft Welt (Angefangen bei Windows 10 über EF 7 bis hin zu ASP.Net vNext) ist ein eigener Technologieradar aus meiner Sicht unverzichtbar.
Trotz der vielen Unsicherheiten kann man sich so auf einige Neuigkeiten fokussieren und verliert sich nicht in zu vielen Details. Daher kann ich jedem empfehlen sich selber einen Technologieradar zu erstellen. Die dafür investierte Zeit lohnt sich.


Einsortiert unter:.Net, dnugBern, webDotNet Tagged: .Net, C#, Lernen, Persistenz, Tools

Uli Armbruster: Product Owner lasst eure Entwickler den Tunnel

Das ist Teil 1 meiner Serie: 3 einfache Tricks für Product Owner mit großer Wirkung.

 

Ideal zeigt der Firm ‘The Social Network’ welche Umgebung Entwickler benötigen: Den sogenannten “Tunnel”.

 

Gemeint ist damit die Möglichkeit konzentriert ohne Unterbrechung an dem (Software-)Produkt arbeiten zu können. Wenngleich agile Methoden wie Scrum und Kanban sehr stark Interaktion und Kommunikation (vgl. Agiles Manifest) fördern, fällt mir immer wieder auf, dass zwar nicht insgesamt zu viel, dafür aber zu häufig miteinander gesprochen wird. Statt dedizierte Gesprächstermine zu nutzen, ruft der Product Owner teilweise mehrfach am Tag den Entwicklern an, um sich z.B. Feedback zu Ideen oder neuen User Stories zu holen.

Das wirkt dann natürlich sehr flexibel im Sinne von frei von Bürokratie und klingt auf Anhieb sehr “kommunikativ”, jedoch sehe ich auch die Nachteile, die nach meiner Ansicht stark überwiegen: Der Entwickler wird kontinuierlich aus dem Tunnel gerissen. Gerade in kleinen und mittelständischen Unternehmen (KMUs) ist die Begründung die, dass genau die statischen Reglements von Konzernen vermieden werden wollen oder aber dass ohnehin nur wenige Entwickler zur Verfügung stehen, um den PO gedanklich zu unterstützen. Das sind alles nachvollziehbare Gründe, jedoch spricht aus meiner Sicht nichts dagegen zu sagen: Wir reservieren täglich von 16.30-17 Uhr dediziert Zeit für den Product Owner und seine Fragen weg. In Scrum gibt es sogar ein dediziertes Meeting während der Iteration dafür: Das Backlog Grooming. Dieses kann im Übrigen auch mehrfach während eines Sprints angesetzt werden.

Wie viel Zeit kleine Ablenkungen kosten, belegen neben Studien (von denen ich an dieser Stelle keine heraussuchen will) auch die eigenen Erfahrungen. E-Mail Eingang, Messenger Nachricht oder nur schnell im Internet was nachgeschaut und schon ist man aus dem Fokus und dem Gedankengang draußen. Das ist unabhängig vom Entwicklerberuf, das ist einfach menschlich. Je nachdem welche Studie gerade wieder veröffentlicht wird, lese ich Zeitangaben zw. 10 und 30 Minuten, die benötigt werden, um wieder an der gleichen Stelle mit der gleichen Konzentration weiterzuarbeiten.

Der geneigte Product Owner kann das einfach nachvollziehen, indem er sich an seine Schulzeit erinnert. Wenn er als Schüler eine mathematische Aufgabe rechnen muss, deren Lösung durch verschiedene Rechenschritte und Umformungen sich auf über 2 DIN A4 Seiten erstreckt und er Mitten drin von einem Mitschüler 5 Minuten mit einem völlig anderen Thema abgelenkt wird, dann muss er nach dem Gespräch erst nochmal seinen Gedankengang verfolgen, um die Rechnung weiterführen zu können.


Einsortiert unter:CIO Topics, German Tagged: Agile / Lean, Agile Development, Prozessmanagement, Scrum

Holger Sirtl: Azure Architecture Guidance auf GitHub

Das Patterns & Practices Team arbeiten schon eine ganze Zeit daran, Empfehlungen für bestimmte Architektur-Fragestellungen, mit Microsoft Azure zu erstellen. Auf GitHub st nun eine erste Version der Azure Architecture Guidance verfügbar. Dieser Leitfaden geht auf verschiedene Aspekte des Entwurfs Azure-basierter Anwendungssysteme ein. Im Einzelnen enthält er folgende Abschnitte:

Weitere Informationen

André Krämer: IT-Visions Infotag: Was bringen .NET 2015, Visual Studio 2015 und Windows 10 am 11. Mai 2015 in München

Was sollte ich als Softwareentwickler in 2015 wissen? Diese Frage beantworte ich am 11. Mai 2015 gemeinsam mit meinen IT-Visions Kollegen Dr. Holger Schwichtenberg und FH-Prof. Manfred Steyer. Wir werden einen Überblick über .NET 4.6, .NET Core 5.0, Visual Studio 2015, Windows 10, AngularJS, Xamarin, Appache Cordova, ASP.NET MVC 6 und das Entity Framework 7 geben. 

Am 23. März haben wir die gleiche Veranstaltung bereits in Essen durchgeführt und durften dort über 130 Teilnehmer begrüßen. Anbei ein paar Impressionen:

 

Manfred Steyer über AngularJS
André Krämer zeigt Windows 10
hs

Wer übrigens gerne selbst mehr über Windows 10, AnuglarJS, Xamarin, ASP.NET MVC 6, .NET Core 5.0 und das Entity Framework 7 erfahren möchte, der kann sich unter http://www.it-visions.de/produkte/vortragsdetails.aspx?v=8035 einen der noch Verfügbaren Plätze für den Infotag in München sichern

Holger Schwichtenberg: Kostenfreie Vorstellung von .NET 2015 und Visual Studio 2015 am 6. Mai in Dortmund

Der Dotnet-Doktor präsentiert alle Neuerungen in .NET und Visual Studio bei der .NET User Group am 6. Mai von 18 bis 21 Uhr.

Norbert Eder: #fotomontag #16

Jeden Montag ein Foto. Der #fotomontag.

Mindestens einmal besucht man mit seiner Kamera auch den Bahnhof. So auch ich und nachfolgend das Ergebnis:

Hauptbahnhof Graz

Hauptbahnhof Graz

Bildinformationen:
35mm
ISO 100
f/7.1
1/100.

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

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

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

Im Urlaub konnte ich endlich das Buch Als auf der Welt das Licht ausging von Tom DeMarco lesen, das schon lange auf meinem Schreibtisch lag. Aufgrund des hitzigen Jahresbeginns, inklusive ausgedehnter Prüfungsphase, kam ich aber erst im Urlaub im März dazu, das Buch wirklich in Ruhe lesen zu können. Nun folgt auch meine Rezension und etwas später die Verlosung zum Buch.

Das Buch im Überblick

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

Hanser Fachbuch, 11/2014, 652 Seiten, Deutsch
ISBN: 978-3-446-43960-3, 19,99 Euro

Sprache: Deutsch – Übersetzt aus dem Englischen von Andreas Brandhorst
Ausstattung: Fester Einband
E-Book: Auch als E-Book verfügbar für 15,99 Euro
Probekapitel: Leseprobe downloaden
Gesamtnote: befriedigend – 3,5 von 5 Sternen
Leseempfehlung: Ja

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

Die Story

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

Als Resultat auf dieses vereitelte Worst-Case-Szenario des 21. Jahrhunderts wird aber der sogenannte Layton-Effekt aktiv, woraufhin das Licht auf der Welt ausgeht. Warum das passiert, also was der Effekt genau bewirkt beziehungsweise verhindert, möchte ich an dieser Stelle nicht verraten. Denn das gehört zu einem wesentlichen Teil der Geschichte. Nur so viel sei gesagt: bestehende Technologie wird nutzlos, was einerseits eine Katastrophe ist, andererseits aber Möglichkeiten für neue Entdeckungen bereithält.

Was hat mir gefallen

Sehr gefallen hat mir, gerade am Anfang der Geschichte, die ausführliche Charakterentwicklung. Insbesondere die Gruppe von Wissenschaftlern wird sehr gut aufgebaut. Auch die Erklärungen rund um den wissenschaftlichen Aspekt der Geschichte, das Buch trägt immerhin den Untertitel Ein Wissenschafts-Thriller, sind äußerst gut gelungen und gehören für mich zum Kernaspekt des Buchs. Mir haben gerade diese Passagen beim Lesen sehr viel Spaß bereitet.

Ebenfalls gelungen sind meiner Meinung nach die Anknüpfungspunkte an aktuelle Geschehnisse der realen Welt. Nichts von alledem ist ferne Zukunftsmusik, sondern kann grundsätzlich schon morgen passieren. Auch die Art und Weise, wie die Charaktere im Buch beschrieben sind und agieren, ist an vielen Stellen deutlich realer als einem das lieb ist. Das betrifft auch die ganzen Planspiele des Buchs, also die zahlreichen was wäre, wenn-Szenarien, die ebenfalls hervorragend auf die reale Welt passen. Alleine aus dem geschichtlichen Teil mit den Simulationen hätte ein eigenständiges Buch werden können, so viel Potential steckt darin.

Was hat mir nicht gefallen

Allerdings gibt es auch einige Dinge, die mir nicht gefallen haben. So gut eine ausführliche Charakterentwicklung bei den Hauptcharakteren auch ist, so störend ist sie bei den vielen Nebenschauplätzen. Und davon gibt reichlich. Langatmig und teilweise in epischer Breite werden Charaktere eingeführt, Nebenschauplätze aufgebaut und im Grunde für die Geschichte völlig irrelevante Handlungsstränge erzählt. Am Anfang dachte ich noch, dass sich das am Ende alles zusammenfügen wird, was allerdings nicht passiert ist. Ich schätze, dass mindestens 250 Seiten für die Geschichte nicht relevant sind. Die hätten auch ruhig fehlen können. Denn sie hinterlassen leider einen faden Beigeschmack. Was absolut schade ist, denn der wissenschaftlich Teil und die Geschichte drumherum sind wirklich sehr gelungen.

Fazit  & Bewertung

Im Endeffekt haben für mich die Stellen, die ich nicht so gelungen fand, einen etwas höheren Einfluss auf die Geschichte und das Buch als Gesamtwerk. Deshalb gebe ich dem Buch nur 3,5 von 5 Sternen beziehungsweise ein befriedigend. Eine Leseempfehlung spreche ich trotzdem aus, da ich vieles an dem Buch wirklich gut finde. Mit ein wenig mehr Fokus auf die eigentliche Geschichte des Buchs und etwas mehr Spannung, denn es soll immerhin ein Thriller sein, hätte das Buch von Tom DeMarco deutlich mehr Einschlagskraft gehabt.

Marco Scheel: Links for 2015-04-19 [del.icio.us]

Jürgen Gutsch: Working with Git – Part 2: Feature Branches

Im letzten Teil habe ich meine Motivation beschrieben mit Git zu arbeiten. In diesem Teil Beschreibe ich wie man Effektiv und Sicher mit Git Arbeiten kann. “Sicher” heißt in diesem Fall sauber, agil und mit sehr wenigen Konflikten. Sicher heißt in diesem Fall auch annähernd fehlerfrei. In diesem Teil geht es darum isoliert in Feature-Branches zu arbeiten.

Wer täglich mit Git arbeitet und dabei bereits Freature-Branches anwendet, wird in diesem Blog-Artikel nichts neues erfahren. Ich schreibe das hier hauptsächlich für Leute die keine oder wenig Erfahrung mit Git haben und für Leute die Git wie SVN oder TFS verwenden, also historisch bedingt mit Commits und Branches eher sparsam umgehen.

Branchen geht schnell

Herkömmliche zentralisierte SCM haben alle den Nachteil, dass Branching relativ schwer oder aufwendig ist. In SVN und TFS wird für jeden Branch zumindest ein eigener Ordner angelegt, was ich für recht umständlich halte, zumindest beim häufigen Wechseln der Branches.

Diese Umstände führen dazu, das in zentralisierten SCM unvollständiger Code, unvollständige Features committet wird oder eben nur ein einziges Mal, wenn das Feature fertiggestellt ist. Allerdings sollte man so häufig wie möglich committen, um eine detaillierte Historie zu erhalten und um seine Arbeitsschritte besser nachvollziehen zu können. Ein weiterer Grund für häufiges committen ist die Größe des Change Sets. Je kleiner dieser ist, desto einfacher fällt das Mergen.

In Git und Mercurial ist das nicht der Fall. Der Wechsel der Branches findet immer im gleichen Ordern – dem sogenannten Workspace – statt. Aus .NET Sicht heißt das, ich kann die Branches innerhalb der gleichen Visual Studio Instanz wechseln. Der Wechsel der Branches passiert also sehr schnell und ich muss meine IDE, meinen Workspace nicht verlassen. Der Wille einen Branch zu erstellen ist größer.

Dieser Vorteil kann genutzt werden um mit Feature Branches zu arbeiten. Das heißt es wird für jedes Feature, das zu entwickeln ist ein eigener Branch angelegt und man kann nun isoliert in diesem Branch arbeiten und beliebig oft committen. Ich kann jederzeit in einen früheren Stand wechseln und von dort aus wieder einen eigenen Branch erstellen, wenn es sein muss. Ich kann einen Branch erstellen nur um etwas schnell zu testen und dann wieder zu verwerfen. Der Vorgang des Branchens selbst bei sehr großen Projekten dauert nur einen Bruchteil einer Sekunde.

Für jede Anforderung einen eigenen Branch zu erstellen, erscheint auf dem ersten Blick sicherlich etwas Übertrieben. Allerdings hilft das enorm den Code lauffähig zu halten. Feature Branches sind auch eine Voraussetzung für Pull Requests die ich in einem dritten Teil kurz vorstellen möchte.

Praxis

Hier möchte ich die Arbeit mit einem Pull Request kurz in einem gespielten Szenario anreißen:

Wir wechseln also als erstes in unseren Workspace.

01_OpenTheRepo

In diesem Workspace gibt es zwei Branches. Der eine ist der “master” der den fertigen, getesteten und abgenommenen Code enthält, der andere ist “dev” welcher der Entwicklungszweig ist. Hier kann unter umständen Code landen der fehlerhaft ist. Auf diesem Branch lauscht ein Build Server mit einem schnellen Continuous Integration Prozess, es wird also gebaut und die Unit Tests werden ausgeführt.

02_ListBranches

Aktuell befinden wir uns im master-Branch, wechseln wir also in den dev Branch, in dem sich aktuell eine HalloWelt.txt befindet. Das ist nun unser Source Code ;)

03_ChangeToDev

Wir haben nun die Anforderung einen neuen Abschnitt mit Infos über Feature Branches anzufügen. Die Anforderungen kommt in Form eines Tickets aus einem Tool wie TFS, Jira, Redmine, etc. Wenn ich einen Feature Branch erstelle habe ich mir angewöhnt meinen Username und einen Ticket Identifier als Branch-Name zu nutzen. In meinem Fall sieht das z. B. so aus: 
juergengutsch/HalloGit-1
<Username>/<Ticket Id>

Die Initialen vorne dran, helfen beim erkennen des Branch Erstellers in einer großen Liste von Feature Braches. Der Slash erzeugt z. B. im SourceTree eine Ordnerstruktur mit den Entwicklerkürzeln als Ordner und darin dann die Liste mit Branch-Namen, bestehend aus dem was nach dem Slash folgt. Diese Schreibweise sorgt also für mehr Übersicht.

Wir erstellen also unseren Branch und wechseln in diesen:

04_FirstFeatureBranch

Nun können wir die Datei öffnen und die Anforderung implementieren und abspeichern. Der Cmder zeigt nicht nur den aktuellen Branch an, in den wir uns befinden, sondern zeigt auch noch dessen Zustand. Rot bedeutet der Branch ist unsauber. Wir haben also Änderungen:

05_ChangedFile

Wir fügen die Änderung nun in unser Change Set ein und committen. Der Workspace ist nun wieder sauber:

06_ComitChanges

Wir möchten unsere Änderungen nun in den dev-Branch mergen. Was wir nun aber machen müssen um Merge-Fehler im dev zu vermeiden, ist diesen zuerst in unserem Feature Branch zu mergen.

Wir wechseln also in den dev-Branch und holen uns die aktuellen Änderungen vom entfernten Repository, schließlich könnte ein anderer Entwickler ebenfalls am Code gearbeitet haben:

07_PullDev

Wie wir nun sehen, gab es tatsächlich Änderungen. In der Historie können wir sehen was gemacht wurde. Nun wechseln wir wieder zurück in unseren Feature Branch und mergen die letzten Änderungen in den aktuellen Workspace. Sollte die Implementation des Features länger gehen, sollten wir immer wieder mal den letzten Stand aus dem dev-Branch in den Feature Branch holen.

08_MergeDev

An dieser Stelle müsste jetzt noch ein Review erfolgen. Das passiert bei uns in Form eines Pull Requests auf den ich im nächsten Teil eingehen möchte. Für den Pull Request müsste der aktuelle Feature Branch in das Remote Repository gepusht werden.

Wer der Merge erfolgreich, baut der Code lokal und laufen alle Tests lokal durch, können wir diesen Feature Branch nun nach dev mergen. Vorausgesetzt unser Feature ist fertig:

10_MergeToDev

Anschließend pushen wir diesen Stand in das Remote Repository:

11_PushToRemote

Wir können uns nun dem nächsten Feature widmen :)

Fazit

Was ich hier mit relativ viel Text und Bilder beschrieben habe ist im Alltag viel weniger Aufwand und ist in einigen Sekunden getan. Lediglich Merge-Konflikte – die Dank der Feature-Branches nur noch selten vorkommen – benötigen etwas mehr Aufmerksamkeit.

Für diesen Zweck ist die Konsole auch absolut ausreichend, da die paar Befehle die man hierbei anwendet schnell gelernt sind. Für alles weitere, was eher selten benötigt wird, kann man schnell das Netz konsultieren. Der Cmder ist für Git eine sehr gute Unterstützung.

Uli Armbruster: WhatsApp auf Android automatisch in die Cloud sichern

Ist dir das auch schon passiert,

  • dass dein Handy geklaut wurde oder kaputt ging und deine ganzen WhatsApp Nachrichten, Bilder und Videos weg waren?
  • dass dein Handyspeicher ständig voll ist, weil die Multimedia-Daten von WhatsApp einfach zu groß sind?
  • dass du auf ein neues Handy gerne deine gesamte WhatsApp Kommunikation übertragen hättest

Wenngleich es sehr viele Lösungen im Netz gibt, sind nur wenige davon für den weniger geübten Anwender geeignet. Die Firma MetaCtrl bietet für Android entsprechende Apps an, womit sich Verzeichnisse auf dem Smartphone automatisiert in den eigenen Cloudspeicher synchronisieren lassen. Nutzt du also Dropbox, OneDrive, Google Drive oder Box ohnehin schon, so ist das eine einfache Lösung. Exemplarisch möchte ich das für Dropbox zeigen:

Die zugehörige App heißt Dropsync (für andere Cloud Dienste findest du die zugehörigen Apps hier). Die App einfach installieren und starten. Dann musst du der App Zugriff auf Dropbox gewähren. Dazu einfach das vorausgewählte Dropbox Konto anklicken und zulassen.

2015-04-18 12.09.38

Als nächstes kannst du dann ein Verzeichnis zur Synchronisation auswählen. Angefangen beim lokalen Verzeichnis, was logischerweise ‘WhatsApp’ heißt. Danach musst du das Verzeichnis in der Dropbox auswählen, wohin die Daten gespeichert werden sollen. Am besten kurz ein neues Verzeichnis anlegen, das du auch WhatsApp nennen kannst. Nun muss nur noch die Synchronisationsmethode ausgewählt würden. Ich würde “nur Uploads” vorschlagen. Was das genau bedeutet, könnt ihr in der App nachlesen.

2015-04-18 12.10.16

Der Vorteil ist, dass damit jederzeit lokal Bilder und Videos gelöscht werden können, diese aber weiterhin in der Cloud bleiben. Außerdem ist im lokalen WhatsApp Verzeichnis auch die benötige Datei, welche für eine Wiederherstellung auf einem anderen Handy benötigt wird.

Das Wiederherstellen ist im Übrigens sehr einfach. Auf dem neuen Handy ebenfalls die App installieren, das WhatsApp Verzeichnis in der Dropbox als Quelle auswählen und lokal ein WhatsApp Verzeichnis erstellen. Als Methode wählst du dann “nur Downloads”. Nachdem das Verzeichnis vollständig synchronisiert wurde, kannst du WhatsApp auf dem Smartphone installieren. Beim ersten Starten wird dein Konto erkannt und eingelesen. Voila, alle Daten wieder da. Jetzt solltest du aber nicht vergessen die Synchronisationsmethode wieder auf “nur Uploads” zu stellen.

 

Am Ende habe ich noch mehrere wichtige Hinweise:

  • Denkt gut darüber nach, ob ihr eure Konversationen und Daten in einem Cloud Speicher sichern wollt. Wer allerdings schon WhatsApp nutzt, nimmt es mit dem Datenschutz ohnehin nicht genau.
  • Die kostenlose Variante von Dropsync ist beschränkt. Es können Dateien von max. 8 MB hochgeladen werden, was bedeutet, dass v.a. größere Videos nicht gesichert werden. Bilder und kleine Videos sind in der Regel davon nicht betroffen. Für 6€ gibt es die Variante ohne Einschränkungen.
  • Stellt in den Einstellungen ein, dass nur bei aktivierter W-LAN Verbindung Daten synchronisiert werden sollen.
  • Generell muss natürlich in der Dropbox genügend freier Speicher zur Verfügung stehen. Kleiner Tipp: OneDrive bietet mehr freien Speicher und ist als Sicherungsplatz für Handydaten völlig ausreichend

2015-04-18 12.09.452015-04-18 12.09.53


Einsortiert unter:German, Misc Tagged: Off-Topic

Code-Inside Blog: Using Basic Authentication in ASP.NET WebAPI

Basic Authentication? Are you kidding?

This was my first thought when I was thinking about a simple approach to protect Web APIs, but then I found this nicely written blogpost: Why I love Basic Auth

The topic is still very controversial, but if it done right and you are using SSL: Why not give it a try. There are other well-known examples, like the GitHub API which can be used with Basic Auth.

Short introduction to Basic Authentication

We can all agree that Basic Authentication is dead simple for HTTP Servers and Clients. The Client just needs to send the given Username and Password Base64 encoded in the “Authorization” HTTP header like this:

Authorization: Basic dXNlcm5hbWU6cGFzc3dvcmQ=

The “dXN” is just “username:password” encoded in Base64.

Now the Server just needs to decode the Username and Password and get the actual user lookup started. The Server can also inform Clients that the authentication is need via this HTTP Response Header:

WWW-Authenticate: Basic realm="RealmName"

All typical Clients and Servers can handle this “basic” stuff very well.

Basic Auth with ASP.NET WebAPI

The following code is based on this excellent tutorial Authentication Filters in ASP.NET Web API 2 , but I’m leaving out the ASP.NET Identity stuff.

The sample code from Microsoft contains an abstract base filter, which will check the request for the authentication header and will extract username and password.

public abstract class BasicAuthenticationAttribute : Attribute, IAuthenticationFilter
{
    public string Realm { get; set; }

    public async Task AuthenticateAsync(HttpAuthenticationContext context, CancellationToken cancellationToken)
    {
        HttpRequestMessage request = context.Request;
        AuthenticationHeaderValue authorization = request.Headers.Authorization;

        if (authorization == null)
        {
            // No authentication was attempted (for this authentication method).
            // Do not set either Principal (which would indicate success) or ErrorResult (indicating an error).
            return;
        }

        if (authorization.Scheme != "Basic")
        {
            // No authentication was attempted (for this authentication method).
            // Do not set either Principal (which would indicate success) or ErrorResult (indicating an error).
            return;
        }

        if (String.IsNullOrEmpty(authorization.Parameter))
        {
            // Authentication was attempted but failed. Set ErrorResult to indicate an error.
            context.ErrorResult = new AuthenticationFailureResult("Missing credentials", request);
            return;
        }

        Tuple<string, string> userNameAndPasword = ExtractUserNameAndPassword(authorization.Parameter);

        if (userNameAndPasword == null)
        {
            // Authentication was attempted but failed. Set ErrorResult to indicate an error.
            context.ErrorResult = new AuthenticationFailureResult("Invalid credentials", request);
            return;
        }

        string userName = userNameAndPasword.Item1;
        string password = userNameAndPasword.Item2;

        IPrincipal principal = await AuthenticateAsync(userName, password, cancellationToken);

        if (principal == null)
        {
            // Authentication was attempted but failed. Set ErrorResult to indicate an error.
            context.ErrorResult = new AuthenticationFailureResult("Invalid username or password", request);
        }
        else
        {
            // Authentication was attempted and succeeded. Set Principal to the authenticated user.
            context.Principal = principal;
        }
    }

    protected abstract Task<IPrincipal> AuthenticateAsync(string userName, string password,
        CancellationToken cancellationToken);

    private static Tuple<string, string> ExtractUserNameAndPassword(string authorizationParameter)
    {
        byte[] credentialBytes;

        try
        {
            credentialBytes = Convert.FromBase64String(authorizationParameter);
        }
        catch (FormatException)
        {
            return null;
        }

        // The currently approved HTTP 1.1 specification says characters here are ISO-8859-1.
        // However, the current draft updated specification for HTTP 1.1 indicates this encoding is infrequently
        // used in practice and defines behavior only for ASCII.
        Encoding encoding = Encoding.ASCII;
        // Make a writable copy of the encoding to enable setting a decoder fallback.
        encoding = (Encoding)encoding.Clone();
        // Fail on invalid bytes rather than silently replacing and continuing.
        encoding.DecoderFallback = DecoderFallback.ExceptionFallback;
        string decodedCredentials;

        try
        {
            decodedCredentials = encoding.GetString(credentialBytes);
        }
        catch (DecoderFallbackException)
        {
            return null;
        }

        if (String.IsNullOrEmpty(decodedCredentials))
        {
            return null;
        }

        int colonIndex = decodedCredentials.IndexOf(':');

        if (colonIndex == -1)
        {
            return null;
        }

        string userName = decodedCredentials.Substring(0, colonIndex);
        string password = decodedCredentials.Substring(colonIndex + 1);
        return new Tuple<string, string>(userName, password);
    }

    public Task ChallengeAsync(HttpAuthenticationChallengeContext context, CancellationToken cancellationToken)
    {
        Challenge(context);
        return Task.FromResult(0);
    }

    private void Challenge(HttpAuthenticationChallengeContext context)
    {
        string parameter;

        if (String.IsNullOrEmpty(Realm))
        {
            parameter = null;
        }
        else
        {
            // A correct implementation should verify that Realm does not contain a quote character unless properly
            // escaped (precededed by a backslash that is not itself escaped).
            parameter = "realm=\"" + Realm + "\"";
        }

        context.ChallengeWith("Basic", parameter);
    }

    public virtual bool AllowMultiple
    {
        get { return false; }
    }
}

There is a small helper class, which will issue an “UnAuthorized”-Response, with the challenge note:

public static class HttpAuthenticationChallengeContextExtensions
{
    public static void ChallengeWith(this HttpAuthenticationChallengeContext context, string scheme)
    {
        ChallengeWith(context, new AuthenticationHeaderValue(scheme));
    }

    public static void ChallengeWith(this HttpAuthenticationChallengeContext context, string scheme, string parameter)
    {
        ChallengeWith(context, new AuthenticationHeaderValue(scheme, parameter));
    }

    public static void ChallengeWith(this HttpAuthenticationChallengeContext context, AuthenticationHeaderValue challenge)
    {
        if (context == null)
        {
            throw new ArgumentNullException("context");
        }

        context.Result = new AddChallengeOnUnauthorizedResult(challenge, context.Result);
    }
}

The real work is now done in this filter:

public class IdentityBasicAuthenticationAttribute : BasicAuthenticationAttribute
{
    protected override async Task<IPrincipal> AuthenticateAsync(string userName, string password, CancellationToken cancellationToken)
    {
        cancellationToken.ThrowIfCancellationRequested(); 

        if (userName != "testuser" || password != "Pass1word")
        {
            // No user with userName/password exists.
            return null;
        }

        // Create a ClaimsIdentity with all the claims for this user.
        Claim nameClaim = new Claim(ClaimTypes.Name, userName);
        List<Claim> claims = new List<Claim> { nameClaim };

        // important to set the identity this way, otherwise IsAuthenticated will be false
        // see: http://leastprivilege.com/2012/09/24/claimsidentity-isauthenticated-and-authenticationtype-in-net-4-5/
        ClaimsIdentity identity = new ClaimsIdentity(claims, AuthenticationTypes.Basic);

        var principal = new ClaimsPrincipal(identity);
        return principal;
    }

}

The Microsoft Sample uses the ASP.NET Identity Stack - for this demo I just hardcoded my expected username and password. If the request contains these credentials the filter will create a new ClaimsPrincipal.

Usage

Using this filter now is pretty simple:

[IdentityBasicAuthentication]
[Authorize]
public class ValuesController : ApiController
{
    ...
}

The “IdentityBasicAuthentication” filter will try to authenticate the user and after that the default “Authorize” filter will kick in.

Error-Results for different scenarios

This question came up in the comments: What are the results for the different “unauthenticated”-scenarios?

Of course, if the Authorization-Header is valid and has the correct username and password the result is HTTP 200 with the desired result. If the authentication fails the “AuthenticationFailureResult” will set the HTTP Status Code to 401. There are some slightly different results based on the input:

Without any Authorization-Header: “HTTP 401 Unauthroized”

x

With an invalid Authorization-Header: “HTTP 401 Invalid credentials”

x

With an valid Authorization-Header, but “wrong” or unkown username or password: “HTTP 401 Invalid username or password”

x

For security reasons the service should not return further information, e.g. username found, but password wrong. I hope my sample is correct, if not: Leave a comment. For more information is OWASP.org a good place.

Thanks John Kors for the question!

Pretty simple, right?

The full source code can be found on GitHub.

Happy coding!

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

Nachdem ich nun mehrfach darauf angesprochen wurde, was denn eigentlich mit meinem Blog los sei, da schon länger keine Einträge mehr erschienen sind, möchte ich diese Nachfragen nun doch zum Anlass nehmen, hier wieder aktiv(er) zu werden. Eine Idee, die ich schon etwas länger verfolge ist, regelmäßige (d.h. wöchentliche) Zusammenfassungen aktueller Neuigkeiten rund um Azure zu posten. Immerhin wird es immer anspruchsvoller, sich auf dem neuesten Stand zu halten. Darüber hinaus wird es natürlich auch wieder Blogs zu technischen Themen geben.

Los geht’s also mit den Neuigkeiten aus der aktuellen Woche (KW17):

DatumNachricht
17.04. Kostenloses eBook: Microsoft Azure Essentials – Azure ML
Dieses Buch gibt einen Überblick über Azure Machine Learning, den Azure Service für Predictive Analytics.
16.04. Azure Friday Video: Azure PowerShell 101 – Managing Azure WebSites
In diesem Video wird gezeigt, wie mit Hilfe von PowerShell Azure Websites bei Problemen analysiert, Fehler gefunden und behoben werden können.
16.04. Docker Client für Windows verfügbar
Mit dem Docker Client können Docker Hosts und Container aus Windows-basierten Umgebungen heraus angesprochen und verwaltet werden.
16.04. Universal Windows Apps SDK für Azure Mobile Engagement verfügbar
Über Mobile Engagement können Analysedaten zur Nutzung mobiler Anwendungen gesammelt und ausgewertet werden. Auch der Versand von gezielten Push Notifications ist möglich. Mit dem SDK können Universal Apps fit für Mobile Engagement gemacht werden.
16.04. Azure Stream Analytics jetzt allgemein verfügbar
Stream Analytics ist ein Service zur Auswertung von Streaming-Daten von z.B. IoT-Geräten, Sensoren, Infrastruktur oder Anwendungen.
16.04. Azure Premium Storage jetzt allgemein verfügbar
Premium Storage ist nun produktiv nutzbar. Damit steht Anwendern ein Azure Speicher mit deutlich erhöhter Performanz zur Verfügung.
15.04. Azure SQL Database: Backup vs. Import/Export
Dieser Blog-Artikel stellt die beiden Optionen, d.h. das eingebaute Backup und die Möglichkeit zum Datenbank-Import/Export gegenüber.
15.04. Azure Media Player veröffentlicht
Mit Hilfe des Azure Media Players lassen sich basierend auf Standards wie HTML5 (MSE/EME) (mit Flash oder Silverlight als Fallback-Lösung) Medienwiedergaben mit adaptivem Streaming umsetzen.
15.04. Z-Ray für PHP von Zend verfügbar als Azure App Service
Z-Ray gibt Entwicklern Insights in ihre PHP Anwendungen.
14.04. Neuer MVA-Kurs: Windows Azure Pack: Express Installation Walkthrough In diesem neuen MVA-Kurs erfährt werden alle Grundlagen zum erfolgreichen Einsatz von Windows Azure Pack erläutert.
14.04. Neuer MVA-Kurs: All About Microsoft Azure Operational Insights
Dieser neue Kurs auf der Microsoft Virtual Academy gibt einen Überblick über Azure Operational Insights.
14.04. Dynamische Manifests, gerenderte Teil-Videos in Media Services
Media Services bieten die Möglichkeit zur Erstellung von dynamischen Manifests sowie die Erstellung von Ausschnitten aus Live Streamings zur Bereitstellung als On-Demand-Content.
14.04. Neuer MVA-Kurs: Windows Azure Pack: Partner Solutions
In der MVA gibt’s einen neuen Kurs, in dem Partner-Lösungen im Zusammenhang mit dem Windows Azure Pack vorgestellt werden.
14.04. Azure Media Services – jetzt CDSA-zertifiziert
Die Media Services haben hinsichtlich der Sicherheit der Medienverarbeitung die CDSA-Zertifizierung (CDSA = Content Delivery and Security Association) erhalten.
14.04. Einfacher Datenimport nach DocumentDB
Stephen Baron, Program Manager, Azure DocumentDB stellt hier das DocumentDB Data Migration Tool vor, mit dessen Hilfe sich bestehende Datenbestände nach DocumentDB importieren lassen.
14.04. Integration einer lokalen Infrastruktur mit Azure
Jim Dial, Principal Content Developer, Cloud+Enterprise, stellt in diesem Blog-Artikel das interaktive “Datacenter Extension reference architecture diagram” vor, mit dessen Hilfe, Integrationsszenarien geplant und diskutiert werden können.
13.04. Azure Media Indexer Spanisch (v1.2)!
Neben Englisch unterstützt der Media Indexer jetzt auch Spanisch.
13.04. Einführung in Live Encoding mit Azure Media Services
Anil Murching, Senior Program Manager, Azure Media Services, gibt in diesem Blog-Artikel einen Überblick über die Möglichkeiten des Live Encodings mit Azure Media Services.
13.04. Azure Media Services jetzt mit Live Encoding, Azure Media Player etc.
Videos können jetzt via Live Encoding live codiert werden. Dabei besteht die Möglichkeit zur dynamischen Paketierung, dynamischen Verschlüsselung, Einfügen von Ad-Markern etc. Der Azure Media Player erlaubt die Erstellung von Wiedergabe-Apps basierend auf verschiedenen Standards wie HTML5, Media Source Extensions (MSE) and Encrypted Media Extensions (EME).

Weitere Informationen

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

Sven Hubert: How to use the VSO Task Board to directly close Tasks and don’t have to think about Remaining Work

The TFS Task Board is a comfortable tool to manage and update tasks. Many of our customers are using the TFS Task Board in their daily meetings to coordinate their work. Despite the comfortable handling, there are still functionalities which need manual activity. To reduce this manual effort, TFS ASAP Online includes several automations.

Today, we introduce a new feature concerning the closing of tasks directly on the VSO Task Board. This feature affects the following Process Templates:

» MSF for Agile Software Development

» MSF for CMMI Process Improvement

1

 

Happy day scenario

In the happy day scenario, we assume that finished Work Items are set to Closed. Additional we assume that a Work Item which is set to Closed does not need any further work. Hence, Remaining Work field should be set to zero.

Using Team Foundation Server, the Remaining work can be set to Zero by modifying the process template. For Visual Studio Online this option does not work. The value of Remaining Work is not altered without manual action.

3

As the screenshot above unveils, Remaining Work still remains on its original value, even though the Work Item is set to Closed.

In the happy day scenario, we would expect the following value:

clip_image006

Solution

We are using an Azure-hosted background service to reduce manual activity, establish the happy day scenario and automatically set Remaining Work to zero when the Work Item set to Closed. This feature is now available in TFS ASAP Online, our official extension for Visual Studio Online.

Note that in the described happy day scenario, Completed Work can automatically be increased by another feature of TFS ASAP Online (Learn how to maintain Completed Work without manual action).

Feel free to register for TFS ASAP Online. In case of any questions, don’t hesitate to ask via tfsasaponline@aitgmbh.de.

How to use the VSO Task Board to directly close Tasks and don’t have to think about Remaining Work is a post from: AIT Blog

codefest.at [MS]: Azure Media Services mit dem Azure Media Player konsumieren

Heute wurde der Azure Media Player im Azure-Blog angekündigt.

Announcing Azure Media Player

Der Azure Media Player dient dazu, Media Streams von den Azure Media Services auf verschiedensten Geräten wiederzugeben. Im O-Ton liest sich das so: “Azure Media Player utilizes industry standards, such as HTML5 (MSE/EME) to provide an enriched adaptive streaming experience.“

image

Wichtig:
Der Azure Media Player unterstützt ausschließlich Media Streams von den Azure Media Services.

Unter der Adresse http://aka.ms/azuremediaplayer kann der Azure media Player live ausprobiert werden. Es können sogar eigene Videos (URLs) aus den Azure Media Services durch Einfügen des .ism/manifest files in die URL und “update player” verwendet werden. Hier gehts zur Ankündigung im Blog.

Viel Spaß damit, oder besser: Film ab!

Johannes Renatus: JavaScript IntelliSense mit Visual Studio 2013

Schon oft habe ich versucht mit der IntelliSense von JavaScript und Visual Studio 2013 warm zu werden, meist hat dies aber nicht wirklich funktioniert. Jetzt habe ich mich doch noch einmal damit auseinander gesetzt und es sogar hinbekommen. Dabei ist es eigentlich ganz einfach, wenn man einmal weiß worauf man zu achten hat. Damit die […]

Fabian Deitelhoff: LEGO Mindstorms EV3: Kennenlernworkshop bei der VHS Unna

In letzter Zeit habe ich einige Kurse und Workshops an Volkshochschulen gehalten. Auch erneut einen Kennenlernworkshop zum Thema LEGO Mindstorms EV3 bei der VHS Unna. Eine Wiederholung des Kurses, der im letzten Jahr so gut angekommen ist. Dieses Mal war es am Samstag, den 28. März soweit. Also schon etwas weiter zurück. Aufgrund von Ostern, sowie den vielen anderen Kursen, komme ich aber leider jetzt erst zu einer kleinen Nachbetrachtung.

Der Kurs

Der Kurs ist organisatorisch identisch geblieben. Wir hatten vier Unterrichtseinheiten zu je 45 Minuten mit einer Pause von 15 Minuten zur Verfügung. Angesetzt war der Kurs von 10.00 Uhr bis 13.15 Uhr und bot somit für einen Einsteigerkurs genug Platz für Themen rund um den LEGO Mindstorms EV3. Insgesamt elf Teilnehmer und Teilnehmerinnen hatten sich dazu entschlossen, etwas zum Mindstorms-System zu erfahren.

Inhaltliches

Wie immer beim Kennenlernworkshop war der Inhalt auf Einsteiger zugeschnitten, die bisher noch nie mit dem LEGO Mindstorms System in Berührung gekommen sind. Aber auch Erfahrungen im Bereich Programmierung oder Softwareentwicklung allgemein waren nicht Voraussetzung. Nur einen Computer bedienen, etwas logisches Denken und Spaß an der Sache sind Pflicht. :)

LEGO Mindstorms EV3 - Kennenlernworkshop bei der VHS Unna.

LEGO Mindstorms EV3 – Kennenlernworkshop bei der VHS Unna.

Zu Beginn habe ich es etwas über die Geschichte des Mindstorms, den Zweck und die dahinter stehende Community erzählt. Anschließend ging es um die Komponenten, die Hardware, Software und natürlich auch um die Entwicklungsumgebung und wie damit erste kleinere Programme entwickelt werden können.

LEGO Mindstorms EV3 - Eine praktische Einführung

LEGO Mindstorms EV3 – Eine praktische Einführung

In der zweiten Hälfte waren dann kleinere Aufgaben an der Reihe, die selbstständig gelöst werden mussten. Dieser Teil läuft erfahrungsgemäß sehr gut, da alle Teilnehmer genügend eigene Ideen zur Umsetzung haben. Manchmal läuft es etwas besser mit der Programmierung, manchmal gebe ich ein paar Hilfestellungen mehr. In Zukunft möchte ich hier gerne noch weitere Aufgaben parat haben, die ich auch an die Teilnehmer verteilen kann, so dass die Aufgabenstellung klarer wird.

Fazit

Wie immer hat es mir auch dieses Mal sehr viel Spaß gemacht. Die Gruppe war sehr gut drauf und hat fantastisch mitgearbeitet. Nicht zuletzt sorgt auch die gute Atmosphäre in der VHS Unna für einen angenehmen Kurs. Ich freue mich schon auf die nächsten Kurse sowohl zum LEGO Mindstorms EV3, als auch zu anderen Themen.

Uli Armbruster: Incorrect password or no TrueCrypt volume found

Mein Laptop ist vollständig mit TrueCrypt verschlüsselt. Jedoch konnte die zweite Partition, welche mit genau dem gleichen Passwort verschlüsselt wurde, nicht geladen. Stattdessen erhielt ich folgende Fehlermeldung:

image

Hintergrund ist der, dass ich ein deutsches Tastaturlayout verwende. Nachdem ich mehrere Methoden, wie sie im Netz zu finden sind, vergeblich durchführte, nahm ich eine Abkürzung und stellte einfach das Passwort um. Ab jetzt nutze ich nur noch Zeichen, die sowohl auf der englischen als auch der deutschen Tastatur gleich sind. Stichwort y/z und Konsorten.

Das Ändern des Kennworts ging übrigens in wenigen Sekunden, sodass ihr nicht wie bei der initialen Encryption mehrere Stunden für den Vorgang veranschlagen müsst.


Einsortiert unter:German, Misc Tagged: Security

Ralf Westphal: Konsequente Verlässlichkeit - Promise Like a Pro

Die grundlegenden Kompetenzen, die jeder Softwareentwickler haben sollte sind nach Joel Spolsky: Smart, and Get things done. Dem kann ich nur zustimmen. Und nicht nur für Softwareentwickler gilt dies, würde ich sagen. Es sind die Voraussetzungen für jeden “Wissensarbeiter”, egal ob Programmierer, Tester, Product Owner, Softwarearchitekt, Entwicklungsleiter usw. Wie es mit der Smartness in der

Uli Armbruster: Microsoft TechCamp Week mit Hackathon in Pforzheim

Microsoft und die Medien-IT-Initiative Pforzheim veranstalten im Mai ein TechCamp in Pforzheim. Die Veranstaltungen sind kostenlos, jedoch ist für jeden Tag eine Anmeldung notwendig. Hier findet ihr die direkten Links zu Anmeldung.

imageAufgrund meiner Erfahrung (1,2,3) kann ich speziell den Hackathon in Pforzheim empfehlen. Der ist jedes Mal eine tolle Sache. Danke an Petra von der Medialesson GmbH, die mich darauf aufmerksam gemacht hat.


Einsortiert unter:Events, German Tagged: Community

Norbert Eder: #fotomontag #15

Jeden Montag ein Foto. Der #fotomontag.

Der Schloßberg in Graz hat so einiges zu bieten. Vom Schloßbergplatz führt ein Stollen zu einem Lift, mit dem man zum Uhrturm fahren kann (und sich die 260 Stufen hinauf erspart). Das Farbenspiel in diesem Tunnel ist wirklich toll, aber auch die S/W-Variante hat einiges zu bieten. Das Foto gefällt mir persönlich sehr gut, nur kann ich mich nicht entscheiden, ob es mir in Farbe oder eben in S/W besser gefällt. Deshalb möchte ich beide Varianten zeigen.

Schloßberglift (Farbe)

Schloßberglift (Farbe)

Schloßberglift (S/W)

Schloßberglift (S/W)

Bildinformationen:
18mm
ISO 200
f/11
3,2 Sek.

Welche Variante findest du besser? Oder hast du Verbesserungsvorschläge? Hinterlasse mir doch einen Kommentar.

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

Jürgen Gutsch: Pretzel – finished the Blog Migration

Die Migration meines Blogs vom Community Server nach Pretzel ist nun technisch fast abgeschlossen.

Die größter Herausforderung bestand darin, die alten Beiträge sauber aus dem alten System in das neue Markdown-basierte System zu bringen. Auf Codeplex fand ich ein kleines Projekt, dass dafür da war, Blogs über die MetaWeblog PI in das BlogML Format zu exportieren (https://metaweblogtoblogml.codeplex.com/). Ich habe das Projekt nun so angepasst, das statt BlogML, der Output Markdown-Dateien sind die im Pretzel, bzw. Jekyll Format vorliegen (https://github.com/JuergenGutsch/MetaWeblog-To-Mardown-Converter). Da dieses Projekt nur einmalig zum Export verwendet wird, habe ich nicht auf sauberen Code geachtet.  Der Code enthält viele kleine Korrekturen die über einfaches String-Replacement gelöst sind. Zum Beispiel müssen Umlaute korrigiert werden. Auszeichnungen für Codebeispiele müssen von BB-Code ähnlicher Syntax nach Markdown übersetzt werden. Bildpfade müssen ggf. angepasst werden.

Für Codebeispiele kommt nun der clientseitiger Javascript Formatter highlight.js zum Einsatz. Pretzel ist bereits für diesen Formatter ausgelegt, das heißt der generierte HTML Code wird von highlight.js verarbeitet.

Nun müssen noch Bilder aus dem alten System in das neue geholt werden, neu verlinkt werden und der Export ist aus technischer Sicht fertig. Diesen Schritt werde ich nicht automatisieren können.

Nun folgt der aufwendigste Schritt:

Mein Blog ist recht gut Verlinkt und ich werden dafür sorgen müssen, dass die alten Links noch gehen. hier werde ich mich nun zwischen mehreren Möglichkeiten entscheiden müssen.

  • Ich nehme alle Artikel in das neuen Blog und ignoriere die alten Verlinkungen.
    • Solange Stefan Falz das alte Blog online hält existieren die Contents doppelt, wäre aus meiner Sicht kein großes Problem
    • Wenn Stefan meinen Blog löscht führen die alten Links ins leere.
  • Ich nehme nur die neuesten und alle zukünftigen Artikel in den neuen Blog auf. Mache also einen harten Break und starte mein Blog unter neuer URL neu.
    • Sobald Stefan aber mein Blog löscht, sind die alten Beiträge allerdings nicht mehr erreichbar.
    • Die Migration wäre fast umsonst gewesen.
  • Ich nehme alle Artikel in das neue Blog und Bitte Stefan eine Umleitung für mein Blog einzurichten.
    • Die Umleitung funktioniert auch nur so lange wie Stefan das alte System, bzw. den Server online lässt.
    • Alle Anfragen auf http://www.aspnetzone.de/blogs/juergengutsch/ müssten nun auf http://blog.gutsch-online.de/ gehen.
    • Ich müsste dann schauen, wie ich die weiteren Umleitungen der Artikel übernehme, da sich die Pfade auch leicht geändert haben.
    • Letzteres scheint mir das schwierigste, da der Blog auf https://pages.github.com/ gehostet wird und die Möglichkeiten dort nicht so umfangreich sind.

Die RSS Syndication ist kein Problem, da die RSS und Atom Feeds des Blog seit Jahren über Googles Feedburner läuft. Ich ändere also dort nur das Quell-Feed in der Feedburner Verwaltung. Die URL für alle Feed-Abonnenten ändert sich somit nicht.

Schwierig also. Mal sehen. Bis ich eine gute Lösung gefunden habe geht’s mal noch in diesem System weiter :)

Jürgen Gutsch: Working with Git – Part 1

Seit gut zwei Jahren arbeite ich nun fast ausschließlich mit Git, nachdem ich vorher mehrere Jahre mit Mercurial gearbeitet habe war der umstieg nicht allzu schwierig. Heute sind es noch einige alte private Projekte die mit Mercurial laufen. Migrieren möchte ich diese nicht. Warum auch? Mercurial ist genauso gut, für Einsteiger in die verteilten SCM sogar besser, das es eine einfachere API besitzt. Ein seit drei Jahren laufendes privates Projekt, basiert im Backend sogar auf Mercurial zur Sicherung, Versionierung und Verteilung von Daten.

Erst seit ich in Basel bei der YooApps arbeite, bin ich sowohl beruflich als auch privat auf Git umgestiegen. Fazit? Vom Prinzip keinen Unterschied. Wieso auch? Ich halte beide Systeme für gleichwertig. Git bietet lediglich mehr Möglichkeiten, wohingegen Mercurial wesentlich einfacher zu bedienen ist.

Soviel zur Einleitung. Was gibt es zu Kritisieren? Nur eines. Es gibt keine wirklich gute GUI für Git, so wie man es von Mercurial gewöhnt ist. Die hg Workbench ist ein einfach zu bedienendes und übersichtliches zentrales Werkzeug, mit dem man sogar gleichzeitig mehrere Repositories bedienen kann. Git kennt kein solches Werkzeug. Das was mit TortoiseGit mitgeliefert wird, sind mehrere einzelne unabhängige Werkzeuge, die eher umständlich zu bedienen sind. SourceTree von Attlassian kommt der hg Workbench recht nahe, hat sich aber als sehr träge und wesentlich unübersichtlicher herausgestellt. SourceTree habe ich mehrere Monate verwendet, nachdem es aber irgendwann bei großen Workspaces mit vielen Branches und vielen Dateien sehr schnell langsam wird, benutze ich es nun nicht mehr.

Über die Git Integration im Visual Studio habe ich mich bereits geäußert. Obwohl dieses nun wesentlich besser geworden ist, nutze ich SCM Integrationen im Visual Studio generell sehr ungern, weil diese nur das sehen, was das Visual Studio sieht. Das heißt alles was im Solution Explorer sichtbar ist, kann mit diesen integrierten SCM Werkzeugen behandelt werden. Alles was über das Dateiensystem direkt gemacht wird, wird von den Integrationen nicht gesehen. Das Gilt auch für den TFS und VisualSVN und ähnlichen Tools.

Das heißt es bleibt für Git nur die Konsole übrig, bzw. den Cmder. Das ist aus meiner Sicht eine der besten Konsolen, der nicht nur nützliche Linux-Befehle mitbringt, sondern eine Git Integration enthält, welche die Übersicht in der Konsole enorm steigert. Den Cmder nutze ich nun seit sehr langer Zeit als Git Client. Das beste an dieser Konsole, ist allerdings die Nutzung von Ctrl+V um Text, Pfade, Befehle, etc. direkt in die Konsole zu bringen. Die paar Git Befehle die man im Alltag verwendet sind relativ schnell verinnerlicht. Alles andere lässt sich schnell Googlen.


im Cmder wird immer der aktuelle Branch am Ende des aktuellen Ordners angezeigt, wenn es sich um einen Git-Workspace handelt.

Im folgenden Artikel möchte ich beschreiben wie Ich selber und wie wir bei der YooApps mit Git sehr erfolgreich arbeiten.

Uli Armbruster: Vorlage für die Erwiderung von Privatpersonen bei E-Mail-Werbung

Nach meinem ersten Beitrag über Telefonwerbung will ich euch jetzt die Vorlage zur Erwiderung von E-Mail-Werbung geben. Dabei spreche ich in erster Linie von Werbung wie sie z.B. von einem Fitnessstudio oder einer Versicherung kommen kann. Offensichtliche Spam- oder Phising Mails, wie sie für Viagra typisch sind (auf diese sollte man generell nicht antworten, weil es sonst nur noch mehr werden), sind ebenso wenig gemeint wie Newsletter. Bei letzteren muss nach aktueller Gesetzeslage immer auch ein Abmelde-Link mitgeschickt werden, der in der Regel ganz am Ende der E-Mail und in kleiner Schrift (häufig ‘Newsletter abbestellen’) zu finden ist. Sollte dies nicht der Fall sein, ist das klar rechtswidrig.

Ich möchte abschließend noch darauf hinweisen, dass ich weder Jurist noch Datenschutzbeauftragter bin und es sich hierbei lediglich um eine Hilfestellung als Privatperson handelt. Holt euch also im Zweifelsfall bei entsprechenden Stellen Hilfe dazu.

Ich möchte Sie darauf hinweisen, dass ich von Ihnen keinerlei Werbung erhalten möchte. Ihre E-Mail war zudem rechtlich nicht erlaubt, da Ihnen keine (ausdrückliche) Zustimmung meinerseits vorlag. Ihre Werbung wird demnach, gemäß §7 Abs. 2 Nr. 3 UWG, als unzumutbare Belästigung angesehen.

Hiermit fordere ich Sie auf, wie im § 19 BDSG Abs. 1 vorgesehen, mir mitzuteilen, welche Daten Sie über mich gespeichert haben, aus welcher Quelle Sie diese Daten haben und an wen Sie diese Daten weitergegeben haben.

Des Weiteren erwarte ich, dass gemäß § 20 BDSG Abs. 2 meine Daten gelöscht werden. Wenn dies aufgrund eines Gesetzes nicht möglich ist, sind die Daten zu sperren (vgl. §20 BDSG Abs. 3).

Aus den gegebenen Gründen bitte ich Sie deshalb, mir jegliche Art von Werbung (E-Mail, Telefon, Post) nicht mehr zu schicken und mich aus Ihrem System zu entfernen.

Es gibt dedizierte Listen im Internet, in welche man sich eintragen kann, um von den Werbetreibenden nicht adressiert zu werden. Jedoch werden diese Verzeichnisse nicht sonderlich beachtet. In einem späteren Beiträge werde ich dazu einen Link veröffentlichen.


Einsortiert unter:German, Misc Tagged: Datenschutz

Fabian Deitelhoff: AntMe: Ferienworkshop bei der VHS Unna

Neben meinen Bestrebungen, Kindern, Jugendlichen und Erwachsenen den LEGO Mindstorms EV3 in Volkshochschulen näher zu bringen, versuche ich mich auch an Themen, die etwas mehr in Richtung Softwareentwicklung gehen. Natürlich ist das beim LEGO Mindstorms auch der Fall. Denn ohne Programmierung tut sich bei den EV3-Modellen nicht viel bis gar nichts.

Mit etwas mehr Softwareentwicklung meine ich aber hauptsächlich eine andere Sprache. Die grafische Programmierung beim Mindstorms ist recht abstrakt. Mit meinem ersten AntMe-Kurs bei der VHS Unna habe ich die Richtung zu C# und einer gänzlich anderen Aufgabenstellung verschoben. Jetzt geht es mehr um Syntax, gemischt mit ein wenig künstlicher Intelligenz und Schwarmverhalten, sowie um Tools wie Visual Studio und natürlich AntMe an sich.

Der Kurs

Teilgenommen haben fünf junge Menschen im Alter von 10 bis 14 Jahren, wenn ich mich da noch recht erinnere. Alle ohne wesentliche Vorkenntnisse im Bereich der Softwareentwicklung. Weder mit C# noch mit einer anderen Sprache. Einige kannten Scratch, andere hatten schon mit dem LEGO Mindstorms EV3 Erfahrungen sammeln können, was das Umsetzen von Ideen in einen Programmablauf angeht. Manche hatten gar keine Erfahrungen.

VHS-Kurs "Programmieren lernen mit AntMe!"

VHS-Kurs “Programmieren lernen mit AntMe!”

Ein paar Kenntnisse in Richtung Programmablauf oder ähnliches sind natürlich wertvoll, wenn es um die Entwicklung von Algorithmen aller Art geht. Allerdings ist AntMe! so einfach gestaltet, dass die Funktionsweise schnell verstanden wird und somit auch Anfänger keinerlei Probleme bei der Einarbeitung haben.

Der Inhalt

Daher war es keine große Überraschung, dass sich die Teilnehmer zügig mit AntMe! und Visual Studio befassen konnten und auch verstanden haben, worum es geht.

Logo von AntMe!Natürlich ist die Programmierung an sich erst einmal eine kleine Hürde. Alle Zeichen müssen korrekt eingegeben werden und eine Programmiersprache wie C# meckert selbstverständlich auch bei jeder kleinsten Abweichung. Und trotzdem haben sich alle schnell an diese neuen Anforderungen gewöhnt und sie hervorragend gemeistert, nachdem ich ein paar Grundlagen zur Syntax und Visual Studio gezeigt hatte.

Konkret ging es inhaltlich um viele Dinge aus der Informatik beziehungsweise dem Berufsalltag eines Informatikers oder Softwareentwicklers. So festgeschrieben ist das in unserer Branche ja nicht. Einige der Themenschwerpunkte waren: Programmierung, Tools, Automaten, Zustandsdiagramme, analytisches Denken, Lösungskompetenz, sowie Teamarbeit und Kommunikation.

Alle Themen wurden dabei anhand der Ameisen beziehungsweisen deren gewünschten Verhalten eingeführt. Am Anfang habe ich das AntMe! Programm erklärt und zwei, drei Kleinigkeiten vorgeführt, so dass alle verstehen konnten, wie beispielsweise eine Aktion ausgeführt werden kann und wie das mit den Simulationen funktioniert. Danach war aber eigenständiges Arbeiten angesagt. Ich habe hin und wieder Anregungen eingestreut, was die Ameisen noch machen könnten oder wo es Potenzial für Verbesserungen gibt. Allerdings kamen die Teilnehmer schon selbst auf die meisten Verbesserungen. :)

Einer dieser coolen Momente war, als der jüngste Teilnehmer auf den Monitor eines anderen Teilnehmers zeigte und meinte, er hätte dort einen Programmierfehler. Es würde ein “if” fehlen. Gemeint war eine Stelle wie die folgende.

public override void Sieht(Zucker zucker)
{
    GeheZuZiel(zucker);
}

public override void Sieht(Zucker zucker)
{
    if(Ziel == null)
    { 
        GeheZuZiel(zucker);
    }
}

Die zweite Variante ist korrekt, da sich in diesem Fall eine Ameise nur zu einem Zuckerhaufen bewegt, wenn kein Ziel vorhanden ist, also beispielsweise die Ameise nicht schon am Zuckerhaufen ist oder vielleicht sogar einen weiteren sieht. Solche Stolperfallen hatten die Teilnehmer sehr schnell drauf und wussten damit umzugehen. Auch in anderen Situationen. Mit gerade einmal 10 Jahren und nach wenigen Stunden mit C# und AntMe!. :)

Ameisen vs. Ameisen

Am besten gefallen haben mir die kleinen Turniere, die als Jeder gegen Jeden-Simulationen aufgebaut waren. :) Dabei sind alle Ameisenvölker, natürlich auch mein eigenes, über 10.000 Iterationen in drei Durchläufen, gegeneinander angetreten. Danach wurde eine Rangliste anhand der Gesamtpunkte aufgestellt und der letzte musste leider für die nächste Runde aussetzen. So ging es weiter, bis die ersten drei Plätze ermittelt waren.

Nach den drei Durchläufen durften Änderungen am Ameisenvolk vorgenommen werden, um vorhandene Schwächen auszumerzen oder aktuelle Stärken weiter zu verbessern. Meistens haben diese Verbesserungen auch gegriffen und das Ergebnis wurde tatsächlich etwas besser. Ein Denk- oder Programmierfehler hat aber auch so manches Mal etwas ganz anderes verursacht, als das gewünscht war. Wie im echten Leben. 😉

Schwierigkeiten

Schwer finde ich es, Konzepte wie die objektorientierte Programmierung und alles was damit zusammenhängt einzuführen. Beispielsweise Überladung und Vererbung. Alles Konzepte, die AntMe! beziehungsweise die implementierten Ameisen verwenden. Den Grund dafür zu vermitteln finde ich aber durchaus anspruchsvoll. Bis auf Klassen an sich und Methoden habe ich während den beiden Kurstagen auch keinerlei Dinge angesprochen. Ich fand das reichte an Grundlagen aus. Für zukünftige Kurse oder welche mit mehr Zeit, müsste ich mir noch mal etwas dazu überlegen.

Fazit

Mir hat der Kurs viel Spaß gemacht und so wie mir die Teilnehmer Feedback gegeben haben, ihnen auch. :) Ich hoffe ich kann diese Art von Kursen in Zukunft öfters durchführen. Vielleicht auch im Rahmen einer AG oder ähnliches an einer Schule. Denn ich finde AntMe! als Einführung in die Welt der Programmierung/Softwareentwicklung, beziehungsweise allgemein für Informatik-Themen, wirklich sehr gut geeignet.

Ralf Westphal: Die IODA Architektur

Über die Jahre haben einige grundlegende Architektmodelle um unsere Gunst gekämpft. Mir fallen ein in chronologischer Reihenfolge ein: MVC (Ja, das rechne ich zu Architekturmodellen, weil es Leute gibt die sagen, "Unsere Software hat eine MVC-Architektur.) das Schichtenmodell Pat Hellands Executants, Emissaries und Fiefdoms Alistair Cockburnss Hexagonal Architecture aka Ports-and-Adapters

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

Express gilt als das De-Facto-Framework zur Entwicklung serverseitiger Webanwendungen auf Basis von Node.js, enthält aber keine eingebaute Lösung für Authentifizierung. Das Middleware-Modul Passport schafft Abhilfe.

codefest.at [MS]: Was Spannendes, was zum Rumspielen und was zum Naschen!! …

… Was hättet Ihr denn Lieber?

  • Die neuesten Technologien und Gadgets aus dem Microsoft Hexenkessel erleben?
  • Eine Woche vor dem offiziellem Verkaufsstart exklusiv die neuesten Surface Geräte ausprobieren?
  • Mit Popcorn und Cola im Kreise gleichgesinnter einen interessanten Abend verbringen?

Oder am besten alles auf einmal?

Kommt zum kostenlosen //build Keynote-Streaming in einem Kino in Eurer Nähe und verbindet das Angenehme mit dem Nützlichen!

Live dabei sein mit dem Microsoft //build Keynote-Streaming!

Vom 29. April bis zum 1. Mai findet auch heuer wieder die //build statt. Für alle Entwickler ist die //build ein "Must Event". Seit Anbeginn ist diese Veranstaltung in kürzester Zeit ausverkauft ist. So auch heuer wieder.

Damit Ihr zumindest die Keynote im //build Feeling erleben könnt laden wir Euch ein mit uns gemeinsam die Keynote in Kinos in Wien, Linz und Graz zu erleben!

Was Euch als Besucher erwartet:

  • Die Highlights der restlos ausverkauften //build 2015 Konferenz live aus San Francisco.
  • Ein anschließender Abendfilm inklusive Popcorn und Getränk.
  • exklusiv in Wien: Das neue Surface 3 zum Anfassen und Ausprobieren, schon vor dem offiziellen Österreich-Release!

Also rasch zum kostenlosen //build Keynote-Streaming anmelden, und wir wünschen Euch schon jetzt einen interessanten und unterhaltsamen Kinoabend!

Wo & Wann: 29. April 2015 am 17:15 Uhr in den folgenden Kinos:

Bei Fragen, Wünschen und Komplikationen aller Art erreicht Ihr mich wie gewohnt unter meiner E-Mail Adresse.

Wir sehen uns im Kino!

Gerhard Göschl, Marketing Leiter - IT-Spezialisten und Software Entwickler

Microsoft Österreich GmbH
Gerhard.Goeschl@Microsoft.com

Uli Armbruster: Vorlage für die Erwiderung von Privatpersonen bei Telefonwerbung

In den folgenden Tagen werde ich Vorlagen für schriftliche Erwiderungen auf Werbung jeglicher Art veröffentlichen. Dazu gehören ungewünschte E-Mails, Anrufe und Briefe sowohl im privaten als auch im beruflichen Umfeld.

Heute starte ich mit Telefonwerbung im privaten Umfeld. Wenn z.B. jemand bei euch zuhause anruft um ein Gewinnspiel zu bewerben, ohne dass eine Einwilligung eurerseits vorliegt, dann könnt den folgenden Text verwenden.

Ich möchte abschließend noch darauf hinweisen, dass ich weder Jurist noch Datenschutzbeauftragter bin und es sich hierbei lediglich um eine Hilfestellung als Privatperson handelt. Holt euch also im Zweifelsfall bei entsprechenden Stellen Hilfe dazu.

 

Ich möchte Sie darauf hinweisen, dass ich von Ihnen keinerlei Werbung erhalten möchte. Ihr Anruf war zudem rechtlich nicht erlaubt, da Ihnen keine (ausdrückliche) Zustimmung meinerseits vorlag und Ihr Anruf demnach, gemäß §7 Abs. 2 UWG, als unzumutbare Belästigung angesehen wird.

Hiermit fordere ich Sie auf, wie im § 19 BDSG Abs. 1 vorgesehen, mir mitzuteilen, welche Daten Sie über mich gespeichert haben, aus welcher Quelle Sie diese Daten haben und an wen Sie diese Daten weitergegeben haben.

Des Weiteren erwarte ich, dass, gemäß § 20 BDSG Abs. 2, meine Daten gelöscht werden. Wenn dies aufgrund eines Gesetzes nicht möglich ist, sind die Daten zu sperren (vgl. §20 BDSG Abs. 3).

Aus den gegebenen Gründen bitte ich Sie deshalb, mir jegliche Art von Werbung (E-Mail, Telefon, Post) nicht mehr zu schicken und mich aus Ihrem System zu entfernen.

 

Unerlaubte Telefonwerbung bleibt ÄrgernisAktualisierung vom 11.04.2015:

Ausgerechnet heute bin ich in der News-App von ZDF auf folgende Meldung gestoßen (siehe Screenshot). Im Anschluss an die Blogserie werde ich deshalb noch einen weiteren Artikel mit Anlaufstellen veröffentlichen, für den Fall, dass die Unternehmen die Werbung nicht unterlassen. Sieht man sich die hohe Zahl schriftliche Beschwerden an, wird deutlich, dass das Thema durchaus Anklang findet. Wenn – subjektiv aus meiner Sicht geschätzt – nur jeder 10 Verbraucher eine Nachricht an die Bundesnetzagentur schreibt, so sprechen wir von über 250.000 Werbeanrufen.

 

 


Einsortiert unter:German, Misc Tagged: Datenschutz

Ralf Westphal: Die Selbstlern-Challenge - Retrospektive

Zehn Wochen sind wie im Flug vergangen, seit ich zur Teilnahme an einer Selbstlern-Challenge eingeladen hatte. Das Angebot Die Herausforderung war, sich selbstständig über einen Zeitraum von 10 Wochen in das Thema Flow Design & Co einzuarbeiten. Einzige Bedingung: Als Dokumentation des Dranbleibens am Thema sollte mir jede Woche eine Frage per Email geschickt werden - die ich dann

Martin Richter: Stark verzögertes Öffnen von Projekten in Visual Studio 2013

In der letzten Zeit hatte ich immer mal wieder so einen komischen Effekt, dass ich VS-2013 gestartet habe und beim Öffnen einer Solution auf einmal nur noch die Eieruhr (Blue Circle of Death) zu sehen war. In der Anzeige stand meisten das irgend ein Projekt N vom M zu laden wäre. :sad:
Als mir das das erste mal passierte habe ich oft den Visual Studio Prozess brachial beendet, neu gestartet und dann ging es oft. Aber nicht immer. Wenn ich lang genug gewartet hatte wurde letzten Endes die Projekte immer geladen.

Weil mich das irgendwann nervte habe ich mal versucht Visual Studio selbst zu debuggen. Die Threads die aktiv waren, hatten immer was mit dem Team Foundation Server zu tun. Bald merkte ich, dass lokale Projekte nie betroffen waren sondern immer nur Solutions, die auch auf unserem zentralen TFS Server lagen.

Der nächste Schritt :idea: war dann beim nächsten Hänger mal die Firewall und den Netzwerkschutz abzuschalten. Wir verwenden hier seit Jahren Symantec Endpoint Protection (aktuell 12.1 RU5). Bingo !!! :) Kaum, dass ich die Firewall abgeschaltet hatte lief, das Laden des Projektes sofort durch.

Entsprechend haben wir in den Firewall Einstellungen für Visual Studio jetzt eine Ausnahme Regel definiert und seit dem keine Probleme mehr. :mrgreen:

 


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

Manfred Steyer: TypeScript 1.5 Alpha in Visual Studio installieren

Seit einigen Tagen liegt eine Alpha-Version von TypeScript 1.5 vor. Eines der Highlights dieser neuen Version ist die Unterstützung für die EcmaScript-6-basierte Module. Ein weiteres Highlight ist das Konzept der Dekoratoren. Dabei handelt es sich um einen Vorschlag [1, 2] zur Integration von Annotationen in EcmaScript [1, 2]. Das Ziel davon ist es, bestehenden Code durch das Hinterlegen von Metadaten zu erweitern. Angular 2 wird dieses Konzept nutzen und es ist davon auszugehen, dass auch andere Frameworks davon Gebrauch machen werden, zumal sich analoge Konzepte in Sprachen ebenfalls einer großen Beliebtheit erfreuen. Für TypeScript 1.5 Alpha steht ein Sublime-Text-Plugin zur Verfügung. Dieses findet man inkl. einer Installationsanleitung unter [3]. Die vorliegende Alpha-Version kann jedoch auch mit Visual Studio 2015 (CTP) und Visual Studio 2013 genutzt werden. Um TypeScript 1.5 Alpha in Visual Studio einzurichten, ist es zunächst via Git zu beziehen:

git clone github.com/Microsoft/TypeScript

Anschließend führt man noch im auf diese Weise erhaltenen Verzeichnis das Powershell-Skript VSDevMode.ps1 aus. Für die Installation in Visual Studio 2015 (CTP) ist an den Parameter vsVersion der Wert 14 zu übergeben; für die Installation in Visual Studio 2013 hingegen der 12:

powershell
.\scripts\VSDevMode.ps1 -enableDevMode -vsVersion 14 -tsScript .\bin
exit

Hat alles geklappt, bietet Visual Studio innerhalb von .ts-Dateien Intellisense für TypeScript 1.5 an und auch beim Kompilieren kommt dann diese Alpha-Version zum Einsatz.

Links

Manfred Steyer: Validierungsframework mit Dekoratoren und Annotationen in TypeScript 1.5

TypeScript 1.5 führt neben der Modul-Grammatik von EcmaScript-6 und anderen netten Neuerungen auch das Konzept der Dekoratoren ein. Dabei handelt es sich um Funktionen, mit denen andere Sprachkonstrukte annotiert werden können. Zu diesen Konstrukten zählen Funktionen, Klassen aber auch Eigenschaften. JavaScript ruft die Dekorator-Funktionen beim Start eines Skripts auf und übergibt an diese die annotierten Konstrukte. Der Dekorator hat dann die Möglichkeit, diese Konstrukte zu erweitern oder durch andere Konstrukte zu ersetzen. Einen Überblick zu diesem Sprachkonstrukt, das auch in Angular 2 zum Einsatz kommen wird, findet man unter [1] und [2]. Dieser Beitrag demonstriert anhand der aktuell vorliegenden Alpha-Version von TypeScript den Einsatz von Dekoratoren am Beispiel eines einfachen Validierungsframeworks. Die Idee ist es, für Klassen sowie deren Eigenschaften mittels Annotationen Validierungsregeln festzulegen. Das nachfolgende Beispiel zeigt eine solche Klasse:

@Validate(h => h.minPrice <= h.maxPrice, "min < max")
class Hotel {

    @Required
    name: string;

    @MinValue(0, "Min: 3")
    @MaxValue(7, "Max: 7")
    ranking: number;

    minPrice: number;
    maxPrice: number;
}

Im gezeigten Beispiel validiert die Annotation @Required ein Pflichtfeld und @MinValue sowie @MaxValue prüfen gegen eine festgelegte untere bzw. obere Schranke. Diese Schranken sowie die Fehlermeldungen nehmen sie als Parameter entgegen. Die Annotation @Validate wird im Gegensatz zu den anderen Annotationen auf eine Klasse angewandt. Sie erhält einen Lambda-Ausdruck für die Validierung und ebenfalls eine Fehlermeldung. Zur Realisierung der Validierung soll jedes zu Validierende Objekt ein Array __validators mit Validierungsfunktionen erhalten. Jede Validierungsfunktion prüft einen Aspekt des Objektes und retourniert im Fehlerfell eine Fehlermeldung; ansonsten liefert sie null zurück. Für diese Aufgabe nutzt das hier betrachtete Beispiel die Hilfs-Funktion addValidator:

function addValidator(target, fn, errorMessage) {

    var validationFn = () => !fn() ? errorMessage : null;

    if (!target.__validators) {
        target.__validators = [];
    }

    target.__validators.push(validationFn);

}

Diese Funktion nimmt das zu validierende Objekt, eine Funktion zum Validieren und eine eventuelle Fehlermeldung entgegen. Die übergebene Funktion liefert per Definition true, wenn die durchgeführte Validierung erfolgreich war; ansonsten false. Damit erstellt addValidator eine Validierungsfunktion, die im Fehlerfall die Fehlermeldung retourniert, und platziert diese in der Variable validationFn. Anschließend prüft addValidator, ob das Objekt bereits ein Array __validators aufweist und fügt dieses bei Bedarf hinzu. Danach hinterlegt sie die Validierungsfunktion in diesem Array. Eine erste Version des Dekorators Required findet sich im nächsten Beispiel. Da dieser Dekorator auf Attribute angewendet wird, bekommt er per Definition das betroffene Objekt und den Namen der Eigenschaft übergeben. Er erstellt eine Funktion, welche ein Pflichtfeld validiert. Diese prüft, ob der zu prüfende Wert null oder undefined ist. Anschließend registriert Required diese Funktion zusammen mit einer einfachen Fehlermeldung als Validierungsfunktion. Dazu kommt die zuvor betrachtete Funktion addValidator zum Einsatz.

function Required(target, name) {
    var fn = () => target[name] !== null && typeof target[name] !== "undefined";
    var errorMessage = name + " is required!";
    addValidator(target, fn, errorMessage);
}

Weniger schön am letzten Beispiel ist die Tatsache, dass die Fehlermeldung hardcordiert hinterlegt wurde. Das kann umgangen werden, indem man eine Funktion vorsieht, die den Dekorator erzeugt. Solche Factory-Funktionen können ebenso wie Dekoratoren in Form von Annotationen im Quellcode platziert werden. Das nachfolgende Beispiel demonstriert dies. Es zeigt zwei Factory-Funktionen, die Parameter zum Steuern der Validierung entgegen nehmen und jeweils eine Dekorator-Funktion mit der gewohnten Signatur retournieren:

function MinValue(min, errorMessage) {

    return function (target, name) {
        var val = () => target[name] >= min;
        addValidator(target, val, errorMessage);
    };
}

function MaxValue(max, errorMessage) {
    return function (target, name) {
        var val = () => target[name] <= max;
        addValidator(target, val, errorMessage);
    };
}

Die Factory-Funktion für die Annotation Validate gestaltet sich ähnlich: function Validate(fn, errorMessage) { return function (target) { addValidator(target.prototype, () => fn(target), errorMessage); }; } Zum Validieren nimmt sie einen Lambda-Ausdruck sowie eine Fehlermeldung entgegen. Der erzeugte Decorator nimmt wie gewohnt das betroffene Konstrukt entgegen. Da Validate zum Annotieren von Klassen gedacht ist, handelt es sich hierbei nicht um ein Objekt, sondern um die jeweilige Klasse bzw. Konstruktor-Funktion. Ein Parameter für den Namen der markierten Eigenschaft ist aus demselben Grund hinfällig. Damit addValidate die Validierungsfunktion zu sämtlichen aus der Klasse erzeugten Objekten hinzufügt, übergibt das betrachtete Beispiel den Prototyp dieser Klasse an addValidator. Nun benötigt man nur noch ein Stück Code, welches sämtliche Validierungsfunktionen eines Objektes aufruft und die so erhaltenen Fehlermeldungen einsammelt. Das nächste Beispiel zeigt ein eine Klasse Validator, welche sich um diese Aufgabe kümmert:

class Validator {

    static validate(obj) {

        var errMessages = [];

        if (!obj || !obj.__validators) return errMessages;

        for (var fn of obj.__validators) {
            var errMessage = fn();

            if (errMessage) {
                errMessages.push(errMessage);
            }
        }

        return errMessages;
    }
}

Zum Testen der Implementierung kann man die eingangs gezeigte Klasse zum Beispiel instanziieren und an Validator.validate übergeben:

var hotel = new Hotel();
hotel.name = null;
hotel.ranking = 99;
hotel.minPrice = 120;
hotel.maxPrice = 80;


var err = Validator.validate(hotel);

if (err.length > 0) {
    alert(err.join("\n"));
}
else {
    alert("No errors!");
}

Links

Daniel Schädler: ASP.NET MVC 5 Paging selber implementiert

Bei meinem aktuellen Projekt, wollte ich das Paging in einer MVC Applikation selber, ohne Mithilfe der NuGet PagedList for MVC, realisieren.

Zuerst der Reihe nach

  1. Wie wird die erste Seite aufgerufen?
  2. Wie werden dann die folgenden Seiten aufgerufen?

Wie wird die erste Seite aufgerufen?

Zuerst schauen wir uns den HTML Markup des Linkes an, bei welchem wir zur entsprechenden Seite navigieren.


Wie ihr seht ist dass ein ganz normaler Querystring über http

Die Seite wird dann über folgende ActionMethode aufgerufen, wie auch die Seiten die dann folgen. Zum Beispiel Seite 2 etc.

Wie werden dann die folgenden Seiten aufgerufen?

            int toalPageCount = (context.Set<Skater>().Where(skater => skater.IsActive && skater.IsSEV).OrderBy(skater => skater.Lastname).Count() / 10);
            int pageCounter = 0;

            Dictionary<int, List<SkaterDTO>> pages = new Dictionary<int, List<SkaterDTO>>();
            List<SkaterDTO> DTO = new List<SkaterDTO>();                        

            if (selectedPage == 1)
            {
                context.Set<Skater>().OrderBy(skater => skater.Lastname).Where(skater => skater.IsActive && skater.IsSEV).Take(10).ToList().ForEach(skater =>
                {
                    var vm = new SkaterDTO(skater);
                    DTO.Add(vm);
                });
                pages.Add(toalPageCount, DTO.ToList());
                pageCounter++;                    
            }
            else if (selectedPage > 1)
            {
                if (selectedPage == toalPageCount)
                {
                    context.Set<Skater>().OrderByDescending(skater => skater.Lastname).Where(skater => skater.IsActive && skater.IsSEV).Take(10).ToList().ForEach(skater =>
                    {
                        var vm = new SkaterDTO(skater);
                        DTO.Add(vm);
                    });
                }
                else
                {
                    context.Set<Skater>().OrderBy(skater => skater.Lastname).Where(skater => skater.IsActive && skater.IsSEV).Skip(selectedPage * 10).Take(10).ToList().ForEach(skater =>
                    {
                        var vm = new SkaterDTO(skater);
                        DTO.Add(vm);
                    });
                }
                pages.Add(toalPageCount, DTO.ToList());
                pageCounter++;                                        
            }
                       

            return PartialView("Skaters", pages);

Die HTML Seite für die Darstellung des Resultates sieht dann wie folgt aus:

@model System.Collections.Generic.Dictionary<int, System.Collections.Generic.List<EislaufSektionWebUI.DTO.SkaterDTO>>

@{
    ViewBag.Title = "Läufer(innen)";
    Layout = "~/Views/Shared/_LayoutPage.cshtml";
}

@Html.ActionLink("Zurück", "Welcome", "Home")

<table class="table table-responsive table-bordered table-hover">

        <thead>
            <tr>
                <th>
                    Vorname
                </th>
                <th>
                    Name
                </th>
                <th>
                    Bestandene Tests
                </th>
                <th>
                    SEV
                </th>
                <th>
                    Geburtsdatum
                </th>
            </tr>
        </thead>
        <tbody>
            @{               
                var currentPage = int.Parse(HttpContext.Current.Request.QueryString["selectedPage"]);
                foreach (var skater in Model[currentPage-1].ToList())
                {
                    <tr>
                        <td>
                            @skater.Firstname

                        </td>
                        <td>
                            @skater.Lastname
                        </td>
                        <td>
                            @skater.CertificationLevel
                        </td>
                        <td>
                            @skater.IsSEV
                        </td>
                        <td>
                            @skater.DateOfBirth
                        </td>
                    </tr>
                }
            }
        </tbody>
    </table>

<nav>
    <ul class="pagination">
        <li>
            <a href="#" aria-label="Previous">
                <span aria-hidden="true">&laquo;</span>
            </a>
        </li>
        @{
            foreach (var key in Model.Keys)
            {
                var number = key + 1;
                <li>
                    <a href="/Person/GetSkaters?selectedPage=@number">@number</a>
                </li>
            }
        }
        <li>
            <a href="#" aria-label="Next">
                <span aria-hidden="true">&raquo;</span>
            </a>
        </li>
    </ul>
</nav>

Die Twitter Bootstrap “pagination” Links werden dann wie folgt generiert:

<nav>
    <ul class="pagination">
        <li>
            <a href="#" aria-label="Previous">
                <span aria-hidden="true">&laquo;</span>
            </a>
        </li>
        @{
            foreach (var key in Model.Keys)
            {
                var number = key + 1;
                <li>
                    <a href="/Person/GetSkaters?selectedPage=@number">@number</a>
                </li>
            }
        }
        <li>
            <a href="#" aria-label="Next">
                <span aria-hidden="true">&raquo;</span>
            </a>
        </li>
    </ul>
</nav>

Ich hoffe euch hat der Beitrag gefallen und freue mich über Rückmeldungen oder konstruktive Kritik.


Manfred Steyer: Eindrücke vom IT-Visions Infotag 2015 in Essen

Nachfolgend ein paar Eindrücke von unserem gut besuchten Infotag in Essen. Wie jedes Jahr haben wir die Gelegenheit genutzt, um uns mit unseren Kunden und Interessenten über aktuelle Entwicklungen im .NET-Umfeld zu unterhalten.

Wer den Infotag versäumt hat, hat am 11. 5. im München noch einmal die Chance, dabei zu sein. Infos dazu findet man unter [1].

[1] http://www.it-visions.de/produkte/vortragsdetails.aspx?v=8035





Sven Hubert: Iterationen anlegen leicht gemacht: Automatisches Erzeugen von Iterationen mit Hilfe von Power Shell

Um im TFS den zeitlichen Verlauf von Projekten in Form von z.B. Sprints oder Iterationen abzubilden wird der Iterationspfad verwendet. Das manuelle Anlegen der einzelnen Iterationen für einen längeren Zeitraum kann jedoch zu einer aufwendigen Aufgabe werden, da für jede Iteration mindestens der Name sowie das Start- und Enddatum gesetzt werden sollte. image

 

 

 

 

 

 

 

 

 

 

 

Um diesen administrativen Aufwand einzusparen und eine flexible Iterationsstruktur zu erstellen, die Iterationen verschiedener Längen zulässt, empfiehlt es sich diesen Prozess mit Hilfe eines Power Shell Skripts zu automatisieren. Ziel ist es also am Ende nur noch die Informationen über das jeweilige Projekt sowie den Zeitraum anpassen zu müssen, für welchen Iterationen erstellt werden sollen.

Der logische Aufbau solch eines Skripts lässt sich in vier Teile unterteilen. Im ersten Teil werden zunächst alle benötigten .NET Assemblies geladen. Dazu ist es notwendig im Vorhinein die beiden Dlls “Microsoft.TeamFoundation.Client.dll” und “Microsoft.TeamFoundation.Common.dll”, welche sich im Installationsverzeichnis des TFS befinden, in einem  lokalen Verzeichnis abzuspeichern. Erstere stellt die APIs zur Verfügung, um sich zum TFS zu verbinden und um auf Daten aus Team  Projekt Collections und Team Projekten zugreifen zu können. Daran anschließend muss der Pfad, welcher die Dlls beinhaltet, entsprechend angepasst werden.

image

Im zweiten Teil des Skripts befinden sich alle Commandlets, welche mit Funktionalitäten des TFS im Zusammenhang stehen. Hier werden beispielsweise  Funktionen definiert, um die entsprechenden TFS Services zu erhalten, Informationen über ein Teamprojekt zu extrahieren oder eben auch um eine neue Iteration zu erzeugen.

image

Der dritte Teil enthält alle Commandlets, welche zur Berechnung der einzelnen Iterationsdaten notwendig sind, d.h. alle zeitbezogene Funktionen. Für den angegebenen Zeitraum werden die Start- und Enddaten aller Iterationen berechnet, sodass ein Iterationsbaum entsteht der in Quartale, Monate, Zwei-Wochen-Zeiträume, sowie einzelne Wochen gegliedert ist.

Der große Vorteil dieser Vorgehensweise liegt in der variablen Iterationslänge. So kann jedes Team innerhalb eines Teamprojektes separat entscheiden auf welcher Ebene des Iterationsbaumes es arbeiten möchte, d.h. jedes Team kann sich auf eine unterschiedliche Iterationsdauer innerhalb eines gemeinsamen Iterationsbaumes festlegen.

SNAGHTML520d8af

Schließlich findet im vierten Teil des Scripts die eigentliche Ausführung des Programms durch Aufrufen der in den vorhergehenden beiden Teilen definierten Commandlets statt. Um das Skript für eigene Zwecke anzupassen muss an dieser Stelle der Zeitraum sowie die URL der Collection und das Projekt eingetragen werden, für welches die Iterationen erzeugt werden sollen.

SNAGHTML51b08f3

Nicht zuletzt kann nun das Skript ausgeführt werden und die Iterationen werden wie gewünscht für das angegebene Teamprojekt erzeugt. Hat man dieses Skript einmal erfolgreich implementiert, so kann es mit nur wenigen Anpassungen für jedes Teamprojekt eingesetzt werden und erspart damit viel Zeit.

Das vollständige Script ist zu finden unter: CreateIterations.zip

Besonderer Dank an dieser Stelle noch an Martin Hinshelwood (MrHinsh), der mit seinem Blogbeitrag PowerShell TFS2013 API#1 – Get TFSCollection and TFS Service einen guten Einstieg in das Thema PowerShell und TFS liefert und einige nützliche Commandlets, wie z.B. Get-TfsCollection, zur Verfügung stellt.

Iterationen anlegen leicht gemacht: Automatisches Erzeugen von Iterationen mit Hilfe von Power Shell is a post from: AIT Blog

Mario Priebe: BASTA! 2015 – Konferenz für .NET, Windows & JavaScript

BASTA_Herbst_2015_Leaderboard_28841_v9
Mo, 28.09.2015 bis Fr, 02.10.2015
Rheingoldhalle, Mainz

Die BASTA! ist die führende unabhängige Konferenz für Microsoft-Technologien im deutschsprachigen Raum. Durch ihre einmalige Expertendichte, die Aktualität sowie ausgeprägte Praxisrelevanz gehört sie zu den jährlichen Pflichtterminen für Windows- und .NET-Entwickler, Architekten und Projektleiter. Das Konferenzprogramm umfasst die immer größere werdende Technologieplattform der Microsoft-Welt – und darüber hinaus.
Mit über 130 Sessions, Workshops und Keynotes bietet die BASTA! eine Informationsfülle, die ihresgleichen sucht. Hinzu kommen die professionelle Organisation, die vielfältigen Networking-Möglichkeiten sowie das angenehme Ambiente, die die BASTA! zu einem einzigartigen Erlebnis machen.

Frühbucherhighlights

• Workshop-Tag For Free: Bei Anmeldung für 3 Konferenztage bis 7. Mai erhalten Sie einen Power-Workshop-Tag Ihrer Wahl kostenfrei.
• Frühbucherpreise: Sparen Sie bis zu 400 Euro.
• Kollegenrabatt: Mit 3+ Kollegen anmelden und 10 % extra sparen.
• Extra Specials: Freelancer und Mitarbeiter von wissenschaftlichen Einrichtungen erhalten bei uns individuelle Sonderkonditionen – bitte schreiben Sie uns eine Mail an contact@basta.net

Nähere Infos zur BASTA! bekommen Sie unter: www.basta.net

friends header

bloggers headline

links header

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