För dem som är hemma i Unix eller Linux är små miniprogram på skrivbordet inget nytt. Vi har länge använt Windowmaker - en fönsterhanterare som utan rätt miniprogram inte ens visar en klocka.

Halva nöjet är att välja miniprogram: ett som visar datum och tid, ett som visar hur mycket nätverksbandbredd som utnyttjas, och sedan ytterligare några för alla de där onödiga men roliga funktionerna du självklart vill ha.

Det nya sidofältet i Vista är lätt att avfärda som onödigt grafiskt lull-lull, precis som det nya Aerogränssnittet. Men för den som tar sig tid att koni gurera sitt sidofält kan det bli en nyttig funktion som underlättar i det dagliga arbetet.

Här kan du snabbt och enkelt få en överblick som tidigare har varit svår att få. En administratör kan exempelvis fylla fältet med gadgets som visar hur alla servrarna mår eller vilka användare som är inloggade. 

Program som är webbsidor 


I stället för att återuppfinna hjulet och försöka lära folk något helt nytt har Microsoft här byggt på teknik som de flesta av oss är relativt bekanta med – webbsidor . En gadget är en html-sida med en tillhörande beskrivning kallad ”manifest”. Allt som kan presenteras från localhost med hjälp av en webbsida ska kunna vara en gadget – den tekniska plattformen som kan användas skiljer sig därför från dator till dator.

Här är den. När du installerat din gadget ska den dyka upp så här i gadgetpaletten. Gadgeten aktiveras genom en drag-och-släpp-operation till önskad yta i sidofältet.

I vårt exempel använder vi en standardinstallation av Vista Home Premium, så våra gadgets bör fungera på de flesta Vistainstallationer. 

Snabbt och enkelt 


Tack vare att det är dhtml som används går det väldigt snabbt att skriva en enkel gadget. På tio minuter kan du slänga upp en som exempelvis visar klockan – vilket i och för sig inte är särskilt användbart, och hur som helst redan finns. Men tyvärr är det främst just det som är enkelt – att göra enkla saker. Ju mer komplicerad du vill ha din gadget, desto mer blir webbformatet något som främst komplicerar.

Om applikationen behöver en närmare kontakt med operativet
än vad webbskripten tillåter får du falla tillbaka på active x –
knappast ett smidigt sätt att programmera. 

Manifest och skript 


Det som kallas manifestet för en gadget är en i l som har namnet gadget.xml. Denna xml-i l är startpunkten för varje gadget. Den talar om för sidofältet att det är en gadget, vad den heter, hur den ska läsas och vilken fil som är nästa steg.

I vårt exempelmanifest ser du att de flesta fälten är ganska självförklarande, men några tål att förklaras närmare: permissions, platform och apiversion. Dessa har i dagsläget inga andra acceptabla värden än de vi använder i exemplet. De två senare kommer i framtiden att användas för att kontrollera kompa tibilitet.

Man kan skapa en gadget som är ren html, men i praktiken är en sådan ganska värdelös. Vår gissning är att de flesta framöver kommer att använda VB Script. Det är det enklaste sättet att komma åt WMI från en gadget, och WMI lär vara den informationskälla de flesta kommer att använda.

Därför har vi skrivit vårt exempel i VB Script med anrop mot WMI. Exempelgadgeten visar de senaste posterna från loggarna för systemhändelser och applikationshändelser – en bra utgångspunkt för den som är intresserad av att bygga en egen gadget.

Ett annat språk som är ett naturligt val är Javaskript. Javaskript har i sammanhanget sin främsta styrka i det smidiga stödet för att via Ajax inhämta information från exempelvis rss-flöden.

Vårt eventsexempel kommer knappast att vinna några designpriser, men det visar hur lätt det är att göra sin egen gadget. Visst är det snyggt att texterna är färgkodade efter typ? Röda är felmeddelanden, blå information.

Länken nedan leder dig till en zip-fil som innehåller vårt exempel.

Så gör du egna gadgets i Vista - filer och länkar

Igen och igen 


Det är till stor del tack vare WMI som vi kan förvänta oss
en uppsjö av gadgets som är nyttiga för administratören. Via
WMI kan vi läsa ut information från AD, registret, prestandainformation, process- och resursinformation, snmp-information och mycket mer.

Det som gör det här så intressant är att gadgets är så lätta att skriva. Säkert har ni en hel de företagsspecifik information som kan vara intressant – kanske kan du via ett databasanrop få fram hur många kunder som just nu handlar i webbshoppen? Kanske en lista på varor som just nu säljer extra bra?

För att vår gadget ska göra något vettigt måste vi ha ett lämpligt sätt att aktivera den – antingen att den kontinuerligt uppdaterar informationen den visar eller att användaren aktiverar den vid behov.

För det senare kan vi utnyttja musklick eller drag- och släpphändelser – logiskt om vi exempelvis använder gadgeten för att ladda upp i ler till en server. Men i vårt fall har vi en gadget som ska uppdateras automatiskt. Därför använder vi en timer som med jämna intervall anropar en VB Script-funktion.

Timern registrerar vi i subrutinen Window_OnLoad som anropas automatiskt då sidan laddas (i webbläsare eller som gadget). Det här är långt ifrån det enda sättet att åstadkomma detta, men det är allt du behöver om du ska jobba med VB- Script. 

Information med stil


Vi har i vår exempelgadget valt att uppdatera html-sidan genom att gå via ett namngivet span-element. Det fungerar väl med både VB Script och Javaskript och gör det dessutom lätt att använda båda språken samtidigt på samma html-sida.

Den som studerar vår kod ser att den genererade html-koden speciicerar klasstillhörighet för varje element. Vi ar betar med html, och då ska vi givetvis också använda css. I vårt fall är det helt och hållet cssi len (den i nns att ladda hem från techworld.se/extra) som avgör hur vår gadget ska se ut, inklusive hur stor den ska vara. Gillar du inte vår design får du alltså se det som en möjlighet att göra din egen.

Visst kan du skapa en fungerande gadget med notepad och paint men om du ska utveckla gadgetar seriöst så vill du ha ett bra verktygsstöd. Lyckligtvis kan du helt utan kostnad ladda hem Visual Web Developer 2005 Express Edition som bör vara fullt tillräckligt för de flesta gadgetutvecklares behov. Lägg Gimp till det så har en komplett utvecklingsmiljö för gadgetar.

Så delar du inställningar 


Microsoft har utrustat gadget-api:et med funktioner för enkel lagring och inläsning av inställningar. De lagras under användarens personliga inställningar och är unika för den aktuella instansen av gadgeten. Om du vill dela inställningar mellan flera instanser finns det tyvärr ingen sådan funktion, men det går givetvis att implementera genom att skriva till filsystemet eller registret.

Png som bildformat 


Den som vill ha en riktigt snygg gadget kommer med största
sannolikhet att ha behov av bilder – webbgränssnitt är annars
inte särskilt grai ska. Det bästa valet är i så fall png.

Till skillnad från övriga vanliga format stöder det nämligen
ett alfavärde som styr opaciteten. Då Vistas sidofält är delvis
genomskinligt är det nästan ett krav för att beskriva gadgetens bakgrund om den ska smälta in riktigt snyggt. (Tyvärr uppfattade vi png-stödet i sidofältet som något buggigt – när vi kombinerade bilden med text fick vi fula missfärgningar i texten.) 

Här installerar du 


En gadget installeras genom att du skapar en katalog innehållande gadget.xml under en av de Gadgets-kataloger som finns för Windows Sidebar. Katalognamnet ska sluta med ändelsen .gadget. För den som ska installera en gadget för eget bruk gäller sökvägen %userproi le%\appdata\local\microsoft\windows sidebar\gadgets.

När katalogen är på plats ska det vara möjligt att lägga till gadgeten på sidofältet. Om den inte dyker upp i listan finns det ett fel i manifestfilen. Vanliga fel är otillåtna tecken och felaktigar xml-taggar.

Du bör vara medveten om att Microsoft har ändrat på manifestsyntaxen de tidigaste betaversionerna, så en del exempel du hittar på webben fungerar inte längre.

För en gadget som ska spridas finns ett lämpligare alternativ än att skapa en katalog. Gadgeten kan installeras som ett komprimerat arkiv i zip- eller cab-format. 

Farliga leksaker? 


Till sist ett varningens ord. Faran med gadgets är de ser så oskyldiga ut. Användaren ser dem knappt som datorprogram När det finns hundratals gadgets att ladda hem kan du var säker på att många kommer att försöka gömma skadlig kod i dem. Självklart ska vi använda denna trevliga teknik – men viss försiktighet är på sin plats. 

------------------------------------------------
Vår events-gadget – manifest (gadget.xml) 
En gadget består av en html-fil (se nedan) och detta
”manifest”, gadget.xml. Du kan ladda hem alltsammans från techworld.se/extra.

<?xml version=”1.0” encoding=”utf-8”?>
<gadget>
<name>Events</name>
<namespace>se.techworld</namespace>
<version>1.0.0.0</version>
<author name=”TW, Morgan Johansson”>
<info url=”http://techworld.se”
text=”http://techworld.se”/>
<logo src=”logo.png”/>
</author>
<copyright>© 2006</copyright>
<description>See the latest events from the event log.</description>
<icons>
<icon height=”48” width=”48” src=”icon.png”/>
</icons>
<hosts>
<host name=”sidebar”>
<platform minPlatformVersion=”1.0”/>
<base type=”html” apiVersion=”1.0.0”
src=”events.html”/>
<permissions>full</permissions>
<defaultImage src=”drag.png”/>
</host> 
</hosts>
</gadget>

Vår events-gadget – html-sida (events.html)
En gadget består av ett så kallat ”manifest” (se ovan) och en html-fil. Här ser du vårt exempel, men du behöver inte skriva av det, du kan ladda hem det från techworld.se/extra.

<html>
<head>
<title>Events Gadget</title>
<LINK REL=”stylesheet” TYPE=”text/css” HREF=”events.css” />
</head>
<script language=”VBScript”>
’ Denna subrutin anropas automatiskt då sidan öppnas.
Sub Window_OnLoad
UpdateHtml
’ Registrerar en timer som anropar ”UpdateHtml”
’ var trettionde sekund.
iTimerID = window.SetInterval(”UpdateHtml”, 30000)
End Sub
’Uppdaterar sidan
Sub UpdateHtml
DataArea.InnerHTML=LastEventHtml(”Application”) & _
LastEventHtml(”System”)
End Sub
’ En funktion som extraherar tid från den tidsstämpel som vi
’ får från WMI.
Function CWmiTime(cim_DateTime)
Dim strDateTime, iHours, iMinutes, iSeconds
strDateTime = CStr(cim_DateTime)
’Här räknar vi om från händelseloggens tid till lokal tid.
iHours = AdjustHour(CInt(Mid(strDateTime, 9, 2)) +timezoneAdjust())
iMinutes = CInt(Mid(strDateTime, 11, 2))
iSeconds = CInt(Mid(strDateTime, 13, 2))
CWmiTime = TimeSerial(iHours, iMinutes, iSeconds)
End Function
’ En modulooperation ser till s.a. timmarna inte går över 23.
function AdjustHour(h)
AdjustHour=h MOD 24
end function
’ Returnerar händelseloggens offset (i timmar) till UTC.
Function timezoneAdjust()
set oShell = CreateObject(”WScript.Shell”)
atb = ”HKEY_LOCAL_MACHINE\System\CurrentControlSet\” &_
”Control\TimeZoneInformation\ActiveTimeBias”
offsetMin = CInt(oShell.RegRead(atb))
timezoneAdjust=-CInt(offsetMin/60)
end Function
’ Hämtar den senaste händelsen från angiven logfil och returnerar informationen
’ från denna som HTML.
Function LastEventHtml(logfile)
’ Vi gör två anrop till WMI - ett för att hitta vilket indexnummer den sista
’ posten i logfilen bör ha och därefter ännu ett anrop för att hämta
’ informationen i den sista posten.
Set objLocator = CreateObject(”WbemScripting.SwbemLocator”)
Set objWMIService = objLocator.ConnectServer(”.”, ”root\cimv2”)
Set objInstalledLogFiles = objWMIService.ExecQuery(”Select ”&_
”NumberOfRecords from Win32_NTEventLogFile Where ”&_
”LogFileName = ’”& logfile &”’”)
intRecords=0
For Each objLogfile in objInstalledLogFiles
intRecords = objLogFile.NumberOfRecords
Next
if intRecords<1 then
LastEventHtml = ””
exit function
end if
Set colItems = objWMIService.ExecQuery(”Select Message,EventType,Type,”&_
”TimeGenerated,SourceName from Win32_NTLogEvent Where Logfile = ’”&_
logfile &”’ AND RecordNumber=” & intRecords)
For Each objEvent in colItems
Set ev = objEvent
Next
’ Bygger ihop den HTML-sträng som skall presenteras i gränssnittet.
LastEventHtml =”<h1>”&logfile&” log at ”& CWmiTime(ev.TimeGenerated) &_
”</h1><span class=””source””>” & ev.SourceName & ”</span>”&_
”<span class=””” & ev.Type & ”””>” & ev.Message & ”</span>”
End Function
</script>
<body>
<span id=”DataArea”></span>
</body>
</html>

Fakta

En del gadgets finns förstås inbyggda i Windows Vista. Uppifrån och ned:

• Cpu-meter – Visar pro­cessorbelastning och ram-utnyttjande.
• Feed Headlines – Det senaste från valfritt rss-flöde.
• Notes – Ersätter post-it.
• Weather – Nu behöver du inte titta ut genom fönstret för att se vad det är för väder.
• Clock – Analog klocka.

» microsoftgadgets.com – En hel del matnyttigt för
gadgetutvecklaren.
» Tre bra MSDN-länkar som vi förkortat: go.techworld.se/12, go.techworld.se/13 och go.techworld.se/14.
» Visst kan du jobba med Notepad och Paint, men om du ska utveckla gadgets seriöst vill du ha ett bra verktygsstöd. Ta hem Visual Web Developer 2005 Express Edition gratis.