Herzlich Willkommen im Communardo Techblog, dem Entwickler-Weblog von Communardo. An dieser Stelle werden wir in loser Folge Ideen, Problemlösungen, Tipps und Problemstellungen rund um die Entwicklung webbasierter Software auf Basis verschiedenster Technologien vorstellen. Wir freuen uns über Rückmeldungen und Kommentare unserer Leser. Viel Spaß beim Lesen und Kommentieren.
Was macht eigentlich einen professionellen Software-Entwickler aus? Mit dieser Frage starten Ralf Westphal und Stefan Lieser gern, wenn sie erklären, worum es bei der Clean-Code-Developer-Initiative eigentlich geht. Und auch genau mit dieser Frage startete die Keynote des dotnetpro Powerdays zum Thema CCD, der am 09.03.2010 in München die Einleitung zu einem dreitägigen Workshop bot. Und die Antworten aus dem Publikum sind sehr reichhaltig: “Man hat Spaß daran, guten Code zu schreiben” und “Man hat Erfahrung.” hört man aus der einen Richtung, “Jemand ist bereit, einem für ein Programm Geld zu geben” und “Man schreibt Code den andere verstehen” aus der anderen Richtung. Letztenendes ist klar: Dies sind nicht die Kriterien für einen professionellen Softwareentwickler, sondern Professionalität aus dem Blickwinkel von CCD ist eine Mischung aus Bewusstheit und Prinzipien. Mit viel Witz und mehren verschenkten Mausmatten als Belohnung für interessante Antworten führen die beiden durch die Keynote und bringen so jedem das Thema näher.
Mit einem kleinen Ausflug in die Softwarearchitektur und einer Betrachtung von Test Driven Development geht der Tag weiter. Klar ist, die beiden wissen was sie rüberbringen wollen und vertreten da auch ihre Meinung recht konsequent. Aussagen wie “Wozu brauche ich einen Debugger – meine Tests zeigen mir doch, wo der Fehler ist”, “Zum Erstellen einer Softwarearchitektur braucht man keine Tools – nur ein Flipchart” sorgen dafür, dass selbst langjährige und erfahrene Entwickler das Problem mal aus einer anderen Richtung betrachten – und wenn uns jemand nach einer Software-Architektur für ein Warenwirtschaftssystem gefragt hat, haben wir dann nicht alle mit einem einzigen “großen Kreis mit Bubbel in der Mitte” auf dem Flipchartpapier geantwortet?
Nach einem Abstecher in Richtung Event Based Programming mit den Hauptakteuren “Paula Portal”, “Anton Adapter”, “Frieda Filter” und “Zacharias Zähler” bestand der Nachmittag darin, eine “Brownfield-Anwendung” im Sinne von CCD sauber zu machen. Leider musste ich nach der Ermittlung der guten und schlechten Eigenschaften der Anwendung die Veranstaltung verlassen, weil sonst mein Flieger ohne mich gestartet wäre, aber ich denke das anschließende Refactoring der Anwendung war auch noch sehr interessant.
Zusammenfassend: Ja, ich mag diese Art von Stefan und Ralf, wie sie solche Veranstaltungen durchführen, unabhängig davon ob sie kostenfrei auf Usergroups sind oder ob sie Workshops durchführen. Denn so wird man abseits vom täglichen Geschäft dazu animiert, mal neue Wege einzuschlagen oder anders an ein Thema heranzugehen. Schade ist, dass es im Tagungsraum im Untergeschoss kein WLAN oder UMTS gab, denn sonst wären einige der Sprüche der beiden sicher sofort per Twitter in der virtuellen Welt gelandet.
Und der Ausspruch eines Teilnehmers “Ich bin der, der unbedingt hierher wollte, weil es interessant ist; mein Kollege hätte es aber eigentlich nötig gehabt, das mal mitzumachen.” zeigt, dass das Thema durchaus interessant ist, aber noch nicht alle die Notwendigkeit gesehen haben, wirklich professionell zu arbeiten.
Seit dem 23.02.2010 steht das Cumulative Update Februar 2010 für Windows SharePoint Services 3.0 und Microsoft Office SharePoint Server 2007 zum download bereit. Artikel vollständig lesen »
Wie werden nun diese Sharepoint Listen gezeichnet? Wie könnte nun der neu zu entwickeltende, spektakuläre Cover Flow für Sharepoint aussehen, den man sich gerade noch im Kopf zurecht gerückt hat? Irgendwie muss dieser im Kopf entwickelte Prototyp nun in das Konzept übertragen werden. Spätestens an diesem Punkt steigen die meisten Consultants oder Artgenossen aus. Einige versuchen sich noch hartnäckig mit ihren Copy & Paste Fähigkeiten (Photoshop und Co.) das gewünschte Bild zusammen zu montieren. Aber sind wir doch mal ehrlich: schön ist das nicht.
Wer öfters mal eine Dokumentation oder aber auch ein Fachkonzept schreibt, wird dieses Szenario wahrscheinlich nur zu gut kennen.
Die kleine italienisch/amerikanische Firma Balsamiq Studios hat sich auf die Flagge geschrieben, uns genau in dieser schweren Zeit der “Ideen-Illustration” zu unterstützen. Gegründet und geleitet wird die kleine Firma von Giacomo ‘Peldi’ Guilizzoni, einem Ex – Adobe Software Lead. Mehr über die Gründungsgeschichte von Balsamiq kann in diesem (empfehlenswerten) Blogpost gefunden werden.
Wie sieht so eine “Skizze”, welche mit Balsamiq entworfen werden kann, denn nun aus?
Genau so!
Das Content Query WebPart bietet dem Nutzer die Möglichkeit “mal schnell” Inhalte aus einer bestimmten Site oder Liste auf einer Seite zu publizieren. Dabei besteht die Möglichkeit aus diversen Anzeige-Modi zu wählen. Sollen allerdings Inhalte aus einer Richtext-HTML-Spalte angezeigt werden, beispielsweise die Description einer Posts Liste, wird das HTML nicht aufgelöst.
Den Auftakt zum letzten Tag auf der Basta! macht für mich Custom Field Types – Entwicklung und Einsatzmöglichkeiten mit Oliver Wirkus. Die Entwicklung eines Custom Field Type für SharePoint ist eher unspektakulär und wer das schon einmal gemacht hat, wird dazu hier nicht viel Neues erfahren. Einen Tipp möchte ich noch weitergeben: Für die Festlegung von Konfigurationseinstellungen bieten sich die Custom Properties in der fldtype_xxx.xml an – allerdings sollte man bedenken, dass diese bei einem Update immer wieder “überbügelt” wird (dennoch sind die Daten dort allemal besser aufgehoben als “hard coded”). Folgende “Unschönheiten” bzgl. Custom Field Types sollte man bei deren Verwendung bedenken: Artikel vollständig lesen »
Bei der Entwicklung von mehreren Plugins kann es vorkommen, dass Texte mehrfach übersetzt werden müssen, wodurch somit Redundanzen entstehen. Der Ursprung liegt dann bei Atlassian Confluence, welches das Sharen von i18n-keys über die verschiedenen Plugins hinweg nicht ermöglicht.
Angenommen man hat ein Plugin X entwickelt und in ihm den i18n-key manager.user.email definiert. Zusätzlich existiert ein Plugin Y, dass Plugin X um weitere Funktionalität ergänzt und eine neue vm anlegt, die eben auch den i18n-key manager.user.email verwenden soll. Nun gibt es das Plugin-Konzept von Confluence nicht her auf die in den properties definierten Texte von Plugin X zuzugreifen. Dies bedeutet, dass der Key auch im Plugin Y hinterlegt werden muss. Folglich ergibt sich ein erhöhter Pflegeaufwand.
Damit Redundanzen beseitigt werden können, müssen die i18n-keys zentral abgelegt werden. Dazu kann man einen bestimmten Plugintyp von Confluence – das Sprachplugin – nutzen.
Diese Erkenntnis ist wichtig, da für die Lösung des oben genannten Problems, es notwendig ist, die Standard Sprachplugins von Confluence zu deinstallieren und die darin enthaltenen property Dateien in das neue SprachPlugin zu überführen.
Außerdem muss die atlassian-plugin.xml des Sprachplugins, wie folgt angepasst werden.
<language name="German" key="de_DE" language="de" country="DE">
<resource name="de_DE.png" type="download"
location="templates/languages/de_DE/de_DE.png">
<property key="content-type" value="image/png"/>
</resource>
</language>
<language name="Spain" key="es_ES" language="es" country="ES">
<resource name="es_ES.png" type="download"
location="templates/languages/es_ES/es_ES.png">
<property key="content-type" value="image/png"/>
</resource>
</language>
<resource name="i18n" name="i18n_my_plugin" type="i18n" location="/my_plugin"/>
<!-- Important entry, because you have to add the default
i18n files to this new plugin -->
<resource name="i18n" name="i18n_default" type="i18n"
location="/ConfluenceActionSupport"/>
Diese Lösungsansatz beseitigt nicht nur Redundanzen, sondern bietet auch in Kombination mit Maven, eine Möglichkeit mehrere Varianten einer Pluginlösung textuell abzugrenzen.
Für diesen Fall kann man mittels Maven tricksen. Wichtig hierbei ist eine eindeutige Namenskonvention für die Unterteilung der properties vorzunehmen. Beispielsweise kann man die properties wie folgt namentlich abgrenzen:
Ist das geschehen, definiert man in der atlassian-plugin.xml des LanguagePool-Plugins folgende Zeilen:
<resource name="i18n" name="i18n_my_plugin_general" type="i18n"
location="/my_plugin"/>
<resource name="i18n" name="i18n_my_plugin_specific" type="i18n"
location="/my_plugin_${TYPE}"/>
Letztlich müssen im Eclipse zwei neue Maven Run-Configurations erstellt werden, die das entsprechende Goal (Bsp.: package, install oder atlassian-pdk:install) verwendet und im Environment-Tab die Variable TYPE auf typex oder auf typey setzt.
Am 24.02.2010 haben sich die .NET Freaks aus Dresden und Umgebung zur .NET Usergroup bei uns im Hause zusammen gefunden. Diesmal wurde es gruselig. Alexander Groß führte uns durch ein aktuelles Projekt, welches sich rund um die Bestattung und Einäscherung dreht. Die Idee des Vortrages, welcher eigentlich kein Vortrag im engeren Sinne darstellte, war die gemeinsame Betrachtung eines aktuellen Projektes und deren verwendeten Techniken.
Schon nach einigen Minuten kam es zu interessanten Diskussionen.
Alexander zeigte beispielsweiße wie in seinem Projekt Rake verwendet wird um auf einfache Weise Konfigurationen leicht wartbar zu halten. Außerdem wie Rake und MSDeploy zusammen ein super Team darstellen um Anwendungen zu deployen.
Auf zum 2. Tag der Basta! Hauptkonferenz – und damit dem ersten der beiden SharePoint Days. Heute gibt es keine morgendliche Keynote, sondern es geht gleich in die Sessions – für mich ist das als erstes Sehenswertes aus SharePoint 2010 mit Tom Wendel. Erstaunlich für mich, dass nur ca. ein Drittel der anwesenden Entwickler Sharepoint 2010 überhaupt schon gesehen hat. Dementsprechend “basic” fällt die Vorstellung der Neuerungen aus – weshalb ich hier auch auf eine detaillierte Auflistung verzichte. Trotzdem ein paar “Bruchstücke”, die mir nennenswert erscheinen: Artikel vollständig lesen »
Dem Einen oder Anderen hat Visual Studio wahrscheinlich schon einmal mit dieser leicht dominierenden Bildschirmausgabe überrascht. Wahrscheinlich aber haben es die Meisten noch nie zu Gesicht bekommen, denn wir sind ja keine Copy & Paste Entwickler.
Das ist der besagte Hinweis:
Randbedingungen:
Ich verwende eine virtuelle Maschine(Windows Server 2003) unter Microsoft Virtual Server 2005 R2.
Das Problem tritt gelegentlich auf, wenn innerhalb der Host Maschine etwas kopiert wird und anschließend versucht wird, das soeben kopierte, in Visual Studio, auf der Entwicklungsmaschine, einzufügen.
Lösung:
Wie kann dieses Problem nun gelöst werden? Anfangs dachte ich, der Übeltäter wäre Visual Studio, und beendete einfach den devenv.exe Prozess. Irgendwann irritierte es mich aber, dass sobald diese Meldung auftauchte überhaupt kein Copy & Paste mehr funktionierte. Zu diesem Zeitpunkt fand ich heraus, dass der eigentliche, anfangs nicht verdächtige, Prozess rdpclip.exe der Schuldige war.
Um also in Visual Studio weiter arbeiten zu können, muss einfach der Prozess rdclip.exe beendet werden. Dies kann leicht über den Task Manager vollführt werden.
Falls anschließend wieder Copy & Paste verwendet werden soll, nicht vergessen den RdpClip.exe Prozess wieder zu starten. Gefunden werden kann dieser im Verzeichnis C:\Windows\System32
SharePoint 2010 bietet mit der Assembly Microsoft.SharePoint.Linq.dll (zu finden im Ordner 14\ISAPI) die Möglichkeit, recht einfach Listeninhalte abzufragen. Wenn man sich etwas näher damit beschäftigt, kann man sehr viele Parallelelen zu LINQ to Objects und Linq to SQL entdecken.
Erster Schritt ist, eine Referenz auf die genannte Assembly hinzuzufügen. Ab diesem Zeitpunkt steht der Namespace Microsoft.SharePoint.Linq zur Verfügung. Dieser beinhaltet die Klasse DataContext, über die ähnlich wie bei LINQ to SQL auf die Inhalte zugegriffen werden kann. Die Initialisierung des Kontexts ist recht einfach – hierzu wird einfach im Konstruktor des Objekts die Url der zu verwendenden Site übergeben.
Vor dem Erfolg steht aber ein wenig Arbeit, denn der Zugriff ist typsicher und so müssen für die verwendeten Inhaltstypen Klassen angelegt werden. Auch hier zeigen sich wieder Parallelen zu bereits Bekanntem: Mit Hilfe des Tools SPMetal (zu finden im Ordner 14\BIN) können die Klassen auf Basis einer bestehenden Site automatisch erstellt werden.
Ab diesem Zeitpunkt ist es recht einfach, wie das folgende Beispiel zeigt:
DataContext data = new DataContext("http://mysite/");
EntityList<Page> wikiPages = data.GetList<Page>("Pages");
var filteredPages = from wikiPage in wikiPages
where wikiPage.Name == "Inline-Process-Editor.aspx"
select wikiPage;
foreach (var filteredPage in filteredPages)
{
Console.WriteLine(filteredPage.Path);
}
Releaseparty at Atlassian? Confluence 3.2 BETA and 3.1.2 with soms bugfixes were released yesterday. [...]
Tino Schmidt's Vortrag zu Enterprise Mashups auf der webciety, 4.3 Remix the Web http://bit.ly/d26rtA [...]
neuer Blogpost: February Cumulative Update (2010) http://bit.ly/cwxZGE [...]
Webinar am 16.03.: „Communote Enterprise Microblogging - Funktionen und Einsatzbereiche im Unternehmen“ http://bit.ly/96eexF [...]