onsdag 5 juni 2013

Mercurial-server och hgweb i Ubuntu Server

Jag installerade Mercurial Server på jobbet. En programvara för att administrera rättigheter och repon till Mercurial. När jag ändå hade det färskt tänkte jag passa på att posta det här.

Jag utgår från att man redan har en färdiginstallerad maskin med Ubuntu Server. Maskinen som jag installerade detta på körde Ubuntu Server 11, men proceduren borde vara precis samma på nyare versioner.

1. Börjar med att se till att alla paket är uppdaterade.
sudo apt-get update
sudo apt-get upgrade

2. Installera mercurial-server och apache2
sudo apt-get install mercurial-server apache2

3. Skapa hgweb.config
sudo nano /var/lib/mercurial-server/repos/hgweb.config

Lägg till följande text i filen:
[collections]
/var/lib/mercurial-server/repos/ = /var/lib/mercurial-server/repos/

4. Skapa index.cgi och folderstruktur
sudo mkdir /var/www/cgi-hg
sudo cp /usr/share/doc/mercurial-common/examples/hgweb.cgi /var/www/cgi-hg/index.cgi

5. Redigera index.cgi
sudo nano /var/www/cgi-hg/index.cgi

Ändra följande rad från:
config = "/path/to/repo/or/config"

till:
config = "/var/lib/mercurial-server/repos/hgweb.config"

6. Lägg till en root-användare för mercurial-server
Kopiera din publika SSH-nyckel till /etc/mercurial-server/keys/root/

Om du behöver skapa en SSH-nyckel kan detta göras med putty-keygen från Windows.
I unixoperativ kan man använda ssh-keygen kommandot.

Efter att SSH-nyckeln blivit tillagd behöver mercurial-server uppdateras för att hitta nya användare.
sudo -u hg /usr/share/mercurial-server/refresh-auth

7. Lägg till fler användare
Börja med att klona ut hgadmin-mappen från servern
clone ssh://hg@your-server/hgadmin

I din utklonade mapp ska du nu skapa följande undermappar:
keys
keys/root
keys/users

För att skapa en användare gör du en ny mapp med användarens namn, du lägger sedan hans SSH-nyckel i denna mappen. Slutligen lägger du detta i antingen root eller users och pushar tillbaka ändringarna.

Exempelvis
keys/root/enAdmin/publikNyckel
keys/users/SvenH/publikNyckel

Om du behöver ta bort en användare så tar du bort hans mapp och pushar in ändringen.

8. Konfigurera Apache

Vi börjar med att skapa en virtuell host åt Apache för att peka ut mercurial-repon.

sudo nano /etc/apache2/sites-available/default
Lägg till följande i botten av filen men ovanför taggen.
Alias /hg /var/www/cgi-hg

DirectoryIndex index.cgi
AddHandler cgi-script .cgi
Options ExecCGI
Order allow,deny
Allow from all


Slutligen, ge Apache access till hg-mapparna
sudo chown www-data:www-data -R /var/lib/mercurial-server/repos

Källor
Mercurial-server http://dev.lshift.net/paul/mercurial-server/docbook.html
Apache Configuration http://redline6561.livejournal.com/362393.html

måndag 27 maj 2013

Failed to add service – already in use

När jag försökte starta en OpenGL-applikation (minecraft) i Raspbian (Debian) på min Raspberry Pi möttes jag av felmeddelandet:
Failed to add service – already in use

Problemet berodde på att jag hade gett grafikdelen för lite minne, något som ställde till problem även om jag körde med X-forwarding.

Lösningen? Kör sudo raspi-config, gå in på 8 Advanced Options och där efter A3 Memory Split. Ställ upp mängden GPU-minne (jag valde 128MB), spara och starta om.

Problem med locale i debian och ubuntu

Jag hade problem både på Ubuntu server och Debian (Raspian) att locale krånglade och spottade felmeddelanden som exempelvis "locale: Cannot Set LC_ALL to default locale: No such file or directory.".

Vanliga tips är att köra locale-gen, update-locale eller att köra dpkg-reconfigure locales. Om man kör via ssh bör man se till att den maskin man kör ssh-klienten på använder locales som finns i den maskin som kör ssh-servern. Tyvärr löste inget av detta mitt problem.

Lösningen var att manuellt redigera filen /etc/default/locale .
Min fil såg ut så här först:
# File generated by update-locale
LANG=en_US.UTF-8

Efter mina ändringar såg den ut så här:
LANG=en_US.UTF-8
LC_ALL="en_US.UTF-8"
LANGUAGE="en_UTF.UTF-8"

Efter jag sparat filen, loggade jag ut och loggade in igen. Nu fungerar locales ordentligt!

måndag 1 april 2013

Wireshark under OSX 10.8 Mountain Lion

Wireshark kräver X11 för att köras under OSX. I och med OSX 10.8 ingår inte längre X11 och Apple hänvisar användare till xquartz.

När jag försökte köra Wireshark tillsammans med Xquartz märkte jag att inga fönster öppnas även om programmet visas som det är startat. En workaround är att starta Xquartz, öppna en Xterm i Xquartz och sedan köra följande:
open /Applications/Wireshark.app/

Nu kommer Wireshark att starta upp normalt.

tisdag 5 februari 2013

Rensa sökcache i Windows

Om indexering är aktiverat i Windows 7 kommer det att skapas det cachefiler, Windows.edb samt tillhörande *.ci-filer. Antalet filer och utförda sökningar påverkar cachestorleken.

I min utvecklingsdator där jag regelbundet söker i källkod och har ett stort antal filer är cachestrukturen över 5GB stor. Då maskinen har en liten SSD var det dags att utföra en rensning.

Öppna kontrollpanelen, gå till Indexing Options. Tryck på modify-knappen, bocka ur samtliga platser.
Tryck där efter på Advanced-knappen, tryck där efter på Rebuild. Nu kommer Windows att rensa all cache.

Om du behöver cache, gå tillbaka till indexing options, lägg till de platser du behöver. Nu kan du antingen välja att göra en rebuild igen för att låta cachen återskapas direkt eller trycka close och låta cachen skapas vid behov.

Även om alla platser är urbockade kommer indexeringen inte bli helt inaktiverad. Vill du inaktivera indexeringen gör du så här:
Gå till Control Panel -> Administrative tools -> Services.
Dubbelklicka på Windows Search, välj disabled och tryck där efter på stop.

Om du däremot bara vill stänga av indexering för en specifik hårddisk går även detta att göra. Öppna My Computer, högerklicka på en hårddisk, välj properties. Bocka sedan ur rutan
"Allow files on this drive to have contents indexed in addition to file properties".


onsdag 23 januari 2013

GPU-prestanda Xbox 360 och Playstation 3

I föregående post gick jag igenom beräkningsprestanda i Playstation 3 och Xbox 360. Jag snuddade även vid att GPUn i Xbox 360 går att använda för GPGPU-beräkningar. I detta inlägg tänkte jag jämföra de två grafiklösningarna som används i Playstation 3 och Xbox 360.

Xenos som sitter i Xbox 360 är en modern typ av GPU med unified shaders och GPGPU-funktionalitet. Det går alltså att utföra annat än grafikberäkningar och prestandan påverkas inte av fördelningen mellan pixel- och vertexshaders i spel.

Xenos är föregångaren till R600, det vill säga Radeon 2900-/2600-/2400-serien.
En markant skillnad är hur ration mellan shaders, texture mapping units och ROPs ser ut.

Xenos: 6:2:1
2400: 10:1:1
2600: 30:2:1
2900: 20:1:1

Xenos har alltså förhållandevis extremt få shaders och ganska många texture units. Detta ger en hög fillrate, men låg beräkningskapacitet.

Faktiska siffror:
Xenos: 48:16:8
2400: 40:4:4
2600: 120:8:4
2900: 320:16:16

Xenos har inget dedikerat vram utan är ansluten till en stor minnespool på 512MB som den delar med Xboxens CPU. Däremot har Xenos 10MB edram anslutet, dit den skriver delar av sin framebuffer (tiled rendering).

Edramet har också extra logik anslutet för att avlasta Xenos med anti alias, alpha compositioning och stencil buffering. Data som processas av denna logik har en bandbredd av 256GB/s vidare mot Edramet! Operationer som alpha compositioning och stencil buffering görs normalt av ROP, så räknar man in detta har Xenos ett väldigt högt antal ROPs i förhållande till shaders.

RSX som sitter i Playstation 3 är baserad på Geforce 7800. Detta är en äldre typ utan unified shaders eller GPGPU-stöd. RSX har 24st pixel shaders och 8st vertex shaders.

Till skillnad från Xenos har RSX dedikerat minne på 256MB. Bandbredden är på 22.4GB/s vilket är markant lägre än 7800GTX. RSX kan också mappa in ramminne om 256MB inte skulle räcka, då sjunker prestandan till 15GB/s läs och 10GB/s skriv.

RSX: 22.4GB/s 128bit, 1400MHz GDDR3
7600GT: 22.4GB/S 128bit, 1400MHz GDDR3
7800GS: 38.4GB/s 256bit, 1200MHz GDDR3
7800GTX: 38.4GB/s 256bit, 1200MHZ GDDR3

Även om RSX är baserad på 7800GTX är det en något bantad modell, som hamnar någonstans mellan GTX och GS om man tittar på pixel shaders, vertex shaders, texturing units och ROPs.

RSX: 24:8:24:8, 550MHz
7600GT: 12:5:12:8, 560MHz
7800GS: 16:8:16:8, 375MHz
7800GTX: 24/8/24/16, 430MHz

Ser man till förhållandet mellan dem, verkar det mer normalt än för Xenos:
RSX: 3:1:3:1
7600GT: 2.4:1:2.4:1.6
7800GS: 2:1:2:1
7800GTX: 3:1:3:2

Normaliserar vi med klockfrekvens ser vi följande:
Xenos: 132:44:132:44
7600GT: 67:28:67:45
7800GS: 60:30:60:30
7800GTX: 103:34:103:69

Men om vi jämför korten hur ser prestandan ut då?
Bandbredden är komplicerad att räkna in, eftersom Xenos bandbredd både beror på edram och det delade minnet, precis som att RSX kan mappa ram om det behövs. Därför tänker jag bara gå genom rå beräkningsprestanda.

Antal operationer per sekund:
RSX: 400GFlops, (24 pixel s. * 27ops + 8 vertex s. * 10ops) * 550MHz
Xenos: 240GFlops, 48 shaders * 10ops * 500MHz

Här är den teoretiska prestandan i RSX markant högre, men det kräver perfekt fördelning av pixel- och vertex-shaders medan Xenos behåller sitt värde oavsett fördelning. Vid en fördelning av 24/16 kommer RSX bara hantera 200GFlops exempelvis.

Antal shaderoperationer per sekund:
RSX: 75 Miljarder, (24 Pixel s. * 5 ALU + 8 vertex s. * 2 ALU) * 550MHz
Xenos 96 Miljarder, 48 * 4 ALU * 500MHz

Här gäller också perfekt fördelning för att RSX ska uppnå sina värden.

Texel fillrate
RSX: 13.2 GigaTexels, 24 texture units * 550MHz
Xenos: 8 GigaTexels, 16 texture units * 500MHz

Pixel fillrate
RSX: 4.4 Gpixels, 8 ROPs * 550MHz
Xenos: 4 Gpixels, 8 ROPs * 500MHz

Z sample rate
RSX: 8.8 GigaSamples, 2x Z-samples * 8 ROPs * 550 MHz
Xenos: 8 GigaSamples, 2x Z-samples * 8 ROPs * 500 MHz
Att ha möjlighet till två Z-samples är något som kan utnyttjas för att köra två pass över scenen som ska renderas. Första gången samplar man vad som ligger längst fram i bild, så att det som ligger bakom kan ignoreras om det är täckt.

Som vi kan se är fillrate och sample rate högre, däremot är shaderoperationer lägre. Pixel fillrate på 360 ska vara exakt matchat mot edram för att kunna utföra 4xAA vid hd-upplösningar.
http://www.beyond3d.com/content/articles/4/4

Något som siffrorna inte kan visa är att Xenos är effektivare under ojämn last, samt hur hög praktisk effektivitet grafiklösningarna faktiskt har under last.



Beräkningsprestanda i 360 och PS3

Nu är det snart dags för nästa generation av Playstation och Xbox. I och med detta väcks diskussionerna om prestanda i nuvarande generation.

En vanlig tolkning är att Playstation 3 skulle ha högre prestanda än Xbox 360, men varifrån kommer denna tolkning från och stämmer den?

Tolkningen kommer från att Cell-CPUn i PS3 har teoretisk topprestanda som ligger över den i Xbox 360.

Cellprocessorn i Playstation 3 består av en PPE, en traditionell CPU samt 7st SPU-enheter. SPU-enheterna är avsedda att effektivt kunna beräkna flyttalsoperationer och är jämförbara med vad man hittar i ett modernt grafikkort med GPGPU-funktionalitet.

Xbox 360 har en CPU, Xenon, som består av 3st PPE-enheter och inga SPU-enheter. Microsoft har gjort några mindre ändringar till Altivec-enheten i PPEn. Det nya instruktionssetet kallas VMX128 och är inte bakåtkompatibelt med Altivec.

En annan skillnad mellan PPE i Cell och Xenon är att Xenon har 1MB Cache som delas mellan kärnorna, medan Cell har 512KB cache till PPEn. Således bör enkeltrådad prestanda vara högre på Xenon, men det finns ingen praktisk anledning att köra sådan kod.

Jag roade mig med att jämföra teoretisk prestanda mellan de två. Notera att jag bara räknar med 6 SPUer eftersom den sjunde är reserverad av systemet i Playstation 3.

Flyttal, single precision
360: 3x 25.6 = 76.8 GFlops
PS3: 1x 25.6 + 6x 25.6 = 179.2 GFlops

Det är oftast här jämförelsen slutar och så säger man att PS3 är snabbast. Men låt oss fortsätta:

Flyttal, double precision
360: 3x 6.4 = 19.2 GFlops
PS3: 1x 6.4 + 6x 1.8 = 17.2 GFlops

Xbox 360 har också en modernare GPU, Xenos, denna har GPGPU-funktionalitet, till skillnad från RSX i PS3. Vi kan alltså låta Xenos göra beräkningar, om än bara i single precision.

Flyttal, single precision
360: 3x 25.6 + 240 = 316.8 GFlops
PS3: 1x 25.6 + 6x 25.6 = 179.2 GFlops

I teorin är alltså Xenon + Xenos snabbare än Cell oavsett om vi vill beräkna single- eller double precision.