web 2.0

Lessons Learned: XMLWriter correct HTML elements laten sluiten

Vandaag had ik ruzie met het maken van HTML op basis van XML met een XSL stylesheet. De XMLTextWriter zorgde er voor dat lege HTML elements afgesloten werden als XML elementen. Een div werd als <div/> afgesloten inplaats van <div></div> dit zorgde voor slechte HTML en daardoor pagina's die er niet uitzagen. Het probleem zat in de XMLTextwriter van .Net. Deze heeft een setting OutputMethod die standaard op XML staat waardoor de elementen self closing zijn. Deze OutputMethod moet gezet worden op HTML, deze setting is echter internal en daardoor niet te wijzigen. 

De oplossing hievoor moet gezocht worden in het gebruiken van de settings die gezet worden in de XSL. 

In de XSL specificeer je de output methode

 

<xsl:output method="html" indent="yes" omit-xml-declaration="yes" />

 

In de code kunnen deze settings vervolgens weer overgenomen worden

 

XslCompiledTransform transformer = new XslCompiledTransform();
transformer.Load(xslFile);
XmlDocument xdoc = new XmlDocument();
xdoc.LoadXml(xmlContent);
//Hier worden settings voor de HTML output methode overgenomen
XmlTextWriter xtw = XmlWriter.Create(htmlFile, transformer.OutputSettings);
transformer.Transform(xdoc.CreateNavigator(), xtw);

 

Met dank aan tek-tips.

Lessons Learned: XML processing instruction toevoegen via XSL

Vandaag moest ik via een XSL template een XML processing instruction toevoegen. Dit werkte niet om het "gewoon" als inhoud van een template toe te voegen, dit moest via een <xsl:processing-instruction>

 

Gewenste situatie

 

<element>
<!-- hier moest een processing instruction komen, 
in dit geval voor het einde van een pagina -->
<?xpp ep?>
</element>

 

 

Template:

 

<xsl:template match="pagebreak">
  <xsl:processing-instruction name="xpp">ep</xsl:processing-instruction>
</xsl:template>

 

En andersom

 

<xsl:template match="processing-instruction('xpp')[.='ep']">
      <pagebreak/>
  </xsl:template>

Lessons Learned: configuratie aanpassen aan deployment

UPDATE: Er is een mooie extensie voor die het ng allemaal veel makkelijker maakt de Slow Cheetah

Binnen Visual Studio had ik de bestanden web.debug.config en web.release.config al eens zien staan maar er nooit echt wat mee gedaan. Dat was ook niet eerder nodig aangezien de deployment altijd door andere partijen werd gedaan. Dit maal moest ik echter zelf de web.config files opleveren en ben ik mij gaan verdiepen in het aanpassen van de config files op basis van de omgeving waar naar toe gepubliceerd zal worden. 

De basis blijft de "normale" web.config file en eigenlijk ga je vervolgens de afwijkingen per omgeving in de betreffende files vastleggen. Beste voorbeeld, de connectionstring naar de database. 

Standaard web.config

 

<connectionStrings>
    <add name="ApplicationServices" connectionString="Data Source=localhost;
       Initial Catalog=DatabaseNaam;User Id=User;Password=Password" />
  </connectionStrings>
 

 

Voor de release omgeving (web.release.config)

 

<configuration xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform">
<connectionStrings>     <add name="ApplicationServices" connectionString="Data Source=NIEUWE_SERVER;
    Initial Catalog=DatabaseNaam;User Id=User;Password=Password" xdt:Transform="SetAttributes" xdt:Locator="Match(name)/>
</connectionStrings>
 

 

De namespace  xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform" wordt toegevoegd zodat de verschillende commando's gebruikt/herkend kunnen worden. De belangrijkste hiervan zijn:

  • Locator="Match(name)" deze wordt gebruikt om te herkennen welk element aangepast moet worden indien er meerdere elementen van hetzelfde type zijn. Het attribuut wat gebruikt moet worden voor de identificatie staat bij de match, in dit geval het attribute name. 
  • Transform dit commando zorgt voor de daadwerkelijke transformatie en heeft een aantal mogelijke waardes
    • SetAttributes voor het zetten van de attributen gespecificeerd in de web.release.config naar de nieuwe web.config
    • Remove voor het verwijderen van het element
    • RemoveAttributes(attribuut naam) voor het verwijderen van bepaalde attributen bijvoorbeeld het debug attribuut op de compilation
    • Insert voor het toevoegen van een element
    • Voor de overige commando's zie de Microsoft link

 

 

Niet alle configuratie items staan altijd in de web.config, soms staan deze ook in andere config bestanden zoals bijvoorbeeld de configuratie van de logging middels log4net. Deze heeft een eigen configuatie maar die wil ik ook wel aan kunnen passen middels deze techniek. Hiervoor moet een stukje code aan de csproj file toegevoegd worden om dit mogelijk te maken. 

 

<Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
  <Import Project="$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v10.0\WebApplications\Microsoft.WebApplication.targets" />
    <Target Name="AfterCompile" Condition="exists('log4net.$(Configuration).config')">
      <TransformXml Source="log4net.config"
        Destination="$(IntermediateOutputPath)$(TargetFileName).config"
        Transform="log4net.$(Configuration).config" />
      <ItemGroup>
        <AppConfigWithTargetPath Remove="log4net.config"/>
        <AppConfigWithTargetPath Include="$(IntermediateOutputPath)$(TargetFileName).config">
          <TargetPath>$(TargetFileName).config</TargetPath>
        </AppConfigWithTargetPath>
      </ItemGroup>
    </Target>
 

 

Nu worden beide config files aangepast aan de configuratie die ik kies. Standaard zijn de debug en release, maar er kunnen er natuurlijk nog veel meer toegevoegd worden. Nu hoef ik mijn configuratie alleen nog maar op de juiste omgeving te zetten en publish te kiezen voor het web project en mijn config zal juist gegenereerd worden en eventuele nieuwe keys die ik toegevoegd had in mijn eigen config worden automatisch meegenomen. 

 

Meer informatie:

 

IIS App pool user toegang geven tot SQL Server

Om een IIS gebruiker toegang te geven tot een SQL server database kan het volgende SQL statement gebruikt worden. 

 

CREATE LOGIN [IIS APPPOOL\My Pool] 
FROM WINDOWS WITH DEFAULT_DATABASE=[master] 
USE [database] 
CREATE USER [IIS APPPOOL\My Pool] 
FOR LOGIN [IIS APPPOOL\My Pool]

 

Weekje Berlijn

Van 23 april 2011 t/m 30 april 2011 zijn we een weekje naar Berlijn geweest. 

Een indrukwekkende maar waar tijdens de pasen echt niets gebeurt waardoor de eerste indruk er een was van een vieze stad. Naast iedere prullenbak lag een hele berg met afval. Maar na de pasen was daar niets meer van te merken afgezien van de grafitie die uitgebreid gebruikt wordt om een mening te verkondigen. De eerste echte dag hebben we de omgeving van Berlijn herkend, alles was dicht dus zijn we de natuur in gegaan. Via een rondvaart over de Wannsee zijn we uitgekomen op het pauweneiland waar veel mensen aan het picknicken waren en wij een leuk rondje hebben gelopen. En zo waar nog pauwen in het wild gezien. 

De dagen er na zijn we Berlijn en Potsdam in geweest. Potsdam oud met een schitterend park. Berlijn nieuw met toch veel straathoeken een stuk geschiedenis. Het holocaust monument was heel indrukwekkend. Er is genoeg leuks te doen in Berlijn en genoeg te zien. Gebruik wel de metro en de bus want (mede) door de scheiding van vroeger liggen de verschillende bezienswaardigheden ver uit elkaar. 

Onderstaand zijn wat van de foto's die ik heb gemaakt. 

Berlijn is een aanrader. Hoogtepunten
Holocaust monument
Wannsee
Potsdam met rondrit
East side Gallery
en prima eten. 

De wereld is gemiddeld grijs

Afgelopen zaterdag mocht ik naar de fotovakschool voor een workshop om kennis te maken met mijn Canon 550D. Bijna gratis bij mijn nieuwe camera maar het werd gelukkig geen reclame verhaal. Met 20 man en vrouw kregen we een mooi verhaal over de basis technieken van het fotograferen en hoe dat allemaal afgelezen en ingesteld moest worden.

Allereerst de belichting met diafragma, sluitertijden en iso. Dat gecombineerd met het histogram om uiteindelijk de belichting goed te krijgen en de keuze te maken wil ik beweging vastleggen of wil ik iets met scherptediepte. Vervolgens aan de slag met de witbalans om de juiste kleur in de foto te krijgen allemaal in begrijpelijke stappen en ondanks het slechte weer toch nog het een en ander buiten kunnen oefenen. 

Zelfs nog best een mooie foto gemaakt (al zeg ik het zelf). Maar na vandaag hopelijk nog meer mooie foto's. 

 

Er zat wel een depressief moment in de les..... De wereld is gemiddeld grijs......... Zo stel je je belichting af om vervolgens met de witbalans er meer kleur aan te geven. Aan de fotograaf om er wat moois van te maken, die uitdaging ga ik wel aan.

ASP.net mailen testen zonder SMTP

Een collega kwam met deze tip voor het testen van mail functionaliteit vanuit een .Net applicatie zonder dat je beschikking hebt tot een SMTP server of dat je gewoon niet wilt dat de mailtjes verstuurd worden.

De mailtjes worden dan opgeslagen in een folder waar IIS wel lees en schrijfrechten moet hebben.

Hieronder de volledige uitleg.

http://www.devcurry.com/2011/03/test-emails-in-aspnet-without-mail.html

Alleen overeenkomstige items selecteren met LINQ

Aangezien ik op het internet (nog) geen goed voorbeeld kon vinden hoe ik onderstaande situatie op kon lossen met LINQ heb ik er zelf maar even een stukje over geschreven wie weet help ik er iemand anders nog mee. 

De situatie is als volgt, ik heb een verzameling items en daaruit wil ik een lijst met bepaalde eigenschappen hebben. Echter dit is na filtering op meerdere waarden van een andere eigenschap en dan wil ik alleen de waardes hebben waarvoor beide filters gelden.

Voorbeeld:

 

* +=======================================+
* +SEGMENT + Periode begin + Periode eind +
* +=======================================+
* + A      + 1-1-2007      + 31-12-2007   + 
* + A      + 1-1-2008      + 31-12-2008   + 
* + A      + 1-1-2009      + 31-12-2008   +
* + B      + 1-1-2008      + 31-12-2008   +
* + B      + 1-1-2009      + 31-12-2009   +
* + B      + 1-1-2010      + 31-12-2010   +
* + C      + 1-1-2008      + 31-12-2008   +
* + C      + 1-1-2009      + 31-12-2009   +
* +=======================================+

Als nu A geselecteerd is, is het resultaat 1-1-2007, 1-1-2008 en 1-1-2009
Als nu B geselecteerd is, is het resultaat 1-1-2008, 1-1-2009 en 1-1-2010
Maar als nu A en B geselecteerd zijn is het resultaat 1-1-2008 en 1-1-2009

In LINQ kan dit nu als volgt
var selection = (from i in items
    group i.Segment by new {i.PeriodeBegin, i.PeriodeEind}
       into igroup 
       where igroup.Distinct().Count() ==
             (from s in items select s.Segment).Distinct().Count()
    select new {
                      igroup .Key.sPeriodeBegin,
                      igroup .Key.PeriodeEind
                    }
      ).Distinct().ToList();

 

 

Wie weet is er iemand anders nog mee geholpen

Ouwehands dierenpark met 550D, 70-300 en Sun Sniper

Afgelopen vrijdag voor het eerst op pad gegaan met mijn nieuwe camera. Tot op heden had ik mij beperkt tot het fotograferen van de volgens in de tuin en wat andere snapshots. Nu voor het eerst er op uit om "echt" foto's te gaan maken. Dit was ook de eerste keer dat ik mijn uitrusting compleet had. Mijn uitrusting bestaat nu uit:

  • Canon 550D
  • Sigma 17-70 2.8-4.0 HSM OS
  • Canon 70-300 4-5.6 IS
  • Sun-Sniper

De Sigma lens heb ik niet veel gebruikt in de dierentuin, de afstand tot de dieren was toch best groot dat de 70-300 beter tot zijn recht kwam. In het aquarium ging het echter prima met de Sigma en beviel het erg goed. Wat het geheel ook erg prettig maakte was een Sun-Sniper camera strap. Je draagt de camera dan over je schouder waarna hij als een soort tasje naast je hangt en door het oog wat langs de band gaat hij meteen te gebruiken is. Je camera onder handbereik en toch veel draagcomfort een absolute aanrader voor iedereen met een zware digitale camera. 

De dag was erg mistig maar dat droeg bij sommige foto's wel bij voor een mooie sfeer. Met name de wolven en beren in het bos profiteerden wel van een beetje mystiek. Een erg mooi verblijf hadden deze beesten, zeer ruim en ook mooi naast elkaar bestaan. 

 

Hieronder de resultaten van een dagje foto's maken in de mist. 

 

Wifi door het hele huis

Met een ipad is het leuk surfen, maar dat lukte tot voor kort alleen in de woonkamer in de buurt van de router. Boven had ik een tweede accesspoint gezet maar die kreeg ik alleen in de gang met andere instellingen dan in de woonkamer. Het resultaat zodra ik boven was moest ik omschakelen van draadloos netwerk. Geen drama maar wel gedoe.

Toen kwam ik deze blogpost tegen waarin werd uitgelegd hoe ik met meerdere accesspoints 1 draadloos netwerk kon maken. Eigenlijk is het heel simpel en logisch.

Voor het instellen van een draadloos netwerk met 2 accesspoints/routers moeten de volgende stappen doorlopen worden.

  1. Indien beide apparaten een DHCP server aan kunnen bieden zet er 1 uit. (De DHCP server verstrekt IP adressen).
  2. Laat de DHCP server op IP adres 192.168.1.3 beginnen met uitgeven van adressen.
  3. Stel het IP adres van het tweede apparaat in op 192.168.1.2
  4. Zet een van de apparaten in op kanaal 11 en de andere op 6 (5 verschil anders zitten ze elkaar in de weg). Mocht je nog een derde apparaat willen gebruiken moet die op kanaal 1 en denk dan ook aan de IP adressen.
  5. Stel op beide apparaten de SSID en security instellingen identiek in.

Meer was er niet nodig en nu hoef ik niet meer over te schakelen en heb ik zelfs een draadloos netwerk op zolder.

Tags: , ,