Jobb

Ting som enter konkret har med jobben min å gjøre, eller det å jobbe som utvikler generelt.

.net ninja på DBA-kurs

Denne uken skal jeg og en kollega på kurs i SQL Server. Kurset heter Maintaining a Microsoft SQL Server 2008 Database.

Hææ? Skal du bli DBA nå eller?

Jeg kan komme på i alle fall tre gode grunner til at du skulle synes dette er litt merkelig, og jeg føler derfor jeg har et lite forklaringsbehov.

For det første er jeg en hardbarka koder, og er vel egentlig ikke så  opptatt av hva som skjer etter produksjonssetting?! Jeg ville satt mer pris på å lære om kompilatorbygging, domenedrevet design eller et nytt programmeringsspråk.

Dessuten har jeg jobbet med SQL Server i årevis, og burde vel kunne det som trengs nå?!

Og sist men ikke minst har jeg jo assosiert meg sterkt med NoSQL-bevegelsen, og fikk til og med tittelen db4o Valued Professional i 2010 – så disse relasjonsgreiene er vel ganske så avleggs uansett, eller hva?

Jeg har gått litt i meg selv og funnet at jeg har enkelte kunnskapshull jeg ønsker å tette. DBA-kurset skal tette ett av dem. Jeg ønsker å kunne uttale meg med autoritet om temaer som backupstrategier og katastrofeberedskap, og vite hvordan man sett opp SQL Server til å yte optimalt under gitte forutsetninger.

For selv om jeg har brukt SQL Server mye, så vet jeg at det er mye jeg ikke vet. Og selv om mange løsninger hadde blitt bedre med en ikke-relasjonsoritentert databaseløsning, så er realiteten den at vi som oftest fortsatt forholder oss til en eller annen relasjonsdatabase. Jeg har derfor bestemt for å innrømme en av mine svakheter, utfordre meg selv, og en gang for alle bli god på SQL Server.

Et Oslo-prosjekt for SMS-tjenester

Absolutt alle har en mobil. De har den med seg overalt. De leser meldingene de får nesten med en gang de mottar den. Mobile meldinger er en ekstremt effektiv og anvendelig kommunikasjonskanal man kan få utrolig mye ut av om man bruker den riktig.

Mange flere burde utnytte dette enn hva som er tilfelle i dag. Et steg i retning vil være å gjøre det enklere å utvikle skreddersydde tjenester, slik at det blir billigere og at man kan gå raskere fra idé til fungerende tjeneste.

Microsoft hadde en drøm

oslomI 2007 startet Microsoft opp et prosjekt de kalte for “Oslo”. Dette prosjektet skulle forske frem og utvikle et sett med modelleringsteknologier og verktøy. Målet var en betydelig produktivitetsøkning innenfor både utvikling og vedlikehold av systemer på .NET-plattformen, gjennom å fasilitere et mer effektivt sammarbeid mellom utviklere, arkitekter og IT-medarbeidere.

En stund var det mye publisitet rundt “Oslo”, og Microsoft hadde noen av sine beste folk på teamet (som Don Box), men det var vanskelig å forstå akkurat hva de forsøkte å levere. Etterhvert ble det klart at prosjektet skulle fremstille tre ulike teknologier. Den første biten var en sentral database for å lagre arbeidsflyt, meldingsformater, meldingsprotokoller, og andre elementer som definerer et datasystem. Denne komponenten ble etterhvert kjent som SQL Server Modeling Services.

Den neste komponenten var et modelleingsspråk for å beskrive arbeidsflyt, formater og andre ting som skulle lagres i den nevnte databasen. Dette språket fikk navnet ”M”. Og den tredje komponenten, med kodenavn “Quadrant”, var en visuell editor for å bruke språket og databasen.

På sensommeren i fjor ble det derimot klart at Oslo-prosjektet var terminert, og utvikling av både SQL Server Modeling Services og “Quadrant” ble avsluttet for godt. Bare modelleringsspråket “M”, som har vist seg å ha verdi utover det det var tiltenkt til i “Oslo”, lever fortsatt.

Så hva har dette med mobil kommunikasjon å gjøre..?

PSWinCom har også en drøm

Vi i PSWinCom har også en drøm, og vi har nå satt i gang et spennende prosjekt som på flere måter kan sammenlignes med “Oslo”. Vårt mål er å bruke vår solide erfaring på området til å gjøre det betydelig enklere å utvikle tjenester for mobil meldingskommunikasjon. Prosjektet har foreløpig fått navnet “Anchovy”, og kan revolusjonere SMS-bransjen.

sms-til-folket

Jeg har tidligere nevnt at jeg kommer til å fokusere mye på domenespesifie språk i år, og det er ikke tilfeldig. Hovedfokuset i “Anchovy” er nemlig å utvikle et språk for å forenkle sammarbeidet mellom dem som kommer opp med nye ideer til mobile kommunikasjonstjenester og dem som realiserer dem. Å utvikle f.eks. SMS-tjenester skal bli mye enklere enn det er i dag, uten at man mister muligheten til å innovere og skape helt nye tjenester som ingen har tenkt på før.

Som i “Oslo” foregår vår forskning og utvikling på tre plan:

Språk: Vi vil utvikle et språk som lar deg designe en mobil kommunikasjonstjeneste på en konsis og effektiv måte, uten at man må forholde seg til omkringliggende kompleksistet og infastruktur. Dette skal være et språk som markedsfolk og utviklere sammen kan bruke for å spesifisere hvordan en tjeneste skal fungere. I dag spesifiseres løsninger i Word, og implementeres i språk som f.eks. C#. I morgen gjøres begge deler i vårt nye språk!

Vi har en visjon om at språket kan publiseres som en åpen standard, og tas i bruk av alle som ønsker å lage tjenester for mobil meldingskommunikasjon, uavhengig av leverandør og plattform.

Verktøy: Vi vil så utvikle et solid verktøy man benytter for å spesifisere og administrere tjenester ved hjelp av det nye språket. Verktøyet vil ha innebygd støtte for å simulere meldingstrafikk, og skal dermed la deg teste tjenestene før du publiserer dem.

Motor: Til sist vil vi utvikle en motor for å kjøre tjenester definert i det nye språket. Denne motoren vil bli integrert i våre eksisterende plattformer – PSWinCom Gateway og PSWinCom Intouch – og gjøre det enkelt å publisere og drifte de nye tjenestene.

Om ikke annet vil prosjektet resultere i en enklere hverdag for utviklerne i PSWinCom; vi vil kunne produsere skreddersydde SMS/MMS-løsninger for våre kunder raskere enn noen gang tidligere. Får vi til det vi håper vil prosjektet også gjøre det enklere for våre kunder å lage sine egne tjenester, uten at vi må være involvert. Og har vi suksess vil språket vårt (og kanskje også verktøyene vi lager) bli akseptert og tatt i bruk som en ny standard i mobilbransjen.

Så får vi bare håpe “Anchovy” får en bedre utgang enn det “Oslo” fikk.

PSWinCom lanserer nytt API og teknisk wiki

De siste ukene har vi i PSWinCom jobbet med å utvikle et nytt integrasjonsgrensesnitt mot et av produktene våre. Intouch er en webapplikasjon hvor man kan organisere grupper og kontakter, sende meldinger til grupper, sette opp ulike SMS-tjenester, m.m. Og nå har den fått seg sitt eget REST API. Den potensielle verdien av Intouch, for dem som kan utnytte integrasjonsmuligheten, øker med dette betraktelig.

Det har vært veldig spennende å forsøke å designe et godt grensesnitt, og selv om dette er en første versjon så er vi ganke stolte over resultatet. Vi tror at vi har kommet opp med noe som vil være veldig greit å forholde seg til – for typiske enterprice-utviklere som bruker .NET eller Java, men også for utviklere som først og fremst bruker PHP eller lignende. Hos oss skal alle få!

wiki.pswin.com

Samtidig som vi introduserer et nytt API lanserer vi også en wiki hvor vi vil vedlikeholde våre tekniske spesifikasjoner og annen dokumentasjon og eksempler. Vi er igang med å overføre det vi har fra før, og regner med at dokumentasjonen vil være ganske up-to-date om en ukes tid. Vi tror at kundene våre vil sette pris på det nye formatet – med bedre muligheter for søking, bokmerking osv. Det vil også gjøre det enklere for oss å tilby dokumentasjon med knall kvalitet, fordi mange kan bidra, og fordi wiki-formatet gjør at dokumentasjonen kan vokse organisk.

Her forklarer oppfinneren av wiki-konseptet hva som gjør det så velegnet til denne typen dokumentasjon:

Besøk wikien vår på wiki.pswin.com.

Til slutt må jeg nesten nevne at jeg selvsagt klarte å snike inn litt Clojure i dette prosjektet også. For dem som ikke har tilbrakt så mye tid på denne bloggen så er det mitt favoritt-progammeringsspråk for tiden. Jeg har implementert et eksempelprogram i clojure som bruker det nye API’et vårt – og hvis den koden ikke får deg til å se lyset og få lyst til å jobbe med Clojure og REST så vet ikke jeg… ;) Se eksempelkoden på wikien her.

Implementere toveis SMS i .Net

At en tjeneste benytter toveis SMS vil si at den både kan motta meldinger fra brukere (mobile originated, MO), og at den kan sende meldinger til brukere (mobile terminated, MT). Å lage en slik tjenste som bruker PSWinCom’s SMS gateway er veldig enkelt, takket være gode integrasjonsgrensesnitt. I denne artikkelen vil jeg implementere en slik tjeneste i .NET / C#.

Jeg registrerer meg hele tiden på ulike nettsteder, som alle ber meg om å spesifisere et passord. Og da er det veldig dumt å bruke det samme passordet hele tiden. Jeg ønsker derfor å kunne sende kodeord PASSORD til et bestemt telefonnummer, og få tilbake et garantert tilfeldig passord jeg kan bruke. Denne tjenesten er altså tiltenkt sikkerhetsfanatikere med dårlig fantasi.

toveis_sms

For å lage tjenesten vil jeg implementere en web service som jeg kan hoste i IIS. Tjenesten har to integrasjonspunkt: Ett SOAP-endepunkt må implementeres for å motta SMS-meldinger fra gateway’en, og i tillegg må tjenesten kalle en tilsvarende SOAP-tjeneste som gateway’en eksponerer når vi ønsker å sende melding tilbake til brukeren som ber om et passord.

For å lage en slik tjeneste trenger jeg produktet Gateway standard (produktark), og PSWinCom må registrere URLen til tjenesten min for kodeordet jeg vil bruke. Det er mulig å få demokonto for dem som ønsker å teste mulighetene. Det kan også være lurt a lage sin egen test-gateway (fakeway) om man vil teste tjenesten uten å nødvendigvis sende og motta SMS’er – det vil komme en egen blogpost om hvordan man enkelt kan gjøre dette.

Grensesnitt for innkommende meldinger

Å bruke SOAP-grensesnittet for mottak av SMS-meldinger i .Net er veldig enkelt. Først starter du Visual Studio Command Prompt, og bruker kommandoen wsdl for å generere et service interface.

Kommando for å generere SMS receive service interfaces:
wsdl /namespace:RandomPasswordService /serverInterface https://secure.pswin.com/SOAP/Receive.asmx?wsdl

Dette vil resultere i en fil som heter SMSReceiveInterfaces.cs. Den inneholder blant annet et interface som heter ISMSReceiveSoap. For å kunne ta imot meldinger må vi lage en web service som implementerer dette interfacet.

Grensesnitt for utgående meldinger

For å sende SMS-meldinger fra passord-tjenesten kan vi bruke et lite bibliotek, PSWinCom SMS Gateway Client for .NET, som kan lastes ned fra pswin.com. Om du ønsker å generere en SOAP proxy selv kan du gjøre det i stedet. All informasjon du trenger finner du i dokumentasjonen over grensesnittene.

RandomPasswordService-prosjektet

Jeg oppretter så et nytt ASP.NET Web Application prosjekt i Visual Studio som skal bli passord-tjenesten vår. Jeg sletter Default.aspx, og legger i stedet til SMSReceiverInterfaces.cs som jeg genererte, samt en referanse til PSWinCom.Gateway.Client.

Deretter legger jeg til en web service jeg kaller Password.asmx. Det er i denne servicen vi skal implementere interfacet for å håndtere innkommende meldinger. Til slutt legger jeg til en ny klasse-fil jeg kaller RandomDotOrg.cs hvor jeg vil implementere generering av passord, og rydder litt opp i dll-referansene.

CropperCapture[72]

Jeg er nå klar til å implementere tjenesten. I web servicen sin code behind sørger jeg først for å endre WebService namespace til http://pswin.com/SOAP/Receive (ikke glem dette!). Deretter sier jeg at Password skal arve fra ISMSReceiveSoap, og får Visual Studio til å generere stubs for metodene jeg trenger. Etter et par minutter er tjenesten ferdig:

    1 using System;
    2 using System.Web.Services;
    3 using PSWinCom.Gateway.Client;
    4 
    5 namespace RandomPasswordService
    6 {
    7     [WebService(Namespace = "http://pswin.com/SOAP/Receive")]
    8     [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
    9     [System.ComponentModel.ToolboxItem(false)]
   10     public class Password : WebService, ISMSReceiveSoap
   11     {
   12         #region ISMSReceiveSoap Members
   13 
   14         public ReturnValue ReceiveSMSMessage(IncomingSMSMessage m)
   15         {
   16             try
   17             {
   18                 Send(new Message
   19                 {
   20                     ReceiverNumber = m.SenderNumber, // return to sender
   21                     SenderNumber = m.ReceiverNumber,
   22                     Text = RandomDotOrg.GetNewPassword(),
   23                 });
   24             }
   25             catch { /* Log this !! */ }
   26             return new ReturnValue { Code = 200 };
   27         }
   28 
   29         public ReturnValue ReceiveDeliveryReport(DeliveryReport dr) {
   30             throw new NotImplementedException(); // not interested
   31         }
   32 
   33         public ReturnValue ReceiveMMSMessage(IncomingMMSMessage m) {
   34             throw new NotImplementedException(); // not interested
   35         }
   36         #endregion
   37 
   38         private void Send(Message message)
   39         {
   40             var smsClient = new SMSClient()
   41             {
   42                 Username = "",          // your Gateway username
   43                 Password = "",          // your Gateway passord
   44                 PrimaryGateway = "",    // the Gateway URL
   45                 SecondaryGateway = ""// backup Gatetway URL
   46             };
   47             smsClient.Messages.Add(0, message);
   48             smsClient.SendMessages();
   49         }
   50     }
   51 }

Metoden ReceiveSMSMessage kalles av gatewayen når det ankommer en ny melding. Interfacet har et par metoder til, for å ta imot meldingskvitteringer og MMS-meldinger, men de er jeg ikke interessert i her.

Jeg har laget en egen metode for å sende ut meldinger (linje 38), og det er her jeg bruker PSWinCom.Gateway.Client. Her kan du hente inn brukernavn, passord etc. fra konfigurasjonsfilen eller lignende.

Merk at jeg må returnere statuskode 200 fra ReceiveSMSMessage for å bekrefte at jeg klarte å ta imot meldingen. Hvis jeg ikke gjør dette vil gatewayen forsøke å sende meldingen på nytt (i henhold til definerte retry-regler).

Det er selvsagt mye som kan gjøres i forhold til feilhåndtering etc. Jeg ville normalt også inkludert endel logging. I tillegg kunne jeg ha benyttet meg av informasjonen i den innkommende meldingen, som hvilket kodeord som ble benyttet, eller hva den øvrige meldingsteksten var. Jeg kunne for eksempel lagt opp en mulighet for at brukerne kunne spesifisere hvor langt passordet skulle være ved å sende PASSORD n, hvor n er antall tegn.

Random passord

Det eneste som gjenstår er å implementere generering av passord. Til det vil jeg bruke en tjeneste som heter random.org, som gir meg ekte tilfeldighet, noe jeg ikke kan få til selv på windows. Her er GetNewPassord, som gjør et web-kall til random.org for å hente en random streng á 8 tegn.

    1 using System.Net;
    2 
    3 namespace RandomPasswordService
    4 {
    5     public static class RandomDotOrg
    6     {
    7         public static string GetNewPassword()
    8         {
    9             using (var webClient = new WebClient())
   10             {
   11                 return webClient
   12                     .DownloadString(
   13                     "http://www.random.org/strings/?" +
   14                     "num=1&len=8&digits=on&upperalpha=on" +
   15                     "&loweralpha=on&unique=on&format=plain&rnd=new")
   16                     .Trim();
   17             }
   18         }
   19     }
   20 }

(Merk at random.org har en quota per IP-adresse. Les guidelines for automated clients om du ønsker å benytte deg av random.org.)

Så der har du det altså, en komplett, toveis SMS-tjeneste i .Net / C# (som i tillegg kommuniserer med en ekstern tjeneste) på 71 linjer. Så hvis du har en god idé til en SMS-tjeneste bør du i alle fall ikke la kompleksiteten stopp deg, for så veldig mye enklere blir det ikke. 

Som nevnt skal jeg også skrive en artikkel om hvordan du kan teste tjenesten din uten å bruke PSWinCom’s gateway, så følg med om du er interessert i det.

Relatert artikkel: Dagens sitat via SMS (énveis SMS m/Ruby og XML over TCP).

Sommertur 2010

BC_og_Nelsson Turens nest-mest omtalte bilde :)

Jeg er på en solid opptur etter en legendarisk PSWinCom-helg på Sørlandet. Turene våre er veldig godt organiserte, inneholder litt for enhver smak, og gjengen har et godt samhold og et alltid upåklagelig humør. Jeg kan ikke forestille meg at noen andre har så bra firmaturer som oss. Jeg har sagt det mange ganger før, men PSWinCom er en helt unik gjeng som jeg er stolt av å få være en del av.

Det er mye jeg kunne ha fortalt om. Og noen ting vi kanskje bør holde for oss selv. Jeg synes Henriks oppsummering var ganske bra:

“Denne helga har eg: Sett en løve på en halv meters avstand. Holdt en tarantell og en boa-slange. Nesten blitt tissa på av Mr. Nelson apekatter. Drukke meg fra sans og samling. Møtt mange kåte og galne folk fra Setesdalen. Hørt på Abba i en maxitaxi som gynga så masse at eg lurte på om eg var i en båt. Drukke enda meir. Spydd. Gått i Knut Hamsuns fotspor. Sett en av Ibsens tidlige arbeidsplasser. Tøffa gjennom blindleia i båten som General Franco forærte sin datter i 1940. Ete masse god mat. Drukke litt til.., og no e eg faktisk litt sliten. Men fornøgd! Aldri et kjedelig øyeblikk på tur med PSWinCom!”

Takk til Anne Grethe som styrte showet, som var flink til å passe på tiden, og sendte ut nabovarsel i forkant! Takk til Audun som ofret foten for laget sitt. Takk til Espen, den eneste som mener det ble kåret en vinner i vollyballturneringen. Og takk til Bjørn for den vakre talen “til minne om” Espen. Takk til deejay Veronika som holdt meg med røyk. Takk til BC for mye underholdning.

Takk til Gro som ble bedre og bedre i ryggen jo mer du drakk. Takk til Rune med de vanskelige servene, som dro nystemten med rusten whiskeystemme. Takk til Ivar for måten du suste ned tømmerrenna. Takk til Henrik som drakk tequila. Takk til Ingebjørg som fortjent fikk salgs- og markedsavdelingens hederspris og en nydelig sang. Og takk til Roald som holdt fortet hjemme i Bergen.

Takk for en flott opplevelse!

Guru og teamleder

Til mobilkonferansen i år slapp vi i PSWinCom den første utgaven av vårt nye magasin Intouch. Bakerst i bladet kunne man lese et aldri så lite intervju med undertegnede. Jeg regner med at det kommer en digital utgave av Intouch også, men for dem som ikke klarer å vente – her er i alle fall intervjuet… (klikk bildet)

Guru

Det er kjekt å få lov til å fronte et firma og en utviklingsavdeling som jeg er så veldig stolt av, og utviklingsmetodikker jeg har så stor tro på. Eneste faren med ting som dette er at mitt ego vokser seg så stort at det sprekker.

EM i mobile plattformer

CropperCapture[63] Mobilen er den nye PC’en – datamaskinen alle går rundt med hele tiden – og derfor er det en ekstremt viktig plattform vi utviklere må ta tak i og jobbe mer mot. Om du ønsker å lære hvordan du best utnytter mobilen for kommunikasjonsløsninger og som softwareplattform bør du dra på Mobilkonferansen 4. og 5. mai.

Google vs. Microsoft vs. BlackBerry

Blant foredragsholderne finner du Scott Beaumont, en av de helt sentrale skikkelsene innenfor Google‘s massive mobilsatsing. Scott vil gi deg de heteste nyhetene om Google Mobile, og avsløre selskapets syn på den mobile fremtiden.

Microsoft er også representert med ingen ringere enn Knut Aasrud, tidligere toppsjef i Microsoft Norge, og nå General Manager Communications for Europa, Midtøsten og Afrika. Knut vil snakke om Microsofts valg av strategi mot bedriftsmarkedet for software & services, og selvsagt om Windows Phone 7.

BlackBerry-telefonene er representert ved nederlenderen Ronald Mol fra RIM (Research In Motion), en tungvekter i mobilbransjen. Mol sitt foredrag på Mobilkonferansen vil handle om Enterprise Mobility – hva dette betyr for ulike virksomheter, hvordan det brukes i dag og hvordan utviklingen ser ut til å gå fremover.

Andre som er representert blant foredragsholderne er Telenor, Skandiabanken, SmartPhones, ErgoGroup, Innovasjon Norge, Forbrukerombudet, More Mobile Relations, Bipper og PSWinCom, i tillegg til den folkekjære programlederen og nå toppsjef i Skandinavias største kommunikasjonshus – Arne Hjeltnes fra Creuna. Se det fullstendige programmet her, for påmelding gå her.

Slette/tømme MSMQ-køer med IronRuby

Utviklingsavdelingen i PSWinCom har akkurat begynt å lære seg Ruby, og jeg har derfor kodet noen scripts som jeg har dokumentert ganske grundig – sånn at det går an å lære noe av å lese dem. Dette er et faktisk IronRuby-script jeg bruker for å slette eller tømme alle private MSMQ-køer på lokal maskin (vi jobber mye med køer, og trenger ofte å rydde opp miljøet).

Så i tilfelle dette kan hjelpe andre – her er koden:

  1 =begin
  2   This is a comment :)
  3
  4   Ruby scans scripts from top to bottom. This means it should make
  5   sense when you to read it that way too.
  6
  7   The scull and bones art is contained in something called a
  8   here-document. Google it if you want to know more…
  9  
10   (I had to escape the backslashes, so it looks a bit off in the
11   source, but the output should be nice.)
12 =end
13 puts <<EOF
14                _______________
15               /               \\ 
16              /                 \\ 
17             /                   \\ 
18             |   XXXX     XXXX   |
19             |   XXXX     XXXX   |           PSWinCom MSMQ IronRuby script
20             |   XXX       XXX   |
21             |         X         |           —————————–
22             \\__      XXX      __/
23               |\\     XXX     /|                  A L L   Q U E U E S
24               | |           | |
25               | I I I I I I I |             —————————–
26               |  I I I I I I  |
27               \\_             _/            Hope you know what you’re doing
28                 \\_         _/
29                   \\_______/
30           XXX                    XXX
31          XXXXX                  XXXXX
32          XXXXXXXXX         XXXXXXXXXX
33                 XXXXX   XXXXX
34                    XXXXXXX
35                 XXXXX   XXXXX
36          XXXXXXXXX         XXXXXXXXXX
37          XXXXX                  XXXXX
38           XXX                    XXX
39
40 EOF
41
42 =begin
43   The Actions class contains a method for each of the available
44   command line options. To add another option it should be enough
45   to expand this class with a new method.
46 =end
47 class Actions
48   # You create “static” methods (we actually call it class methods)
49   # by applying ‘self.’ in front of the method name. Here self refer
50   # to the class, and it could also be written ClassName.method_name.
51   def self.list queue # method named “list”, takes one argument “queue”
52     puts queue.path
53   end
54   def self.delete queue
55     puts Deleting #{queue.path}..
56     MessageQueue.delete queue.path
57   end
58   def self.purge queue
59     puts Purging #{queue.path}..
60     queue.purge
61   end
62   def self.exit
63     puts Usage: ir all_queues.rb action
64     puts        where action in [list|delete|purge]
65     Kernel.exit(0) # This is a nice way of ending a script
66   end
67 end # class Actions ends here..
68
69 =begin
70   The rest of the script is not contained in a class. You may feel dirty
71   the first couple of times you do this, but it’s fine – I promise!
72 =end
73
74 mode = $*.shift # get the first command line option passed to this script
75 Actions.exit unless mode # call exit if no mode (if mode == nil)
76
77 =begin
78   Load the .Net dll.
79   This is the only line of the script that will look strange to a normal
80   Ruby-developer that haven’t used IronRuby.
81 =end
82 load_assembly System.Messaging
83
84 =begin
85   By including the System::Messaging namespace in this script, I’m able to
86   use the classes in the namespace directly. If I hadn’t done this I would
87   have to use System::Messaging::MessageQueue instead of just MessageQueue.
88
89   Notice that when Ruby was parsing the Actions class, which use the
90   MessageQueue class, the System.Messaging.dll was not jet loaded, and the
91   namespace not yet included. That is fine however – when actual execution
92   enters the Actions class’s queue methods (when the methods are called),
93   the namespace will be there.
94 =end
95 include System::Messaging
96
97 =begin
98   Getting queues. MessageQueue.get_private_queues_by_machine in ruby corresponds
99   to MessageQueue.GetPrivateQueuesByMachine in C#.
100 =end
101 all_queues = MessageQueue.get_private_queues_by_machine(.) # ‘.’ == local machine
102
103 # Let user know if there are no queues to perform action on
104 puts No queues available if all_queues.length == 0
105
106 =begin
107   The following line is very similar to C#’s List<T>.ForEach(Action<T> action).
108   For each queue I call the appropriate action. I do this by sending the
109   command line option (mode) as a message to the Actions class. The method
110   with the correct name will be called. The second argument will become the
111   argument to the actual method.
112 =end
113 all_queues.each {|queue| Actions.send(mode, queue) }
114
115 puts . # Just an end-of-program indicator

For å for eksempel liste alle køene eksekverer man "ir all_queues.rb list" i kommandolinjen (all_queues.rb er navnet på skriptet og ir er IronRuby). Skriptet benyttes på egen rissiko, jeg tar ikke ansvar for tapte data eller andre problemer som måtte oppstå ;)

PSWinCom drar til Qcon London 2010

qcon-logoI mars pakker fire utviklere fra PSWinCom kofferten og drar på utviklerkonferanse: QCon London 2010. QCon er en årlig konferanse som sier de retter seg mot arkitekter, teamledere og prosjektledere, men alle som brenner for systemutvikling vil garantert finne mye av interesse.

Konferansen har ikke noe leverandør-fokus, og dekker arkitektur og design i en nøytral kontekst. QCon 2010 har hele 15 spor, og strekker seg over tre dager. Sentrale tema er ting som utvikling innen programmeringsspråk, craftsmanship, smidige metoder og test-dreven utvikling, nettskyen, browseren som plattform, og SOA. Java og .NET, som de to viktigste utviklingsmiljøene for enterprise, har også hvert sitt spor.

QCon er en konferanse som trekker the best of the best i bransjen. Denne gangen har arrangørene samlet 100 forelesere(!!!), og keynotes holdes av Dan Ingalls (Smalltalk-gud) og Uncle Bob “I want to code till I die” Martin. Her er 15 glimrende grunner til at vi drar i år:

qcon

Jeg er spesielt interessert i foredragene som fokuserer på concurrency og skalering, og tror vi kan plukke opp mye bra her som kan gjøre PSWinCom’s produkter og leveranse enda bedre. Allerede nå har jeg bestemt meg for å følge sporene Software Craftsmanship og The Concurrency Challange nøye – sistnevnte med sterkt fokus på funksjonsbaserte språk som Erlang og Haskell. Bortsett fra dette blir det som vanlig en ganske stor utfordring å besteme seg for hvilke av de parallelle sesjonene man skal gå på – f.eks. høres både Pragmatic Cloud Computing og Irresposible Architectures and Unusual Architects ut som veldig spennende spor, og kolliderer ganske kraftig.

NNUG har forresten fått til en deal med QCon, hvor alle medlemmer får £297 av på fullpris om de registrerer seg før 22. februar (med koden “NNUG”). Vi er en liten gjeng fra Bergen som drar over sjøen, og forhåpentligvis kommer det noen fra andre steder av landet også. NNUG kommer til å arrangere en sosial samling i løpet av konferansen på et egnet sted (hørte jeg pub? Selvsagt hørte jeg pub!). Hvis du som leser dette også skal på QCon så hadde det vært hyggelig om du la igjen en kommentar så vi vet om deg!

Hva med NDC 2010 da? I fjor var jeg veldig gira på å dra på NDC, og det ble en flott konferanse med mange, spennende sesjoner. Det ser ut til å bli minst like bra i år, og det vil nok føles litt rart når norges utvikler-community samles i Oslo uten oss i sommer – men for vår del hadde vi lyst til å gjøre noe nytt, så da ble det QCon denne gangen.

Dagens sitat via SMS

Jeg fortsetter å rote med Ruby, og deler villig med alle som har lyst til å lære. Denne gangen har jeg laget et lite skript som henter et daglig oppdatert visdomsord fra nettet, og sender det til en distribusjonsliste på SMS via PSWinCom‘s SMS Gateway. Programmet illustrerer hvor enkelt det er å hente og parse en RSS-feed, bruk av konfigurasjonsfiler i YAML-format, og sending av XML til en server over TCP (ett av PSWinCom’s mange integrasjonsgrensesnitt).

ruby_quote

Det komplette programmet er listet ut nedenfor. La meg kjapt gå gjennom de ulike delene:

Metoden get_quote (linje 5 til 11) tar inn URL’en til en RSS-feed fra BrainyQuote som gir meg ett nytt sitat hver dag. Jeg åpner en connection mot adressen, og parser den med RSS-parser som er en del av Ruby’s grunninstallasjon. Jeg plukker ut det første elementet, slår sammen beskrivelsen (selve sitatet) og tittelen (hvem sitatet stammer fra), og returnerer dette (siste statement i en ruby-metode returneres automatisk).

Metoden get_sms_xml (linje 13 til 28) tar inn nødvendige parametre og bygger opp XML’en jeg skal sende til SMS Gateway’en. Dokumentasjon av dette formatet er definert i denne pdf’en. I metoden bruker jeg noe som kalles for et Here-Document – en “tradisjonsrik” måte å definere strenger over flere linjer på som du også finner i PHP, Perl, Python, Unix shells, Windows Powershell etc.

Metoden send_sms (linje 30 til 34) åpner en TCP socket på en gitt adresse og port, sender XML’en, og avslutter. Det er alt som skal til for å sende SMS gjennom systemet vårt.., så sant du har en konto vel-å-merke.

QuoteSMS.rb:
1 require rss
2 require open-uri
3 require yaml
4
5 def get_quote uri
6   open(uri) do |con|
7     rss = RSS::Parser.parse(con.read, false)
8     quote = rss.items.first
9     #{quote.description} -#{quote.title}
10   end
11 end
12
13 def get_sms_xml gw, receivers_xml, text
14 <<EOF
15 <?xml version=”1.0″?>
16 <SESSION>
17 <CLIENT>#{gw[:client]}</CLIENT>
18 <PW>#{gw[:password]}</PW>
19 <MSGLST>
20 <MSG>
21 <TEXT>#{text}</TEXT>
22 #{receivers_xml}
23 <SND>#{gw[:sender]}</SND>
24 </MSG>
25 </MSGLST>
26 </SESSION>
27 EOF
28 end
29
30 def send_sms gw, xml
31   session = TCPSocket.new(gw[:host], gw[:port])
32   session.write xml
33   session.close
34 end
35
36 settings = YAML.load_file(settings.yml)
37
38 quote = get_quote settings[:quote_uri]
39 xml = get_sms_xml(settings[:gateway],
40                   settings[:receivers].map {|r| <RCV>#{r}</RCV>},
41                   quote)
42 send_sms settings[:gateway], xml

I linje 36 leser jeg inn konfigurasjonsdata (mer om dette om litt). Deretter er det bare å kalle de tre metodene, og hey-presto(!) så er jobben gjort. Nå kan jeg for eksempel sette opp en scheduled task til å kjøre dette programmet hver dag, og “spamme” mine venner med gode sitater på telefonen.

Legg merke til linje 40 som konverterer en array av telefonnumre til en XML streng array vha. metoden map. Dette tilsvarer å bruke Select-metoden i Linq i .NET:

    1 var list = new long[] { 4700000001, 4700000002, 4700000003 };

    2  IEnumerable<String> xml = list.Select(phonenumber

    3      => string.Format(“<RCV>{0}</RCV>”, phonenumber));

Det at jeg kan skyte inn arrayet i en annen streng som i linje 22, og at elementene da “flates ut” til én streng er minst like kult. Tilsvarende får du ikke til i .NET uten å eventuelt endre definisjonen av ToString() for enumerasjonen det gjelder. Let’s not go there…

YAML Ain’t Markup Language

Som sagt har jeg valgt å bruke YAML som format på konfigurasjonsfilen til dette programmet. YAML er et serialiseringsformat som er tilgjengelig for mange programmeringsspråk. Fordelen er at det er mye mere lesbart og editeringsvennlig enn XML, som har vært det mest populære formatet i noen år nå. YAML har mer til felles med JSON.., I praksis er JSON faktisk et subset av YAML. 

settings.yml:
1
2 :gateway: 
3   :port: 9876
4   :client: demoAccount
5   :password: somePassw0rd
6   :host: 127.0.0.1
7   :sender: RubyQuote
8 :quote_uri: http://feeds.feedburner.com/brainyquote/QUOTEBR
9 :receivers:
10   - 4790000001
11   - 4790000002
12   - 4790000003

Denne settingsfilen definerer en Hash (el. dictionary om du vil) med tre nøkler med tilhørende verdier. Som nøkler har jeg brukt symboler – de tingen som begynner med kolon i Ruby – men strenger eller andre datatyper hadde fungert like fint. Nøkkelen :gateway har en ny Hash som verdi, som definerer settingene for å kontakte og bruke PSWinCom gatewayen. :sender gir for eksempel navnet jeg har valgt på avsenderen (se bildet av mobilen tidligere i artikkelen). Og nei, dette er ikke reelle brukernavn og passord…

Nøkkelen :quote_uri refererer til en streng som inneholder RSS-adressen. :receivers refererer til en array med telefonnummer. Når denne filen parses får jeg tilbake en Hash med alle disse verdiene i korrekte typer.

YAML er heller ikke begrenset til primitive typer som streng, arrays osv – man kan også serialisere og deserialisere Ruby-objekter man selv definerer, uten at det ser spesielt mer komplisert ut enn filen over. Faktisk trenger det egentlig ikke eksistere noen definisjon av objektene i programmet i det hele tatt – YAML-parseren vil konstruere nye typer om det trengs basert på det som er definert i YAML-filen. Ruby er jo tross alt et dynamisk språk. Ganske fiffig faktisk!

Konklusjon

Du har nå sett hvor enkelt det er å hente og parse en RSS feed. Du har også sett hvor smertefritt det er å sende SMS vha litt XML og PSWinCom’s SMS Gateway. Og hvis ikke du fikk lyst til å bytte ut alle XML-konfigurasjonsfilene dine med YAML så har jeg kanskje forklart litt dårlig hvor kult det er.

Objektorienteringen er kanskje ikke så mye å skryte av, men for et program på 42 linjer ville det bare ha vært i veien. Håper dette inspirerte!

Se også: Send SMS med SOAP for hvordan du enkelt kan bruke PSWinCom’s SOAP-grensesnitt for sending i .NET.


Torbjørn: La oss anta to ulike definisjoner av Template Method pattern - de to ytterpunkte...

Lars-Petter: Hei igjen. Siden du inviterer til å ta diskusjonen i bloggen, og har tatt deg t...

Torbjørn: Lars-Petter: Det er én måte å se det på. Det er absolutt fortsatt Template M...

Lars-Petter: Hei. Har du ikke i prinsippet her gått over fra Template Method (arv) til Strat...

Christian Abildsø: I alle fall i C#, så føles dette som kode som blir mer fleksibel men vanskelig...

Torbjørn: Hei Henrik, og takk for tilbudet. Ble oppmerksom på Rasberry Pi for under en uk...

Henrik Sandaker Palm: Ang. større hobby prosjekt. Du er som er en slik rakker på programmering har j...

Øivind Nilsen: Slutt å bruke mobilnummeret mitt som eksempel !...

Bjørn Einar Bjartnes: Jeg har også latt meg fascinere av Clojure, uten at jeg har kommet så veldig l...

Bjørn Einar Bjartnes: Sweet :) Jeg tror egentlig jeg liker det som det er, med musikk. Litt av utford...

 Hold deg oppdatert

Søk i bloggen

Ferske innlegg

  • Template Method del 4: Multippel arv
  • Template Method Intermesso
  • Template Method del 3: Bare funksjoner
  • Template Method del 2: På vei mot funksjonell programmering
  • Kategorier

  • .net ninja (37)
  • Bøker (17)
  • Diverse prosjekter (35)
  • DSL (10)
  • Erlang (10)
  • F# (5)
  • Hardware (1)
  • Jobb (77)
  • Julekalender (51)
  • kjempekjekt.com (23)
  • LISP/Clojure (33)
  • NNUG / community (60)
  • O/RM & databaser (10)
  • Off topic (116)
  • OO-design/clean code (30)
  • Podcasts (14)
  • Polyglot (77)
  • Ruby (27)
  • Silverlight / RIA (3)
  • Software/verktøy (20)
  • Softwareutvikling (20)
  • Testing / TDD (30)
  • the contiki strip (13)
  • User experience (3)
  • WCF (3)
  • Webutvikling (32)
  • WPF (9)
  • WTF (12)
  • Last ned Wallpaper

    Programmeringsbloggens tøffe skrivebordsbakgrunn med snippets fra ulike språk laster du ned her!

    Abonner via epost

    Om du vil kan du få alle nye blogposter tilsendt til din epost. Abonner nå, det er kjempeenkelt!

    Meta