Archive

Archive for the ‘Uncategorized’ Category

Internet Explorer under Ubuntu 10.04

May 11th, 2010

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.

Fredrik Wendt Uncategorized , , ,

Eclipse och TDD

May 6th, 2010

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:

  • 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}() {
  initMocks(this);
  ${cursor}
}

mock

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

bdd - BDD Test

@Test public void statement() throws Exception {
    // GIVEN ${given}
    given(${mock}.${method}).willReturn(${value});
 
    // WHEN ${when}
    ${testee}.${act};
 
    // THEN ${then}
    verify(${mock}, times(${wantedNumberOfInvocations})).${method}(${arguments});
}

tdd - TDD test

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

Fredrik Wendt Uncategorized , , ,

Python, Maemo, WLAN & webbrowser

April 25th, 2010

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)

Fredrik Wendt Uncategorized , , ,

Plexgear TV-stick USB

April 17th, 2010

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 …

Fredrik Wendt Uncategorized , , , ,

Luftfartsverket och samhällsberedskap

April 15th, 2010

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

Fredrik Wendt Uncategorized

CKEditor och bliki 2.0

April 11th, 2010

I min egen TODO-lista har jag länge haft på tapeten att fixa en egen wiki (programvara), eftersom alla jag stött på innan saknat något. Så idag gick jag igång på en reflektion som diskuterades (med Peter Lindh) kring wikis - varför skall det vara så omständligt att korrigera något litet, som t ex stavfel? Hela sidan skall laddas om, man skall rulla fram till rätt ställe och i värsta fall även se till att ha lite av markup-syntaxen i huvudet + hålla ordning på var i markup-stacken man befinner sig. Nej tack.

Så wiki.wendt.se föddes, jag tankade hem CKEditor (istället för TinyMCE som jag använt många gånger tidigare) och tittade även på andra editorer. CKEditor fungerade dock fortfarande bra även på sidor med mycket innehåll - den blev inte slö efter att man skrivit in tillräckligt mycket text.

Ctrl+X för snabb redigering

En sak som jag verkligen uppskattat med wordpress är det lilla stöd man försökte ge den som skall skriva in sin text. Det går t ex att trycka CTRL+1 för att göra ett stycke till en rubrik av storlek 1 (h1), 2 för h2, …
Detta saknades i CKEditor så det lade jag en dryg timme på innan jag hittade korrekt lösning till.

Keystrokes kallas kortkommandon i CKEditor och de kan justeras genom konfigurationsobjektet som anges när man via JavaScript drar igång editorn. En keystroke består av sifferkombination (1049 för Control+1 t ex) och namn på ett kommando att exekvera (editor.execCommand). Första problemet var att endast bold, italic och liknande icke-blocks-stilar fanns som kommandon.

I plugins/format/plugin.js lade jag till följande rad för att registrera kommandon “globalt”:
editor.addCommand(tag, new CKEDITOR.styleCommand(style));

Det var inte trivialt att hitta var man skulle jacka in sig, men trivialt när det väl var hittat :) En försvårande faktor är att CKEditor nyss kom i ny utgåva (version 3.x) och all dokumentation inte riktigt är lika uppdaterad som den varit för den förra utgåvan (version 2.x).

Packningsverktyget saknas, samt instruktioner

När man väl ändrat i _source-katalogen och vill få allt packat igen får man dra hem en jar från http://svn.fckeditor.net/CKPackager/trunk/bin/ och exekvera denna. Instruktioner om att “det är så man får göra” går bara att hitta på forumet …
http://cksource.com/forums/viewtopic.php?p=46072#p46072

Lista saknas

Det saknas en sammanställning över vilka tangentbindningar som används från början, och vilka kommandon man faktiskt kan binda upp (att byta till h1 fanns alltså inte out of the box).
* Enklast är att bryta (med ckeditor_source.js som källa, dvs icke-minifierat) i core/editor.js i metoden addCommand.
* JavaDocen för CKEditor har lista på default bindings (keystrokes).

Jag saknar korrekt bindning för
* image
* outdent (motsats till indent), pga att svensk tangentbordslayout saknar dedikerad tangent för tecknet <,
* numbered list, och
* bullet list.
Följande är dock konfigurerade manuellt och fungerar fint:
[ CKEDITOR.CTRL + 90 /*Z*/, 'undo' ],
[ CKEDITOR.CTRL + 89 /*Y*/, 'redo' ],
[ CKEDITOR.CTRL + CKEDITOR.SHIFT + 90 /*Z*/, 'redo' ],
[ CKEDITOR.CTRL + 76 /*L*/, 'link' ],
[ CKEDITOR.CTRL + 66 /*B*/, 'bold' ],
[ CKEDITOR.CTRL + 73 /*I*/, 'italic' ],
[ CKEDITOR.CTRL + 85 /*U*/, 'underline' ],
[ CKEDITOR.CTRL + 48 /*0*/, 'p' ],
[ CKEDITOR.CTRL + 49 /*1*/, 'h1' ],
[ CKEDITOR.CTRL + 50 /*2*/, 'h2' ],
[ CKEDITOR.CTRL + 51 /*3*/, 'h3' ],
[ CKEDITOR.CTRL + 52 /*4*/, 'h4' ],
[ CKEDITOR.CTRL + 53 /*5*/, 'h5' ],
[ CKEDITOR.CTRL + 54 /*6*/, 'h6' ]

En av CKEditors fördelar är att länk-dialogen som visas är ett lager och inte ett eget fönster som TinyMCE använder. Fördelen är att det går snabbare att skriva in en URL pga att man slipper vänta på att en sida skall laddas.

Vanlig bläddring först: “läsläge”

Nästa problem att tackla var att editorn inte skall störa det vanliga läsande förrän man faktiskt vill ändra något. CKEditor har inget readonly läge som supportas. Forumet bjuder dock på ett par hack, men det var inte felfritt.

Tappar höjd

Tyvärr lider dpck CKEditor.replace() av att höjden på det element som ersätts inte bevaras. Så jag har nu gjort så att när en sida på wikin laddas så lyssnar jag efter dblclick-event (med ExtJS Core) och när det kommer drar jag iväg anropet till CKEditor.replace(divID, config) och populerar config.height med rätt höjd.
var replaceDivwithEditor = function() {
var el = Ext.get(’editorDiv’);
var height = el.getHeight();
var padding = el.getPadding(’tb’);
var scroll = el.getScroll();

var toolbarheight = 60;
ckConfig.height = height + padding + toolbarheight;
CKEDITOR.replace(’editorDiv’, ckConfig);
};

Börja redigering automatiskt

Allra helst hade jag velat att det man dubbelklickade på i läsläge skulle vara markerat när man hamnar i skrivläge. Men dagen har blivit efter midnatt och det är dags att fortsätta en annan dag.

Multipla redigerare

Ett annat önskemål är att kunna stödja flera upphovsmäns petande i samma sida samtidigt, såsom EtherPad fungerar. Andra har visat att det inte är omöjligt att göra, jag har dock inte hittat någon som integrerat det med CKEditor eller annan icke-radbaserad plain text editor.

http://etherpad.wendt.se/

Roadmap

En liten snabb roadmap för att byta ut bloggen/Fredriks anteckningar mot en egen blogg igen:

Must haves:
# säkerhet
# versionshanterad lagring (kanske CouchDB)
# RSS-feed (enklare med SQL?)
# hantering av nuvarande material, dvs dess URL:er - innehållet är ju redan HTML
# mediauppladdningsplugin (CKFind är tydligen inte OSS)

Och optional:
* SEO (taggar borde räcka)
* ev kommentarsfunktion
* arkivfunktioner
* OpenID
* syntaxfärgning av kod

Google får ta hand om sökning.

Fredrik Wendt Uncategorized , , , , , ,

PayPal - not the pal they used to be

April 1st, 2010
Grrrr

Grrrr

Just sent a quick letter (my daughter’s sick so please don’t mind the typos):

Sorry for being rude, but what the hell are you doing now?

Last time I had to have contact with you, was because you were trying to get in the middle of me, my money and a third party, by “offering” exchange rates that was WAY out of line and so much worse than my bank would ever offer me.

So, this time, you’ve put constraints on my account because it might’ve been used in an unsafe manner (or something along the lines of that your screening suggests).

What I did then was to go to your site (with https) and log in and get a sign saying I should update the phone numbers. I comply, enter fully working international phone numbers and I get an ugly looking HTML back saying that the numbers entered are incorrect (and no help saying what it should look like or what is wrong …)

I (and several others, just search the web) are beginning to loose all of the confidence once trusted to you and your service.

Please fix YOUR issues with YOUR web site, and I will provide valid data, again.

And what’s this deal with sending message from noreply@paypal.com - you’re really messing up this relationship here. I can’t send you an attachment since the only way of “sending” you an e-mail is by using this form.

So, here’s a URL to a screenshot showing that I entered a valid international phone number into the two boxes on your website (the number entered is +46702778511, which has worked from Sweden, France, Belgium, Germany, GB, Spain, US, China, Finland and the Netherlands).

http://wendt.se/blog/wp-content/uploads/2010/04/paypal-fail.png

/
Fredrik Wendt

Update: They replied pretty fast though:

They replied pretty fast though:

Dear Fredrik Wendt,

Thank you for contacting PayPal regarding adding your phone number.

Mr. Wendt, I apologise for any difficulties this issue has caused. I have
successfully made your number ‘+46 702778511′ as your primary number.

Please let us know if you require any further assistance.

Yours sincerely,
A*****
PayPal

Fredrik Wendt Uncategorized ,

Kan Apoteksgruppen hantera information

March 27th, 2010

Jag försökte, riktigt länge, få reda på öppettiderna för Apotek Hjorten i Majorna på Karl Johansgatan 72. Google listar ett telefonnummer som går till det statliga Apoteket AB och efter att ha talat med en telefonist som vänligt informerar om att det nu ägs av småföretagargruppen så försöker jag igen.

Hitta.se ger mig bättre information och länk till en hemsida. På hemsidan hittar jag dock inga öppettider för Apoteket jag söker. Testar att ringa och blir där uppmuntrad att söka öppettider på www.apoteksgruppen.se. Ingen telefonist, ingen information om öppettider via telefon alltså.

På apoteksgruppen.se försöker jag således igen och upptäcker till slut att under rubriken Öppettider så saknas alla städer i grupp A-G, medan kolumner för H-N, N-T och T-Ö alla finns med (spännande att N står två gånger!). Tar en skärmdump och fyller i formuläret under kontakt och kompletterar med detta blogginlägg.

PS. Det blev det statliga Apoteket istället den här gången, som har öppet längre och har ordning på sin information. DS

Hej.

Vill upplysa er om att A-G har försvunnit från listan över apotek, och er telefontjänst innefattar tyvärr inte öppettider utan hänvisar till hemsidan.

“Starkt jobbat PG”

Jag föreslår att ni byter till en webbleverantör som jobbar testdrivet (även med acceptanstest) så att fadäser som dessa inte går oupptäckta ut till kunder.

Jag blev också besviken över att informationsbubblan i kartan för de apotek jag sökte (Göteborg) alla saknade telefonnummer och öppettider.

En sökning (med er sökruta) på “karl johans” ger ett sökresultat i Karlstad.

En sökning på “Göteborg” ger följande felkod: Var vänlig sök på fler än två tecken “g”. Webbservern har således teckenkodningsproblem (också).

Sökning på “teborg” ger 0 träffar, medan “rlstad” ger träff i Karlstad.

Sökning på postnummer 414 (Göteborg) ger 0 träffar.

Detta fält är också löjligt litet för att skriva in ett meddelande i.

/ Fredrik

Apoteksgruppens sida med öppettider

Apoteksgruppens sida med öppettider

Fredrik Wendt Uncategorized

SSH genom en SOCKS proxy

March 12th, 2010

Detta har fungerat fint med PuTTY, men jag har inte tittat efter hur de gjort och bara undrat hur man uppnår samma sak med OpenSSH. Någonstans 2002-2004 så försvann detta från OpenSSH (finns i den kommmersiella versionen, buh!) men har man bara netcat (nc) att tillgå så kan man lätt få den funktion man vill ha ändå:

luser@machine:~$ cat >> .ssh/config
Host target.host.com
ProxyCommand /usr/bin/nc -X 5 -x socksProxyHostname:port %h %p

Med PuTTY:

Setting up PuTTY to use a SOCKS proxy

Setting up PuTTY to use a SOCKS proxy

Fredrik Wendt Uncategorized

jconsole all blank/white

March 9th, 2010

http://ubuntuforums.org/showthread.php?t=412870
http://ubuntuforums.org/showthread.php?t=523604
https://bugs.launchpad.net/ubuntu/+source/sun-java6/+bug/87665
https://bugs.launchpad.net/ubuntu/+source/beryl-core/+bug/118983

export AWT_TOOLKIT=MToolkit

Fredrik Wendt Uncategorized