fredag 2. desember 2011 Julekalender Polyglot AutoIt
Er du lat, og vil at noen gjør alle de kjedelige og repetetive oppgavene for deg? Hvis du i tillegg befinner deg på Microsoft's Windows-plattform bør du i såfall ta en titt på automasjonsspråket AutoIt!
AutoIt er et BASIC-lignende språk med bibloteker og verktøy for å lage makroer. Gjennom kode kan du enkelt bevege og klikke med musen, starte programmer, sende tastetrykk fra tastaturet, og generelt simulere og automatisere alt det du kan gjøre som en bruker i Windows.
AutoIt-kodefiler kan normalt kjøres ved dobbeltklikk på maskiner som har AutoIt installert. I tillegg kan skriptene kompileres til en komprimert, frittstående, eksekverbar fil som kan kjøres på andre maskiner.
La oss igjen lage en løsning på Eulerproblem nummer 1, hvor vi skal finne summen av alle tall under 1000 som er multipler av enten 3 eller 5. Jeg bruker den imperative løsningsmodellen, og har valgt å splitte det opp i to separate funksjoner – en for å finne ut om et tall skal inkluderes, og en funksjon med en løkke som summerer opp tallene.
10 Func MultipleOf3Or5($value) 11 Return Mod($value, 3) == 0 12 OR Mod($value, 5) == 0 13 EndFunc 14 15 Func SolveEuler1() 16 Dim $sum = 0 17 For $i = 1 to 999 18 If MultipleOf3Or5($i) Then 19 $sum += $i 20 EndIf 21 Next 22 Return $sum 23 EndFunc
Ikke spesielt spennende dette her. Men nå kommer rosinen i pølsa..
For å skrive ut resultatet vil jeg benytte noen av de tingene som AutoIt egner seg best til, nemlig å manipulere vinduer. I koden nedenfor åpner jeg først Notepad, skriver ut svaret i vinduet, og lukker så programmet.
Når Notepad lukkes vil det dukke opp en advarsel om at jeg har endringer som ikke er lagret. Det er jeg forberedt på, og sender tastekombinasjonen Alt+S, som trigger lagre-dialogen. Der skriver jeg inn stien jeg ønsker å lagre svaret mitt til, og sender igjen Alt+S som fullfører lagringen, og Notepad avsluttes.
25 Run("notepad") 26 Dim $answer = SolveEuler1() 27 WinWaitActive("Untitled - Notepad") 28 Send("The answer is " & $answer & "{ENTER}") 29 30 ; Provoke unsaved changes dialog, click "Save" 31 WinClose("Untitled - Notepad") 32 WinWaitActive("Notepad", "Save") 33 Send("!s") ; Alt+S for "Save" 34 35 ; Enter save location in file dialog, click "Save" 36 WinWaitActive("Save As") 37 Send(@MyDocumentsDir & "\EulerProblem1_Answer.txt") 38 Send("!s") ; Alt+S
Når jeg kjører dette skriptet vil jeg se at Notepad dukker opp, at svaret tastes inn, og at skriptet går gjennom lagre-dialogene. Til slutt er svaret lagret i My Documents-katalogen min.
AutoIt er ikke et interessant språk i seg selv. Men for automatisering av Windows er det perfekt, og et slikt verktøy burde alle utviklere på den plattformen beherske.
Mange anbefaler også AutoIt som et bra sted å begynne å lære seg programmering. BASIC-syntaksen er enkel å forholde seg til, og den direkte interaksjonen mot brukergrensesnittet kan være motiverende og inspirerende i starten.
AutoIt er en-trået. Dette gjør det vanskelig (men ikke umulig) å programmere asynkrone og paralelle ting.
Personlig synes jeg dessuten at BASIC-lignende språk er veldig slitsomme – dette til tross for at jeg først og fremst var en Visual Basic-programmerer for noen år tilbake, og til tross for at mitt aller første språk var en BASIC-dialekt, nemlig AMOS på Amiga.
Et annet språk/verktøy du kan vurdere er AutoHotKey. I stedet for å fokusere på å simulere brukere og automatisere vinduer er AutoHotKey først og fremst laget for å knytte makroer til spesielle tastekombinasjoner. Selve AutoHotKey-språket er litt mer kryptisk enn AutoIt.
Du finner AutoIt på autoitscript.com. Når du installerer det får du i tillegg et utviklingsmiljø basert på SciTE-editoren. Her er kompilatoren integrert, og man har tilgang til hjelpefiler med den informasjon man trenger for å begynne å lære språket og verktøyet, og for å lage scrips som utfører de aller fleste oppgaver.