TOP 3 Entwickler Tools (Besser spät als nie :-) )

Dieser Post folgt der MSDN Blogparade ohne große Überraschungen:

  • 1:) Resharper (Liebe, Ruhm und Lob an Resharper!)
  • 2:) Visual Studio 2008 (Solide Resharper Platform)
  • 3:) VisualSvn (Das treue Arbeitspferd, das auf die Schildkröte setzt)

(Nun lieber Postmann bring die X-BOX! :-)


T-SQL StartsWith

Schade das der MS-SqlServer von Hause aus nicht syntaktisch schönere Abfragen unterstützt. Insbesondere CAST ist umständlich und Beispielsweise die DATETIME Funktionen weder bequem noch besonders vollständig.

Ich wünsche mir IntelliSense-freundliche Syntax, die Spalten/Projektionen als Objekt auffasst und Typabhängig eine Reihe von Funktionen zulässt:

SELECT * FROM SomeTable
WHERE Name.StartsWith(‘a’)

 

Hier das ganze in gültigem SQL

SELECT * FROM SomeTable
WHERE Name like 'a%'

oder

SELECT * FROM SomeTable
WHERE SUBSTRING(Name, 0, 1 ) = SUBSTRING ( 'a', 0, 1) 
 
 
 

ASP.NET Toolkit HTML Editor ohne Bild-Insert

Der neue ASP.NET Toolkit HTML Editor macht einen guten Eindruck.

5-20-2009 12-30-55 PM

Auf den zweiten Blick fehlt jedoch die Möglichkeit Bilder einzufügen. Sucht man ein wenig weiter, findet man im Release Note eine Danksagung an die Firma Obout die anscheinend offensichtlich den HTML Editor beigesteuert hat. Die kommerzielle Version des Editors unterstützt das Einsetzen von Bildern und Bilduploads. Der Obout-Editor kostet zwischen $99 und $289. Kostenlose Alternativen bleiben TineMCE, FCKEditor

Editor Alternativen

Weitere Links:


TDD: Testen ob eine Cookie gesetzt wurde

Für Webentwickler ist das Auswerten und Setzen von Cookies Business-Logik und Business Logik sollte Testgetrieben entwickelt werden.

Hier ein Beispiel Unit-Test:

Response _response { get { return _httpCurrent.Response as ResponseNoWeb; } }
RequestNoWeb _request { get { return _httpCurrent.Request as RequestNoWeb; } }
 
[Test]
public void SetCookie()
{
    _request.Url = new Uri("http://de.camping.info");
 
    _uiLanguageService.SetLanguageCookie("de");
    
    Assert.That(_response.CookiesCreated[0].Value, Is.EqualTo("de"));
    Assert.That(_response.CookiesCreated[0].Name, Is.EqualTo("Lang"));
    Assert.That(_response.CookiesCreated[0].Domain, Is.EqualTo(".camping.info"));
}
 
 
Ermöglicht wird das über die Abstrakton von HttpRequest und HttpResponse. (Die Entwicklung wurde gestern begonnen, der Quelltext kapselt daher nur das Grundlegenste.)
 
Erfolgt die Anwendung nicht im Webkontext verwenden wir eine Implementierung für den lokalen Gebrauch:
 
namespace SpeakFriend.Utilities.Web
{
    public class ResponseNoWeb : Response, IResponse
    {
        public void Redirect(string url)
        {
            _redirections.Add(url);
        }
 
        public void Redirect(string url, bool endResponse)
        {
            _redirections.Add(url);
        }
 
        public void SetCookie(HttpCookie cookie)
        {
            _cookiesCreated.Add(cookie);
        }
    }
}

…rudimentär, aber wirksam.


NUnit von 2.4.x auf 2.5.0.9

In unseren Projekten haben wir bisher mit fast historischen NUnit Versionen gearbeitet. Hier eine paar Beispiele:

  • camping.info NUnit Version: 2.4.3 (Released August 2007)
  • concept-web NUnit Version: 2.4.6 (Released December 2007)
  • speak-lib NUnit Version, wie bei concept-web: 2.4.6

Heute habe ich alle unsere Projekte auf 2.5.0.9 aktualisiert. Die Liste der neuen Features lädt ein zum Experimentieren: Ten Reasons to Try NUnit 2,5.


Deployment mit Powershell – Schritt 5.1: IIS Webseite starten und stoppen.

Nachdem die Webseite nun im IIS eingerichtet ist, soll Sie natürlich auch gestartert werden:

$website = Get-WmiObject -Namespace "root/WebAdministration"  -Class Site | Where-Object { $_.Name -eq $iis_app_name }
$website.Start()    

(Analog dazu funktioniert natürlich auch $website.Stop())


Deployment mit Powershell – Schritt 5: Einrichten von Webseiten im IIS.

Nun geht es darum die kopierte Webseite auch im IIS einzurichten. Da der redundante Server auf EC2 noch als Windows 2003 Maschine läuft muss das Script sowohl IIS6 als IIS7 unterstützen. (Ob durch Azure, EC2 niemals von Hause aus Windows 2008 Instanzen unterstützen wird?). Duch die benötigte Rückwertskompatibilität setzen wir daher WMI ein.

function IISCreateWebSite
{    
    $service = Get-WmiObject -namespace "root\MicrosoftIISv2" -class "IIsWebService"
    
    $bindingClass = [wmiclass]'root\MicrosoftIISv2:ServerBinding'
    $bindings = $bindingClass.CreateInstance()
    $bindings.IP = ""
    $bindings.Port = "80"
    $bindings.Hostname = $iis_app_hostheader
 
    $result = $service.CreateNewSite($iis_app_name, $bindings, $path_targetDeployment)
}

Die Umsetzung war verblüffend einfach und in 10 Minuten geschafft (Dank  GBP “Google Based Programming”). Die Variablen sind nach bester Programmierermanier global.


Deployment mit Powershell – Schritt 4: Benutzerrechte von Ordnern setzen.

Für eine Reihe von Ordnern benötigt der IIS User Schreibrechte. Hierfür verwenden wir eine Datei “user-rights.template”, die die entsprechenden Rechte erhält.

5-8-2009 9-14-15 PM

Folgende Ordner in unserer deployten Webseite sollen diese Rechte erhalten: "ProductImages", "PunchOutImages", "Style", "TempFiles", "CmsImages".

Nun hilft diese Funktion:

   1: function SetFolderUserRights
   2: {
   3:     $folderNames = "ProductImages", "PunchOutImages", "Style", "TempFiles", "CmsImages" 
   4:     
   5:     $templateAcl = Get-Acl ($path_sourceRoot + "/user-rights.template")
   6:     
   7:     foreach($folderName in $folderNames){
   8:         Set-Acl -Path ($path_targetDeployment + "/" + $folderName) -AclObject $templateAcl
   9:     }    
  10: }

Im nächsten Schritt gilt es, die IIS Web-Application mit Powershell einzurichten: 

5-8-2009 9-17-26 PM


Deployment mit Powershell – Schritt 3: Werte in der Web.Config über Variablen setzen.

Beim Einrichten einer neuen Webseite geht es immer auch darum ein paar Konfigurationswerte anzupassen. In unserem konkreten Fall benötigen wir lediglich:

  • ApplicationPath
  • ConnectionString

Hier hilft der klassische Template Processor:

web-config template engine

Wobei “Deployment.ps1” die “Template-Engine” ist

   1: function CopyAndChangeWebConfig
   2: {
   3:     $webConfigTemplate = Get-Content -Path $path_sourceConfigTemplate -Encoding UTF8;
   4:     $webConfigTemplate = $webConfigTemplate -replace("#ApplicationPath#", $path_targetDeployment );
   5:     $webConfigTemplate = $webConfigTemplate -replace("#ConnectionString#", $Server );    
   6:     Set-Content -Path ($path_targetDeployment + "/web.config") -Encoding UTF8 -Value $webConfigTemplate;    
   7: }

Lesen, ersetzen, zurückschreiben und leicht zu erweitern.

:-)


Deployment mit Powershell – Schritt 2: Kopieren der Dateien

Das Script wächst:

5-8-2009 8-17-44 PM

Hier die Funktion “CopyTemplateToTarget”:

   1: ##################################################
   2: # FILE SYSTEM: DATA SECTION
   3: ###################################################
   4: function CopyTemplateToTarget
   5: {
   6:     if ((Test-Path $path_targetDeployment) -eq $false ){
   7:         New-Item $path_targetDeployment -Force -ItemType directory;
   8:     }
   9:         
  10:     copy-item $path_sourceDeploymenPackage* $path_targetDeployment  -recurse -force 
  11:     
  12:     PrintElapsedTime
  13: }

Die Variable $path_targetDeployment beinhaltet den Ordner, in den kopiert werden soll. Existiert dieser Ordner nicht, so wird er erstellt.