Leichtgewichtige Alternative zu SPMetal

Wer bereits mit SPMetal gearbeitet hat, kennt die Vorzüge aber sicher auch die Nachteile, die der Einsatz des ORM mit sich bringt. In großen Projekten mit einer Vielzahl von Listen und Bibliotheken erleichtert SPMetal die Arbeit ungemein während es bei programmatischen Anpassungen, wie einzelnen EventReceivern oder einer kleinen Anwendung zur Datenmigration keinen Nutzen bringt. Gerade im Zugriff per CSOM ist man hier viel schneller, wenn man die wenigen Felder, die man benötigt, manuell anspricht und sich die benötigten StaticNames per PowerShell holt.
Jedoch ist hart-kodieren bekanntlich alles andere als schick und oft kommt es vor, dass man ein wichtiges Feld vergessen hat – also wieder die PowerShell starten und den StaticName holen. Oder gar über Tricks im Web-Interface den passenden Feldnamen suchen…

SPWoodUm die Lücke zwischen SPMetal und der Suche von eindeutigen SharePoint-Feldnamen “zu Fuß” zu schließen, habe ich eine kleine Anwendung mit dem Namen “SPWood” gebastelt, mit deren Hilfe sich Listen/Bibliotheken einer SharePoint-Webseite und deren Felder schnell und einfach in Enums überführen lassen. Der erzeugte Code kann direkt per Copy’n Paste in das eigene Programm übernommen werden oder separat als Datei bzw. Klasse gespeichert werden.

Durch die Verwendung des Summary-Tags an jedem Feld wird zudem die Ausgabe des IntelliSense um wichtige Informationen erweitert. So sieht man beispielsweise auf den ersten Blick, wie der Anzeigename lautet, ob das Feld schreibgeschützt ist und um welchen Datentyp es sich handelt.

Direkter Zugriff per String-Indexer am ListItem:

ListItem Feld Indexer per bekanntem Feldnamen als String

Direkter Zugriff per SPWood-Proxy-Enum am ListItem mit IntelliSense:

ListItem Feld Indexer mit SPWood

Das Tool steht in meinem OneDrive zur freien Verfügung; lediglich die SharePoint Client DLLs werden noch benötigt. Details dazu siehe beiliegender README.

“SPWood.zip”

QUELLE: OneDrive

GRÖßE: 0,05 MByte

DATUM: 29.08.2014

Microsoft Azure angetestet

Trotz Patriot Act, NSA-Skandal und der heute ganz alltäglichen Paranoia, lässt sich das Thema rund um das IT-Buzzword, mit dem sich jede Runde B*llsh*t-Bingo gewinnen lässt, kaum ignorieren. So ist auch die Microsoft-Wolke, die seit der CTP aus dem Jahr 2008 und dem kommerziellen Release in 2010 nunmehr einige Jahre auf dem Buckel hat, deutlich aus den Kinderschuhen heraus und stellt eine ernstzunehmende Cloud-Plattform zur Verfügung.

Die Einstiegshürden sind verhältnismäßig niedrig – aktuell gibt es Azure für alle Interessierten mit einer kostenfreien, einmonatigen Testversion, die 150€ zum Ausgeben für virtuelle Infrastruktur beinhaltet. Für all jene, die über eine MSDN-Subscription verfügen, hat man noch bessere Nachrichten parat: Je nach Abo-Typ ist bereits ein Azure-Kontingent zwischen 40€ und 115€ pro Monat in der MSDN-Mitgliedschaft enthalten, was man keinesfalls nur aus Unwissenheit verfallen lassen sollte.

Die Teststellung ist mit einer Live-ID schnell und unkompliziert eingerichtet. Anschließend kann man sich seine Dienste in der Cloud mit wenigen Klicks zusammenstellen.

Azure Trial - Neuen Dienst/Instanz erstellen

Das tatsächliche Highlight bei der Bereitstellung sind jedoch die Kataloge, aus denen man zahlreiche vorab installierte/konfigurierte System-Images auswählen kann.

VM-Images

  • Windows Server 2008 R2 SP1 bzw. 2012 R2
  • Visual Studio
  • BizTalk
  • SQL Server
  • SharePoint
  • Dynamics-Produkte
  • Ubuntu
  • CentOS
  • Suse
  • Oracle

Web App Images

  • ASP.NET
  • Java
  • PHP
  • Node.js
  • Python
  • SQL Databases
  • MySQL
  • MongoDB
  • WordPress
  • Umbraco
  • Joomla
  • Drupal

Azure Trial - VM Katalog

Die Verwaltung der Azure-Services erfolgt vollständig über ein Web-Interface, mit dem sich von der einzelnen VM bis hin zur Gesamtabrechnung der in Anspruch genommenen Ressourcen für das Azure-Konto alles überwachen und steuern lässt.

Azure Trial - VM Dashboard

Und um die ganze Sache abzurunden, kann die Bereitstellung von Azure-Services ebenfalls via PowerShell oder gar per REST-Webservice erfolgen.

Mein Fazit: Für den Aufbau umfassender Test-Szenarien, das Ausprobieren neuer Technologien und die Entwicklung von Komponenten eine wirklich gute Alternative.

OneNote API: Der Juni bringt Neues für die Beta

Anfang diesen Jahres wurde die OneNote REST API für den Zugriff auf die online abgelegten OneNote-Notizbücher veröffentlicht. Damit ist es möglich in eigenen Anwendungen das Speichern von Informationen in das eigene Notizbuch zu implementieren.
Leider fehlt es der API bislang an wesentlichen Funktionen: Man kann nicht vorgeben, wohin man im Notizbuch speichern möchten - die angelegte Seite wird automatisch in den Default-Bereich “Nicht abgelegte Notizen” geschrieben - und es ist nicht möglich, Informationen aus den Notizbüchern gezielt zu lesen. Diese Mängel stellten die an sich gute Idee erheblich in den Schatten und machten sie weitestgehend uninteressant für Entwickler.
Nachdem seit April nur wenig spannende Neuigkeiten zur Web-Schnittstelle veröffentlicht wurden, informierte man kürzlich ohne großes Aufsehen, dass diese beiden Funktionen nun in der Beta zur Verfügung stehen.

Am 12. Juni wurde im OneNote API Developer Blog bekanntgegeben, dass das Anlegen von Inhalten an beliebigen Stellen im Notizbuch funktioniert und am 18. Juni das Lesen von allen Notizbüchern, deren Bereichsgruppen, Bereichen und Seiten.

Testen kann man die neuen Funktionen bereits in der Beta-Version der Schnittstelle; am schnellsten per OneNote APIGee Console:

1. Sammlung der Notizbücher abrufen…

OneNote API - Notizbücher abrufen

2. Die im Notizbuch enthaltenen Bereiche abrufen…

OneNote API - Bereiche im Notizbuch abrufen

3. Die im Bereich enthaltenen Seiten abrufen…

OneNoteApi_Pages

Die Vermutung liegt nahe, dass die in der Beta verfügbaren Funktionen ebenfalls bald in den Release der API eingehen. In dem Falle steht der Entwicklung eigener Anwendungen mit direkter OneNote-Anbindung nichts mehr im Wege…

PowerShell für Developer

Das eigentliche Killer-Feature der PowerShell ist tatsächlich die konsequent durchgesetzte Objektorientierung. Es muss ja nicht unbedingt immer gleich ein ganzes Script sein. Oft genug genügen auch ein paar .NET Objekte, die man sich mit wenigen Zeilen Code/Command(let)s von der ersten Property bis zu letzten Methode zu Gemüte führen kann.
Ganz besonders reizvoll wird dies bei APIs von komplexen Systemen, wie z. B. Microsoft SharePoint, mit deren Hilfe man per PowerShell auf dem gesamten Objektmodell mit minimalem Aufwand lesen und manipulieren kann.

Wie im letzten PowerShell-Post, hier ein paar meiner Favoriten kurz und knapp zusammengetragen:

#1 Get-Member: Objekt-Analyse

Direkt an der Konsole fehlt üblicherweise IntelliSense. Da man Eigenschaften und öffentliche Methoden von Objekten selten alle im Kopf hat, ist Get-Member das aus meiner Sicht wichtigste Cmdlet der PowerShell – ganz besonders dann, wenn man etwas abseits der Cmdlets mit .NET Objekten arbeitet. Den Spickzettel zu jedem Objekt gibt’s auf Befehl (im Beispiel für ein System.IO.FileInfo-Objekt) per Get-Member.

dir | Get-Member

Fehlen Methoden oder Eigenschaften, kann man dem Cmdlet mit der Option -Force noch ein wenig mehr Informationen entlocken.

dir | Get-Member -Force

#2 Invoke-WebRequest: Daten aus dem Netz verwenden

Mit einem Web Request Daten aus dem Netz laden: Beim Entwickeln von Software vor allem dann populär, wenn es um das Ansprechen von Web-APIs geht. Im nachfolgenden Beispiel wollen wir ein Diablo III Spielerprofil via REST Webservice abrufen.

// Daten abrufen; vorerst "Plain" per .NET Klassenbibliothek und dem WebClient
(New-Object System.Net.WebClient).DownloadString("http://eu.battle.net/api/d3/profile/quatze-2409/")
// Ganz ähnlich aber viel kürzer geht es mit dem Invoke-WebRequest Cmdlet, welches mit PS 3.0 eingeführt wurde
Invoke-WebRequest http://eu.battle.net/api/d3/profile/quatze-2409/

Soweit so gut aber wirklich arbeiten kann man damit noch nicht, da wir lediglich die JSON-Struktur in einem String haben. Mehr dazu mit dem nächsten Cmdlet…

#3 ConvertFrom-Json: Rückgabe des REST Webservice verarbeiten

Um mit den aus #2 abgerufenen Informationen zu arbeiten, kann man den abgerufenen String umständlich von Hand parsen und zerschneiden oder man konvertiert ihn in ein .NET Objekt. Das Cmdlet ConvertFrom-Json bringt hierfür alles mit, was wir benötigen.

// Der vom REST Webservice abgerufene String wird an das Cmdlet ConvertFrom-Json übergeben, welches ein Custom Object erzeugt
Invoke-WebRequest http://eu.battle.net/api/d3/profile/quatze-2409/ | ConvertFrom-Json
// In einem Schritt und ohne explizites Konvertieren erzeugen wir mit dem Cmdlet Invoke-RestMethod das Custom Object, ...
$d3profile = Invoke-RestMethod http://eu.battle.net/api/d3/profile/quatze-2409/
// ...an welchem wir alle Helden nebst Primärattribute im Spielerprofil ausgeben lassen können
$d3profile.heroes | ft name, level, hardcore, gender, last-updated -AutoSize

#4 Range Operator

Es klingt profan aber die Idee dahinter spart Zeit und Code: Der Range-Operator der PowerShell zum einfachen Erzeugen von nummerischen Bereichen. Praktischer Nutzen? Kommt sofort…

// 1 bis 10 ausgeben; zugegeben - eher unspannend aber es erklärt die Funktionsweise
1..10

// Alles von A-Z; immer noch kein umwerfendes Feature aber durchaus praktisch
65..90 | % { [char]$_ }
// Ein Array mit 23 bis 42 initialisieren
$a = 23..42
$a.Length
// Drei mal gpupdate ausführen mit jeweils 10 Sekunden Pause
1..3 | % { gpupdate ; "Update #$_ $(Get-Date) done." ; Start-Sleep 60 }

#5 [] als Indexer

Nur der Vollständigkeit halber noch zu erwähnen: Zugriffe auf Collections und Arrays sind analog zur C#-Syntax möglich…

// Hier im Beispiel des Arrays aus #4
$a[5]

 

Mehr Informationen zur PowerShell und den Standard-Cmdlets aus dem Microsoft.PowerShell.Utility Modul findet man im TechNet.

Structure Visualizer for SharePoint

SharePoint VisualizerVon Zeit zu Zeit stehe ich vor der Herausforderung, Strukturen einer SharePoint Site oder eines SharePoint Webs grafisch darzustellen. Beispielsweise geht es dabei um Prototypen, deren ERM es in ein Konzept zu integrieren gilt oder man möchte für komplexe Seiten eine “Landkarte” erstellen, so dass neuen Projektpartnern der Einstieg erleichtert wird.
Gerade bei umfangreich verschachtelten Seitenstrukturen oder Datenmodellen mit zahlreichen Beziehungen ist es sinnvoll, Diagramme automatisch und so flexibel als möglich zu generieren. Besonders hilfreich ist es, wenn sich das Diagramm anschließend noch bearbeiten lässt.
Vor einigen Jahren hatte ich mir mit dem SharePoint Analyzer ein eher technisch orientiertes Tool gebastelt, was inhaltlich zwar ausreichend war, jedoch nur bedingt für die Erstellung vorzeigbarer Strukturübersichten geeignet ist…

SharePoint Visualizer ToolBar

Der SharePoint Visualizer vereint als Add-In für Microsoft Visio 2013 die Funktionen zum automatischen Auslesen von Site- und Web-Strukturen und hilft mit zur jeweiligen Seite verlinkten Visio-Shapes bei der Erstellung von aussagekräftigen Übersichten. Bei Bedarf können zusätzlich benutzerdefinierte Berechtigungen jeweils zu Web, Bibliothek oder Liste eingeblendet werden.


SharePoint isualizer SiteStructure

Die Beziehungen von Listen/Bibliotheken zueinander werden nebst Referenzname (Name des Nachschlagen-Felds), Richtung und ggf. Mehrfachnachschlagefunktion als n:m-Relation angezeigt, so dass man die Grafik als vereinfachtes Entity Relationship Diagram verwenden kann.


SharePoint Visualizer RM

Der asynchrone Aufruf der Business-Logik sowie ein wenig mehr “Intelligenz” bei der Darstellung sehr großer Website-Sammlungen fehlen noch – dennoch hier die BETA zum Testen:

“SharePoint-StructureVisualizer_BETA.zip”

QUELLE: OneDrive

GRÖßE: 0,46 MByte

DATUM: 29.06.2014

PowerShell: Schweizer Taschenmesser für alle

PowerShellVöllig unstrittig: Egal ob Bash, Cmd oder PowerShell – es gibt nicht selten Situationen, in denen geht es ohne Kommandozeile schlicht und ergreifend nicht weiter.
Gelegentlich - glücklicherweise zunehmend seltener - wird man trotzdem noch vor die Frage gestellt, was denn nun der Sinn der PowerShell sei, habe man doch alle Möglichkeiten mit der guten, alten Cmd. Dem Aufgeklärten fallen sofort Schlagworte wie objektorientiert und .NET Framework aus dem Gesicht, doch für einen echten Mehrwert reicht das noch nicht ganz. Gerade wenn die PowerShell von Softwareentwicklern beworben wird, schalten ambitionierte Endanwender auch gerne mal in den “brauch-ich-doch-nicht-Modus”, da das Handwerkszeug zu überdimensioniert erscheint, doch ist es das ganz und gar nicht.

Ein paar Beispiele, die mir mit der Zeit sehr ans Herz gewachsen sind und die das Potential haben, das Tagewerk eines jeden Keyboard-Junkies etwas zu erleichtern, kurz und knapp zusammengetragen:

#1 Get-ChildItem: Wer sucht, der findet

Dateien suchen… irgendwo auf der Platte hatte ich sie aber wo? Alles was im Index steckt – wie z. B. Dateien in der Bibliotheken oder dem Home-Folder – ist unproblematisch aber wie finde ich schnell und verlässlich Dateien, die irgendwo in den Untiefen des Systems liegen?
Das dir-Command (genau wie ls) an der PowerShell ist eigentlich ein Alias für das Commandlet Get-ChildItem. Entscheidend ist der Parameter -Recurse, der das Commandlet instruiert in allen erreichbaren Ordnern in/unterhalb des aktuellen Ordners zu suchen. Der Parameter -Filter hilft beim Eingrenzen der gesuchten Dateien.

ls -Recurse -Filter "*.log"

Ist zudem noch der Inhalt der per Get-ChildItem gesuchten Dateien interessant, so hilft die Übergabe der Ergebnisse an Select-String.

ls -Recurse -Filter "*.log" | Select-String "Exception"

#2 In alten DOS-Tools stets Standard: Datei-Attribute modifizieren

Möchte man z. B. das Erstellungsdatum oder das Änderungsdatum von Dateien anpassen, so führte in Prä-PowerShell-Zeiten der Weg gerne über eine hastig improvisierte Konsolenanwendung, welche man bis zum nächsten Einsatz gleich wieder verlegt hatte oder gar über ein Stück zwielichtige Freeware. Mit System.IO.File und einem Einzeiler ist man hier schneller am Ziel.

[IO.File]::SetLastWriteTime("C:\config.sys", (New-Object DateTime 1992, 1, 1))
[IO.File]::SetCreationTime("C:\config.sys", (New-Object DateTime 1992, 1, 1))

#3 Ausgabe in einer Tabelle sortieren und filtern ohne Umwege über Excel

Alles, was im Konsolenfenster passiert, bleibt im Konsolenfenster. Zumindest die Struktur bei tabellarischer Ausgabe kommt leider bei Copy&Paste abhanden. Möchte man mit den Daten weiterarbeiten, schafft hier das Commandlet Out-GridView Abhilfe, welches ein separates Tool zur tabellarischen Darstellung einer jeden PowerShell-Ausgabe startet; hier am Beispiel der letzten 10 Einträge aus dem Eventlog.

Get-EventLog Application -Newest 10 | Out-GridView

#4 Prüfsummen: MD5- oder SHA-Hash schnell berechnet

Nicht nur um zu prüfen, ob eine Datei sich gegenüber einem früheren Zeitpunkt verändert hat, sondern auch um diverse vorkompilierte Binaries aus der OpenSource-Gemeinde auf ihre Authentizität hin zu prüfen, kommt man an MD5 und SHA-Hashes kaum vorbei. Ungünstig nur, wenn man kein Tool zur Hand hat, in welches man den jüngst erworbenen Download stopfen kann. Der Security.Cryptography-Namespace des .NET Framework mit seinen Crypto Service Providern ist hier eine geeignete Anlaufstelle.

# MD5 
[BitConverter]::ToString((New-Object Security.Cryptography.MD5CryptoServiceProvider).ComputeHash((New-Object IO.FileInfo("C:\Windows\write.exe")).OpenRead())).Replace("-","").ToLower()
# SHA
[BitConverter]::ToString((New-Object Security.Cryptography.SHA1CryptoServiceProvider).ComputeHash((New-Object IO.FileInfo("C:\Windows\write.exe")).OpenRead())).Replace("-","").ToLower()

#5 Es wird Zeit: Ticks und Timestamps

Häufig in Log-Dateien und Debugger-Ausgaben anzutreffen – Zeitstempel, die nicht auf den ersten Blick zielsicher im Kalender zuzuordnen sind. Mit einigen Bordmitteln bzw. statischen Methoden des .NET Typs DateTime kommt man den unterschiedlichsten Zeitangaben schnell auf die Schliche.

# Ticks in Datum/Zeit konvertieren 
[DateTime] 634539233533222331
# Datum/Zeit in Unix-Timestamp konvertieren
(([DateTime]::Now) - (New-Object DateTime 1970, 1, 1).ToLocalTime()).TotalSeconds
# Unix-Timestamp in Datum/Zeit konvertieren
(New-Object DateTime 1970, 1, 1).ToLocalTime().AddSeconds(1393023440)

In 20 Jahren vom Organizer zum Smartphone

Waren vor 20 Jahren die heute so omnipräsenten, elektronischen Gadgets eher Randprodukte für den rastlosen Außendienstmitarbeiter, so findet man sie heute in jeder Hosentasche mit einem Vielfachen des damaligen Leistungs- und Funktionsumfangs. Ursprünglich als bessere Taschenrechner mit geringer Speicherkapazität und gewöhnungsbedürftiger Ein- und Ausgabe anstatt Ringbuchplanern genutzt, waren sie neben den Mobiltelefonen nicht minder einer der Wegbereiter für das mobile Internet.

Adressdatenbanken sowie reine PDAs sind nahezu ausgestorben und Smartphones als auch Tablets erfreuen sich größter Beliebtheit. Inzwischen gibt es nur noch wenig, was die kleinen Kisten nicht können. Handy-Kameras mit Pixel-Formaten von DSLRs, 4G-Datenübertragung, WLAN, Bluetooth, NFC, GPS, Social Media Integration, Media-Streaming und Browser, die ihren Desktop-Kollegen das Wasser reichen können, lassen die ursprünglich essentiellen Grundfunktionen wie PIM und Telefonie in den Hintergrund treten.

20 Jahre und ein Nachmittag mit dem Kopf im Technikschrank sollen Grund genug für mein ganz persönliches Resümee‎ sein:

Privileg DB50; Pocket Office CE64; Scall XTS; CasioPocket Viewer PV-100; Philips Nino 210; Siemens S35; Nokia 7110; Casio EM 500G; Nokia7650; HTC PM10A (MDA compact); Asus P750; Samsung Omnia II; Samsung Omnia 7; NokiaLumia 925

…und sie funktionieren alle noch – bis auf den Scall, mangels Service, der 2002 offiziell von eMessage/E*Cityruf eingestellt wurde.

Hier die Übersicht der Geräte:

Hersteller Modell Jahr Betriebssystem Speicher
(MB)
CPU Takt
(MHz)
Privileg DB50 1994 Unbekannt < 1 1
Unbekannt Pocket Office CE64 1996 Unbekannt < 1 4
Scall XTS 1997 Unbekannt - -
Casio Pocket Viewer PV-100 1998 Casio PVOS 1 20
Philips Nino 210 2000 Windows CE 2.11 8 75
Siemens S35 2000 Unbekannt < 1 -
Nokia 7110 2002 Nokia OS Series 40 < 1 -
Casio EM 500G 2003 Windows CE 3.0 16 150
Nokia 7650 2004 Symbian OS 6.1 4 104
HTC PM10A (MDA compact) 2006 Windows CE 4.21 64 416
Asus P750 2008 Windows Mobile 6.0 64 520
Samsung Omnia II 2010 Windows Mobile 6.5 8.192 800
Samsung Omnia 7 2011 Windows Phone 7 16.384 1.000
Nokia Lumia 925 2013 Windows Phone 8 16.384 1.500

Entwicklung von CPU und Speicher mobiler Geräte

Folgen

Erhalte jeden neuen Beitrag in deinen Posteingang.

Schließe dich 80 Followern an