In case you ever wondered (as I did for quite a time)
10 Open-Source Projects Every JavaScript Geo Dev Should Know About
That is not tied to a proprietary platform
An article flew by in my Twitter stream, with the title “10 Open-Source Projects Every #JavaScript Geo Dev Should Know About”. As I consider myself a Javascript Geo Dev i thought that there might be som OpenSource gems I’ve missed and clicked the link. The link brought me to esri.com and what I was presented with was this article, listing 10 open source javascripts projects that I’ve never heard of.
Why? Most of them (or all, no links, and I can’t bother to google them all) are ESRIs own libraries, and although OpenSource they are tied to the ESRI platform. In fact, from what I understand, 4 or 5 of them are directly tied to ArcGIS Online.
This made me feel a bit tricked. Not that there are anything wrong with ESRI releasing OpenSource code, but where there is an implicit requirement that you use their paid services, what is the use for others?
But, instead of complaining I’ll present a list of my own, that should be of a wider use to all Javascript Geo devs (although I’m rather certain that most of you’ve heard about most of them already!)
1. OpenLayers 3
We all know OpenLayers 2 (don’t we?) and most of you probably know that the brand new OpenLayers 3 is in the making (beta 4 now!). Lots of features, a complete rewrite and heavy use of the Closure compiler.
2. Leaflet
The web-friendly, lightweight, hipster no-frills mapping library that excels in beeing un-bloated and easy to use. Just try it, seriously!
3. Proj4js
A JavaScript port of proj.4, meaning that you can do all your coordinate re-projections right in the browser!
4. jsts
A JavaScript port of JTS Topology Suite, a library of spatial predicates and functions for processing geometry objects. It works, but is a rather straight Java-port, which leads me to the next entry:
5. Njord.js
Njord.js is a vanilla JS, client side lib for lightweight geoprocessing, envisioned to compete with jsts and heavily inspired by Shapely. It’s written by yours truly and is under development.
6. D3
A JavaScript visualization library for HTML and SVG. I personally know next to nothing about it and haven’t used it, but if you need to add some visualisations to your map app D3 seems to be the way to go.
7. Three.js
Three.js simplifies the task of working with WebGL from Javascript. We all know that 3d is the future, so why not start learning it. If you don’t think that mapping and 3d can be united, take a look at this lib.
8. KuGIS
KuGIS is a browser-driven GIS-application with support for a lot of spatial analysis. Driven by Leaflet and JSTS. Really shows what you can do in the browser these days.
9. Bootleaf
Although I haven’t used it myself I’ve heard some good things about this lib, actually just a “simple, responsive template for building web mapping applications with Bootstrap 3, Leaflet and typeahead.js”.
10. SpatialBB
Also written by yours truly, SpatialBB (or “spatially enabeled Backbone”) is an attempt to merge the MVC-capabilities of Backbone.js with the spatial capabilities of Leaflet. Also a work in (some state of) progress, but I kinda like the idea.
So, that was my list. What did I forget? Are there any gems that’s useful? Please point me in their direction!
Nerdebøker
Etter at jeg fikk meg en Kindle (for en stund siden) og virkelig har tatt den i bruk (ikke fullt så lenge siden) har Amazon sine algoritmer begynnt å kjenne meg. Det er alltid litt skummelt med den ensrettingen man får av slike algoritmer, men nå har jeg vært gjennom endel bøker som dreier seg om tidlig IT-utvikling på en eller annen måte.
Tenkte jeg skulle dele lista her hvis andre skulle være interesserte.
- The Art of UNIX Programming – Eric S. Raymond
En gjennomgang av UNIX-filosofien. En god del tekniske detalker, men også mye historikk rundt UNIX og situasjonen i dets tilblivelse. Kanskje ikke anbefalt hvis du er er sterk Microsoft-forkjemper, men jeg fant både historien og filosofien spennende, selv om boka nå er 11 år gammel. - Hackers: Heroes of the Computer Revolution – 25th Anniversary Edition – Steven Levy
Dette er vel igrunn en klassiker, men jeg hadde faktisk ikke hørt om den. Tar for seg hackere (i ordets rette forstand), med fokus på tre distinkte miljøer: Universitesmiljøene i 70-tallet, PC-byggerene på (primært?) vestkysten og spillselskapene. Virkelig en god bok! - The Soul of A New Machine – Tracy Kidder
Til å være en non-fiction-bok eldre enn meg er dette meget bra! Forteller hvordan en gjeng ingeniører/utviklere jobbet for å lansere en ny “minicomputer” på 70-tallet. - Exploding the Phone: The Untold Story of the Teenagers and Outlaws who Hacked Ma Bell – Phil Lapsley
Pheaking, eller hvordan leke med telefonnettet, er en kunst mye eldre enn hacking. Dog, det er mange likheter, og det er artig å lese i dybden om dette fenomenet som jeg vel bare så vidt har hørt om før. - Masters of Doom: How Two Guys Created an Empire and Transformed Pop Culture – David Kushner
Selv om jeg aldri har vært noen gamer har jeg da fått med meg spill fra id som Wolfenstein 3D, Doom og Quake. Her fortelles historien bak spillene på en meget god måte. - Where Wizards Stay Up Late: The Origins Of The Internet – Katie Hafner, Matthew Lyon
Dette tror jeg må være den mest komplette historien om ARPANET, og dets etterkommer Internet. Når man leser bøker som denne skulle man virkelig ønske man jobbet med it på 60-70-tallet! - Tubes: A Journey to the Center of the Internet – Andrew Blum
Kanskje den minst tekniske boka nevnt her, men fortsatt spennende. En journalist prøver å besøke stedene, bygningene og personene som utgjør internett slik vi kjenner det. - The Idea Factory: Bell Labs and the Great Age of American Innovation – Jon Gertner
Kanskje den minst it-spesifikke boka (hvis man nå da ikke regner med at den beskriver hvordan transistoren ble unnfanget). Likevel en utrolig facsinerende historie om hvilke resultater man kan oppnå når man samler en gjeng glupe folk og gir dem “frie tøyler”. - Dealers of Lightning – Michael A. Hiltzik
Xerox PARC var Xerox sin forskningsavdeling på samme måte som AT&T hadde Bell labs. I denne boka fortelles historien om tilblivelsen, utviklingen og avviklingen. Igjen ser man at det var 70-tallet man skulle levd på, og at det kan komme utrolig mye spennende frem når man samler mye glupe folk på et sted med frie tøyler. Bare så synd å se at ledelse heller ikke da alltid klarte å se mulighetene ved ny teknologi. - Underground: Tales of Hacking, Madness, and Obsession on the Electronic Frontier – Suelette Dreyfuss
En historie om hackere, crackere og phreakere på slutten av 80-tallet. Hva de drev med, hvordan de gjorde det og livet rundt. Absolutt spennende! - We Are Anonymous: Inside the Hacker World of LulzSec, Anonymous, and the Global Cyber Insurgency – Parmy Olson
Historien om “ikke-organisasjonen” Anonymous, LulzSec og folkene i den harde kjerne. Nærmere nåtiden enn mange av de andre bøkene, men du merker det er en god del ting som går igjen hos mennesker som jobber eller leker med datamaskiner.
Noen bøker du føler burde vært med på lista? Amazon tar jo ikke alt, så jeg tar gjerne imot tips (gjerne med en begrunnelse).
Polet på alternaiv-tripp?
Vinmonopolet har et magasin de gir ut månedlig eller noe slikt, vinbladet. Som regel mye spennende lesning, men i mars-utgaven, klarer de (og det under headingen “fagprat”) å lire av seg en solid dose vås.
La meg begynne med å sitere innledningen:
Personlig synes jeg det er litt fint med alt det man ikke helt forstår. Alt det som ikke kan forklares med ord eller formler. I større eller mindre grad vil de fleste som lager vin støtte seg til noe mer enn vitenskap. Kall det gjerne overtro eller overbevisning. Eller erfaring. Denne gangen har fagavdelingen sett nærmere på fenomener og metoder som ikke nødvendigvis har naturvitenskapens velsignelse. Det vil ikke dermed si at det er fullstendig galskap av den grunn. Dette er erfaringsbasert kunnskap som begrunnes med gode resultater og nedarvet kunnskap.
Ringer det noen bjeller? Her er vi godt over i tra-la-la-land allerede. “Mer enn vitenskap”? Hva mener de med det? “naturvitenskapens velsignelse”? Hæ?
Er det ikke bare du som er i overkant skeptisk nå, Atle? Er det ikke sånn at vinmakeri har tusenårige tradisjoner og ikke helt er forstått av forskere? Joda, det er nok noe i det. Man har ikke forsket på alt. Men, det er mer:
Det biodynamiske baserer seg på et holistisk verdenssyn der vinmarken dyrkes etter naturens rytmer, og solens, månens og planetenes faser blir tatt hensyn til. Jorden og plantene behandles med egne og naturlige preparater som skal gi sterke og harmoniske planter.
I.dont.even. Holistisk? Naturens rytmer? Harmoniske planter??
Svaret biodynamikerne gir er tredelt. Først og fremst handler det om at de er mer fornøyde med vinene etter omlegging til biodynami. Dessuten melder de om at plantene blir sunnere og mer motstandsdyktige mot sopp og sykdommer. Til slutt er det et etisk valg som handler om respekt for naturen og omgivelsene våre.
En ting er økologisk jordbruk. En annen ting er å støffe innvoller med preparater, grave de ned over vinteren og spre dem i homeopatiske doser ut over åkeren. Og dette skriver Vinmonopolet i sitt fagblad? Herre min hatt.
Rudolf Steiner pekte på forbindelsen mellom de kosmiske kreftene og plantenes vekst. Ved å studere astrologiske kalendere og eksperimentere med å dyrke forskjellige grønnsaker, utviklet Maria Thun en av biodynamiens viktigste redskaper – Maria Thuns såkalender. Kalenderen bygger på at planetenes stilling påvirker hvordan de forskjellige vekstene på jorda vokser. Basert på hennes observasjoner delte hun månens bevegelse gjennom zodiacen, himmelens koordinatsystem, i fire: bladdag, rotdag, blomsterdag og fruktdag.
Zodiacen? Jeg gir opp. Jeg hadde håpet av Vinmonopolet under headingen “fagprat” hadde klart noe mer enn å gulpe opp svada fra biodynamikerens lærebøker. Dette blir like tynt som Meinklang, det eneste (og siste) “biodynamiske” ølet jeg har smakt.
Nå er det faktisk utrolig synd at Vinmonopolet er akkurat dette, et monopol, for jeg føler VELDIG på lysten til å boikotte folk som farer med denne typen fjas. Det finnes mye vi ikke forstår, men det betyr ikke at det har noe for seg å servere vrøvlet til Rudolf Steiner som fakta, for der er det på ingen måte.
På slutten et stalltips: Hvis du synes de “biodynamiske prinsippene” høres like skrudde ut som jeg gjør anbefaler jeg deg å se etter “Debio“-merket Demeter-merket neste gang du er i butikken: Har et produkt et slikt merke lar du produktet ligge igjen, dette er nemlig en sertifisering på at maten er produsert med en solid dose svadatenking.
Ninjatriks i JavaScript, del 2
Jeg var ikke sikker på om det kom til å skje, men når jeg øynet muligheten til å kombinere mine to favoritthobbyer, koding og øl, måtte jeg jo bare. Dermed blir det del 2 av ninjatriks i JavaScript, denne gang med fokus på funksjonell programmering og underscore.js.
Ifølge Douglas Crockford er JavaScript “Lisp in C’s Clothing”. Dvs, det er et funksjonelt språk utkledd som et prosedyrespråk. De fleste som har skrevet litt JavaScript har funnet ut at det går fint å skrive prosedyre (og kanskje også objekt)-orientert i JavaScript.
Men, hvis det nå er sånn at JavaScript er funksjonelt så burde det kanskje være noe å hente? Jeg snakker ikke helt nazi no-sideeffects, everything is a function, men noen gode ideer her og der?
Det har ihvertfall jeg funnet ut de senere år, etter at jeg tok i bruk Backbone.js og dermed Underscore.js. Underscore.js er et lite utility-bibliotek som beskriver seg som “It’s the tie to go along with jQuery’s tux, and Backbone.js’s suspenders.”. Ja, mange av de funksjonene underscore.js tilbyr finnes som “native”-javascript funksjoner i nyere implementasjoner. Dog, jeg har lært meg underscore og trives med det, dermed så vil jeg fokusere på det.
Men, hva er det å hente? Hva gir underscore og en funksjonell tankegang meg? Jeg tenkte å ta noen eksempler, så kan du se selv.
Eksempel 1 er ganske greit. Du har ei liste med objekter (la oss si øl-objekter). Du vil finne alle objekter (dvs øl) som er produsert av Haandbryggeriet. Gitt lista (som tilfeldigvis er fra en juleølsmaking jeg deltok på):
var beers = [
{"brewery": "Austmann", "name": "Jingle Beer", "score": 6.49, "abv": 7},
{"brewery": "Binding-Brauerei", "name": "Santa Clausthaler", "score": 2.14, "abv": 0},
{"brewery": "Brasserie St-Feuillien", "name": "Cuvée de Noël", "score": 6.43, "abv": 9},
{"brewery": "Dahls", "name": "Julebrygg", "score": 5.19, "abv": 4.5},
{"brewery": "Fanø Bryghus", "name": "Julebryg", "score": 5.74, "abv": 7.2},
{"brewery": "Grans Bryggeri", "name": "Lade Gaards Brygghus Juleøl", "score": 5.92, "abv": 6.5},
{"brewery": "Hansa", "name": "Ekstra Vellagret Julebrygg", "score": 6.39, "abv": 6.5},
{"brewery": "Haandbryggeriet", "name": "Nissefar", "score": 6.07, "abv": 7},
{"brewery": "Haandbryggeriet", "name": "Nissegodt", "score": 6.26, "abv": 4.5},
{"brewery": "Inderøy", "name": "Nisseøl", "score": 6.06, "abv": 4.5},
{"brewery": "Nøgne Ø", "name": "God Jul", "score": 5.89, "abv": 8.5},
{"brewery": "Nøgne Ø", "name": "Julesnadder", "score": 7.19, "abv": 4.5},
{"brewery": "Nøgne Ø", "name": "Special Holiday Ale", "score": 6.71, "abv": 9},
{"brewery": "Ægir", "name": "Julebrygg", "score": 6.21, "abv": 4.7}
];
Hvis vi nå vil finne ut hvilke som var butikkøl (dvs abv <= 4.7) kan du gjøre dette med en for-løkke:
var pol_limit = 4.7;
var shop_beers = [];
for (var i = 0; i< beers.length; i++) {
var beer = beers[i];
if (beer.abv <= pol_limit) {
shop_beers.push(beer);
}
}
console.log(shop_beers);
Ganske standard, men mye boilerplate og unødvendige temporær-variabler. Hva med Underscore.js? Vi kan bruke _.filter():
var isShopBeer = function (beer) {
return (beer.abv <= 4.7);
};
console.log(_.filter(beers, isShopBeer));
Det som skjer her er at _.filter() looper gjennom lista beers og returnerer en ny liste over de ølene som returnerer true i funksjonen isShopBeer. Ganske fiffig, færre linjer og lettere utbyttbart.
En annen artig ting, er at siden vi nå har en funksjon for å bestemme om et øl er butikkøl, vet vi at alle øl som returnerer false i denne er poløl. Dermed kan vi finne antall poløl ved å bruke _.reject():
console.log(_.reject(beers, isShopBeer));
Så, dermed kan vi finne ut at vi hadde:
var shopBeers = _.filter(beers, isShopBeer);
var polBeers = _.reject(beers, isShopBeer);
console.log("Antall øl: " + beers.length);
console.log("Antall butikkøl: " + shopBeers.length);
console.log("Antall poløl: " + polBeers.length);
eller:
- Antall øl: 14
- Antall butikkøl: 6
- Antall poløl: 8
Hva om vi vil finne ut hvilket øl som gjorde det best? Og dårligst? Med en for-løkke kunne vi gjort dette som
var max = beers[0]; for(var i = 1; imax.score) { max = beer; } } console.log(max.name) //Julesnadder
Med underscore kan vi bruke _.max():
var getBeerScore = function(beer) {
return beer.score;
}
console.log(_.max(beers, getBeerScore)); //Julesnadder
og tilsvarende har vi såklart _.min():
console.log(_.min(beers, getBeerScore).name); //Santa Clausthaler
Altså:
var best = _.max(beers, getBeerScore);
var worst = _.min(beers, getBeerScore);
console.log("Best: ", best.brewery + " " + best.name + " (" + best.score + "/10)");
console.log("Værst: ", worst.brewery + " " + worst.name + " (" + worst.score + "/10)");
eller:
- Best: Nøgne Ø Julesnadder (7.19/10)
- Værst: Binding-Brauerei Santa Clausthaler (2.14/10)
Best av polølene da? Typisk ville vi gjort noe sånt som:
var pol_limit = 4.7;
var max = 0.0;
var best;
for (var i = 0; i< beers.length; i++) {
var beer = beers[i];
if (beer.abv > pol_limit && beer.score > max) {
console.log(beer.name)
best = beer;
max = beer.score;
}
}
console.log(best.name); //Special Holiday Ale
Men, vi kan kombinere underscore-funksjoner:
console.log(_.max(_.reject(beers, isShopBeer), getBeerScore)); //Special Holiday Ale
Hvor mange øl var det med fra hvert bryggeri?
Vel, en måte å løse det på er følgende:
var result = {};
for (var i = 0; i< beers.length; i++) {
var beer = beers[i];
if (result.hasOwnProperty(beer.brewery)) {
result[beer.brewery] += 1;
} else {
result[beer.brewery] = 1;
}
}
console.log(result);
Med underscore kan vi bruke _.groupBy():
var getBrewery = function (beer) {
return beer.brewery;
}
console.log(_.groupBy(beers, getBrewery))
denne gir oss riktignok en liste med øl-objekter på hver key, ikke bare antallet. Det kan vi dog få til med en _.reduce():
console.log(_.reduce(_.groupBy(beers, getBrewery), function (memo, beers, brewery) {
memo[brewery] = beers.length;
return memo;
},{}));
Men, det spørs om det er det vi egentlig vil? Med resultatet av groupBy'en kan vi spytte ut endel statistikk:
_.each(_.groupBy(beers, getBrewery), function (beers, brewery) {
var avg_score = _.reduce(beers, function(sum, beer){ return sum + beer.score; }, 0) / beers.length;
console.log(brewery + ": " + beers.length + " øl, " + avg_score + " i gj.snitt");
});
Vel, det var det for denne gang. Håper du lærte noe nytt, hvis du har spørsmål eller kommentarer er det bare å mase (jeg har sikkert gjort noen feil, jeg er på ingen måte noen mester, men jeg lærer stadig!)