Saturday, June 16, 2007

Syntax Highlighting on blog

I'm currently working on client side syntax highlighting on this blog. It's possible some code is collored in a strange way... but that's because this is work in progress.

It's basically done with css and javascript regular expressions. Take a look at the source code to see how.

Threading, Word Interop and processes

A not so nice thing with threading is you can't kill threads running unmanaged (and so Office Interop) code.

A quick and dirty way to handle those things is use the diagnostic library to kill the process with the unmanaged code name. An example with word gives:


using System;
using System.Diagnostics;
using System.Threading;
using Microsoft.Office.Interop.Word;

namespace WordThreadingTest
{
class Program
{
static void Main(string[] args)
{
ApplicationClass apc = new ApplicationClass();
Application app = apc.Application;
object missingValue = Type.Missing;

Thread t = new Thread(RunWord);
string filename = @"D:\My Documents\Visual Studio 2005\Projects\WordThreadingTest\test.rtf";
Console.WriteLine("start thread");
t.Start(app); // Run WriteY on the new thread
Thread.Sleep(50000);
if (t.IsAlive)
{
object myFalse = false;
Console.WriteLine("quit app on main thread");
app.Quit(ref missingValue, ref missingValue, ref missingValue);
t.Abort();
Process[] pProcess;

pProcess = Process.GetProcessesByName("WINWORD");

pProcess[0].Kill();

}
}

private static void RunWord(object application)
{
Application app = (Application) application;
app.DisplayAlerts = WdAlertLevel.wdAlertsNone;
object filename = @"D:\My Documents\Visual Studio 2005\Projects\WordThreadingTest\test.rtf";

// Open the document to print...
object missingValue = Type.Missing;

// use OpenOld so as to be compatible with other versions of
// word
Console.WriteLine("open file");
Document document = app.Documents.OpenOld(ref filename,
ref missingValue, ref missingValue,
ref missingValue, ref missingValue, ref missingValue,
ref missingValue, ref missingValue, ref missingValue,
ref missingValue);


object myTrue = true; // Print in background
object myFalse = false;

app.ActivePrinter = "Adobe PDF";
// Using PrintOutOld to be version independant
Console.WriteLine("print file");
app.ActiveDocument.PrintOutOld(ref myTrue,
ref myFalse, ref missingValue, ref missingValue,
ref missingValue, ref missingValue, ref missingValue,
ref missingValue, ref missingValue, ref missingValue,
ref myFalse, ref missingValue, ref missingValue,
ref missingValue);
Console.WriteLine("close file");
document.Close(ref missingValue, ref missingValue, ref missingValue);

// Make sure all of the documents are gone from the queue
while(app.BackgroundPrintingStatus > 0)
{
Console.WriteLine("waiting...");
Thread.Sleep(250);
}
Console.WriteLine("quit app on thread");
app.Quit(ref missingValue, ref missingValue, ref missingValue);

}
}
}

DevDays Amsterdam 2007

This one in Dutch:

Verslag Microsoft DevDays 2007

13 en 14 juni 2007, Amsterdam

De Microsoft DevDays is een congres waar de laatste ins en outs op het gebied van software development van Microsoft behandeld worden. Aan de ene kant worden er nieuwe, aankomende producten en technieken behandeld, terwijl aan de andere kant bestaande, meestal minder bekende producten, worden gedemonstreerd.

Aankomende producten

De keynote van de DevDays werd gehouden door Scott Guthrie , General Manager bij de Microsoft Developer Division, waarbinnen hij onder andere verantwoordelijk is voor ASP.NET, de CLR, WFP, Silverlight en Visual Web Developer. In de keynote ging hij vooral in op Silverlight.

Silverlight


Kort door de bocht is Silverlight Microsofts implementatie van flash. In de bewoording van Microsoft is Silverlight de manier om RIA’s te bouwen (Rich Internet Applications). Aangezien Microsoft met WPF een techniek heeft om visueel aantrekkelijke applicaties te bouwen voor het Windows platform, is Silverlight de manier om deze technieken naar de browser te brengen. In dat opzicht is Silverlight meer dan flash. Waar flash een binair bestandsformaat kent, is de basis van Silverlight een XAML bestand, waarnaast een code behind werkt om de code in te bewaren. Met het XAML bestand kan je fantastische dingen doen. Een ander voordeel van werken op deze manier is dat, net als bij ASP.NET, de opmaak en code gescheiden zijn zodat er makkelijker met designers samengewerkt kan worden.
Silverlight ondersteunt AJAX-achtige technieken, en is het mogelijk om in de 1.0 versie via javascript met pagina-objecten en Silverlight component te communiceren. Verder weg in de toekomst ligt de 1.1 versie, waar Microsoft een paar andere ontwikkellijnen laat samenkomen. Die versies ondersteunen namelijk client side .Net talen met een beperkte subset van de .Net bibliotheken. Client side code kan dan met behulp van Silverlight in C# geschreven worden, waar precies dezelfde functies aangeroepen kunnen worden als in een server side script. Als bonus zal dit alles beter performen dan client side javascript.
Een heftige claim, maar pas als microsoft een demo met een video editor in een browser te voorschijn tovert zie je pas echt hoe krachtig het concept is. Tot slot is Silverlight browser onafhankelijk. Microsoft heeft zelf Windows versies voor IE en Firefox geschreven en een Mac versie gemaakt. De mensen van het Mono project zijn momenteel hard bezig om een Linux versie op de rails te zetten onder de naam Moonlight .

Design wordt makkelijker

Aan het einde van komend jaar komt Microsoft met de nieuwe Visual Studio 2008 uit. Microsoft is meer bezig met designers. Nu al is de expression suite van programma’s uitgekomen waar (web)designers uitgebreide mogelijkheden hebben om schitterende creaties te maken. Deze tools werken echter met dezelfde projectformaten als Visual studio, zodat ontwikkelaars en designers niet meer bestanden over en weer hoeven te slepen, maar eigenlijk met verschillende tools op dezelfde bron werkt, inclusief source control.
Daarnaast kent Visual Studio stukken verbeterde CSS support. Niet alleen zullen asp.net controls beter met CSS kunnen samenwerken, ook kan VS veel makkelijker met css bestanden werken en precies kunnen laten zien vanwaar een bepaalde opmaak op een element vandaan komt.
Tot slot is de split design mode van onder andere Dreamweaver nu ook in VS beschikbaar. Dat wil dus zeggen dat je tegelijker tijd in design en code vensters kan werken. En als je dat toch niet zo prettig vind, beloofd men dat het schakelen tussen deze twee vensters stukken sneller geworden is.

Javascript support

Een andere in het oog springende aanpassing van Visual Studio is de ondersteuning van client side javascript in web projecten. En met ondersteuning wordt dan ook volledige IntelliSense (zie afbeelding) en debug mogelijk¬heden bedoeld. In de huidige AJAX wereld is dit dan ook echt onontbeerlijk. Met deze verbeteringen worden nu dan ook het bouwen van AJAX controls volledig ondersteund. Er zullen hiervoor standaard templates aanwezig zijn, aangezien de AJAX toolkit standaard in .Net 3.5 ingebakken zit.

.Net Framework 3.5

Naast de genoemde AJAX toolkit (die nu nog als losse download aangeboden wordt), is de belangrijkste toevoeging aan het framework LINQ. LINQ is een querytaal waarmee een willekeurige datastore vanuit je programmacode bevraagd kan worden. Hiervoor zijn er een hoop extra uitbreidingen op het framework ook noodzakelijk geworden, zoals anonieme types (het initialiseren van een variabele met het keyword var) en delta functies. Erg ingewikkelde concepten om hier uit te leggen, maar niet nodig om te begrijpen als je met LINQ aan de slag wil. LINQ zorgt namelijk dat er automatisch objecten aangemaakt worden als je bijvoorbeeld met een database werkt. Het volgende stukje code kan echter op verschillende datastores betrekking hebben.

var q =
from c in db.Customers
where c.City == "London"
select c;
foreach (Customer c in q)
Console.WriteLine(c.CompanyName);

Zo kan LINQ deze code vertalen (afhankelijk van het hier genoemde db object) naar een SQL Query, naar een XML bestand, of elke zelf geschreven LINQ translator.

Huidige producten


Naast al dat nieuws heeft de DevDays een heleboel demonstraties te bieden van bestaande technieken. Een aantal sessies richtte zich op “Paterns & Practices”, en dan vooral op het gebruik van de Enterprise Library en de Software Factories. Clemens Reijnen hield een presentatie over de WebService Software Factory (WSSF). Zoals de naam al zegt produceert een softwarefactory software (code), die voldoet aan de eisen die jij specificeert. De SF zal hierbij de ontwikkelaar leiden door het proces, rekening kunnen houden met richtlijnen ten opzichte van beveiliging en code standaarden. In het door hem gegeven voorbeeld met zowel versie 2 als versie 3 van de WSSF kan er hierdoor snel goede functionerende code geschreven worden. Daarnaast is een voordeel dat er eerst een model van de werkelijkheid gebouwd wordt, waardoor in versie 3 bijvoorbeeld pas op het laatst het gebruikte deployment model voor de webservice gekozen moet worden (in dit geval WCF of asmx). Er is hier natuurlijk een ding wat er voor de ontwikkelaar over blijft, en dat is het implementeren van de business logica.
Francesco Balena de eerste dag een presentatie over het gebruik van custom attributes en reflectie in het .net framewerk. Dit zijn twee onderbelichte eigenschappen van het framewerk die nauw met elkaar samenhangen. Met eigen gebouwde attributen is het mogelijk om metadata aan je eigen code toe te voegen. De reflectie bibliotheek is er juist om meer te weten te komen over de gebruikte code. De IntelliSense functionaliteit in Visual Studio wordt bijvoorbeeld opgebouwd door met behulp van de reflectie functies alle types met hun members uit een assembly te laden. In zijn praatje werd na de introductie een immense hoeveelheid voorbeelden over de zaal uitgestort.
Dino Esposito vertelde uitgebreid over de AJAX toolkit die verschenen is in januari van dit jaar. AJAX is de techniek om rijke web toepassingen te schrijven. De belangrijkste basis hiervan is het asynchroon maken van websites, waardoor op de achtergrond de communicatie plaats vind met de webserver, terwijl de gebruiker verder kan gaan op de oorspronkelijk pagina zonder op een refresh te moeten wachten. In de AJAX toolkit kan er op twee manieren hiermee omgegaan worden. De eerste is partial rendering, de andere is door te werken met remote services.
Deze laatste methode werkt over het algemeen met veel javascript, en vereist dat er zelf webservices aangeroepen en geschreven moeten worden door de programmeur. Voor bestaande websites betekend dit dat grote stukken code herschreven moeten worden. Vandaar dat er de eerste methode is, die op basis van brokjes html werkt en past binnen het asp.net 2.0 applicatie model. Op basis van het AJAX UpdatePanel control kan je namelijk met een snel in een eerder geschreven asp.net website AJAX principes invoegen. Alles wat binnen een updatepanel staat kan bijgewerkt worden, terwijl de pagina buiten het panel blijft staan zonder last te hebben van flikkeringen of dat je zelf javascript moet schrijven. Alle benodigde javascript browser code wordt namelijk door de UpdatePanel samen met het benodigde ScriptManager Control uitgeschreven.
Daarnaast bevat de UpdatePanel een aantal standaard functionaliteit zoals conditionele updates, standaard fout afhandeling en mogelijkheid tot het geven van voortgangsindicatoren.

Door de verscheidenheid van de presentaties is er een hoop te ontdekken op de DevDays. Het is een ideale gelegenheid om nieuwe ideeën op te doen die je in je dagelijkse werkzaamheden kunnen helpen.