The PIT
Röster från ITM-koncernen.

Open Data Protocol

March 22, 2010 13:38 by Marcus Danielsson

odataEtt av de mer spännande seminarierna jag var på under Mix10 var Open Data Protocol eller kort oData.

Det är ett API för att enkelt exponera sitt data och enkelt kunna använda det. Datat presenteras till exempel som JSON eller ATOM.

I princip kan man nå all odata direkt från en browser och alla frågor och querys mot databasen nås via REST anrop direkt i browsern. Som exempel fanns alla Mix10 sessioner och talare via oData på api.visitmix.com/OData.svc. Här kan man söka på till exempel sessioner och talare.

Allt data som finns i en Sharepoint-site kan nu nås via oData och nya Excel kan läsa oData direkt.

En site som presenterar ett oData flöde kan visa det med en ikon på samma sätt man ser att det finns ett RSS flöde.


Inslag om ITM i 19.30-sändningen av Rapport den 9e dec 2009.

December 13, 2009 16:28 by Daniel Nilsson

Mono-portalen för oss .NET-utvecklare till nya plattformar

October 5, 2009 13:54 by Lars Lundin

Android
Tack vare Koushik Dutta kan vi nu bygga och köra dotnet-applikationer på Android. Mono finns att ladda hem från Android Market och den tar upp 8 megabyte.
I skrivande stund kan endast Konsol-applikationer köras.

Läs mer om Mono:
http://www.koushikdutta.com/2009/01/mono-for-android-now-available-on.html

Mono-test på Youtube:
http://www.youtube.com/watch?v=UKanrniNCDI

 

Iphone
För Iphone finns nu MonoTouch. För mer information läs min kollega Marcus inlägg:
http://blogs.itmaskinen.se/post/2009/09/22/iPhone-utveckling-i-dotnet.aspx


Tags:
Categories: .Net | Android | Mono
Actions: E-mail | Permalink | Comments (0) | Comment RSSRSS comment feed

Be a microsoft professional

February 12, 2009 11:36 by Gunther Schmidt

Några tips för prov-förberedingar innför certiferingarna.

  • Läs boken som är Microsofts examensförberedelse.
  • Gör provfrågorna som följer med Boken på en CD.
  • kolla unde www.examcollection.com för nedladdningar av ytterliggare provfrågor.
  • Registrera Er med era windows Live id för en "second shot"
  • Börja inte plugga frågor för fullt tidigare än 3 dagar innan själva provet. Annars är de bara förvirrande i slutändan.
  • Lugna er och gå på spa kvällen innan och ta en öl! Om ni klarar av att inte vara nervös då har ni redan 50% rätt.

Gunther


Tags:
Categories: .Net | ASP | Press | Visual Studio
Actions: E-mail | Permalink | Comments (0) | Comment RSSRSS comment feed

Beräknad väntetid: 5 minuter.

February 3, 2009 13:00 by Stefan Karlsson

 

Implementerade precis “beräknad väntetid” i vårt köhanteringssystem, ni vet ett sådant där kunden trycker fram ett könummer och sedan väntar på att just det numret ska visas upp på en display så man vet vilken kassa man ska gå till. 

Det förvånade mig att det fanns så många sätt att beräkna just denna väntetid på, många uppenbarligen felaktiga också.

För tydlighetsskull så benämner jag det nummer som kunden får fram på sitt kvitto för TicketNumber och det nummer som kassören matar fram för QueNumber. QueNumber är alltså det nummer som just nu ska betjänas, det kan aldrig vara större än NextTicketNumber (Sista utskrivna TicketNumber+1).

Skillnaden i värde mellan QueNumber och NextTicketNumber är alltså detsamma som antalet kunder som står och väntar på att bli betjänade.

Variant 1

Min första approach var att varje gång en kassör matar fram ett QueNumber i kassan så sparas kassaid, quenumber och en timestamp i en tabell och därefter så är det lätt att få fram hur lång tid det tog mellan varje frammatning och på så sätt få fram en “velocity”, antal frammatningar per timme. Om man räknar fram att man har 10 frammatningar per timme och sedan tar NextTicketNumber-QueNumber (för att få fram antal väntande kunder) så kan man med den informationen räkna ut hur lång genomsnittlig väntetid det blir för de väntande kunderna. För att minska eventuella avvikelser när busslaster kommer så kan man öka tiden man beräknar på till två timmar.

En stored procedure tog snabbt fram detta:

CREATE PROCEDURE GetQueWaitTime AS 
declare @NextTicketNumber int
select @NextTicketNumber=countervalue from skibarcounters where countername='nextticketnumber'
declare @NextQueNumber int
select @NextQueNumber=countervalue from skibarcounters where countername='NextQueNumber'
declare @TicksPerTwoHours int
select @TicksPerTwoHours=count(*) from questamps where datediff(n,stamp,getdate())<120
select 120/@TicksPerTwoHours   * (@NextTicketNumber-@NextQueNumber)

 

Uppenbara nackdelar med denna metoden:

  • Om man inte haft kunder på två timmar, eller väldigt få, så blir antal frammatningar per två timmar 0 eller nära 0, vilket gör att man får en falsk väntetid. Dvs, har man bara haft två kunder så kan det bli så att systemet antar att väntetiden är 30 minuter per kund och kommer det sedan in 10 kunder så kommer systemet visa helt felaktiga väntetider mot verkligheten.
  • Början av dagen när man inte haft några kunder så kommer det inte att finnas tillgängliga data och problemet som uppstår i punkt 1 kommer att uppstå här också.
  • Har man haft kunder och man får fram en genomsnittlig tid på 5 minuters väntetid och sedan har en dödperiod så kommer de där 5 minutrarna att öka hela tiden tills man börjar mata fram nya nummer. Det är inte verklighetsbaserat att väntetiden per kund ska öka bara för att man inte råkar ha några kunder att betjäna.

      Variant 2

      Vi insåg att vi var tvugna att spara ner tidpunkten för när kunden trycker fram sitt nummer, vi modellerade om tabellen lite så att när kunden trycker fram ett TicketNumber så lagras numret och tidpunkt för utskrift och när kassan trycker fram ett QueNumber så uppdateras den raden med kassaid och tidpunkt för betjäning samt en uträknad diff i minuter mellan dessa två tidpunkter. (Genom att matcha mot kvitton skapade i kassan kan man därefter också få fram hur lång tid det tog att betjäna kunden, men det är en annan sak)

      Nu räckte det alltså med en enkel fråga för att få fram genomsnittlig tid, vi nöjer oss med att kolla genomsnittlig faktisk väntetid den senaste timmen, fältet WaitedTime är det uträknade antal minuter kunden fick vänta mellan han tryckte ut sitt könummer och tills könumret visades i displayen, vi kollar bara rader som har ett cashierid som skiljer sig från 0 för det är bara de som blivit “frammatade”:

      select avg(waitedtime) as waitminutes from questamps where

      cashierid<>0 and datediff(n,stamp,getdate())<60

       

      Jag kände mig ganska nöjd med den här lösningen först men sen när jag sovit en natt så kom jag på att denna variant inte tar hänsyn till hur många kunder som står och väntar just nu. Den gör bara halva arbetet, den säger att Senaste timmen var den genomsnittliga väntetiden 5 minuter. Men om det kommit in en ny busslass med personer så att det står 40 personer och väntar så applicerar den inte kunskapen på detta.

      Lösningen är så klart att plocka fram antalet väntande kunder och applicera den genomsnittliga väntetiden på dessa och visa ett modifierat tal för detta.

      Med den modifikationen känns det som att vi har en pålitlig uträkning för att få fram en genomsnittlig väntetid som både tar hänsyn till historik och nuvarande kösituation.

      Det jag skulle vilja lägga till för att förbättra rutinen är att man först filtrerar bort stora avvikelser, t.ex. tar bort de som avviker i tid med mer än x% från genomsnittstiden osv. För att det inte påverkar allt för mycket när 4 busslaster med danskar stormar in. Men det kan man finetune efter att man fått in lite mer verkliga data att titta på.

      Utmaning

      Har du något bättre sätt att få fram en pålitlig siffra eller en helt annan approach (jag har minst 3 varianter till att räkna ut siffran på, mer eller mindre felaktiga eller med falska utslag av väntetider osv) så kommentera gärna artikeln.


    Tags:
    Categories: Programmering | .Net | SQL
    Actions: E-mail | Permalink | Comments (0) | Comment RSSRSS comment feed

    Double vs Decimal

    November 25, 2008 10:37 by Stefan Karlsson

     

    Se nedanstående kod:

            Dim x As Double = 3.65
    
            Dim y As Double = 0.05
    
            Dim z As Double = 3.7
    
            MsgBox((x + y) & " - " & z) ' 3.7 - 3.7
    
            MsgBox((x + y) = z) ' False

     

    Som ni ser så evalueras x+y till 3.7 och när man jämför det med z som också är 3.7 så får man FALSE. 3.7 är alltså inte lika med 3.7.

    Ändra ovanstående kod till att använda Decimal istället:

            Dim x As Decimal= 3.65
    
            Dim y As Decimal = 0.05
    
            Dim z As Decimal = 3.7
    
            MsgBox((x + y) & " " & z) '3.70 - 3.7
    
            MsgBox((x + y) = z) 'TRUE

     

     

    Nu är helt plötsligt x+y samma som z.

     

    Det är alltså viktigt att förstå att Double inte alltid beter sig som man kan tro och om man nu skulle använda Double för att hantera t.ex. pengar och i ett program kontrollera om betalt belopp är samma som fakturerat belopp så kan man få oanade konsekvenser.

    Varför det blir på det här viset förklaras närmare på nedanstående länk:

    http://www.yoda.arachsys.com/csharp/floatingpoint.html

     

    Happy coding!

    /Stefan


    Tags:
    Categories: Programmering | .Net
    Actions: E-mail | Permalink | Comments (0) | Comment RSSRSS comment feed