Home » Andet » JavaScript på desktoppen
JavaScript på desktoppen

JavaScript på desktoppen

Share

Du hører måske samme gruppe som undertegnede som tænker på
web-applikationer når du hører sproget JavaScript omtalt. De seneste par år er JavaScript
dog stille og roligt begyndt at indtage desktoppen. Det skal vi se lidt nærmere
på her

Programmeringssproget begyndte sine dage som et enkelt sprog i Netscape-browseren. Indtil da var alt kode i web-applikationer blevet udført på serveren. Desværre kan det virke meget lidt interaktivt for brugeren, og med JavaScript kan web-udvikleren lade små funktioner bliver udført i klienten (eller browseren) helt tæt på brugeren. Med AJAX-kald har web-applikationer udviklet sig til at være en meget interaktiv fornøjelse, og web-applikationer begynder at ligne desktop-applikationer mere og mere.

JavaScript er på mange måder et elegant programmeringssprog. Det er objekt-orienteret uden brug af klasser. Objekter er prototyper og nye objekter kan udvide eksisterende. På den måde er der ikke brug for en kompliceret semantik (og syntaks) for nedarvning. Det betyder, at sproget ikke minder om C++, Java eller C# i dets omgang med objekter.

Endvidere har JavaScript lånt meget fra funktionssprogene (Lisp, Haskell, ML, etc.), hvilket betyder, at funktioner rangerer på samme niveau som objekter, heltal og strenge.

Alle disse fine egenskaber ved JavaScript har tiltrukket en lang række meget dygtige programmører. Når de så er gået i gang med nye produkter og projekter, har de valgt at bruge JavaScript. Samtidig har vi set udvikling af mange JavaScript-fortolkere – både i open source (Mozilla SpiderMonkey og Google V8) og lukkede (Microsoft og Adobe). På den måde er JavaScript blevet meget udbredt og begyndt at sive ud på desktoppen og som indlejret sprog i mange applikationer.

Allerede aktive produkter

Der findes allerede nu et voldsomt stor mængde produkter og open source-projekter som bruger JavaScript på den ene eller anden måde. Enhver moderne web-browser har JavaScript indbygget, og for eksempel Firefox stiller JavaScript-fortolkeren til rådighed til udvidelser. En Firefox-udvidelse består blandt andet af en række JavaScript-funktioner. Oplever du ofte, at du ønsker at udføre bestemte operationer på web-sider, kan du let skrive et stykke kode i JavaScript og lade udvidelsen GreaseMonkey afvikle det. Adobe Reader kan på samme måde udvides ved hjælp af JavaScript.

Apple introducerede JavaScript til desktoppen med Mac OS X i form af små programmer, der omtales som Dashboard. Det store open source-projekt KDE er fuldt efter, og i version 4 kodes plasmoids i JavaScript. Både Google og Yahoo har med deres gadgets og widgets et lignende system. Fælles for disse små programmer (applets) er, at de afvikles i et lukket miljø og ikke er fulde desktop-applikationer.

Adobe har med deres AIR givet udviklere mulighed for at skrive hele applikationer med til desktoppen. AIR findes til både Windows, Linux og Mac OS X, og JavaScript er en del af denne store pakke.

Mens Adobe AIR er et kommercielt produkt, findes der en lang række open source projekter, som gør det muligt at udvikle applikationer med JavaScript. De tager ofte en mere enkelt tilgang til udvikling forstået på den måde, at de typisk kun består af et software-bibliotek og ikke et helt udviklingsmiljø. De store GUI-bibliotekter som GTK+/GNOME, Qt og WxWidgets har alle “JavaScriptbindings”. GNOME-projektet har hele to konkurrende biblioteker med navnene Seed og Gjs. Begge projekter er stadig forholdvis unge, men det forventes at i GNOME 3 vil det være muligt at udvikle egentlige GNOME-applikationer i JavaScript.

Og vinderen er …

At vælge en vinder af konkurrencen “Bedste Open Source JavaScript-bibliotekt” er på ingen måde en let opgave. Med QtScript, Gjs, Seed og WxJavaScript i kapløb, kræver det nærmest målfoto at afgøre kampen. Valget til denne artikel er faldet på GNOME Seed, eftersom det er godt dokumenteret og aktivt under udvikling. Det er et ungt projekt, men bygger på GNOMEs rubuste platform.

Seed benytter sig af GObject Introspection (se infoboks “Gobject Introspection”) til at generere binder til de underliggende software-biblioteker. Det betyder at Seed får en lang række biblioteker med i købet uden det store indsats. Biblioteket skal blot bygge på GObjects. Den slags biblioteker er der rigtig mange af, da meget af GNOME-platformen bygger på disse GObjects.

Seed benytter WebKit som JavaScript-motor. WebKit er en open source webbrowser-komponent som Apple benytter i Mac OS X til at udvikle bl.a. deres browser (Safari). Typisk bruges WebKit sammen med Qt, men Seed bruger en GTK+-udgave af WebKit, da hele GNOME-platformen bygger på GTK+ som GUI-bibliotek.

Se også:  PHP 8 er frigivet – her er de nye features

Godt nok er Seed et meget ungt open source-projekt (første offentlige version er fra november 2008), men der er understøttelse af en lang række software-biblioteker. I den grafiske ende finder du GTK+ (brugergrænseflade), Clutter (OpenGL) og Cairo (grafik). Men der er også adgang til filer og databaser. Databaser er p.t. begrænset til SQLite, som er en indlejret database (bruges af mange open source projekter, herunder Firefox). Se infoboks “SQLite” for mere information om denne database. Endvidere er understøttelse af DBUS og der er et HTTP-klient bibliotek.

Kom i gang

JavaScript er et fortolket sprog, og Linux har en glimrende understøttelse af fortolkere. Tricket er, at dit fortolkede program begynder med en reference til fortolkeren (med #! foran). Det betyder, at dine Seed-programmer skal begynde med #!/usr/bin/env seed. Programmet env vil finde ud af hvor på din computers filsystem, programmet seed findes. Resten af fil vil så være input til fortolkeren som det program som skal udføres.

Det er vigtig at erklære alle variable i dine Seed-programmer. I JavaScript gør du det med nøgleordet var foran variablen første gang, du bruger den. Men erklærede variable kan fortolkeren fjerne dem, når virkefeltet ender. JavaScript har nemlig den uheldige side, at ikke-erklærede variable er globale og først fjernes fra hukommelsen, når programmet afsluttes.

JavaScript har egentlig ingen mekanisme til at inkludere software-biblioteker. Seed introducerer derfor import. Med import kan du indlæse og oprette en instans af en klasse.

I infoboks “Et lille eksempel” finder du et minimalt program med to variable (streng og heltal). Seed-objekt med print-metoden er indbygget og kommer automatisk med (import er ikke nødvendigt). Du kan gøre programmet med navnet foobar.js eksekverbart med kommandoen chmod +x foobar.js, og du kan så køre det som kommandoen ./foobar.js. Det lille eksempel er et konsol-program – det skriver blot noget ud i terminalen og ikke en smart grafisk brugergrænseflade.

Datastrukturer

JSON er en notation af data, som er meget anvendt i web-applikationer, hvor der sendes data frem og tilbage mellem klienten (browseren) og serveren ved hjælp af AJAX-kald. Samme notation bruges i Seed.

Denne JSON notation bruges på samme måde, som du måske kender den fra web-applikationer. Du kan bruge JSON til at beskrive egenskaber, når du opretter nye objekter (mere præcis, som parameter til ethvert GObject’s constructor). Et eksempel kunne være {“title” : “Alt om Data”, “default-height” : 475}.

Nedarvning med GObject i JavaScript er ganske enkelt og bruges for eksempel til at styre de forskelle elementer (knapper, drop-downs, etc.) i den grafiske brugergrænseflade. Grundelementet i GObject er GType, og du bygger det nye objekt op med en række attributter og metoder. Attributten parent bruger du til at angive hvilken klasse, du nedarver fra, mens attributten name blot fortæller objektets navn. Metoden init er klassen constructor. Du vil i næste afsnit se, hvordan sådan en klasse bruges.

Grafisk brugergrænseflade

Med Seed er det muligt at bruge alle widgets i GTK+, efter GTK+ bygger på GObject. For det første skal du importere Gtk. Derved får du adgang til hele GTK+. I infoboks “En vindue” finder du et eksempel på nok den mindste GUI-applikation, der kan skrives med Seed.

Nu er det jo ikke nok med et vindue. Der skal lidt mere til. Hver gang du ønsker at tilføje elementer til din grænseflade, kan du oprette et nyt objekt og indsætte de forskellige GTK-elementer (knapper o.lign.). Disse grænseflade-objekter kan tilføjes til et vindue ved hjælp af metoden add. I infoboksen “Lidt mere GUI” kan du se et eksempel på et søgefelt (Gtk.Entry) i vindue. Bemærk, at der også er en callback-funktion ved navn query.

Filer og SQL

Seed er mere end grafisk brugergrænseflade. Det er muligt at tilgå filer og foldere. Modulet Gio giver adgangen objektet Gio.File, som implementerer en række operationer på filer, herunder læse og skrive dem. Det er dog ikke et rigtigt objekt, men mere en objekt-lignende wrapper til et klassisk proceduralt interface til filer. I infoboks “Læs en fil” kan du se, hvordan du kan læse indholdet af en fil.

Der findes mange databaser i den verden – også som open source. SQLite er en af dem, og den bruges primært til indlejrede databaser (se infoboks “SQLite”). SQLite er ikke bygget på GObject, og Seed-udviklerne har derfor skrevet et særligt interface til SQLite.

Se også:  Kan du kode eller drømmer du om det?

Du indlæser modulet med sqlite = imports.sqlite, og så har du nu en række funktioner under variablen sqlite. Der er kun tre metoder: new, exec og close. Metoden new åbner (eller opretter en tom) database, mens close lukker for adgangen. Metoden exec bruges til at udføre SQL-kommandoer. Ved brug af SELECT, skal du angive en callback-funktion som den anden parameter. I infoboks “SQLite med Seed” kan du se, hvordan du kan bruge SQLite.

Et elegant sprog

Kommer du fra en baggrund med web-udvikling, kan du med lidt snilde genbruge dine JavaScript-erfaringer til at udvikle programmer til desktoppen. Er du derimod desktop-udvikler, er det værd at tage et nærmere kig på JavaScript da det faktisk er et ganske elegant sprog. Med Seed og alle de andre er det muligt at få de to verdenen til at mødes.

Er du Ubuntu Linux-bruger, er det meget let at installere Seed. Du skal tilføje følgende to linjer til /etc/apt/sources.list:

deb http://ppa.launchpad.net/orange-owners/ppa/ubuntu jaunty main
deb-src http://ppa.launchpad.net/orange-owners/ppa/ubuntu jaunty main

Har du ikke Jaunty Jackalope (9.04) installeret, skal du udskifte Jaunty med din version.

Derefter skal du opdatere din lokale database over mulige pakker med apt-get update og til slut installere Seed med apt-get install seed. Du får muligvis nogle advarsler på grund af manglende GPG-nøgle, men dem kan du ignorere.

Bruger du noget andet end Ubuntu, må du downloade kildeteksten og oversætte den selv. I skrivende stund finder du seneste version som http://ftp.gnome.org/pub/GNOME/sources/seed/0.8/seed-0.8.tar.gz. Følgende kommandoer skal udføres:
tar xzf seed-0.8.tar.gz
cd seed-0.8
./configure
make
make install

Oprindeligt var meningen med GObject at give objekter til programmeringssproget C, som bestemt ikke er et objekt-orienteret sprog. Store dele af GNOME bygger direkte eller indirekte på Gobjects, for eksempel bruger GTK+-biblioteket det. Andre programmeringssprog kan også bruge GObject, da det passer godt ind i mange objekt-orienterede sprog som Python, Java og C++. C er et meget udbredt sprog, og langt det meste software i Linux/UNIX-verdenen er skrevet i C (inkl. Linux-kernen). Men C er meget enkelt, og for eksempel skal udviklerne selv styre hukommelse idet der ikke er nogen automatisk garbage collection, som Java har.

Ideen med GObject Introspection er at give de avancerede objekt-orienterede sprog adgang til de Gobject-baserede biblioteker. Endvidere kan du skrive dine klasser i C og bruge dem direkte i eksempelvis JavaScript. Det er kun et spørgsmål om at ændre lidt i en Makefile for at få genereret bindings til det ønskede sprog til dit bibliotek.

SQLite er et databasesystem til indlejrede databaser. I stedet for en stor kompliceret databasemotor (RDBMS), findes databasen som et software-bibliotek, og data er placeret i filer. Det er muligt at bruge de fleste af de velkendte kommandoer fra SQL. SQLite er en glimrende løsning, hvis du har brug for adgang til database fra den samme computer, som databasen er placeret i. I version 3 er det muligt for flere programmer (eller tråde) at have adgang til databasen. Siden version 2 har transaktioner været understøttet.

Et lille eksempel at starte på

#!/usr/bin/env seed

var tekst = ‘Dagens tal’;
var tal = 2*3+4;
Seed.print(tekst + ‘: ‘ + tal);

Et vindue

#!/usr/bin/env seed

Gtk = imports.gi.Gtk;
Gtk.init(null, null);

var window = new Gtk.Window({“title” : “Alt om Data”, “dafault-height” : 500});
window.show_all();

Gtk.main();

Lidt mere GUI

#!/usr/bin/env seed

Gtk = imports.gi.Gtk;
Gtk.init(null, null);

AoD = new GType({
parent: Gtk.HBox.type,
name: “Searchbar”,
init: function(klass) {
var search = new Gtk.Entry();
var query = function(s) {
Seed.print(“Search: ” + s.text);
};
search.signal.activate.connect(query);
this.pack_start(search, true, true);
}
});

window = new Gtk.Window({“title” : “Alt om Data”});
window.signal.hide.connect(function () { Gtk.main_quit(); });
aod = new AoD();
window.add(aod);
window.show_all();

Gtk.main();

Læs en fil

#!/usr/bin/env seed
Gio = imports.gi.Gio;

file = Gio.file_new_for_path(Seed.argv[1]);
input = file.read();
print(input.get_contents());

SQLite med Seed

#!/usr/bin/env seed

sqlite = imports.sqlite;
var db = new sqlite.Database(“artikel.db”);
db.exec(“create table artikel (art_nr INTEGER PRIMARY KEY, titel TEXT,” +
“forfatter TEXT, nr INTEGER);”);
db.exec(“insert into artikel(titel, forfatter, nr) ” +
“values(‘Kenneth Geisshirt’, ‘MySQL del 3’, 10);”);
db.exec(“insert into artikel(titel, forfatter, nr) ” +
“values(‘Kenneth Geisshirt’, ‘MySQL del 2’, 9);”);

function artikel(results){
Seed.print(results.titel+’ af ‘+results.forfatter);
}

db.exec(“select * from artikel”, artikel);
db.close();

[themepacific_accordion] [themepacific_accordion_section title=”Fakta”]

Få mere at vide

[/themepacific_accordion_section] [/themepacific_accordion]


TAGS
Guide
javascript
programmering

DEL DENNE
Share


Mest populære
Populære
Nyeste
Tags

Find os på de sociale medier

Modtag dagligt IT-nyhedsbrev

Få gratis tech-nyheder i din mail-indbakke alle hverdage. Læs mere om IT-UPDATE her

Find os på FaceBook

AOD/AOD.dk

Brogårdsvej 22
DK-2820 Gentofte
Telefon: 33 91 28 33
redaktion@aod.dk

Audio Media A/S

CVR nr. 16315648,
Brogårdsvej 22
DK-2820 Gentofte
Telefon: 33 91 28 33
info@audio.dk
Annoncesalg:
Lars Bo Jensen: lbj@audio.dk Telefon: 40 80 44 53
Annoncer: Se medieinformation her


AOD/AOD.dk   © 2020
Privatlivspolitik og cookie information - Audio Media A/S