.
Anmeldung | Registrieren | Hilfe

.NET-Blogs Archiv Mai 2015

Install Unison on Windows with Cygwin and Linux to Synchronize Files on multiple Servers for Simple Deployment

30.05.2015 15:57:00 | Andreas Mehl

Unison is the best program I have found to synchronize files between 

a Windows System and a Linux System. 

Unison needs ssh, So i give you the following instruction how to install ssh on Windows and Linux and how to synchronize between the two machines.

 

Install Unison on Linux System

 

Unison has to be installed on server1 and server2; since we connect from server1 to server2 using SSH, we also need the SSH packages. This can be achieved as follows:

apt-get install unison openssh-server ssh

 

Creating A Private/Public Key Pair On server1

Now we create a private/public key pair on server1

ssh-keygen -t dsa

 

Generating public/private dsa key pair.

Enter file in which to save the key (/root/.ssh/id_dsa): <-- ENTER

Created directory '/root/.ssh'.

Enter passphrase (empty for no passphrase): <-- ENTER

Enter same passphrase again: <-- ENTER

Your identification has been saved in /root/.ssh/id_dsa.

Your public key has been saved in /root/.ssh/id_dsa.pub.

The key fingerprint is:

1b:95:bc:4a:f4:9f:d8:ea:24:31:0f:c9:72:d5:a7:80 root@server1.com

The key's randomart image is:

+--[ DSA 1024]----+

|                 |

|         o s     |

|        E * . .  |

|       o = o o   |

|      . S od .   |

|       + O + .   |

|        + + +    |

|         o .     |

|         .o      |

+-----------------+

root@server1:~#

 

It is important that you do not enter a passphrase otherwise the mirroring will not work without human interaction so simply hit ENTER!

Next, we copy our public key to server2

ssh-copy-id -i $HOME/.ssh/id_dsa.pub root@192.168.1.101

 

The authenticity of host '192.168.1.101 (192.168.1.101)' can't be established.

RSA key fingerprint is 11:95:bc:4a:f48:ea:24:31:95:56:62:4e.

Are you sure you want to continue connecting (yes/no)? <-- yes (you will see this only if this is the first time you connect to server2) 

Warning: Permanently added '192.168.1.101' (RSA) to the list of known hosts.

root@192.168.0.101's password: <-- server2 root password

Now try logging into the machine, with "ssh 'root@192.168.1.101'", and check in:

 

  .ssh/authorized_keys

 

to make sure we haven't added extra keys that you weren't expecting.

 

Install Unison on Windows System

 

Cygwin

1. Download cygwin (http://cygwin.com/setup.exe).

2. Create a directory in c:\ call it "cygwin" and put setup.exe in there.(run that as admin)

3. Search for openssh and click on skip to change it to newest version.

4. On OpenSSH make sure under B the box it checked.

5. Search for unison and click on newest version.

6. On unison make sure under B the box it checked.

7. Click the start button, right click on Computer and select properties, click Advanced system setting, on the advanched tab click Environment Variables.

8. Under System Variables find "Path" and edit.

9. In Variable value add to the end.(No quotes just whats in them) ";c:\cygwin\bin"

10. On your desktop right click and run as administrator Cygwin Terminal.

11. cd ..

11. Run these commands in the terminal. One at a time

mkgroup -l > /etc/group

mkpasswd -l > /etc/passwd 

chmod +r  /etc/passwd 

chmod u+w /etc/passwd

chmod +r  /etc/group

chmod u+w /etc/group

chmod  755  /var  

touch /var/log/sshd.log

chmod 664 /var/log/sshd.log

 

12. Now run "ssh-host-config" when you reach the question

" Enter the value of CYGWIN for the daemon:" enter "ntsec tty".Answer all questions 

with yes except "This script plans to use cyg_server, Do you want to use a different name?" enter yes and put the 

name as "sshd".Then make up a password for that account.

 

13. Run "cyglsa-config". Anwser Yes to the question.

14.VERY IMPORTANT STEP REBOOT YOUR COMPUTER.

15. Open a Windows command prompt as administrator and run "cd C:\cygwin\bin"

16. Run "ash" then "/usr/bin/rebaseall"

17. Open your cygwin terminal as admin and type these commands.

     chown system /etc/ssh*

     chown system /var/empty

18. In the start menu type services.msc and find the "CYGWIN sshd" right click and properties.

On the log ON tab click "Local System Account" and check the box underneath.

Big Thanks to http://pigtail.net/LRP/printsrv/cygwin-sshd.html

 

 

Running Unison

 

We can now run Unison for the first time to synchronize the /var/www directory on both servers. On server1 run:

unison /var/www ssh://192.168.1.101//var/www

 

Synchronize between Linux machines:

 

Of course, we don't want to run Unison interactively, therefore we can create a preferences file (/root/.unison/default.prf) that contains all settings that we otherwise would have to specify on the command line:

edit the file and insert following:

# Roots of the synchronization

root = /var/www

root = ssh://192.168.1.101//var/www

 

Synchronize between Linux and Windows machines:

# Roots of the synchronization

root = /var/www

root = ssh://user@192.168.1.101///cygdrive/c/public/var/www

 

to run it with the profil, do following:

unison

or you have another file for example server1.prf so start it with

unison server1

 

Firewall

don't forget to open the port 22 for ssh in local subnet.

 

That's it!

Install Unison on Windows with Cygwin and Linux to Synchronize Files on multiple Servers for Simple Deployment

30.05.2015 15:57:00 | Andreas Mehl

Unison is the best program I have found to synchronize files between 

a Windows System and a Linux System. 

Unison needs ssh, So i give you the following instruction how to install ssh on Windows and Linux and how to synchronize between the two machines.

 

Install Unison on Linux System

 

Unison has to be installed on server1 and server2; since we connect from server1 to server2 using SSH, we also need the SSH packages. This can be achieved as follows:

apt-get install unison openssh-server ssh

 

Creating A Private/Public Key Pair On server1

Now we create a private/public key pair on server1

ssh-keygen -t dsa

 

Generating public/private dsa key pair.

Enter file in which to save the key (/root/.ssh/id_dsa): <-- ENTER

Created directory '/root/.ssh'.

Enter passphrase (empty for no passphrase): <-- ENTER

Enter same passphrase again: <-- ENTER

Your identification has been saved in /root/.ssh/id_dsa.

Your public key has been saved in /root/.ssh/id_dsa.pub.

The key fingerprint is:

1b:95:bc:4a:f4:9f:d8:ea: 24:31:0f:c9:72:d5:a7:80 root@server1.com

The key's randomart image is:

+--[ DSA 1024]----+

|                 |

|         o s     |

|        E * . .  |

|       o = o o   |

|      . S od .   |

|       + O + .   |

|        + + +    |

|         o .     |

|         .o      |

+-----------------+

root@server1:~#

 

It is important that you do not enter a passphrase otherwise the mirroring will not work without human interaction so simply hit ENTER!

Next, we copy our public key to server2

ssh-copy-id -i $HOME/.ssh/id_dsa.pub root@192.168.1.101

 

The authenticity of host '192.168.1.101 (192.168.1.101)' can't be established.

RSA key fingerprint is
11:95:bc:4a:f48:ea: 24:31:95:56:62:4e.

Are you sure you want to continue connecting (yes/no)? <-- yes (you will see this only if this is the first time you connect to server2) 

Warning: Permanently added '192.168.1.101' (RSA) to the list of known hosts.

root@192.168.0.101's password: <-- server2 root password

Now try logging into the machine, with "ssh 'root@192.168.1.101'", and check in:

 

  .ssh/authorized_keys

 

to make sure we haven't added extra keys that you weren't expecting.

 

Install Unison on Windows System

 

Cygwin

1. Download cygwin (http://cygwin.com/setup.exe).

2. Create a directory in c:\ call it "cygwin" and put setup.exe in there.(run that as admin)

3. Search for openssh and click on skip to change it to newest version.

4. On OpenSSH make sure under B the box it checked.

5. Search for unison and click on newest version.

6. On unison make sure under B the box it checked.

7. Click the start button, right click on Computer and select properties, click Advanced system setting, on the advanched tab click Environment Variables.

8. Under System Variables find "Path" and edit.

9. In Variable value add to the end.(No quotes just whats in them) ";c:\cygwin\bin"

10. On your desktop right click and run as administrator Cygwin Terminal.

11. cd ..

11. Run these commands in the terminal. One at a time

mkgroup -l > /etc/group

mkpasswd -l > /etc/passwd 

chmod +r  /etc/passwd 

chmod u+w /etc/passwd

chmod +r  /etc/group

chmod u+w /etc/group

chmod  755  /var  

touch /var/log/sshd.log

chmod 664 /var/log/sshd.log

 

12. Now run "ssh-host-config" when you reach the question

" Enter the value of CYGWIN for the daemon:" enter "ntsec tty".Answer all questions 

with yes except "This script plans to use cyg_server, Do you want to use a different name?" enter yes and put the 

name as "sshd".Then make up a password for that account.

 

13. Run "cyglsa-config". Anwser Yes to the question.

14.VERY IMPORTANT STEP REBOOT YOUR COMPUTER.

15. Open a Windows command prompt as administrator and run "cd C:\cygwin\bin"

16. Run "ash" then "/usr/bin/rebaseall"

17. Open your cygwin terminal as admin and type these commands.

     chown system /etc/ssh*

     chown system /var/empty

18. In the start menu type services.msc and find the "CYGWIN sshd" right click and properties.

On the log ON tab click "Local System Account" and check the box underneath.

Big Thanks to http://pigtail.net/LRP/printsrv/cygwin-sshd.html

 

 

Running Unison

 

We can now run Unison for the first time to synchronize the /var/www directory on both servers. On server1 run:

unison /var/www ssh://192.168.1.101//var/www

 

Synchronize between Linux machines:

 

Of course, we don't want to run Unison interactively, therefore we can create a preferences file (/root/.unison/default.prf) that contains all settings that we otherwise would have to specify on the command line:

edit the file and insert following:

# Roots of the synchronization

root = /var/www

root = ssh://192.168.1.101//var/www

 

Synchronize between Linux and Windows machines:

# Roots of the synchronization

root = /var/www

root = ssh://user@192.168.1.101///cygdrive/c/public/var/www

 

to run it with the profil, do following:

unison

or you have another file for example server1.prf so start it with

unison server1

 

Firewall

don't forget to open the port 22 for ssh in local subnet.

 

That's it!

Install Unison on Windows with Cygwin and Linux to Synchronize Files on multiple Servers for Simple Deployment

30.05.2015 15:57:00 | Andreas Mehl

Unison is the best program I have found to synchronize files between 

a Windows System and a Linux System. 

Unison needs ssh, So i give you the following instruction how to install ssh on Windows and Linux and how to synchronize between the two machines.

 

Install Unison on Linux System

 

Unison has to be installed on server1 and server2; since we connect from server1 to server2 using SSH, we also need the SSH packages. This can be achieved as follows:

apt-get install unison openssh-server ssh

 

Creating A Private/Public Key Pair On server1

Now we create a private/public key pair on server1

ssh-keygen -t dsa

 

Generating public/private dsa key pair.

Enter file in which to save the key (/root/.ssh/id_dsa): <-- ENTER

Created directory '/root/.ssh'.

Enter passphrase (empty for no passphrase): <-- ENTER

Enter same passphrase again: <-- ENTER

Your identification has been saved in /root/.ssh/id_dsa.

Your public key has been saved in /root/.ssh/id_dsa.pub.

The key fingerprint is:

1b:95:bc:4a:f4:9f:d8:ea: 24:31:0f:c9:72:d5:a7:80 root@server1.com

The key's randomart image is:

+--[ DSA 1024]----+

|                 |

|         o s     |

|        E * . .  |

|       o = o o   |

|      . S od .   |

|       + O + .   |

|        + + +    |

|         o .     |

|         .o      |

+-----------------+

root@server1:~#

 

It is important that you do not enter a passphrase otherwise the mirroring will not work without human interaction so simply hit ENTER!

Next, we copy our public key to server2

ssh-copy-id -i $HOME/.ssh/id_dsa.pub root@192.168.1.101

 

The authenticity of host '192.168.1.101 (192.168.1.101)' can't be established.

RSA key fingerprint is
11:95:bc:4a:f48:ea: 24:31:95:56:62:4e.

Are you sure you want to continue connecting (yes/no)? <-- yes (you will see this only if this is the first time you connect to server2) 

Warning: Permanently added '192.168.1.101' (RSA) to the list of known hosts.

root@192.168.0.101's password: <-- server2 root password

Now try logging into the machine, with "ssh 'root@192.168.1.101'", and check in:

 

  .ssh/authorized_keys

 

to make sure we haven't added extra keys that you weren't expecting.

 

Install Unison on Windows System

 

Cygwin

1. Download cygwin (http://cygwin.com/setup.exe).

2. Create a directory in c:\ call it "cygwin" and put setup.exe in there.(run that as admin)

3. Search for openssh and click on skip to change it to newest version.

4. On OpenSSH make sure under B the box it checked.

5. Search for unison and click on newest version.

6. On unison make sure under B the box it checked.

7. Click the start button, right click on Computer and select properties, click Advanced system setting, on the advanched tab click Environment Variables.

8. Under System Variables find "Path" and edit.

9. In Variable value add to the end.(No quotes just whats in them) ";c:\cygwin\bin"

10. On your desktop right click and run as administrator Cygwin Terminal.

11. cd ..

11. Run these commands in the terminal. One at a time

mkgroup -l > /etc/group

mkpasswd -l > /etc/passwd 

chmod +r  /etc/passwd 

chmod u+w /etc/passwd

chmod +r  /etc/group

chmod u+w /etc/group

chmod  755  /var  

touch /var/log/sshd.log

chmod 664 /var/log/sshd.log

 

12. Now run "ssh-host-config" when you reach the question

" Enter the value of CYGWIN for the daemon:" enter "ntsec tty".Answer all questions 

with yes except "This script plans to use cyg_server, Do you want to use a different name?" enter yes and put the 

name as "sshd".Then make up a password for that account.

 

13. Run "cyglsa-config". Anwser Yes to the question.

14.VERY IMPORTANT STEP REBOOT YOUR COMPUTER.

15. Open a Windows command prompt as administrator and run "cd C:\cygwin\bin"

16. Run "ash" then "/usr/bin/rebaseall"

17. Open your cygwin terminal as admin and type these commands.

     chown system /etc/ssh*

     chown system /var/empty

18. In the start menu type services.msc and find the "CYGWIN sshd" right click and properties.

On the log ON tab click "Local System Account" and check the box underneath.

Big Thanks to http://pigtail.net/LRP/printsrv/cygwin-sshd.html

 

 

Running Unison

 

We can now run Unison for the first time to synchronize the /var/www directory on both servers. On server1 run:

unison /var/www ssh://192.168.1.101//var/www

 

Synchronize between Linux machines:

 

Of course, we don't want to run Unison interactively, therefore we can create a preferences file (/root/.unison/default.prf) that contains all settings that we otherwise would have to specify on the command line:

edit the file and insert following:

# Roots of the synchronization

root = /var/www

root = ssh://192.168.1.101//var/www

 

Synchronize between Linux and Windows machines:

# Roots of the synchronization

root = /var/www

root = ssh://user@192.168.1.101///cygdrive/c/public/var/www

 

to run it with the profil, do following:

unison

or you have another file for example server1.prf so start it with

unison server1

 

Firewall

don't forget to open the port 22 for ssh in local subnet.

 

That's it!

Install Unison on Windows with Cygwin and Linux to Synchronize Files on multiple Servers for Simple Deployment

30.05.2015 15:57:00 | Andreas Mehl

Unison is the best program I have found to synchronize files between 

a Windows System and a Linux System. 

Unison needs ssh, So i give you the following instruction how to install ssh on Windows and Linux and how to synchronize between the two machines.

 

Install Unison on Linux System

 

Unison has to be installed on server1 and server2; since we connect from server1 to server2 using SSH, we also need the SSH packages. This can be achieved as follows:

apt-get install unison openssh-server ssh

 

Creating A Private/Public Key Pair On server1

Now we create a private/public key pair on server1

ssh-keygen -t dsa

 

Generating public/private dsa key pair.

Enter file in which to save the key (/root/.ssh/id_dsa): <-- ENTER

Created directory '/root/.ssh'.

Enter passphrase (empty for no passphrase): <-- ENTER

Enter same passphrase again: <-- ENTER

Your identification has been saved in /root/.ssh/id_dsa.

Your public key has been saved in /root/.ssh/id_dsa.pub.

The key fingerprint is:

1b:95:bc:4a:f4:9f:d8:ea: 24:31:0f:c9:72:d5:a7:80 root@server1.com

The key's randomart image is:

+--[ DSA 1024]----+

|                 |

|         o s     |

|        E * . .  |

|       o = o o   |

|      . S od .   |

|       + O + .   |

|        + + +    |

|         o .     |

|         .o      |

+-----------------+

root@server1:~#

 

It is important that you do not enter a passphrase otherwise the mirroring will not work without human interaction so simply hit ENTER!

Next, we copy our public key to server2

ssh-copy-id -i $HOME/.ssh/id_dsa.pub root@192.168.1.101

 

The authenticity of host '192.168.1.101 (192.168.1.101)' can't be established.

RSA key fingerprint is
11:95:bc:4a:f48:ea: 24:31:95:56:62:4e.

Are you sure you want to continue connecting (yes/no)? <-- yes (you will see this only if this is the first time you connect to server2) 

Warning: Permanently added '192.168.1.101' (RSA) to the list of known hosts.

root@192.168.0.101's password: <-- server2 root password

Now try logging into the machine, with "ssh 'root@192.168.1.101'", and check in:

 

  .ssh/authorized_keys

 

to make sure we haven't added extra keys that you weren't expecting.

 

Install Unison on Windows System

 

Cygwin

1. Download cygwin (http://cygwin.com/setup.exe).

2. Create a directory in c:\ call it "cygwin" and put setup.exe in there.(run that as admin)

3. Search for openssh and click on skip to change it to newest version.

4. On OpenSSH make sure under B the box it checked.

5. Search for unison and click on newest version.

6. On unison make sure under B the box it checked.

7. Click the start button, right click on Computer and select properties, click Advanced system setting, on the advanched tab click Environment Variables.

8. Under System Variables find "Path" and edit.

9. In Variable value add to the end.(No quotes just whats in them) ";c:\cygwin\bin"

10. On your desktop right click and run as administrator Cygwin Terminal.

11. cd ..

11. Run these commands in the terminal. One at a time

mkgroup -l > /etc/group

mkpasswd -l > /etc/passwd 

chmod +r  /etc/passwd 

chmod u+w /etc/passwd

chmod +r  /etc/group

chmod u+w /etc/group

chmod  755  /var  

touch /var/log/sshd.log

chmod 664 /var/log/sshd.log

 

12. Now run "ssh-host-config" when you reach the question

" Enter the value of CYGWIN for the daemon:" enter "ntsec tty".Answer all questions 

with yes except "This script plans to use cyg_server, Do you want to use a different name?" enter yes and put the 

name as "sshd".Then make up a password for that account.

 

13. Run "cyglsa-config". Anwser Yes to the question.

14.VERY IMPORTANT STEP REBOOT YOUR COMPUTER.

15. Open a Windows command prompt as administrator and run "cd C:\cygwin\bin"

16. Run "ash" then "/usr/bin/rebaseall"

17. Open your cygwin terminal as admin and type these commands.

     chown system /etc/ssh*

     chown system /var/empty

18. In the start menu type services.msc and find the "CYGWIN sshd" right click and properties.

On the log ON tab click "Local System Account" and check the box underneath.

Big Thanks to http://pigtail.net/LRP/printsrv/cygwin-sshd.html

 

 

Running Unison

 

We can now run Unison for the first time to synchronize the /var/www directory on both servers. On server1 run:

unison /var/www ssh://192.168.1.101//var/www

 

Synchronize between Linux machines:

 

Of course, we don't want to run Unison interactively, therefore we can create a preferences file (/root/.unison/default.prf) that contains all settings that we otherwise would have to specify on the command line:

edit the file and insert following:

# Roots of the synchronization

root = /var/www

root = ssh://192.168.1.101//var/www

 

Synchronize between Linux and Windows machines:

# Roots of the synchronization

root = /var/www

root = ssh://user@192.168.1.101///cygdrive/c/public/var/www

 

to run it with the profil, do following:

unison

or you have another file for example server1.prf so start it with

unison server1

 

Firewall

don't forget to open the port 22 for ssh in local subnet.

 

That's it!

HTTPS auf einer Azure Web App erzwingen

29.05.2015 00:49:00 | Jürgen Gutsch

OK, ja. Diese Art HTTPS für eine ASP.NET Website zu erzwingen funktioniert nicht nur mit Azure Web Apps, sondern mit allen Webs die unter einem IIS laufen. Allerdings hatte ich diese Anforderung für eine Website auf einer Azure Web App und erwartete auch dort erst Mal einen Schalter im Azure Management Portal. Aber warum so kompliziert, wenn aus viel einfacher geht.

Dafür wird nichts weiter gemacht, als in der web.config, innerhalb des <system.webServer>-Tags, folgendes Snippet einzufügen:

<rewrite>
  <rules>
    <rule name="RedirectToHTTPS" stopProcessing="true">
      <match url="(.*)" />
      <conditions>
        <add input="{HTTPS}" pattern="off" ignoreCase="true" />
        <add input="{SERVER_NAME}" matchType="Pattern" pattern="^localhost$" negate="true" />
      </conditions>
      <action type="Redirect" url="https://{SERVER_NAME}/{R:1}" redirectType="Permanent" />
    </rule>
  </rules>
</rewrite>

Damit lokal während der Entwicklung die Umleitung nicht passiert, wird der Servername “locelhost” ausgeschlossen

DNUG Braunschweig Treffen–2 Vorträge: Mobility & Xamarin

28.05.2015 13:14:00 | Lars Keller

Die DNUG Braunschweig trifft sich am 03.06.2015 um 19:00 im Restaurant Zucker (Tagungsraum). Dieses Mal haben wir zwei Vorträge zum Thema Mobility & Xamarin.

Referent: Frank Solinske, Lars Keller
Mobility, Mobility, Mobility
Im Zeitalter der Mobilität zu agieren ist schwerer als dort anzukommen. Was sind Trends, Wege und Stolpersteine? Lernen Sie wie der durchaus steinige Weg sicher gegangen werden kann. Die Mobility Rockstars Lars Keller und Frank Solinske nehmen Sie mit auf die Reise und führen Sie durch das Dickicht Devices, Cross-Plattform, Xamarin, Apps, MDM, Prozesse, Deployment,… Wie mobil sind Sie schon?

Referent: Dominik Sphor
Xamarin.Forms
 
Native Apps für iOS, Android und WinRT mit Xamarin entwickeln ermöglicht es bis zu 75% der Business-Logik wieder zu verwenden. Man spart dadurch Zeit und Kosten. Doch wie steht es um die UI-Implementierung? Mithilfe von Xamarin.Forms sparen wir auch hier und können diese sogar zu 100% teilen! Wer schon einmal mit XAML gearbeitet hat, wird sich schnell zurecht finden.
Welche Vorteile und Features dieses Toolkit mit sich bringt und wann es sinnvoll einzusetzen ist wird in diesem Vortrag durch den Referent Dominik Spohr vorgestellt.

Wie immer ist die Veranstaltung kostenlos!
Weitere Informationen zur DNUG Braunschweig können hier gefunden werden: http://www.dotnet-braunschweig.de

Win 8.1: Anrufe per Behavior

23.05.2015 18:41:49 | Hendrik Loesch

In einem meiner Posts habe ich darüber geschrieben wie einfach es unter Windows Phone 8.1 ist, einen Anruf zu starten oder eine E-Mail zu schreiben. Da ich diese Funktion nun an mehreren Stellen brauche, habe ich jeweils ein Behavior daraus gemacht. Damit dieses Behavior auch per Blend verwendet werden kann und weil es einfacher zu […]

TagHelper in ASP.NET 5

22.05.2015 05:28:00 | Jürgen Gutsch

Hoch gelobt und viel beschrieben sind die neuen TagHelper, die mit ASP.NET 5 eingeführt werden. Auch einige kritische Stimmen gab es hin und wieder zu lesen. Grund genug die Dinger selber mal auszuprobieren.

Im Grunde ermöglichen TagHelper das Erstellen eigene Tags in den Razor-Views die Serverseitig interpretiert werden. Analog zu CustomControls im klassischen ASP.NET, allerdings weit weniger komplex, vielleicht sogar eher vergleichbar mit einfachen PartialViews, nur das C# statt Razor genutzt wird.

In der Razor-View werden die TagHelper wie ganz normale Tags dargestellt. TagHelper definieren allerdings nicht nur neue Tags, sondern erweitern auch vorhandene Tags. Als Beispiel sei der AnchorTagHelper genannt, der folgenden HtmlHelper ersetzt:

@Html.ActionLink("About me", "About", "Home")

Die neue Schreibweise in Form eines TagHelpers:

<a asp-controller="Home" asp-action="About">About me</a>

Das Ergebnis ist in beiden Fällen:

<a href="http://www.aspnetzone.de/Home/About">About me</a>

TagHelper sind einfache Klassen die von der Klasse TagHelper ableiten und die Methoden Process, bzw. ProcessAsync überschreiben. dort passiert die Konfiguration des gerenderten Outputs. Das interessante hierbei ist, das auch hier wird mit Konventionen gearbeitet wird:

  • Hat der Klassenname das Postfix “TagHelper” wird es als solches erkannt. Der Teil vor dem Postfix wird als Tag-Name erkannt: “EnvironmentTagHelper” steht für den Tag <environment />. “MyOctoAwesomeTagHelper” wird zu <my-octo-awesome />
  • Öffentliche Properties werden als Attribute erkannt und enthalten automatisch die Werte die in der View gesetzt werden.
  • Tagnamen können mit dem Attribut TargetElementAttribute explizit gesetzt werden, wenn die Namenskonvention nicht passen sollte
  • Attribut-Namen können mit dem HtmlAttributeNameAttribute gesetzt werden, wenn die Namenskonvention nicht passen sollte.
  • Mit dem Attribut TargetElementAttribute  kann über die Eigenschaft Attributes zusätzlich festgelegt werden, welche Attribute in der View auf jeden fall gesetzt werden müssen, damit der Tag mit dem passenden TagHelper verarbeitet wird.

Mein etwas sinnfreies Beispiel sieht wie folgt aus:

[TargetElement("hi", Attributes = "first-name,last-name")]
public class HelloTagHelper : TagHelper
{
    [HtmlAttributeName("first-name")]
    public string Name { get; set; }

    public string LastName { get; set; }
       
    public override void Process(TagHelperContext context, TagHelperOutput output)
    {
        output.TagName = "p";
        output.Attributes.Add("id", context.UniqueId);
        var content = string.Format("Hello {0} {1}, Time is now: {2}",
            Name, LastName, DateTime.Now.ToString("HH:mm"));
        output.Content.SetContent(content);
    }
}

Die Nutzung des TagHelpers in der View:

<hi first-name="Neuer" last-name="Tester"> </hi>

Das gerenderte Ergebnis im Browser:

<p id="f9af1a8136df44f493dea1e46d395226">Hello Neuer Tester, Time is now: 07:45</p>

Interessant ist hier, dass ich diesen Tag nicht selbst-schließend nutzen darf, da sonst der Content nicht gesetzt wird. Leider wird keine entsprechende Fehlermeldung beim Zugriff auf die Eigenschaft “Content” ausgegeben. Der Tag “p” und das Attribut “id” werden allerdings richtig ausgegeben. Nur der Content fehlt.

Konsequent ist das ja: Wird kein Content in der View definiert, so wird auch keiner Ausgegeben. Das wiederum heißt, ich müsste auf den vorhandenen Content auch zugreifen können. Schauen wir uns das mal genauer an. Ich möchte den Tag nun so umbauen, dass er wie folgt aussieht:

<hi>Neuer Tester</hi>

Die Ausgabe soll allerdings die gleiche bleiben.

Über das Argument output lässt sich ein PreContent und ein PostContent setzen. Der fertige TagHelper sieht nun sogar noch etwas einfacher aus:

[TargetElement("hi")]
public class HelloTagHelper : TagHelper
{
    public override void Process(TagHelperContext context, TagHelperOutput output)
    {
        output.TagName = "p";
        output.Attributes.Add("id", context.UniqueId);

        output.PreContent.SetContent("Hallo ");
        output.PostContent.SetContent(string.Format(", Time is now: {0}"
                DateTime.Now.ToString("HH:mm")));
    }
}

Das Anwendungsfeld ist nun enorm. Wer mit Twitter Bootstrap arbeitet, kennt sicher die DIV-Konstrukte die man schreiben muss um Panels, collapsable Panels, Dialoge, etc. zu erstellen. Dabei geht die Übersicht in den Views vor lauter verschachtelter HTML-Elemente schnell mal verloren. Schöner wäre doch sicher so etwas:

<bootstrap-modal title="New modal window" size="medium">
    <p>My octo awesome window content</p>
</bootstrap-modal>

Der entsprechende TagHelper ist gar nicht mal so komplex:

public class BootstrapModalTagHelper : TagHelper
{
    public string Title { get; set; }

    public override void Process(TagHelperContext context, TagHelperOutput output)
    {
        output.TagName = "div";
        output.Attributes.Add("class", "modal fade");

        output.PreContent.SetContent(@"
<div class=""modal-dialog"">
    <div class=""modal-content"">
        <div class=""modal-header"">
            <button type=""button"" class=""close"" data-dismiss=""modal"" aria-label=""Close""><span aria-hidden=""true"">×</span></button>
            <h4 class=""modal-title"">"
+ Title + @"</h4>
        </div>
        <div class=""modal-body"">"
);


            output.PostContent.SetContent(@"
        </div>
        <div class=""modal-footer"">
            <button type=""button"" class=""btn btn-default"" data-dismiss=""modal"">Close</button>
        </div>
    </div>
</div>"
);
    }
}

Es bleibt allerdings jedes Mal abzuwägen, wie viel HTML-Code man in C# Klassen verstecken möchte, oder ob nicht doch besser eine PartialView angebracht ist. In Falle von Bootstrap sind das in der Regel immer die selben Strukturen und kann durchaus in einen TagHelper verpflanzt werden. Alternativ könnten die CSS Classen ebenfalls per Property gesetzt werden.

Wer zusätzlich den ViewContext etc. in seinen TagHelpern benötigt, kann sich diesen über Dependency Injection in bereitgestellte Properties injizieren lassen:

[Activate]
protected internal ViewContext Context { get; set; }

Somit kann einfach auf den ViewContext zugegriffen werden.

TagHelper sind also nicht nur leichtgewichtig und flexibel, sondern vor allem tatsächlich auch recht praktisch :)

Dateien im Solution Explorer verdecken

21.05.2015 21:09:43 | Hendrik Loesch

Der Solution Explorer des Visual Studios zeigt häufig Dateien in einer Hierarchie an, die zu in einer bestimmten Verbindung stehen. So zum Beispiel Dateien die aus anderen heraus generiert werden oder wenn es sich um partial Classes handelt, wie sie zum beispiel bei Xaml üblich sind. Gelegentlich geht diese Abhängigkeitsbeziehung verloren und dann werden diese […]

Logging mit ASP.NET 5

21.05.2015 02:49:00 | Jürgen Gutsch

Mit ASP.NET 5 kommt – unter anderem auch als Abhängigkeit von Microsoft.AspNet.StatiFiles und Microsoft.AspNet.Server.WebListener – ein einfaches Logging in Form des Packages Microsoft.Framework.Logging mit. Dieses wird im Hintergrund schon für das Dependency Injection registriert – welches ebenfalls in ASP.NET 5 enthalten ist.

Dependency Injection war auch in den alten ASP.NET Versionen schon enthalten, allerdings nicht wirklich einheitlich für ASP.NET MVC, Web API und SignalR. In ASP.NET 5 ist es für alle Techniken der gleiche Dependency Injection Container.

In diesem Beitrag möchte ich kurz beschreiben, wie dieser Logging-Mechanismus aufgebaut ist und wie man den vorhandenen Logger durch einen eigenen ersetzen kann

ILoggerFactory

Die Factory ist die Schaltzentrale. Über die Factory werden neue ILogger erstellt und weitere ILoggerProvider hinzugefügt. Überall dort wo manuell geloggt werden soll, oder die Factory konfiguriert werden soll, kann eine Instanz der ILoggerFactory per “Constructor Injection” geholt und genutzt werden. So passiert das auch in der Startup.cs in der Methode Configure(). Standardmäßig wird dort bei einem neuen ASP.NET Projekt der ConsoleLogger Provider aktiviert:

loggerfactory.AddConsole();

Für diesen Blogbeitrag habe ich mal den LogLevel auf LogLevel.Information gesetzt:

loggerfactory.AddConsole(LogLevel.Information);

ILogger

Der Logger entspricht wohl eher einer Kategorisierung oder einer Kanalisierung der Log-Einträge. Letztendlich laden alle Log-Einträge im selben Output. Mit der ILoggerFactorie wird ein neuer benannter Logger erstellt, dessen Meldungen dann im Output mit dem LoggerNamen versehen:

public class HomeController : Controller
{
    private readonly ILogger _logger;

    public HomeController(ILoggerFactory loggerFactory)
    {
        _logger = loggerFactory.CreateLogger("HomeController");
    }

    public IActionResult Index()
    {
        _logger.LogInformation("Entering Action 'index'");
    }
}

Dieser Code führt nun beim Start zu folgender Ausgabe:

image

Wie an sieht, sind schon einige weitere Logger durch vorhandene Komponenten aktiv, wie z. B. Microsoft.Net.Http.Server.WebListener. Unser Logger mit dem Namen “HomeController” arbeitet ebenfalls wie gewünscht

ILoggerProvider

Über den ILoggerProvider kann ein eigener Logger oder ein anderes Logging-Tool (z. B. NLog, Log4Net, etc.) bereitgestellt werden. Er ist dafür zuständig den eigenen ILogger zu instanziieren und zu liefern.

Beispiel für einen eigenen Logger:

Dieses Beispiel erstellt einen weiteren ConsoleLogger, der die Ausgabe noch ein bisschen Bunter mache, als der vorhandene. Etwas sinnfrei, allerdings geht es ums Prinzip, so kann der Logger beliebig ausgebaut werden, z. B. intern auf ein anderes Logging-Tool verweisen.

Zuerst benötigen wir einen Provider für unseren Logger, der den Minimum LogLevel entgegen nimmt und eine CreateLogger-Methode enthalten muss, in der die Instanz des Loggers erstellt wird:

internal class ColorfullLoggerProvider : ILoggerProvider
{
    private readonly LogLevel _logLevel;

    public ColorfullLoggerProvider()
    {
        _logLevel = LogLevel.Verbose;
    }

    public ColorfullLoggerProvider(LogLevel logLevel)
    {
        _logLevel = logLevel;
    }

    public ILogger CreateLogger(string name)
    {
        return new ColorfullLogger(name, _logLevel);
    }
}

Der eigentliche Logger kann dann wie folgt aussehen:

internal class ColorfullLogger : ILogger
{
     private readonly LogLevel _logLevel;
     private readonly string _name;

     public ColorfullLogger(string name, LogLevel logLevel)
     {
         _name = name;
         _logLevel = logLevel;
     }

    public IDisposable BeginScope(object state)
    {
         return null
    } 

    public bool IsEnabled(LogLevel logLevel)
    {
         return _logLevel == logLevel;
    }

    public void Log(LogLevel logLevel, int eventId, object state, Exception exception, Func<object, Exception, string> formatter)
    {
         var message = formatter(state, exception);
         var oldColor = Console.ForegroundColor;

         switch ((int)logLevel) 
         {
              case 5:
                   Console.ForegroundColor = ConsoleColor.Red;
                   break;
              case 4:
                   Console.ForegroundColor = ConsoleColor.Yellow; 
                   break;
              case 3:
                   Console.ForegroundColor = ConsoleColor.Green;
                   break;
              default:
                   Console.ForegroundColor = ConsoleColor.Gray;
                   break
        }

        Console.WriteLine("{0}: [{1}] {2}", logLevel.ToString(), _name, message);

        Console.ForegroundColor = oldColor;
    }
}

Um die Einbindung noch etwas bequemer zu machen, erstelle ich zwei ExtensionMethoden auf das ILoggerFactory Interface. Einmal mit der Möglichkeit einen Minimum-LogLevel anzugeben und einmal ohne:

internal static class ILoggerFactoryExtension
{
    public static ILoggerFactory AddColorfullLogger(this ILoggerFactory loggerFactory)
    {
        loggerFactory.AddProvider(new ColorfullLoggerProvider());
        return loggerFactory;
    }
    public static ILoggerFactory AddColorfullLogger(this ILoggerFactory loggerFactory, LogLevel logLevel)
    {
        loggerFactory.AddProvider(new ColorfullLoggerProvider(logLevel));
        return loggerFactory;
    }
}

So kann ich meinen Logger auf die gleiche Art einbinden wie den vorhandenen ConsoleLogger:

loggerfactory.AddColorfullLogger(LogLevel.Information);

Stelle ich den vorhandenen ConsoleLogger nun ab, indem ich den Aufruf in der Startup.cs entferne, erhalte ich nun eine farbenfrohe Ausgabe in der Konsole:

image

Fazit

Wie man sieht, ist ASP.NET 5 beliebig erweiterbar und konfigurierbar und macht es uns sehr einfach das Framework auf unsere Bedürfnisse anzupassen. Der Logger ist allerdings nur eine mögliche Stelle an der Anpassungen vorgenommen werden können. In einem weiteren Blog-Artikel möchte ich den IoC Container austauschen.

Artikel – Für Automobilhersteller wird Softwareentwicklung zunehmend zur Kernkompetenz

20.05.2015 13:03:16 | Christian Binder

Die rapide Digitalisierung der Automobilindustrie führt zu dem unvermeidbaren Trend, dass Automobilhersteller sich zunehmend auf Softwareentwicklung als Kernkompetenz konzentrieren. Dynamische Märkte und die hohe Wertschöpfung durch Software im Auto erfordert auch ein Umdenken, wie Entwicklungsprozesse hier optimal diese Veränderung unterstützen können. Vor diesem Hintergrund ist ein Artikel in Zusammenarbeit mit Porsche Consulting, Conplement AG, Elektrobit und Microsoft entstanden, um die Möglichkeiten und Potentiale agiler Praktiken und Prinzipien in diesem Kontext zu beleuchten.

Artikel – Adaptive Automobilentwicklung oder als PDF zum Download hier

Viel Spass
Christian Binder

ASP.NET 5 auf dem Raspberry PI laufen lassen.

20.05.2015 01:51:00 | Jürgen Gutsch

Im Beitrag .NET Core auf dem Raspberry PI installieren habe ich gezeigt, wie man .NET Core auf dem Raspberry PI installiert. Das ist die Voraussetzung um ASP.NET 5 auf dem Raspberry PI zu starten.

Der Einfachheit halber habe ich unter Windows ein ASP.NET 5 Projekt mit dem Visual Studio 2015 RC erstellt. Das Projekt kann dann per Git oder noch einfacher per USB Stick auf den Raspberry PI geschoben werden. Ich persönlich bevorzuge Git, da ich somit auch eine Versionierung und eine Änderungshistorie für meine Arbeit habe. Selbst für persönliche kleine Projekte macht das für mich immer Sinn.

1. ASP.NET 5 Projekt vorbereiten

Bevor ein mit Visual Studio erstelltes Projekt unter Linux läuft, muss die project.json noch etwas angepasst werden. Wir benötigen zwei weitere NuGet Packages: Microsoft.AspNet.Hosting und Kestrel. Diese Packages dienen dazu, den Webserver Kestrel zu starten und ASP.NET 5 unter Kestrel laufen zu lassen.

  • "Microsoft.AspNet.Hosting": "1.0.0-beta4"
  • "Kestrel": "1.0.0.0-beta4”

Weiterhin müssen wir einen weiteres Kommando hinzufügen. Zusätzlich zu “web” und “gen” (die unter Linux nicht benötigt werden) fügen wir das Kommando mit dem Namen “kestrel” hinzu. (Der Name ist beliebig, sollte aber irgendwie schon einen Sinn ergeben)

  • "kestrel": "Microsoft.AspNet.Hosting --server Kestrel --server.urls http://localhost:5004"

2. .NET Utilities installieren

In diesem und dem nächsten Schritt, kommen nun die Console Tools zum Einsatz die ich in Neue Console Tools für ASP.NET 5 beschrieben habe:

Befindet sich das Projekt auf dem Raspberry PI müssen wir in das Projektverzeichnis wechseln und die .NET Utilities installieren

$cd ~/projects/dnc15/Sensors/src/Sensors
$dnvm install latest

Dieser Befehl sorgt dafür, dass die Kommandos der aktuellsten .NET Utilities in die Umgebungsvariablen der aktuellen Session aufgenommen werden.

“dnvm install latest” schaut im Internet nach der neuesten Runtime und lädt diese ggf. herunter. Alternativ kann man mit “dnvm list” schauen welche Runtimes vorhanden sind und die gewünschte per Alias installieren. z. B: “dnvm install default”.

Das nachfolgende Kommando stellt alle Abhängigkeiten wieder her, das betrifft nicht nur NuGet Packages, sondern auch Abhängigkeiten zu NPM und Bower. DNU ist also etwas mehr als nur ein NuGet Manager:

$dnu restore

Je nach Größe des Projektes und Auslastung der Leitung kann das eine Weile gehen.

3. ASP.NET 5 Anwendung starten

$dnx . kestrel

Dieser einfache Aufruf startet den Webserver Kestrel im aktuellen Verzeichnis. Fertig. Es sollte noch der Hinweis erscheinen, dass Kestrel gestartet ist und nun kann die Anwendung auf dem Raspberry PI unter http://localhost:5004/ gestartet werden oder von außen unter der IP-Adresse des Raspberry PI.

Wo sind die ASP.NET Bundles in ASP.NET 5?

19.05.2015 02:48:00 | Jürgen Gutsch

Wer mit dem Visual Studio 2015 RC ein Standardprojekt öffnet wird die ASP.NET Bundles vermissen, mit denen bisher JavaScript und CSS Dateien zusammengefasst (bundled) und komprimiert (minified) wurden.

Es gibt keine BundleConfig mehr im Projekt und die ASP.NET Bundles werden in ASP.NET 5 nicht mehr enthalten sein.

Warum?

Beim näheren hinschauen eigentlich klar. Mit ASP.NET 5 wurde das Arbeiten im Frontend komplett überarbeitet: ASP.NET ist hier nicht mehr zuständig.

Ab jetzt sollen Web Frontend Tools für das Web Frontend zum Einsatz kommen ;)

Ab Jetzt wird im Web Frontend Grunt und/oder Gulp verwendet um Dateien zusammenzufassen oder zu komprimieren. Jetzt wird Bower verwendet um abhängige JavaScript und CSS Bibliotheken zu managen. Folglich werden die ASP.NET Bundles nicht mehr benötigt.

In den ASP.NET MVC Views werden Referenzen nun nicht mehr über @Styles.Render() oder @Scripts.Render() eingebunden, sondern über die neuen Environment TagHelper:

<environment names="Development">
    <link rel="stylesheet" href="~/lib/bootstrap/css/bootstrap.css" />
    <link rel="stylesheet" href="~/lib/bootstrap-touch-carousel/css/bootstrap-touch-carousel.css" />
    <link rel="stylesheet" href="~/css/site.css" />
</environment>
<environment names="Staging,Production">
    <link rel="stylesheet" href="http://www.aspnetzone.de//ajax.aspnetcdn.com/ajax/bootstrap/3.0.0/css/bootstrap.min.css"
          asp-fallback-href="~/lib/bootstrap/css/bootstrap.min.css"
          asp-fallback-test-class="hidden" asp-fallback-test-property="visibility" asp-fallback-test-value="hidden" />
    <link rel="stylesheet" href="http://www.aspnetzone.de//ajax.aspnetcdn.com/ajax/bootstrap-touch-carousel/0.8.0/css/bootstrap-touch-carousel.css"
          asp-fallback-href="~/lib/bootstrap-touch-carousel/css/bootstrap-touch-carousel.css"
          asp-fallback-test-class="carousel-caption" asp-fallback-test-property="display" asp-fallback-test-value="none" />
    <link rel="stylesheet" href="~/css/site.css" />
</environment>

Weitere Infos

Weitere Details, Hintergründe und vor allem wie man die Environment TagHelper steuert, könnt ihr in folgendem Blog-Artikel von Jeff Fritz nachlesen: http://www.jeffreyfritz.com/2015/05/where-did-my-asp-net-bundles-go-in-asp-net-5/

.NET Core auf dem Raspberry PI installieren.

18.05.2015 04:02:00 | Jürgen Gutsch

 

Anforderungen:

  • Raspberry PI 2 mit installiertem Raspian (Debian Wheezy) und konfigurierter Netzwerkverbindung
    • Der Raspberry PI sollte auf Internet zugreifen können sollte von einem anderen Rechner aus erreichbar sein.
  • Putty oder ein anderer SSH Client auf Windows

image

Die aktuelle Mono-Version benötigt sehr viel Arbeitsspeicher. Daher ist reicht der Raspberry PI B+ nicht mehr aus. Die Mono-Version die per apt-get geholt wird, sollte auf den alten Geräten noch gehen, reicht allerdings nicht mehr für ASP.NET 5.

1. System aktualisieren

$ sudo apt-get update
$ sudo apt-get upgrade

2. Mono 4 installieren

$sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 3FA7E0328081BFF6A14DA29AA6A19B38D3D831EF
$echo "deb http://download.mono-project.com/repo/debian wheezy main" | sudo tee /etc/apt/sources.list.d/mono-xamarin.list
$sudo apt-get update
$sudo apt-get install mono-complete

ASP.NET 5 benötigt Mono 4, daher das Paket aber auf offiziellem Weg noch nicht verfügbar ist, muss dieses direkt von Xamarin bezogen werden.

Der Aufruf der Mono-Versionsinformationen überprüft, ob die Installation funktioniert hat:

$ mono –V

3. Zertifikate für NuGet installieren

$sudo certmgr -ssl -m https://go.microsoft.com
$sudo certmgr -ssl -m https://nugetgallery.blob.core.windows.net
$sudo certmgr -ssl -m https://nuget.org
$sudo certmgr -ssl -m https://www.myget.org
$mozroots --import –sync

4. Libuv für den Kestrel Webserver installieren

$sudo apt-get install gyp
$wget http://dist.libuv.org/dist/v1.4.2/libuv-v1.4.2.tar.gz
$tar -xvf libuv-v1.4.2.tar.gz
$cd libuv-v1.4.2/
$./gyp_uv.py -f make -Duv_library=shared_library
$make -C out
$sudo cp out/Debug/lib.target/libuv.so
$usr/lib/libuv.so. 1.4.2
$sudo ln -s libuv.so. 1.4.2 /usr/lib/libuv.so.1

Libuv ist die Grundlage für Kestrel, der den Webserver für ASP.NET 5 unter Linux darstellt

5. NodeJs, Grunt & Bower installieren

NodeJs, Grund und Bower werden benötigt um Abhängigkeiten für das Web Frontend zu lösen, bzw. Aufgaben (wie z.B: TypeScript, LESS, SASS Kompilierungen) vorzunehmen. Ggf. sollte auch Gulp installiert werden.

$wget http://node-arm.herokuapp.com/node_latest_armhf.deb
$sudo dpkg -i node_latest_armhf.deb
$sudo npm install -g grunt
$sudo npm install -g bower

6. .NET Version Manager installieren

Der .NET Version Manager verwaltet die .NET Core Run-Times und installiert die .NET Utilities

$curl -sSL https://raw.githubusercontent.com/aspnet/Home/dev/dnvminstall.sh | DNX_BRANCH=dev sh && source ~/.dnx/dnvm/dnvm.sh
$dnvm upgrade

Zum Testen muss anschließend einfach das dnvm Kommando aufgerufen werden:

$ dnvm

dnvm_pi

Fertig

Das war’s dann auch schon. Somit ist die Voraussetzung geschaffen um .NET Core Applikationen und ASP.NET 5 auf dem Raspberry PI 2 laufen zu lassen. Wie man eine ASP.NET 5 Applikation auf dem Raspberry PI 2 zum laufen bringt, zeige ich in einem weiteren Beitrag.

Vortrag bei der DNUG Hamburg

18.05.2015 02:38:00 | Lars Keller

Am kommenden Mittwoch 20.05.2015, 18 Uhr bin ich bei der DNUG Hamburg zu besuch! Ich werde einen Vortrag zu Leap Motion, Perceptual Computing und Kinect halten.

http://dotnet-usergroup-hamburg.de/2015/04/net-user-group-treffen-mai-2015-herr-der-gesten/

Wir sehen uns dort! :-)

DNUG Braunschweig Treffen - Internet of Things, und Industrie 4.0 mit Microservices Approach

18.05.2015 02:18:01 | Lars Keller

Die DNUG Braunschweig trifft sich am 21.05.2015 um 19:00 im Restaurant Zucker (Tagungsraum). Dieses Mal kommt uns Damir Dobric besuchen:

Die Themen „Cloud“, „Internet of Things“ und Microservices spielen eine immer größere Rolle in unserem Alltag. An diesem Abend werden wir für einige Stunden die neuen Technologien vorstellen, die genannten Technologien abdecken. Wir werden zuerst eine Einführung in die Themen „Internet of Things“ und, „Industrie 4.0“ geben. Hier werden wir sehen, warum diese Themen plötzlich wichtig geworden sind und welche Herausforderungen sie für Entwickler und Architekten darstellen. Wir werden viele Demos sehen. Allerdings, wir werden nicht die Hobby-Szenarien im Fokus haben. Unser Ziel ist es IoT und IN4.0 aus der Industrie Blickwinkel zu beleuchten um diese in den Projekten umsetzen zu können.

Technologisch fangen wir mit .NET Micro Framework und sog. System on Module Devices (Netduino, FEZ Spider, und Molecule.) an. Wir zeigen, wie diese „Dinge“ mit Visual Studio, C# und Gadgeteer programmiert werden können. Als nächstes demonstrieren wir Windows 10 mit Pi2 und Universal Windows Plattform.
Und anschließend beleuchten wir die, wie die „Dinge“ in komplexere, verteilte Systemen angebunden werden können, die in hybriden Umgebungen miteinander interagieren können.
Soweit die Zeit reicht, begeben wir uns in die Welt von Actor Programming Model und Service Fabric und zeigen wie IoT Lösungen von Actor Model und Microservices Approach profitieren können.
Im Fokus: Windows Universal Apps fuer Win10 mit IoT Extension, Messaging mit HTML5/JS, .NET Micro Framework, Azure Service Bus, Service Fabric, Gadgeteer, Pi2, Windows10 und vielleicht mehr.

Wie immer ist die Veranstaltung kostenlos!
Weitere Informationen zur DNUG Braunschweig können hier gefunden werden: http://www.dotnet-braunschweig.de

Install the Mongo PHP driver on debian

17.05.2015 14:32:00 | Andreas Mehl

Setup PECL

PECL is a repository for PHP extensions (similar to Node’s npm or Ruby’s gem). You might already have this setup, but run the following anyway:

sudo apt-get install php5-dev php5-cli php-pear

Install the MongoDB driver

With PECL setup it’s super easy to install the driver:

sudo pecl install mongo

Enable the module

Your almost ready to go! Now we just need to enable the module. Edit your php.ini file and add the line:

extension=mongo.so

Save your script and restart your webserver. You should now be able to use MongoDB with PHP. You can check to make sure the MongoDB driver is loaded by looking at the output of phpinfo(). You should see a section titled “mongo” if the driver has been loaded.

Install the Mongo PHP driver on debian

17.05.2015 14:32:00 | Andreas Mehl

Setup PECL

PECL is a repository for PHP extensions (similar to Node’s npm or Ruby’s gem). You might already have this setup, but run the following anyway:

sudo apt-get install php5-dev php5-cli php-pear

Install the MongoDB driver

With PECL setup it’s super easy to install the driver:

sudo pecl install mongo

Enable the module

Your almost ready to go! Now we just need to enable the module. Edit your php.ini file and add the line:

extension=mongo.so

Save your script and restart your webserver. You should now be able to use MongoDB with PHP. You can check to make sure the MongoDB driver is loaded by looking at the output of phpinfo(). You should see a section titled “mongo” if the driver has been loaded.

Install the Mongo PHP driver on debian

17.05.2015 14:32:00 | Andreas Mehl

Setup PECL

PECL is a repository for PHP extensions (similar to Node’s npm or Ruby’s gem). You might already have this setup, but run the following anyway:

sudo apt-get install php5-dev php5-cli php-pear

Install the MongoDB driver

With PECL setup it’s super easy to install the driver:

sudo pecl install mongo

Enable the module

Your almost ready to go! Now we just need to enable the module. Edit your php.ini file and add the line:

extension=mongo.so

Save your script and restart your webserver. You should now be able to use MongoDB with PHP. You can check to make sure the MongoDB driver is loaded by looking at the output of phpinfo(). You should see a section titled “mongo” if the driver has been loaded.

Install the Mongo PHP driver on debian

17.05.2015 14:32:00 | Andreas Mehl

Setup PECL

PECL is a repository for PHP extensions (similar to Node’s npm or Ruby’s gem). You might already have this setup, but run the following anyway:

sudo apt-get install php5-dev php5-cli php-pear

Install the MongoDB driver

With PECL setup it’s super easy to install the driver:

sudo pecl install mongo

Enable the module

Your almost ready to go! Now we just need to enable the module. Edit your php.ini file and add the line:

extension=mongo.so

Save your script and restart your webserver. You should now be able to use MongoDB with PHP. You can check to make sure the MongoDB driver is loaded by looking at the output of phpinfo(). You should see a section titled “mongo” if the driver has been loaded.

In debian the right networking Setting for a static IP in "/etc/network/interfaces"

17.05.2015 09:31:00 | Andreas Mehl

If you want your computer to be the DHCP server of an ethernet network, using the IP address 192.168.1.100 for your computer and 192.168.1.101 or higher for the other computers, you can use these configuration settings:

Contents of "/etc/network/interfaces":

# The loopback network interface (always required)

auto lo

iface lo inet loopback

 

# Assign a static IP for this DHCP server through eth0:

auto eth0

iface eth0 inet static

address 192.168.1.100

netmask 255.255.255.0

network 192.168.1.0

broadcast 192.168.1.255

gateway 192.168.1.1

Restarting Networking:

/etc/init.d/networking restart

In debian the right networking Setting for a static IP in "/etc/network/interfaces"

17.05.2015 09:31:00 | Andreas Mehl

If you want your computer to be the DHCP server of an ethernet network, using the IP address 192.168.1.100 for your computer and 192.168.1.101 or higher for the other computers, you can use these configuration settings:

Contents of "/etc/network/interfaces":

# The loopback network interface (always required)

auto lo

iface lo inet loopback

 

# Assign a static IP for this DHCP server through eth0:

auto eth0

iface eth0 inet static

address 192.168.1.100

netmask 255.255.255.0

network 192.168.1.0

broadcast 192.168.1.255

gateway 192.168.1.1

Restarting Networking:

/etc/init.d/networking restart

In debian the right networking Setting for a static IP in "/etc/network/interfaces"

17.05.2015 09:31:00 | Andreas Mehl

If you want your computer to be the DHCP server of an ethernet network, using the IP address 192.168.1.100 for your computer and 192.168.1.101 or higher for the other computers, you can use these configuration settings:

Contents of "/etc/network/interfaces":

# The loopback network interface (always required)

auto lo

iface lo inet loopback

 

# Assign a static IP for this DHCP server through eth0:

auto eth0

iface eth0 inet static

address 192.168.1.100

netmask 255.255.255.0

network 192.168.1.0

broadcast 192.168.1.255

gateway 192.168.1.1

Restarting Networking:

/etc/init.d/networking restart

In debian the right networking Setting for a static IP in "/etc/network/interfaces"

17.05.2015 09:31:00 | Andreas Mehl

If you want your computer to be the DHCP server of an ethernet network, using the IP address 192.168.1.100 for your computer and 192.168.1.101 or higher for the other computers, you can use these configuration settings:

Contents of "/etc/network/interfaces":

# The loopback network interface (always required)

auto lo

iface lo inet loopback

 

# Assign a static IP for this DHCP server through eth0:

auto eth0

iface eth0 inet static

address 192.168.1.100

netmask 255.255.255.0

network 192.168.1.0

broadcast 192.168.1.255

gateway 192.168.1.1

Restarting Networking:

/etc/init.d/networking restart

Neue Console Tools für ASP.NET 5

14.05.2015 00:43:00 | Jürgen Gutsch

Mit der Beta 4 hat Microsoft die Console Tools für ASP.NET 5 umbenannt und deren Argumente leicht angepasst. Was früher die “K” Tools waren, sind heute die “.Net Utilities”

  • KVM wurde zu DNVM (.NET Version Manager) und dient der Verwaltung der aktuell genutzten .NET Core Runntime
  • KPM wurde zu DNU und ist der NuGet Package Manager. Allerdings werden mit $ dnu restore auch alle anderen Abhängigkeiten wie NPM und Bower geholt
  • K wurde zu DNX und dient der Interaktion mit der aktuellen Applikation, zum Beispiel dem Starten des Webservers:
    $ DNX . kestrel

dnvm

Unter Linux ist übrigens die Beta 5 der .NET Utilities aktiv:

dnvm_pi

Eine weitere Änderung ist - unter Linux - die Abhängigkeit zum kürzlich erschienenen Mono 4, was weitere Probleme machen kann.

Übrigens lohnt sich ein Blick in die aktualisierten ASP.NET Projekt Templates auch hier gibt es einige sehr schönen Änderungen die ich in weiteren Beiträgen etwas intensiver beleuchten möchte.

Intel stellt die digitale Welt von morgen vor

13.05.2015 15:55:18 | Mathias Gronau

Einmal in jedem Jahr stellt Intel seine Neuentwicklungen und Visionen für die Zukunft vor. So auch in diesem Jahr. Diesmal war es in der Kunztschule in Berlin-Mitte, nahe dem Checkpoint Charlie und direkt gegenüber dem Deutschen Currywurst-Museum. Bevor ich kurz die einzelnen Exponate vorstelle möchte ich erst einmal meinen Gesamteindruck vermitteln. Es war mein dritter Intel Future Showcase und einige der Neuheiten der letzten Jahre, die vorher als Zukunftsmusik vorgestellt wurden, fand ich in diesem Jahr in fertigen Produkten wieder. Diese Produkte hatten nichts, aber auch wirklich nichts mit den Szenarien zu tun, die sich Intel als Einsatzzweck für die Innovationen ausgedacht hatte. Gerade diese Originalität war es, die mich in diesem Jahr besonders beeindruckt hat. Ansonsten gab es in diesem Jahr nichts wirklich überraschendes zu sehen – alles wird kleiner, flacher, schneller und optisch ansprechender. Es war halt das, was zu erwarten war. Das Moore’sche Gesetz feiert seinen 50. Geburtstag! Die Faustregel besagt, dass sich die Transistorendichte (Anzahl der Transistoren pro Fläche) auf einem Mikrochip etwa alle 24 Monate verdoppelt. Der Name geht auf Intel-Mitbegründer Gordon E. Moore zurück, der im April 1965 in einem Aufsatz für die Zeitschrift „Economics“ den Grundstein für die digitale Revolution legte. Drei Jahre vor der Gründung von Intel machte Gordon Moore die Beobachtung, dass die Kosten der Transistoren exponentiell sinken, während die Leistung ebenso exponentiell steigt. Irgendein Spaßvogel hat einmal nachgerechnet: Wäre die Effizienz der Autos im gleichen Maße gestiegen wie die der Prozessoren, würde das Fahrzeug sein ganzes Leben lang mit nur einer Tankfüllung auskommen. OK, die Rechnung ist bereits etwas älter; wir müssten also den Tank zusätzlich erheblich verkleinern. Wären die Kosten im Baugewerbe im gleichen Maße gesunken wie die der Prozessoren, könnten wir uns heute ein Hochhaus zum Preis eines Mittelklasse-Smartphones kaufen. Und wäre die Höhe des Hochhauses entsprechend Moores Gesetz gesteigert worden, hätte es die 35fache Höhe des Mount Everest. Ach lassen wir doch einfach das Rumgealbere. Vor 50 Jahren konnte niemand ahnen, dass dieser Grundsatz die technologische Entwicklung so fundamental prägen und den Motor für neue Erfindungen, Geschäftsmodelle und Fortschritte in nahezu jeder Branche bilden würde. Intel hat sich der fortwährenden Innovation verschrieben, um das Moore’sche Gesetz fortzuführen. Die Welt hat sich dadurch in den letzten 50 Jahren erheblich verändert. 1965 füllten Computer noch ganze Räume und wurden von Männern in weißen Kitteln betrieben und verwaltet. Bereits vier Jahre nach der Prognose von Gordon E. Moore halfen Computer bei der Mondlandung von Neil Armstrong. Diese hatten allerdings zusammen eine geringere Rechenleistung als ein heutiges Smartphone. Und heute gehören Geräte aller Formfaktoren zu unserem Alltag – vom PC über Notebooks, Tablets und Smartphones bis hin zu Wearables. Alle Technologien auf dem diesjährigen Future Showcase haben ihre Wurzeln im Mooreschen Gesetz, das Innovationen durch die exponentielle Zunahme von Prozessor-Leistung, Speicherplatz oder Netzwerk-Kapazität vorantreibt. In diesem Jahr lag der Schwerpunkt des Intel Future Showcase auf den Geräten von heute und morgen. Intel stelle Formfaktoren und Technologien vor, die das Leben bereits heute flexibler gestalten und gewährte interessante Einblicke in die Computing-Welt […]

Connecting the Raspberry PI without an existing network

13.05.2015 00:47:00 | Jürgen Gutsch

Im Zuge meines Vortrages bei der dotnet Cologne 2015 stellte sich mir die Frage, was ich für ein Setup fahren soll, um mich auf meinem RPI zu verbinden und um auch die Demos laufen zu lassen.

Einige Überlegungen standen im Raum:

  • Sollte ich einen kleinen Router besorgen um ein Netzwerk aufzusetzen?
    • Das würde heißen ich muss noch mehr Elektronik mitnehmen. Das würde aber auch die sicherste Variante sein
    • Außerdem muss ich mich einmal in den RPI mit einem Bildschirm anmelden um die aktuelle IP herauszufinden.
  • Ein USB to Serial Adapter wäre zumindest eine Möglichkeit direkte Kommandos auf dem RPI auszuführen und auch Apps laufen zu lassen.
    • Allerdings ist es nicht möglich über diese Verbindung eine Website über Port 80 von Außen aufzurufen
    • Aber für alltäglichere Anforderungen ohne UI würde das der perfekte Weg sein.
  • Ein vorhandenes Netzwerk nutzen
    • Auch mit dieser Methode muss ich mich einmal mit einem Bildschirm auf den RPI verbinden um die aktuelle IP zu erhalten.

Im laufe der Recherche bin ich auf kleine Tools gestoßen, mit dem man unter Windows 8.1 ein WLAN einrichten und betreiben kann. Zuerst fand ich das kostenlose in .NET geschriebene Tool Virtual Router, das auf Anhieb funktionierte, allerdings musste ich auch hier entweder dem RPI eine statische IP vergeben (was nicht sofort gelang) oder ich muss mich ebenfalls über einen Bildschirm mit dem Gerät verbinden um die IP zu erhalten.

Die Lösung war dann ein Tool namens MyPublicWiFi, das die verbundenen Clients und deren IP Adresse anzeigt. Zudem kann man explizit einstellen ob die existierende Netzwerkverbindung an die WiFi Clients geteilt werden darf oder nicht. Somit konnte ich nun ganz normal per SSH mit dem RPI kommunizieren und das Gerät hat die Möglichkeit auf das Internet zuzugreifen um weitere Abhängigkeiten zu laden.

Weiterhin habe ich mein RPI so eingerichtet, dass er sich automatisch nach dem Systemstart mit dem existierenden WLAN Adapter am vordefinierten WLAN anmeldet.

Das reduziert nun mein Reisegepäck und ich habe vor Ort weniger Konfigurationsaufwand

Ich muss also nur

  1. das WiFi starten
  2. den RPI hochfahren
  3. die IP Adresse auslesen
  4. mich mit Putty per SSH am RPI anmelden

Kenne ich die IP, so kann ich also wie gewohnt mit dem RPI arbeiten. :)

Wie sich während dem Vortrag herausstellte, funktionierte dieses Setup einwandfrei und einige Teilnehmer nutzten sogar das WiFi um die Demo App direkt von Ihren Devices aufzurufen. :)

Working with Git – Part 4: Pull Requests

12.05.2015 00:45:00 | Jürgen Gutsch

Inhalt der Serie

Warum?

In verteilten Teams, wie es z. B. bei Open Source Projekten üblich ist, aber auch in anderen Projekten mit externen Entwicklern, hat sich der Pull-Request als Review-Werkzeug durchgesetzt.

Im Grunde geht es darum, eine Anfrage zu erstellen, um seine Änderung am Code in den Hauptzweig übernehmen zu lassen. Das funktioniert in der Regel so, das man seinen Feature-Branch auf den Server pusht und die Verantwortlichen fragt, dass sie die Änderungen anschauen und ggf. übernehmen.

Im Gegensatz zu dem vorherigen Blog-Artikel zu den Feature-Branches, wird der Branch nicht gleich in den Hauptzweig zurückgeführt, sondern erst den Reviewern zur Verfügung gestellt. In den meisten Fällen eben, indem der Branch auf den Server gepusht wird.

Pull-Requests sind kein eigentliches Git Feature, sondern werden von Plattformen wie Github oder Bitbucket bereitgestellt. Auch einige weitere Git-Hosting-Plattformen unterstützen Pull-Request. Ob der TFS das ebenfalls unterstützt, kann ich zum jetzigen Zeitpunkt nicht sagen.

Die einfachste Art eines Pull-Requests (sollte man nicht über einen entsprechendes Git-Hosting verfügen) ist es, eine Email an das Team, oder dem entsprechenden Verantwortlichen Reviewer zu schreiben, mit der Bitte um ein Review des Codes im entsprechenden Feature-Branch. Der Reviewer, kann dann den Änderungen entweder zustimmen oder ablehnen. Im Falle dass er zustimmt, kann er die Änderungen dann gleich in den Hauptzweig übernehmen.

In Bitbucket (und auf Github) funktioniert das über eine Web-UI. Auf Bitbucket wird der zuletzt gepushte Feature-Branch beim erstellen eines Pul-Requests vorausgewählt. Man wählt dann den Ziel-Branch und beschreibt dann den Pull-Request mit einem Titel und einer optionalen Beschreibung. Abschließend werden die Reviewer zugeordnet. Der Review passiert ebenfalls in der Web-UI. Auf Bitbucket hilft die Möglichkeit Kommentare im Review für den Autor direkt an einer diskussionswürdigen Code-Stelle zu hinterlegen. Antworten auf die Kommentare lassen eine direkte Kommunikation zu.

Pull-Requests im Projekt-Alltag

Im Gegensatz zu Open-Source-Projekten, gibt es vielen Projekten kein Kernteam, das für das Review verantwortlich ist. Bei der YooApps z. B. ist das gesamte Projekt-Team verantwortlich. Was auch externe Entwickler mit einbezieht. Auch steht kein offizieller Reviewer zur Verfügung. Aus diesem Grund ist jeder im Team auch ein Reviewer. Der Autor des Pull-Requests fügt mehrere mögliche Reviewer hinzu. Der nächste der Zeit hat, schaut sich den Code an und nur einer muss dem Pull-Request zustimmen. Anders ist das kaum zu lösen, da die Pull-Requests zu lange liegen würden, während in der Zwischenzeit weitere Änderungen passieren. Immerhin wird der Code so von mindestens vier Augen angesehen. Fragen zum Code sollten nach Möglichkeit direkt besprochen werden, aber auch das ist nicht immer möglich, daher werden die Kommentarfunktionen eher genutzt.

Der Merge in den Hauptzweig wird dann allerdings wieder vom Autor übernommen und nicht vom Reviewer. Das ist deshalb so, weil wir – wie im Beitrag über die Feature-Branches beschrieben – die letzten Änderungen des Hauptzweiges vor dem Merge in den Feature-Branch übernehmen um Merge-Konflikte nicht im Hauptzweig lösen zu müssen. Der Reviewer müsste also sonst den Feature-Branch des Autors ggf. lokal auf seine Maschine holen. Nachdem dem Pull-Request also zugestimmt wurde, kommt der Autor wieder dran und führt seien Feature-Branch sauber wieder zurück in den Hauptzweig. Bitbucket bietet die Möglichkeit, den Pull Request auch direkt über die Web-UI zu mergen, allerdings wird dass dann schwieriger, wenn es zu Konflikten kommt. Daher sagen wir, dass der Autor auch für den Merge verantwortlich ist. Eine nützliche Funktion auf Bitbucket dagegen ist die Möglichkeit den reviewten Feature-Branch nach dem merge in den Entwickler-Zweig zu löschen. Dadurch bleibt die Branch-Liste auf dem Server klein.

Nochmal im Schnelldurchlauf

  1. Feature-Branch erstellen
  2. Implementieren
  3. Den aktuellen Stand des Entwickler-Branches holen und in den Feature-Branch mergen
    (Die Punkte 2. und 3. wiederholen sich ggf. mehrfach)
  4. Den Feature-Branch pushen
  5. Pull-Request erstellen
  6. Nach dem Review ggf. nachbessern
  7. Den aktuellen Stand des Entwickler-Branches holen und in den Feature-Branch mergen
  8. Den Feature-Branch in den Entwickler-Branch mergen
  9. Änderungen im Entwickler-Branch pushen
  10. Feature-Branch lokal ggf. löschen

Hier sieht man, dass vor jedem Push auf jeden Fall der aktuelle Stand des Entwickler-Branches in den Feature-Branch geholt wird. Das macht das Review einfacher und der Aufwand für den Merge verringert sich, da die Unterschiede zwischen dem Feature-Branch und dem Entwickler-Branch nicht so groß sind.

Fazit

Soviel zu der Art wie ich mit Git arbeite. Eigentlich recht einfach, oder? Wer weitere Hilfe oder Tipps benötigt, ist im Netz eigentlich bestens aufgehoben. Unmengen von Tipps und Tricks, Tutorials und Dokumentationen helfen einem beim schnellen Einstieg in das Thema Git. In meinem Fall halte ich es pragmatisch: Git hat eine umfangreiche API mit fielen Befehlen und Möglichleiten, allerdings mache ich mit nicht die Mühe alle zu kennen. Die wichtigsten zehn Kommandos schreibe ich blind, den Rest schaue ich nach. Schließlich muss man nicht alles Wissen, sondern nur wo die nötigen Informationen zu finden sind. ;)

BTW: Git lässt sich sehr gut üben und kann z. B. perfekt mit einer Code-Kata in einem Codeing-Dojo verknüpft werden. Definiert einfach jede Anforderung als Feature und setzt konsequent Feature-Branches um, vieleicht sogar Pull-Requests, wenn es die Infrastruktur zulässt ;)

BTW2: Wer Unterstützung benötigt, um in das Thema Git hinein zu kommen, kann mich sehr gerne kontaktieren. Einzelfragen antworte ich sehr gerne direkt. Intensivere Git-Schulungen können wir von der YooApps aus sehr gerne anbieten und natürlich bin ich auch immer gerne für eine Session bei einer Usergroup zu haben.

Slides zu meinem Vortrag auf der dotnet Cologne 2015

11.05.2015 00:59:00 | Jürgen Gutsch

Die Slides zu meinem Vortrag zu ASP.NET 5 auf dem Raspberry PI auf der diesjährigen dotnet Cologne 2015 vom 8. Mai könnt ihr unter folgender URL ansehen oder herunterladen:

http://de.slideshare.net/juergengutsch/aspnet-on-the-raspberry-pi-2

Die gezeigte ASP.NET 5 App findet ihr unter https://github.com/JuergenGutsch/dnc-iot-rpi-demos. Dieser Link wäre nicht wirklich empfehlenswert, wenn nicht in älteren Commits die funktionierenden Beispiele für die Anbindung an die GPIOs enthalten wäre ;) Auch werde ich hier in Kürze diese Beispiele mit Frank Pfattheichers GPIO Treibern aktualisieren und comitten.

Ein Familientreffen

Die dotnet Cologne hat mir auch dieses Jahr wieder viel Spass gemacht und es hat mich gefreut mit einem Vortrag ein Teil dieser großartigen Konferenz zu sein. Besonders freut es mich jedes Mal die bekannten Gesichter wieder zu sehen, die das Event zu einer Art von Familientreffen werden lassen. :)

Learning by Doing – Code-Katas und Coding-Dojos

11.05.2015 00:45:00 | Jürgen Gutsch

Das Thema ist bereits älter, aber immer noch sehe ich diese Lernmethode kaum in irgendwelchen Firmen implementiert. Als Grund dafür wird oftmals fehlende Zeit genannt, allerdings möchte ich dieses Argument nicht gelten lassen. Daher möchte ich mit diesem Beitrag die Coding-Dojos noch mal beschreiben und noch mal zeigen wie diese Lernmethode in den Alltag integriert werden kann.

Dojos und Katas

Die Begriffe stammen bekanntlich aus dem Asiatischen Kampfsport. Ein Dojo bezeichnet einen Ort an dem man sich zum üben von Katas trifft. Eine Kata wiederum entspricht einer Kampfsport-Übung. Auf die Programmierung angewendet ist das ein Dojo ein Raum oder ein Zeitraum in dem man sich trifft um gemeinsam kleine Programmier-Aufgaben zu lösen. Wie auch im Kampfsport, kann man bei jedem Training immer wieder die selbe Aufgabe lösen, bis man diese perfekt beherrscht. Damit es allerdings nicht langweilig ist, kann man dabei jedes Mal einen anderen Focus setzen, wie z. B. konsequentes TDD, SOLID, konsequente Nutzung eines Tools oder einfach nur das Weglassen der Maus.

Warum?

Gemeinsames Lernen unterstützt den Teamgeist, steigert die Motivation und fördert ein gemeinsames Qualitätsbewusstsein. Daher sollte jedes Team die Zeit finden und die Zeit auch bekommen gemeinsam zu lernen Dinge besser und effektiver zu tun und neues zu lernen.

Es sollte nicht schwer sein, die benötigte Zeit freizuschaufeln. Eine Stunde pro Woche, pro Entwickler sollte reichen. Eine Stunde ist nicht teuer, wenn man bedenkt, dass dadurch eine Produktionssteigerung in der restlichen Zeit wahrscheinlich ist.

“Abwechslung bringt Kraft”

Das weiß jeder, der längere Zeit am selben Problem hängt und unmotiviert anfängt sich selber abzulenken. Eine Unterbrechung der Arbeit kann zur Lösung des aktuellen Problems beitragen. Das weiß jeder, dem beim Kaffee holen, auf dem WC, beim Schwätzchen mit dem Kollegen oder kurz vorm Einschlafen die zündende Idee kommt.

Warum also nicht eine Stunde pro Woche investieren um etwas Abwechslung zu verschreiben und dabei die Weiterbildung zu fördern?

Wie?

Die Zeit reicht aus im ein Coding-Dojo zum implementieren, indem sich das Team regelmäßig trifft um eine Code-Kata zu lösen. Dabei können 50 Minuten für das Coding reserviert werden und 10 Minuten für eine abschließende Retrospektive.

Die Katas sollten nach Möglichkeit keinen Bezug zur aktuellen Arbeit haben, um den nötigen Abstand zur Arbeit zu bekommen und um den Spaß an der Sache zu erhalten. Der Focus dem man beim ausführen der Kata setzt, darf natürlich schon einen Bezug haben. Neutrale Katas findet man im Internet Unmengen.

Im Grunde ist es Egal wie das Kata tatsächlich angegangen wird. Ist das Problem komplexer, macht es Sinn, ein gemeinsames Brainstorming zur Architektur zu machen. Dieses sollte allerdings nicht zu lang gehen, um noch Zeit zum Coden zu haben. Ist das Problem trivial und fokussiert man sich auf bestimmte Praktiken und Prinzipien der Softwareentwicklung kann man direkt mit der Programmierung starten.

BTW: Heute Abend zeige ich bei der .NET Usergroup Nordwest-Schweiz in Basel, wie so ein Coding Dojo funktioniert und wie ein Coding Dojo als regelmäßige Fortbildungsmaßname im Unternehmen eingeführt werden kann. Wie immer bin sehr ich gerne bereit das Prinzip auch in weiteren Usergroups vorzustellen. Natürlich bietet die YooApps auch sehr gerne eine Einführungsschulung zu diesem Thema an.

DevOps Hackathon in München

06.05.2015 10:18:42 | Christian Binder

Der DevOps (Developer/Operations) LifeCycle ist die natürliche Erweiterung von einem agilem Engineering zu einem kontinuierlichen Delivery Model. Hierbei besteht die Herausforderung, so effizient wie möglich neue Funktionenzeit nah in Produktion bereitzustellen, zu betreiben und aus der Nutzung zu lernen.

image

Für einen praktischen Einstieg in dieses Thema, Best Practices aus Unternehmenssicht und die Möglichkeit, DevOps-Prozesse und -Werkzeuge selbst testen zu können, veranstaltet Microsoft am 18. und 19. Mai 2015 in München einen DevOps Hackathon. Die kostenlose englischsprachige Veranstaltung richtet sich in erster Linie an IT-Professionals und Entwickler aus Unternehmen sowie an Startups und Influenzer mit erster DevOps-Erfahrung.

Was Sie auf dem Hackathon erwartet:

- Work hands-on with Open Source and Microsoft technologies
- Work in teams of industry Peers
- Learn how to implement Infrastructure as Code
- Learn about continuous delivery and test in production
- Practice DevOps

Regeln | Impressum