Archive for september, 2010

Äppelmust

september 29, 2010

För en vecka sedan skaldes fem kilo äpplen för att sedan gå ett grymt öde till mötes under kökskniven. Det hackades än den ena vägen, än den andra. Sedan stjälptes rasket ner i en damejeanne tillsammans med så mycket vatten som fick plats (ungefär 8 liter). Sen dess har damejeannen stått och bubblat lite lätt och i dag var det dags att tappa upp det hela på flaskor (samt städa damejeannen).

Damejeannen med en dryg tredjedel äpple

Damejeannen med en dryg tredjedel äpple

Upptappning

Upptappningen förflöt utan större incidenter

Receptet var helt utan socker så det hela har en lite bitter smak med en tydlig äppelkaraktär. Jag funderar på att krydda en flaska med en kanelstång och vaniljstång. Fungerar det? Äpple och ingefära, är det värt att prova?

Fantastisk Filmfestival 2010

september 28, 2010

Fantastisk filmfestivals första helg gick fort och jobbet kommer nog inte tillåta några fler turer i veckan men jag fick se ett helt gäng fantastiska filmer som jag annars lätt hade missat. Årets vinjett var i sann Ed Wood-anda och bra mycket intressantare än fjolårets hästar, vid invigningen spelades en extra lång variant som lockade till ett flertal skratt.

Torsdag:

  • Scott Pilgrim vs the World – En sockersöt film om Scott Pilgrims resa mot självinsikt och den stora kärleken vars hår byter färg varannan vecka. TV-spels estetiken är tydlig, färgerna är starka och man blir glad av den.

Fredag:

  • Alien vs NinjaSushi Typhoon (ett japanskt produktionsbolag som inte har någon nedre gräns för smak och ingen övre gräns för blodmängd) ger oss ett scenario där en ninja-klan möter ett par delfinliknande utomjordingar i en djup skog. Blodigt och roligt.
  • Dragonetti – En svensk produktion om lönnmördaren Dragonetti, som säljer sin själ till djävulen (enligt FFFs program, det är lite luddigt i filmen) låter ju spännande… Men det är det inte…alls…eller ens lite. Den här filmen är dålig på så många plan, ljudet är värdelöst, den är seg, en utdragen tortyr scen, karaktärerna är osympatiska och korkade, filmen är för lång, jag somnade, och så vidare…

Lördag:

  • Mars – Det här måste vara den absolut bästa marsfilmen sedan Capricorn One. Efter ESA’s misslyckande med Beagle 2 upptäcks liv i området där sonden tros ha kraschat och både NASA och ESA skickar var sin farkost för att undersöka, ESA’s för med sig  en ny intelligent robot och NASA’s farkost bär på en trio astronauter. En väldigt rolig historia i en ganska unik tecknad stil, astronauter som inte tar sig själva på allvar, en helt ointresserad mark-kontroller, två kärlekshistorier, filmen har allt.
  • The Illusionist – Skaparen av Les triplettes de Belleville har omarbetat ett gammalt Jacques Tati manus och skapat en vacker och sorglig film om en gammal magiker som gör sitt bästa för att hålla en ung flickas tro på magi vid liv.
  • Mutant Girl Squad – Ännu en av Sushi Typhoons filmer, den är svår att beskriva i ord, men seriös är den absolut inte. En tjej för på sin 16-års dag reda på att hon är en mutant och efter en massaker i det lokala köpcentrat tas hon upp i en klan av mutanter. Först är det träning, sen är det krig som gäller.
  • El Monstro del Mar! – Ett gäng högljudda omoraliska tjejer kommer till en liten hamnstad där en rullstolsbunden man uppmanar dem att hålla sig borta från havet. En rolig monsterskräckfilm i klassisk stil som överaskar bitvis även om mycket är bekant.

Söndag:

  • Technotise, Edit & I – I framtidens Kroatien festar ungdomarna vilt och staten vill forska fram en metod att skåda in i framtiden. En ambitiös animerad film som blandar klassisk animering med 3d på ett mycket snyggt sätt, stadslandskapet är detljerat men samtidigt tydligt teknat. Handlingen är inte riktigt rätt fram och det tar ett tag innan något händer, men känslan är väldigt lik den i Aeon Flux-serien. (Vilket är positivt)
  • Phasma ex Machina – En mycket välgjord film i klassiskt skräck-manér som överäskar trots att upplägget är bekant. Efter att ha förlorat sina föräldrar i en bilolycka hoppar Cody av universitetet och spänderar sina dagar på att konstruera en maskin för att kunna träffa sina föräldrar som spöken.
  • Machotaildrop – En ung skejtares dröm går i uppfyllelse när han blir antagen som skateboard-atlet hos skateboardföretaget Machotaildrop. Dock visar sig allt inte vara guld och gröna skogar, bizzara levnadsförhållanden, rivaliteter och ett vilt skateboard-gäng förmörkar det hela. Största problemet med den här filmen var att huvudpersonen hade för lite med handlingen att göra.

Alla filmer var sevärda förutom Dragonetti som jag rekommenderar hela världens befolkning att hålla sig borta ifrån. Festivalen var som vanligt fantastisk och ett stort tack till alla som gör detta möjligt!

Pong på 200 rader

september 16, 2010

I våras satte en kollega igång med att koda ”lunar lander” och jag tänkte att något sådant vore ju kul att prova på. Men jag satte ribban lite lägre och siktade på Pong.

Pong är ett arkadspel som  från början tillverkades av Atari där två platta ”rackets” (eller direkt översatt paddlar) slår en boll (läs kvadrat) fram och tillbaka över skärmen i ett försök att få motståndaren att släppa förbi bollen. Givetvis är detta en typ av elektronisk pingis, det borde vara uppenbart för alla.

Jag skrev det hela med hjälp av python och bibliotekt pygame. Jag har försökt att vara strukturerad och utnyttja den objektorienterade naturen i python men det kan ha blivit lite rörigt trots mina goda avsikter.

Min implementation av Pong

Min implementation av Pong

import os, sys
import time, random
import pygame
from pygame.locals import *

class game:
  scoreP1 = 0
  scoreP2 = 0
  hold = 30
  def __init__(self):
    self.disp = pygame.display.set_mode((640,480))
    pygame.display.set_caption('Pong')
    pygame.mouse.set_visible(0)
    self.font = pygame.font.Font(None,40)
    self.screen = pygame.Surface(self.disp.get_size())
    self.screen = self.screen.convert()
    self.screen.fill((0,0,0))
    self.disp.blit(self.screen, (0,0))
    pygame.display.flip()
    self.disp.blit(self.screen, (0,0))
    pygame.display.flip()
    self.b = ball(self.disp)
    self.p1 = paddle(self.disp)
    self.p1.setpos((10, self.screen.get_height() / 2))
    self.p2 = paddle(self.disp)
    self.p2.setpos((self.screen.get_width() - 20, self.screen.get_height() / 2))
  def drawScore(self):
    self.tP1 = self.font.render(str(self.scoreP1), 1 , (255, 255, 255))
    scoreP1pos = self.tP1.get_rect(centerx= 200)
    self.disp.blit(self.tP1, scoreP1pos)
    self.tP2 = self.font.render(str(self.scoreP2), 1 , (255, 255, 255))
    scoreP2pos = self.tP2.get_rect(centerx=self.screen.get_width() - 200)
    self.disp.blit(self.tP2, scoreP2pos)
  def play(self, keys):
    if "P1_UP" in keys:
      self.p1.move(-5)
    if "P1_DOWN" in keys:
      self.p1.move(5)
    if "P2_UP" in keys:
      self.p2.move(-5)
    if "P2_DOWN" in keys:
      self.p2.move(5)
    if self.hold > 0:
      self.hold = self.hold - 1
    else:
      self.b.move()
    self.disp.blit(self.screen, (0,0))
    self.p1.draw()
    self.p2.draw()
    self.cRes = self.b.detectCollision()
    if self.cRes != 0:
      if self.cRes == 1:
        self.scoreP2 = self.scoreP2 + 1
      if self.cRes == 2:
        self.scoreP1 = self.scoreP1 + 1
      self.b.reset()
      self.hold = 30

    self.b.draw()
    self.drawScore()
    pygame.display.flip()

class GameObject:
  x = 0
  y = 0
  size = 0
  def __init__(self, screen):
    self.world = screen
  def gfxInit(self,size):
    self.gfx = pygame.Surface(size)
    self.gfx = self.gfx.convert()
  def setpos(self, coordinates):
    if len(coordinates) == 2:
      self.x = coordinates[0]
      self.y = coordinates[1]
  def getpos(self):
    return (self.x, self.y)
  def draw(self):
    self.world.blit(self.gfx, (self.x, self.y), self.gfx.get_rect())

class ball(GameObject):
  def __init__(self, screen):
    self.world = screen
    self.gfxInit((12,12))
    self.gfx.fill((255,255,255))
    self.reset()
  def reset(self):
    self.x = int(self.world.get_width() / 2)
    self.y = int(self.world.get_height() / 2)
    self.bounce = 0
    self.speed = 1
    #set initial directions
    self.dirY = random.choice([-1, 1])
    self.dirX = random.choice([-1, 1])
  def move(self):
    self.x = int(self.x + (5 * self.speed * self.dirX))
    self.y = int(self.y + (5 * self.speed * self.dirY))

  def detectCollision(self):
    #collision with top or bottom wall
    if (self.y < 5) or (self.y > self.world.get_height()-15):
      self.dirY = self.dirY * -1
      return 0
    #collision with "goal" area
    if self.x < 5:
      return 1
    elif self.x > (self.world.get_width() - 15):
      return 2
    #collision with paddle
    else:
      if (self.world.get_at((self.x-1, self.y +  0))[0] == 255) \
      or (self.world.get_at((self.x-1, self.y + 12))[0] == 255) \
      or (self.world.get_at((self.x + 13, self.y +  0))[0] == 255) \
      or (self.world.get_at((self.x + 13, self.y + 12))[0] == 255):
        self.dirX = self.dirX * -1
        #increase speed every tenth paddle bounce
        if self.bounce >= 11:
          self.speed = self.speed + 0.2
          self.bounce = 0
        else:
          self.bounce = self.bounce + 1
    return 0

class paddle(GameObject):
  def __init__(self, screen):
    self.world = screen
    self.gfxInit((12, 80))
    self.gfx.fill((255,255,255))
    self.size = 80
  def move(self, distance):
    self.y += distance
    if self.y < 0:
      self.y = 0
    if self.y > (self.world.get_height() - self.size):
      self.y = (self.world.get_height() - self.size)
if not pygame.font:
  print "Font not available"
if not pygame.mixer:
  print "Mixer not available"

pygame.init()

random.seed(time.time())
quit = False
pong = game()
keyList = []
tOld =  time.time()
tCurr = time.time()
#Main game loop
while quit != True:
  while (tCurr - tOld) < 0.012:
    time.sleep(0.001)
    tCurr = time.time()

  tOld = tCurr
  for event in pygame.event.get():
    if event.type == QUIT:
      quit = True
      break
    elif event.type == KEYDOWN:
      if event.key == K_ESCAPE:
        quit = True
        break
      if event.key == K_UP:
        keyList.append('P2_UP')
      if event.key == K_DOWN:
        keyList.append('P2_DOWN')
      if event.key == K_w:
        keyList.append('P1_UP')
      if event.key == K_s:
        keyList.append('P1_DOWN')
    elif event.type == KEYUP:
      if event.key == K_UP:
        keyList.remove('P2_UP')
      if event.key == K_DOWN:

        keyList.remove('P2_DOWN')
      if event.key == K_w:
        keyList.remove('P1_UP')
      if event.key == K_s:
        keyList.remove('P1_DOWN')
  pong.play(keyList)

  tCurr = time.time()

Min variant saknar dock för tillfället funktionen som gör att bollens vinkel ändras beroende på var på paddeln den träffar. För att använda koden här ovan krävs att pygame installeras. pygame används för att hantera grafik och tangentbordtryckningar. I övrigt har jag försökt arbeta med objektorienterade metoder så gott det går. GameObject är grundklassen för objekten paddle och ball som hanterar respektive objekt. game-klassen initierar all grafik och alla objekt, paddlar skapas för de båda spelarna (p1 och p2) och bollen (b) placeras i centrum av planen. game’s funktion play hanterar uppdateringar av poäng, uppdateringar av skärmen samt flyttar på objekten.

Huvudloopen ligger i toppnivå i botten av filen (logiskt….kanske inte), den hanterar all timing och registrerar knapptryckningar och kallar periodiskt på play-funktionen för att uppdatera spelplanen.

Ifall någon vill ha pygame förklarat i mer detalj kan jag tänka mig att göra ett mer detaljerat inlägg.

Fluga

september 8, 2010
Motivet är en bit av ritningen för en av Apollo-kapselns kontrollpaneler

Motivet är en bit av ritningen för en av Apollo-kapselns kontrollpaneler

The Doctor: Bow Ties are cool

Tysklandsbiten

september 5, 2010

Tysklandsbiten innefattar alla möjliga komponenter, (i omvänd alfabetisk ordning:) umebor, tvätt, en ensam trainspotter (sorterad efter trainspotter), festival, Berlin.

Resan till Tyskland började av helt naturliga skäl inte i Tyskland, däremot började den i Lund. Men min berättelse om denna resa över hav och genom skogar har sitt avstamp i Umeå. Från Umeå skulle vi flyga till Helsingborg med bagage som bland annat innehöll en Commodore 64. Det är uppenbarligen inte tänkt att man ska flyga den här sträckan den här tiden på året för den innebar en transfertid på Arlanda på minst åtta timmar. Vi landade på Arlanda tidigt på morgonen och tog oss en tupplur i Skycity innan vi åkte in till Stockholm för att spendera dagen i regnet. Här någonstans viskade en liten paranoia-demon i mitt inre öra: ”Det är lång tid att köra bagage fel på”. Men min vana trogen viftade jag bort den lilla gyllengröna demonen och hade trevligt (fortfarande i regnet). Kvällen kom, vi åkte till Arlanda, flög till Ängelholm/Helsingborg-flygplats, väntade in bagaget…och vääntade…och vääääntade. Till slut uppdagades det att en bagagevagn hade kört vilse på Arlanda och levererat ett lass bagage till fel plan. Detta hade inte varit något direkt att oroa sig för ifall det inte var så att tåget till tyskland skulle gå kvällen dagen där på.

På tisdagen väntade vi spänt på att våra tillhörigheter skulle levereras i tid enligt löfte och jag passade på att gå till en frisör, besöka biblioteket och teckna nytt el-avtal. Klockan två kom en budbil med vårt bagage och var imponerad över min välvårdade nyklippta uppsyn. Detta var inte strikt sant eftersom jag satt kvar hos frisören när budet kom och lämnade bagaget men jag är säker på att han hade varit imponerad ifall han sett mig.

På kvällen åkte vi till Lund i god tid, åt middag, handlade färdkost och hoppade på tåget. Vi delade kupé med ett gäng från Holland (varav en var från Brazilien) och en ensamresande tysk. Vi började prata med den ensamresande tysken som visade vara en riktig trainspotter med egen hemsida och allt.

Tåget på färjan

Tåget på färjan

Tåget lämnade av oss på en modern tågstation, som enligt alla skyltar vi såg, låg i Berlin. Vi försåg oss med kartor, biljetter till lokaltrafiken och en vag aning om åt vilket håll vi skulle ta oss och begav oss på jakt efter vårt vandrarhem Green Eggs and Ham. Green Eggs and Ham är inget vanligt vandrarhem utan har bara en eller två-sängs-rum i en lägenhet i en gammal byggnad och framför allt drivs det av det mysiga paret Dirk und Nino. Efter vi checkat in tog vi oss en tupplur innan vi gav oss ut i staden.

Green Eggs and Ham

Green Eggs and Ham

I staden turistade vi rätt hektiskt första dagen och gick förbi The Berlin Wall Memorial och East side Gallery, på kvällen åkte vi till Kreuzberg och gick och tittade på hus och människor. Kreuzberg verkar vara en riktig blandgryta med folk från olika bakgrunder och det finns mycket restauranger och pubbar här av olika karaktär. Här och var satt posters för olika händelser och nysläppta skivor, bland annat Gustav – Verlass die Stadt fastnade hos mig. Likt resten av Berlin är det en salig blandning av gammal och ny arkitektur och en och samma byggnad kan ha fasader av olika karaktär. Dag nummer två gick jag vilse i närområdet kring vandrarhemmet men lyckades hitta till en stor skivbutik och lyckades hitta gustavs skiva.

East side gallery

East side gallery

Brandenburg Tor

Brandenburg Tor

Vardag i Kreutzberg

Vardag i Kreutzberg

Tvättdag?

Tvättdag?

Dag tre åkte vi tåget västerut mot Hildesheim och M’era Luna. En festival för alla sorters Gothare (och andra som mig) som äger rum ute på en flygplats. Det första problemet vi råkade på när vi kom fram var att vi blev ansvariga för att ordna ett område att sätta upp fyra tält samt ett partytält (eller paviljong som det heter på tyska). Vi insåg snart att vi var på tok för sent ute och alla gräsytor var upptagna, men lyckades efter ett par kilometers vandring muta in ett alldeles för litet område. Mitt resesällskap visade sig dock vara en makalös förhandlare och lyckades byta till oss ett område som var mycket större (där vi nätt och jämt fick plats). Vårt Camp bestod av oss och tre tält innehållandes ett gäng från Umeå som trotsat älgar, hav och autobahn för att åka på denna festival. Blandningen var lyckad även om man kände sig lite underklädd då och då. Och diskussionerna som uppstod lärde mig bland annat hur och varför kamouflage till sjöss under första världskriget ser ut. Fredagskvällen avslutades med att vi allihopa gick på disko och skuttade runt som brukligt är.

Vårt camp

Vårt camp

På lördagen började banden spela klockan 11.00 på förmiddagen och höll sedan på fram till midnatt på två scener med 20 minuters paus mellan varje akt.

Banden jag hann se var:

Sedan såg jag delar av Laibach, Feindflug och Nitzer Ebb, Nitzer Ebb var bra som vanligt men Laibach övertygade inte riktigt. Feindflug gillade jag biten jag såg men jag hörde de tappade mot mitten av showen.

Editors var det band jag uppskattade mest, de var fantastiskt skickliga och hade finfin scennärvaro. Och sedan bröt det väldigt mot det jag sett tidigare under festivalen genom att vara ”poppigt”, mångfacetterat och glatt trots de delvis mörka texterna. The Other var också kul att se, Horror Punk (eller nått sånt) som drog fram de tre punkarna (läderjacka, anarki-A och tuppkam, det klassiska ni vet). Sisters of Mercy var också bra men förhoppningarna var högre. De flesta band jag såg var självklart bra men dessa är de som var nämnvärde. Vissa band spelningar led av den korta sound-check tiden, volymen kunde vara för låg eller få plötsliga spikar när ett nytt instrument användes men inga katastrofala problem uppstod.

Jag har den distinkta känslan av att jag glömt en eller två akter jag såg, ifall jag kommer på någon så uppdaterar jag listan.