Statistik från Bredbandskollen

Bredbandskollen

Bredbandskollen

Bredbandskollen har nu dokumenterat ett API och publicerat det under deras
FAQ, sektion 7, längst ned. Det är dock inte JSON utan (schemalös) XML, men det är iaf komplett och det finns nu uttalat att informationen endast får användas i icke-kommersiellt syfte (såvida man inte tecknar avtal med IIS om annat, kontaktuppgifter finns att hitta i FAQ:n).

Informationen nedan är alltså gammal.

Det finns ett sätt att hämta statistik från bredbandskollen.se. Jag har inte sett att det är ett uttalat API, inga villkor för användning eller dokumentation. Tyvärr – IIS har en särställning och därmed borde vi ställa krav på öppenhet (vilken är väldigt god i allmänhet från .SE).

Disclaimer

Jag blev kontaktad av IIS och ombads uppdatera informationen här, enligt:

Hur som helst så skulle vi uppskatta ifall du uppdaterade ditt blogginlägg med hänvisning till att vi fixar ett API på rätt sätt ifall någon har behov av det. Tills dess är det olämpligt att sprida denna bakdörr eftersom vi inte erbjuder någon garanti att denna information är korrekt.

Normalt förfarande är givetvis att man tar kontakt med den som utger sig som ansvarig utgivare av informationen man vill använda, men på Bredbandskollens FAQ fanns ingen sådan information. Inget i någon sidfot. Inget i HTML.

Bas-URL

http://www.bredbandskollen.se/statistik/

getISPs.php

Returnerar ett objekt med ID (heltal) som nyckel, och ISP:ns namn som värde.

getChartData.php?

chartType=0 – okänt
year=2011 – periodbestämning, 2007-2011 (2007-10 verkar vara startpunkt)
month=8 – periodbestämning, 1-12
isps=6 – ISP-bestämning, kommaseparerade index från getISPs
regions= regionsbestämning, kommaseparerade index från lista kodad i HTML (se nedan)
speeds=  typ av förbindelse, kommaseparerade index från lista kodad i HTML (se nedan)

Regioner

{0:"Alla",
2:"Blekinge Län",
10:"Dalarnas Län",
5:"Gotlands Län",
3:"Gävleborgs Län",
6:"Hallands Län",
7:"Jämtlands Län",
8:"Jönköpings Län",
9:"Kalmar Län",
12:"Kronobergs Län",
14:"Norrbottens Län",
27:"Skåne Län",
26:"Stockholms Län",
18:"Södermanlands Län",
21:"Uppsala Län",
22:"Värmlands Län",
23:"Västerbottens Län",
24:"Västernorrlands Län",
25:"Västmanlands Län",
28:"Västra Götaland",
15:"Örebro Län",
16:"Östergötlands Län"}

Hastigheter

{0:"Alla",
1:"256 Kbit/s adsl",
2:"256 Kbit/s kabeltv",
3:"Upp till 384 Kbit/s 3G",
4:"512 Kbit/s adsl",
5:"1 Mbit/s adsl",
6:"2 Mbit/s adsl",
7:"2 Mbit/s kabeltv",
8:"1,5-2 Mbit/s fiber",
9:"Upp till 3 Mbit/s 3G",
10:"Upp till 6 Mbit/s 3G",
11:"8 Mbit/s adsl",
12:"8 Mbit/s kabeltv",
14:"10 Mbit/s fiber",
16:"24 Mbit/s adsl",
17:"24 Mbit/s kabeltv",
18:"24 Mbit/s fiber",
21:"60-100 Mbit/s fiber",
22:"10 Mbit/s kabeltv",
23:"0,20-0,25 Mbit/s adsl",
24:"1,5-2 Mbit/s adsl",
25:"6-8 Mbit/s adsl",
26:"12-24 Mbit/s adsl",
27:"0,4-0,5 Mbit/s kabeltv",
28:"7-10 Mbit/s kabeltv",
29:"12-24 Mbit/s kabeltv",
30:"25-50 Mbit/s kabeltv",
31:"3-5 Mbit/s kabeltv",
32:"50-100 Mbit/s kabeltv",
33:"20-60 Mbit/s adsl",
34:"Upp till 10 Mbit/s 3G",
35:"10-80 Mbit/s 4G",
36:"500-1000 Mbit/s fiber",
37:"100-200 Mbit/s kabeltv",
38:"Upp till 16 Mbit/s 3G",
39:"Upp till 32 Mbit/s 3G",
40:"10-20 Mbit/s 4G",
41:"5-10 Mbit/s 4G",
42:"12-30 Mbit/s adsl",
43:"30-60 Mbit/s adsl"}

Transparens på nätet

Google, Skype, Open Rights Group, Center for Democracy and Technology, Netzpolitik, OpenNet Initiative och andra bjuder in till ett tvådagars-hackathon (8-9 november), kallat Hack For Transparency (#h4t). Det bjuds på käk, nät och 3000 € i pris till bästa bidraget från respektive spår: Internet Quality och Global Transparency.

The objective is then not necessarily to end-up with fully completed projects, but rather to stimulate the awareness and thinking around these issues, and to discover fresh ideas and innovative angles to tackle them.

Senast 10:e oktober behöver man skicka in sin ansökan om att få delta.

Richard M Stallman till FSCONS

En profil som stenhårt driver linjen att människors rätt till frihet är en mänsklig rättighet – som är fullt förenlig med kommersiella intressen. “GNU-guden” Richard Mathew Stallman (RMS) kommer till http://FSCONS.org i år. En udda snubbe med skägg som tänkt till kring många frihetsfrågor.

Jag har lyssnat till honom vid två tillfällen och det brukar vara lite provocerande när han effektivt, brutalt och hänsynslöst svarar varannan fråga med: “Hur tänkte du nu egentligen? Eller tänkte du alls? Menade du verkligen vad du sa? Har du funderat över vad du implicerar egentligen? Nästa fråga, eller vänta – är det någon som har en intressant fråga så kan vi ta den först?”

Free Software, not Open

Free Software, not Open

Kata: Authentication Filter in Java EE

This is an exercise I’ve used to demonstrate how awkward unit testing can be if you can’t use a mocking framework. It’s an almost real work life situation (disclaimer: you should perhaps use container based authentication and JAAS) where we’re using API:s in a Java EE Server, adding two collaborators and then writing the logic combining it all.

No group has (yet) completed the entire task within 90 minutes – you might want to start/focus on using one collaborator only (I suggest the LDAP collaborator).

Originally posted on codingdojo.org.

When cleaning up a folder at work, I found this old document – it’s some form of a logical flow chart of the filter to write.

Here we go …

Background

In this Kata, your a programmer at ABC Corp and you’re making a new web app from scratch. After the head architect started working on this, it’s now up to you to make sure these tasks are completed:

  • allow authentication using request parameters
  • all authentication/login attempts should be verified agains LDAP
  • successful logins should be recorded in the single sign on registry

However, you’re not the only programmer (team) adressing this web app, so the LDAP is written by another team and what you have right now is this interface:

 public interface LdapAuthenticationGateway {
   boolean credentialsAreValid(String userName, String password);
 }

and the single sign on registry is also written by another team, leaving you with this interface:

 public interface SingleSignOnRegistry {
   boolean tokenIsValid(String token);
   String registerNewSession(String userName);
   void endSession(String token);
 }

Your job basically is to write one or more javax.servlet.Filter that handles incoming requests and act according to whether there’s a cookie with a SSO token, username+password parameters etc.

It’s assumed that there’s some form of DependencyInjection framework in place – to get a handle to the SingleSignOnRegistry or the LdapAuthenticationGateway, you’ll simply have to provide something like:

 public void setSingleSignOnRegistry(SingleSignOnRegistry registry) {
   ...
 }

About this kata

This “real life” scenario has been used to demonstrate how mocking (using Mockito) can be useful. We’ve combined it with BDD and JDojo@Gbg will try to practice TDD using this kata (without mocking) next time around.

(“Real life” is quoted – proper JEE authentication should be tied into the container etc etc … The point with this exercise is that it’s fairly easy to explain how it should work and what needs to be done here with “real” Java EE API:s, and then focus on the “How to develop” aspect (TDD), but also to show/talk about the difference between mocking and stubbing.)

Korsfunktionell syn

Sprang över denna bild som visar på en mogen organisation, eller som jag hörde någon säga vid lunchbordet:

- Ja, jag hörde att ni skulle bli agila på riktigt – flytta ihop korsfunktionella team i samma rum osv. När skulle ni “flytta”?
-  Det gjorde vi redan i måndags – men var bara lugn: vi har fortfarande kvar flyttbara väggar mellan de olika delarna. PO, systemtest och PM har vi tryckt in i en egen liten modul.

 

Korsfunktionell matrisorganisation

JsTestDriver

Most of my code writing time last week writing was spent in JavaScript land (or ECMAScript, wonder it the most commonly used name will ever change). I was to write a small templating package and had to write some new stuff and set out to use JsTestDriver and after a few minutes I was up and running in Eclipse.

The idea is OK I guess – run tests and production code in the same environment it will run in when deployed. There are a couple of cons to JsTestDriver (used through Eclipse) though:

  1. if you’re configuration file doesn’t include the test file you’re trying to execute, there’s no clue to what you’ve done wrong – the panel in Eclipse will just show the green bar and 0/0 tests run.
  2. if you have syntax (or construct like) errors in your unit under test, you’ll get the same behavior as above
  3. sometimes you’re served a cached version of (some of) the JS source files – hence there’s a button to “refresh browsers” and it’s sad that it has to be there and that you actually have to use it
  4. sometimes the engine gets into some strange state where it dryRuns the tests instead of actually executing them

Apart from that, its behavior is quite predictable. Minor issues:

  1. running a test complete locks Eclipse’s UI thread
  2. a Rerun quick command option would be great (Ctrl+3)

JsHamcrest

Another minor issue is that the “index” of JsHamcrest matchers is really hard to get an overview of. Whenever I wanted to use a certain type of matcher, it was really hard to quickly tell from the documentation if it was there or not. Go see for yourself and look for a matcher that mathes any object for instance.

JsHamcrest.Integration.JsTestDriver();
# get a list of matchers:
curl "http://jshamcrest.destaquenet.com/modules/matchers.html" | grep "dt id" |cut -d '"' -f 2 |cut -d '.' -f 3

JsMockito

JsMockito works really nice. The only thing that could’ve been better is the integration with JsTestDriver: when a verify step fails, you’ll get a good error message but you don’t get the typical feedback as from which line the verify/assert that failed was on. Not a big deal since you see which test that failed.

JsMockito.Integration.JsTestDriver();

Återaktivera domän hos Loopia

En domän förföll, det diskuterades huruvida tjänsten som hostades där skulle fortsätta eller om kunden ville lägga ner projektet. Efter att den förfallit så beslutade sig kunden för att fortsätta köra.

  1. Jag försöker då köpa domänen på nytt via Loopias vanliga gränssnitt, eftersom domänen försvunnit från listan över “mina domäner”.
    Detta misslyckas pga “tekniskt fel kontakta support”. Detta har jag stött på flera gånger: om någon (inte bara jag)  tidigare köpt en domän och hostat den hos Loopia men inte längre kontrollerar den, då kan ingen registrera om den via Loopia – man måste ringa in till supporten, de gör en abrovinsch i sitt system och sedan är det fritt fram igen.
  2. Jag ringer in till supporten (en lördag kl 11) men får veta att jag behöver få hjälp av registry-/domänavdelningen som är tillbaka först på måndag.
  3. Jag ringer på måndag och får “hjälp” med att få tillbaka domännamnet i listan. Jag behöver nu bara gå in och återaktivera domänen.
  4. Jag går in och försöker hitta en knapp som det står återaktivera på. Efter lite letande finns knappen, men den går inte att trycka på: Jag behöver först fylla upp mitt Loopia PrePaid-konto så att återaktiveringen kan dras därifrån.
  5. Jag tycker på länk för att försöka fylla upp PrePaid-kontot. En faktura skickas via mail.
  6. Jag får ett mail med faktura, ser bra ut, och jag trycker på länken “Betala fakturan med bankkort”
  7. Loopias sida hoppar fram men nu står det att jag försöker betala en annan domän (hackernight.se), en domän som är i drift, betald och fin och inte skall förnyas förrän om 4 månader. (Det står också att jag kommer fylla på PrePaid.)
    Jag kontrollerar fakturanumret och ser att det stämmer, men specen på webben är annorlunda från den i PDF:en.
  8. Jag ringer in till supporten och frågar vad som står på. Jag får information att det inte kommer dras pengar åt något håll automatiskt eftersom jag valt manuell hantering av PrePaid.
    Jag: “Så trots att det står att jag betalar för en viss domän, så kommer jag i själv verket inte göra det?”
    Loopia: “Just det, det kommer inte bli fel utan så som du vill.”
  9. Jag tar en skärmdump och skickar till support@ (enligt uppmaning över telefon) för att kunna lösa buggen.

Det är inte bra när ett fakturanummer kan ge olika fakturaspecifikation eller uppgift om vad fakturan handlar om. Det brukar revisorer ha synpunkter på. Själv blir jag bara villrådig och undrar så klart hur deras system fungerar

Jag gillar skarpt att Loopia har ett enkelt gränssnitt, prisvärd tjänst (i övrigt) men

  1. När det väl är dags att betala går det bara via DIBS vilket betyder att man måste ha med sin bankdosa för att genomföra en registrering. Jag har inte min bankdosa med mig i fickan hela tiden. De flesta domäner jag köpt över åren har helt klart varit en reaktion på en ny idé som någon kläckt helt appropå, påbörjar registrering men måste vänta tills jag kommer hem för att avsluta och genomföra den verkliga registreringen.

Jag har varit en nöjd kund, alltid fått snabb och bra hjälp. Det är bara synd att jag behövt ringa, år efter år med samma ärenden.

Det finns dessutom ett fint API för att kontrollera sina domäner. Betalning  - oavsett om det går in i PrePaid eller betalar en faktura – kräver bankdosa. Mindre bra för integration och automatisering. (Så det argumentet faller lite på målsnöret.)

Uppdatering: fixade länkar och skrev till API-argument (och jag fick bra hjälp via mail och twitter innan jag redogjorde här – supporten är kanon, det är “systemet” det är fel på).

Tecken på agil utveckling

Sitter och rensar ut gammal e-post och hittade följande som skickades till en kund när ett POC-projekt övergick i “vi gör lite mer än POC” (från 2008).

Som förespråkare för agil utveckling vill jag ju poängtera att

  •  agila utvecklare aldrig undviker att “träffa” ett lager utan tvärtom har som mål att i varje utvecklingssteg se till att man tar ett “helt snitt av kakan” – man tar inte bara glasyren som vi gjort nu, utan strävar att alltid jobba sig hela vägen ner till botten (databasen) utan fusk eller genvägar.

Om vi har 30 minuter kan vi diskutera vilka agila principer vi skall hålla högt i detta projekt :)

Det förra projektet hade följande högt:

  • gemensamt kodägande
  • daglig regelbunden standup (med de tre frågorna: vad har jag gjort sedan senast, vad gör jag till nästa gång, har jag några hinder i vägen)
  • standupen får vara högst 15 minuter
  • planering i iterationer med synlig sprint backlog och …
  • … burndown chart
  • utvecklarna estimerar och planerar sprinten ihop med beställaren
  • sprintens backlog respekterades av alla
  • utvecklarna bestämmer egna dagordningen – alla jobbar med allt, inga revir
  • show and tell i slutet av iterationen
  • kontinuerligt bygge & test av koden
  • alltid körbar kod
  • sprintens backlog underhölls av och var till för utvecklarna och gav PM info om progress
  • endast återstående tid rapporteras

och halvhögt hölls

  • one shot build – ett kommmando är allt som behövs för att bygga och testa allt
  • retrospective – utan regelbunden utvärdering utvecklas man inte
  • gemensam arbetsyta (open work-area)
  • velocity – utvecklingstakt beräknades efter varje iteration utan indelning i mötestid, utvecklingstid, reviewtid, …
  • enhetstestning
  • coding standards – code review

och halvlågt hölls tyvärr

  • testdriven utveckling
  • automatiserad acceptanstestning
  • parprogrammering

och obefintligt var:

  • on-site customer
  • continuous deployment
  • relativa estimat i produktbacklogen (estimaten där hade rubriken timmar vilket var missvisande)

Det finns andra “agila tecken”, jag tog bara ett par ur huvudet och från http://jsolutions.se/2009/10/29/undersokning-om-agil-utveckling/

/Fredrik :)