WPF-Blogger.com [Language: de] http://www.wpf-blogger.com All news and information about Windows Presentation Foundation and Silverlight at one place. Dienstag, 21. Mai 2013 trello-burndown 0.8.0 verfügbar <p><a title="http://devtyr.github.com/trello-burndown/" href="http://devtyr.github.com/trello-burndown/" target="_blank">trello-burndown</a> ist ab sofort in der Version <strong>0.8.0</strong> verfügbar. Es hat wieder zahlreiche Bugfixes, Anpassungen und Erweiterungen gegeben, die in diesem Beitrag näher beschrieben werden.</p> <blockquote> <p>Weiterführende Informationen finden sich auf <a href="http://devtyr.github.com/trello-burndown/">http://devtyr.github.com/trello-burndown/</a>. Das Node-Modul kann auch via <a href="https://npmjs.org/">NPM</a> installiert werden, Informationen siehe <a href="https://npmjs.org/package/trello-burndown">https://npmjs.org/package/trello-burndown</a>.</p> </blockquote> <h2>Fehlerbehebungen</h2> <ul> <li>Der Sprint wurde einen Tag zu früh deaktiviert und konnte somit am letzten Tag nicht mehr aktualisiert werden</li> <li><font face="Courier New">export</font> und <font face="Courier New">config</font> Ordner werden nun beim Startup erstellt, sofern diese nicht existieren</li> <li><font face="Courier New">d3.js</font> wurde als NPM-Modul entfernt (Kompatibilitätsprobleme mit Node 0.10.x) und als statische Ressource eingebunden</li> <li>Wurden Tasks an Tagen abgeschlossen, die nicht aktiv im Burndown angezeigt werden, dann wurden deren Werte nicht berücksichtigt.</li> <li>Burndown-Chart wurde an die restlichen Charts angepasst</li> </ul> <h2>Features</h2> <ul> <li>Hover-Informationen in den Charts</li> <li>Es werden nun mehrere Finished Lists unterstützt</li> <li>Sprint-Ansicht wurde um eine Liste der offenen Punkte erweitert</li> <li>Sprint-Ansicht wurde um die Anzeige der Statistik-Daten erweitert</li> </ul> <p>&#160;</p> <p>Viel Spaß damit!</p> http://devtyr.norberteder.com/post/trello-burndown-080-verfugbar.aspx Norbert Eder [MVP] 4255 2013-04-18T13:01:06 WLAN verliert unter Windows 8 ständig Verbindung <p>Die WLAN-Verbindung auf meinem neuen Laptop verliert - wenn ich via Tethering online bin - laufend die Verbindung. Das ist durchaus nervig wenn man alle Minuten neu verbinden darf. Also muss dafür eine Lösung her. Insgesamt fallen mir hierzu zwei Möglichkeiten ein, die helfen können (wohl nicht müssen, aber wir werden sehen).</p> <h2>Energieverwaltung</h2> <p>Für einige Geräte besteht die Möglichkeit, dass der Computer unter dem Deckmantel der Energieverwaltung das jeweilige Gerät deaktivieren darf. Dies ist gerade bei Laptops die auf Akku laufen hilfreich um Ressourcen zu sparen. Dies kann jedoch unter Umständen zu ungewollten Verhaltensweisen führen. Um dies für die WLAN-Karte zu deaktivieren ist der <strong>Geräte-Manager</strong> zu öffnen und das Stück Hardware unter <strong>Netzwerkadapter</strong> zu finden. In den Eigenschaften findet sich nun die Lasche <strong>Energieverwaltung</strong>. Um eine Deaktivierung durch den Rechner zu verhindern ist der Haken von <strong>Computer kann das Gerät ausschalten, um Energie zu sparen</strong> zu entfernen. </p> <p><a href="http://devtyr.norberteder.com/image.axd?picture=image_245.png"><img title="Energieverwaltung für WLAN-Karte konfigurieren" style="border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; border-left: 0px; display: inline; padding-right: 0px" border="0" alt="Energieverwaltung für WLAN-Karte konfigurieren" src="http://devtyr.norberteder.com/image.axd?picture=image_thumb_168.png" width="700" height="510" /></a></p> <h2>Treiber aktualisieren</h2> <p>Hat die Änderung der Energieverwaltung nicht funktioniert, sollte überprüft werden, ob ein neuer Treiber zur Verfügung steht. Hierfür sind die selben Schritte, wie oben beschrieben, durchzuführen. Anstatt der Lasche Energieverwaltung ist hingegen die Lasche <strong>Treiber</strong> zu öffnen. Dies ergibt in etwa folgendes Bild:</p> <p><a href="http://devtyr.norberteder.com/image.axd?picture=image_246.png"><img title="Treiber-Informationen WLAN" style="border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; border-left: 0px; display: inline; padding-right: 0px" border="0" alt="Treiber-Informationen WLAN" src="http://devtyr.norberteder.com/image.axd?picture=image_thumb_169.png" width="500" height="580" /></a></p> <p>Nun ist die Schaltfläche <strong>Treiber aktualisieren</strong> zu wählen. Man wird nun gefragt, ob automatisch nach einem Treiber (online) gesucht werden soll, oder aber am Rechner (so man bereits zuvor Treiberdateien herunter geladen hat). Hier ist die erste Wahl zu treffen. Wird ein neuer Treiber gefunden, ist dieser zu installieren. Natürlich kann es nun sein, dass kein neuer Treiber gefunden wurde. Dies bedeutet jedoch nicht, dass es keinen neuen gibt. Hierfür ist die Hersteller-Seite (in meinem Fall die Seite von <a title="Download-Center Intel" href="https://downloadcenter.intel.com/" target="_blank">Intel</a>) aufzurufen und für die entsprechende Hardware nach einem Treiber zu suchen. Wie auf dem obigen Screenshot ersichtlich, ist die notwendige Information hierfür angeführt. Wichtig ist hier die korrekte Typbezeichnung und die aktuell installierte Version (hierbei ist darauf zu achten, ob es sich um 64-Bit oder 32-Bit System handelt - dies kann via <strong>System </strong>herausgefunden werden).</p> <p>Die Treiber kommen im Normalfall mit einem Installer, der auszuführen ist. Etwaige Anweisungen sind zu befolgen. </p> <blockquote> <p>Bei Intel ist mir aufgefallen, dass sich der Installer ohne Meldung verabschiedet. Ein kurzer Blick auf die Treiberversion hat jedoch gezeigt, dass der Treiber installiert wurde. D.h. dies vor Ausbruch einer Panik überprüfen :)</p> </blockquote> <p>In meinem Fall hat es ein Treiber-Update getan - Problem gelöst, allerdings stellt sich mir die Frage nach der Aktualität der Treiberdatenbank von Microsoft. Liegen zwischen der ursprünglich installierten Version und der nun installierten doch über zwei Monate. Da würde ich mir gerade für den nicht technikaffinen Endverbraucher eine Verbesserung wünschen.</p> http://devtyr.norberteder.com/post/WLAN-verliert-unter-Windows-8-standig-Verbindung.aspx Norbert Eder [MVP] 4254 2013-04-17T20:53:30 Windows Phone: Verbindung zu SkyDrive aufbauen <p>Viele Windows Phone Apps ermöglichen das Arbeiten mit Dokumenten oder Daten die sinnvollerweise mit anderen Anwendungen geteilt werden. Vielfach kommt dabei <a title="Dropbox" href="http://www.dropbbox.com" target="_blank">Dropbox</a> zum Einsatz und weit seltener <a title="SkyDrive" href="http://www.skydrive.com" target="_blank">SkyDrive</a>. Dabei ist eine Integration mittlerweile recht einfach möglich. Dieser Beitrag zeigt was dafür notwendig ist und wie es funktioniert.</p> <p>Im ersten Schritt wird das <a title="Live SDK" href="http://www.microsoft.com/en-us/download/details.aspx?id=35754" target="_blank">Live SDK</a> benötigt. Darin enthalten sind Steuerelemente und Schnittstellen für den Zugriff auf <a title="SkyDrive" href="http://www.skydrive.com" target="_blank">SkyDrive</a> via Single Sign On durch den Microsoft Account (vormals Windows Live ID). Nach der Installation sind zwei Referenzen einzubinden:</p> <p><a href="http://devtyr.norberteder.com/image.axd?picture=image_242.png"><img title="Windows Live Referenzen einbinden" style="border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; border-left: 0px; display: inline; padding-right: 0px" border="0" alt="Windows Live Referenzen einbinden" src="http://devtyr.norberteder.com/image.axd?picture=image_thumb_165.png" width="500" height="310" /></a></p> <p>Wer gerne über die <strong>Toolbox</strong> arbeitet kann sich die Steuerelemente via <strong>Choose Items</strong> einbinden:</p> <p><a href="http://devtyr.norberteder.com/image.axd?picture=image_243.png"><img title="Visual Studio Toolbox Items hinzufügen" style="border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; border-left: 0px; display: inline; padding-right: 0px" border="0" alt="Visual Studio Toolbox Items hinzufügen" src="http://devtyr.norberteder.com/image.axd?picture=image_thumb_166.png" width="500" height="362" /></a></p> <p>Hier ist dann (je nach zu Grunde liegender Version) der <strong>SignInButton</strong> zu wählen. Nach Bestätigung erscheint das Steuerelement in der Toolbox und kann dort praktisch ausgewählt und auf die View gezogen werden:</p> <p><a href="http://devtyr.norberteder.com/image.axd?picture=image_244.png"><img title="SignInButton in Visual Studio Toolbox hinzufügen" style="border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; border-left: 0px; display: inline; padding-right: 0px" border="0" alt="SignInButton in Visual Studio Toolbox hinzufügen" src="http://devtyr.norberteder.com/image.axd?picture=image_thumb_167.png" width="500" height="381" /></a></p> <h2>Berechtigungen</h2> <p>Für den Zugriff auf SkyDrive sind unterschiedliche Berechtigungen notwendig. Hierbei sind insgesamt 5 Scopes definiert, die jeweils mit einer unterschiedlichen Berechtigung ausgestattet sind:</p> <ul> <li><font face="Courier New">wl.sigin</font>: Single Sign On, d.h. ist der Benutzer bereits angemeldet, wird diese Session übernommen</li> <li><font face="Courier New">wl.basic</font>: Lesezugriff auf die grundlegenden Profilinformationen und der Liste der Kontakte</li> <li><font face="Courier New">wl.offline_access</font>: Benutzerprofil kann zu jeder Zeit gelesen und aktualisiert werden. Ist dieser Scope nicht aktiviert kann auf die Profilinformationen nur in eingeloggtem Zustand zugegriffen werden.</li> <li><font face="Courier New">wl.skydrive</font>: Lesezugriff auf Dateien</li> <li><font face="Courier New">wl.skydrive_update</font>: Lese- und Schreibzugriff auf Dateien</li> </ul> <p>Alle verfügbaren Scopes können <a title="Scopes and permissions - Live SDK" href="http://msdn.microsoft.com/en-us/library/hh243646.aspx" target="_blank">hier</a> eingesehen werden. Die gewünschten Scopes sind bei Verwendung des <font face="Courier New">SignInButton</font>-Steuerelementes über die Eigenschaft Scopes anzugeben:</p> <div id="codeSnippetWrapper" style="overflow: auto; cursor: text; font-size: 8pt; border-top: silver 1px solid; font-family: &#39;Courier New&#39;, courier, monospace; border-right: silver 1px solid; border-bottom: silver 1px solid; padding-bottom: 4px; direction: ltr; text-align: left; padding-top: 4px; padding-left: 4px; margin: 20px 0px 10px; border-left: silver 1px solid; line-height: 12pt; padding-right: 4px; max-height: 200px; width: 97.5%; background-color: #f4f4f4"> <div id="codeSnippet" style="border-top-style: none; overflow: visible; font-size: 8pt; border-left-style: none; font-family: &#39;Courier New&#39;, courier, monospace; border-bottom-style: none; color: black; padding-bottom: 0px; direction: ltr; text-align: left; padding-top: 0px; border-right-style: none; padding-left: 0px; line-height: 12pt; padding-right: 0px; width: 100%; background-color: #f4f4f4"> <pre style="border-top-style: none; overflow: visible; font-size: 8pt; border-left-style: none; font-family: &#39;Courier New&#39;, courier, monospace; border-bottom-style: none; color: black; padding-bottom: 0px; direction: ltr; text-align: left; padding-top: 0px; border-right-style: none; padding-left: 0px; margin: 0em; line-height: 12pt; padding-right: 0px; width: 100%; background-color: white"><span style="color: #0000ff">&lt;</span><span style="color: #800000">Controls:SignInButton</span> <span style="color: #ff0000">Scopes</span><span style="color: #0000ff">=&quot;wl.basic wl.signin wl.offline_access wl.skydrive_update&quot;</span><span style="color: #0000ff">/&gt;</span></pre> <!--CRLF--></div> </div> <p>Damit der Zugriff grundsätzlich funktioniert, muss im <a title="Live Connect Developer Center" href="https://manage.dev.live.com/" target="_blank">Live Connect Developer Center</a> eine Anwendung erstellt werden. Daraus resultiert eine <strong>ClientId</strong>, die in der gleichnamigen Eigenschaft zu setzen ist.</p> <blockquote> <p>Es ist zu beachten, dass für den Zugriff mittels Windows Phone in den API-Einstellungen zur Anwendung im Developer Center diese als mobile Anwendung deklariert werden muss.</p> </blockquote> <p>So sollte die Deklaration der Schaltfläche schlussendlich aussehen:</p> <div id="codeSnippetWrapper" style="overflow: auto; cursor: text; font-size: 8pt; border-top: silver 1px solid; font-family: &#39;Courier New&#39;, courier, monospace; border-right: silver 1px solid; border-bottom: silver 1px solid; padding-bottom: 4px; direction: ltr; text-align: left; padding-top: 4px; padding-left: 4px; margin: 20px 0px 10px; border-left: silver 1px solid; line-height: 12pt; padding-right: 4px; max-height: 200px; width: 97.5%; background-color: #f4f4f4"> <div id="codeSnippet" style="border-top-style: none; overflow: visible; font-size: 8pt; border-left-style: none; font-family: &#39;Courier New&#39;, courier, monospace; border-bottom-style: none; color: black; padding-bottom: 0px; direction: ltr; text-align: left; padding-top: 0px; border-right-style: none; padding-left: 0px; line-height: 12pt; padding-right: 0px; width: 100%; background-color: #f4f4f4"> <pre style="border-top-style: none; overflow: visible; font-size: 8pt; border-left-style: none; font-family: &#39;Courier New&#39;, courier, monospace; border-bottom-style: none; color: black; padding-bottom: 0px; direction: ltr; text-align: left; padding-top: 0px; border-right-style: none; padding-left: 0px; margin: 0em; line-height: 12pt; padding-right: 0px; width: 100%; background-color: white"><span style="color: #0000ff">&lt;</span><span style="color: #800000">Controls:SignInButton</span> <span style="color: #ff0000">Scopes</span><span style="color: #0000ff">=&quot;wl.basic wl.signin wl.offline_access wl.skydrive_update&quot;</span> <span style="color: #ff0000">SessionChanged</span><span style="color: #0000ff">=&quot;OnSkyDriveSessionChanged&quot;</span> <span style="color: #ff0000">ClientId</span><span style="color: #0000ff">=&quot;[ClientId]&quot;</span> <span style="color: #ff0000">Branding</span><span style="color: #0000ff">=&quot;Skydrive&quot;</span> <span style="color: #ff0000">TextType</span><span style="color: #0000ff">=&quot;SignIn&quot;</span><span style="color: #0000ff">/&gt;</span></pre> <!--CRLF--></div> </div> <p>Es gibt weitere Eigenschaften, die gesetzt werden sollten:</p> <ul> <li><font face="Courier New">Branding</font>: Das Icon und das Theme welches für die Schaltfläche gesetzt werden sollen. Im obigen Beispiel ist dies auf <font face="Courier New">Skydrive</font> gesetzt. Weitere Möglichkeiten sind <font face="Courier New">Hotmail</font>, <font face="Courier New">Messenger</font> und <font face="Courier New">Windows</font>.</li> <li><font face="Courier New">TextType</font>: Hierfür stehen unterschiedliche Varianten des anzuzeigenden Textes zur Verfügung. Eine Übersicht wird <a title="SignInButton.TextTypeProperty" href="http://msdn.microsoft.com/en-us/library/live/microsoft.live.controls.signinbutton.texttype.aspx" target="_blank">hier</a> gegeben.</li> </ul> <h2>Verbindung aufbauen</h2> <p>Um eine Verbindung aufzubauen ist lediglich auf die angezeigte Schaltfläche zu klicken. Wie bei der obigen Deklaration zu sehen ist, ist ein Ereignishandler auf das Ereignis <font face="Courier New">SessionChanged</font> zu setzen. Dieses Ereignis wird ausgelöst, wenn es dahingehend eine Änderung gibt.</p> <div id="codeSnippetWrapper" style="overflow: auto; cursor: text; font-size: 8pt; border-top: silver 1px solid; font-family: &#39;Courier New&#39;, courier, monospace; border-right: silver 1px solid; border-bottom: silver 1px solid; padding-bottom: 4px; direction: ltr; text-align: left; padding-top: 4px; padding-left: 4px; margin: 20px 0px 10px; border-left: silver 1px solid; line-height: 12pt; padding-right: 4px; max-height: 200px; width: 97.5%; background-color: #f4f4f4"> <div id="codeSnippet" style="border-top-style: none; overflow: visible; font-size: 8pt; border-left-style: none; font-family: &#39;Courier New&#39;, courier, monospace; border-bottom-style: none; color: black; padding-bottom: 0px; direction: ltr; text-align: left; padding-top: 0px; border-right-style: none; padding-left: 0px; line-height: 12pt; padding-right: 0px; width: 100%; background-color: #f4f4f4"> <pre style="border-top-style: none; overflow: visible; font-size: 8pt; border-left-style: none; font-family: &#39;Courier New&#39;, courier, monospace; border-bottom-style: none; color: black; padding-bottom: 0px; direction: ltr; text-align: left; padding-top: 0px; border-right-style: none; padding-left: 0px; margin: 0em; line-height: 12pt; padding-right: 0px; width: 100%; background-color: white"><span style="color: #0000ff">if</span> (e != <span style="color: #0000ff">null</span> &amp;&amp; e.Status == LiveConnectSessionStatus.Connected)</pre> <!--CRLF--> <pre style="border-top-style: none; overflow: visible; font-size: 8pt; border-left-style: none; font-family: &#39;Courier New&#39;, courier, monospace; border-bottom-style: none; color: black; padding-bottom: 0px; direction: ltr; text-align: left; padding-top: 0px; border-right-style: none; padding-left: 0px; margin: 0em; line-height: 12pt; padding-right: 0px; width: 100%; background-color: #f4f4f4">{</pre> <!--CRLF--> <pre style="border-top-style: none; overflow: visible; font-size: 8pt; border-left-style: none; font-family: &#39;Courier New&#39;, courier, monospace; border-bottom-style: none; color: black; padding-bottom: 0px; direction: ltr; text-align: left; padding-top: 0px; border-right-style: none; padding-left: 0px; margin: 0em; line-height: 12pt; padding-right: 0px; width: 100%; background-color: white"> ViewModel.ConnectClient(e.Session);</pre> <!--CRLF--> <pre style="border-top-style: none; overflow: visible; font-size: 8pt; border-left-style: none; font-family: &#39;Courier New&#39;, courier, monospace; border-bottom-style: none; color: black; padding-bottom: 0px; direction: ltr; text-align: left; padding-top: 0px; border-right-style: none; padding-left: 0px; margin: 0em; line-height: 12pt; padding-right: 0px; width: 100%; background-color: #f4f4f4">}</pre> <!--CRLF--> <pre style="border-top-style: none; overflow: visible; font-size: 8pt; border-left-style: none; font-family: &#39;Courier New&#39;, courier, monospace; border-bottom-style: none; color: black; padding-bottom: 0px; direction: ltr; text-align: left; padding-top: 0px; border-right-style: none; padding-left: 0px; margin: 0em; line-height: 12pt; padding-right: 0px; width: 100%; background-color: white"><span style="color: #0000ff">else</span></pre> <!--CRLF--> <pre style="border-top-style: none; overflow: visible; font-size: 8pt; border-left-style: none; font-family: &#39;Courier New&#39;, courier, monospace; border-bottom-style: none; color: black; padding-bottom: 0px; direction: ltr; text-align: left; padding-top: 0px; border-right-style: none; padding-left: 0px; margin: 0em; line-height: 12pt; padding-right: 0px; width: 100%; background-color: #f4f4f4">{</pre> <!--CRLF--> <pre style="border-top-style: none; overflow: visible; font-size: 8pt; border-left-style: none; font-family: &#39;Courier New&#39;, courier, monospace; border-bottom-style: none; color: black; padding-bottom: 0px; direction: ltr; text-align: left; padding-top: 0px; border-right-style: none; padding-left: 0px; margin: 0em; line-height: 12pt; padding-right: 0px; width: 100%; background-color: white"> ViewModel.DisconnectClient();</pre> <!--CRLF--> <pre style="border-top-style: none; overflow: visible; font-size: 8pt; border-left-style: none; font-family: &#39;Courier New&#39;, courier, monospace; border-bottom-style: none; color: black; padding-bottom: 0px; direction: ltr; text-align: left; padding-top: 0px; border-right-style: none; padding-left: 0px; margin: 0em; line-height: 12pt; padding-right: 0px; width: 100%; background-color: #f4f4f4"> <span style="color: #0000ff">if</span> (e.Error != <span style="color: #0000ff">null</span>)</pre> <!--CRLF--> <pre style="border-top-style: none; overflow: visible; font-size: 8pt; border-left-style: none; font-family: &#39;Courier New&#39;, courier, monospace; border-bottom-style: none; color: black; padding-bottom: 0px; direction: ltr; text-align: left; padding-top: 0px; border-right-style: none; padding-left: 0px; margin: 0em; line-height: 12pt; padding-right: 0px; width: 100%; background-color: white"> {</pre> <!--CRLF--> <pre style="border-top-style: none; overflow: visible; font-size: 8pt; border-left-style: none; font-family: &#39;Courier New&#39;, courier, monospace; border-bottom-style: none; color: black; padding-bottom: 0px; direction: ltr; text-align: left; padding-top: 0px; border-right-style: none; padding-left: 0px; margin: 0em; line-height: 12pt; padding-right: 0px; width: 100%; background-color: #f4f4f4"> <span style="color: #008000">// Error handling</span></pre> <!--CRLF--> <pre style="border-top-style: none; overflow: visible; font-size: 8pt; border-left-style: none; font-family: &#39;Courier New&#39;, courier, monospace; border-bottom-style: none; color: black; padding-bottom: 0px; direction: ltr; text-align: left; padding-top: 0px; border-right-style: none; padding-left: 0px; margin: 0em; line-height: 12pt; padding-right: 0px; width: 100%; background-color: white"> }</pre> <!--CRLF--> <pre style="border-top-style: none; overflow: visible; font-size: 8pt; border-left-style: none; font-family: &#39;Courier New&#39;, courier, monospace; border-bottom-style: none; color: black; padding-bottom: 0px; direction: ltr; text-align: left; padding-top: 0px; border-right-style: none; padding-left: 0px; margin: 0em; line-height: 12pt; padding-right: 0px; width: 100%; background-color: #f4f4f4">}</pre> <!--CRLF--></div> </div> <p>Hier wird auf ein <font face="Courier New">ViewModel</font> verwiesen, welches in meiner Anwendung verwendet wird. Dieses stellt eine Methode <font face="Courier New">ConnectClient</font> zur Verfügung. Darin wird unter anderem folgendes vorgenommen um den Client zu initialisieren:</p> <div id="codeSnippetWrapper" style="overflow: auto; cursor: text; font-size: 8pt; border-top: silver 1px solid; font-family: &#39;Courier New&#39;, courier, monospace; border-right: silver 1px solid; border-bottom: silver 1px solid; padding-bottom: 4px; direction: ltr; text-align: left; padding-top: 4px; padding-left: 4px; margin: 20px 0px 10px; border-left: silver 1px solid; line-height: 12pt; padding-right: 4px; max-height: 200px; width: 97.5%; background-color: #f4f4f4"> <div id="codeSnippet" style="border-top-style: none; overflow: visible; font-size: 8pt; border-left-style: none; font-family: &#39;Courier New&#39;, courier, monospace; border-bottom-style: none; color: black; padding-bottom: 0px; direction: ltr; text-align: left; padding-top: 0px; border-right-style: none; padding-left: 0px; line-height: 12pt; padding-right: 0px; width: 100%; background-color: #f4f4f4"> <pre style="border-top-style: none; overflow: visible; font-size: 8pt; border-left-style: none; font-family: &#39;Courier New&#39;, courier, monospace; border-bottom-style: none; color: black; padding-bottom: 0px; direction: ltr; text-align: left; padding-top: 0px; border-right-style: none; padding-left: 0px; margin: 0em; line-height: 12pt; padding-right: 0px; width: 100%; background-color: white"><span style="color: #0000ff">private</span> LiveConnectClient skydriveClient = <span style="color: #0000ff">null</span>;</pre> <!--CRLF--> <pre style="border-top-style: none; overflow: visible; font-size: 8pt; border-left-style: none; font-family: &#39;Courier New&#39;, courier, monospace; border-bottom-style: none; color: black; padding-bottom: 0px; direction: ltr; text-align: left; padding-top: 0px; border-right-style: none; padding-left: 0px; margin: 0em; line-height: 12pt; padding-right: 0px; width: 100%; background-color: #f4f4f4">&#160;</pre> <!--CRLF--> <pre style="border-top-style: none; overflow: visible; font-size: 8pt; border-left-style: none; font-family: &#39;Courier New&#39;, courier, monospace; border-bottom-style: none; color: black; padding-bottom: 0px; direction: ltr; text-align: left; padding-top: 0px; border-right-style: none; padding-left: 0px; margin: 0em; line-height: 12pt; padding-right: 0px; width: 100%; background-color: white"><span style="color: #0000ff">public</span> <span style="color: #0000ff">void</span> ConnectClient(LiveConnectSession session)</pre> <!--CRLF--> <pre style="border-top-style: none; overflow: visible; font-size: 8pt; border-left-style: none; font-family: &#39;Courier New&#39;, courier, monospace; border-bottom-style: none; color: black; padding-bottom: 0px; direction: ltr; text-align: left; padding-top: 0px; border-right-style: none; padding-left: 0px; margin: 0em; line-height: 12pt; padding-right: 0px; width: 100%; background-color: #f4f4f4">{</pre> <!--CRLF--> <pre style="border-top-style: none; overflow: visible; font-size: 8pt; border-left-style: none; font-family: &#39;Courier New&#39;, courier, monospace; border-bottom-style: none; color: black; padding-bottom: 0px; direction: ltr; text-align: left; padding-top: 0px; border-right-style: none; padding-left: 0px; margin: 0em; line-height: 12pt; padding-right: 0px; width: 100%; background-color: white"> <span style="color: #0000ff">this</span>.skydriveClient = <span style="color: #0000ff">new</span> LiveConnectClient(session);</pre> <!--CRLF--> <pre style="border-top-style: none; overflow: visible; font-size: 8pt; border-left-style: none; font-family: &#39;Courier New&#39;, courier, monospace; border-bottom-style: none; color: black; padding-bottom: 0px; direction: ltr; text-align: left; padding-top: 0px; border-right-style: none; padding-left: 0px; margin: 0em; line-height: 12pt; padding-right: 0px; width: 100%; background-color: #f4f4f4">}</pre> <!--CRLF--></div> </div> <p>Ab nun können weitere Operationen ausgeführt werden. Eine genaue Beschreibung hinsichtlich Ordner und Dateien findet sich im Beitrag <a title="Working with Microsoft SkyDrive folders and files" href="http://msdn.microsoft.com/en-us/library/live/hh826531.aspx#uploading_files" target="_blank">Working with Microsoft SkyDrive folders and files</a>.</p> <blockquote> <p><strong>Hinweis</strong>: Sehr hilfreich ist das <a title="Interaktives Live SDK" href="http://isdk.dev.live.com/" target="_blank">interaktive Live SDK</a>. Darüber kann die API ohne echtes Setup kennengelernt werden.</p> </blockquote> <h2>Fazit</h2> <p>Mit Hilfe des Live SDK kann sehr einfach eine Verbindung zu SkyDrive aufgenommen werden. Die Verwendung selbst ist einfach, allerdings mit einigen kleinen Gemeinheiten deren Lösung an unterschiedlichsten Stellen allerdings gefunden wird. </p> http://devtyr.norberteder.com/post/Windows-Phone-Integration-SkyDrive-leicht-gemacht.aspx Norbert Eder [MVP] 4252 2013-04-17T15:57:19 Team Foundation Services - Scrum-Template im Einsatz <p>Im Beitrag “<a title="Team Foundation Services - Unterstützung für Git unter der Lupe" href="http://devtyr.norberteder.com/post/Team-Foundation-Services-Unterstutzung-fur-Git-unter-der-Lupe.aspx">Team Foundation Services - Unterstützung für Git unter der Lupe</a>” habe ich mich bereits mit den Team Foundation Services beschäftigt - genauer gesagt mit der Unterstützung für Git. Dieser Beitrag wendet sich nun der Scrum-Prozessvorlage zu. Die Team Foundation Services bieten mehrere Prozess-Vorlagen, für mich ist zum aktuellen Zeitpunkt jedoch nur die Scrum-Vorlage wirklich interessant. Zu den weiteren Vorlagen wird es daher in diesem Beitrag keine zusätzlichen Informationen geben. Dabei ist für mich von Interesse, welche Funktionalitäten diese Vorlage tatsächlich anbietet und wie der Umgang damit hinsichtlich Verwendbarkeit ist.</p> <p>Im Menüpunkt <strong>WORK</strong> finden sich die Zugänge zum <em>Product Backlog</em>, zum aktuellen <em>Board</em> und der mir zugeordneten <em>Work Items</em>.</p> <h2>Product Backlog</h2> <p>Im Product Backlog können sämtliche User Stories verwaltet werden. Dieses ist sehr einfach gehalten und zeigt neben der Reihenfolge auch den Titel, den Status, den Aufwand, den Iterationspfad und gesetzte Tags an:</p> <p><a href="http://devtyr.norberteder.com/image.axd?picture=image_233.png"><img title="Team Foundation Services - Product Backlog" style="border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-top-width: 0px" border="0" alt="Team Foundation Services - Product Backlog" src="http://devtyr.norberteder.com/image.axd?picture=image_thumb_156.png" width="700" height="362" /></a></p> <p>Die Spalten der Liste können nach eigenem Bedarf angepasst werden. Es stehen zahlreiche Möglichkeiten zur Verfügung:</p> <p><a href="http://devtyr.norberteder.com/image.axd?picture=image_226.png"><img title="Team Foundation Services - Product Backlog Columns" style="border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-top-width: 0px" border="0" alt="Team Foundation Services - Product Backlog Columns" src="http://devtyr.norberteder.com/image.axd?picture=image_thumb_149.png" width="500" height="321" /></a></p> <p>Einträge können in dieser Liste der Drag &amp; Drop verschoben und so die Reihenfolge angepasst werden. Über das Zeilenmenü kann ein gewähltes Element geöffnet werden um Detailinformationen erfassen zu können:</p> <p><a href="http://devtyr.norberteder.com/image.axd?picture=image_224.png"><img title="Team Foundation Services - Item Detail" style="border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-top-width: 0px" border="0" alt="Team Foundation Services - Item Detail" src="http://devtyr.norberteder.com/image.axd?picture=image_thumb_147.png" width="500" height="327" /></a></p> <p>Die Möglichkeiten an dieser Stelle sind vielfältig. Erfasst werden kann:</p> <ul> <li>Iteration </li> <li>Zugewiesene Person </li> <li>Status </li> <li>Grund </li> <li>Aufwand </li> <li>Business-Wert </li> <li>Backlog Priorität </li> <li>Beschreibung </li> <li>Storyboards </li> <li>Testfälle </li> <li>Aufgaben </li> <li>Akzeptanzkritierien </li> <li>Historie </li> <li>Links </li> <li>Anhänge </li> </ul> <p>Bei der Eingabe von neuen Items wird eine Unterscheidung zwischen Backlog-Eintrag und Bug vorgenommen.</p> <p>Auf Basis der eingetragenen Aufwände (Schätzungen whatever) kann auch eine <strong>Prognose</strong> erstellt werden. Diese ist in der Standardeinstellung deaktiviert, lässt sich jedoch durch einen einzigen Klick sofort aktivieren:</p> <p><a href="http://devtyr.norberteder.com/image.axd?picture=image10.png"><img title="Team Foundation Service - Prognose/Forecast" style="border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-top-width: 0px" border="0" alt="Team Foundation Service - Prognose/Forecast" src="http://devtyr.norberteder.com/image.axd?picture=image10_thumb.png" width="700" height="353" /></a></p> <p>Im Standard wird eine Velocity (also Teamgeschwindigkeit) von 10 angenommen (in meinem Fall mit einer Person im Team des Tests). Dieser Wert kann entsprechend angepasst werden. Alle Backlog-Einträge werden daher entsprechend ihrer Reihenfolge in Sprints unterteilt. Dadurch ergibt sich natürlich auch eine schöne Sicht, wie viele Sprints für die gesamte Umsetzung des Backlogs benötigt werden.</p> <p>Für das Product Backlog steht ebenfalls eine <strong>Board</strong>-Ansicht zur Verfügung. Diese zeigt die Einträge aus dem Backlog und ihren Status an:</p> <p><a href="http://devtyr.norberteder.com/image.axd?picture=image20.png"><img title="Team Foundation Services - Product Backlog Board" style="border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-top-width: 0px" border="0" alt="Team Foundation Services - Product Backlog Board" src="http://devtyr.norberteder.com/image.axd?picture=image20_thumb.png" width="700" height="248" /></a></p> <p>Auch hier können die einzelnen Listen (Spalten) konfiguriert werden.</p> <p><a href="http://devtyr.norberteder.com/image.axd?picture=image_228.png"><img title="Team Foundation Services - Product Backlog Board Einstellungen" style="border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-top-width: 0px" border="0" alt="Team Foundation Services - Product Backlog Board Einstellungen" src="http://devtyr.norberteder.com/image.axd?picture=image_thumb_151.png" width="500" height="260" /></a></p> <blockquote> <p>Auf diese Einstellungen sollte unbedingt ein Blick geworfen werden, da wohl nicht sehr viele mit einem vordefinierten WIP-Limit arbeiten wollen.</p> </blockquote> <h2>Sprints verwalten</h2> <p>Über das Kontextmenü oder aber das Zeilenmenü können einzelne Einträge bestimmten Iterationen zugeordnet werden (eine Mehrfachauswahl scheint nicht möglich zu sein). Die Änderung wird sofort im Product Backlog ersichtlich. Gleichzeitig wird der gewünschte Sprint aktualisiert. Ein mögliches Ergebnis kann wie folgt aussehen:</p> <p><a href="http://devtyr.norberteder.com/image.axd?picture=image_234.png"><img title="Team Foundation Services - Sprint" style="border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-top-width: 0px" border="0" alt="Team Foundation Services - Sprint" src="http://devtyr.norberteder.com/image.axd?picture=image_thumb_157.png" width="700" height="152" /></a></p> <p>In der Headerleiste ist nun zu sehen, dass noch keine Sprintdaten erfasst wurden. Unter <strong>Set Date</strong> können nun das Start- und Enddatum des aktuellen Sprints gesetzt werden. Ebenfalls ist zu beachten, dass diese Liste eine weitere Ausprägung <strong>Capacity</strong> hat. Darunter können die Ressourcen für diesen Sprint geplant werden:</p> <p><a href="http://devtyr.norberteder.com/image.axd?picture=image_235.png"><img title="Team Foundation Services - Ressourcenplanung" style="border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-top-width: 0px" border="0" alt="Team Foundation Services - Ressourcenplanung" src="http://devtyr.norberteder.com/image.axd?picture=image_thumb_158.png" width="700" height="262" /></a></p> <p>In diesem Beispiel ist schön zu sehen, dass die Ressourcen für die Umsetzung nicht ausreichen. Dies wird sofort zur Ansicht gebracht und kann für die Anpassung der Planung verwendet werden.</p> <p>Eine Gesamtplanung der Releases und dazugehörigen Sprints ist auf der <strong>Overview</strong> unter dem Menüpunkt <strong>Configure schedule and iterations</strong> verfügbar. Dies sieht dann so aus:</p> <p><a href="http://devtyr.norberteder.com/image.axd?picture=image_237.png"><img title="Team Foundation Services - Configure Schedsule and Iterations" style="border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-top-width: 0px" border="0" alt="Team Foundation Services - Configure Schedsule and Iterations" src="http://devtyr.norberteder.com/image.axd?picture=image_thumb_160.png" width="500" height="465" /></a></p> <p>In der ersten Liste besteht nun die Möglichkeit, jedem Backlog-Item Tasks hinzuzufügen, dies erfolgt über das + Icon. Die auszufüllenden Felder entsprechen denen eines Backlog-Eintrages, anstatt eines Aufwandes wird der verbleibende Aufwand eingetragen (diese erfolgen in Stunden):</p> <p><a href="http://devtyr.norberteder.com/image.axd?picture=image_231.png"><img title="Team Foundation Services - Task hinzufügen" style="border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-top-width: 0px" border="0" alt="Team Foundation Services - Task hinzufügen" src="http://devtyr.norberteder.com/image.axd?picture=image_thumb_154.png" width="500" height="283" /></a></p> <p>Aus den vorhandenen Backlog-Einträgen und den dazugehörigen Tasks wird automatisch ein Board generiert:</p> <p><a href="http://devtyr.norberteder.com/image.axd?picture=image_236.png"><img title="Team Foundation Services - Sprint Board" style="border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-top-width: 0px" border="0" alt="Team Foundation Services - Sprint Board" src="http://devtyr.norberteder.com/image.axd?picture=image_thumb_159.png" width="700" height="242" /></a></p> <p>Dieses zeigt übersichtlich den aktuellen Stand an und kann natürlich dazu verwendet werden, den Status der einzelnen Punkte zu verändern.</p> <blockquote> <p>Eine für mich interessante Frage ist nun: Muss ich als Entwickler die Punkte im Board verschieben, oder funktioniert das auch direkt via Visual Studio. Der Vorteil läge natürlich darin, dass ich mein Hauptwerkzeug nicht verlassen muss. Ein weiterer Vorteil läge darin, dass dieser Schritt bei einer automatischen Durchführung nicht vergessen werden kann und das Board somit tatsächlich immer aktuelle sein würde.</p> </blockquote> <h2>Team Foundation Services via Visual Studio</h2> <p>Um nun mit den Work Items etc. der Team Foundation Services arbeiten zu können, ist das Service zu verbinden. Hierzu ist ein “Team Foundation Server” hinzu zu fügen. Die URL entspricht dem Link zum eigenen Workspace:</p> <p><a href="http://devtyr.norberteder.com/image.axd?picture=image_238.png"><img title="Visual Studio - Add Team Foundation Server" style="border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-top-width: 0px" border="0" alt="Visual Studio - Add Team Foundation Server" src="http://devtyr.norberteder.com/image.axd?picture=image_thumb_161.png" width="500" height="327" /></a></p> <p>Im Anschluss ist das gewünschte Team Project auszuwählen:</p> <p><a href="http://devtyr.norberteder.com/image.axd?picture=image_239.png"><img title="Visual Studio - Team Project auswählen" style="border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-top-width: 0px" border="0" alt="Visual Studio - Team Project auswählen" src="http://devtyr.norberteder.com/image.axd?picture=image_thumb_162.png" width="500" height="383" /></a></p> <p>Nun kann via <strong>Team</strong> - <strong>New Query</strong> eine Abfrage auf den aktuell geplanten Sprint vorgenommen werden:</p> <p><a href="http://devtyr.norberteder.com/image.axd?picture=image_240.png"><img title="Visual Studio - Work Items des aktuellen Sprints" style="border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-top-width: 0px" border="0" alt="Visual Studio - Work Items des aktuellen Sprints" src="http://devtyr.norberteder.com/image.axd?picture=image_thumb_163.png" width="700" height="236" /></a></p> <p>Alle relevanten Work Items können damit abgegriffen werden.</p> <p>Es werden automatisch Shared Queries angelegt, welche über Visual Studio abgegriffen werden können. Diese betreffen den aktuellen Sprint, d.h. eine obige Query muss nicht zwingend vorgenommen werden. Zu den Queries gelangt man via <strong>Team Explorer</strong> und <strong>Work Items</strong>.</p> <p><a href="http://devtyr.norberteder.com/image.axd?picture=image_241.png"><img title="Visual Studio Work Items" style="border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-top-width: 0px" border="0" alt="Visual Studio Work Items" src="http://devtyr.norberteder.com/image.axd?picture=image_thumb_164.png" width="500" height="346" /></a></p> <p>Mit den Work Items kann nun direkt aus Visual Studio gearbeitet werden. </p> <blockquote> <p>Änderungen werden nicht automatisch an ein Changeset gehängt, dies kann aber sehr einfach durch einen Link vom Work Item auf das jeweilige Changeset (oder mehrere) vorgenommen werden.</p> </blockquote> <p>Alle gemachten Änderungen sind sofort online ersichtlich.</p> <h2>Fazit</h2> <p>An einigen Stellen hakt es schon noch ein wenig. So würde ich mir wünschen, dass sich ein Work Item automatisch an das jeweilige Changeset (oder an die Changesets) hängt. Auch die Git-Integration im Team Explorer braucht definitiv noch Verbesserungen hinsichtlich der Usability. Insgesamt lässt es sich aber ganz gut damit arbeiten. Jetzt fehlt noch ein Test mit einer Real-World-Solution und der Preview Funktionen hinsichtlich Build und Test Cases. Bis jetzt sehe ich jedoch keinen Grund der gegen die Nutzung der Team Foundation Services mit Git-Repository spricht.</p> http://devtyr.norberteder.com/post/Team-Foundation-Services-Scrum-Template-im-Einsatz.aspx Norbert Eder [MVP] 4249 2013-04-15T09:08:00 Team Foundation Services - Unterstützung für Git unter der Lupe <p>Nachdem das Tooling beim Team Foundation Server 2012 sehr vielversprechend ist und mit reinen Git bzw. Mercurial-Mitteln zwar möglich, aber durchaus mit zusätzlichen Schritten für Entwicklern oder gar Kontextbrüchen einher geht, möchte ich mir dieses Thema genauer ansehen. Zwar gibt es durchaus Lösungen die eine gesamtheitliche Abbildung des Entwicklungsprozesses inkl. Einbindung von beispielsweise Scrum ermöglichen, allerdings sind die gefundenen Varianten kostenpflichtig, der TFS ist jedoch bereits In-Haus verfügbar, ohne Mehrkosten.</p> <p>Visual Studio kann ja durch die <a title="Visual Studio Tools for Git" href="http://visualstudiogallery.msdn.microsoft.com/abafc7d6-dcaa-40f4-8a5e-d6724bdb980c" target="_blank">Visual Studio Tools for Git</a> recht passabel mit Git-Repositories arbeiten. Auch die <a title="Team Foundation Services" href="http://tfs.visualstudio.com/" target="_blank">Team Foundation Services</a> (die “Cloud”-Variante des Team Foundation Servers) bietet die Möglichkeit der <strong>Git Team Projects</strong>. Innerhalb dieser Projekte wird mit Git-Repositories gearbeitet. Das bringt den Vorteil eines echten Distributed Version Control Systems (DVCS) mit den Templates des Team Foundation Servers zusammen. Soweit so gut. Das Ziel wäre jedoch der Einsatz der On-premise Variante. Hierzu gibt es viele Ankündigungen und Hinweise, dass ein Git-Support bald verfügbar wäre. Die Annahme, dass dies mit dem Update 2 nun endlich soweit ist, hat sich als falsch heraus gestellt. In einem Kommentar zu <a title="Visual Studio 2012 - Update 2 RTM" href="http://blogs.msdn.com/b/visualstudioalm/archive/2013/04/04/visual-studio-update-2-now-available.aspx" target="_blank">Visual Studio 2012 - Update 2 RTM</a> musste ich erfahren, dass ein Git-Support kommen wird, jedoch erst im nächsten <strong>Major</strong>-Release. Also wohl nicht so schnell. Schade eigentlich.</p> <p>Um für mich selbst ein Bild zu bekommen, ob die Services in Frage kommen (unabhängig der “Cloud”-Geschichte), warf ich einen Blick darauf. Auf meine Erkenntnisse möchte ich nachfolgend eingehen.</p> <h2>Pricing</h2> <p>Aktuell kann dieses Service kostenlos verwendet werden, Preise werden im Laufe 2013 veröffentlicht. Hierbei ist jedoch anzumerken, dass die Verwendung für MSDN Abonnenten wohl kostenlos bleiben dürfte (diesbezügliche Informationen finden sich <a title="Team Foundation Service Pricing Information" href="http://tfs.visualstudio.com/en-us/home/news/2013/jan-30/" target="_blank">hier</a>). Derzeit läuft alles auf den <strong>Free Plan</strong> hinaus, der für <strong>bis zu 5 Benutzer</strong> verfügbar ist. Eine Verwendung mit <strong>mehr als 5 Benutzern</strong> ist <strong>möglich</strong>, wird aber nach Einführung von kostenpflichtigen Plänen (ohne MSDN Abonnement) wohl verrechnet werden. Die diesbezügliche Aussage auf der Webseite:</p> <blockquote> <p>Just sign up for the Free Plan today and you can use the service for free. When we begin charging in 2013, access to the service will be offered as a benefit—at no additional charge—for paid MSDN subscribers at these levels:</p> <ul> <li>Visual Studio Ultimate with MSDN </li> <li>Visual Studio Premium with MSDN </li> <li>Visual Studio Test Professional with MSDN </li> </ul> <p>You get all the <a href="http://msdn.microsoft.com/buynow/">benefits of your MSDN subscription</a> plus you can store your work and collaborate with your project team in the cloud.</p> </blockquote> <p>Wer also ein kleines Team oder ein MSDN-Abo hat, dürfte da auch zukünftig kein Problem haben. Zusätzliche Informationen über das Pricing habe ich nicht. Mal sehen was genau da noch kommen wird.</p> <h2>Test der Services</h2> <p>Für mich stellt sich nun die Frage, wie gut der Git-Support mit den Team Foundation Services wirklich funktioniert. Dazu sind die oben erwähnten Visual Studio Tools for Git notwendig und eine Anmeldung auf <a href="http://tfs.visualstudio.com">http://tfs.visualstudio.com</a>.</p> <p>Wenn erledigt hat man nun zwei Möglichkeiten:</p> <p><a href="http://devtyr.norberteder.com/image.axd?picture=image_211.png"><img title="Team Foundation Services - Team Project" style="border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-top-width: 0px" border="0" alt="Team Foundation Services - Team Project" src="http://devtyr.norberteder.com/image.axd?picture=image_thumb_134.png" width="240" height="101" /></a></p> <p>Für mich ist die Variante mit Git-Unterstützung von Interesse. </p> <p><a href="http://devtyr.norberteder.com/image.axd?picture=image_212.png"><img title="Team Foundation Services - Create New Team Project" style="border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-top-width: 0px" border="0" alt="Team Foundation Services - Create New Team Project" src="http://devtyr.norberteder.com/image.axd?picture=image_thumb_135.png" width="500" height="423" /></a></p> <p>Interessant ist hierbei, dass beide Schaltflächen die gleiche Funktionalität bieten, lediglich die Auswahl “Version control” entsprechend gesetzt wird. Projektname ausfüllen, das gewünschte Prozesstemplate wählen und anschließend per <strong>Create Project</strong> die Anlage starten.</p> <p><a href="http://devtyr.norberteder.com/image.axd?picture=image_213.png"><img title="Team Foundation Services - Projektanlage" style="border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-top-width: 0px" border="0" alt="Team Foundation Services - Projektanlage" src="http://devtyr.norberteder.com/image.axd?picture=image_thumb_136.png" width="500" height="423" /></a></p> <p>Die Anlage dauert ein paar wenige Momente. Navigiert man im Anschluss zum Projekt wird man gleich mit den üblichen Scrum-Verdächtigen konfrontiert. Vorerst interessiert mich jedoch die Code-Verwaltung. Dazu ist auf den Menüpunkt <strong>CODE</strong> navigieren und man erhält die Clone-URL. Ein Wechsel zu Visual Studio steht also an.</p> <p>Der Team Explorer bietet nun die Möglichkeit an, ein Git-Repository zu klonen. Wir holen uns also die entsprechende URL aus den Services und starten dies mal:</p> <p><a href="http://devtyr.norberteder.com/image.axd?picture=image_214.png"><img title="Visual Studio Clone Git" style="border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-top-width: 0px" border="0" alt="Visual Studio Clone Git" src="http://devtyr.norberteder.com/image.axd?picture=image_thumb_137.png" width="500" height="94" /></a></p> <p>Im Zuge dieses Vorgangs wird ein Fenster zur Eingabe der Credentials geöffnet. </p> <p>So erledigt, kann nun ein neues Projekt erstellt und im Clone-Folder abgelegt werden. Über den Team Explorer sind die Changes sofort ersichtlich. Per Kontextmenü können (und das ist auch notwendig) Dateien aus der Source Verwaltung exkludiert werden.</p> <blockquote> <p>Hierbei ist mir aufgefallen, dass es mit den Visual Studio Tools for Git offensichtlich nicht möglich ist (oder ich habe es übersehen) eine <font face="Courier New">.gitignore</font>-Datei zu verwalten. Das könnte vielleicht ein wenig lästig sein. Deshalb habe ich mit <a title="TortoiseGit" href="https://code.google.com/p/tortoisegit/" target="_blank">TortoiseGit</a> ein wenig nachgeholfen und eine entsprechende Datei angelegt, die darin gemachten Einträge werden - wie es aussieht - durch die Visual Studio Tools for Git berücksichtigt.</p> </blockquote> <blockquote> <p><strong>Edit</strong>: Eine .gitignore-Datei kann auch über den Team Explorer und der Git-Integration hinzugefügt werden. Dabei sind bei geöffnetem Repository die <strong>Git Settings</strong> zu öffnen. Danz unten unter <strong>Repository Settings</strong> kann ein entsprechendes File hinzugefügt werden.</p> </blockquote> <p>Im nächsten Schritt folgen das erste Commit als auch ein Push, damit das Projekt im Remote-Repository verfügbar ist.</p> <p><a href="http://devtyr.norberteder.com/image.axd?picture=image_215.png"><img title="Visual Studio Git Commit" style="border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-top-width: 0px" border="0" alt="Visual Studio Git Commit" src="http://devtyr.norberteder.com/image.axd?picture=image_thumb_138.png" width="500" height="44" /></a></p> <p><a href="http://devtyr.norberteder.com/image.axd?picture=image_216.png"><img title="Visual Studio Git Push" style="border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-top-width: 0px" border="0" alt="Visual Studio Git Push" src="http://devtyr.norberteder.com/image.axd?picture=image_thumb_139.png" width="500" height="60" /></a></p> <p>Ein Blick auf den Online-Zugang zeigt, es hat funktioniert:</p> <p><a href="http://devtyr.norberteder.com/image.axd?picture=image_217.png"><img title="Team Foundation Services Online Repository" style="border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-top-width: 0px" border="0" alt="Team Foundation Services Online Repository" src="http://devtyr.norberteder.com/image.axd?picture=image_thumb_140.png" width="500" height="421" /></a></p> <p>Soweit der erste Test via Visual Studio. Zur Sicherheit möchte ich jedoch eine Änderung außerhalb machen und mit dem Git-Client meiner Wahl pushen.</p> <p><a href="http://devtyr.norberteder.com/image.axd?picture=image_219.png"><img title="image" style="border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-top-width: 0px" border="0" alt="image" src="http://devtyr.norberteder.com/image.axd?picture=image_thumb_142.png" width="500" height="262" /></a></p> <p>Beim Push-Vorgang kommt nun ein Fehler - nach Eingabe der Credentials - der eigentlich auch nicht weiter verwundert, jedoch vielleicht ein wenig missverständlich ist:</p> <p><a href="http://devtyr.norberteder.com/image.axd?picture=image_220.png"><img title="Git-Fehler (Team Foundation Services)" style="border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-top-width: 0px" border="0" alt="Git-Fehler (Team Foundation Services)" src="http://devtyr.norberteder.com/image.axd?picture=image_thumb_143.png" width="500" height="338" /></a></p> <p>Um dies zu beheben, muss man auf der Webseite zu den Team Foundation Services ins Benutzerprofil wechseln und unter Credentials alternative Daten angeben (bis dato wird ja lediglich mit einer Live ID gearbeitet):</p> <p><a href="http://devtyr.norberteder.com/image.axd?picture=image_221.png"><img title="Team Foundation Services - Alternate Credentials" style="border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-top-width: 0px" border="0" alt="Team Foundation Services - Alternate Credentials" src="http://devtyr.norberteder.com/image.axd?picture=image_thumb_144.png" width="500" height="423" /></a></p> <p>Ein erneuter Push-Versuch resultiert in einem Erfolg:</p> <p><a href="http://devtyr.norberteder.com/image.axd?picture=image_222.png"><img title="Team Foundation Services - Commits" style="border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-top-width: 0px" border="0" alt="Team Foundation Services - Commits" src="http://devtyr.norberteder.com/image.axd?picture=image_thumb_145.png" width="500" height="200" /></a></p> <p>Auch die weiteren Funktionen arbeiten ohne Probleme. </p> <h2>Fazit</h2> <p>Der erste Eindruck ist gut. Alles arbeitet gut zusammen, es gibt keine Hürden die unerwarteter Weise auftreten, es gibt auch nichts wo man großartig nachlesen müsste. Interessant wird es dann wenn es weiter geht in Richtung der Scrum-Templates und der Builds bzw. Testpläne etc. Aber dafür wird es eigenständige Blog-Beiträge geben, die näher darauf eingehen werden. Es ist sicherlich noch einiges zu tun, aber es lässt sich gut arbeiten, sowohl von Visual Studio heraus, als auch mit anderen Tools. Damit rückt der TFS definitiv wieder in die engere Wahl.</p> http://devtyr.norberteder.com/post/Team-Foundation-Services-Unterstutzung-fur-Git-unter-der-Lupe.aspx Norbert Eder [MVP] 4245 2013-04-12T12:54:07 Mercurial-Repository nach Git konvertieren <p>Git wird immer populärer und gefühlsmäßig gerät Mercurial ins Hintertreffen. Die Gründe dafür dürften wohl in der besseren Performance von Git und der breiten Akzeptanz von GitHub sein. Zusätzlich ist es auch teilweise mühsam, mehrere Clients installiert haben zu müssen (bei einigen ist eine Unterstützung des jeweils anderen DVCS in Vorbereitung, sonst wäre mir <a title="SmartGit/Hg" href="http://www.syntevo.com/smartgithg/index.html" target="_blank">SmartGit/Hg</a> bekannt). Wer nun von Mercurial auf Git wechseln möchte bekommt in diesem Beitrag eine Schritt für Schritt Anleitung.</p> <h2>Prerequisits (Mercurial -&gt; Git)</h2> <p>Folgende Werkzeuge und Erweiterungen kamen zum Einsatz:</p> <p>Als Mercurial-Client wird <a title="TortoiseHg" href="http://tortoisehg.bitbucket.org/de/" target="_blank">TortoiseHg</a> verwendet. Dieser Client lässt sich einfach erweitern, was auch für dieses Vorhaben notwendig ist. Als Erweiterung dazu wird <a title="hg-git" href="https://bitbucket.org/durin42/hg-git" target="_blank">hg-git</a> benötigt. Die Installation und Einrichtung sieht wie folgt aus:</p> <ol> <li>Als ZIP herunter laden und in ein beliebiges Verzeichnis entpacken</li> <li>Via TortoiseHg die Einstellungen für das zu konvertierende Repository öffnen</li> <li>hg-git als Erweiterung eintragen</li> </ol> <p>Der Eintrag wird direkt in der Datei <font face="Courier New">hgrc</font> vorgenommen und soll wie folgt aussehen:</p> <p><font face="Courier New">[extensions] <br />hggit=C:\Temp\hg-git\hggit</font></p> <p>Hier ist natürlich der tatsächliche Pfad einzusetzen. Damit die Erweiterung verwendet wird, müssen alle offenen TortoiseHg-Anwendungen geschlossen werden.</p> <p>hg-git hat neben der Abhängigkeit zu Mercurial (diese ist durch die Installation von TortoiseHg als erfüllt anzusehen) eine weitere zu <a title="dulwich" href="https://github.com/jelmer/dulwich/tree/master/dulwich" target="_blank">dulwich</a>. Hier ist das entweder das ZIP herunter zu laden, oder das Repository zu klonen. Im Root-Verzeichnis befindet sich ein Verzeichnis <font face="Courier New">dulwich</font>. Dieses Verzeichnis muss nun den Libraries von TortoiseHg hinzugefügt werden. Diese befinden sich üblicherweise in:</p> <blockquote> <p>%ProgramFiles%\TortoiseHg\library.zip</p> </blockquote> <p>So muss das dann innerhalb der ZIP-Datei aussehen:</p> <p><a href="http://devtyr.norberteder.com/image.axd?picture=image_210.png"><img title="TortoiseHg Libraries" style="border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; border-left: 0px; display: inline; padding-right: 0px" border="0" alt="TortoiseHg Libraries" src="http://devtyr.norberteder.com/image.axd?picture=image_thumb_133.png" width="500" height="200" /></a></p> <p>Damit sind alle Vorarbeiten abgeschlossen und es kann mit der Konvertierung gestartet werden.</p> <p>Und natürlich muss Git installiert sein. Hierbei ist unerheblich welche Implementierung. Wer beispielsweise <a title="GitHub for Windows" href="http://windows.github.com/" target="_blank">GitHub for Windows</a> installiert hat, ist bereits bestens gerüstet, sonst kann auch <a title="http://git-scm.com/" href="http://git-scm.com/">http://git-scm.com/</a> verwendet werden.</p> <h2>Aus Mercurial mach Git</h2> <p>In den nächsten Schritten werden wir ein bestehendes Mercurial-Repository in ein Git-Repository konvertieren. Hierzu sind folgende Schritte notwendig:</p> <ol> <li>Git-Bash öffnen (dieser Schritt ist notwendig, damit die hg-git-Erweiterung angezogen wird)</li> <li>Ein leeres Git-Repository anlegen (hier wird durch die Erweiterung ein Pack-File eingespielt). Dazu ein Verzeichnis an beliebiger Stelle anlegen und folgenden Befehl innerhalb dieses Verzeichnisses ausführen: <br /><font face="Courier New">git init --bare</font></li> <li>Nun ist ins Mercurial-Repository zu wechseln und dieses in das Git-Repository zu pushen (zu beachten ist, dass dieser Vorgang durchaus recht lange dauern kann, es werden keine Konsolen-Ausgaben geschrieben, daher nicht abbrechen, sondern warten; Es erfolgt jedoch schlussendlich eine Meldung wie viele Commits etc. übernommen wurden): <br /><font face="Courier New">hg push path/to/Git-Repository</font></li> <li>Im Git-Repository liegt nun unter <font face="Courier New">objects/pack</font> ein Git-Pack-File, welches alle notwendigen Informationen enthält.</li> </ol> <p>Damit ist die Migration eigentlich abgeschlossen, sofern man mit dem Pack-File zufrieden ist. Ist dies nicht der Fall, kann man mit den folgenden beiden Schritten alle Objekte in separaten Dateien ablegen:</p> <ol> <li>Ein weiteres Verzeichnis anlegen und in dieses wechseln</li> <li><font face="Courier New">git clone -l path/to/Git-Pack-Repository</font> ausführen. Dabei ist nicht das Pack-File zu referenzieren, sondern das Repository-Stammverzeichnis</li> </ol> <p>Damit ist nun ein Git-Repository mit allen Objekten als separate Dateien vorhanden und kann für weitere Schritte verwendet werden.</p> <h2>Fazit</h2> <p>Die Migration kostet zwar ein wenig Zeit (vor allem, wenn man sich die einzelnen Schritte und Lösungen für einige Fallen zusammensuchen muss), geht aber sonst weitestgehend problemlos von Statten. Nach dem Umstieg steht die gesamte Historie zur Verfügung und es kann wie mit Git gewohnt gearbeitet werden.</p> http://devtyr.norberteder.com/post/Mercurial-Repository-nach-Git-konvertieren.aspx Norbert Eder [MVP] 4243 2013-04-11T16:00:36 Das Geheimnis der Kommunikation <p>Vor einigen Tagen habe ich zum Thema <a href="http://devtyr.norberteder.com/post/Arbeiten-wir-an-der-Kommunikation!.aspx">Arbeiten wir an der Kommunikation</a> geschrieben. In diesem Beitrag hatte ich einige Punkte aufgelistet, die ein Team zu einer besseren Kommunikation führen, wohlgemerkt, auf mein Team abgestimmt. Gestern hatten wir einen Workshop-Tag mit <a href="http://ilker.de" target="_blank">Ilker Centikaya</a> zum Thema Scrum (hierauf folgt ein separater Post). In diesem wirklich sehr inspirierenden Workshop hatten wir auch ein wenig Systemtheorie zum Thema. In seiner Rohform nichts für schwache Nerven. In der durch Ilker aufbereiteten Form dauerte es nicht lange und mir fiel es wie Schuppen von den Augen.</p> <p>Ich hatte den Grund erkannt, warum die Kommunikation innerhalb meines Teams und auch mit angrenzenden Bereichen nun wesentlich besser funktioniert als noch vor einigen Monaten. Intuitiv hatte ich eine Entscheidung zu einem Vorgehen getroffen und diese umgesetzt. Nie wäre ich jedoch auf den Gedanken gekommen, dass dieser Punkt wesentlich stärker wiegt als alle im letzten Beitrag zum Thema Kommunikation aufgelisteten Punkte. Das Stichwort ist</p> <blockquote> <p>Transparenz</p> </blockquote> <p>Jawohl! Transparenz!</p> <h2>Das hat mit Kommunikation nun was genau zu tun?</h2> <p>Mit einer mangelnden Kommunikation geht meist auch noch ein weiterer Punkt einher: Mangelnde Motivation, oder besser formuliert, stark einwirkende Demotivation. In zahlreichen Quellen wird betont:</p> <blockquote> <p>Wahre Motivation kommt von innen. </p> </blockquote> <p>Das heißt im Umkehrschluss, dass von Extern demotivierende Kräfte wirken. Da gibt es viele Faktoren, einer ist fehlende Information. Dies bedeutet natürlich, dass der eigene Entscheidungsfreiraum eingeschränkt wird, das Ziele, Visionen nicht erkannt werden und somit auch kaum Weiterentwicklungspotential gesehen wird. Das resultiert wiederum darin, dass der Einzelne nicht weiß wohin der Weg führt und wo auf diesem Weg er selbst Platz findet. Das löst Existenzängste aus. Eine logische Folgerung: Es findet eine Einigelung statt, eine Abgrenzung. Typisch dafür ist, dass selbst wiederum keine Informationen weitergegeben werden, um sich selbst unentbehrlich zu machen.</p> <p>Um dieses Problem zu beheben, kommt nun die Systemtheorie ins Spiel (bitte beachten, dass meine Kenntnisse der Systemtheorie als sehr gering einzustufen sind, bei Fehlbeschreibungen bitte mich zu verbessern). Speziell die <a href="http://de.wikipedia.org/wiki/Selbstreferenzialit%C3%A4t" target="_blank">Selbstreferenzialität</a>. Salopp gesagt bedeutet dies, dass sich ein System (eine Person, ein Team, ein Unternehmen etc.) nur auf sich selbst bezieht, sich selbst reguliert. Einflüsse aus der Umwelt können angenommen werden, müssen aber nicht. </p> <p>Möchte ich als Person einen Vorteil zu vermitteln, muss ich ihn also zuerst bei mir selbst anwenden, zeigen dass es funktioniert und kann somit angrenzenden Systemen ein Angebot unterbreiten, dies ebenfalls einzusetzen. Diese Systeme entscheiden selbst ob sie das tun werden oder nicht. Wird der Vorteil erkannt und für gut befunden stehen die Chancen dazu natürlich gut.</p> <p>Mein Vorgehen war nun, für Transparenz in meinem Tun zu sorgen. Meine Team-Mitglieder wurden verstärkt zu Entscheidungen herangezogen, bekamen Informationen zu dem “Wie geht es weiter?” usw. Durch die gelebte Transparenz haben meine Team-Mitglieder offensichtlich den daraus resultierenden Vorteil erkannt und selbst umgesetzt. Die Informationen wurden mehr, jeder konnte seinen Platz finden, die Sicherheit ist gestiegen, ebenfalls die Motivation. Die “neue” Motivation hat dazu beigetragen, dass mit vielen Informationen freizügiger umgegangen wird. Es stieg der Kommunikationsanteil. Und plötzlich läuft das Werk …</p> <h2>Fazit</h2> <p>Transparenz ist ein Faktor der nicht unterschätzt werden darf. Mitarbeiter möchten wissen wie es um ein Unternehmen, die Projekte, ihre Zukunft steht. Nur mit diesem Wissen können sie sich wirklich einbringen und für Mehrwert sorgen. Ich selbst habe durch Ilker einen kleinen Einblick in für mich neue Themen erhalten die mir sofort geholfen haben, einige meiner Entscheidungen reflektieren und weitere Maßnahmen setzen zu können. Was folgt ist sicherlich ein weiteres Studium dieser Gebiete um mein Wissen zu festigen. Ebenfalls verstehe ich nun, dass dies der wahre Grund war, warum die Kommunikation innerhalb meines Teams nun ordentlich funktioniert. Die anderen Maßnahmen waren gut und sicherlich hilfreich, jedoch nicht ausschlaggebend.</p> http://devtyr.norberteder.com/post/Das-Geheimnis-der-Kommunikation.aspx Norbert Eder [MVP] 4242 2013-04-09T21:25:15 Follow Up - Hochwertiger Content für Entwickler - Machen wir doch was! <p>Vor einigen Tagen hatte ich im Beitrag <a title="Hochwertiger Content für Entwickler - Machen wir doch was!" href="http://devtyr.norberteder.com/post/Hochwertiger-Content-fur-Entwickler-Machen-wir-doch-was!.aspx">Hochwertiger Content für Entwickler - Machen wir doch was!</a> aufgerufen, eine einfache Möglichkeit zu schaffen, an hochwertigen Content aus der Community zu kommen. Das Echo war recht groß und schnell ergab ich ein äußerst fruchtbares Gespräch mit <a title="Ralf Westphal" href="http://blog.ralfw.de/" target="_blank">Ralf Westphal</a>. Aber auch viele andere aus der Community teilten ihre Meinung mit mir. Teils mit Zustimmung, teils mit konstruktiven Hinweisen auf bestehende “Lösungen”.</p> <h2>Warum überhaupt?</h2> <p>Im letzten Beitrag ging das <strong>Warum</strong> nicht eindeutig hervor. Daher möchte ich dazu ein paar Worte teilen, die erklären warum ich der Meinung bin, etwas Neues müsste her.</p> <p>Mir ist durchaus bewusst, dass es zahlreiche Blogs gibt, die wirklich gute Beiträge liefern, mitunter finden sich auch an anderen Stellen feine Artikel, oder auch Grundlagendiskussionen, die ein jeder gelesen haben sollte. Das ist positiv und gut so. Für aktive und langjährige Mitglieder der Community ist das Finden dieser Ressourcen kein Thema, hat doch ein jeder die entsprechenden Quellen aktiv am Radar, oder ist sogar selbst dafür verantwortlich. Dennoch brauchen auch hier die einen oder anderen Perlen einige Zeit, gefunden zu werden.</p> <p>Der Einsteiger hat es da schon schwieriger. Thema auswählen, Google oder Bing auf Treffer durchforsten und die gefundene Lösung wird schon in Ordnung gehen. Eine tiefergehende Prüfung hinsichtlich Auswirkungen etc. kann erfahrungsbedingt oftmals nicht durchgeführt werden. Er muss sich also auf das Gefundene verlassen, oder bei schlechtem Bauchgefühl dem nächsten Link vertrauen. Dabei zählt nicht immer Qualität. Wer <strong>mehr</strong> Content produziert (und die passenden Keywords) steht weiter oben, nicht zwangsweise der empfehlenswerte. So einfach, so schlecht.</p> <p>Gab es vor 10 Jahren noch ein paar zentrale Player, die Content anzubieten hatten, findet sich dieser nun an allen Ecken und Enden. Guter, wie auch Schlechter. Das Problem dabei: Der gute Content ist durch vermehrte Werbebeiträge etc. teilweise ganz gut versteckt. Blogs haben in der Regel auch vielfach nicht die Suchmaschinenrelevanz von größeren/großen Verlagen, teilweise jedoch weit bessere Inhalte.</p> <p>Für mich ist das der Punkt an dem eine Lösung her muss. Sowohl für mich als auch für andere, besonders Einsteiger, die es wirklich sehr schwer haben. Das mag der eine oder andere noch nicht nachvollziehen können, aber dazu komme ich gleich.</p> <h2>Bestehende Lösungen</h2> <p>In den <a title="Kommentare zu &quot;Hochwertiger Content für Entwickler - Machen wir doch was!&quot;" href="http://devtyr.norberteder.com/post.aspx?id=a560bc0c-5584-4a71-8da2-113ab8ea6cf6#disqus_thread">Kommentaren</a> des ersten Beitrags wurden einige deutschsprachige Alternativen genannt, die gerade der eingeschworenen Community wohlbekannt sind. Viele werden diese Dienste auch zu schätzen wissen. Es liegt mir fern diese als schlecht hinzustellen, dennoch möchte ich sie hinterfragen und Problemstellen aufzeigen.</p> <p><a title="DotNetGerman Bloggers" href="http://blogs.dotnetgerman.com/" target="_blank">DotNetGerman Bloggers</a>(und Aggregate im Allgemeinen) <br />Das ist wohl das Community-Feed-Aggregat der ersten Wahl für ausreichend Inhalte. Wenn ich korrekt gezählt habe, dann sind zum jetzigen Zeitpunkt 109 mehr oder weniger aktive Blogger gelistet. Das ist schon eine ganz schöne Menge, an Bloggern und gelieferten Content. Wunderbar. Dennoch bietet dieses Aggregat (wie alle anderen) einige Nachteile:</p> <ul> <li><strong>Zuviel Rauschen</strong>. Zu nahezu jedem Thema finden sich zahlreichende Blogger. Da viele nicht abgeneigt sind, News zu ihrem Fachgebiet zu verfassen, erscheint dieselbe News zigfach in der Liste auf. Ebenso verhält es sich mit Themen, die eigentlich nicht für das Aggregat von Relevanz sind. So finden sich Beiträge anderweitigen - teils branchenfremden - Themen, teilweise auch private. Das interessiert mich nicht, wenn ich mich zu aktuellen .NET Themen informieren möchte.</li> <li><strong>Fehlende Wartung</strong>. Aggregate haben es an sich, dass keine oder kaum Wartung statt findet. Aufgenommen wird, was aktuell ins Schema passt. Die Ausrichtung eines Bloggers (dahinter steckt in unserem Fall ja meist ein Entwickler) ändert sich jedoch im Laufe der Zeit. Dies hat meist berufliche Hintergründe. So findet oft sehr schnell eine Verlagerung in gänzlich unterschiedliche Themengebiete statt. Oftmals wird überhaupt die Plattform gewechselt. Beiträge gehen dann am eigentlichen Thema vorbei. Das führt wiederum zum ersten angeführten Problem: Zuviel Rauschen.</li> <li><strong>Keine Kategorisierung</strong>. Ich als Leser des Aggregats habe keine Möglichkeit nach Themen zu filtern, die mich aktuell interessieren. Hier kann ich nur&#160; mühsam die einzelnen interessanten Feeds nehmen und meine eigene Liste pflegen. Damit entferne mich jedoch vom Dienst und nutze ihn nur als Input-Geber. Zukünftige empfehlenswerte Beiträge bleiben mir verborgen, da diese natürlich nicht in meinen abonnierten Feeds enthalten sind (so ich nicht zufällig auf diese Quelle stoße).</li> <li><strong>Kurze Vorhaltezeit</strong>. Das genannte Aggregat (wie auch die meisten Alternativen) hält Beiträge nur für kurze Zeit im “Angebot”. Ältere Beiträge können weder durch eine Suchfunktion noch anderweitig gefunden/angezeigt werden. Somit hat dieses Medium lediglich tagesaktuelle Relevanz für mich. Heute interessiere ich mich für dieses Thema, morgen für ein anderes. Wofür ich mich morgen interessiere, kann ich heute jedoch nicht beurteilen. Ergo fällt es auch schwer die richtigen Beiträge für eine spätere “Behandlung” zu markieren.</li> <li><strong>Kein Qualitätshinweis</strong>. Ich muss einen interessant klingenden Beitrag lesen um ihn beurteilen zu können. Es gibt kein Bewertungssystem an dem ich mich festhalten kann, welches quasi als Leitschienen fungiert. Das kostet Zeit und birgt die Gefahr in sich, den am Schluss des Beitrags formulierten Mehrwert nicht als solches zu erkennen (weil ich beim ersten “Scannen” gar nicht so weit komme).</li> </ul> <p><a title="dotnet-kicks.de" href="http://dotnet-kicks.de/" target="_blank">dotnet-kicks.de</a> <br />Auch dieses Projekt ist der Community gut bekannt. Mittlerweile werden keine weiteren Beiträge mehr eingestellt. Ob das Projekt eingestellt wurde, oder einfach kein Interesse mehr besteht, kann ich nicht sagen. Fakt ist, dass es ein Klon von vor Jahren boomender Bewertungssysteme ist (welches genau können die <a title="Über .NET Kicks" href="http://dotnet-kicks.de/docs/about" target="_blank">Betreiber</a> sicherlich beantworten). Ein einfaches System Internetinhalte zu “bewerten” und zu kategorisieren. Die immer geringeren Benutzerzahlen zeigen jedoch, dass derartige Dienste überholt sind.</p> <ul> <li><strong>Kein Qualitätshinweis</strong>. Aber hey, ich habe es “gekickt”. Das zeugt doch von Qualität. Nein, das tut es nicht. Ich als “Leser” kann nicht erkennen warum diese Quelle empfohlen wurde. Ist es ein Freundschaftsdienst, oder ist der Inhalt wirklich so gut. Viele “Kicks” bekommt oft auch, wer über ein trendy Thema berichtet hat. Kommentare und Kategorisierung sind zwar möglich, werden jedoch nicht oder kaum genutzt, da dies kein Teil des Rating-Systems ist. Für mich als Leser wenig hilfreich.</li> <li><strong>Fehlende Accountability</strong>. Beiträge können unter Pseudo-Benutzern oder gar anonym eingereicht werden. Dadurch entsteht ein gewaltiges Rauschen. Wer mit seinem Namen einsteht und (daher) auf seine Reputation bedacht ist, wird besonders darauf achten, guten und sinnvollen Content einzustellen. </li> <li><strong>Fehlende “Mitmach-Motivation”</strong>. Gamification ist das Stichwort. Oftmals fehlt es an einem Anreiz Inhalte einzustellen. Self-Marketing steht hier ganz weit vorne. Weitere Kriterien sind aber die persönliche Profilierung, die nicht nur durch eigene Inhalte zustande kommt, sondern auch als Quell empfehlenswerter Inhalte. </li> <li><strong>Mangelnde Usability</strong>. In den meisten Fällen muss Titel und Beschreibung der einzustellenden Beiträge manuell eingetragen werden. Dies kann auf Basis der URL automatisch geschehen. Der Fokus wird hierbei auf die falsche Stelle gelegt. Wichtiger wäre eine sinnvolle Bewertung, weniger die Erfassung ohnehin verfügbarer Informationen.</li> </ul> <p>Beide Lösungen haben auch gemeinsam, dass es wenig Personalisierungsmöglichkeiten gibt. Integrationen zu “Read later”-Diensten oder gar als eigene Implementierung sind nicht vorhanden. Es fehlt mir persönlich eine schnelle Möglichkeit empfehlenswerte Beiträge in einer Liste zu hinterlegen, die ich mir dann in aller Ruhe ansehen kann. Ich bin gezwungen Schritte unabhängig des Dienstes vorzunehmen um dieses Ziel zu erreichen. Ein “Kontextbruch” der es mir erschwert, mein Ziel zu erreichen.</p> <h2>Lösungsvorschlag</h2> <p>Die vorgeschlagenen Alternativen bieten also viele Nachteile, die behoben werden können. Zwar bedeutet dies nicht per se, dass die Dienste damit obsolet sind oder nicht genutzt werden sollten. Es geht aber besser - mit weit höherem Mehrwert. Genau die Schaffung dieses Mehrwertes ist das Ziel.</p> <p>Wie also kann eine mögliche Lösung aussehen? Nachfolgend möchte ich die aufgekommenen Erkenntnisse zusammen fassen und zur Diskussion in den Raum stellen. Es ist jeder herzlich willkommen seine Meinung kund zu tun. Gerne auch konstruktive Kritik, da diese bekanntlich den größten Mehrwert bietet. </p> <ul> <li><strong>Content-Sharing</strong>. Entgegen meines ersten Vorschlages soll kein neuer Content generiert, sondern auf vorhandenen verlinkt werden. Es gibt ausreichend qualitativ hochwertige Beiträge.</li> <li><strong>Accountability</strong>. Beiträge können nur von Benutzern eingestellt werden, die mit vollem Namen registriert sind und mit solchem für ihre Quellen einstehen. Anonyme Beiträge sind nicht erlaubt, auch Phantasienamen werden nicht akzeptiert.</li> <li><strong>Rating</strong>. Eine Bewertung ist immer mit einem Grund zu versehen. Warum wird dieser Inhalt als empfehlenswert eingestuft? Was ist der tatsächliche Mehrwert? Wie hat mir der Beitrag weiter geholfen? Ein einfaches “Kick it” ist nicht ausreichend einen Beitrag zu empfehlen. Jeder angemeldete Benutzer kann ein Rating abgeben. Dieses ist wiederum mit einem ausreichenden Kommentar zu versehen.</li> <li><strong>Tagging</strong>. Es gibt kein Einstellen ohne Tagging. Beiträge sind mit passenden Tags zu versehen. Darauf aufbauend kann ein entsprechendes Einfächern in Kategorien stattfinden. Auch eine Suche kann darauf (unter anderem) abgestimmt werden.</li> <li><strong>Redaktionelle Betreuung</strong>. Eingestellte Beiträge werden von “Fachbereichs-Verantwortlichen” freigegeben. Dies bedeutet natürlich einen entsprechenden Aufwand, stellt jedoch sicher, dass passende Begründungen und Tags gesetzt wurden. Ebenfalls kann darüber die Relevanz und der Anspruch an die Qualität der Artikel gewährleistet werden. Hier stelle ich mir ein Team von Themen-Verantwortlichen vor, die sich eben diesem annehmen.</li> <li><strong>Gamification</strong>. Ein öffentliches Ranking-System für Beitragende soll spielerisch sicherstellen, dass die Motivation zum Einstellen neuer Beiträge gegeben ist. Dieses soll nicht auf Masse, sondern auf Qualität basieren. Bewertungen von einem höheren Ranking zählen hierbei mehr als dies bei einem unteren Rang der Fall ist.</li> </ul> <p>Zu diesen Anforderungen bestehen natürlich weitere. Diese sind aber hauptsächlich in der Usability durch den Besucher zu finden, aber auch der Einsteller soll davon profitieren. So sollten beim Einstellen von Beiträgen die relevanten Informationen automatisch bezogen werden (wie man das auch von Facebook, Google+ und Konsorten bereits gewöhnt ist). Stattdessen sollte der Fokus auf die Bewertung des Inhaltes gelenkt werden.</p> <p>Dem Besucher muss es ermöglicht werden, schnell an für ihn relevante Informationen zu gelangen. Registrierte Benutzer sollten zudem in den Vorteil von “Read Later”-Listen, persönlichen Filtern und Benachrichtigungen kommen. </p> <p>Hinter den einzelnen Punkten liegen (teilweise) bereits konkrete Ideen zur Umsetzung. Bevor ich diese jedoch groß kund mache, möchte ich diese Zusammenfassung nochmals zur Abstimmung in die Runde werfen. Mir ist eure Meinung sehr wichtig und möchte einen tatsächlichen Mehrwert mit einer neuen Plattform liefern, die natürlich - wie jede andere Plattform - auch mit Anfangsproblemen zu kämpfen haben würde. Nur wenn ein Erfolg absehbar ist, wäre eine Umsetzung sinnvoll. Ich würde mich daher über viele Meinungen freuen. Ist der eingeschlagene Weg richtig, fehlt noch etwas, oder befinden wir uns hier generell auf einem Holzweg?</p> http://devtyr.norberteder.com/post/Follow-Up-Hochwertiger-Content-fur-Entwickler-Machen-wir-doch-was!.aspx Norbert Eder [MVP] 4235 2013-04-02T10:54:14 Arbeiten wir an der Kommunikation! Vor einigen Monaten habe ich darüber geschrieben, was denn ein <a title="Was ein Team-Leader für sein Entwicklungsteam tun kann" href="http://devtyr.norberteder.com/post/Was-ein-Team-Leader-fur-sein-Entwicklungsteam-tun-kann.aspx">Team-Leader für sein Team tun kann</a> bzw. überhaupt sollte. Nun ist doch ein wenig Zeit vergangen und ich habe unterschiedlichste Experimente vorgenommen - hauptsächlich um die Kommunikation und das Teamgefüge zu verbessern. Meine Erfahrung dabei: die kleinsten Umstellungen wirken am besten! In diesem Beitrag möchte ich aus den Erfahrungen der vergangenen Monate berichten. <h2>Ausgangslage</h2> <p>Mein Team hat harte Zeiten hinter sich. Auch wurde es immer wieder durcheinander gewürfelt. Neue Kollegen, Splittung in mehrere Teams, erneute Zusammenführungen und vieles mehr ist in den letzten Jahren passiert. Gepaart mit zu viel Arbeit und zu wenig Ressourcen ist das für die Teamkultur nicht gerade förderlich. Im Gegenteil. Langsam aber sicher entwickelt sich jeder zum Einzelkämpfer und verhält sich dementsprechend abgeschottet. Eine Entwicklung die bei uns quasi über Jahre ging. </p> <h2>Kleine Änderungen führen zum Ziel</h2> <p>Oder zumindest in die richtige Richtung. Nachfolgend möchte ich einige der vorgenommenen Veränderungen aufführen. Ich gebe jedoch zu bedenken, dass jedes Team anders ist. Einige der besprochenen Probleme werden in anderen Teams nicht auftreten, dafür möglicherweise andere Schwachstellen.</p> <h3>Umbau Büro</h3> <p>Ganz wichtig ist das Klima im Büro. Wir hatten über Jahre hinweg ein sehr steriles Büro. Kaum Pflanzen, wenig Drumherum. Durch einen neuen Büro-Plan haben wir ein wesentlich größeres Büro für unser Team bekommen und haben dieses gemeinsam geplant. Die Tische wurden so aufgestellt, dass eine direkte Kommunikation vereinfacht wird, Beamer für Präsentationen, Code Reviews (oder aber auch manchmal Skifahren), Konferenzen. Ein eigener Besprechungstisch, zur Unterhaltung ohne PC. Auch ist es mittlerweile sehr grün. So mancher mag nun lächeln (was auch gesund ist), aber selbst Duftkerzen haben ihren Weg ins Büro gefunden. Auch sonstiger Dekor darf nicht fehlen, obwohl wir ein reines Männerbüro sind.</p> <p>Dies wirkt sich nur in kleinen Teilen auf die tatsächliche Kommunikation aus, jedoch ungemein auf das gesamte “Raumklima”.</p> <h3>Kopfhörer</h3> <p>Musik ist heute immer und überall. Gerade am Arbeitsplatz ist man schnell dazu geneigt, einen Kopfhörer aufzusetzen. Für komplexe Problemstellungen ist es ein einfaches Mittel zur Abschottung und Fokussierung. Nachteilig daran ist jedoch, dass dies schnell zur Gewohnheit wird und das Team die Arbeitszeit mit aufgesetzten Kopfhörern verbringt. Wie also bereits angesprochen: Alles Einzelkämpfer. Keine gute Ausgangslage für eine funktionierende Kommunikation.</p> <p>Als Lösung haben wir uns darauf geeinigt, einen Medienserver inkl. Boxen aufzustellen. Musik aus unterschiedlichen Genres wird darüber gespielt (damit für jeden etwas dabei ist, wobei sich glücklicherweise unser Musikgeschmack deckt). Kopfhörer sind - laut Team-Bescheid - nur mehr für Spezialfälle vorgesehen.</p> <h3>Team-Chat</h3> <p>Neben der täglichen Arbeit läuft ein Team-Chat über den in den letzten Jahren sämtliche Fragestellungen/Probleme/etc. abgehandelt wurden. Hierbei spielt auch mit, dass mein Team über zwei Standorte verteilt ist und so eine einfache Kommunikationsmöglichkeit geboten wird. Das bietet zwar den Vorteil, dass innerhalb der Nachrichten gesucht werden kann, aber dies bringt auch einen gewaltigen Nachteil mit sich: Vielfach werden wichtige Fragen einfach nicht beantwortet. Dafür gibt es viele Gründe:</p> <ul> <li>Man will aktuell nicht gestört werden</li> <li>Es ist einem schlicht zu blöd jetzt eine Antwort schreiben zu müssen</li> <li>Die Benachrichtigungen wurden deaktiviert</li> <li>Etc.</li> </ul> <p>Mittlerweile haben wir den Team-Chat noch für wichtige Ankündigungen, mehr aber in Wirklichkeit auch nicht mehr. Vielmehr ist es nun so, dass jemand mit Frage aufsteht, seine Frage an das Team formuliert und sich einige Minuten später wieder mit einer Lösung hinsetzt. Die anfängliche Befürchtung ständig aus der Arbeit gerissen zu werden hat sich nicht bewahrheitet. Es kristallisiert sich heraus, dass die Fragen immer weniger, dafür jedoch schwergewichtiger werden. Durch die Diskussionen um die beste Lösung wird sehr viel Wissen transferiert, das dem gesamten Team zu Gute kommt. Entsprechend verlagern sich auch die Themengebiete der Fragen.</p> <p>Da war doch noch etwas: zwei Standorte. Im ersten Schritt versucht der Standort selbst seine Frage zu klären (die Ergebnisse werden in diesem Fall jedoch schon über den Team-Chat mitgeteilt), ist dies nicht möglich gibt es ein “Online-Meeting”.</p> <h3>Online-Meetings</h3> <p>Wie bereits angesprochen: Mein Team ist über zwei Standorte verteilt. Dies macht Meetings nicht gerade einfacher. Ein klassisches Online-Meeting-System haben wir nicht im Einsatz. Bis dato wurden alle über den gewählten Kommunikationskanal angerufen, saßen vor ihren Rechnern mit Kopfhörer und haben mehr oder weniger am Meeting teilgenommen. Eher weniger.</p> <p>Auch dies läuft nun anders: Bei Meetings setzen wir uns nun alle gemeinsam an unseren Besprechungstisch, oder stellen uns einfach zusammen (wie wir das in unseren Standup-Meetings machen - was <a title="Ralf Westphal" href="http://blog.ralfw.de/search?q=scrum">Ralf</a> im Übrigen nicht gut findet). Laptops sind nur für den “Schriftführer” zugelassen, es soll keine Ablenkung geben. Damit die Übertragung des Gesprochenen gut funktioniert, haben wir uns ein 3-teiliges Flächenmikrofon gekauft und ausgelegt (anfänglich haben wir günstigere Lösungen probiert, die alle nicht zufriedenstellend funktioniert hatten).</p> <p><a href="http://devtyr.norberteder.com/image.axd?picture=WP_000586.jpg"><img title="Flächenmikrofon AKG CBL 410 PCC" style="border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; border-left: 0px; display: inline; padding-right: 0px" border="0" alt="Flächenmikrofon AKG CBL 410 PCC" src="http://devtyr.norberteder.com/image.axd?picture=WP_000586_thumb.jpg" width="350" height="262" /></a></p> <p>Im nächsten Schritt werden wir wohl auch ein wenig in Richtung Videoübertragung gehen um die entfernten Teammitglieder noch besser eingebunden zu haben.</p> <h3>Gemeinsame Aktivitäten</h3> <p>Als nächsten Schritt unternehmen wir nun monatlich etwas gemeinsam. Nur das Team. Nicht weiter aufregend: Wir gehen Steak essen. Wie Männer das gerne tun. Die ungezwungene Atmosphäre, das lockere Beisammensitzen, das Besprechen von Anliegen auf neutralem Boden ist ein gewaltiger Nährboden für das Zusammenwachsen des Teams.</p> <p>Unser Unternehmen veranstaltet zwar in mehr oder weniger regelmäßigen Abständen größere Zusammenkünfte mit gemeinschaftlichem Essen, Wettkämpfen und mehr. Es ist jedoch extrem wichtig, dass jedes Team für sich selbst auch einen Weg und ein paar Stunden Freizeit findet, in kleiner Runde etwas zu unternehmen. Auf Dauer gesehen bringt dieser Aspekt aus meiner Sicht am meisten. Es verändert sich der tägliche Umgang miteinander merkbar. Dabei geht es weniger darum Freunde für’s Leben zu finden, sondern sich vielmehr auf eine gemeinsame Basis der Kommunikation zu “einigen” - was im übrigen automatisch passiert.</p> <h2>Fazit</h2> <p>Natürlich hat es noch weitere kleinere Änderungen gegeben, die angesprochenen waren mitunter wohl die größten bis dato. Jedes Team hat andere Baustellen die man erkennen und aktiv (vor allem gemeinsam) angehen und lösen muss. Da mag man durchaus zeitweise ratlos durch die Gegend laufen, aber es gibt Möglichkeiten und die einfachsten ist dann doch meist die besten. Weniger Egoismus und mehr Gemeinschaft im Team birgt für jeden Vorteile, vor allem aber enden Anschwärzungen, das Herumreiten auf Bugs anderer und gar schlimmere Vorkommnisse. Es tritt ein “Gemeinsam machen wir etwas wirklich tolles” in den Vordergrund. Der Grundstein für eine positive Weiterentwicklung.</p> <p><strong>Hast auch du zu diesem Thema etwas aus deiner Erfahrung zu berichten? Arbeitest du auch in einem Team mit “offenen Wunden”? Oder habt ihr diese bereits gelöst? Ich würde gerne davon erfahren!</strong></p> http://devtyr.norberteder.com/post/Arbeiten-wir-an-der-Kommunikation!.aspx Norbert Eder [MVP] 4228 2013-03-29T08:37:00 Design-Offensive FTW <p>Design ist ja bekanntlich besonders wichtig wenn es um das Thema Vermarktung geht. Ein Blog ist ja quasi auch eine Form des Marketings. Self-Marketing, jawohl. In diesem Sinne habe ich das bisherige Design ein wenig aufgefrischt, das Ergebnis ist bereits online. </p> <p>Die Erneuerung wurde auch für meine Hauptsite unter <a href="http://www.norberteder.com">http://www.norberteder.com</a> vorgenommen. Besser integriert, wie aus einem Guss. Das sollte nun für den Besucher wesentlich übersichtlicher sein. Warum ich dies überhaupt als eigenen Beitrag bringe? Ganz einfach: <strong>Euer Feedback ist gefragt. Ist es eine Verbesserung, gibt es weiteres Potential oder findet ihr das neue Design schlechter?</strong></p> <p>Und so sah das Blog zuvor aus (als Vergleich):</p> <p><a href="http://devtyr.norberteder.com/image.axd?picture=image_208.png"><img title="Design v2 (Norbert Eder)" style="border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; border-left: 0px; display: inline; padding-right: 0px" border="0" alt="Design v2 (Norbert Eder)" src="http://devtyr.norberteder.com/image.axd?picture=image_thumb_131.png" width="350" height="270" /></a></p> <p>Der Vollständigkeit halber hier noch der Screenshot der ursprünglichen Hauptseite - für’s Archiv sozusagen:</p> <p><a href="http://devtyr.norberteder.com/image.axd?picture=image_209.png"><img title="www.norberteder.com Design v8" style="border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; border-left: 0px; display: inline; padding-right: 0px" border="0" alt="www.norberteder.com Design v8" src="http://devtyr.norberteder.com/image.axd?picture=image_thumb_132.png" width="350" height="299" /></a></p> http://devtyr.norberteder.com/post/Design-Offensive-FTW.aspx Norbert Eder [MVP] 4225 2013-03-28T18:29:34 TheOldReader in den Chrome RSS-Abonnement-Optionen Ja, es war in aller Munde und nein ich werde nicht mehr darauf eingehen, denn auch ich war mächtig angepisst, dass es den Google Reader nicht mehr geben wird. Absolut kein Verständnis für das Einstellen des Service. Nun denn, auf der Suche nach einer Alternative kam mir der eine oder andere, neue oder auch alte.. http://feedproxy.google.com/~r/BigglesBlog/~3/OQ_mX_ezY38/theoldreader-in-den-chrome-rss-abonnement-optionen Mario Priebe 4221 2013-03-27T09:35:02 Ach, Scrum bringt doch nichts. Oder doch? <p>Mitte Dezember 2012 habe ich in meinem Team mitgeteilt, dass ich gerne Scrum einführen würde. Schnell wollte jeder wissen, wie der Hase läuft. Ein paar einschlägige Bücher und Diskussionen waren die Folge. Die Einigung erfolgte schnell. Seitdem setzen wir Scrum ein. Bisher versuchten wir uns penibel an die in der Literatur beschriebenen Rahmenwerke zu halten. Wir hatten schon einmal den Fehler gemacht, mit einer für uns passend gemachten Ausprägung zu starten. Und wir scheiterten. Und nun?</p> <p>Ich will auch gar nicht lange darauf eingehen, wie wir Scrum behandeln. Im Wesentlichen haben wir unsere Inhalte aus <a title="Scrum - Agiles Projektmanagement erfolgreich einsetzen, Roman Pichler" href="http://www.amazon.de/Scrum-Agiles-Projektmanagement-erfolgreich-einsetzen/dp/3898644782" target="_blank">Scrum - Agiles Projektmanagement erfolgreich einsetzen (Pichler)</a> und <a title="Die Kraft von Scrum, Henning Wolf" href="http://www.amazon.de/Die-Kraft-Scrum-revolution&auml;rsten-Projektmanagement-Methode/dp/3827332168" target="_blank">Die Kraft von Scrum (Wolf)</a> bezogen und versuchen da so nahe wie möglich dran zu bleiben. Keine Experimente, die Zeit wird wohl noch kommen.</p> <p>Sehr interessant waren dabei die Auswirkungen auf das Team. Die meisten von uns waren unberührt von diesem Thema. Natürlich schielt man als Softwareentwickler auf diverse Methoden und pickt sich den einen oder anderen Teilbereich heraus. Es ist dann aber schon eine ganz andere Liga, Nägel mit Köpfen zu machen, ins kalte Wasser zu springen und die gesamte Art und Weise der Projektentwicklung umzustellen. Dementsprechend hatten wir es natürlich mit jeder Menge Ängste und Sorgen zu tun.</p> <h2>Ängste, Sorgen und Probleme</h2> <p>“Ab heute ist alles anders”. Ja, das wirft schon jede Menge Fragen auf. Vor allem dann, wenn man die Folgen nicht wirklich abschätzen kann. Veränderung fördert Angst. Angst lähmt. Was waren die einzelnen Faktoren?</p> <ul> <li><strong>Vollkommene Transparenz kommt einer Überwachung gleich</strong>. Bisher kamen ellenlange Spezifikationen zur Umsetzung. Ein Abschätzen der Entwicklungsdauer war nicht möglich. Ein Überziehen stand an der Tagesordnung. Durch die kleineren Happen, die höhere Transparenz sieht de facto jeder, wer gerade woran arbeitet, wie der Fortschritt ist, was noch fehlt und wo die Probleme liegen. Das fördert das Gefühl, überwacht zu werden. Das ist natürlich keineswegs die Intention, ändert aber nichts an der Tatsache, dass so mancher im Team genau davor Angst hat. Nicht des Verbergens wegen, sondern vielmehr der Angreifbarkeit.</li> <li><strong>Gemeinsames Arbeiten am selben Feature</strong>. Das Aufteilen einer User Story in kleine Happen (Tasks) kann schon seine Tücken mit sich bringen, vor allem wenn Abhängigkeiten bestehen und man sich schon Gedanken darüber machen muss, welches davon die wirklich wichtigen Arbeiten sind. Wenn jahrelang für ein Feature immer genau ein Entwickler zuständig ist, dann fehlt vielfach der klare Gedanke daran. Es entsteht der Eindruck, dass es gar nicht möglich ist, gemeinsam an einer größeren User Story zu arbeiten bzw. dass der Aufwand viel höher ist, als bei einer Umsetzung durch eine einzelne Person.</li> <li><strong>Angst um Spezialbereiche</strong>. Ich setze ein Feature alleine um, dann bin ich darin der Experte. Ich bin also wichtig. Arbeiten mehrere Personen am selben Feature, dann trifft das nicht mehr zu. Es entsteht also die Angst, an “zuerkannter Kompetenz” und/oder Verantwortungsbereiche einzubüßen.</li> <li><strong>Transparenz gegenüber Business</strong>. Der Business-Bereich weiß ganz genau Bescheid, was denn aktuell in Entwicklung ist, wie es um den Stand bestellt ist und wer was macht. Das kann doch nicht gut gehen und zweitens ist der “Einmischfaktor” zu hoch. Wichtige technische Punkten müssen somit diskutiert werden, konnten bisher aber ohne Probleme “eingefächert” werden. </li> <li><strong>Zeitverlust</strong>. Sprint Planning, Recap Meeting. Das alles verbraucht doch soviel Zeit. Zeit, die man viel produktiver nutzen kann. Ran an den Punkt und arbeiten. Es ist schwierig, den “Machern” einzutrichtern, dass ein gemeinsames Verständnis, eine gemeinsame Vorgehensweise seine Vorteile mit sich bringt. Auch wenn die Meetings mitunter lange dauern. Im Vordergrund steht, dass der Entwickler eben Code schreiben und nicht reden will. Eine schwierige Sache.</li> </ul> <p>Das sind schon durchaus gravierende Punkte, di in zahlreichen Gesprächen ausgeräumt werden müssen. Wichtig hierbei ist, es vorzuleben. Von “oben herab” funktioniert da erst einmal gar nichts - und das ist auch nicht Sinn und Zweck.</p> <h2>Vier Monate später</h2> <p>Nun sind über vier Monate vergangen. Bei einer Sprintdauer von zwei Wochen kam schon einiges an Erfahrung zusammen. Wie geht es jetzt mit uns und wie sieht das gesamte Teamgefüge aus? Wer nicht weiterlesen möchte: super! Wer Details möchte, bitte sehr:</p> <ul> <li><strong>Kommunikation</strong>. Punkte müssen abgestimmt werden. Wer macht was und wie und sowieso und überhaupt. War es zuvor still im Büro, mit aufgesetzten Kopfhörern, ist das jetzt nicht mehr der Fall. Es wird richtig kommuniziert. Dies wirkt sich natürlich äußerst positiv auf das Know-How des Teams aus. Wissen wird transferiert, jeder erschließt neue Bereiche und kann mit unterschiedlichen Sichtweisen seinen Input hinsichtlich Verbesserungen etc. bringen.</li> <li><strong>Überblick Sprintinhalt</strong>. Jeder Entwickler hat einen sehr guten Überblick über die anstehenden Tasks. Es ist klar was innerhalb eines Sprints zu leisten ist.</li> <li><strong>Zusammenhalt</strong>. Es hat sich der Zusammenhalt, das gesamte Teamgefüge massiv verbessert. Dadurch dass alle gemeinsam am selben Strang ziehen (müssen) und eben das Bewusstsein dafür besteht, ist es diesbezüglich zu einer klaren Verbesserung gekommen.</li> <li><strong>Qualität</strong>. Kleinere Happen, die dafür richtig gut. Das zahlt sich aus. Bugs werden bei uns grundsätzlich als Blocker eingestuft und müssen sofort behandelt werden. Die Qualität steigt von Sprint zu Sprint. Das ist nicht nur für uns selbst positiv und motivierend, sondern wird auch von unseren Testern bzw. den Benutzern positiv bemerkt/aufgenommen.</li> <li><strong>Transparenz</strong>. Es ist jedem zu jeder Zeit klar, wie der aktuelle Stand der Entwicklung ist. Was Anfangs einen sehr negativen Touch hatte wird nun absolut positiv aufgenommen. Es gibt keine Geheimnisse, Probleme liegen offen auf dem Tisch und werden gelöst. So einfach.</li> <li><strong>Laufende Verbesserung</strong>. Jeder Sprint wird genau beleuchtet und hinterfragt. Aufgetretene Probleme oder Schwachstellen werden offen diskutiert, priorisiert und die Top-Punkte als Verbesserungsmaßnahmen für den darauffolgenden Sprint eingeplant. Jedes Teammitglied weiß nun, dass seine Meinung zählt und auf Verbesserungsvorschläge aktiv eingegangen wird. Die laufende Weiterentwicklung des gesamten Teams spricht für sich.</li> <li><strong>Erfolgserlebnisse</strong>. Wer wochen- oder gar monatelang an einem Feature gearbeitet hat (und somit jede Menge Tiefs mitmachen musste) lebt nun vom täglichen Erfolgserlebnis wesentlich besser. Man geht nicht mehr mit einer elendslangen Liste an offenen Punkten nach Hause, sondern mit einem abgeschlossenen Punkt in der Tasche. Jeden Tag. Das motiviert.</li> </ul> <p>Es war wirklich interessant zu beobachten, welcher Ruck durch das gesamte Team gegangen ist. Von der anfänglichen Angst oder Scheu vor bestimmten Neuerungen ist eine klare Akzeptanz und Befürwortung entstanden.</p> <h2>Wie geht es weiter</h2> <p>Andere Teams bei uns haben sich entschlossen, unseren Weg mitzugehen. Da wir in unserem Team Unterstützung aus der Business-Ebene haben (ja, das funktioniert richtig gut), lag es nahe, Scrum im gesamten Unternehmen einzuführen. Am Programm steht nun ein ausführlicher Workshop mit <a title="Ilker Cetinkaya" href="http://www.ilker.de/" target="_blank">Ilker Cetinkaya</a> in den wir große Erwartungen für weitere Verbesserungen setzen. Zusätzlich ergibt dies die Möglichkeit, unser aktuelles Tun zu reflektieren.</p> <h2>Fazit</h2> <p>Es geht mir nicht darum, dem werten Leser Scrum ans Herzen zu legen. Vielmehr wollte ich aufzeigen, welche positiven Erscheinungen zu Tage treten und was ein konsequentes Durchziehen einer Methode in einem Team tatsächlich bewirken kann. Für welchen Weg auch immer man sich entscheidet, es muss jeder mitspielen damit dieser erfolgreich sein kann. Zwang ist definitiv der falsche Weg. Da jedes Team unterschiedlich ist, mögen unterschiedliche Ansätze zum Ziel führen. Am Ziel sind wir noch lange nicht, der angefangene Weg entpuppt sich jedoch schon nach relativ kurzer Zeit als absolut positiv für unsere Entwicklung.</p> http://devtyr.norberteder.com/post/Ach-Scrum-bringt-doch-nichts-Oder-doch.aspx Norbert Eder [MVP] 4220 2013-03-27T08:00:00 Hochwertiger Content für Entwickler - Machen wir doch was! <p>Mein Beitrag <a title="Gefährliche Experten-Tipps" href="http://devtyr.norberteder.com/post/Gefahrliche-Experten-Tipps.aspx">Gefährliche Experten-Tipps</a> war nicht der einzige seiner Art. Auch <a title="Fabian Deitelhoff" href="http://www.fabiandeitelhoff.de" target="_blank">Fabian Deitelhoff</a> stieß dieselbe Ursache ungut auf. In seinem Beitrag <a title="Entwickler, schaut euch um!" href="http://www.fabiandeitelhoff.de/2013/03/entwickler-schaut-euch-um/" target="_blank">Entwickler, schaut euch um!</a> war er durchaus derselben Meinung wie ich. Die Hauptaussage dreht sich um einen Punkte: Entwickler brauchen hochqualitative Inhalte, mit wahren Experten-Tipps. Keine Null-Nummer-Beiträge in bester Google-Werbe-Manier. Kann man hier entgegen wirken? Sollte man das tun? Eine kleine Idee …</p> <p>Wer meine Community-Aktivitäten schon länger verfolgt, mag eines meiner früheren Projekte kennen: Das <a title=".NET BlogBook" href="http://dotnet-blogbook.com/" target="_blank">.NET BlogBook</a>. Gemeinsam mit <a title="Kai Gloth" href="http://braindrivendevelopment.com/" target="_blank">Kai Gloth</a> habe ich die besten Beiträge unserer Blogs in Buchform gegossen und als “Sammelwerk” kostenlos veröffentlicht. Mit nicht ganz 40.000 Downloads bis zum heutigen Tag bin ich nahezu geneigt, von einem großen Erfolg zu sprechen.</p> <p>Das wirkliche Wichtige daran: Wir hatten dieses Projekt aus Überzeugung gemacht und nicht aus Profitgier. Das hat sich wohl auch der Leser gemerkt. </p> <p>Heute - Jahre später - finden sich qualitativ hochwertige Beiträge eher selten. Gerade auf großen Medien hat sich eine Kultur entwickelt, die mir überhaupt nicht gefällt. Schnell, schnell, Meldung hinaus. Von Qualität ist da kaum eine Spur.</p> <p><strong>Warum ändern wir das nicht?</strong></p> <p>Wir haben es selbst in der Hand. Ein Zusammenschluss der Community, eine ordentliche Website, eine preiswerte Lösung um die Kosten zu decken und raus mit wirklich gutem Content. Inhalte, die jedem Leser <strong>wirklich</strong> weiterhelfen.</p> <p>Generell schwebt mir ein Online-Magazin zu interessanten und aktuellen Themen vor. Diese müssen nicht zwangsweise auf .NET beschränkt sein. Vielmehr wäre der “Blick über den Tellerrand” zu favorisieren. Bestes Know-How zu unterschiedlichsten Themen wäre in der Community definitiv vorhanden. Es müsste nur kanalisiert werden. </p> <p>Mit einigen aus der Community hatte ich vor Monaten schon ein diesbezügliches Gespräch, Interesse war grundsätzlich vorhanden, nur hat es sich dann leider ein wenig verlaufen, vielleicht weil wir zu wenige waren.</p> <p><strong>Wer hat grundsätzlich Interesse daran? Einfach einen entsprechenden Kommentar hinterlassen. Bei ausreichend Rückmeldungen organisiere ich ein virtuelles Meeting um Details zu besprechen. Es würde mich sehr freuen, ein wenig mehr Qualität im deutschsprachigen Entwickler-Raum sehen zu können.</strong></p> http://devtyr.norberteder.com/post/Hochwertiger-Content-fur-Entwickler-Machen-wir-doch-was!.aspx Norbert Eder [MVP] 4219 2013-03-26T09:53:25 Windows Azure Conf - 23. April 2013 <p><a href="http://devtyr.norberteder.com/image.axd?picture=image_205.png"><img title="Windows Azure Conf" style="border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; border-left: 0px; display: inline; padding-right: 0px" border="0" alt="Windows Azure Conf" src="http://devtyr.norberteder.com/image.axd?picture=image_thumb_128.png" width="900" height="158" /></a></p> <p>&#160;</p> <p>Am 23. April 2013 gibt es eine weitere Ausgabe der <a title="Windows Azure Conf" href="http://www.windowsazureconf.net/" target="_blank">Windows Azure Conf</a>. Dabei handelt es sich um eine kostenlose Veranstaltung für die Community. Die Keynote wird von Scott Guthrie abgehalten. Sehr positiv ist die Live-Übertragung über <a title="Channel 9" href="http://channel9.msdn.com/" target="_blank">Channel 9</a>. Alle Beiträge des vergangenen Jahres können <a title="Windows Azure Conf 2012" href="http://channel9.msdn.com/Events/WindowsAzure/AzureConf2012" target="_blank">hier</a> eingesehen werden. Alle Interessierten sollten sich also gleich einen Termineintrag inkl. Erinnerung anlegen.</p> <p>Startzeit: 17:30 <br />Endzeit: 02:00</p> <p>Die Website wird bis zur Online-Konferenz laufend aktualisiert und mit Informationen ergänzt. </p> http://devtyr.norberteder.com/post/Windows-Azure-Conf-23-April-2013.aspx Norbert Eder [MVP] 4218 2013-03-22T12:41:00 Go Windows Azure <p>Als <a title="Windows Azure" href="http://www.windowsazure.com/" target="_blank">Azure</a> das Licht der Welt erblickte hatte ich schon immer wieder damit gespitzt da es einfach interessant klang. Mangels eines tatsächlichen Projektes kam es aber nie zu einer Spielerei. Das hat sich nun (jaja, Azure gibt es ja in derzeitigen Maßstäben schon seeeehr lange) geändert. Ich habe einen konkreten Anlassfall und möchte diesen nutzen, auch über <a title="Windows Azure" href="http://www.windowsazure.com/" target="_blank">Azure</a> zu bloggen. Sehen wir dies als kleines Tagesbuch meiner ersten Schritte hin zur Lösung der Probleme die sich auf meinem Wege ergeben.</p> <p>Für den ersten Einstieg bietet es sich an, einen Blick in den <a title="Windows Azure Documentation" href="http://www.windowsazure.com/en-us/documentation/" target="_blank">Dokumentationsbereich</a> zu werfen. Dort finden sich zahlreiche Einführungen, Beschreibungen der angebotenen Services als auch alle benötigten <a title="Windows Azure Downloads" href="http://www.windowsazure.com/en-us/downloads/" target="_blank">Downloads</a>. Sehr zu empfehlen sind:</p> <ul> <li><a title="Windows Azure Trainingskit" href="http://www.windowsazure.com/en-us/develop/net/other-resources/training-kit/" target="_blank">Windows Azure Trainings Kit</a> </li> <li><a title="Windows Azure Samples" href="http://www.windowsazure.com/en-us/develop/net/samples/" target="_blank">Beispiele</a> </li> <li><a title="Windows Azure Best Practices" href="http://www.windowsazure.com/en-us/develop/net/guidance/" target="_blank">Best Practices</a> </li> </ul> <p>Wer sich gerne Videos reinzieht wird im <a title="Windows Azure YouTube Channel" href="http://www.youtube.com/user/windowsazure" target="_blank">Windows Azure YouTube Channel</a> fündig. Aktuell tummeln sich darin 109 Videos, zu unterschiedlichsten Themen rund um Azure. Aktuelle Informationen gibt es zudem via <a title="Windows Azure auf Twitter" href="https://twitter.com/WindowsAzure" target="_blank">Twitter</a>. Aber auch die deutschsprachige Community hat guten Content zu bieten (wenn auch noch nicht so ausgeprägt, aber das wird sich hoffentlich ändern):</p> <ul> <li><a title="Holger Sirtl&#39;s WebLog" href="http://blogs.msdn.com/b/hsirtl" target="_blank">Holger Sirtl</a> </li> <li><a title="Über .NET, SQL Server und die Cloud" href="http://www.sascha-dittmann.de" target="_blank">Sascha Dittmann</a> </li> <li><a title="Das Weblog rund um Software Entwicklung und Design auf der Microsoft Plattform." href="http://codefest.at" target="_blank">codefest.at</a> </li> <li><a title="Windows Azure Community Deutschland" href="http://wazcommunity.wordpress.com/" target="_blank">Windows Azure Community Deutschland</a> </li> </ul> <p>Für den leichten Einstieg wird auch ein <a title="Windows Azure 90 day free trial" href="http://www.windowsazure.com/en-us/pricing/free-trial/" target="_blank">90 Tages Trial</a> kostenlos angeboten. Damit können alle Services bis zu einem bestimmten (monatlichen) Kontingent getestet werden. Unter dem angebotenen Link sind die Konditionen aufgeführt. Sie sollten für ein intensives Testen der Möglichkeiten vollkommen ausreichend sein.</p> <p>Für Startups gibt es auch <a title="Microsoft BizSpark" href="http://www.microsoft.com/bizspark/" target="_blank">Microsoft BizSpark</a>. Dabei handelt es sich um ein Programm zur Förderung von Startups und deren Ideen. Für BizSpark-Mitglieder gibt es ein <a title="Special offer for BizSpark members" href="http://www.windowsazure.com/en-us/pricing/member-offers/bizspark-benefits/" target="_blank">spezielles Angebot</a>. Ein ebensolches Angebot gibt es auch für MSDN Abonnenten. Wer also ein solches besitzt sollte sich die <a title="Windows Azure Member Offers" href="http://www.windowsazure.com/en-us/pricing/member-offers/" target="_blank">Member Offers</a> genauer ansehen.</p> <p>Gerade für Websites und mobile Dienste gibt es auch kostenlose Varianten, die wohl für die Entwicklung einer Lösung ausreichend sein sollten. Der <a title="Windows Azure Calculator" href="http://www.windowsazure.com/en-us/pricing/calculator/" target="_blank">Windows Azure Calculator</a> gibt darüber Aufschluss.</p> <p>Der interessierte Leser sollte nun ausreichend Quellen für die erste Recherche besitzen. Von meiner Seite werden bald weitere und konkretere Informationen folgen. Ich freue mich jedenfalls bereits auf eine “neue Welt” und hoffe viel zu lernen. </p> http://devtyr.norberteder.com/post/Go-Windows-Azure.aspx Norbert Eder [MVP] 4217 2013-03-21T18:27:25 Gefährliche Experten-Tipps <p>Ich bin gerne Softwareentwickler. Ich schreibe gerne Code. Ich plane gerne Software. Ich diskutiere gerne über Software im Allgemeinen und Code im Speziellen. Ich evaluiere gerne Neues. Ich setze auch gerne eben das Neue ein. Ich verlasse mich aber auch gerne auf Bewährtes. Was ich aber überhaupt nicht gerne habe: Die steigende Anzahl an Entwicklern (manche gar als Experten angesehen) die nur am Nörgeln sind, wie rasant sich alles ändert, dass es ständig etwas Neues gibt, nichts beim Alten bleibt und sowieso alles Kacke ist.</p> <p>Ausgangspunkt ist - unter anderem - <a title="Jede Woche wird eine JavaScript-Sau durchs Dorf getrieben" href="http://www.heise.de/developer/artikel/Jede-Woche-wird-eine-JavaScript-Sau-durchs-Dorf-getrieben-1826479.html" target="_blank">dieser Beitrag</a> hier. Die Aussagekraft geht gegen NULL (einmal davon abgesehen, dass im Beitrag ohnehin nur Werbung für zwei Bücher gemacht wird, wovon mindestens eines davon durch den Beitrag unglaubwürdig erscheint). Nein, eigentlich werden gerade die Beginner, die - eben durch diese Vielfalt - Verunsicherten, in eine Nische getrieben, in der sie sich in ein, zwei Jahren nicht wiederfinden wollen. Hier am Beispiel der ASP.NET Webforms.</p> <p>Es stimmt. Die Vielfalt ist niederschmetternd. Täglich neue Bibliotheken. Täglich neue Möglichkeiten. Die ToDo-Listen werden länger und länger. Man möchte sich alles ansehen, alles testen. Man muss ja Bescheid wissen. Up-to-date sein. Man muss ja mitdiskutieren können. Ja keinen Angriff für einen Flame bieten. Sich auskennen. Auch einmal Hater sein dürfen.</p> <p><strong>Muss ich als Softwareentwickler alles wissen?</strong> Nein. Kann ich das überhaupt? Nein. Kann ich eben nicht. Ich kann mich aber täglich von der Angst treiben lassen, einmal zugeben zu müssen, dass ich nicht alles weiß. Ich kann dem auch entgegen arbeiten und allen meinen <strong>Freunden </strong>laufend mitteilen wie Kacke ich es finde, dass täglich alles neu ist - und ihnen vorschlagen, sich Scheuklappen aufzusetzen.</p> <blockquote> <p>Besinne dich auf die wichtigen Dinge deines Jobs.</p> </blockquote> <p>Dabei ist es doch unerheblich was denn da täglich an neuen Bibliotheken und Services durch die Timeline schwappt. Viel wichtiger ist im ersten Schritt was ich denn für meine tägliche Arbeit tatsächlich benötige. Darin muss ich mich vordergründig weiterentwickeln und zu einem Experten werden. Dann kann ich mich um weiterführende Techniken/Technologien/Bibliotheken kümmern. Oder eben wenn tatsächlich der Bedarf besteht. Dabei muss eines sichergestellt sein:</p> <blockquote> <p>Lass dich niemals in eine Ecke drängen aus der es kein Entkommen gibt.</p> </blockquote> <p>Wenn ich daher zurück zum Thema <strong>Webforms </strong>kommen darf: Hier werde ich als Entwickler eingeschränkt, da mir sehr viel an Freiraum/-heit genommen wird. Als Entwickler möchte ich aber vieles steuern können. So möchte ich Client und Server getrennt haben. Ich möchte später eventuell andere Clients anbinden. Ich will frei in meiner zukünftigen Entscheidung sein - wie auch immer sie aussieht. Ich weiß es heute schlicht nicht. Mit “Experten”-Tipps wie hinter obigem Link verborgen werden unsichere/unerfahrene Entwickler aber eben in die Falle gelockt. Von Entwicklern die es eigentlich besser wissen sollten.</p> <p>Ein ebenfalls wichtiger Leitsatz (zumindest für mich):</p> <blockquote> <p>Abhängigkeiten gering halten.</p> </blockquote> <p>Viele Abhängigkeiten bedeuten nicht nur viel Pflegeaufwand, häufiges Upgraden, sondern auch mitunter vorkommendes Brechen von APIs inkl. aller damit resultierenden Probleme. Wenn ich mich als Entwickler jedoch auf eine Abhängigkeit einlasse, dann muss es einen klaren Grund, eine klare Erleichterung geben. Dafür bedarf es einer anständigen Evaluierung, ausreichende Tests und natürlich auch ein Gespür hinsichtlich der zukünftigen Entwicklung. Ein guter Indikator ist hier durchaus die Unterstützung durch die gesamte Community.</p> <blockquote> <p>Reflektiere die Information</p> </blockquote> <p>Ein weiterer wesentlicher Punkt. Informationen im Web sind geduldig. Jeder stellt sein Werk als besonders wertvoll dar. Ist es das auch tatsächlich? Sprich doch mit deinen Kollegen und/oder Freunden darüber. Vielleicht kannst du auch in der Community darüber diskutieren, vielleicht hat bereits jemand damit Erfahrung gemacht und möchte diese teilen. Dadurch lassen sich sehr viele Probleme vermeiden, vielfach auch eine falsche Wahl. </p> <h2>Fazit</h2> <p>Wissen was angesagt ist, wo ich notfalls Informationen darüber bekomme, aber ich muss nicht jeden Schritt mitgehen. Als Entwickler bin ich aber dafür verantwortlich dass ich zukunftssicher (jaja, Buzz-Word) unterwegs bin. Eine offene Einstellung ohne in Panik zu verfallen hilft hier jedoch ungemein. <strong>Von Entwicklern, die in der ersten Reihe stehen und andere mit Informationen versorgen (wollen) oder sie gar weiterbildet, erwarte ich mir schon Weitblick und keine Panikmache.</strong></p> http://devtyr.norberteder.com/post/Gefahrliche-Experten-Tipps.aspx Norbert Eder [MVP] 4215 2013-03-20T16:05:30 Wichtige Daten immer mit dabei (Synology DS212j) <p>Die erste Feuerprobe hat meine <a title="Synology" href="http://www.synology.com" target="_blank">Synology</a> DiskStation überstanden. Sämtliche Fotos etc. sind nun darüber verfügbar, auch die mobilen Anwendungen für Windows Phone und iOS können darauf zugreifen. Die nächste Herausforderung besteht in der Einrichtung eines Sync-Folders á la <a title="Dropbox" href="http://www.dropbbox.com" target="_blank">Dropbox</a> einzurichten. Was ich also möchte: Einen Folder der die Daten enthält, die auf allen Geräten verfügbar sind und über die DiskStation automatisch verteilt werden. Dieser Beitrag beschreibt Schritt für Schritt die Einrichtung sowohl für innerhalb des Heimnetzes, als auch über einen Zugriff via VPN.</p> <p>Im ersten Schritt muss die DiskStation um ein Paket erweitert werden. Zu installieren ist das Paket <strong>Cloud Station</strong>. Dieses ist standardmäßig nicht installiert, kann jedoch über das Paket-Zentrum einfach und ohne viel Aufwand erledigt werden.</p> <p><a href="http://devtyr.norberteder.com/image.axd?picture=image_202.png"><img title="Synology DiskStation Paket-Zentrum" style="border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; margin: 0px 0px 10px; border-left: 0px; display: inline; padding-right: 0px" border="0" alt="Synology DiskStation Paket-Zentrum" src="http://devtyr.norberteder.com/image.axd?picture=image_thumb_125.png" width="902" height="392" /></a></p> <p>Nach der erfolgreichen Installation wird der Schaltzentrale ein entsprechender Menüpunkt hinzugefügt. Dieser ist auszuwählen, um die Cloud Station zu aktivieren. Der Vorgang ist im nachfolgenden Screenshot abgebildet.</p> <p><a href="http://devtyr.norberteder.com/image.axd?picture=image_203.png"><img title="Synology Clout Station aktivieren" style="border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; margin: 0px 0px 10px; border-left: 0px; display: inline; padding-right: 0px" border="0" alt="Synology Clout Station aktivieren" src="http://devtyr.norberteder.com/image.axd?picture=image_thumb_126.png" width="902" height="430" /></a></p> <p>Soweit ist die Arbeit auf der DiskStation abgeschlossen. Nun muss - wie auch bei <a title="SkyDrive" href="http://www.skydrive.com" target="_blank">SkyDrive</a>, <a title="Dropbox" href="http://www.dropbbox.com" target="_blank">Dropbox</a>, <a title="Google Drive" href="http://drive.google.com" target="_blank">Google Drive</a> und Co. - am eigentlichen Rechner die Sync-Software installiert werden. Diese kann <a title="Synology Download Software DS212j" href="http://www.synology.com.tw/support/download.php?lang=deu&amp;b=2%20bays&amp;m=DS212j" target="_blank">hier</a> für die DS212j herunter geladen werden. Die notwendige Software nennt sich gleich: Cloud Station. Diese steht für Windows und Mac zur Verfügung. Am Client installieren, anschließend die Verbindungsdaten zur DiskStation angeben (entspricht einem eingerichteten Benutzer der DiskStation), Sync-Folder auswählen und fertig. Ab nun funktioniert die Synchronisation. Zur Sicherheit empfiehlt sich ein einfacher Test, bevor es zum nächsten Schritt geht (dieser ist nicht notwendig, wenn ausschließlich über das Heimnetzwerk auf die Daten zugegriffen werden soll).</p> <h2>Unterwegs syncen</h2> <p>Nun will man allerdings oft auch von unterwegs auf das eigene Netzwerk zugreifen, oder zumindest seine Daten synchronisieren. Auch dies kann einfach bewerkstelligt werden, so die restliche Infrastruktur dafür vorhanden ist. Was braucht es:</p> <ul> <li>Wer eine dynamische IP hat, benötigt einen Dienst á la <a title="DynDNS" href="http://dyn.com/dns/" target="_blank">DynDNS</a>, <a title="DtDNS" href="http://www.dtdns.com/" target="_blank">DtDNS</a>, <a title="No-IP" href="http://www.noip.com" target="_blank">No-IP</a> inkl. der dafür notwendigen Konfiguration (sowohl direkt beim Dienst, als auch am eigenen Router).</li> <li>Wer es sicherer möchte, richtet ein VPN ein</li> <li>Auf jeden Fall muss eine Port-Weiterleitung am Router eingerichtet werden</li> </ul> <p>In meinem Fall habe ich mich für die Einrichtung eines VPN entschlossen. Auch hierfür wird ein entsprechendes Paket zur Verfügung gestellt:</p> <p><a href="http://devtyr.norberteder.com/image.axd?picture=image_204.png"><img title="Synology VPN Paket installieren" style="border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; border-left: 0px; display: inline; padding-right: 0px" border="0" alt="Synology VPN Paket installieren" src="http://devtyr.norberteder.com/image.axd?picture=image_thumb_127.png" width="902" height="392" /></a></p> <p>Über die Schaltzentrale kann nun der <strong>VPN Server</strong> konfiguriert werden. Synology bietet hierzu eine sehr gute <a title="Einrichten von Synology NAS als VPN Server" href="http://www.synology.com/support/tutorials_show.php?lang=deu&amp;q_id=459" target="_blank">Anleitung</a>. Schlussendlich ist eine Port-Weiterleitung am Router einzurichten. Welche Ports (hängt natürlich von der tatsächlichen Konfiguration ab) eingerichtet werden müssen, kann aus <a title="Welche Netzwerk-Ports werden von den Diensten des Synology NAS genutzt?" href="http://www.synology.com/support/faq_show.php?lang=deu&amp;q_id=299" target="_blank">dieser Liste</a> herausgefunden werden.</p> <p>In meinem Fall hat dies auf Anhieb funktioniert, Einrichtungsdauer inkl. Test lag bei ca. 15 Minuten.</p> <h2>Fazit</h2> <p>Neben eines zentralen Datenstores, der Möglichkeit ein richtiges Backup einzurichten, war es für mich auch essentiell, wichtige Daten auf allen meinen Rechnern verfügbar zu haben und aktuell zu halten, idealerweise nicht nur im Heim-Netzwerk. Die Einrichtung ist in wenigen Minuten zu erledigen, Probleme sind keine aufgetreten und funktioniert tadellos. Der Vorteil ist nun, dass sämtliche Daten wirklich bei mir liegen und nicht bei einem Fremdanbieter, der Nachteil liegt darin, dass man selbst für die Infrastruktur, Security etc. verantwortlich ist.</p> http://devtyr.norberteder.com/post/Wichtige-Daten-immer-mit-dabei-(Synology-DS212j).aspx Norbert Eder [MVP] 4186 2013-03-14T10:51:27 Backup: Synology DS212j - Ein Erfahrungsbericht <p>Meine umständliche “Backuplösung” gehört der Vergangenheit an. Den <a title="Backupstragegie für Dummies gesucht" href="http://devtyr.norberteder.com/post/Backupstragegie-fur-Dummies-gesucht.aspx">Ausfall einer meiner SSDs</a> nahm ich zum Anlass, meine Backupstrategie endlich auf Vordermann zu bekommen. Schon oft wollte ich dieses Thema angehen, schlussendlich habe ich jedoch nie die für mich richtige Lösung gefunden. Nach zahlreichen Diskussionen mit zahlreichen Personen aus der Community habe ich mich nun für eine Lösung entschieden und Nägel mit Köpfen gemacht. Das System steht zu Hause und läuft bereits. Hier meine ersten Erfahrungen.</p> <p>Geleistet habe ich mir eine <a title="Synology DiskStation DS212j" href="http://www.synology.com/products/spec.php?product_name=DS212j" target="_blank">Synology DiskStation DS212j</a> und zwei Western Digital WD30EFRX Red 3TB. Auf Grund der Daten erschien mir das ein mehr als ausreichendes System für meine Wünsche. Absolut ideal ist der geringe Strom-Verbrauch von 17,6 Watt (Herstellerangaben, selbst noch nicht überprüft). Die Festplatten (da reine NAS-Platten) kommen je mit 4 Watt aus.</p> <a href="http://devtyr.norberteder.com/image.axd?picture=image_197.png"><img title="Synology DS212j + Western Digital Red 3TB" style="border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; float: left; padding-top: 0px; padding-left: 0px; margin: 0px 10px 10px 0px; border-left: 0px; display: inline; padding-right: 0px" border="0" alt="Synology DS212j + Western Digital Red 3TB" align="left" src="http://devtyr.norberteder.com/image.axd?picture=image_thumb_120.png" width="150" height="200" /></a> <p><a href="http://devtyr.norberteder.com/image.axd?picture=image_198.png"><img title="Packungsinhalt Synology DS212j" style="border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; margin: 0px 0px 10px; border-left: 0px; display: inline; padding-right: 0px" border="0" alt="Packungsinhalt Synology DS212j" src="http://devtyr.norberteder.com/image.axd?picture=image_thumb_121.png" width="267" height="200" /></a></p> <p>Die DiskStation selbst kommt mit folgendem Inhalt:</p> <ul> <li>DS212j</li> <li>Netzteil/-stecker</li> <li>LAN-Kabel</li> <li>Installations-CD + Anleitung</li> <li>Kurzanleitung</li> </ul> <p>Der Einbau der Festplatten ist mehr als einfach, da das Gehäuse nur aufzuschieben ist. Dieses kommt unverschraubt an und ist somit schnell zu öffnen. Festplatten hinein, festschrauben, Deckel wieder drauf, ebenfalls anschrauben. Fertig. Dauer max. 5 Minuten. Was mir hier aufgefallen ist, dass die Anschlussleiste im hinteren Bereich des Gerätes schon sehr wackelig und filigran wirkt. Zuviel Krafteinwirkung sollte an dieser Stelle nicht ausgeübt werden.</p> <p><a href="http://devtyr.norberteder.com/image.axd?picture=image_199.png"><img title="Synology DS212j im geöffneten Zustand" style="border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; float: left; padding-top: 0px; padding-left: 0px; margin: 0px 10px 10px 0px; border-left: 0px; display: inline; padding-right: 0px" border="0" alt="Synology DS212j im geöffneten Zustand" align="left" src="http://devtyr.norberteder.com/image.axd?picture=image_thumb_122.png" width="267" height="200" /></a></p> <p><a href="http://devtyr.norberteder.com/image.axd?picture=image_200.png"><img title="Synology DS212j mit eingebauten Platten" style="border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; float: left; padding-top: 0px; padding-left: 0px; margin: 0px 10px 10px 0px; border-left: 0px; display: inline; padding-right: 0px" border="0" alt="Synology DS212j mit eingebauten Platten" align="left" src="http://devtyr.norberteder.com/image.axd?picture=image_thumb_123.png" width="267" height="200" /></a></p> <p><a href="http://devtyr.norberteder.com/image.axd?picture=image_201.png"><img title="Synology DS212j Abdeckung" style="border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; margin: 0px 0px 10px; border-left: 0px; display: inline; padding-right: 0px" border="0" alt="Synology DS212j Abdeckung" src="http://devtyr.norberteder.com/image.axd?picture=image_thumb_124.png" width="267" height="200" /></a></p> <p>Ran an das Stromnetz, ab ins LAN und Power-Knopf gedrückt.</p> <p>Per Zugriff auf <a href="http://find.synology.com">http://find.synology.com</a> sollte die Station gefunden werden, wenn nicht (wie in meinem Fall), Installations-CD einlegen und 2 Minuten später ist das Gerät erkannt. Im nächsten Schritt muss das Betriebssystem installiert werden. Dieses liegt auf der CD bei, es ist jedoch ratsam die <a title="Synology Download-Zentrum" href="http://www.synology.com/support/download.php" target="_blank">Hersteller-Seite</a> auf eine neuere Version hin zu prüfen. In meinem Fall war eine wesentlich neuere Version verfügbar: DSM 4.2-3202, vom 4. März 2013, also gerade ein paar Tage alt.</p> <p>Hochladen und Installation läuft problemlos in einigen wenigen Minuten. </p> <p>Im Anschluss beginnt die DiskStation mit der Initialisierung der Festplatten. Erstellt wird automatisch ein SHR-Volume. Wer lieber ein Raid-0 oder ein Raid-1 fahren möchte, kann diesen Vorgang abbrechen und <a title="Erstellen von RAID-Volumes auf Synology NAS" href="http://www.synology.com/support/tutorials_show.php?lang=deu&amp;q_id=558" target="_blank">diesem Tutorial</a> folgen.</p> <blockquote> <p>Es ist generell ratsam, sich die Tutorials auf der Hersteller-Seite anzusehen. Hier gibt es zahlreiche Tipps und Tricks mit sehr vielen hilfreichen Informationen.</p> </blockquote> <p>Nach ca. 15 Minuten war die Geschichte erledigt und die ersten Spielereien mit dem Paket-Manager und Installation der unterschiedlichsten Möglichkeiten hinsichtlich Foto-Verwaltung, Musik und Co. begannen. Was mir dabei auffiel:</p> <ul> <li>Es gibt Pakete für fast jeden Zweck</li> <li>Ziemlich cool sind die mobilen Apps für iOS, Android und Windows Phone</li> <li>Die Weboberfläche ist recht übersichtlich, lässt alle Schritte einfach erledigen und wirkt generell überlegt</li> </ul> <p>Mein erster Test lieg im Anschluss mit dem Hochladen von ca. 350GB Bildmaterial inkl. Indizierung plus Beobachtung über mein iPad. </p> <p>Bezüglich der mobilen Apps: Diese gibt es wie bereits erwähnt für iOS, Android und Windows Phone und sind generell kostenlos. Zur Verfügung stehen:</p> <ul> <li>DS finder: Admin-Tool zum Verwalten der DiskStation; Es kann jedoch auch auf die Weboberfläche der DiskStation zugegriffen werden. Diese gibt es auch in einer mobilen Variante.</li> <li>DS photo+: Alle Fotos/Alben im Überblick</li> <li>DS audio: die gesamte Musik wird zur Verfügung gestellt</li> <li>DS video: Videos, Filme etc. streamen. Wer DVB-T an die DiskStation hängt besitzt auch die Möglichkeit TV zu streamen</li> </ul> <p>In den kommenden Tagen werden weitere Konfigurationen stattfinden: Tatsächliches Backup, private Cloud und vieles mehr. Der erste Eindruck ist gut und macht Laune auf mehr.</p> http://devtyr.norberteder.com/post/Backup-Synology-DS212j-Ein-Erfahrungsbericht.aspx Norbert Eder [MVP] 4187 2013-03-12T12:37:50 Working Hours Tracker 1.8 (WP) <p>Working Hours Tracker für Windows Phone ist eine kostenlose App zur Erfassung von Arbeitszeiten. Dabei werden Stundensätze, Pauschalpreise, Projekte, Aktivitäten und mehr unterstützt. In Kürze erscheint Version 1.8, die zahlreiche Anpassungen mit sich bringt. Der Großteil davon basiert auf User-Feedback. </p> <ul> <li>Verbesserung der Performance. Gerade bei größeren Datenmengen wurde die App immer langsamer, wie von zahlreichen Benutzern gemeldet. Es wurde das Ladeverhalten in vielen Bereichen verändert. Dies sollte zu einer wesentlichen Verbesserung beitragen. Ebenfalls wurde in einigen Situationen der geladene Datenstand aktualisiert, obwohl nicht notwendig. </li> <li>Die Kachel <font face="Courier New">export</font> auf dem Startschirm wurde in <font face="Courier New">backup</font> umbenannt. Hier wurde irrtümlich die falsche Bezeichnung vergeben. Dies führte natürlich zu Verwirrung, da an dieser Stelle eine Backup aller Datenbanken durchgeführt werden kann, kein CSV-Export. Zusätzlich wurde eine weitere Information bezgl. tatsächlichem Export hinterlegt.</li> <li>Neues Design für die Monatsliste. Hierfür wurde vielfach gewünscht, dass die Beschreibung des Zeiteintrages nicht nur bei Markierung angezeigt werden soll, sondern generell für alle Einträge. Aus diesem Grund wurde die gesamte Liste überarbeitet. Bei Vorhandensein wird nun zusätzlich auch die eingetragene Aktivität angezeigt. Entfernt wurde die Anzeige der Pause.</li> <li>Dropbox. Vielfach wurde gemeldet, dass eine Anmeldung an Dropbox nicht funktionieren würde. Tatsächlich ist es so, dass die für das Erlauben der App angezeigten Schaltflächen nicht sichtbar sind und ein Scrollen notwendig ist. Daher wurde im Status der Anmeldung an Dropbox der Seitentitel ausgeblendet, um entsprechenden Platz zu schaffen.</li> <li>Fehler bei den Aktivitäten behoben. Wurde einem Projekt nur eine einzige Aktivität zugewiesen, wurde bei einem Zeiteintrag diese nicht zugewiesen. Dieser Fehler trat bei mehreren Aktivitäten pro Projekt nicht auf.</li> <li>Erweiterung inaktiver Projekte. Projekte konnten seit einigen Versionen als <font face="Courier New">inaktiv</font> markiert werden. Bis dato wurden inaktive Projekte allerdings nur bei der Projektauswahl für Zeiteinträge nicht mehr angezeigt. Seit Version 1.8 werden inaktive Projekte für die Projekt-Übersicht ebenfalls nicht mehr berücksichtigt.</li> <li>Anpassung Icons für Startmenü-Kacheln. Die in den Kacheln des Startmenüs verwendeten Icons wurden hochskaliert und wirkten daher ein wenig unscharf. Diese wurden nun ein wenig verkleinert, wodurch sich ein besseres Erscheinungsbild ergibt.</li> </ul> <p>Im Hintergrund gab es einige weitere Anpassungen, die sich jedoch nicht sichtbar für den Benutzer auswirken, jedoch zusätzlich für eine bessere Performance und einer höheren Stabilität sorgen sollen.</p> <p>Die Version 1.8 wird in den kommenden Tagen (nach Abschluss der Tests) eingereicht und sollte bald verfügbar sein (eine entsprechende Meldung werde ich natürlich verbreiten). Herzlichen Dank für all die hilfreichen Rückmeldungen. Weitere Verbesserungen sind natürlich angedacht, so wie es aussieht auch eine Version für Windows 8.</p> http://devtyr.norberteder.com/post/Working-Hours-Tracker-18-(WP).aspx Norbert Eder [MVP] 4188 2013-03-11T08:00:00 Backupstragegie für Dummies gesucht <p><a href="http://devtyr.norberteder.com/image.axd?picture=image_196.png"><img title="OCZ Solid State Drive" style="border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-top-width: 0px" border="0" alt="OCZ Solid State Drive" src="http://devtyr.norberteder.com/image.axd?picture=image_thumb_119.png" width="900" height="431" /></a></p> <p>Irgendwann trifft es jeden. Schnelles Hochfahren des Standrechners, um mal eben etwas nachzusehen. Der Versuch endete jäh, kein bootfähiges Device angeschlossen. Der erste Verdacht bestätigte schnell, die SSD segnete das Zeitliche und befand sich auf dem Weg in die ewigen Jagdgründe. Wie war das nun noch einmal mit dem Backup?</p> <p>Zuerst: Ja, ich hatte ein Backup. Und nein, es wäre gar nicht so schlimm gewesen, da es nicht meine Daten-Platte traf, sondern die Boot/OS-HDD. Trotzdem überdenkt man in so einem Falle seine Backup-Strategie, so man sie überhaupt so nennen kann. Wie handhabe ich das aktuell? Eigentlich nicht optimal:</p> <ul> <li>Externe Platten mit entsprechender Größe, die wichtigsten Daten befinden sich zudem zusätzlich außer Haus (man weiß ja nie, was passiert). </li> <li>Daten werden manuell auf diese Platten überspielt. Natürlich geschieht dies schon über Scripts, dennoch muss man sich aktiv darum kümmern. Einfach mal einstöpseln, Daten werden geschaufelt, abstöpseln und beim nächsten Mal geht es weiter spielt sich da nicht. </li> <li>Sourcecode liegt bei mir auf <a title="GitHub" href="http://github.com" target="_blank">GitHub</a> oder <a title="Bitbucket" href="http://bitbucket.org" target="_blank">Bitbucket</a> und bedarf keiner separaten Behandlung. Den brauche ich auch ständig unterwegs, daher auch online. </li> <li>Oft benötigte und wenig sensible Daten/Dokumente landen auf Dropbox und sind so auf allen meinen Rechnern/Gadgets verfügbar. Da muss man sich auch nicht weiter darum kümmern, es funktioniert. </li> </ul> <p>Der Großteil meiner Daten besteht aus Fotos, ist doch die Fotografie eine meiner größten Leidenschaften. RAW-Format und jahrelanges Knipsen geben da schon einige hundert Gigabyte her. Dagegen gibt die restliche Datenmenge kaum etwas her.</p> <p>Bei heutigen Gesprächen auf <a href="https://twitter.com/norberteder/status/310720864977031168" target="_blank">Twitter</a> kamen die unterschiedlichsten Lösungen auf. Eine davon behandelte das Thema “Online Storage” in zahlreichen Ausprägungen. Sei es nun <a title="Dropbox" href="http://dropbox.com" target="_blank">Dropbox</a>, <a title="Box" href="http://box.com" target="_blank">Box</a>, oder aber auch Backup-Lösungen á la <a title="CrashPlan" href="http://www.crashplan.com/" target="_blank">CrashPlan</a> und Konsorten. Hierzu stellt sich - für mich - diese eine Frage:</p> <blockquote> <p>Möchte ich meine privaten Daten wirklich zur Gänze online haben?</p> </blockquote> <p>Hierzu fällt mir gleich mal <a title="SkyDrive: Microsoft durchsucht Nutzer-Daten in der Cloud nach AGB-Verletzungen und sperrt Accounts" href="https://netzpolitik.org/2012/skydrive-microsoft-durchsucht-nutzer-daten-in-der-cloud-nach-agb-verletzungen-und-sperrt-accounts/" target="_blank">diese Meldung</a> ein. Oder aber auch <a title="Google Deletes Last 7 Years Of User&#39;s Digital Life, Shrugs" href="http://consumerist.com/2011/07/22/google-deletes-last-7-years-of-users-digital-life-shrugs/" target="_blank">das hier</a>. Dass private Daten durchsucht, indiziert und ausgewertet werden ist vielleicht aus Sicht eines Unternehmens zu verstehen, aus Benutzersicht jedoch unverständlich. Denke ich jetzt an meine zahlreichen Fotos, dann … nein, die will ich lieber bei mir haben. Abgesehen davon gibt es auch keinen einzigen Anbieter, der eine solide Lösung für meine 350GB+ an Fotodaten anbieten kann.</p> <p>Neben den Fotos gibt es auch noch andere Daten, die ich lieber in meiner Nähe habe und nicht diversen Online-Anbietern in den Rachen schieben möchte (Verträge u. Ä.). Für alles andere verwende ich Dropbox. Da liegen aber ohnehin nur ein paar Slides, ein paar angefangene Blogbeiträge und ähnlich “unwichtige” Daten darauf. </p> <p>Damit wäre also nun geklärt, dass meine Daten auch weiterhin bei mir bleiben. So wie bisher. Nur besser soll es sein. Noch einmal zur Wiederholung: Aktuell wird auf zahlreiche Festplatten gesichert. Eine zentrale Lösung gibt es nicht. </p> <p>Nun, worin liegen nun eigentlich meine Anforderungen?</p> <ul> <li>Zentraler Storage </li> <li>Für alle Rechner im Haushalt benutzbar </li> <li>Ausgereifte Client-Software zur automatischen Datensicherung ohne manuell eingreifen zu müssen (Einrichtung exklusive) </li> <li>Automatische Verteilung der Daten auf mehrere Platten </li> <li>Geringer Stromverbrauch </li> <li>Zugriff von extern nicht notwendig, eigentlich auch gar nicht erwünscht </li> <li>Einfaches Rückspielen der Daten zu einem bestimmten Stand </li> <li>Kompatibilität zu jeder möglichen Hard-/Software-Konstellation (Microsoft, Apple, …) </li> <li>Idealerweise Zugriff von mobilen Geräten auf gespeicherte Daten </li> </ul> <p>Aufgrund der geführten Gespräche habe ich mir nun ein paar Lösungen angesehen, darunter <a title="Synology DS213air" href="http://www.synology.at/products/spec.php?product_name=DS213air" target="_blank">Synology DS213air</a> und die günstigere Variante <a title="Synology DS212j" href="http://www.synology.at/products/spec.php?product_name=DS212j" target="_blank">Synology DS212j</a>. Beide scheinen grundsätzlich recht gute Bewertungen zu haben und sollten auch meine Anforderungen erfüllen. Lediglich fehlt mir auf diesem Gebiet ein wenig die Erfahrung, wodurch ich auf zahlreiches Feedback hoffe :) </p> <p>Zu guter Letzt auch interessant, was <a title="How to set up CrashPlan Cloud Backup headless on a Synology NAS - Backup Strategies" href="http://www.hanselman.com/blog/HowToSetUpCrashPlanCloudBackupHeadlessOnASynologyNASBackupStrategies.aspx" target="_blank">Scott Hanselman</a> zu diesem Thema schreibt, der ebenfalls auf Synology setzt - und einem durchaus komplexeren Setup als ich es benötige.</p> <p><strong>Update</strong></p> <p>Nach einer genaueren Recherche und einigen Gesprächen habe ich mich dazu entschlossen, auf die <a title="Synology DiskStation DS212j" href="http://www.synology.com/products/spec.php?product_name=DS212j">Synology DiskStation DS212j</a> zu setzen. Als Festplatten werden wohl 2 <a title="Western Digital WD30EFRX Red 3TB" href="http://www.amazon.de/Western-Digital-WD30EFRX-Festplatte-NAS-Storage/dp/B008JJLW4M">Western Digital WD30EFRX Red 3TB</a> zum Zuge kommen. Ob die spezielle NAS-Auslegung der Platten tatsächlich einen Vorteil gegenüber reiner Desktop-Platten bringt, oder doch nur ein Marketing-Gag ist, kann ich nicht beurteilen. Fakt ist jedoch, dass die NAS-Platten eine längere Garantie (3 Jahre im Vergleich zu 2 Jahren) besitzen.</p> <p>Meine bisherigen Backup-Platten werden ein Backup der Station via USB beziehen. Eine davon wird grundsätzlich außerhalb des Eigenheims aufbewahrt.</p> http://devtyr.norberteder.com/post/Backupstragegie-fur-Dummies-gesucht.aspx Norbert Eder [MVP] 4189 2013-03-10T17:38:23 Gullap - Static Website Generator für .NET/Mono <p>Dass es mir <a title="Markdown" href="http://daringfireball.net/projects/markdown/" target="_blank">Markdown</a> angetan hat ist nun wirklich kein Geheimnis mehr. Dass ich es f&uuml;r m&ouml;glichst viele Anwendungsbereiche zum Einsatz bringen m&ouml;chte, auch nicht. In den letzten Tagen und Wochen hatte ich mir zum Ziel gesetzt, meine Website <a title="http://devtyr.com" href="http://devtyr.com" target="_blank">http://devtyr.com</a> auf Vordermann zu bringen. HTML schreiben mag ich nicht, ein Blogsystem ist daf&uuml;r &uuml;berdimensioniert. Warum also nicht den Inhalt mit Markdown schreiben und die Site generieren lassen. Sch&ouml;n, aber Ruby und Co. muss ich daf&uuml;r nicht extra installieren, wenn ich doch .NET ohnehin installiert habe und zudem favorisiere. L&ouml;sungen diesbez&uuml;glich gibt es nicht sehr viele. Abgesehen von <a title="pretzel" href="https://github.com/Code52/pretzel" target="_blank">pretzel</a> ist mir keine .NET-L&ouml;sung bekannt. Und selbst diese L&ouml;sung erscheint mir zu kompliziert f&uuml;r mein Vorhaben zu sein. Also muss eine Umsetzung her.</p> <p>Ein paar wenige Stunden arbeit, dann noch ein wenig Templates basteln, den Content schreiben und fertig war die L&ouml;sung inkl. Website. Herausgekommen ist <a title="Gullap - Static Website Generator for .NET/Mono" href="https://github.com/devtyr/gullap" target="_blank">Gullap</a>. Dabei handelt es sich um ein einfaches Werkzeug zur Konvertierung von Markdown in eine Website unter Verwendung von Templates.</p> <h2>Vorteil</h2> <p>Durch das Schreiben von Markdown-Dateien kann man sich vollst&auml;ndig auf den Inhalt konzentrieren, kein HTML ist notwendig. Nebenger&auml;usche k&ouml;nnen also ausgeblendet werden. Durch den Einsatz von distraction-free Editoren wird dies noch weiter verbessert.</p> <p>Gerade auch f&uuml;r einfache Seiten ist ein Blogsystem oder CMS totaler Overhead. Meist wird eine Datenbank ben&ouml;tigt usw. Das kostet Ressourcen und muss nicht sein.</p> <h2>Features</h2> <ul> <li>Basierend auf <a title="Mono" href="http://www.mono-project.org">Mono</a> arbeitet Gullap sowohl unter Windows als auch unter Linux</li> <li>Unterst&uuml;tzung Markdown</li> <li>Unterst&uuml;tzung Mustache (Templating Engine)</li> <li>Erstellung eines Men&uuml;s aus den Inhaltsdateien heraus <ul> <li>Dateien k&ouml;nnen sowohl Inhalte als auch</li> <li>Links auf externe Ressourcen beinhalten</li> </ul> </li> <li>Unterst&uuml;tzung f&uuml;r Sub-Men&uuml;s (beispielsweise Sidebars)</li> <li>HTML kann nat&uuml;rlich auch innerhalb der Markdown-Dateien verwendet werden</li> </ul> <h2>Showcase</h2> <p><a title="http://devtyr.com" href="http://devtyr.com" target="_blank">http://devtyr.com</a> wurde komplett mit Gullap erstellt.</p> <h2>Ressourcen</h2> <p>Weiterf&uuml;hrende Informationen sind unter folgenden Ressourcen zu finden:</p> <ul> <li><a title="Gullap - Static Website Generator for .NET/Mono" href="http://devtyr.com/gullap.html" target="_blank">Gullap Projekt</a></li> <li><a title="Gullap GitHub Repository" href="https://github.com/devtyr/gullap" target="_blank">GitHub Repository</a></li> </ul> <h2>Feedback</h2> <p>Feedback ist nat&uuml;rlich immer eine tolle Sache. Deswegen freue ich mich &uuml;ber jegliche Meldungen und Hinweise. Gerne hier, oder via <a title="Norbert Eder auf Twitter" href="http://twitter.com/norberteder" target="_blank">Twitter</a>.</p> http://devtyr.norberteder.com/post/Gullap-Static-Website-Generator-fur-NETMono.aspx Norbert Eder [MVP] 4179 2013-02-22T21:38:00 Skype läuft unter Ubuntu 12.10 nicht <p>Hin und wieder treibt es mich in die Linux-Gefilde. Fr&uuml;her hatte ich jahrelang Linux installiert, zuerst SuSE, dann Fedora Core. Seitdem war ich nun lange Zeit fast ausschlie&szlig;lich unter Windows unterwegs. Durch die letzten Ubuntu-Ank&uuml;ndigungen bin ich jedoch wieder etwas auf den Geschmack gekommen und musste mir gleich die <a title="Download Ubuntu" href="http://www.ubuntu.com/download" target="_blank">aktuellste Version</a> installieren. Einer der ersten Auftr&auml;ge dabei: die grundlegende Software installieren. Ging in den meisten F&auml;llen gut. Skype wollte nicht. L&ouml;sungen finden sich im Internet viele, aber irgendwie gehen 99% an der eigentlichen Ursache vorbei. Hier wie es funktioniert.</p> <p>Die meisten werden nun Skype im <strong>Ubuntu Software-Center</strong> suchen. Es wird dort allerdings nicht gelistet. Bevor man hier gro&szlig;artig auf die Suche geht, ein Blick auf die <a title="Skype for Linux" href="http://www.skype.com/en/download-skype/skype-for-linux/" target="_blank">Skype-Website</a> und los kann es gehen. Nach dem Herunterladen &ouml;ffnet man das Paket im Software-Center und wird sofort mit einem Hinweis begr&uuml;&szlig;t:</p> <p><img src="http://devtyr.norberteder.com/image.axd?picture=2013%2f2%2f21.png" alt="Falsche Architektur i386" width="900px" /></p> <p>Der zweite Ansatz ist nun wohl heraus zu finden, warum Skype nicht gelistet ist. Mit ein wenig Suchen erf&auml;hrt man, dass man eine neue Paketquelle (Canonical Partners) hinzuf&uuml;gen muss, dort sei das Paket gelistet. Gesagt, getan, hilft nicht, das Skype-Paket scheint nicht auf (nach ein paar Reboots war es dann da, aber das nur am Rande). Also der Versuch, Skype manuell zu installieren. Dazu gibt es eine <a title="Installing Skype under Ubuntu" href="https://help.ubuntu.com/community/Skype" target="_blank">Anleitung</a> von Ubuntu. Schlussendlich stellt sich heraus, dass diese veraltet ist, davon abgesehen l&auml;uft man in ein Problem von <a title="I Can not install skype on Ubuntu 12.10" href="I%20Can%20not%20install%20skype%20on%20Ubuntu%2012.10" target="_blank">fehlenden Abh&auml;ngigkeiten</a>.&nbsp;</p> <p>Irgendwie ist das alles nicht das Gelbe vom Ei. Dann kam der Einfall.&nbsp;</p> <h2>L&ouml;sung</h2> <p>Das von mir betriebene Systeme ist ein 64-bit System. Nach ein wenig Recherche stellt sich heraus, dass Skype eine 32-bit Anwendung ist. Seit Version 11.04 bietet Ubuntu an, 32-bit Anwendungen in einer 64-bit Umgebung ausf&uuml;hren zu k&ouml;nnen (<a title="Ubuntu MultiarchSpec" href="https://wiki.ubuntu.com/MultiarchSpec" target="_blank">Multiarch</a>). War dies in den anf&auml;nglichen Versionen noch per Default aktiviert, ist dies in Version 12.10 nicht mehr der Fall. Um also Skype installieren zu k&ouml;nnen, muss dieser Modus aktiviert werden:</p> <pre class="brush: bash;">sudo dpkg --add-architecture i386</pre> <p>Anschlie&szlig;end bedarf es ein</p> <pre class="brush: bash;">apt-get update</pre> <p>Nun einfach nochmals die Installation starten, sie sollte ohne Probleme durchlaufen.</p> http://devtyr.norberteder.com/post/Skype-lauft-unter-Ubuntu-1210-nicht.aspx Norbert Eder [MVP] 4178 2013-02-22T15:50:00 Süße Verführung mit Chocolatey, dein apt-get für Windows Chocolatey ist ein Paketverwaltungssystem (Advanced Packaging System) für Windows a&#8217;la apt-get in der Linux Umgebung. Mit Chocolatey kann man mittels Konsole, aus einem Repository heraus, Applikation-Packages auf seinem Windows System installieren und auch wieder deinstallieren. Die Befehle dabei lauten cinst &#60;programmname&#62; zum installieren von Packages und cuninst &#60;programmname&#62; zum deinstallieren. Mit cup kann man ein.. http://feedproxy.google.com/~r/BigglesBlog/~3/HJvDMfqK2QQ/se-verfhrung-mit-chocolatey-dein-apt-get-fr-windows Mario Priebe 4177 2013-02-22T07:04:58 Programmieren für Kids II Vor einiger Zeit schrieb ich mal über Small Basic, eine IDE für Kinder zum Einsteigen in die Programmierung. Für Kinder unter 10-12 Jahre jedoch nicht geeignet, wie ich finde. Aber selbst auch dann nicht, wenn keine Englisch-Sprachkenntnisse vorhanden&#160; sind. Anders ist das mit &#62;Kodu – Game Lab, eine weitere Entwicklung aus dem Hause Microsoft. Kodu.. http://feedproxy.google.com/~r/BigglesBlog/~3/rNvfmgGrqKg/programmieren-fr-kids-ii Mario Priebe 4175 2013-02-21T13:19:14 Tuple Eigenschaften lesbar gestalten? Die Verwendung von Tuple ist eine schnelle Lösung, wenn man beispielweise mehr als ein Parameter oder Rückgabewert benötigt. Ein Anwendungsfall wäre für mich, eine (semantische) Fehlermeldung anstelle von Exceptions. Also ein boolean und ein string als Rückgabewert “Tuple&#60;bool, string&#62;()”. Im string steht dann halt ein Grund drin, warum das Ganze schief gelaufen ist. So weit,.. http://feedproxy.google.com/~r/BigglesBlog/~3/D23vgeklM3A/tuple-eigenschaften-lesbar-gestalten Mario Priebe 4174 2013-02-21T10:15:22 Basta on Tour 2013 BASTA! on Tour 2013 – Das große .NET Trainingsevent Vom 24. bis 26. April 2013 findet die nächste BASTA! on Tour in Düsseldorf statt. Das große Trainingsevent ist eine Tochterveranstaltung der BASTA! &#8211; der größten unabhängigen .NET-Konferenz in Deutschland.&#160; Der Fokus der BASTA! on Tour liegt mit insgesamt 12 intensiven Workshops, einem Abendvortrag und einem.. http://feedproxy.google.com/~r/BigglesBlog/~3/wuz3nQTV4lQ/basta-on-tour-2013 Mario Priebe 4164 2013-02-12T17:58:04 Dropbox + Markdown = Blog <p>Über <a title="Markdown" href="http://daringfireball.net/projects/markdown/" target="_blank">Markdown</a> habe ich in der letzten Zeit wahrlich viel geschrieben (siehe <a title="Markdown for the win" href="http://devtyr.norberteder.com/post/Markdown-for-the-win.aspx">hier</a>, <a title="Markdown-Unterstützung für Sublime Text" href="http://devtyr.norberteder.com/post/Markdown-Unterstutzung-fur-Sublime-Text.aspx">hier</a>, <a title="Konzepte, Dokumentationen etc. mit node.js und Markdown" href="http://devtyr.norberteder.com/post/Konzepte-Dokumentationen-etc-mit-nodejs-und-Markdown.aspx">hier</a> und <a title="Jekyll unter Windows einrichten" href="http://devtyr.norberteder.com/post/Jekyll-unter-Windows-einrichten.aspx">hier</a>). Dass ich also sehr stark darauf aufbaue und auch Teile meiner “Infrastruktur” danach ausrichte liegt nun auf der Hand. Im aktuellen Anlassfall wollte ich ein neues Blog aufbauen, konkret geht es um <a title="News von DevTyr" href="http://news.devtyr.com" target="_blank">http://news.devtyr.com</a>. Dabei sollte kein herkömmliches Blogsystem zum Einsatz kommen, lieber etwas Markdownbasierendes und das wenn möglich einfach zu pflegend und ohne allzu viel Verwaltungsaufwand.</p> <p>Nach ein wenig Recherche stieß ich auf den Dienst <a title="scriptogr.am" href="http://scriptogr.am" target="_blank">scriptogr.am</a>. Dieser gestaltet sich recht einfach: Es gilt sich über <a title="Dropbox" href="http://dropbox.com" target="_blank">Dropbox</a> zu verbinden. Dabei wird ein entsprechender Ordner angelegt, inklusive Beispieldaten. Und schon kann das Erfassen von Posts losgehen. Die notwendigen Rahmenbedingungen sind gering, so müssen lediglich ein paar Flags im Header eines jeden Files gesetzt werden:</p> <blockquote> <p><font face="Courier New">Date: 2012-02-11 12:00 <br />Title: Manage your sprints using Trello <br />Tags: DevTyr, Trello, scrum, sprints</font></p> </blockquote> <p>Zusätzlich kann per <font face="Courier New">Deployed: false</font> definiert werden, dass ein Posting nicht veröffentlicht werden soll. Auch einzelne Seiten (<font face="Courier New">Type: page</font>) sind möglich. Der einzige notwendige Schritt nach Abschluss des Schreibens ist das Starten der Synchronisation, diese findet nicht automatisch statt, ist aber auch kein Beinbruch.</p> <p>Im Standard wird das Blog dann unter http://scriptogr.am/[Name] gehostet, kann jedoch über einen entsprechenden A-Record bzw. CNAME-Eintrag am eigenen DNS-Server auf eine eigene (Sub-)Domain gedreht werden.</p> <p>Der für mich ergebende Vorteil ist nun, dass ich meine Blogeinträge mit jedem erdenklichen Editor schreiben kann, eine etwaige Markdown-Unterstützung ist nett, aber nicht zwingend erforderlich. Für die anderen Blogs verwende ich bis dato den <strong>Windows Live Writer</strong>, den möchte ich aber zusehends los werden, ein Schreiben direkt über die Website kommt für mich nicht in Frage, da fühlt sich ein echter Editor immer noch wesentlich besser an (ist man beispielsweise <a title="SublimeText Editor" href="http://www.sublimetext.com/" target="_blank">SublimeText</a> gewöhnt, oder aber - wie bereits <a title="Markdown for the win" href="http://devtyr.norberteder.com/post/Markdown-for-the-win.aspx">berichtet</a> - <a title="WriteMonkey" href="http://writemonkey.com/" target="_blank">WriteMonkey</a>). </p> <blockquote> <p>Für meine anderen Blogs werde ich mir einen ähnlichen Schritt überlegen. Eine große Frage ist dabei natürlich das Übernehmen von Altdaten, Erhalten der Permalinks etc. Die genaue Lösung weiß ich noch nicht, eventuell stricke ich mir da auch eine eigene Lösung, die Zeit wird es zeigen. Auf jeden Fall kann ich sagen, dass es dies wesentlich einfacher gestaltet, an seinen Texten/Beiträgen zu schreiben - und das ablenkungsfrei, oder neu-deutsch: <strong>distraction-free</strong>.</p> </blockquote> <p>Auf jeden Fall läuft diese Lösung vorerst im Probebetrieb und wird von mir genutzt, über Neuigkeiten rund um mein privates Projekt <a title="DevTyr" href="http://devtyr.com">DevTyr</a> zu berichten. Zu gegebener Zeit werde ich sicherlich berichten, wie es mir damit ergeht und ob ich grundsätzlich mit dieser Lösung zufrieden bin.</p> http://devtyr.norberteder.com/post/Dropbox-+-Markdown-=-Blog.aspx Norbert Eder [MVP] 4162 2013-02-11T11:21:32 trello-burndown 0.7.0 erschienen <p>Seit wenigen Tagen ist <a title="http://devtyr.github.com/trello-burndown/" href="http://devtyr.github.com/trello-burndown/" target="_blank">trello-burndown</a> in der Version 0.7.0 verfügbar. Nun können Sprint-Konfigurationen bequem über eine Oberfläche verwaltet werden. Weiterführende Ideen gibt es massiv, zuvor jedoch ein paar Worte zur neuen Version und den Mitteln, die dafür zum Einsatz kommen. Weitere Informationen gibt es auch <a title="Burndown Charts für Trello Benutzer" href="http://devtyr.norberteder.com/post/Burndown-Charts-fur-Trello-Benutzer.aspx" target="_blank">hier</a> und <a title="trello-burndown 0.6.0 erschienen" href="http://devtyr.norberteder.com/post/trello-burndown-060-erschienen.aspx" target="_blank">hier</a>.</p> <blockquote> <p>Weiterführende Informationen finden sich auf <a href="http://devtyr.github.com/trello-burndown/">http://devtyr.github.com/trello-burndown/</a>. Das Node-Modul kann auch via <a href="https://npmjs.org/">NPM</a> installiert werden, Informationen siehe <a href="https://npmjs.org/package/trello-burndown">https://npmjs.org/package/trello-burndown</a>.</p> </blockquote> <h2>Neue Features</h2> <p><strong>Konfiguration anlegen.</strong> Eine neue Sprint-Konfiguration kann nun über die Weboberfläche angelegt werden. Alle relevanten Informationen werden dabei so aufbereitet, dass die Konfiguration einfach von der Hand geht. </p> <p><strong>Konfiguration bearbeiten.</strong> Ebenfalls ist es über die Oberfläche möglich, aktive Konfigurationen zu bearbeiten. Eine aktive Konfiguration ist dadurch definiert, dass das Tagesdatum kleiner gleich dem Enddatum des entsprechenden Sprintes ist.</p> <blockquote> <p><strong>Hinweis</strong>: Da aktuell nur ein einzelnes Board verwendet wird, ist beim Aktualisieren der Sprint-Statistiken natürlich darauf zu achten, dass ich nicht mehrere Sprints in die Quere kommen. Bei der Verwaltung von einem Team pro Board, sollte das nicht weiter tragisch sein, dennoch muss darauf hingewiesen werden.</p> </blockquote> <p><strong>Verbesserung Templates.</strong> Für den Benutzer der Weboberfläche nicht ersichtlich, hat sich jedoch auch unter der Haube hinsichtlich des Templatings einiges getan. Die einzelnen Templates sind nun kleiner geworden, Bereiche die mehrmals verwendet werden, sind nun als eigenständige Templates verfügbar und können so für alle Vorkommen abgeändert werden.</p> <h2>Screenshots</h2> <p>Der Home-Screen:</p> <p><img title="trello-burndown Home" alt="trello-burndown Home" src="http://i.imgur.com/kXLFm6Z.png" width="900" height="494" /></p> <p>Die Auswertung:</p> <p><img title="trello-burndown Auswertung" alt="trello-burndown Auswertung" src="http://i.imgur.com/r0NPHaC.png" width="900" height="919" /></p> <p>Bearbeitungsmodus:</p> <p><img title="trello-burndown Sprint bearbeiten" alt="trello-burndown Sprint bearbeiten" src="http://i.imgur.com/7Yi9jHG.png" width="900" height="919" /></p> <h2>Technologien im Einsatz</h2> <p>Da ich mehrfach die Anfrage bekommen habe, welche Technologien für dieses Projekt verwendet werden, hier eine kurze Übersicht. Gerne kann man sich das Projekt auch auf <a title="trello-burndown auf GitHub" href="https://github.com/devtyr/trello-burndown" target="_blank">GitHub</a> ansehen. Gerne können auch Verbesserungen an Umsetzung/Code/etc. vorgenommen werden - auch ein Hinweis an mich zur Verbesserung ist wünschenswert, da sicherlich nicht alles perfekt ist, bin in einigen Bereichen schließlich selbst noch am Üben :)</p> <ul> <li><a title="Node.js" href="http://nodejs.org/" target="_blank">Node.js</a></li> <li><a title="Bootstrap from Twitter" href="http://twitter.github.com/bootstrap/" target="_blank">Bootstrap</a></li> <li><a title="Knockout.js" href="http://knockoutjs.com/" target="_blank">Knockout.js</a></li> <li><a title="mu2 Mustache based templating engine" href="https://github.com/raycmorgan/Mu" target="_blank">Mu2</a> (<a title="Mustache Templating Engine" href="http://mustache.github.com/" target="_blank">Mustache</a> Templating Engine)</li> <li><a title="tenXer xCharts" href="http://tenxer.github.com/xcharts/" target="_blank">xCharts</a></li> <li><a title="D3 Data-Driven Documents" href="http://d3js.org/" target="_blank">D3</a></li> </ul> <h2>Wie geht’s weiter?</h2> <p>Die nächste größere Erweiterung dreht sich um das Uploaden von Sprint-Tasks und das Einrichten der Sprints auf <a title="Trello" href="http://trello.com" target="_blank">Trello</a>. Dazu gibt es folgenden Plan (Feedback erwünscht!):</p> <ul> <li>Pro Sprint soll ein eigenes Board eingerichtet werden (aktuell muss mit Archivierung gearbeitet werden, um einen Überblick zu erhalten). </li> <li>Einrichten der notwendigen Listen (diese werden durch die Sprint-Konfiguration bestimmt)</li> <li>Hochladen von Tasks in der durch dieses Tool notwendigen Form</li> </ul> <blockquote> <p><strong>Überlegung</strong>: Beim Importieren von Tasks bin ich noch am Überlegen hinsichtlich Upload (z.B. als CSV) oder Integration von Office 365 bzw. Google Docs. Vermutlich ist jedoch eine alternative Variante (eben Direkt-Upload) eine sinnvolle, erste Variante.</p> </blockquote> <p>Viel Spaß damit!</p> http://devtyr.norberteder.com/post/trello-burndown-070-erschienen.aspx Norbert Eder [MVP] 4155 2013-02-04T09:24:17 Office 2013 – neue Features, neues Lizenzmodell Das neue Office wurde gerade als RTM freigegeben und im Herbst wurde es schon angedeutet, dass Microsoft bei der Lizenzierung neue Wege gehen wird. SaaS &#8211; Software as a Service &#8211; wird schon häufig angeboten und einen Schritt dahin hat Microsoft ja mit dem Office 365 gesetzt, aber mit der Veröffentlichung des neuen Office-Paketes geht [...] http://www.ebnerj.at/blog/?p=1262 Jürgen Ebner 4150 2013-01-29T23:42:55 MSSQL Shuffle Funktion zum anonymisieren von Daten Ich wollte einige Datensätze für die Testumgebung anonymisieren und heraus kam eine kleine Funktion, die ein zufälligen String generiert. Als Parameter wird der Funktion eine beliebige Zeichenfolge und die Angabe, wie lang der zufällige Wert sein soll, mitgegeben. Der erste Buchstabe im Resultat wird als Großbuchstabe zurückgegeben. 1 2 3 4 5 6 7 8.. http://feedproxy.google.com/~r/BigglesBlog/~3/HwrlL8PbYk0/mssql-shuffle-funktion-zum-anonymisieren-von-daten Mario Priebe 4147 2013-01-28T13:51:03 Early Bird Ende der BASTA! Spring BASTA! Spring 2013 – Nur noch bis Donnerstag bis zu 250 € sparen! Besuchen Sie die größte unabhängige Entwicklerkonferenz für Microsoft-Technologien im deutschsprachigen Raum und treffen Sie internationale Microsoft-Experten in über 75 Sessions, Power Workshops und Keynotes. Highlights sind bspw. eine Hacking Night School (http://basta.net/2013spring/sessions/) zum Thema Biggest #Fails in Cloud Computing, mit Matthias Luft,.. http://feedproxy.google.com/~r/BigglesBlog/~3/7zgQABj4lK0/early-bird-ende-der-basta-spring Mario Priebe 4145 2013-01-25T20:31:56 trello-burndown 0.6.0 erschienen <p>Im Beitrag <a title="Burndown Charts für Trello Benutzer" href="http://devtyr.norberteder.com/post/Burndown-Charts-fur-Trello-Benutzer.aspx">Bundown Charts für Trello Benutzer</a> habe ich bereits mein Tool für die Generierung von Burndown Charts aus Trello-Cards vorgestellt. Dieses hat nun ein größeres Update erfahren, das ich hier kurz vorstellen möchte. Wer Trello im Einsatz hat und vor der Verwendung von <a title="Node.js" href="http://nodejs.org/" target="_blank">Node.js</a> nicht zurück schreckt, sollte einen näheren Blick darauf riskieren.</p> <blockquote> <p>Weiterführende Informationen finden sich auf <a title="http://devtyr.github.com/trello-burndown/" href="http://devtyr.github.com/trello-burndown/">http://devtyr.github.com/trello-burndown/</a>. Das Node-Modul kann auch via <a title="Node Package Manager" href="https://npmjs.org/" target="_blank">NPM</a> installiert werden, Informationen siehe <a title="https://npmjs.org/package/trello-burndown" href="https://npmjs.org/package/trello-burndown">https://npmjs.org/package/trello-burndown</a>.</p> </blockquote> <h2>Neue Features</h2> <p><strong>Speichern der Konfigurationen</strong>. Mit der neuen Version ist es möglich, eine an die Generierung übergebene Konfiguration auch zu speichern. Diese werden in der Weboberfläche ausgelesen und für die Aktualisierung der Sprintdaten verwendet.</p> <p><strong>Aktualisierung Sprintdaten online</strong>. Sprintdaten können nun über die Weboberfläche aktualisiert werden. Alle aktiven Sprints (aktuelles Datum ist nicht höher als der letzte Sprinttag) werden in einer Liste zur Aktualisierung angeboten. Nach dem erfolgten Update wird automatisch auf die Ansicht mit den neuen Daten weitergeleitet.</p> <p><strong>Bootstrap</strong>. Für die Visualisierung der Weboberfläche kommt <a title="Bootstrap" href="http://twitter.github.com/bootstrap/" target="_blank">Bootstrap</a> zum Einsatz. Damit sieht die neue Version nicht nur hübscher aus als die alte, sondern bietet auch eine Unterstützung für mobile Endgeräte etc. an.</p> <h2>Screenshots</h2> <p>Nachfolgend ein paar Screenshots der Web-Oberfläche, für die unter anderem Bootstrap zum Einsatz kommt (im Hintergrund werden <a title="Mustache Templating Engine" href="http://mustache.github.com/" target="_blank">Mustache</a> 5 Templates verwendet, kann also vollständig angepasst werden).</p> <h3>Home</h3> <p><img title="trello-burndown Home Screen" alt="trello-burndown Home Screen" src="http://i.imgur.com/OhmSGO3.png" width="900" height="473" /></p> <h3>Sprint-Auswertung</h3> <p><a href="http://devtyr.norberteder.com/image.axd?picture=image_195.png"><img title="trello-burndown Sprint-Auswertung" style="border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; border-left: 0px; display: inline; padding-right: 0px" border="0" alt="trello-burndown Sprint-Auswertung" src="http://devtyr.norberteder.com/image.axd?picture=image_thumb_118.png" width="900" height="600" /></a></p> <h2>Wie geht es weiter?</h2> <p>Die To-Do-Liste ist noch lange. Darunter unter anderem folgende Punkte:</p> <ul> <li>Online-Verwaltung der Konfigurationen</li> <li>Zusätzliche hilfreiche Auswertungen und Statistiken</li> </ul> <h2>Feedback</h2> <p>Fehlt eine Funktionalität? Hast du <a title="Trello" href="http://trello.com" target="_blank">trello</a>-burndown im Einsatz? Dann schreib mir doch bitte.</p> http://devtyr.norberteder.com/post/trello-burndown-060-erschienen.aspx Norbert Eder [MVP] 4140 2013-01-23T08:48:47 Workflowly – Organisationstool/Outliner Für alle die ein schlankes Tool zum sortieren von Gedanken sortieren oder erstellen von ToDo Listen sucht, ist bei Workflowly gut aufgehoben. Hier ist der Link zur Webapp: https://workflowy.com/?ref=f2509a1.tw Workflowly ist nicht nur als Webapp verfügbar sondern auch auf iPhone &#38; iPad. Den Punkten auf der Liste kann man auch Tags mittels # hinzufügen http://www.ebnerj.at/blog/?p=1253 Jürgen Ebner 4130 2013-01-18T16:21:19 Warum Outlook.com und nicht gmail? Im August 2012 wurde Hotmail von outlook.com abglöst und ist in erster Linie für Privatkunden gedacht. Microsoft verpasst dem Maildienst nicht nur einen neuen Namen sondern auch einen neues UI, wie bei fast allen Microsoft Produkten. Durch das Kacheldesign ist der Maildienst einfach zu bedienen. Outlook.com enthält neben den Maildienst auch noch Dienste wie Kalender, [...] http://www.ebnerj.at/blog/?p=1250 Jürgen Ebner 4128 2013-01-16T17:01:11 Smartphone-Notifications direkt auf dein Desktop Nachrichten die auf deinem Smartphone eintreffen, kannst du als Notification auf deinem Rechner anzeigen. Chrome als Browser vorausgesetzt für das Ganze. Hierfür musst du lediglich auf deinem Android die App “Desktop-Notifications” und in deinem Chrome die “Android Desktop Notifications Erweiterung” installieren. Jetzt, nur noch den Code, der auf deinen Smartphone generiert wurde, in die Erweiterung.. http://feedproxy.google.com/~r/BigglesBlog/~3/gVBKyxejg5k/smartphone-notifications-direkt-auf-dein-desktop Mario Priebe 4124 2013-01-15T15:09:37 Burndown Charts für Trello Benutzer <p><a title="Trello" href="http://trello.com" target="_blank">Trello</a> findet in den letzten Monaten viel Anklang und wird häufig für Projekte in unterschiedlicher Ausprägung verwendet. Ich setze das Tool mittlerweile auch für die Abhandlung unserer Sprints ein. Natürlich würde könnte dies auch analog geschehen, aufgrund eines verteilten Teams setze ich dann aber doch lieber auf die digitale Variante, zumal sich einige “Prozesse” dadurch automatisieren lassen. Einer diese Punkte war die Generierung von <a title="Release Notes aus Trello und Hosten per Node.js" href="http://devtyr.norberteder.com/post/Automatisches-Generieren-von-Release-Notes-aus-Trello-und-Hosten-per-Nodejs.aspx" target="_blank">Release Notes</a>. Um aber auch während eines Sprints am aktuellen Stand zu sein, benötigen wir ein Burndown Chart. Also mal eben umsetzen …</p> <h2>Preconditions</h2> <p>Folgende Bedingungen müssen erfüllt sein, damit trello-burndown verwendet werden kann:</p> <ul> <li>Node.js (getestet &gt;= 0.8)</li> <li>Trello-Account</li> </ul> <p>Um aus Trello-Cards ein Burndown Chart generieren zu können, bedarf es natürlich der entsprechend abgebildeten Zahlen. Diese können beispielsweise in den Titel einer Trello-Card kodiert werden. Das von mir implementierte <a title="Node.js" href="http://nodejs.org/" target="_blank">Node.js</a> Modul <a title="trello-burndown Node.js Modul" href="https://github.com/devtyr/trello-burndown" target="_blank">trello-burndown</a> setzt hierbei folgende Abbildung voraus:</p> <blockquote> <p><font face="Courier New">[p|est-e] title</font></p> </blockquote> <p>Die einzelnen Bestandteile kurz erklärt:</p> <p><strong>p</strong>: Priorität/Reihenfolge des Tasks; dient hauptsächlich der Erhaltung der Priorität über unterschiedliche Listen hinweg <br /><strong>est</strong>: Der geschätzte Aufwand dieses Tasks, entspricht dem Output der Sprintplanung <br /><strong>e</strong>: Der tatsächliche Aufwand für diesen Task, dient der Verbesserung der Schätzfähigkeit des Teams <br /><strong>title</strong>: Der eigentliche Titel des Tasks/der Card</p> <p>Werden alle Cards nach diesem Schema erfasst, kann das Tool bereits eingesetzt werden. Die Verwaltung der Sprints sieht bei uns aktuell so aus:</p> <ul> <li>Sprint [Nr]</li> <li>In progress</li> <li>[Version]</li> </ul> <p>Dies wird als Listen abgebildet. Die Liste “[Version]” stellt die abgeschlossenen Tasks dar. Darauf basierend wird das Burndown-Chart berechnet.</p> <h2>Berechnung</h2> <p><a title="trello-burndown github" href="https://github.com/devtyr/trello-burndown" target="_blank">trello-burndown</a> nimmt diese ganzen Daten und generiert daraus eine Statistik, die pro definierten Sprint (dies geschieht alleinig durch den Aufruf der Generierung, siehe die verwendeten Parameter) abgelegt werden. Hierbei kann beispielsweise auch die Uhrzeit angegeben werden zu der das Standup-Meeting stattfindet. Dadurch lässt sich die Abbildung auch realistisch durchführen. Findet das Meeting beispielsweise täglich um 10:00 Uhr statt, werden alle Punkte, die davor in die “Abgeschlossen-Liste” verschoben werden, dem vorigen Tag zugerechnet.</p> <p>Genauere Hinweise zur Berechnung und Konfigurationsmöglichkeiten finden sich <a title="trello-burndown github" href="https://github.com/devtyr/trello-burndown/blob/master/README.md" target="_blank">hier</a>.</p> <h2>Darstellung</h2> <p>Über den Webserver kann auf die Auswertungen der Sprintdaten zugegriffen werden. Die Daten werden über xCharts und D3 visualisiert. In der aktuellen Variante wird ein Burndown-Chart und eine Gegenüberstellung des geschätzten und des tatsächlichen Aufwandes pro Tag angezeigt.</p> <h3>Burndown</h3> <p>Das Burndown Chart (zugegeben ein sehr schlechter Sprint, aber wir üben noch) sieht wie folgt aus:</p> <p><a href="http://devtyr.norberteder.com/image.axd?picture=image_193.png"><img title="Burndown Chart aus Trello" style="border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; border-left: 0px; display: inline; padding-right: 0px" border="0" alt="Burndown Chart aus Trello" src="http://devtyr.norberteder.com/image.axd?picture=image_thumb_116.png" width="700" height="225" /></a></p> <h3>Gegenüberstellung Aufwand pro Tag</h3> <p>Hier nun die Gegenüberstellung des geschätzten und des tatsächlichen Aufwandes pro Tag:</p> <p><a href="http://devtyr.norberteder.com/image.axd?picture=image_194.png"><img title="Gegenüberstellung Schätzung und Aufwand (aus Trello)" style="border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; border-left: 0px; display: inline; padding-right: 0px" border="0" alt="Gegenüberstellung Schätzung und Aufwand (aus Trello)" src="http://devtyr.norberteder.com/image.axd?picture=image_thumb_117.png" width="700" height="233" /></a></p> <p>&#160;</p> <h2>Features</h2> <p>Dieses Projekt steht auf Github zur Verfügung bzw. kann via <a title="Node Package Manager / trello-burndown" href="https://npmjs.org/package/trello-burndown" target="_blank">NPM</a> einfach bezogen werden. In der aktuellen Version 0.3.0 sind folgende Features enthalten:</p> <ul> <li>Unterstützung mehrerer Sprints</li> <li>Aufbereitung der relevanten Daten per Sprint (Generierung wird aktuell nicht on-the-fly, sondern via command line durchgeführt und kann über einen Job beispielsweise täglich gestartet werden).</li> <li>Webserver</li> <li>Aufbereitung und Anzeige der relevanten Daten als Burndown und Aufwands-Gegenüberstellung</li> <li>Anzeige von beliebigen Sprints</li> </ul> <p>In zukünftigen Versionen werden noch weitere Features hinzukommen. </p> <h2>Download / Dokumentation / Installation</h2> <p>Dieses Tool wird auf <a title="trello-burndown github" href="https://github.com/devtyr/trello-burndown" target="_blank">Github</a> gehostet. Dort findet sich daher die ständig aktuelle Version, als auch die <a title="trello-burndown Dokumentation" href="https://github.com/devtyr/trello-burndown/blob/master/README.md" target="_blank">Dokumentation</a>. Zur Verwendung kommt Node.js, wodurch dieses natürlich vorhanden sein muss. Die Installation kann dann einfach per</p> <blockquote> <p><font face="Courier New">npm install trello-burndown</font></p> </blockquote> <p>durchgeführt werden. Hinsichtlich Konfiguration und Anbindung an Trello sind einige Einstellungen vorzunehmen, diese finden sich jedoch auch in der Dokumentation beschrieben und sollte in ein paar Minuten erledigt sein.</p> <h2>Feedback</h2> <p>Für jegliches Feedback bin ich natürlich dankbar. Da es in meinem Fall produktiv im Einsatz ist, wird es sicherlich eine laufende Weiterentwicklung geben. Nichts desto trotz interessiert mich eure Meinung. Sollte es jemand in Einsatz nehmen oder in Erwägung ziehen, oder aber aus diversen Gründen überhaupt nicht, freue ich mich über eine entsprechende Rückmeldung.</p> http://devtyr.norberteder.com/post/Burndown-Charts-fur-Trello-Benutzer.aspx Norbert Eder [MVP] 4122 2013-01-14T10:11:17 Frohes neues Jahr 2013 All meinen Lesern und diejenigen die sich hierher verirrt haben wünsche ich ein frohes, gesundes und vor allem ein erfolgreiches neues Jahr 2013. Auf das Eure Wünsche alle in Erfüllung gehen. Bildquelle: Barnorama Dieser Beitrag stammt von Mario Priebe. Ähnliche Beiträge31. Dezember 2009 -- Ein gesundes neues Jahr 2010 (2)30. September 2009 -- Ohne Worte.. http://feedproxy.google.com/~r/BigglesBlog/~3/UozQ9kKDHYs/frohes-neues-jahr-2013 Mario Priebe 4107 2012-12-31T09:49:25 Rückblick 2012 Wieder ist ein Jahr zu Ende gegangen und leider habe ich es in diesem Jahr verabsäumt zu posten. Irgendwie war es ein stressiges Jahr und es ging zu rasch vorbei. Aber ich verspreche für 2013 Besserung und ich werde regelmäßiger Posten. Aber ich muss den Besuchern des Blogs danken, auch wenn nichts neues zu finden [...] http://www.ebnerj.at/blog/?p=1235 Jürgen Ebner 4106 2012-12-31T07:03:33 Neues Design, neue Kommentarfunktion und was noch so kommt im nächsten Jahr Ich wollte mich mal wieder zu Wort melden. Nicht das ihr denkt, dass ich mein Blog verweisen lasse :-) Mit einem neuem, aufgeräumten und responsive reaktionsfähigem Design und Disqus als neue Kommentarfunktion geht es gewappnet in das kommende Jahr. Also, was wird 2013 hier in meinem Blog passieren? Privates Zeuch Im privaten Bereich, ist das.. http://feedproxy.google.com/~r/BigglesBlog/~3/wfTHLKySmOI/neues-design-neue-kommentarfunktion-und-was-noch-so-kommt-im-nchsten-jahr Mario Priebe 4100 2012-12-26T10:26:25 Einführung zu Node Package Manager in Graz am 26.11.2012 <p><img title="JavaScript User Group Graz" alt="JavaScript User Group Graz" src="http://devtyr.norberteder.com/image.axd?picture=image_192.png" /></p> <p>Kommende Woche trifft sich wieder die <a title="JavaScript User Group Graz" href="https://plus.google.com/116023769200964243200" target="_blank">JavaScript User Group Graz</a>. Das Hauptthema wird der <strong>Node Package Manager</strong> sein. Im Anschluss bleibt natürlich wieder genügend Zeit und Raum für spannende Diskussionen. Außerdem wird es auch wieder Kleinigkeiten für das leibliche Wohl geben.</p> <p>Eckdaten zum Treffen:</p> <p><strong>Wann</strong>: 26. November 2012 18:00 Uhr <br /><strong>Wo</strong>: Seering 7/2, Unterpremstätten (UPPER Network GmbH) <br /><strong>Thema</strong>: Node Package Manager</p> <p>Wer daran teilnehmen möchte, möge sich bitte <a title="2. Graz JavaScript User Group Treffen" href="https://plus.google.com/events/cnad13g9j445mmpprpgr3bkn488" target="_blank">hier</a> anmelden.</p> http://devtyr.norberteder.com/post/Einfuhrung-zu-Node-Package-Manager-in-Graz-am-26112012.aspx Norbert Eder [MVP] 4056 2012-11-23T15:03:52 Code Reviews - Es wird weiter entwickelt <p>Heute hatten wir ein wirklich langes Team-Meeting. Sieben Stunden waren veranschlagt und wir haben sie auch wirklich gebraucht. Klingt lange. War es auch. Aber manchmal braucht es eine “Auszeit” um “zueinander” zu finden. Ein zentraler Bestandteil waren die Code Reviews. Neben - mittlerweile - zahlreichen Beiträgen zu diesem Thema hatte ich eine <a title="Umfrage: Wie geht ihr mit Code Reviews um" href="http://devtyr.norberteder.com/post/Umfrage-Wie-geht-ihr-mit-Code-Reviews-um.aspx">Umfrage</a> gestartet und auch die <a title="Auswertung Umfrage Code Reviews" href="http://devtyr.norberteder.com/post/Auswertung-Umfrage-Code-Reviews.aspx">vorläufigen Ergebnisse veröffentlicht</a>. Mittlerweile kamen zwar zahlreiche Stimmen hinzu, an der Aufteilung hat sich jedoch nichts verändert. Aber wie geht es weiter …</p> <p>Innerhalb des Teams mehrten sich die Stimmen, dass die <a title="Code Reviews im Daily Business - Ein Entwicklungsprozess" href="http://devtyr.norberteder.com/post/Code-Reviews-im-Daily-Business-Ein-Entwicklungsprozess.aspx">aktuelle Form der Code Reviews</a> nicht zielführend sei. Es wurde kritisiert, dass <strong>Verantwortlichkeiten</strong> fehlen. Was ist damit gemeint?</p> <p>Es sollten Bereiche und dafür Verantwortliche (zwei) definiert werden. Diese sollten Check-Ins für ihren jeweiligen Bereich reviewen und so eine bestimmte Qualität garantieren. Entsprechend der Umfrage wird das von einigen so gehandhabt. Ich war hier jedoch skeptisch und habe dieses Thema angesprochen. </p> <p>Schlussendlich konnte hier festgestellt werden, dass es hier grundsätzlich am Entwicklungsprozess mangelt. Hierzu vielleicht eine Erklärung wie ich selbst Code Reviews empfinde:</p> <blockquote> <p>Ein Code Review dient der Prüfung hinsichtlich Stabilität des Codes, dessen Verbesserung hinsichtlich der Lesbarkeit, Eleganz und der Angleichung aller Team-Mitglieder an Coding Standards als auch Techniken.</p> </blockquote> <p>In einem Code Review sehe ich <strong>nicht</strong> das Verteilen von Know How. Dies muss aus meiner Sicht in einem separaten Kommunikationsprozess stattfinden. Wenn aber nun die Forderung nach Verantwortlichen besteht, was sagt uns das? Es soll eine Prüfung hinsichtlich Funktionalität und “Integration” geben. Nun gut, man kann Bereiche definieren, auch Zuständigkeiten. Schlussendlich erreicht man jedoch eine Bürokratisierung des Code Reviews. Die Motivation daran teilzunehmen sinkt. Ein nicht erstrebenswerter Zustand.</p> <h2>Wie also in den Griff bekommen?</h2> <p>Der Entwicklungsprozess legt uns dabei alle Möglichkeiten in die Hände, sie müssen nur genutzt werden. Ein Anpassung und Erweiterung desselben fand schlussendlich auch den (vorerst) gültigen Konsens. Hier in aller Kürze:</p> <ol> <li>Entwicklung; Laufende Prüfung gegen die Spezifikation. Lücken müssen besprochen bzw. erfasst werden.</li> <li>Schreiben von Unit Tests bei Änderung bzw. bei Neuimplementierung. Auf Mocking von Services wird verzichtet. Behandelt werden atomare Bestandteile.</li> <li>Integrationstests testen das Zusammenspiel unterschiedlicher Komponenten und zeigen weitreichendere Probleme auf.</li> <li>Sämtliche Implementierungen werden gegen das Daily-System getestet. Erst wenn dort alle Anforderungen abgedeckt sind und das System funktioniert, kann der Punkt abgeschlossen und für ein Review freigegeben werden.</li> <li>Code Reviews für abgeschlossene Punkte. Diese dienen der Verbesserung des Codes/der Technik.</li> <li>Business-Abnahme durch QA-Phase</li> </ol> <p>Teile dieses Prozesses sind vorhanden, andere wurden eine Zeit lang gepflegt und sind dann wieder in “Vergessenheit” geraten. Der Schlüssel liegt jedoch in der gesamtheitlichen Betrachtung. Dieser Prozess bietet den Vorteil, dass an den jeweiligen (korrekten) Stellen auf die Gegebenheiten reagiert wird und wiederverwendbare und nachvollziehbare Prüfstellen aufgebaut/gefestigt werden. Bei einer Zuteilung von Verantwortlichkeiten kann dies nicht erreicht werden. Dagegen spricht eine Fluktuation innerhalb des Teams, Schwankendes Know How etc. </p> <h2>Fazit</h2> <p>Vermutlich wird auch dies nicht der Weisheit letzter Schluss sein. Es stellt jedoch eine wesentliche Verbesserung dar und findet den Konsens aller Team-Mitglieder. Eine solide Basis auf der (hoffentlich) weiter aufgebaut werden kann. Ich werde dich über unsere weitere Entwicklung und den notwendigen Änderungen/Anpassungen auf dem Laufenden halten. Gerne lese ich auch dein Feedback um eine zusätzliche Bereicherung zu erfahren. Natürlich stehe ich auch für Diskussionen rund um dieses Thema zur Verfügung. Entweder hier über die Kommentare, oder aber via <a title="Norbert Eder auf Twitter" href="http://twitter.com/norberteder" target="_blank">Twitter</a>.</p> http://devtyr.norberteder.com/post/Code-Reviews-Es-wird-weiter-entwickelt.aspx Norbert Eder [MVP] 4042 2012-11-12T19:03:43 UX – User Experience Guidelines User Experience definiert alle Erfahrungen und Erlebnisse des Benutzers, die eine Softwareapplikation vor, während und nach der Nutzung auf den Benutzer hat. Einfluss auf die User Experience hat das Design, die Funktionalität und die Leistungsmerkmale der Anwendung und somit letztendlich auch auf den Erfolg des Softwareproduktes. Anwendungen mit einem guten User Interface sollten neben den [...]<img src="http://feeds.feedburner.com/~r/UxDevelopa/~4/jL8EUX8u1r8" height="1" width="1"/> http://feedproxy.google.com/~r/UxDevelopa/~3/jL8EUX8u1r8/ Kazim Bahar 4030 2012-11-08T01:08:46 Auswertung Umfrage Code Reviews <p>Bis zum aktuellen Zeitpunkt haben 49 Personen an der <a title="Umfrage: Wie geht ihr mit Code Reviews um?" href="http://devtyr.norberteder.com/post/Umfrage-Wie-geht-ihr-mit-Code-Reviews-um.aspx">Umfrage zur Verwendung von Code Reviews</a> teilgenommen. Dabei sind interessante Ergebnisse zu Tage gekommen. Fast die Hälfte setzt das Mittel der Code Reviews überhaupt nicht ein, der Rest sehr unterschiedlich. Aber sehen wir uns das näher an.</p> <h2>Auswertung</h2> <p>Nachfolgend finden sich einige Charts, die sich aus den abgegebenen Antworten ergeben haben.</p> <blockquote> <p>Wer noch keine Stimme abgegeben hat, wird herzlich dazu eingeladen, dies <a title="Umfrage - Wie geht ihr mit Code Reviews um?" href="http://devtyr.norberteder.com/post/Umfrage-Wie-geht-ihr-mit-Code-Reviews-um.aspx">hier</a> zu tun. Jede weitere Stimme bringt mir (und in weiterer Folge meinen Lesern) ein klareres Bild hinsichtlich des Einsatzes in der Realität.</p> </blockquote> <p>Allgemeine Verwendung von Code Reviews</p> <p><img title="Umfrage Code Reviews (Allgemeine Verwendung)" style="border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; border-left: 0px; display: inline; padding-right: 0px" border="0" alt="Umfrage Code Reviews (Allgemeine Verwendung)" src="http://devtyr.norberteder.com/image.axd?picture=Code_Reviews_Usage_1.png" width="700" height="542" /></p> <p>Aufschlüsselung nach Fragen:</p> <p><img title="Ergebnis Umfrage Code Reviews" style="border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; border-left: 0px; display: inline; padding-right: 0px" border="0" alt="Ergebnis Umfrage Code Reviews" src="http://devtyr.norberteder.com/image.axd?picture=Code_Reviews_Summary_2.png" width="700" height="542" /></p> <p>Kategorisierung nach Verwendungszweck:</p> <p><img title="Ergebnis Umfrage Code Reviews (Gruppierung)" style="border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; border-left: 0px; display: inline; padding-right: 0px" border="0" alt="Ergebnis Umfrage Code Reviews (Gruppierung)" src="http://devtyr.norberteder.com/image.axd?picture=Code_Reviews_Summary_Category_2.png" width="700" height="542" /></p> <p>Verwendung von Tests (berücksichtigt wurden nur konkrete Angaben dazu, 21 Stimmen):</p> <p><img title="Ergebnis Umfrage Code Reviews (Testing)" style="border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; border-left: 0px; display: inline; padding-right: 0px" border="0" alt="Ergebnis Umfrage Code Reviews (Testing)" src="http://devtyr.norberteder.com/image.axd?picture=Code_Reviews_Testing_2.png" width="700" height="542" /></p> <p>&#160;</p> <h2>Findings</h2> <p>Mit 55% verwendet mehr als die Hälfte Code Reviews als Mittel, den Code zu verbessern. Negativ fällt auf, dass lediglich 29% auch Tests in ihrem Entwicklungsprozess berücksichtigen. Dies lässt den Schluss zu, dass vielfach auf Codequalität Hauptaugenmerk gelegt wird, nicht jedoch auf Fehlerfreiheit. Dies wird zusätzlich durch nicht eingesetzte Zuständigkeiten untermauert. Heißt auf gut Deutsch: Der Code wird häufig nicht durch eine mit dem Bereich vertraute Person reviewed.</p> <h3>Zuständigkeit vs. keine Zuständigkeit</h3> <p>Ein Thema, das mich persönlich aktuell gerade massiv beschäftigt. Im Beitrag <a title="Code Reviews im Daily Business - Ein Entwicklungsprozess" href="http://devtyr.norberteder.com/post/Code-Reviews-im-Daily-Business-Ein-Entwicklungsprozess.aspx">Code Reviews im Daily Business - Ein Entwicklungsprozess</a> habe ich noch dafür plädiert, die Reviewer zu würfeln. Davon bin ich mittlerweile wieder abgegangen, wäre doch eine Prüfung durch eine Kontext-nahe Person sehr sinnvoll. Doch mehr dazu in einem weiteren Beitrag.</p> <h2>Conclusio</h2> <p>Das Ergebnis ist bei weitem nicht so eindeutig ausgefallen, wie ich es mir erhoffte. Code Reviews werden sehr unterschiedlich behandelt, einen einheitlichen Weg gibt es nicht. Darin dürfte auch das Problem liegen, warum viele dieses Hilfsmittel erst gar nicht einsetzen, oder im Laufe der Zeit wieder verworfen haben.</p> http://devtyr.norberteder.com/post/Auswertung-Umfrage-Code-Reviews.aspx Norbert Eder [MVP] 4028 2012-11-07T10:01:11 //build/ Konferenz Nachlese Auf der diesjährigen //build/ Konferenz, die vom 30.Oktober bis 2. November in Redmond stattfand, wurden die Neuerungen rund um das Thema Windows 8 der Entwicklergemeinde vorgestellt. Das Interesse war riesig, die Tickets für diese Veranstaltung waren im August innerhalb einer Stunde nach Verkaufsbeginn ausverkauft. Microsoft hat alle Sessions auf Channel 9 online gestellt. Die interessantesten [...]<img src="http://feeds.feedburner.com/~r/UxDevelopa/~4/8reFCnWxMjY" height="1" width="1"/> http://feedproxy.google.com/~r/UxDevelopa/~3/8reFCnWxMjY/ Kazim Bahar 4024 2012-11-06T19:58:51 Umfrage: Wie geht ihr mit Code Reviews um? <p>Über das Thema Code Review und meinen Erfahrungen habe ich bereits <a title="Code Reviews im Daily Business" href="http://devtyr.norberteder.com/post/Code-Reviews-im-Daily-Business.aspx">hier</a> und <a title="Code Reviews im Daily Business - Ein Entwicklungsprozess" href="http://devtyr.norberteder.com/post/Code-Reviews-im-Daily-Business-Ein-Entwicklungsprozess.aspx">hier</a> geschrieben. Je länger diese im Einsatz sind, umso mehr Änderungswünsche ergeben sich an den gesamten Prozess. Mich persönlich würde nun deine Meinung dazu interessieren. Setzt du sie ein? In welcher Form? Streng nach Lehrbuch? In einer abgewandelten Form? Nachfolgend findet sich eine Umfrage zu der ich dich herzlich einladen möchte. Auch möchte ich dich bitten, sie zu teilen, in der Hoffnung, ein gutes Bild davon zu erhalten.</p> <h2>Was habe ich damit vor?</h2> <p>Hauptsächlich möchte ich möglichst viele Meinungen einholen, um den eigenen Prozess zu reflektieren und gegebenenfalls nachzubessern. Natürlich werde ich meine Erkenntnisse hier im Blog wieder teilen.</p> <h2>Die Umfrage</h2> <p><iframe height="600" marginheight="0" src="https://docs.google.com/spreadsheet/embeddedform?formkey=dHgwNndVa3QyTkkzZk1hekVyY0M3bWc6MQ" frameborder="0" width="900" marginwidth="0">Loading...</iframe></p> <p>Ich möchte dich auch gerne dazu einladen, einen Kommentar mit ausführlicheren Informationen zu verfassen. </p> http://devtyr.norberteder.com/post/Umfrage-Wie-geht-ihr-mit-Code-Reviews-um.aspx Norbert Eder [MVP] 4016 2012-10-31T14:05:45 Einführung Node.js in Graz am 29.10.2012 <p><img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="JavaScript User Group Graz" border="0" alt="JavaScript User Group Graz" src="http://devtyr.norberteder.com/image.axd?picture=image_192.png" width="960" height="184" /></p> <p>Seit letzter Woche gibt es die <a title="JavaScript User Group Graz" href="https://plus.google.com/116023769200964243200" target="_blank">JavaScript User Group Graz</a>, die mangels Alternativen in unserer Umgebung gegründet wurde. Behandelt werden alle Themen rund um JavaScript, ob Node.js, JavaScript Grundlagen oder Frameworks. In einem gemütlichen Rahmen wird bei jedem Treffen ein vorher angekündigtes Thema vorgetragen. Im Anschluss bleibt genügend Raum für angeregte Diskussionen und Erfahrungsaustausch. Die Treffen werden jeweils ca. 1 bis 2 Wochen zuvor angekündigt. Als Rahmen versuchen wir jeden letzten Montag im Monat einzuhalten.</p> <p>Eckdaten zum ersten Treffen:</p> <p><strong>Wann</strong>: 29. Oktober 2012 18:00 Uhr <br /><strong>Wo</strong>: Seering 7/2, Unterpremstätten (UPPER Network GmbH) <br /><strong>Thema</strong>: Einführung <a title="Node.js" href="http://nodejs.org/" target="_blank">Node.js</a> (<a title="Robert Zach @ Twitter" href="https://twitter.com/Bonuspunkt" target="_blank">Robert Zach</a>)</p> <p>Wer daran teilnehmen möchte, möge sich bitte <a title="Anmeldung 1. JavaScript User Group Graz Treffen" href="https://plus.google.com/events/cb0uh5t68e1re71phiu4j7annc0" target="_blank">hier</a> anmelden.</p> http://devtyr.norberteder.com/post/Einfuhrung-Nodejs-in-Graz-am-29102012.aspx Norbert Eder [MVP] 3991 2012-10-22T17:00:00 Node Package Manager und package.json <p>Wer am Beginn von <a title="Node.js" href="http://nodejs.org/" target="_blank">Node.js</a> steht ist mit dem Umgang von <a title="Node Package Manager" href="https://npmjs.org/" target="_blank">NPM</a> und den gebotenen Möglichkeiten oft nicht vertraut. Gerade mit Hilfe der Datei <font face="Courier New">package.json</font> können zahlreiche Arbeitsschritte massiv vereinfacht (und im Team verallgemeinert) werden. Dieser Beitrag zeigt auf, wie damit immer wiederkehrender Aufwand gespart werden kann.</p> <h2>Node Package Manager (NPM)</h2> <p>Mit Hilfe des Node Package Managers können zusätzliche Node-Module installiert bzw. eigene Module veröffentlicht werden. Das gesamte Spektrum ist nachfolgend zu sehen:</p> <p><a href="http://devtyr.norberteder.com/image.axd?picture=image_188.png"><img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="NPM - Command line arguments" border="0" alt="NPM - Command line arguments" src="http://devtyr.norberteder.com/image.axd?picture=image_thumb_112.png" width="500" height="383" /></a></p> <h3>Vorhandene Module finden</h3> <p>Existierende Module können via <a title="Node Packaged Modules" href="https://npmjs.org/">https://npmjs.org/</a> gefunden werden. Eine weitere Möglichkeit besteht durch den Aufruf</p> <blockquote> <p>npm search [searchkey]</p> </blockquote> <p>Als Ergebnis werden alle gefundenen Module zurück geliefert:</p> <p><a href="http://devtyr.norberteder.com/image.axd?picture=image_189.png"><img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="NPM - Module suchen" border="0" alt="NPM - Module suchen" src="http://devtyr.norberteder.com/image.axd?picture=image_thumb_113.png" width="600" height="92" /></a></p> <p>Neben der Anzeige des Modulnamens werden auch eine Beschreibung, der Autor und entsprechende Keywords (für die Suche) angezeigt. </p> <h3>Module installieren</h3> <p>Ist der Name eines Modules bekannt kann dies mit der Option <font face="Courier New">install</font> installiert werden:</p> <p><a href="http://devtyr.norberteder.com/image.axd?picture=image_190.png"><img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="NPM - Modul installieren" border="0" alt="NPM - Modul installieren" src="http://devtyr.norberteder.com/image.axd?picture=image_thumb_114.png" width="400" height="112" /></a></p> <p>Hier ist schön zu sehen, dass auch Abhängigkeiten installiert werden. </p> <h3>Installierte Module auflisten</h3> <p>Die Option <font face="Courier New">list</font> ermöglicht zudem das Auflisten von installierten Modulen und Abhängigkeiten im aktuellen Verzeichnis:</p> <p><a href="http://devtyr.norberteder.com/image.axd?picture=image_191.png"><img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="NPM - Module auflisten" border="0" alt="NPM - Module auflisten" src="http://devtyr.norberteder.com/image.axd?picture=image_thumb_115.png" width="284" height="117" /></a></p> <h2>package.json</h2> <p>Wer nun selbst Module entwickelt (egal ob für den internen, oder den öffentlichen Gebrauch) muss sich eine Datei namens package.json pro Module anlegen. Dieses enthält wichtige Metadaten zu dem Modul. Sehen wir uns eine derartige Datei näher an:</p> <div style="border-bottom: silver 1px solid; text-align: left; border-left: silver 1px solid; padding-bottom: 4px; line-height: 12pt; background-color: #f4f4f4; margin: 20px 0px 10px; padding-left: 4px; width: 97.5%; padding-right: 4px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; max-height: 600px; font-size: 8pt; overflow: auto; border-top: silver 1px solid; cursor: text; border-right: silver 1px solid; padding-top: 4px" id="codeSnippetWrapper"> <div style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px" id="codeSnippet"> <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px">{</pre> <!--CRLF--> <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"> <span style="color: #006080">&quot;name&quot;</span>: <span style="color: #006080">&quot;ideamark&quot;</span>,</pre> <!--CRLF--> <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"> <span style="color: #006080">&quot;description&quot;</span>: <span style="color: #006080">&quot;A simple nodejs document store for ideas, concepts, documentation supporting markdown&quot;</span>,</pre> <!--CRLF--> <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"> <span style="color: #006080">&quot;author&quot;</span>: <span style="color: #006080">&quot;Norbert Eder &lt;wpfnerd+nodejs@gmail.com&gt;&quot;</span>,</pre> <!--CRLF--> <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"> <span style="color: #006080">&quot;homepage&quot;</span>: <span style="color: #006080">&quot;https://github.com/devtyr/ideamark&quot;</span>,</pre> <!--CRLF--> <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"> <span style="color: #006080">&quot;bugs&quot;</span>: <span style="color: #006080">&quot;https://github.com/devtyr/ideamark/issues&quot;</span>,</pre> <!--CRLF--> <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"> <span style="color: #006080">&quot;version&quot;</span>: <span style="color: #006080">&quot;0.3.0&quot;</span>,</pre> <!--CRLF--> <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"> <span style="color: #006080">&quot;license&quot;</span>: <span style="color: #006080">&quot;MIT&quot;</span>,</pre> <!--CRLF--> <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"> <span style="color: #006080">&quot;keywords&quot;</span>: [</pre> <!--CRLF--> <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"> <span style="color: #006080">&quot;blog&quot;</span>,</pre> <!--CRLF--> <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"> <span style="color: #006080">&quot;markdown&quot;</span>,</pre> <!--CRLF--> <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"> <span style="color: #006080">&quot;live-update&quot;</span>,</pre> <!--CRLF--> <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"> <span style="color: #006080">&quot;documents&quot;</span>,</pre> <!--CRLF--> <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"> <span style="color: #006080">&quot;ideas&quot;</span>,</pre> <!--CRLF--> <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"> <span style="color: #006080">&quot;documentation&quot;</span>,</pre> <!--CRLF--> <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"> <span style="color: #006080">&quot;specification&quot;</span></pre> <!--CRLF--> <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"> ],</pre> <!--CRLF--> <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"> <span style="color: #006080">&quot;repository&quot;</span>: {</pre> <!--CRLF--> <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"> <span style="color: #006080">&quot;type&quot;</span>: <span style="color: #006080">&quot;git&quot;</span>,</pre> <!--CRLF--> <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"> <span style="color: #006080">&quot;url&quot;</span>: <span style="color: #006080">&quot;git://github.com/devtyr/ideamark.git&quot;</span></pre> <!--CRLF--> <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"> },</pre> <!--CRLF--> <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"> <span style="color: #006080">&quot;dependencies&quot;</span>: {</pre> <!--CRLF--> <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"> <span style="color: #006080">&quot;mime&quot;</span>: <span style="color: #006080">&quot;&gt;=1.2.4&quot;</span>,</pre> <!--CRLF--> <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"> <span style="color: #006080">&quot;connect&quot;</span>: <span style="color: #006080">&quot;&gt;=2.0.0&quot;</span>,</pre> <!--CRLF--> <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"> <span style="color: #006080">&quot;marked&quot;</span>: <span style="color: #006080">&quot;&gt;=0.1.2&quot;</span>,</pre> <!--CRLF--> <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"> <span style="color: #006080">&quot;optimist&quot;</span>: <span style="color: #006080">&quot;&gt;=0.3.0&quot;</span>,</pre> <!--CRLF--> <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"> <span style="color: #006080">&quot;qs&quot;</span>: <span style="color: #006080">&quot;&gt;=0.4.0&quot;</span>,</pre> <!--CRLF--> <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"> <span style="color: #006080">&quot;winston&quot;</span>: <span style="color: #006080">&quot;&gt;=0.5.9&quot;</span></pre> <!--CRLF--> <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"> },</pre> <!--CRLF--> <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"> <span style="color: #006080">&quot;scripts&quot;</span>: {</pre> <!--CRLF--> <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"> <span style="color: #006080">&quot;start&quot;</span>: <span style="color: #006080">&quot;node server.js -s&quot;</span></pre> <!--CRLF--> <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"> },</pre> <!--CRLF--> <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"> <span style="color: #006080">&quot;engines&quot;</span>: {</pre> <!--CRLF--> <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"> <span style="color: #006080">&quot;node&quot;</span>: <span style="color: #006080">&quot;&gt;= 0.6.0&quot;</span></pre> <!--CRLF--> <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"> },</pre> <!--CRLF--> <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"> <span style="color: #006080">&quot;devDependencies&quot;</span>: {}</pre> <!--CRLF--> <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px">}</pre> <!--CRLF--></div> </div> <p>Neben Angaben zum Namen, Beschreibung, Autor, Version, Lizenz und Keywords des Modules befinden sich einige sehr hilfreiche Definitionen in dieser Datei:</p> <p><strong>dependencies</strong></p> <p>Diese definieren die Abhängigkeiten des Modules, die via NPM möglich sind und zusammen mit dem Modul installiert werden sollen. Für die Angabe der abhängige Version stehen mehrere Varianten zur Verfügung:</p> <ul> <li>version: Muss exakt version entsprechen</li> <li>=version: Entspricht version</li> <li>&gt;version: Größer als die definierte Version</li> <li>&gt;=version: Größer bzw. gleich der definierten Version</li> <li>&lt;version: Kleiner als die definierte Version</li> <li>&lt;=version: Kleiner bzw. gleich der definierten Version</li> </ul> <p>Eine weitere Möglichkeit die mögliche Version einzugrenzen wird durch <strong>Tilde Version Ranges</strong> ermöglicht. Hierzu wird <font face="Courier New">~</font> der Version vorangesetzt. Die tatsächliche Version muss mindestens gleich der der definierten sein, aber kleiner der nächsten Hauptrevision. Beispiel:</p> <ul> <li>&quot;~1.2.3&quot; = &quot;&gt;=1.2.3 &lt;1.3.0&quot;</li> <li>&quot;~1.2&quot; = &quot;&gt;=1.2.0 &lt;2.0.0&quot;</li> <li>&quot;~1&quot; = &quot;&gt;=1.0.0 &lt;2.0.0&quot;</li> </ul> <p>Zusätzlich kann via <font face="Courier New">x</font> ein Platzhalter definiert werden. Beispiel:</p> <ul> <li>&quot;1.2.x&quot; = &quot;&gt;=1.2.0 &lt;1.3.0&quot;</li> </ul> <blockquote> <p><strong>Info</strong>: Als Abhängigkeit kann auch ein Verweis zu einem Repository angegeben werden.</p> </blockquote> <p><strong>devDependencies</strong></p> <p>Hier werden die referenzierten Module definiert, die für die Entwicklung an diesem Modul notwendig sind. Beispielsweise betrifft dies Abhängigkeiten zu Testing-Modulen, die für die Entwicklung notwendig, für die Verwendung jedoch unerheblich sind. Standardmäßig werden alle Abhängigkeiten installiert. Um sicher zu gehen, dass die für die Entwicklung notwendigen Abhängigkeiten nicht installiert werden, sollte das Modul mit folgendem Aufruf installiert werden:</p> <blockquote> <p>npm install --production</p> </blockquote> <p>Dieser Aufruf muss im Modul-Root erfolgen. Die Basis-Installation eines Modules via<font face="Courier New"> npm install modulname</font> installiert die <font face="Courier New">devDependencies</font> nicht mit. Es ist sehr empfehlenswert für jede zusätzliche Abhängigkeit genau zu prüfen, für welches Umfeld sie notwendig ist und entsprechend zu konfigurieren.</p> <p><strong>scripts</strong></p> <p>Hier können für unterschiedlichste Fälle Scripts angegeben werden. Unterstützt werden folgende Einträge:</p> <ul> <li><strong>preinstall</strong>: Werden vor der Installation ausgeführt</li> <li><strong>install</strong>, <strong>postintall</strong>: Werden nach der Installation ausgeführt</li> <li><strong>preuninstall</strong>, <strong>uninstall</strong>: Werden vor der Deinstallation ausgeführt</li> <li><strong>postuninstall</strong>: Werden nach der Deinstallation ausgeführt</li> <li><strong>preupdate</strong>: Laufen vor der Aktualisierung</li> <li><strong>update</strong>, <strong>postupdate</strong>: Laufen nach der Aktualisierung</li> <li><strong>prepublish</strong>: Laufen vor der Veröffentlichung des Paketes</li> <li><strong>publish</strong>, <strong>postpublish</strong>: Laufen nach der Veröffentlichung des Paketes</li> <li><strong>pretest</strong>, <strong>test</strong>, <strong>posttest</strong>: Werden durch den Aufruf von <font face="Courier New">npm test</font> ausgeführt</li> <li><strong>prestop</strong>, <strong>stop</strong>, <strong>poststop</strong>: Werden durch den Aufruf von <font face="Courier New">npm stop</font> ausgeführt</li> <li><strong>prestart</strong>, <strong>start</strong>, <strong>poststart</strong>: Werden durch den Aufruf von <font face="Courier New">npm start</font> ausgeführt</li> <li><strong>prerestart</strong>, <strong>restart</strong>, <strong>postrestart</strong>: Werden durch den Aufruf von <font face="Courier New">npm restart </font>ausgeführt. Wird kein <font face="Courier New">restart</font>-Script angegeben, wird zuerst <font face="Courier New">stop</font> und dann <font face="Courier New">start </font>durchlaufen.</li> </ul> <p>Gerade wer auf unterschiedlichen Rechnern oder im Team entwickelt, sollte davon unbedingt Gebrauch machen, da darüber sehr viel Aufwand eingespart werden kann. Einzelne Scripts können mit dem Befehl</p> <blockquote> <p>npm run-script test</p> </blockquote> <p>ausgeführt werden. In diesem Fall würde das unter <font face="Courier New">test</font> definierte Script ausgeführt werden. Die Verwendung der anderen Möglichkeiten funktioniert analog dazu.</p> <p><strong>main</strong></p> <p>In der oben angeführten <font face="Courier New">package.json</font> wird ein Eintrag nicht benötigt: <font face="Courier New">main</font>. Diese Einstellung definiert den Einstiegspunkt, wenn das Modul über <font face="Courier New">require</font> eingebunden wird. </p> <p>Um eine vollständige Liste der unterstützten Attribute durch NPM zu erhalten, ist folgender Aufruf durchzuführen:</p> <blockquote> <p>npm help json</p> </blockquote> <h2>Veröffentlichen von Modulen</h2> <p>Wer nun eigene Module veröffentlichen möchte, registriert sich auf <a title="https://npmjs.org" href="https://npmjs.org">https://npmjs.org</a> einen Benutzer. Dieser muss via </p> <blockquote> <p>npm add-user</p> </blockquote> <p>der lokalen Registrierung hinzugefügt werden. Danach kann das Modul (package.json muss vorhanden sein) via </p> <blockquote> <p>npm publish &lt;Verzeichnis&gt;</p> </blockquote> <p>veröffentlicht werden. Wahlweise kann auch eine Url oder ein Tar-Archiv verwendet werden. Sollte es Probleme beim Aktualisieren geben (Version existiert bereits) kann ein Überschreiben via <font face="Courier New">--force</font> durchgeführt werden.</p> <h2>Zusätzliche Informationen</h2> <p>Weitere hilfreiche Informationen zu NPM können über die <a title="Hilfe zu NPM" href="https://npmjs.org/doc/" target="_blank">NPM-Hilfe</a> bezogen werden.</p> http://devtyr.norberteder.com/post/Node-Package-Manager-und-packagejson.aspx Norbert Eder [MVP] 3990 2012-10-22T14:00:00 Code Reviews im Daily Business - Ein Entwicklungsprozess <p>Vor einigen Monaten hatte ich über die <a title="Code Reviews im Daily Business" href="http://devtyr.norberteder.com/post/Code-Reviews-im-Daily-Business.aspx">Einführung von Code Reviews berichtet</a>. Für uns ein wichtiger Schritt um die Qualität deutlich zu erhöhen. So war jedenfalls die Intention. Doch was hat sich inzwischen getan? Wurden die Code Reviews angenommen? Verwenden wir immer noch dasselbe Prozedere, oder mussten Änderungen am Prozess durchgeführt werden? Dieser Beitrag zeigt Probleme und mögliche Lösungswege auf.</p> <h2>Ausgangssituation</h2> <p>Im <a title="Code Reviews im Daily Business" href="http://devtyr.norberteder.com/post/Code-Reviews-im-Daily-Business.aspx">ursprünglichen Artikel</a> habe ich erzählt, wie das Review abläuft:</p> <blockquote> <p>Den Anfang hat das gemeinsame Zusammensetzung um einen PC gemacht. Danach werden sämtliche Changesets seit dem letzten Review durchgegangen. Ausgelassen wird nichts. Mittlerweile sind wir auf einen Beamer umgestiegen, da dies insgesamt ein wenig komfortabler sind. Der nächste Schritt könnte ein einschlägiges Tool sein, welches Kommentare etc. einfacher zulässt. So sicher bin ich mir hierbei allerdings noch nicht, da das “Zusammensitzen” das Team als solches wesentlich festigt und Ablenkungen minimiert werden. Es gibt kein blinkendes Skype, Lync, keine E-Mail-Benachrichtigungen und was sonst noch so alles aufblinkt.</p> </blockquote> <p> Hat dies gehalten?</p> <h2>Veränderung durch Teamvergrößerung</h2> <p>Einige Wochen nach diesem Artikel kam die erste Herausforderung. Zu diesem Zeitpunkt hatten sich Code Reviews im Team ganz gut eingespielt und wurden meist täglich durchgeführt (zum Thema <strong>meist</strong> komme ich noch). Von quasi einem Tag auf den anderen wurde dann ein anderes Team mit meinem zusammengelegt. Schlagartig verdoppelte sich damit die Anzahl der Personen im Team. Eine harte Nuss. </p> <p>Da zu viel an Veränderung meist nicht gut ist, haben wir versucht, den Prozess der Code Reviews beizubehalten. Und wir sind gescheitert. Zu viele Personen, zu viele Check Ins, <strong>drei Stunden Review</strong>. Das war dann doch eindeutig zu viel. Es musste eine andere Lösung her.</p> <p>In Kombination mit der Zusammenlegung der Teams hatten sich auch einige andere Dinge geändert. So sind wir von <a title="Team Foundation Server" href="http://www.microsoft.com/germany/visualstudio/products/team/visual-studio-team-foundation-server.aspx" target="_blank">Team Foundation Server</a> auf <strong>Mercurial</strong> umgestiegen. Als Continuous Integration Server kommt nun <a title="Jenkins CI" href="http://jenkins-ci.org/" target="_blank">Jenkins</a> zum Einsatz. Im gleichen Atemzug ging die Installation von <a title="Review Board" href="http://www.reviewboard.org/" target="_blank">Review Board</a> mit. Zusammen mit einigen weiteren Tools (siehe <a title="TortoiseHg" href="http://tortoisehg.bitbucket.org/" target="_blank">TortoiseHg</a>, Extensions für die Einbindung des Review Boards, <a title="VisualHG - Mercurial Source Control Plugin for MS Visual Studio" href="http://visualhg.codeplex.com/" target="_blank">VisualHG</a> usw.) schafften wir eine gut abgerundete Entwicklungsumgebung.</p> <p>Aber wie war das jetzt mit dem Beamer?</p> <h3>Ein neuer Prozess</h3> <p>Es stellte sich also heraus, dass das Review im gesamten Team zwar durchaus Vorteile bietet, schlussendlich aber durch den immensen Zeitaufwand so nicht weiter verfolgt werden kann. Die Reviews sollten jedoch unbedingt weitergeführt werden, bringen sie doch zahlreiche Vorteile mit sich. Eine Änderung des Prozesses musste also her. Die Meinungen gingen klarerweise weit auseinander, von beibehalten über Zuteilung bis hin zu Auflassen war alles dabei. Worauf wir uns schlussendlich geeinigt haben:</p> <ul> <li><strong>Täglich</strong> um 10:00 Uhr werden <strong>von allen</strong> Reviews durchgeführt.</li> <li>Jeder prüft die Anzahl der Review-Requests im Review Board und teilt sich selbst einer angemessenen Anzahl zu.</li> <li>Das Review wird im Laufe des Tages durchgeführt. Etwaige Fragestellungen/Probleme mit dem Implementierer besprochen und beim Review zur Aus-/Verbesserung gekennzeichnet.</li> <li>Änderungsanforderungen sind ASAP zu erledigen.</li> </ul> <p><strong>Ein Hinweis</strong>: Eine aufgekommene Idee war das “<strong>würfeln</strong>” der Zuteilung, da gerade bei der “Selbstauswahl” einige Schwierigkeiten entstehen können. Hierfür hatten wir zum damaligen Zeitpunkt jedoch keine ausreichend gute Lösung gefunden, wodurch diesbezüglich ein To Do entstand. Für konkrete Hinweise, Ideen hierzu bin ich natürlich dankbar, da dies ein äußerst nützliches Feature wäre.</p> <p>Diese definierten Punkte fanden von allem Team-Mitgliedern Zustimmung und wurde somit sofort umgesetzt.</p> <h3>Eigenverantwortung ist ein Hund</h3> <p>Nun, Wochen später kann ein Resümee gezogen werden. Funktioniert dieser Prozess? Nun ja, … er funktioniert, optimal sieht jedoch anders aus. Die größte Herausforderung ist die im Prozess definierte Eigenverantwortung. Ein Teil der Entwickler reviewed tatsächlich täglich, ohne Erinnerung, ohne Hinweise. Es ist ihnen einfach wichtig bzw. nutzen diese “Chance” auch, ihre Implementierung durch eine zweite Person reflektiert zu bekommen. Bei einem anderen Teil funktioniert dies, trotz Serientermin und Erinnerung nicht so gut. Warum nicht?</p> <ul> <li><strong>Vergessen</strong>: Der Klassiker. Trotz Erinnerung wird ganz gerne darauf vergessen. Die wahren Hintergründe kennt dann nur die Person selbst. Hier bedarf es laufender Erinnerungen und Hinweise.</li> <li><strong>Umsetzungsstress</strong>: Durch die Umsetzung eines Punktes will zum genannten Zeitpunkt nicht unterbrochen werden. Verständlich, nachgeholt wird dies allerdings auch nicht, sondern vielmehr auf den nächsten Tag verschoben.</li> <li><strong>Fehlende Wichtigkeit</strong>: Vielfach werden andere Tasks als wichtiger angesehen. Punkte die zum Review anstehen werden teilweise als abgeschlossen angesehen, obwohl sie das nicht sind. Hier müssen Prioritäten klar gesetzt werden. Gerne auch wiederholt.</li> <li><strong>Fehlende Kritikfähigkeit</strong>: Eigentlich nur eine Vermutung, da eine Bestätigung nur schwer zu erhalten ist. Vielfach sehe ich aber das Problem, dass eigener Code nicht gerne der “allgemeinen Bewertung” zugeführt wird, um den eigenen “Status” nicht zu gefährden. Soll heißen: Die anderen könnten ein negatives Bild der eigenen Kenntnisse erhalten. </li> <li><strong>Einfache Changesets bevorzugt</strong>: Wer es sich aussuchen kann, nimmt die einfachen Changesets. D.h. idealerweise nur eine betroffene Datei, keine komplexeren Patterns/Implementierungen etc. Als Resultat bleiben größere Changesets über und werden nicht, oder nur von einem ganz kleinen Kreis reviewed.</li> </ul> <p>Als Fazit kann man sagen: Teile der Entwickler sehen einen großen Mehrwert in Reviews und nutzen dieses Mittel aktiv, um eigenen Code und den anderer Entwickler verbessert zu. Wo dieses Verständnis fehlt, funktioniert es nicht. Es muss ganz klar vermittelt werden, dass Reviews einen Mehrwert bieten und der Verbesserung der Software, als auch der eigenen Kenntnisse dient. In der Tat, ein schwieriges Unterfangen.</p> <h3>Der Hirtenhund hat Urlaub</h3> <p>Irgendwann geht auch der Team Lead auf Urlaub. Wie sieht es dann mit Code Reviews aus?</p> <blockquote> <p><strong>Der Idealfall</strong>: Es läuft. Ohne Zutun.</p> <p><strong>Die Realität</strong>: Die Reviews verlaufen im Sand. Diejenigen, die vorher ohne jegliches Zutun Reviews durchgeführt haben, tun dies auch, wenn die Rute nicht ins Haus steht, viele Punkte bleiben jedoch ungesichtet/bewertet.</p> </blockquote> <p>Was genau Abhilfe schafft, weiß ich noch nicht genau (für Hinweise, Anregungen bin ich dankbar). Vorerst gibt es ständige Erinnerungen an die jeweiligen Personen, Reviews durchzuführen.</p> <h3>Stress durch Releases</h3> <p>Ein ähnliches Verhalten habe ich bei anstehenden Releases beobachtet. Steht ein größeres Release ins Haus, dann sollten - aus meiner, vielleicht etwas naiven Sicht - Reviews verstärkt stattfinden (bzw. noch genauer als normal durchgeführt werden). Gerade unter Stress erhöht sich die Wahrscheinlich von Schlampigkeit. Gerne werden Wege abgekürzt, Tests vernachlässigt. Da ist es unerlässlich, dass viele dieser “Fehler” durch Reviews abgefangen werden. Aber auch hier zeigt sich: Es wird an allen Ecken und Enden gespart. Vielmals wird es vorgezogen, auf einen Bugreport des Test-Teams zu warten und dann das Problem zu fixen, als es sofort anzugehen.</p> <h2>Ein wenig Statistik</h2> <p>Was wäre ein Bericht über das (Nicht)Funktionieren von Code Reviews ohne Daten. Nachfolgend eine (wirklich) kleine Statistik, die sicherlich einige Punkte außer Acht lässt, aber doch einige meiner Aussagen bekräftigt.</p> <p><a href="http://devtyr.norberteder.com/image.axd?picture=image_187.png"><img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="Auswertung Code Reviews / notwendige Fixes" border="0" alt="Auswertung Code Reviews / notwendige Fixes" src="http://devtyr.norberteder.com/image.axd?picture=image_thumb_111.png" width="335" height="378" /></a></p> <blockquote> <p><strong>Hinweis</strong>: August und September sind voll gerechnet. Oktober ist natürlich nicht vollständig enthalten, da zum Zeitpunkt dieses Artikels erst die Mitte erreicht ist. Dennoch können einige valide Aussagen abgeleitet werden. </p> </blockquote> <p>Die Zahlen sind nun recht nett anzusehen, bedürfen aber einiger Erklärungen, um tatsächlich sinnvoll zu sein bzw. ein Bild abzugeben. Aber der Reihe nach. Zur Bewertung kamen alle Review Requests, die via Review Board durchgeführt wurden. Reviews, die davor in großer Runde vorgenommen wurden, sind hier nicht berücksichtigt.</p> <p><strong>Allgemeine Review Zahlen</strong>: Insgesamt wurden 350 Review Requests abgegeben. 72 davon wurden mit einem To Do für den Implementierer versehen, mussten also nochmals angegriffen und verbessert werden (das sind immerhin 21% aller Requests). 9 der 72 notwendigen Anpassungen/Verbesserungen mussten mehrfach aktualisiert werden, bis der Code akzeptiert wurde.</p> <p><strong>Reviews nach Monaten</strong>: Der Startmonat verlief alles in allem ganz gut. Auffallend ist die doch wesentlich geringere Anzahl an Requests im September. Im Oktober stieg die Anzahl wieder sehr stark an (obwohl erst die Hälfte vorbei). Des Rätsels Lösung: Ich als Team Lead war im September für zwei Wochen auf Urlaub. Vorher fanden entsprechende Erinnerungen statt, danach ebenfalls.</p> <blockquote> <p><strong>Hinweis</strong>: Eine weitere Maßnahme besteht auch darin, darauf zu achten, dass möglichst jedes Check In im Review Board landet. Hier gibt es noch ein gewaltiges Potential.</p> </blockquote> <p><strong>Fixes nach Monaten</strong>: Hier eine Aufschlüsselung danach wie viele Punkte in den jeweiligen Monaten “korrigiert” werden mussten. Auch hier sank die Zahl im September doch recht stark ab bzw. dürfte für Oktober wesentlich höher werden (wie gesagt, erst die Hälfte rum).</p> <h2>Verbesserungen</h2> <p>Aus diesen Erfahrungen lassen sich einige Verbesserungen ableiten. Manche mit konkretem Task, andere benötigen noch Ideen, Gespräche und anderweitige Erfahrungsberichte. Here we go:</p> <ul> <li><strong>Würfeln</strong>. Anfangs sind wir - vermutlich - zu schnell über die Idee mit dem Würfeln und automatischen Zuteilen von Review Requests an Personen hinweg gegangen. In der Realität sollte dies aber einer der essentiellsten Punkte sein. Unabhängig der Komplexität eines Changesets werden die Punkte zugeteilt. Anstatt abgehandelte Reviews nach dem “Wer hat’s gemacht” zu durchsuchen, kann dies anhand der offenen Requests festgestellt werden.</li> <li><strong>Steigerung Akzeptanz</strong>. Einfacher gesagt als getan. Immer wiederkehrendes Wiederkauen der Vorteile, das Austreiben der Angst vor Fremdbewertung, das Formen des Teamgedankens sind definitiv notwendig um das “System” wirklich am Leben zu halten. Damit verkommt man schnell einmal zum <a href="http://de.wikipedia.org/wiki/Don_Quijote"><strong>Don</strong> Quijote</a> der Code Reviews. </li> <li><strong>Automatisches Review Posting</strong>. Reviews werden aktuell manuell durch den Benutzer angefordert. Pro Check In muss dieses über Command Line getriggert werden. Dadurch landen viele Check Ins nicht am Review Board. </li> </ul> <p>Grundsätzlich hätte ich noch ein paar Punkte in peto, allerdings sollten die obenstehenden für die nahe Zukunft ausreichend sein und stellen - meiner Meinung nach - die wichtigsten Verbesserungen dar.</p> <h2>Feedback</h2> <p>Gerne freue ich mich über Feedback, zumal zahlreiche meiner Leser auf diesem Gebiet sehr bewandert sind und das eine oder andere Problem vielleicht schon gelöst haben. Vielleicht stellen sich aber auch einige meiner Gedankengänge als fehlerhaft heraus und die Lösung wäre so viel einfacher. Zum Schluss aber noch eine Frage, die ich mir laufend stelle, jedoch bisher noch keine Antwort darauf finden konnte:</p> <blockquote> <p>Gibt es eine Möglichkeit die Qualität eines Reviews festzustellen? </p></blockquote> http://devtyr.norberteder.com/post/Code-Reviews-im-Daily-Business-Ein-Entwicklungsprozess.aspx Norbert Eder [MVP] 3982 2012-10-15T17:00:00 Toolkits für die WinRT Entwicklung Einige Features, die man von WPF und Silverlight bereits gewöhnt ist, fehlen einfach noch bei XAML für WinRT. Aber man muss ja das Rad nicht zweimal erfinden. Ich habe hier eine Sammlung von bereits existierenden Toolkits zusammengestellt, die auf CodePlex und anderen Opensource-Plattformen zum Download bereitstehen. Je nach Anwendungsfall können mit folgenden Toolkits somit einige [...]<img src="http://feeds.feedburner.com/~r/UxDevelopa/~4/QZTceAifXmk" height="1" width="1"/> http://feedproxy.google.com/~r/UxDevelopa/~3/QZTceAifXmk/ Kazim Bahar 3978 2012-10-11T22:57:15 Programmierung von 3D-Spielen für den Windows 8 Store Der neue Windows Store ermöglicht Entwicklern ihre Games auf sehr einfache Art und Weise auf den Markt zu bringen und dabei Millionen potenzieller Kunden anzusprechen. Die Frage ist nun, welche Technologien sind verfügbar, performante 2D- oder 3D-Spiele für den Windows 8 Store zu entwickeln? Mein Team-Kollege Alex, der sich bereits seit einiger Zeit in der [...]<img src="http://feeds.feedburner.com/~r/UxDevelopa/~4/iDc_fwtKnjE" height="1" width="1"/> http://feedproxy.google.com/~r/UxDevelopa/~3/iDc_fwtKnjE/ Kazim Bahar 3975 2012-10-10T01:13:05