CKEditor och bliki 2.0

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.

Javautvecklare sökes

Jag jobbar på Iptor Konsult AB och mer specifikt på avdelningen som går under namnet JavaSolutions. Jag trivs väldigt bra och bytte till denna arbetsgivare bara pga dess “interna politik”: lågt i tak, platt organisation, många teamaktiviteter samt kompetenta medarbetare som ger mig bra med- och mothugg i diskussioner av alla dess slag.

Vi söker fler personer som kan berika vår trupp och annonser på nätet på olika platser och jag tänkte föreviga den beskrivning som oftast kan ses, mest för att det kan vara kul att se tillbaka på om 15-20 år.

I huvudsak är beskrivningen bra: jag hade hoppat bindestrecken efter Java, flyttat Webservices från rubriken “webb” och ev lagt till något om lättviktig/rörlig/agil utvecklingsmetodik.

Skulle du som läser detta (mot förmodan – det här är mina anteckningar!) bli intresserad går det bra att höra av dig till mig eller Tomas Trolltoft t ex via mail.


Erfarna javautvecklare till Iptor

Presentation
Iptor expanderar och behöver utöka sitt team av Java-specialister. Därför söker vi dig med stor erfarenhet av Java-utveckling.

Arbetsuppgifter
Dina arbetsuppgifter anpassas efter dina egna erfarenheter.

Iptor tillhandahåller tjänster som:

– systemutveckling och arkitektur
– uppbyggnad av kundens utvecklingsmiljö
– teknisk konsultation, till exempel vid val av utvecklingsplattform
– granskning av system- och kodstruktur
– optimering av befintlig kod
– optimering av kunds utvecklingscykel
– mentorskap
– utbildning.

Utbildning/erfarenhet
För att passa in i teamet måste du brinna för Java och de möjligheter det skapar, samt ha förmåga att vidareförmedla dina kunskaper. Vanliga forum för detta är olika typer av utbildningar hos kunder.

Vi tror att du har en högskoleexamen och minst 5 års erfarenhet som Java-utvecklare. Du är van vid konsultrollen och har tidigare arbetat med några av nedanstående tekniker:

– JSE, JEE, JME
– applikationsservrar: JBoss, Glassfish, Weblogic, WebSphere m.fl.
– ramverk: JPA, Hibernate, Spring m.fl.
– utvecklingsverktyg: Eclipse, Ant, Maven m.fl.
– meddelandehantering
– webb: HTML, XML, JSP, WebServices m.fl.
– OS: Linux, Windows, Unix, iSeries m.fl.
– databaser: Oracle, DB2, MySQL, MS SQLServer.

Har du arbetat med JSF, SEAM eller testdriven utveckling är det meriterande.

Du är engagerad till din natur. Du brinner för kundnyttan i dina projekt och du har förståelse för hur man vidareutvecklar en affär.

Företagspresentation
Iptor är ett svenskt IT-konsultbolag inom IBS koncernen, med kontor i Göteborg, Stockholm och Malmö.

Sedan våren 2006 är vi till exempel arrangör av Javaforum i Göteborg, ett förtroende vi fått från SUN Microsystems där vi åtar oss att hålla kontinuerliga Javaforum med intressant innehåll. Via vår Javaportal www.JSolutions.se presenterar vi artiklar, nyheter och tankar kring systemutveckling med Java.

Vår specialitet är systemutveckling och systemintegration med Java. Vi har haft majoriteten av våra uppdrag hos större företag där vi levererat både rena produktionsplattformar, affärsstöd samt integrationslösningar. Flertalet av våra konsulter har arbetat med realtidsapplikationer där kraven på prestanda och svarstider är mycket viktiga. Vi har jobbat med de flesta hårdvaru- och mjukvaruplattformar som IBM, BEA, Oracle, Microsoft, SUN, Linux m.fl. Vi vågar säga att vi är i framkanten på Javautvecklingen i Sverige.

JDojo – TDD i fem steg

Genom mitt jobb har jag haft det stora nöjet att få hålla ett antal kodningstillfällen som “lanserats” under namnet JDojo@Gbg. Det var tack vare Emily Bache som detta kom till stånd och när hon nu seglade vidare mot Ruby-landet så har jag tagit över vid rodret och det hela har, mer eller mindre, näst intill formaliserats i en serie beprövade övningar i olika ämnen (kurspaket om 10 timmar skulle säkert någon vilja kalla det).

Det som började med en ambition om att sprida TDD och andra goda principer för “hantverksyrket” programmering snappades ganska snabbt upp på olika arbetsplatser och till dags dato har snart fem olika grupper/JDojos genomförts (med fler i uppstartningsfasen) och detta är en liten sammanfattning (reflektion/retrospektiv) av hur det sett ut hittills.

Ämnen som avhandlats

Utan omsvep så har vi under dessa JDojos avhandlat följande ämnen, med – för alla deltagare – mycket givande diskussioner.

Testdriven utveckling

Ett ämne som försvaras ganska brett (värdet av en bra testsvit) men “lärs ut” ganska smalt. Under SDC2010 i en fishbowl-debatt på temat “Should every proffessional developer practice TDD” var de flesta överens om “nja, det viktiga är en bra testsvit, men hur man kommer fram till den är inte givet” medan Michael Feathers mer var av åsikten “outside of Sweden, this is more or less concidered the solution”.

The Solution, med “test first”, red-green-refactor, etc lärs ut eller gås igenom i denna första övning.

Clean Code

Efter en introduktion till TDD och själva processen tar vi upp saker som “test backlog” och fokuserar ännu mer på refactor-steget och diskuterar (och deltagarna på något sätt enas om) definitionen av Clean Code. Ett antal best practices tas fram och även om det låter som ett tunt ämne så är diskussionerna här alltid rika, nyanserade och har beskrivits som “mycket värdefulla”.

Objektorienterad utveckling och TDD

Nästa steg i utforskandet av TDD har varit att titta på vad som händer när man tar steget från “enklare” imperativ/funktionell programmering och in i det objektorienterade landskapet. Med rätt uppgift och lagom dos moderering tyder ett mönster fram som i princip går ut på mycket fokusskifte mellan klasser. Ganska snart i retrospektiven brukar ett samtal kring kring inside-out, bottom-up och top-down dyka upp.

Mockist vs Stubborn Approach

Efter att ha känt på det dyra med att skifta fokus fram och tillbaka med TDD och OO bjuder nästa övningstillfälle på möjligheten att med hjälp av mockning (Mockito) bibehålla fokus på “en klass i taget” och i större utsträckning kunna fokusera på interaktionen, gränssnitt och enskilda klassers roller. Syftet med mockning, och när det är lämpligt att mocka, blir tydligt i jämförelse med föregående övning.

Behaviour Driven Development

Den femte övningen har antingen fokuserats mot BDD om det funnits intresse för detta. Fokus har legat på formen av GIVEN, WHEN, THEN och det somliga kallar ryska dockor och andra utifrån-in eller outside-in.

Legacy Code / befintlig kod

Ett annat efterfrågat ämne är hur man inför TDD-tänk kring kod som inte redan täcks av test, eller kanske inte är testbar (eller iaf svårtestad). Michael Feathers bok “Working Effectively with Legacy Code” demonstrerar detta på ett utomordentligt bra sätt och i denna övning har vi tagit kundens befintliga kodbas (om möjligt/lämpligt) och bearbetat den för att uppnå olika mål.

Mer (än) rubriker

Givetvis avhandlas många olika aspekter av systemutveckling parallellt, t ex Characteristics of a Good Test, Enough Tests? 3A vs BDD? Baby Steps, TDD vs Traditional Testing, …

Workshop i Eclipse som mjukstart

Vid ett par tillfällen har vi inlett med en workshop om effektiv utveckling i Eclipse. Detta har gett utvecklarna en möjlighet att känna på Dojo-ledaren, och omvänt en möjlighet att anpassa materialet efter gruppens förkunskaper och önskemål.

Formen för övningstillfällena

Vi har i huvudsak använt Eclipse, JUnit, Mockito och FitNesse. De 120 minutrarna används effektivt med en introduktion av dagens övning och ibland av det ämne man skall behandla – värdet av självinsikt får vägas in här och anpassas efter gruppen. Ca 90 minuter används till utförandet av övningen och avslutas med en en lagom kort retrospektiv där övning, erfarenheter och reflektioner tas upp och blandas friskt.

Vad är en Coding Dojo?

Dojo är namnet på lokalen där bl a olika kampsporter utövas, t ex Karate. 2005 lanserades termen “Coding Dojo” (eller Coders’ Dojo) där principen är att man upprepat utför vissa övningar, så att man genom repetition övar upp olika färdigheter/kunskaper så att när man behöver dem i “skarpt läge” kan man med lätthet kan agera på ett korrekt och säkert sätt.

Ingen föresläsningsserie – aktivt deltagande ger verkliga erfarenheter

Den Java-Dojo som Iptor nu bedrivit har visserligen fått en uppsättning övningar som vi fått efterfrågan på, och därför kunnat upprepa med mycket liknande resultat. Det är dock inget föreläsningspaket som deltagarna kan sova sig igenom – tvärtom skall varje individ sitta i “the hot spot” och parpogrammera. Praktisk erfarenhet och kunskap är mål utöver teoretisk kännedom och bekantskap.

Material

Skall försöka peta ut allt material här. Ikväller blir än så länge bara följande:
JDojo1: TDD och
Kata String Calculator

PayPal – not the pal they used to be

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

Kan Apoteksgruppen hantera information

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

SSH genom en SOCKS proxy

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

Voddler – ett upphovsrättsliga snedtramp

För att ta reda på vad riksdag och regering kan göra ytterligare för att stimulera den positiva utveckling som har vuxit fram de senaste åren, och för att diskutera vad som kan göras för att möta de hot och sabotage som flera av dessa har mötts av, bjuder partiets kulturtalesman Leif Pagrotsky in till ett brett samtal.

Detta berättas det om på MyNewsdesk och på Socialdemokraternas hemsida. Fint, men jag hoppas att de deltagande hinner upplysas om att de har ett svart får i skocken, i form av Voddler som klär sig i upphovsrättshavarnas kläder, men samtidigt bryter själva mot upphovsrättslagen så det visslar om det (både licensen GPL då man byggt vidare på XBMC, samt den BSD-licens som curve25519-donna släppts sin kod under).

Här följer information om de som bjudits in till mötet.

För mer information
Ömer Oguz
Presschef
070-3001824
omer.oguz@riksdagen.se

Leif Pagrotsky

Adress: Sveriges riksdag, 100 12 Stockholm
Telefon: 08-7866315
E-post: leif.pagrotsky@riksdagen.se

Film2Home

För frågor om film2home, affärssamarbeten och partnerskap,
kontakta Affärsansvarig Josefine Persson, 08-766 78 00, e-post josefine.persson@bonver.com

För frågor om marknadsföring och marknadsföringssamarbeten.
kontakta Marknadsansvarig Hanne Riddervold, 08-766 78 47, epost hanne.riddervold@bonver.com

Spotify

press@spotify.com, 0709-17 71 63, 08-510 624 14

SF Anytime

jakob.hammarstedt@bredband.bonnier.se
Magnus Aurell, Marknadschef, magnus@sfanytime.com

TV4 Play

Bella Tidblad (Ansvarig utgivare), bella.tidblad@tv4.se

SKAP

Alfons Karabuda – Ordförande, alfons.karabuda@skap.se

STIM

Helena Woodcock, Chefsjurist, helena.woodcock@stim.se
Markus Jansson, Affärsområdesansvarig, markus.jansson@stim.se

Dags att växla upp

Behövde tanka Ubuntu Desktop-skivan och jag tänkte att jag lika gärna kan låta arla (fil-maskin) servera Ubuntu-avbilder 24/7. Hur som, för att från min laptop lägga till en torrent på arla gjordes följande:

easy_install -U transmissionrpc
cat > /usr/local/bin/torrent-relay
#!/usr/bin/python

import sys
from base64 import b64encode
import transmissionrpc

HOST = "filserver"
PORT = 9091

filename = sys.argv[1]
metainfo = b64encode(open(filename, 'rb').read())

tc = transmissionrpc.Client(HOST, port=PORT)
tc.add(metainfo)