Optimera Stockholm

Det är lite lockande att som Göteborgare passa på att skämta om bästkust och hur man har behov av optimering i Stockholm medan allt är fint i Götet, men dagens seminarie/minikonferens (twittertag #optsthlm) på ämnet webboptimering/webbprestanda förtjänar inget annat än lovord! Talarnas ämnen och innehåll var mycket väl utspridda över hela problemrymden från server till klient och allt där mellan. Continue reading “Optimera Stockholm”

Speed Matters

Some high traffic sites conducted research and uncovered the following:

  • Google.com: +500 ms (speed decrease) -> -20% traffic loss [1]
  • Yahoo.com: +400 ms (speed decrease) -> -5-9% full-page traffic loss (visitor left before the page finished loading) [2]
  • Amazon.com: +100 ms (speed decrease) -> -1% sales loss [1]

[1] http://home.blarg.net/~glinden/StanfordDataMining.2006-11-29.ppt
[2] http://www.slideshare.net/stoyan/yslow-20-presentation

Signeringsfest: GPG och CA Fire and Forget

Jag var för första gången med vid en stor “signeringsfest” på Fosdem2010 – över 250 nycklar var inskickade men i slutändan var det inte fler än 80 som dök upp i kylan och duggregnet. (Jag själv kom 20 minuter sent.)

Hur som haver – efteråt gäller det att signera och få iväg de signerade nycklarna. Till detta finns caff, CA Fire and Forget, som just gör det man vill:

  • hämtar hem nyckeln
  • signerar den
  • skickar den krypterad till mottagarens adress (bara mottagaren med rätt privat nyckel kan läsa signaturen).

caff -m yes -u 9B1E4234 `cat keys-to-sign.txt`

och detta kommer i paketet signing-party.

Det finns dock inget som plockar ut fingerprintdelen ur den ASCII-fil som distribueras, så jag fick hacka ihop detta själv med lite python:

#!/usr/bin/python

indicies = []
keysByIndex = {}
lastIndex = False

# get the indexes of the keys "verified", as they appear on the key paper (000, 001, ...)
for line in open("id-verified.txt"):
  if len(line) == 4:
    indicies.append(line[0:3])

# build up index > key part
for line in open("ksp-fosdem2010.txt"):
  if "Fingerprint OK" in line:
    lastIndex = line[0:3]
  else:
    if lastIndex:
      key = line[12:20]
      keysByIndex[lastIndex] = key
      lastIndex = False

# write keys out to file
print "You've mareked %s out of %s - verify this before running caff" % (len(indicies), len(keysByIndex))
out = open("keys-to-sign.txt", "w")
for index in indicies:
  key = keysByIndex[index]
  out.write(key)
  out.write(" ")

Getting Things Done & Pomodoro

Emellanåt har jag fler än två saker att göra på jobbet (annat var det förr!) så mitt behov av pomodoro eller annan strategi för att beta av en att göra-lista är mycket begränsat. Lite då och då sitter jag dock med en “privat” att göra-lista (som bara växer) och nu är ett sådant tillfälle – “dags att testa pomodoro” tänkte jag och letar upp en Pomodor-timer för Gnome lite snabbt.

Den visar sig inte vara översatt till svenska (använder gtranslator för detta) och den kommer inte förkompilerad som binär. Det var längesedan jag byggde debianpaket, men det brukar vara ganska enkelt. Låt oss se:

sudo aptitude install debian-builder

Efter uppackning av tar-bollen kör jag debuild som säger:

dpkg-checkbuilddeps: Ej uppfyllda byggberoenden: cdbs (>= 0.4.43) debhelper (>= 6) python-distutils-extra (>= 2.10)

Så vi drar in dem med: sudo aptitude install cdbs debhelper python-distutils-extra och kör debuild igen.

Bygget fungerade tyvärr inte ändå och fick rapporteras som en bugg. Använder tills vidare timer-applet.

Internet Explorer under Ubuntu 10.04

Ja – min arbetsgivare använder en lösning för registrering av utlägg som är hårt knuten till ActiveX-komponenter. Därför är det smidigt att kunna köra Internet Explorer under Ubuntu GNU/Linux 10.04 (äks Lucid Lynx). Paketet som de flesta kört heter IEs4Linux och man får installera det själv – Ubuntu paketerar det inte.

Jag drog in det och instruktionerna på hemsidan stämmer, men jag fick (som andra också rapporterat) problem med GTK+ pga att jag körde flera skärmar. Med flaggan –no-gui körde installationsprogrammet ies4linux utan större problem – flash-installationen sparkade bakut men det gör mig inget.

Eclipse och TDD

Eclipse är ganska svagt utrustat från start för att köra TDD effektivt. Det verkar inte komma ifrån att code completion måste utföras med CTRL+mellanslag – här kommer IntelliJ för alltid lysa med sin vackerhet (där mellanslag eller tab är “markören” som kollar om den skall auto-complete:a).

Favorites

Följande klasser är bra att peta in i varje workspace Window » Preferences » Java » Editor » Content Assistant » Favorites:

  • java.util.Arrays.*
  • java.util.Collections.*
  • org.junit.Assert.*
  • org.mockito.BDDMockito.*
  • org.mockito.Matchers.*
  • org.mockito.Mockito.*
  • org.mockito.MockitoAnnotations.*

Templates

Börja med att ta bort  alla SWT, ta bort test för JUnit 3.

WORK IN PROGRESS!

before

${staticImport:importStatic('org.mockito.MockitoAnnotations.initMocks')}
@${beforeAnnotation:newType(org.junit.Before)}
public void ${setup}() throws Exception {
  initMocks(this);
  testee = new ${cursor};
}

Det är givetvis trevligare med @RunWith(MockitoJUnitRunner.class). MoreUnit kan hjälpa till med att sätta upp detta.

mock

@Mock private ${type} ${mock};

bdd – BDD-ish Test

@Test public void statement() throws Exception {
    given(${mock}.${method}).willReturn(${value});

    // WHEN ${when}
    ${testee}.${act};

    // THEN ${then}
    verify(${mock}).${method}(${arguments});
}

tdd – TDD test

@Test public void statement() throws Exception {
    // Arrange
    // Act
    // Assert
}

Python, Maemo, WLAN & webbrowser

Just scratched an itch with a couple of lines of Python code, which launches a browser if my cellphone (Nokia N900, Maemo 5) connects to a specific WLAN. The WLAN names to look for, as well as the URL that is opened in the browser are specified in gconf.
The itch is about WLANs with login pages/portals and is reported in Maemo bug tracker as Bug 7678.

I put the source on source.wendt.se but also “inlined” here (spaces might get truncated by WordPress):

#!/usr/bin/python2.5 

"""
This is a quick hack that launches a browser when the device connects to an IAP with a
name that is present in gconf key 

There's no fancy GUI. To set the IAP names to listen for, run:
gconftool-2 -s --type=list --list-type=string "/apps/wlan-browser-launcher/iap-names" "[limbergwendt2,CSWLAN]"

To change the URL that opens, run
gconftool-2 -s --type=string "/apps/wlan-browser-launcher/url" "http://wendt.se/ip/"

All gconf values are re-read on each connect signal.

Based on Conic examples on PyMaemo wiki by Lauro Moura [lauro .neto_indt.org.br].
"""

import conic
import dbus
import gobject
import gnome.gconf
import dbus.glib
import webbrowser

GCONF_KEY_NAMES = "/apps/wlan-browser-launcher/iap-names"
GCONF_KEY_URL = "/apps/wlan-browser-launcher/url"

iap_id_to_name = {}
names_to_look_for = []

def load_iap_id_to_name(connection):
    global iap_id_to_name
    iap_id_to_name = {}
    iaps = connection.get_all_iaps()
    for iap in iaps:
        iap_id = iap.get_id()
        iap_name = iap.get_name()
        iap_id_to_name[iap_id] = iap_name

def load_names_to_look_for():
    global names_to_look_for, url_to_open
    gc = gnome.gconf.client_get_default()
    names_to_look_for = gc.get_list(GCONF_KEY_NAMES, gnome.gconf.VALUE_STRING)
    url_to_open = gc.get_string(GCONF_KEY_URL)
    print "Looking for IAP with these names: %s" % names_to_look_for

def connection_cb(connection, event):
    global iap_id_to_name, names_to_look_for, url_to_open
    status = event.get_status()
    iap_id = event.get_iap_id()
    if status == conic.STATUS_CONNECTED:
        load_iap_id_to_name(connection)
        load_names_to_look_for()
        iap_name = 'UNRECOGNIZED'
        if (iap_id_to_name.has_key(iap_id)):
            iap_name = iap_id_to_name[iap_id]
        print "CONNECTED (%s, %s, %i)" % (iap_id, iap_name, status)
    
        if (iap_name in names_to_look_for):
            if (not url_to_open):
                print "No URL setup for gconf key %s: not launching browser" % GCONF_KEY_URL
            else:
                print "Opening browser (pointing it to %s) for IAP %s" % (url_to_open, iap_name)
                webbrowser.open_new(url_to_open)

def start():
    connection = conic.Connection()
    connection.connect("connection-event", connection_cb)
    connection.set_property("automatic-connection-events", True)
    return connection
    
def stop(connection, loop):
    connection.set_property("automatic-connection-events", False)
    loop.quit()

def check_browser():
     gc = gnome.gconf.client_get_default()
     if (gc.get_string('/desktop/gnome/url-handlers/http/command') == 'epiphany %s'):
         raise Exception('Browser in gconf invalid (see NB#136012). Installation error.')

if __name__ == "__main__":
    check_browser()
    loop = gobject.MainLoop()
    bus = dbus.SystemBus(private=True)
    
    connection = start()
    loop.run()
    stop(connection, loop)

Plexgear TV-stick USB

Skaffade för ett tag sedan en TV-sticka från Kjell & Co. Idag testar jag den och hoppas kunna se lite TV-strömmar helt enkelt – får se hur långt jag kommer.

[ 8927.236139] usb 2-2: new high speed USB device using ehci_hcd and address 2
[ 8927.374608] usb 2-2: configuration #1 chosen from 1 choice
[ 8927.491429] dvb-usb: found a 'Afatech AF9015 DVB-T USB2.0 stick' in cold state, will try to load a firmware
[ 8927.491441] usb 2-2: firmware: requesting dvb-usb-af9015.fw
[ 8927.511734] dvb-usb: downloading firmware from file 'dvb-usb-af9015.fw'
[ 8927.567371] dvb-usb: found a 'Afatech AF9015 DVB-T USB2.0 stick' in warm state.
[ 8927.567475] dvb-usb: will pass the complete MPEG2 transport stream to the software demuxer.
[ 8927.567806] DVB: registering new adapter (Afatech AF9015 DVB-T USB2.0 stick)
[ 8928.078311] af9013: firmware version:4.65.0
[ 8928.083146] DVB: registering adapter 0 frontend 0 (Afatech AF9013 DVB-T)...
[ 8928.112897] tda18271 0-00c0: creating new instance
[ 8928.119550] TDA18271HD/C2 detected @ 0-00c0
[ 8928.430339] dvb-usb: Afatech AF9015 DVB-T USB2.0 stick successfully initialized and connected.
[ 8928.440748] usbcore: registered new interface driver dvb_usb_af9015
[ 8928.468162] usbcore: registered new interface driver hiddev
[ 8928.468211] usbcore: registered new interface driver usbhid
[ 8928.468217] usbhid: v2.6:USB HID core driver

Kaffeine

Blir tyvärr påmind om varför jag inte tycker om KDE. Plottrigt GUI. Men, dessvärre får jag inte in någon bild … http://bernehjalt.wordpress.com/2009/06/13/roxcore-dvb-t-tv-reciever-usb-stick/

MythTV

Börjar med att installera MySQL …

Luftfartsverket och samhällsberedskap

Det kostar pengar att hantera skalning. Vid lunch fick jag höra via andra (mun till mun-metoden) att ett askmoln från Island ställer till det i luftrummet. Nu när klockan är 18:30 svarar inte luftfartsverkets webbplats på anrop, troligen fullständigt överlastad av anrop.

En lösning: Flytta IP-adresserna till en serverpark (t ex Amazon EC2) som kan klara lasten – köp den mängd som behövs. Låt denna serverpark servera statiska sidor som uppdateras var femte minut. Om möjligt, låt dynamiska uppslag gå igenom, men se till att få bort alla anrop för statisk information från de stackars servrar som inte klarar ett par 100 procents ökad trafiklast.

Uppdatering: Av outgrundlig anledning fungerar dock Swedavia-webbplatsen, t ex http://www.swedavia.se/got_utr_AnkAvg