Category Archives: Data memory

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!

Fixing permissions in a shared Git repo

I hate shared Git repos’. Especially when I forget to set them as shared ones. And I start inviting people to join in on the fun.

So, therefore, here’s a tip from a blog that tells you a way of fixing the mess you did, retroactively: https://blog.christophersmart.com/2014/01/10/permanently-fixing-permissions-on-a-shared-git-repo/

tl;dr TheRightWay

git init --bare --shared

tl;dr TheRadioactiveWay

ssh server
chown -Rf root:git /path/to/bare/git/repo
cd /path/to/bare/git/repo
git config core.sharedRepository group
find /path/to/bare/git/repo -type f | xargs chmod 664
find /path/to/bare/git/repo -type d | xargs chmod 775
find /path/to/bare/git/repo -type d | xargs chmod g+s

Musings about going from Eclipse to Android Studio 0.3.7

So, the first time around when Android Studio was announced I was pretty excited. Seeing that something tightly connected to Android in the shape of a Google pushed IDE, well that should bring a lot of nice things!
But alas, after a few hours of tinkering and trying to import projects exported from Eclipse by following the it’s-supposed-to-be-this-easy guides, I gave up. Too many issues with importing my projects and also, not having really used IntelliJ and even less Gradle, it was just too many issues at hand to keep track of that I chose to postpone.
So, here we are, version 0.3.7 later and I must say it seems a lot more straight forward (in most cases).

¤ One thing that I really have to stress is Android Studios way of not helping out how to import projects based on bare Android source code. The guides talk a whole lot about Maven and Gradle, but it took me actually testing out an import where I ignored all those keywords and reading the IntelliJ documentation on importing code, to be able to deduce that yes, it is possible to import bare Android code.
Really, this should have been much more clearly stated/supported because now, there is no clear way at all whether this kind of import is supported or not.

¤ Another thing. In Eclipse it was possible to mark projects as libraries and then chain the dependencies in a way that your project can reference a library that in turn references another library. With Android Studio it seems that your project has to refer to all the libraries it needs, in effect not being able to chain the dependencies.

¤ Oh, a third thing. It seems like the terminology “project” in Android Studio is an umbrella for keeping track of one or more “modules”. The Eclipse “projects” seem to map to “modules” in Android Studio and I guess Android Studios “projects” are most likely “workspaces” in Eclipse.

Windows 7 64-bit + Java jre 7 != Körbar Android SDK Manager

Satt och klurade lite på varför Android SDK Managern vägrade starta. Lite ostrukturerat googlande gav tills lut denna StackOverflow-frågan: http://stackoverflow.com/questions/5199811/android-sdk-manager-wont-open

Kortfattat: Det kan finnas flera java.exe-binärer som innebär att fel binär kopplas till Android SDK Managern. Om man ser till att ens PATH innehåller sökvägen till mappen där jre 7-java-binären ligger, samt att sökvägen finns _innan_ sökvägen till \windows\system32, så borde det lösa sig. Ta gärna och kolla vad kommandot “where java” spottar ur sig.

Avgör om du kör 32 eller 64 bitars *buntu

Satt på jobbet och försökte ta reda på hur man tar fram om man kör 32 eller 64 bitars Ubuntu. En snabb sökning senare avslöjade kommandot

file /sbin/init

setTag, getTag sitting in a tree…

Jag knåpar ihop en app som ska hålla koll på antalet slag man gör under en Frisbeegolf-runda och ganska oundvikligt hamnade jag i arbetet med att lägga till och ta bort View:s dynamiskt. Dessutom behövde jag på något sätt sitta och klura ut hur layouten av dessa View:s skulle se ut, vilket obönhörligen gjorde att jag snabbt kom i kontakt med getTag och setTag tillsammans med LayoutParameters.

En liten kodsnippet på hur det kan se ut

TextView textScore = new TextView(this);
textScore.setText("" +currScore.getScore());
textScore.setId(3);
RelativeLayout.LayoutParams paramsScore = new RelativeLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
paramsScore.addRule(RelativeLayout.BELOW, textPlayer.getId());
row.addView(textScore, paramsScore);

Enkelt förklarat kommer denna kod att lägga till en View relativt positionerat under View:n textPlayer. Guld och gröna skogar, men vad man måste se till att hålla reda på är att setTag inte gillar att man använder id:t 0, som i setTag(0), för då kommer den View man vill positionera relativt att inte hamna just relativt till något annat än, så vitt jag kan förstå, till föräldern.

Alltså, se till att använda setTag med 1-indexering: setTag(1), setTag(2), …!

Android NoClassDefFound komma-ihåg

Denna bara måste jag lägga in i dataminnet för att se till att jag inte måste leta upp den igen: http://android.foxykeep.com/dev/how-to-fix-the-classdefnotfounderror-with-adt-17

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.

Server-drift-kom-ihåg #1

# Ta reda på vilken användare [något] kör som i Debian
 ps aux | grep [något]
# Visa vilka användare som finns
 cat /etc/passwd
# Visa vilka grupper som finns
 groups
# Lägg till en användare i en grupp
 usermod -a -G [grupp] [användare] //Glöm inte att logga ut/in om du ändrar detta på den användare du just nu är inloggad som
# Visa vilka grupper en användare ingår i
 groups [användare]

Packa upp .tar.gz

Det stör mig att jag glömmer bort vilka växlar som gäller för detta

tar -xzf [fil]