Wie Du vollkommen kostenlos und legal hunderte Ebooks von Microsoft herunterladen kannst

Eric Ligman, Führungskraft bei Microsoft im Vertrieb, hat es wieder getan: In seinem Blogpost vom 11.07.2017 verlinkt er über 250 Ebooks zum kostenlosen Download. Alle Bücher sind im PDF Format verfügbar; viele gibt es zusätzlich auch als epub, mobi (Kindle) oder xps.

Zu folgenden Kategorien bekommt ihr völlig kostenlos Wissen geschenkt:

  • Azure
  • BizTalk (Sunato, das ist doch was für euch!)
  • Cloud
  • Developer
  • Dynamics
  • General
  • Licensing
  • Office (hier gibt es die meisten Bücher)
  • Power BI
  • PowerShell
  • SharePoint
  • SQL Server
  • Surface
  • System Center
  • Virtualization
  • Windows Client
  • Windows Server

Für die Paranoiker und Sammler unter euch, die befürchten, die Bücher könnten wieder aus dem Äther verschwinden, bietet Eric auch die Möglichkeit an, alle am Stück herunterzuladen. Insofern ihr einen Downloadmanager einsetzt, der mit URL-Listen umgehen kann oder mit der PowerShell umzugehen wisst, bekommt ihr von ihm entsprechende Hinweise, wie das funktioniert.

Was sind eure Favorites unter den Büchern?

Lasst es mich in den Kommentaren wissen!

Wie migriere ich das Design Pattern Framework 4.5 auf Visual Studio 2017

Über das Design Pattern Framework haben wir bereits das eine oder andere Mal berichtet. Darüber hinaus habe ich in der Vergangenheit nach Rücksprache mit den coolen Jungs der Data & Objects Factory Lizenzen für das Framework auf Entwicklerkonferenzen verlost. Die waren sehr gefragt. Kein Wunder… oder wisst ihr etwa, wie man in einer Windows Forms Anwendung das MVP Pattern einsetzt?

Der Haken: Es gibt leider noch immer keine neue Version vom Design Pattern Framework und die letzte verfügbare ist für das Visual Studio 2012 entwickelt worden. Das ist an sich nicht schlimm, doch unglücklicherweise denken sich Hersteller von z.B. Entwicklungsumgebungen und Frameworks mit neuen Versionen seltsamerweise oft auch noch gleich neue Features aus, verwerfen alte und überdenken einiges gar komplett neu. Und so kommt, was kommen muss: Das Design Pattern Framework 4.5 funktioniert nicht mal eben so mit dem neuen Visual Studio.

Klick auf MEHR… für eine Auflistung von nur 5 Schritten, um die Design Pattern Framework Solution  “Patterns in Action” auf Visual Studio 2017 zu migrieren (zum Schluss gibt es noch einen Bonus).

More...

VSTO-Setup bauen inkl. digitalem Zertifikat. Das perfekte Zusammenspiel zwischen Cloud und dem lokalen Build-Server

Machen wir uns nichts vor, das Thema kapiert doch kaum jemand. Oder? Du vielleicht? Worum es überhaupt geht? Ganz einfach: Add-Ins für bspw. Microsoft Outlook bedingen, dass sie digital signiert sind. Das hat etwas mit Sicherheit zu tun, oder würdest Du etwa einem beliebigen Add-In aus dem Internet volle Zugriffsrechte auf Deine geschäftlichen Emails, Kontakte u.ä. gewähren? Nein, natürlich nicht! Es sei denn, die Quelle ist vertrauenswürdig. Und da da natürlich jeder kommen könnte, hat sich Microsoft gedacht, es wäre evtl. sinnvoll, dass derartige Add-Ins digital signiert werden. In wenigen Worten bedeutet das nichts weiter, als dass der Hersteller sein Add-In mit einem digitalen Zertifikat unterschreibt und selbiges von einem vertrauenswürdigen Herausgeber gegengezeichnet wurde. So kannst Du als Endkunde nachvollziehen, ob der Hersteller des Add-Ins wirklich der ist, der er behauptet zu sein.

Soweit so gut. Nun ist die Sache die: Vielleicht entwickelst Du gerade ein Add-In und wunderst Dich, warum Dir das Problem noch nie wirklich begegnet ist. Tja, das liegt vereinfacht gesagt daran, dass das Visual Studio durch die Nutzung entsprechender VSTO (Visual Studio Tools for Office) Templates Testzertifikate für die Entwicklung ausstellt und damit Dein Add-In signiert.

Also nochmal:

More...

[IMHO] Mit welchem UI Framework würde man für die Enterprise entwickeln?

Und, habt ihr es schon gesehen? CBS hat einen ersten Trailer für die neue Startrek-Serie veröffentlicht, die über zehn Jahre, nachdem Startrek: Enterprise eingestellt wurde nun im Herbst starten soll. Startrek: Discovery soll sie heißen. Sie spielt vor Kirk, Spock & Co. Wir erinnern uns: Der erste Kontakt wurde im Jahr 2063 hergestellt und nicht lange danach gelangen die ersten Siedler nach Terra Nova.

Natürlich ist das alles Science Fiction (nicht ganz so sehr, wenn man Elon Musks Pläne kennt). Doch warum wird nie, ja wirklich nie über Software auf der Enterprise gesprochen? Geschweige denn von Programmiersprachen oder UI Frameworks? Seit der Serie Next Generation begleitet uns im Wesentlichen das LCARS System, erfunden von Michael Okuda.

Und während wir innerhalb von zwei Jahrzehnten allein schon in der Microsoft-Welt eine Transformation von der Konsole über MFC, Windows Forms, SilverLight, WPF, XAML bis hin zu HTML5 & Co erleben, sollen die Oberflächen von Raumschiffen über fast Jahrhunderte hinweg auf der Grundlage des gleichen UI Frameworks laufen? Und nie gibt es Updates? “Oh, Captain, das funktioniert so nicht… es gab doch erst neulich das Upgrade auf ExistenceOS 10.3.2 mit einem neuen UI Framework für n-Dimensionale UserInteraktion… leider gibt es da noch einen Bug.” Ich schätze, so etwas werden wir wohl kaum in einer Enterprise Serie zu hören bekommen und doch stellt sich mir die Frage:

Wenn wir in naher Zukunft in der Lage sein sollten, interstellare Raumschiffe zu entwickeln, mit welchem UI-Framework würden sie laufen, bzw. gibt es etwas in heutigen Frameworks, das für diesen Schritt noch fehlt?

Eure Meinung in die Comments!

Wie man OIA Microsoft SQL beibringt

Einmal davon abgesehen, dass Oracle bereits seit einiger Zeit plant, das Produkt Oracle Identity Analytics abzuschaffen, erfreut es sich aber noch immer einer erstaunlichen Beliebtheit. Nicht zuletzt sicher deshalb, weil es flexibel ist und sich in alle nur denkbaren Richtungen konfigurieren, erweitern und sogar anpassen lässt.

Besonders wichtig für ein Identity Management Produkt ist dabei der Weg, wie Daten hineingelangen. I.d.R. stammen diese aus vollkommen unterschiedlichen Systemen und oft werden für den Import-Prozess entweder CSV-Dateien eingesetzt, oder direkt Datenbankverbindungen zu Endsystemen genutzt. Eine weitere Alternative sind sog. Provisioning-Server, die im Gesamtprozess des Identitätsmanagement zwei Aufgaben erfüllen:

More...

Wie funktioniert eigentlich das Open Closed Principle

Das Open Closed Principle, oder kurz OCP, ist eines der fünf Prinzipien aus SOLID, das dabei helfen kann, wartbaren und evolvierbaren Code zu schreiben. Vereinfacht fordert es eine Struktur, die es erlaubt, Neues zu ergänzen (Open), ohne dabei Altes verändern zu müssen (Close). Im Original heißt es entsprechend:

Open for extension, but closed for modification

Das klingt oberflächlich betrachtet sinnvoll, denn so bleibt das Vertrauen in einmal geschriebenen (und erfolgreich getesteten) Code bestehen – er muss ja nicht mehr angefasst werden.

Klassisch finden sich hierzu Beispiele, die sich mit Switch/Case Statements auseinandersetzen und aufzeigen, wie sich diese in Schnittstellen und Klassen zerlegen lassen. Ich habe vor einigen Jahren auf CodePlex eine Solution hochgeladen, die hingegen mehrfach verschachtelte If/Then/Else-Zweige aufbricht und Schritt für Schritt mit Hilfe des sog. Strategy Patterns aufzeigt, More...

[POST MORTEM] WOL.NET

Während ein Großteil unserer Entwicklungsprojekte auf den Bühnen unserer Kunden stattfinden, gab es in der Vergangenheit auch die eine oder andere Software, die wir in Eigenregie entwickelt und zeitweise auch vertrieben haben. Das wohl bekannteste Produkt ist dabei das später in RPM umgetaufte WOL.NET. Dieser Artikel schaut ein wenig hinter die Kulissen: Was lief gut, was lief nicht so gut, über was für Kuriositäten sind wir bei der Entwicklung gestolpert. Ein klassisches Post Mortem also.

Viel Spaß beim Lesen!

Softwareverteilung als Auslöser für eine Eigenentwicklung

Bereits vor über zwölf Jahren hatten einige unserer Kunden das Bedürfnis, ihre Softwareverteilung möglichst zentral zu verwalten. Auf dem Markt existierten (und existieren noch immer) die unterschiedlichsten Produkte verschiedenster Hersteller, die das ermöglichen. Um ein prominentes Beispiel zu nennen: Microsoft bot damals bereits mit dem Systems Management Server (SMS) in der Version 2003 ein solches Produkt an. Inventarisierung von Soft- und Hardware war damit möglich, ebenso aber auch das Verteilen von Software; zentral gesteuert. Später wurde daraus übrigens SCCM (Systems Center Configuration Manager) in der Version 2007.

Was allerdings ab Start fehlte, war die Möglichkeit, Rechner gezielt für eine Software-Verteilung remote einzuschalten oder im Anschluss auch wieder herunterzufahren. Kurzum: Bis ein Programmpaket auf teilweise hunderte Systeme verteilt war,… das konnte dauern. Tage. Wenn nicht gar Wochen. Es kam halt darauf an, wann jemand seinen PC anschaltete.

Auf Basis einer Kundenidee zu diesem Problem entstand dann 2004 die Software WOL.NET. WOL  stand dabei für Wake on LAN und beschrieb somit die Technologie, die für das ferngesteuerte Aufwecken der Clients zum Einsatz kommen sollte. .NET wiederum trug damals nahezu jedes Programm im Namen, was auf die .NET Plattform von Microsoft setzte. 

Als Web-Anwendung konzipiert, war es die Aufgabe von WOL.NET, ausschließlich lesend auf die Datenbasis vom SMS 2003 Server zuzugreifen und die Hierarchie der darin registrierten Clients darzustellen. Administratoren konnten sodann einzelne Clients, sowie ganze Sammlungen selektieren und dann einen Job erstellen, der die Clients sowohl aufwecken wie auch herunterfahren konnte. Letzteres erledige ein entsprechender Aufruf der shutdown.exe. Das Gute an diesem Konzept: Wir waren unabhängig vom eigentlichen SMS Workflow und der tatsächlichen Softwareverteilung. Sprich: Rauf- und Runterfahren gingen auch komplett autark und konnten somit auch für alle andere Zwecke genutzt werden, für die ein Rechner so eingeschaltet sein sollte (Virenscans, etc.).

Die ersten Probleme

Direkt ab Start trafen uns dann allerdings zwei Probleme:

  1. In 2004 waren wir noch nicht bereit, Lizenzen von Drittherstellern wie bspw. Infragistics, Telerik, Component One und wie sie alle heißen auszugeben. Warum das eine schlechte Entscheidung war, kann man hier nachlesen.
  2. Magic Packets wie sie für Wake on LAN benötigt werden, müssen gebroadcastet werden.

Was bedeutete das für uns?

Nun, während unsere Testumgebung aus einer handvoll PCs bestand, verfügte unser erster ernstzunehmender Kunde für das Produkt über ca. 2.000 Systeme. In SMS waren sie auf eine Art strukturiert, so dass sie durch die Kategorisierung (Windows Clients, Windows XP Clients, Clients für die Verteilung von Adobe Photoshop,…) teils mehrfach in der Hierarchie auftraten. Daraus ergab sich für WOL.NET also ein Baum mit tausenden von Knoten. Im Web. Und wir wussten noch nicht, wie Load on Demand funktioniert. Es gab nicht einmal ein TreeView Control unter ASP.NET, geschweige denn einen Drittanbieter für so etwas (zumindest keinen mit einer kostenfreien Lösung).

Was es indes gab, war ein ASP.NET TreeView Control bei Microsoft Research (2006 wurde es übrigens regulär als CSS Control Adapter Toolkit veröffentlicht). Das befand sich in einer Art Beta-Stadium und beherrschte etwas Großartiges: Es war CSS Friendly. Das bedeutet, es war möglich, ASP.NET dazu zu bringen, das Control auf eine beliebige Art so zu rendern, dass etwas dabei herauskommt, was sich einfach mittels CSS optisch gestalten lässt. In diesem Fall: Eine Unordered List aus der geschickte CSS-Definitionen optisch einen hierarchischen Baum zauberten. Und nicht nur das: Es wurde direkt JavaScript-Code mitgeliefert, der den Baum interaktiv werden ließ: Einklappen, Aufklappen, einzelne Zweige selektieren und – und das war das besondere Highlight – während es zwar keine TriState Checkboxen gab, konnte der Code immerhin rückwärts die übergeordnete CheckBox deselektieren, sobald in der Hierarchie darunter auch nur ein Häkchen entfernt wurde. Sehr cool.

Das einzige Problem: Beim Aufruf der Webanwendung wurden alle Daten des Baumes in einem Rutsch komplett an den Browser übertragen. In unserem Testlab war das aufgrund der geringen Menge an Clients kein Problem. Beim Kunden knallte es. Natürlich. Unsere Lösung war zweigleisig: Zum einen erhöhten wir den TimeOut auf 2 Stunden. Im Nachhinein betrachtet klingt das aberwitzig, aber der Kunde ließ sich darauf ein. Da wurde dann eben WOL.NET geöffnet, in die Mittagspause gegangen und danach der Job konfiguriert. Das gehörte zur täglichen Routine. Zum anderen ergänzten wir die Möglichkeit, mittels konfigurierbarer Optionen einen beliebigen Knoten in der SMS Hierarchie als Stammknoten für WOL.NET zu definieren. Im Kern ging es hier nun einmal um Softwareverteilung und dafür wurden vom Kunden jedes Mal sog. Collections in SMS angelegt. Sobald diese in WOL.NET als Stammknoten eingestellt waren, wurden auch nur diese – und natürlich die Clients darunter – auf der Hauptseite angezeigt und alles war gut.

Darüber hinaus arbeiteten wir an einer ganzheitlichen Lösung des Problems. Und die kam später in Form einer Infragistics-Lizenz (sic!). Von Infragistics wurde uns ein TreeView Control geboten, das alle Funktionen enthielt, die wir brauchten. Inklusive Load on Demand. Das kam einer Erleuchtung gleich! Lediglich die Anpassungen an unseren Stored-Procedures war nicht so einfach wie gedacht, da diese nun nicht mehr direkt hierarchische Daten in einer zweidimensionalen Tabelle liefern mussten, sondern komplett umgeschrieben, um Knoten nach Bedarf zu laden, sowie Informationen darüber, wie viele Knoten sich jeweils darunter befinden zu liefern.

Das Problem mit den Magic Packets war da schon komplexer. Vereinfacht gesagt ist die Sache die: Ein Magic Packet ist ein ursprünglich von AMD definiertes Netzwerkpaket, dessen Aufbau festgelegt ist und i.d.R. die MAC Adresse des aufzuweckenden Clients beinhaltet nebst einem Identifier, der es als Magic Paket erkennbar macht. Warum nun also eine MAC Adresse? Ganz einfach: Solange ein Client offline ist, verfügt er schlicht über keine IP Adresse. Was er aber haben kann, ist eine Netzwerkkarte, die rudimentär mit Strom versorgt wird und am Kabel lauscht. Dazu müssen Netzwerkkarte und Mainboard Wake on LAN unterstützen und zusätzlich entsprechende Einstellungen im BIOS und dem Betriebssystem gemacht werden. Das einmal vorausgesetzt kann also ein Magic Packet auf die Reise geschickt werden und sobald die mit der entsprechenden MAC Adresse versehene Netzwerkkarte dieses Paket vorbeiflitzen sieht, fährt es den Rechner, in dem sie steckt, einfach hoch. Da das aber nicht zielgerichtet sein kann – es gibt ja keine IP-Adresse – muss das Paket in das gesamte Netzwerk gebroadcastet werden. Und das stellte sich als Problem heraus, sofern Subnetze zum Einsatz kamen. Das war nahezu immer der Fall. er sich hier für Details interessiert, der liest am besten Mal Artikel über Networking Layer und das ISO OSI Modell.

Gelöst werden kann das Problem entweder, in dem die Router zwischen Subnetzen für sog. Directed Broadcasting konfiguriert werden, oder indem man in jedem Subnetz einen eigenständigen Service installiert, der nur für sein eigenen Netz verantwortlich ist. Wir unterstützen seit jeher beides und waren damit der Konkurrenz und auch Microsoft selbst voraus. Unser WOL.NET ließ dabei auch einen hybriden Modus zu, in dem einzelne Dienste für mehrere Subnetze verantwortlich waren und diese per Directed Broadcast erreichen konnten, sowie Dienste, die nur für jeweils ein Subnetz verantwortlich waren. Dieses Szenario ergab immer dann Sinn, wenn ein Unternehmen bspw. über mehrere Standorte verfügte und an einigen Directed Broadcast erlaubt war, an anderen aber nicht. Wenn es nach uns gegangen wäre, hätten wir immer empfohlen, Directed Broadcast zu erlauben. Allerdings hat es vor einigen Jahren Angriffe auf Unternehmen gegeben, die über diese Technologie ermöglicht wurden (Stichwort: Smurf Attack). Obwohl man bereits damals die Quelle für solche Broadcasts und auch die erlaubten Ports konfigurieren konnte, hielt das viele Systemadministratoren nicht davon ab, aus Sicherheitsgründen weiterhin auf Directed Broadcasts zu verzichten. Immerhin hatten wir selbst in dem Fall eine Lösung parat.

Installation

Während unsere ersten Kunden für WOL.NET sich schon fast durch langjährige, beinahe freundschaftliche Beziehungen charakterisieren ließen, kamen bald schon Interessenten hinzu, die uns in dem Kontext ausschließlich als Hersteller einer Software wahrnahmen. Als Beratungsunternehmen waren wir es gewohnt, unser KnowHow an den Kunden weiterzugeben, was im Fall von WOL.NET auch bedeuten konnte, dass der Windows NT Service und die ASP.NET Webanwendung nebst SQL-Datenbank manuell angelegt und eingerichtet wurden. Die Schritte wurden wie in regulären Projekten auch protokolliert, dokumentiert und an den Kunden übergeben. Das Resultat: Maximale Flexibilität und auch Unabhängigkeit. Kunden aber, die annahmen, wir wären ein Softwarehersteller, erwarteten eine Boxed-Lösung inkl. MSI-Setup.EnergyMonitor

Zu dem Zeitpunkt war die Featureliste von WOL.NET bereits spürbar angewachsen. Es gab neben dem Hauptprodukt auch eine Integrationskomponente für SMS 2003 und später auch SCCM 2007, sowie einen Energymonitor, der visuell aufzubereiten versuchte, wie es um den Energieverbrauch der Systeme steht und wie er sich vor allem durch die Nutzung der Shutdown-Funktion optimieren ließ. Es kam ein SelfService Portal hinzu, über das Mitarbeiter von Zuhause aus in der Lage waren, ihren Arbeitsplatz-PC einzuschalten, um sich damit bspw. Remote zu verbinden und noch ein paar weitere Kleinigkeiten mehr. Die Installation gestaltete sich daher beliebig komplex – und alles was wir hatten, war InstallShield. Dieses Produkt hat eine sehr bunte Vergangenheit und mehrere Aufkäufe hinter sich. Inzwischen gehört es glaube ich Flexera. Das Setup für WOL.NET musste Webseiten im IIS einrichten und konfigurieren, Dienste installieren, Service-Konten erstellen und Berechtigungen zuweisen, Datenbank-Schemata einrichten und von Version zu Version migrieren, Updates ermöglichen und vieles mehr. Da InstallShield bspw. zwar Standard-Dialoge mit sich bringt, um Benutzerkonten im AD anzulegen (das aber pro Setup auf EIN Konto beschränkt) begann hier eine Odysee, die u.a. auch in der Entwicklung C++ basierter Custom Actions mündete für die Prüfung eingegebener Kennwörter oder das Zuweisen von Berechtigungen. Bis das Setup vollständig funktionierte, ist sehr viel Zeit ins Land gegangen, aber das Ergebnis konnte sich sehen lassen.

Mehr Verkäufe konnten wir dadurch allerdings nicht verzeichnen. Eine schöne Anleitung und vielleicht das ein oder andere Powershell-Script hätten es vermutlich auch getan.

Verified for Windows

Als langjähriges Mitglied im Microsoft Partner Network sind wir stolz darauf, dass wir bereits seit über zehn Jahren in der einen oder anderen Weise Goldpartner sind. Zunächst ganz allgemein, später in immer mindestens einer Kompetenz (nachdem Microsoft ich glaube 2010 das Modell geändert hat). Darunter fiel auch die sog. ISV Kompetenz (Independent Software Vendor). Der Vorteil, eine solche Kompetenz inne zu haben, liegt darin, zum einen damit werben zu können: Ein schickes Logo gibt es nämlich gratis dazu. Zum anderen verteilt Microsoft damit auch kostenlose Softwarelizenzen, die bspw. für Entwicklungs-, Test- und Demonstrationszwecke eingesetzt werden können. Zwei gute Gründe für uns also, die ISV Kompetenz zu erwerben. Dem vorgeschaltet war allerdings, dass man als ISV mindestens ein Softwareprodukt von einem unabhängigen Institut testen lassen musste. Für WOL.NET aber genügte es nicht, das Setup durchlaufen zu lassen und dann ein wenig in der Software herumzuklicken. Nein, man benötigte einen Domaincontroller, einen SQL Server, ein installiertes und voll funktionsfähig konfiguriertes SMS 2003 nebst mindestens einem physischen Client, den man auch aufwecken kann und der in SMS bekannt sein musste. Im ersten Durchlauf mit der Firma Veritest haben wir also ein Notebook aufgesetzt und alles vorinstalliert und konfiguriert, was ging, eine hübsche CD mit WOL.NET drauf dazugepackt und um einen Testleitfaden ergänzt. Das ganze Paket ging dann auf die Reise nach England und wiedergesehen haben wir es nie wieder.

CD CoverNach einigen Nachfragen konnte Veritest immerhin bestätigen, dass WOL.NET tat, was wir behaupteten und verpassten dem Produkt das Label “Verified for Windows”. Wir wurden daraufhin ISV und freuten uns. Später wurde aus WOL.NET RPM (Remote Power Management) und der Prozess mit Veritest gestaltete sich plötzlich viel einfacher:

Auf einmal mussten die Binaries gar nicht mehr digital signiert sein. Wir brauchten gar keinen Account auf winqual.microsoft.com mehr und das dazu notwendige teure Zertifikat von Verisign war ebenfalls unnötig. Auch das Setup musste nicht signiert sein. Das Label “Verified for” benötigt das alles nicht, ob wir das nicht gewusst hätten? “Tested for…” setzt Zertifikate voraus. Spannend. Und darüber hinaus gibt es eine Testsuite, die wir herunterladen könnten, um die Software selbst zu testen. Die Ergebnisse werden verschlüsselt an Veritest übertragen und die würden sie daraufhin über ihre eigene Suite bestätigen. Wir bräuchten gar keine Hardware schicken, das ginge auch so.

Wir fragten also: Was ist eigentlich aus dem letzten Notebook geworden, das wir euch geschickt haben? Und Veritest so: “Ach das… das liegt hier noch rum… wollt ihr es wiederhaben?”. Auf die Erkenntnis hin, was für Mühen und Aufwand die Retour produziert hätten, haben wir die freundlichen Kollegen von Veritest gebeten, das Gerät zu entsorgen.

Marketing

Ungefähr zu der Zeit sollte für die Einführung von Windows 7 eine virtuelle Konferenz stattfinden. Ebenfalls gab es eine Website von Microsoft die für speziell für das OS kompatible Anwendungen bekannter ISVs warb. Auch wurden hier die ersten Marketplaces beim Redmonder Konzern geboren und überall waren wir dabei. Unser Unternehmen wurde auf allen Plattformen präsentiert, wir wurden in den Lösungskatalog aufgenommen und standen in der Liste für Windows 7 kompatible Anwendungen. Gebracht hat all das leider nichts. In all den Jahren gab es genau eine Anfrage zu RPM 2009, die über Microsoft Pinpoint ihren Weg zu uns fand. Der Admin einer kleinen IT Schmiede war geschockt, als wir ihm unser Preismodell erklärten und meinte, er hätte Skripte, die das gleiche täten für lau. Für seine Umgebung mag das sogar stimmen.

RPM_2009_BoxShotAuch haben wir dem Kind einen professionellen Anstrich gegeben. RPM erhielt einen Box Shot, der Lust auf mehr machen sollte. Dass das für ein Produkt dieser Kategorie kein wirklich ausschlaggebender Faktor ist, sei einmal dahingestellt. Zusammen mit dem Installationssystem stellt es im Nachhinein vermutlich den Teil des Aufwandes dar, auf den wir getrost hätten verzichten können. Im Vergleich zum MSI war der zeitliche Aufwand für den Box Shot immerhin sehr gering und das Ergebnis sah nett aus. Ich frage mich bis heute, warum wir die Grafik nicht in den Installer eingebaut haben…

Funktionsvielfalt

Viele Funktionen sind auf besonderen Kundenwunsch entstanden. Da wir aber nie mandantenabhängig entwickelt haben, waren Funktionen, die durch einen Kunden in das Produkt Einzug hielten, fortan auch für alle weiteren Kunden verfügbar. Während das zunächst einmal nach etwas Gutem für die Kunden klingt, hat es uns persönlich vor eine immense Herausforderung gestellt: Die Funktionen genügten zumeist den exakten Anforderungen des ursprünglichen Auftraggebers und funktionierte super in dessen Infrastruktur. Das bedeutete aber nicht zwangsläufig, dass sie auch überall anders funktionierten. Wir mussten schnell lernen, dass insbesondere im Bereich der Infrastrukturen kein Ei dem anderen gleicht. Ein Kunde benötigte bspw. ein Kommandozeilentool (heute würde man CLI sagen für Commandline Interface), über das sich ein Client direkt aufwecken lässt. Während wir zwar seit Anbeginn von WOL.NET so ein Tool hatten (ursprünglich, um die Funktionalität zu testen), war nun aber die Anforderung, auch die Ausnahmelisten von RPM zu nutzen und das Logging noch dazu. Sprich: Das Tool durfte den Befehl nicht selbst absetzen, sondern musste einen Job in der RPM Datenbank hinterlegen, ganz genau so wie es auch die Webanwendung täte. Das hat sehr gut funktioniert, hatten wir doch die gesamte Geschäftslogik in Bibliotheken verkapselt und mussten sie nun nur einfach in einem Konsolenprojekt orchestrieren. Leider hatten wir die Rechnung nicht mit den Sicherheitsfanatikern anderer IT-Abteilungen gemacht: Was beim Auftraggeber wunderbar funktionierte, scheiterte bei anderen Kunden daran, dass die direkte Verbindung zum SQL Server von SCCM 2007 nicht von den Admin-Maschinen aus erlaubt war, sondern nur vom SCCM Server aus. Unser Kommandozeilentool funktionierte also nur von einer Konsolen-Session direkt auf dem SCCM Server.

Wartung und das schleichende Ende

Ganz genau so wie Hersteller anderer Softwareprodukte boten wir unseren Kunden natürlich auch Wartungsverträge an. Dabei stellte sich aber verhältnismäßig schnell heraus, dass hier die Rechnung nicht aufging: Der Betrag, den die Kunden per anno dafür zahlten, wurde durch den Aufwand, der durch Anfragen entstand, bei Weitem überstiegen (wann man unsere regulären Tagessätze als Berater in Projekten als Maßstab nimmt). Hinzu kam allerdings ein viel gravierenderes Problem: Als Unternehmensberatung war und ist unser zentrales Anliegen, unsere Mitarbeiter in Projekte zu bringen. Es konnte also selten sichergestellt werden, dass jemand mit WOL.NET / RPM Entwicklungskompetenz verfügbar war, wenn er oder sie gebraucht wurde. Das hat dazu geführt, dass die Arbeit an der Software nach und nach eingestellt wurde und im Laufe der Zeit auch unser Vertrieb in dieser Hinsicht das Engagement einstellte. Heute gibt es nur noch zwei Kunden, die das Produkt einsetzen – soweit wir es sagen können. Die letzten Funktionen, die dabei durch uns ergänzt wurden betrafen die Kompatibilität zu SCCM 2012, sowie die Einführung einer Unterstützung für intels Active Management Technology (AMT), mit der sich inzwischen sogar gezielt Clients aufwecken und herunterfahren lassen – ganz ohne Magic Packet und die damit verbundenen Herausforderungen. Auf der Strecke geblieben sind dabei das Installationssystem – nachdem sich unsere alte InstallShield 2009 Lizenz mangels Herstellerseite nicht mehr reaktivieren lässt und das eine oder andere Feature, das nicht benötigt und von uns daher vorsorglich aus dem Paket entfernt wurde. Dafür hat das Kind einen neuen Namen: RPM Core. So heißt es übrigens auch bei uns in der Quellcodeverwaltung – wie praktisch.

Fazit

Was als ambitioniertes Projekt begann, entwickelte sich rasant zu dem umfangreichsten Stück Software, dass die TOP TECHNOLOGIES innerhalb von über zehn Jahren hat entstehen lassen. Fast alle Mitarbeiter mit Fokus auf Softwareentwicklung durften ihre Kompetenz mit einbringen und auch der eine oder andere Auszubildende hat sich seine Hörner daran abstoßen können. Wir haben viel über die Entwicklung von Enterprise-fähigen Produkten gelernt, über komplexe IT Infrastrukturen, die Zusammenarbeit mit Agenturen, die Handbücher übersetzen – und über das Erstellen von Produkthandbüchern im Allgemeinen, über den Entwurf und die Umsetzung komplexer Installationsszenarien und worauf man beim Logging achten sollte – und was man lieber bleiben lässt (viel ist nicht immer gut –> gut ist gut.)

Trotz allem: Wir sind kein Produktentwicklungshaus und haben einige Jahre gebraucht, um zu verstehen, dass unser Geschäftsmodell nicht kompatibel zur Entwicklung eines Produktes wie RPM ist. Ich bin stolz auf unsere Geschäftsführung, die in WOL.NET von Anfang an ein großes Potential erkannte und das Risiko einging, es über die Jahre hinweg auch als Investition zu betrachten. Sie standen jederzeit mit Rat und Tat hinter dem Produkt und waren zugleich Mentoren für uns Entwickler wie auch Ideengeber für sinnvolle Funktionen! Es war eine schöne Zeit, in der wir alle viel gelernt haben, die nun aber zu Ende geht. Vermissen werde ich sie dennoch nicht, da sich auch mein eigenes Aufgabenfeld verändert hat und inzwischen keiner meiner Mitarbeiter mehr aktiv an dem Projekt arbeitet. Dennoch war gerade die sehr intensive Zusammenarbeit mit Kollegen an unserem eigenen Produkt auch eine spannende Zeit für die ich dankbar bin!

Das Internet der Dinge–Heiliger Gral oder Büchse der Pandora?

Noch bevor von IoT überhaupt ansatzweise gesprochen wurde oder mit M2M oder MQTT Protokolle existierten, die die einfache Kommunikation unterschiedlichster Geräte untereinander möglich machen, wurden uns Kühlschränke versprochen, die die Nahrungsmittel selbst einkaufen, sobald sie zur Neige gehen. Über das Internet natürlich.

Mikrowellen mit Touch-Displays folgten alsdann in der Vorstellung erstrebenswerter Internetkonnektivität. Irgendwann auf der Zeitachse tauchten dann die Sports-Tracker auf, die inzwischen Armbanduhren fast abgelöst haben und nicht zu vergessen natürlich der berühmte Plastikhase aus Armenien, der so niedlich mit den Ohren kreisen und einem Podcasts vorlesen konnte.

Bis vor kurzem fand also eine durchaus spannende Entwicklung statt, die – so scheint es – nicht nur begeisterte Always-On Anhänger verfolgt haben, sondern auch Beachtung durch die dunkle Seite der Macht fanden.

Jüngst erschütterte ein weltweiter Ausfall führender Dienstleistungsanbieter in den Bereichen der sozialen Netzwerke, des Online-Shoppings oder Media-Sharings Mitglieder der Generation-Y und jünger. Was war passiert? Wie war es möglich, dass eine verteilte Denial of Service Attacke so weitrechende Folgen haben konnte? Sind dafür nicht viel zu viele Computer notwendig?

Ende September titelte golem.de dazu: “Das Internet of Things gefährdet das freie Netz” und schreibt weiter: “Es ist bekannt, dass die Sicherheit von nahezu allen IoT-Geräten lächerlich schlecht ist.”.

Etwa einen Monat später dann die erste Angriffswelle: Gleich drei aufeinander folgende DDOS Attacken legten zahlreiche Internetseiten lahm. Darunter Twitter, Netflix, Amazon, Soundcloud und diverse mehr. Solche Angriffe sind im Prinzip nicht neu. Neu ist indes, dass sie dieses Mal hauptsächlich von Babyphones, Multimediafestplatten, Kameras und Spielekonsolen ausgegangen sind. Derzeit wird davon ausgegangen, dass es sich dabei zudem nur um einen Testlauf handelte. Sozusagen ein Proof of Concept.

Das Konzept funktioniert also ziemlich gut, die Büchse wurde damit quasi geöffnet. Und wenn man bedenkt, dass in naher Zukunft nahezu jedes Gerät, das elektronisch betrieben wird, über Zugang zum Internet verfügen wird, ergeben sich daraus wirklich interessante Szenarien – und das nicht unbedingt im positiven Sinne.

Wie mit allen Technologien verhält es sich doch so: Zunächst einmal sind sie im Grundsatz neutral. Erst durch das, was wir damit machen, gelangen sie zu einer Einschätzung, ob sie für unsere Gesellschaft eher positiven oder negativen Nutzen haben. Das Thema IoT ist allerdings so umfassend und die Konsequenzen, die sich daraus ergeben heute noch so wenig abschätzbar, dass der sinnvollste Weg zu sein scheint, die kommenden Generationen bereits frühzeitig damit zu konfrontieren begeistern.

Bildung, Kompetenzaufbau und Förderung kreativer Ansätze können dazu beitragen, dass nicht nur sinnvolle Anwendungsfälle für diese neuen Technologien entstehen, sondern diese auch für die positive Entwicklung unserer globalen Gesellschaft eingesetzt werden.

Conrad bspw. beschreitet in diesem Jahr erneut den richtigen Weg, indem der Elektronik Versandhändler bereits zum zweiten Mal einen passenden Adventskalender anbietet, der sich dem Thema IoT spielerisch nähert und in 24 Experimenten spannende Möglichkeiten aufzeigen soll.

Doch genügt das? Wie gehen Schulen damit um? Wo findet IoT in den Berufsschulen statt? Was passiert in den Studiengängen rund um die Bereiche Informatik und Elektrotechnik? In wieweit wird das Thema auch außerhalb der technischen Berufe und Studiengänge angegangen?

Und unsere Kunden? Wir entwickeln Webanwendungen, mobile und auch ganz allgemein Cross-Plattform Apps, Desktop-Anwendungen mit Windows Forms und WPF. Alles ganz klassisch. Die höchste Form der Interkonnektivität wird durch Schnittstellen zu weiteren Legacy-Systemen erreicht. Wo sind hier die Sensoren, die viele Informationen selbständig bereitstellen und mittels geeigneter Software in die Systeme integrieren könnten? Wo ist die KI, die aus dem Nutzerverhalten selbständig schließen kann, wie bestimmte Prozesse optimiert werden könnten? Wo sind die offenen Protokolle, die hunderte proprietäre Schnittstellen endlich obsolet machen und den Fokus auf die tatsächlichen Anwendungsfälle zurücklenken könnten?

Erkennt ihr in eurem täglichen Business bereits Anzeichen für diesen Wandel? Steckt ihr schon mitten drin? Oder wird sich an eurem klassischen Geschäftsmodell voraussichtlich auch in den nächsten fünf Jahren nicht Wesentliches verändern? Ich freue mich über Kommentare!

Bis dahin öffne ich mal mein erstes Türchen im Conrad Adventskalender und freue mich auf spannende Experimente bis zur angekündigten Überraschung an Heiligabend. Hoffentlich handelt es sich bei dem zentralen Chipsatz nicht um ein Produkt von Xiongmai Technologies

Shall we play a game? Tic-Tac-Toe mal anders

Für die einen ist es nichts weiter als Drei Gewinnt. Den anderen zaubert es ein nostalgisches Schmunzeln ins Gesicht, während sie an Joshua, die einsichtige KI aus dem Klassiker War Games denken. Für mich ist Tic-Tac-Toe ein schönes Beispiel dafür, wie unterschiedlich Softwareentwickler Strategien zur Lösung eines Problems entwickeln.

Für Tic-Tac-Toe gibt es 255.169 verschiedene Spielverläufe, von denen 131.185 mit einem Sieg des ersten Spielers enden, 77.904 mit einem Sieg des zweiten Spielers und 46.080 mit einem Unentschieden. (Quelle: Wikipedia)

Während die Anzahl an Spielverläufen somit übersichtlich ist, gestaltet sich die Entwicklung eines Tic-Tac-Toes in z.B. C# sogar noch einfacher, wenn es nur als Zweispieler (ohne selbst-lernende KI) gedacht ist. Doch während sich die meisten gleich als erstes die Frage danach stellen, wie sie das Spielbrett visualisieren und die Interaktion mit dem Spieler gestalten sollen (Windows Forms, HTML, WPF,…) ist dieses Spiel aus meiner Sicht einfach zu gut dafür geeignet, um sich über TDD Gedanken zu machen, als dass man es ignorieren könnte.

Klar. Ein Gameboard ist schnell entworfen und nach der Überlegung, dass es nicht mehr als neun Felder gibt, sind auch die ersten Tests schnell geschrieben.

GameBoardTests.cs

[TestClass]
public class GameBoardTests
{
  private GameBoard board = null;

  [TestInitialize]
  public void TestInitialize()
  {
    this.board = new GameBoard(null);
  }

  [TestMethod]
  [TestCategory("GameBoard")]      
  public void Fail_If_Greater_Than_Max()
  {
    Action action = () => board.Set(9);
    action.ShouldThrow<ArgumentOutOfRangeException>();
  }

  [TestMethod]
  [TestCategory("GameBoard")]
  public void Fail_If_Less_Than_Min()
  {
    Action action = () => board.Set(-1);
    action.ShouldThrow<ArgumentOutOfRangeException>();
  }
}
  

 

(Für die Prüfung erwarteter Exceptions kommt hier übrigens das Paket FluentAssertions zum Einsatz.)

GameBoard.cs

public class GameBoard
{
  public void Set(int pos)
  {
    if (pos < 0 || pos > 8) throw new ArgumentOutOfRangeException("The gameboard only consists of nine fields. Please set a new coin only on positions from zero to eight.");
  }
}       
  

 

Doch nun kommt schon die Frage: Angenommen, ein Spieler entscheidet sich für ein gültiges Feld. Wie genau soll das gespeichert werden? Und dann gleich die nächste Frage: Wie genau soll der Code ermitteln, ob jemand gewonnen hat?

Während nahezu jede Beispielimplementierung von Tic-Tac-Toe an dieser Stelle mit einem zweidimensionalen Array arbeitet und für die Gewinnermittlung verschachtelte If-Then-Else Abfragen nutzt, schlage ich einfach mal folgende Datentypen für die Verwaltung des Spielbrettes und der Gewinner-Kombinationen vor:

GameBoard.cs

private int board = 0;
private int[] winningCombinations = { 448, 56, 7, 292, 146, 73, 273, 84 };
  

 

Mehr braucht es eigentlich nicht. Genial, oder?

Die Idee ist im Prinzip recht simpel: Das Tic-Tac-Toe Spielfeld besteht aus 9 Feldern. Es ist also problemlos möglich, die Felder binär zu repräsentieren (000 000 000). Damit ließen sich auch die Gewinnerkombinationen einfach festlegen:

  • Horizontal: 111 000 000, 000 111 000, 000 000 111
  • Vertikal: 100 100 100, 010 010 010, 001 001 001
  • Diagonal: 100 010 001, 001 010 100

Mehr gibt es nicht. Umgerechnet in Dezimalwerte ergibt sich daraus die Liste von Zahlen wie oben im Array winningCombinations dargestellt.

Das ist in sofern pfiffig, als dass sich mit nur einer Schleife herausfinden lässt, ob ein Gewinner vorliegt. Dazu muss einfach nur über das obige Array iteriert und der jeweilige Wert mit dem Spielbrett bitverknüpft werden. Fertig.

Wer mitgedacht hat, wird spätestens jetzt sagen: Ja, aber! Es gibt zwei Spieler. Daraus ergeben sich drei Zustände und ein Bit kann nur zwei Zustände haben:

  • Feld unbesetzt
  • Feld von Spieler 1 besetzt
  • Feld von Spieler 2 besetzt

Ich sage: Richtig. Also speichern wir einfach für jeden Spieler in dem Integer ein separates Spielbrett. Das ergibt somit 18 Bit und ist problemlos abbildbar (Dezimal 262.143). Worauf nun lediglich geachtet werden muss, ist beim abwechselnden Setzen von X und O durch Spieler 1 und Spieler 2 a) das korrekte Spielbrett innerhalb des Integers zu erwischen und b) darin wiederum das korrekte Feld. Das ermöglichen Bit-Shift Operationen:

GameBoard.cs

public enum Player
{
  Player1,
  Player2
};

private int GetPosition(int pos, Player player){
  return (1 << (int)player * 9) << pos;
}
  

 

Die Frage von oben, wie sich denn nun die gewählten Felder der jeweiligen Spieler in der Integer Variablen festhalten lassen, ist damit leicht beantwortet:

GameBoard.cs

public void Set(int pos)
{  
  if (pos < 0 || pos > 8) throw new ArgumentOutOfRangeException("The gameboard only consists of nine fields. Please set a new coin only on positions from zero to eight.");

  this.board |= this.GetPosition(pos, this.ActivePlayer);
}
  

 

Da dieser Artikel mehr auf die etwas ungewöhnliche Art, ein Tic-Tac-Toe Spielbrett in C# abzubilden abzielt und weniger auf den testgetriebenen Ansatz, kommt an dieser Stelle der Hinweis: Bevor es zu dieser Implementierung gekommen ist, wurden zunächst Tests für das Setzen von Feldern, der Prüfung, ob ein Feld bereits belegt wurde und dann irgendwann das Prüfen verschiedener Gewinner-Konstellationen implementiert. Abschließend wurde der Spielverlauf selbst mittels Strategie-Muster entworfen und getestet.

Wichtig hierbei war natürlich die Entkopplung von Abhängigkeiten (wie z.B. Benutzereingabe und Bildschirmausgabe).

Um aber noch kurz zu zeigen, wie einfach basierend auf der hier vorgestellten Methode das Prüfen auf einen Gewinner ist, der Vollständigkeit halber noch der dazugehörige Code:

GameBoard.cs

public bool CheckWinner()
{
  foreach (int winningCombination in this.winningCombinations)
  {
    if (this.IsMatch(winningCombination))
    {
      return true;
    }
  }
  return false;
}

private bool IsMatch(int combination)
{
  return (this.board & combination << 9) == combination << 9 || // Check if player 2 won
    (this.board & combination ) == combination; // Check if player 1 won
}
  

 

Spannend, oder? Falls sich jemand für die Solution interessiert, lohnt sich ein entsprechender Kommentar. Auch der TDD Ansatz lässt sich hier ganz gut demonstrieren: In der ersten Iteration gab es noch zwei Integer-Variablen für die Repräsentation der Spielfelder für beide Spieler (und natürlich eine Menge Unit-Tests). Im Anschluss wurde der Game Code refaktorisiert, so dass nur noch eine Integer Variable wie oben gezeigt notwendig war. Die bestehenden Unit Tests konnten zeigen, dass die Logik (von außen betrachtet) dadurch keinen Schaden genommen hat.

Und so soll es schließlich ja auch sein.

Smile 

Bugfix: Glossar Beschreibung im OIA anzeigen

Mit diesem Artikel folgt ein weiteres Deep Dive in die Welt des OIA (Oracle Identity Analytics). Dieses Mal vor dem Hintergrund eines Bugs, dessen Lösung im Folgenden beschrieben wird.

Im letzten Artikel haben wir gezeigt, wie eine Zertifizierung auf der Grundlage lokaler Konten konfiguriert und durchgeführt werden kann. Da es dabei erforderlich ist, Primärschlüssel zusammenzusetzen, entstehen für die Attribute relativ lange Namen. Das macht die Darstellung für den Zertifizierer unübersichtlich.

Zu sehen war deswegen in dem Artikel, wie beispielsweise die Gruppenmitgliedschaft zwar als Kombination zwischen Server, Account und Gruppe importiert wurde (“SRV01 > A000002 > Users”), die Anzeige sich aber während der Zertifizierung auf die Darstellung der Gruppe beschränkt:

image

 

Klickt nun der Zertifizierer auf die Gruppe, können Glossarinformationen angezeigt werden, die in diesem Beispiel im Feld Description eine Beschreibung des Servers mitführt. Das kann dem Zertifizierer dabei helfen, den Kontext besser zu verstehen. Damit das funktioniert, müssen ressourcenabhängig Glossarinformationen importiert werden.

Import Glossary

Datei: …\import\schema\Betriebssystem_glossary.rbx

# @iam:namespace name="Betriebssystem" shortName="OPS"
attributeName,atributeValueValue,endpointName,definition,shortDescription

Datei: …\import\in\Betriebssystem_01_glossary.csv

"groups","SRV01 > D000001 > Users","Windows","Users","Zentraler Entwicklungsserver"
"groups","SRV01 > D000001 > Developers","Windows","Developers","Zentraler Entwicklungsserver"
"groups","SRV01 > A000002 > Administrators","Windows","Administrators","Zentraler Entwicklungsserver"
"groups","SRV01 > A000002 > Users","Windows","Users","Zentraler Entwicklungsserver"

Das Ergebnis des Imports kann nun im Identity Warehouse im Bereich Data Management der jeweiligen Ressource eingesehen werden:

image

Wenn der Zertifizierer während der Zertifizierung nun wie oben dargestellt auf einen Glossareintrag klickt, erhält er aber folgendes Popup:
image

 

Was fehlt, ist die Description. Und der Grund hierfür ist der oben erwähnte Bug in OIA.

Analyse

Bei der Analyse des Datenstroms zwischen Server und Browser mit Hilfe der Internet Explorer Developer Toolbar hat sich gezeigt, dass die Daten für das Popup über den Service dwrIDCService mit der Methode loadBatchUserAccounts gezogen werden. Der Blick in den Quellcode hat zutage gefördert, dass am Ende die Abfrage getIDCAccountAttributesFlatByUser ursächlich für das Problem verantwortlich ist. Da allerdings im OIA das (inzwischen abgemeldete) Produkt iBATIS zum Einsatz kommt, lässt sich die Abfrage leicht einsehen. Sie befindet sich in der Datei IDCAccount.xml im Verzeichnis …\WEB-INF\classes\com\vaau\rbacx\idc\dao\ibatis\maps.

Zunächst wird in der Abfrage ein Defaultdatensatz erzeugt:

<select id="getIDCAccountAttributesFlatByUser" resultMap="account-attribute-wrapper">
  select
  null as attribute_value_id,
  null as attribute_id,
  null as attribute_value,
  null as glossary_def,
  null as short_description,
  null as attribute_name,
  ,
  

 

Einige Zeilen später findet ein Union statt mit einer Abfrage, die die tatsächlichen Daten aus der Datenbank bezieht. Hier zeigt sich das Problem:

select 
   
  idc_account_attributes.short_description as short_description, 
    
from 
  idc_account_attributes, attributes, idc_user_acct_attrs, idc_accounts, namespaces 
  
  

 

Der Blick in die Datenbank zeigt, dass sich hier schlicht keine Daten befinden. Die Glossarinformationen wurden beim Import nämlich in die Tabelle attribute_value_metadata eingelesen.

Lösung

Die Abfrage muss angepasst werden, so dass die Tabelle attribute_value_metadata mit einbezogen wird. Dabei ist darauf zu achten, über die Where-Klausel die Verknüpfung korrekt zu definieren.

select 
   
  attribute_value_metadata.short_description as short_description, 
   
from 
  idc_account_attributes,attribute_value_metadata, attributes,  
where 
  attributes.attributekey = idc_account_attributes.attribute_id and 
  attribute_value_metadata.attribute_value_id=idc_account_attributes.iam_attr_val_id and 
  attribute_value_metadata.endpoint_id=idc_accounts.endpoint_id and 
  idc_account_attributes.id = idc_user_acct_attrs.account_attribute_id and
   
  

Das war es auch schon.

An dieser Stelle ein leider notwendiger Hinweis: Soweit wir es sagen können, hat diese Änderung keine Auswirkungen auf das restliche Produkt. Da wir den OIA aber nicht entwickelt haben, können wir dafür keine Gewährleistung übernehmen. Sollten Sie daher ebenfalls Änderungen an Ihrem System vornehmen, geschieht das auf eigene Gefahr.

Fazit

Leider zeigt sich beim OIA, dass durch den turbulenten Lebenslauf (entwickelt von vaau, übernommen von Sun, gekauft von Oracle) die eine oder andere Unstimmigkeit entstanden ist. Von außen lässt sich natürlich schwer nachvollziehen, welches Unternehmen nun ursächlich für solche Probleme verantwortlich ist. Das ist aber auch unerheblich. Wichtiger ist, dass man sie lösen kann.

Wir konnten dieses Problem durch den Einsatz verschiedener Analysewerkzeuge inkl. Einsicht in den Quellcode identifizieren und nachhaltig beheben. Da von einem Unternehmen, das den OIA zum Zweck der Zertifizierung von Benutzern, Rollen und Konten einsetzt, natürlich kaum erwartet werden kann, so tief in die Technik einzusteigen wenn etwas nicht funktioniert wie erwartet, gibt es für Kunden i.d.R. nur eine Option: Bei Oracle einen Spezialisten einkaufen.

Oder aber Sie fragen uns. :)

Über die Autoren

Christian Jacob ist Leiter des Geschäftsbereiches Softwarearchitektur und -entwicklung und zieht als Trainer im Kontext der .NET Entwicklung sowie ALM-Themen Projekte auf links.

Marcus Jacob fokussiert sich auf die Entwicklung von Office-Addins sowie Windows Phone Apps und gilt bei uns als der Bezwinger von Windows Installer Xml.

Martin Kratsch engagiert sich für das Thema Projektmanagement mit dem Team Foundation Server und bringt mit seinen Java- und iOS-Kenntnissen Farbe in unser ansonsten von .NET geprägtes Team.

Aktuelle Kommentare

Comment RSS