Category Archives: Experiences

Tunneling Gerrit

Tunneling and Gerrit was a really interesting happening, as it wasn’t all clear how to do the following things

  • Allow cloning and interaction with Gerrit Git
  • Allow interaction with Gerrit’s web UI

The first part was easier than the second. So let’s look at the second first.

Allowing interaction with Gerrit’s web UI

In order to set this tunnel up you need to know the port it’s running at. This can be stuck in a few places, depending on your configuration. Most obvious places to look are

  • Apache site configuration
  • /etc/gerrit/gerrit.config

Mine was residing in the config, which said

[httpd]
    listenUrl = http://*:8080

This is something we can use when we set up our tunnel. The tunnel setup is a bit opaque, but the general gist is:

ssh -L [local port number]:[remote host where gerrit web is running]:[remote port where gerrit web is running] [username]@[remote host] -p [remote ssh port]

So, a command would look like this:

ssh -L 3333:cerberus:8080 john@doe.com -p 1234

After having done this and logged in you will be able to reach the web ui through:

http://localhost:3333

Make sure you add your local SSH key so you can interact with Gerrit Git.

In parallel you can/need to set up another tunnel to Gerrit, which usually runs on port 29418…

Allowing interaction with Gerrit Git

The port Gerrit runs on was found in the /etc/gerrit/gerrit.conf file, looking like this:

[sshd]
    listenAddress = *:24918

So let’s use this for setting up the Git tunnel. The command follows the same pattern as for tunnelling the Gerrit web UI:

ssh -L [local port number]:[remote host where gerrit web is running]:[remote port where gerrit web is running] [username]@[remote host] -p [remote ssh port]

And the final tunnel would be something like this:

ssh -L 29419:cerberus:29418 john@doe.com -p 1234

In order to interact properly with Gerrit Git through this tunnel, you would for instance clone a repo like this:

git clone ssh://[gerrit user]@localhost:[tunnel port]/[git repo]

And the command itself would be similar to:

git clone ssh://john@localhost:29419/doe.git

Good to know!

Felmeddelanden som inte klarar sig utan Google

Idag skulle jag lägga till en HP LaserJet 1200 i Lubuntu 12.04. Allting flöt på precis som jag förväntade mig i guiden tills jag skulle peka ut drivrutinen jag ville köra (PCL5e passar oftast skitbra till den här skrivaren, tillsammans med Gutenprint). Då får jag “CUPS server error”-meddelande som innehåller de (enda användbara bland flera) beskrivande orden “client-error-not-possible”.

Det var det jag hade att gå på. Processen att lösa det på blir: Öppna ny Chrome-flik, skriv in följande “lubuntu cups server error adding printer client-error-not-possible”, klicka på första svaret, lägg till smbclient, prova att lägga till skrivaren igen, cha-ching! Funkis skrivare!

Men vad i hela helsefyr är “client-error-not-possible” för ett beskrivande felmeddelande på att jag saknar smbclient? Jag svär högljutt inombords…

Lubuntu på HP dc7700p, saker att hålla i minnet (och hitta lösningar på)

Jag kände för att börja Dual-boota igen. Jag hade kört Windows i nästan ett år och tyckte väl att det var trevligt, men insåg att jag på min HP DC7700P borde köra något som kanske är lite mindre prestandakrävande och spelvänligt (BF3 och Syndicate och Portal), som tex Lubuntu. Det fanns dessutom lite folk i #sis (irc.bthstudent.se) som själva kör och har kört Lubuntu, vilket helt klart är en fördel när man ska börja felsöka konstigheter.

Det jag stötte på problem med direkt var

  • Nvidias drivrutiner
  • Dubbla skärmar
  • Tangentbordsnedtryckningar: repetitionsfrevens och delay
  • Fokus på nya fönster

Låt oss då gå igenom dem en i taget för att skriva ner länkar till källor på guider och lösningar, samt vad jag försökt själv och hur det ser ut att fungera.

Nvidias drivrutiner

Jag är lite kluven på vad man ska göra här. Det finns i skrivande stund två olika val man kan göra när man installerar Nvidia-drivisarna genom Lubuntus “Additional drivers”

  • Version current, recommended
  • Post-release updates, version current-updates

Skillnaderna på dessa, enligt vad jag hittat, är att “Post-release updates” uppdateras löpande och är mer känsliga för förändringar. Version current är en låst release som inte kommer att uppdateras. Jag har testat båda och båda har gett lite olika resultat för varje installation jag gjort. Jag brukar köra med recommended för att de är… tja, rekommenderade. Förhoppningsvis ligger det något bakom påståendet.

Slutligen

Jag använder mig av Nvidias “Version current” release av drivrutiner. Efter en del försök och hoppande genom alla möjliga olika ringar så ser det ut som om Nvidias drivrutiner klarar av att hantera skrivbordsmiljön minst lika bra som den drivrutin Lubuntu levererar som standard.

Dubbla skärmar

Dubbla skärmar i Ubuntu verkar det vara många som håller på att brottas med. Askubuntu har en intressant tråd som ser ut att ha gett bra resultat för vissa och mindre bra för andra. Dock är det lösningar på väldigt specifika önskemål. Det finns även en tråd på ubuntuforums som kan vara värd att gräva mer i för att se om man kan få ordning på saker och ting.

Slutligen

Efter att ha installerat om ett gäng gånger och testat med olika konfigurationer av Nvidias och Lubuntus drivrutiner, samt ett gäng olika konfigurationsverktyg så som nvidia-settings, arandr, Monitor Settings och Openbox Configuration Manager, kom jag till slut fram till följande uppsättning:

Nvidia: Kör “gksudo nvidia-settings” för konfiguration av skärmar. Det som är spännande finns under kategorin “X Server Display Configuration”. Där ställer jag in min primära skärm till 1600×1200. Jag har testat att sätta den till “Make this the primary display for the X screen” men inte sett någon skillnad från om den skulle var urklickad. Det finns en skärm till, den sekundära, men den är avaktiverad. Jag klickar på den och väljer “TwinView” under “Configuration”. Att använda sig “Separate X screen” har bara resulterat i en svart bakgrund och X-musmarkör på den sekundära. Jag sätter upplösningen på denna till 1680×1050. Därefter klickar jag på “Apply” och sedan (skitviktigt!) “Save to X Configuration file”. Här har jag fått lite blandade resultat, men om man kör det här verktyget med sudo så brukar det inte strula. Verktyget sparar då ner den konfiguration du klickat fram, till en xorg.conf som läses in varje gång Lubuntu bootar.

Openbox Configuration Manager: Den här kikade jag på riktigt tidigt och kom efter en hel del ominstallationer av drivrutinerna på att den med säkerhet också påverkar mycket av fönstermiljön i Lubuntu. Mycket riktigt, här finns godsaker som “Focusing windows”, “Placing windows” och “Primary Monitor”. Efter att ha petat runt lite kan jag bara konstatera att ett par av dessa inställningar verkar direkt överlappande nvidia-settings, så det är viktigt att ta en extra titt här för att påverka sättet som tex nya fönster dyker upp.

Tangentbordsnedtryckningar

En sak som jag gärna vill göra är att påverka vilken fördröjning en nedhållen tangent har innen den börjar repetera. Det här var inte så självklart som man kunde tro, dvs att använda verktyget Keyboard and Mouse och försöka påverka lite reglage, klicka Ok och sen glömma det hela. Något verkar fuffens i hur Lubuntu sparar ner dessa värden och i mitt fall ser detta inte ut att göras alls. Efter lite snack med mina Lubuntu-kompisar så är tanken att det ska finnas en fil placerad i .config/lxsession/$SESSIONNAME/desktop.conf, men det sker alltså inte i min miljö. Till dags dato har jag fortfarande inte kommit underfund med hur den här filen skapas och accessas av Lubuntu, för den skiner med sin frånvaro. Jag har ett par tester kvar att göra för att se om jag kan skapa den självmant och få Lubuntu att fatta läget, men jag är lite skeptisk.

Slutligen

Det sättet jag fick tangentbordsinställningarna att fungera på var att köra: cd; mkdir -p .config/lxsession/$DESKTOP_SESSION/; lxinput;, göra en tangentbordsjustering vilken som helst, klicka Ok och sedan gå in och redigera filen .config/lxsession/$DESKTOP_SESSION/desktop.conf, eftersom GUI-verktyget till synes inte fixar att göra detta. Däremot kan verktyget visa för dig vilken inställning du har, vilket iallafall är något.
Den här lösningen visade sig ha rätt så förödande effekter på fönstermiljön. Varje gång jag skapade filen och justerade delayen, så pajjade massvis med väsentliga delar i fönstermiljön. Jag rekommenderar inte att man gör på det här viset för tillfället.

Fokus på nya fönster

Det här är en rapporterad bugg som jag ganska snabbt blev lite irriterad på. Om jag tex använder mig av Alt+F2 för att få upp Run-fönstret, då placeras det per default i bakgrunden. Om det är det enda fönstret som är synligt visas det åtminstonde, men det har inget fokus.

Slutligen

Debian bugs ser ut att ha lösningen på problemet genom att redigera ~/.config/openbox/sessionname-rc.xml och lägga till följande innan </applications> i slutet av den filen:

  <application name="lxpanel" type="dialog">
      <focus>yes</focus>
  </application>

 Ett par saker till

  • Keybinds
  • 256-färgers xterm
  • 256-färgers gnome-terminal

Keybinds

Med det Windows-tangents-aktiverade tangentbord man har är det rätt användbart att lägga lite keybinds på det. I och med att jag kör TwinView på Nvidia-kortet såg jag det som väldigt tursamt att jag kunde få ett fönster att byta skärm, utan att för den sakens skull ha definierat “Monitor 0”, “Monitor 1”, osv, i xorg.conf. Jag hittade även ett kommando för att maximera fönster med en keybind.

Slutligen

Min .config/openbox/lubuntu-rc.xml innehåller förutom standardgrejset även dessa rader:

<keybind key="A-F10">
    <action name="ToggleMaximizeFull" />
</keybind>

<keybind key="W-C-Right">
    <action name="MoveResizeTo">
        <monitor>next</monitor>
    </action>
</keybind>

<keybind key="W-C-Left">
    <action name="MoveResizeTo">
        <monitor>prev</monitor>
    </action>
</keybind>

256-färgers xterm

Mina syntax highlighting definitioner i vim fungerar så mycket bättre när man har ett par fler än 16(!) färger i terminalen. Welcome, xterm-256color! Enkelt nog kunde jag gå in i min .bashrc och knattra lite.

Slutligen

Jag redigerade ~/.bashrc och lade i botten av den filen följande kodsnutt
if [ “x$TERM” = “xxterm” ]
then
export TERM=”xterm-256color”
fi

256-färgers gnome-terminal (och lite till)

Mina lite speciella önskemål rörande vim (som nästintill kräver 256 färger, anpassningsbar font till Dina och anpassningsbar markör) gjorde att jag fick byta till gnome-terminal. Den ingår tydligen i Lubuntu som standard och uppfyller alla dessa krav. JAg behövde göra ett par saker med min .vimrc.local för att allt slutgiltligen skulle gå rätt till

Slutligen

I min .vimrc.local så har jag:

if has("autocmd")
    au InsertEnter * silent execute "!gconftool-2 --type string --set /apps/gnome-terminal/profiles/Default/cursor_shape ibeam"
    au InsertLeave * silent execute "!gconftool-2 --type string --set /apps/gnome-terminal/profiles/Default/cursor_shape block"
    au VimLeave * silent execute "!gconftool-2 --type string --set /apps/gnome-terminal/profiles/Default/cursor_shape block"
endif

Liten extra notering om Worker om jag skulle glömma det…

För att få Worker (en DirOpus-inspirerad filhanterare) att lira snällt med gnome-terminal ska man sätta “Terminal program” till “gnome-terminal -e %s” och det kommando, säg vim, man vill köra till: “vim {F}” med inställningarna: Start mode: “in terminal”.
Uppdatering: Jag tror att jag kommit fram till en sak som jag aldrig förstått innan. Om man i Start mode väljer tex “Normal mode”, då används inte “Terminal program” för att utföra kommandot. Det är det “in terminal” och “in terminal and wait for key” är till för. Så fungerar det inte att använda sig av “in terminal” för något kommando, växla över till “normal mode” och skriv in hela kommandot som krävs för att det ska kunna exekveras på egen hand.

Automata-dagliga-, -nattliga-, -när-ni-vill-byggen av Android med Ant

Androidengineer har ett blogginlägg som jag läst på och testat för att få ordning på schemalagda byggen av mina (singular, egentligen) Android-applikationer.
Jag ska kortfattat försöka stylta upp vad det är som innefattar en sådan uppsättning i en Debian headless servermiljö. Jag har inte lyckats stillisera ihop en ren och fin sammanhängande process för detta, så vänligen läs in på länken ovan för att (föhopnningsvis) få svar på eventuella funderingar och frågor kring hur man använder vissa verktyg.
Logga in på din Debian-burk, bestäm dig för var du vill sätta upp saker och var du kan tänka dig vilja placera ett flertal hundra megabyte av Android SDK och kör:

  1. Installera Ant
  2. Installera Java Compiler (Jag använder openjdk-6-jdk)
  3. Ladda ner Android SDK:t (http://developer.android.com)
  4. Se till att Android SDK:t finns i din Path
  5. I SDK-mappen, kör: android update sdk –no-ui
  6. Checka ut/Kopiera ut ditt Android-projekt till en lämplig mapp på servern. Denna fungerar som bas för byggena
  7. Kör: android update project –path [sökväg till projektet] –target [Android build target] (Headless- Android-kommandostöd)
  8. Kör: ant

Så, nu bör du iallafall kunna bygga projektet genom Ant, vilket innebär att du är såhär [] nära att kunna fixa automatbyggebitarna.
Jag kan ge ett exempel på ett bash-skript jag kör, så du har något att utgå ifrån:

#!/bin/sh
cd /home/drlaban/projects/banjolejon
git checkout development //Kan vara vilken branch som helst
git reset --hard HEAD //Ser till så att det under inga omständigheter finns någon form av ändringar kvar innan bygget (man kan aldrig vara säker)
git pull
rm build.xml //Den här tas bort då den verkar fela då och då när man fösöker uppdatera sitt Android-projekt
android update project --path . //Uppdaterar Android-projektet, bygger build.xml
ant clean //Tar bort allt gammalt Ant-skröfs som ligger och skräpar
ant debug //Bygger nu hela projektet med Ant. Tar lite tid beroende på storlek
cp /home/drlaban/projects/banjolejon/bin/banjo-debug.apk /storage/dump/banjo-daily.apk

Sådär! Då har ni fått grunden för det här. Jag har gjort det och testat det och har till synes fått det att fungera. Så det borde du med kunna göra.

OBS! Detta bygger bara debug-versioner av din applikation. För att kunna bygga livliga applikationer måste man signera dem. Det står beskrivet i den första länken hur man kan gå till väga där.

Internationalisera WordPress… wth

Det märks att WordPress är något av ett monster att ha att göra med när man sitter och moddar och har sig.
Jag försökte vara ett så gott stöd som möjligt till Emma Ekberg i hennes strävan att få en svensk blogg. Jäklar i min låda vilket härke det är att försöka navigera sig mellan WordPress, internationalisering och temastruktur.
Några nyckelord

  • WordPress
  • Translation
  • Themes
  • Domain
  • __([String])
  • __(String, Domain)
  • Översättningsfiler (.po, .mo)

Egentligen är det __() och Domain som är de absolut viktigaste där. Vad jag lyckades slutleda mig till efter ett par timmars parprogrammerande var att man måste hålla på att latja lite med översättningsfunktionen __() och de argument man skickar in. Om en översättning inte ser ut att fungera till kommandot __(“Översätt den här strängen”, “Korv”), då kan man behöva skriva in nyckelorden man försöker översätta i .po/.mo-filerna som tillhör temat, eller ändra argumenten som man skickar in i __(), eller en kombination av båda. Ibland kan det vara enklare att helt enkelt strunta i att inkludera en domän och sätta in översättningen direkt i WordPress egna .po/.mo-filer. Givetvis med en risk att det kan försvinna när man uppgraderar WordPress, men hell, det som funkar, det funkar.
Det är enastående vad rörigs saker kan bli när det inte sätts in några strikt upprätthållande regler för tex översättning när temaskapare sitter och knackar hemma på kammaren.

Logga (System.out.print) allt!

Satt och försökte hjälpa en snubbe med ett problem rörande Spinners i Android. Tydligen kraschade appen han byggde varje gång man tryckte på Spinnern och valen skulle visas. Enligt stacktracen var det ett NullPointerException, men det som gjorde det hela svårare var att Spinnern faktiskt innehöll minst ett val.

Efter ungefär en trkvarts, timmes felsökande visar det sig att det körs två loopar, baserat på databasresultat. Varje iteration i första loopen lägger in ett val i listan, varje iteration i andra loopen drar ifrån ett antal val i listan. I detta fallet visade det sig att första loopen gjordes med en check

for(int i = 1; i <= list.getsize(); i++) { //Lägg till val }

Den andra loopen använde sig av

for(int i = 0; i < list2.getsize(); i++) { //Dra ifrån val }

Det intressanta i de här looparna är att den första lägger till hela listans resultat + 1. Detta innebar att det hamnat ett null-objekt i listan, som loop två inte kunde ta bort.
Det enda som skvallrade om något kring detta var att skriva ut loggar över vad som inträffade. Det hade tagit ungefär 15 minuter att lösa detta, om man hade börjat direkt med att logga vad som skedde. Så, till alla er som sitter där ute och tror/litar på att ni vet vad er kod gör, _utan_ att se loggarna: Tänk om. Ni har ingen aning.

Få Run Application (Alt+F2) att starta ett specifikt program i Lucid Lynx

Jag brottades ett rätt bra tag med det här problemet, det finns ju så många olika sätt att lösa saker och ting i Linux-världen.

Mitt problem;

  • Jag ville att ett icke installerbart, java-kompilerat program skulle vara tillgängligt via Run Application
  • Jag ville ändra (eller komplettera) listan över de tillgängliga kommandon som startar ett program i Run Application

För att lösa den förstnämnda punkten var jag tvungen att, via terminalen, skapa ett shell-skript som var döpt till det kommando jag ville att Run Application skulle aktiveras av, och som innehöll följande:

#!/bin/bash
cd [sökväg till mappen där java-filen ligger]
java -jar [filnamn]

Därefter behövde jag se till att detta skript var körbart mha:

chmod a+x [skriptfil]

Härefter testkörde jag programmet från terminalen för att se att det fungerade.

För att få Run Application att snappa upp det nya programmet använde jag mig av “Main Menu”-applikationen i “Go-Home”-appletten (appletten, bra ord…) och lade till skripfilen till en av menyerna.

Härefter var det bara att trycka in Alt+F2 och skriva in skriptfilens namn och mysa lite över att det fungerade som jag ville.

Det andra problemet var lite mer lättlöst. Om jag skulle vilja döpa om genvägen “chromium-browser” till bara “chrome” eller “chromium” eller “mium” eller något annat som inte redan är taget, kan jag göra det genom sym-länkning.

De flesta programmen som är körbara utan en skriptfil som nämnt tidigare kan symlänkas med ett annat namn och fungera helt smärtfritt. Programmen lägger sig allt som oftast i “/usr/bin”.

Sättet att utföra detta på är att starta en terminal, byta katalog till “/usr/bin” och skriva in:

sudo ln -s [originalnamn] [ditt nya, fiffigare namn]

(sudo behövs om du inte är root) Nu kommer programmet att kunna startas via Run Application med både det gamla och det nya namnet. Om man inte är nöjd med sitt nya namn är det bara att ta bort sym-länken och göra om. Eller lägga till ett nytt. Ta inte bort originalfilen bara. 😉

Skicka dyra saker till utlandet? Använd REK!

Jag satt och svettades en hel del över att skicka iväg min mobiltelefon på reparation, mest för att det visade sig vara rätt svårt att hålla koll på vad som händer med ett paket när den lämnat Sveriges gränser.

Jag visste att man kunde skicka sina brev som REK för att få lite mer koll på dem, men en sak som jag måste lyfta upp lite extra; Betala de där extra pengarna det kostar att skicka innehåll med ett marknadsvärde av högst 10 000 kronor.

Ska man skicka en mobiltelefon man betalat 7000+ kronor för gör man bäst i att minska stressen för nerverna när man inte vet om/när paketen kommer fram till mottagaren. Det tog en vecka och en dag innan jag fick bekräftat att brevet kommit fram och det var ett rätt bra jagande för att komma fram till detta. Det tog en dag totalt innan brevet lämnat postterminalen vid Sveriges gräns, sen var det Bermudatriangel i sju dagar till. Det lugnade inte direkt heller att höra från Posten att det är rätt dålig hantering i Storbrittanien så man ofta inte kan följa kollit alls.

Så följ mitt råd; skicka dyra saker, se till att skicka som REK med extra högt marknadsvärde, annars är risken att man bara får tillbaks futtiga 500 kronor vid eventuellt borttappat brev.

Redmine. Bra men (serveradmin)klurigt

Installerar Redmine på min Debian-burk som jag så snällt fick ärva av goda vänner.

Det är ett kanonverktyg som utökar Trac:s funktionalitet rejält, bla med möjligheten att köra fler projekt i ett och samma verktyg.

Men, jag hade stooora problem att få attachments att lira och har nu efter ett litet tag börjat förstå var problemet ligger;

Redmine kör Ruby on Rails och jag använder mig av en komponent kallad Passenger. Denna komponent fungerar på något sätt som en hand mellan Apache och Redmine/Ruby och iochmed detta är det lite speciell hantering av bland annat användare och rättigheter som är viktiga att hålla reda på.

Kort sagt, det verkar som om, när Ruby startas upp av Apache, Passenger ärver den användare som Apache startats med enligt den här dokumentationen. Det lustiga är att användaren som startar Apache på min box inte alls motsvarar den som Passenger sen kör (som i ps aux får namnet “nobody”). Efter massvis med bök i rättigheter och dessutom letande i Redmine:s källfiler (var fan står det egentligen var någonstans filer sparas, herrarna och fröknarna Redmineutvecklare???) kom jag till slut fram till att om man chownar hela redmine-mappen till www-data:www-data, så mår Redmine helt plötsligt mycket bättre vad gäller attachments och plugins.

Nu ska jag bara luska ut vilka negativa sidoeffekter och vad fasen den här Passenger-komponenten gör och så kallad user switching, men det blir en annan femma.

EDIT! En sak som kan vara jääääkligt bra att veta; /etc/apache2/mods-available/passenger.conf kan tilläggas en rad som säger

PassengerDefaultUser www-data

Detta gör alltså att passenger startas upp med användaren www-data istället för att som default ärva upp en användarstatus.
/EDIT!

Ändra e-postadress i Messenger

Det här har jag tidigare försökt hitta en lösning på och gått bet praktiskt taget varenda gång;

Hur ändrar jag e-postadressen/inloggningskonto till Messenger utan att behöva berätta för alla i min nuvarande kontaktlista att jag gjort just det?

Det verkar som Microsoft har lagt märke till att fler än jag haft detta “problem” och byggt in den möjligheten i profilinställningarna för det Live-konto man har.

Observera att detta bara är nyttigt i de fall då du angett en adress som inte är knuten till ett Live-konto, eller Hotmail-konto ELLER msn.com-konto!

Det här får mig att vilja rekommendera att aldrig någonsin registrera ett Live, Hotmail eller msn.com-konto. Någonsin. Det finns ingen anledning, åtminstonde om du bara vill ha en chat-adress. Email kan du för övrigt med fördel skaffa hos Google (http://mail.google.com) istället.

Här är en instruktion

  • Surfa till http://passport.net
  • Logga in
  • Se till att du befinner dig under “Account”
    • Om du har en adress som inte är ett Microsoft-konto (@live, @hotmail, @msn.com eller någon annan adress inom Microsofts domän), kan du nu ändra denna. Du kan även bli tvungen att bekräfta din nya adress genom att få ett mail skickat till din nya adress via Passport-sidan.
    • Om du redan har en adress som är ett Live-konto, eller Hotmail-konto ELLER msn.com-konto är du tyvärr fast i detta och kan inte ändra till en egen, anpassad adress. Då är det enda sättet att få till en flytt till annan epostadress proceduren att exportera alla kontakter från din nuvarande kontaktlista, registrera ett nytt konto på http://www.passport.net (Use an email address you already have), och lägg tillbaks användarna. Tyvärr blir det ju ingen smidig övergång, men det är Microsoft som sett till att det blir såhär bökigt. Sen vill det till att du tar kontakt med dina kontakter igen så de får din nya adress.