Archive for October, 2007

Vecka 43: “Python förstörde mitt liv”

Denna vecka så var det sista delen av Python Tutorial som gällde och då var det dags att kika mer på bland annat klasser och standardbiblioteket. Det blev till att lära sig ett en aning annorlunda sätt att skriva objektorienterad kod på än vad man är van vid.

Det som då kom ut ur denna veckas projektarbete är ett litet program som egentligen inte har någon nytta alls utan det finns endast för att prova lite kod och objektorientering. Eftersom koden blev så pass lång så kan man hitta koden här. Det koden gör är att hämta data från en url som den sedan plockar ut ett visst antal tecken ifrån. Dessa tecken sätts sedan in i en bildfil som text.

Kodandet denna vecka har gått som det brukar, helt okej alltså. Det finns dock saker som stör ens tillvaro och det är bland annat att deras objektorientering är uppbyggd på ett mystiskt sätt som jag då inte alls kan förstå mig på. En annan sak är att man blir lite förstörd av att koda Python då man direkt glömmer bort semikolon och annat när man ska knacka kod i andra språk (som till exempel C++, C# och PHP). Men nu har både jag och Viktor klagat väldigt mycket på Python så man kanske bör plocka fram några av de positiva sakerna med det så här har vi en kort lista på det:

  • Många härliga “easy-to-use” bibliotek
  • Mysig syntax när man välj vänjer sig vid den
  • Enkelheten

Slutsatsen är då att… Enligt mig så känns Python mer lämpligt till kortare, mindre program som kanske endast ska utföra en liten uppgift och inte till större applikationer.

Sitter nu och funderar om man någonsin kommer att vänja sig vid språket och dess stil eller om man är totalt förstörd. Kanske? Kanske inte?

Objektorientering i Python

Vi skulle bland annat kika på objektorienteringen i Python den här veckan, och ja, vad kan man säga? Den känns ofullständig och ogenomtänkt. Bland annat kan du inte skapa privata medlemsvariabler eller metoder, alla ses som public. Du kan också skapa nya medlemsvariabler och metoder i redan instantierade klasser, detta är t.ex. helt giltigt och tagit ifrån dokumentationen:

1
2
3
4
5
6
7
8
9
class Employee:
    pass
 
john = Employee() # Create an empty employee record
 
# Fill the fields of the record
john.name = 'John Doe'
john.dept = 'computer lab'
john.salary = 1000

Helt galet? Saker som polymorphyism verkar det inte heller finnas stöd för. För att klaga ytterligare lite mer på objektorienteringen i Python så kan jag säga att varje gång du deklarerar en metod i en klassdefinition, måste du ange self som första parameter. Varför man måste göra det kommer det säkerligen en förklaring till lite senare, när man har kommit in i objektorienteringen lite mera.

Nåväl, här kommer veckans program:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#! /usr/bin/python
# -*- coding: iso-8859-1 -*-
 
class Animal:
        sound = ""
        def makeSound(self):
                print self.sound
 
class Dog(Animal):
        sound = "Woof!"
 
class Cat(Animal):
        sound = "Meow!"
 
a = [Animal(), Dog(), Cat()]
a[0].makeSound()
a[1].makeSound()
a[2].makeSound()

To-do för de närmsta veckorna

v43: Forts. Python och syntax. Kapitel 9-11 i Python Tutorial

v44: Läsa på Djangos konfiguration; få det att fungera klockrent (kunna skapa projekt och så)

v45: Mjukstart med Django: Börja lite lätt med enkla projekt

Vecka 42: “Älskling, var är mina klammerparenteser?”

Ännu en projektarbetesvecka har gått förbi och denna vecka har det handlat om att få sig en inblick i grundläggande Python. Det som har behandlats är bland annat:

  • Flödeskontroll
  • Datastrukturer
  • Felhantering

Kikade en sväng på Viktors program och skrev ihop en egen version som kort sammanfattar det vi lärt oss denna vecka.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
def GetFileInfo(Filename):
	FileInfo = {'Name': '', 'Lines': 0, 'Chars': 0}
	FileIsOpen = False
 
	try:
		File = open(Filename, 'r')
		FileIsOpen = True
 
	except IOError:
		print 'Could not open file.'
		FileIsOpen = False
 
	if FileIsOpen:
		FileInfo['Name'] = Filename
 
		for Line in File:
			FileInfo['Lines'] += 1
			FileInfo['Chars'] += len(Line)
 
		File.close()
 
	return FileInfo
 
SomeFileInfo = GetFileInfo('textfil.txt')

Nu när man väl kommit in lite i språket så känns det väl helt ok men nu märks det väl att man är förstörd från språk som C++ där man har klammerparenteser som man använder för att styra början och slut av kodblock samt en del annat. Känns även som om man har en avsaknad av kontroll när man arbetar i Python. Detta beror på att det finns färdigskriven kod till det mesta, vilket på sätt och vis är bra, men kodkontrollfreak som man är så vill man veta vad som sker. Nåväl, bara att bita ihop och hoppas att man vänjer sig vid detta galenskap.

Viktors v42

Nu har då första “Pythonveckan” i stort sett passerat, och ja, vad kan man säga? Python börjar kännas mer och mer förståeligt för var dag som går, och jag börjar bli mer och mer van den lite skumma syntaxen. Saker jag stör mig på är:

  • INGA SEMIKOLON?!
  • INGA CURLY BRACES?! :(
  • INGA PARENTESER?!

Annars är det väl rätt okej. Python har dock en tendens att ha sina egna varianter på allt möjligt. Istället för t.ex. “elseif” eller “else if” har de konstigt nog “elif”. Vart har de fått det ifrån?! Får hoppas att man vänjer sig iaf. ^^

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#! /usr/bin/python
# -*- coding: iso-8859-1 -*-
 
def countChars(f):
        file = open(f, 'r');
        length = 0
 
        for line in file:
                length += len(line)	
 
	f.close()
        return length
 
print 'Filen innehåller ' + str(countChars('_template.py')) + ' tecken'

Vecka 41: “Mental brainfuck”

Första riktiga projektveckan är över och mycket har gjorts. Pengar har investerats i ny hårdvara till våran server som mjukvaran ska köras på och omfattande konfigurationer samt tester har genomförts. Har spenderat delar av lördagen och söndagen med att försöka få Django att fungera korrekt och lyckades till slut få det att fungera genom att spendera en del tid på Google för att leta instruktioner om hur man skulle konfigurera webbservermjukvaran Apache för att fungera tillsammans med Python. Det som dock måste göras är att fixa så att fler än ett projekt (varje sida i Django är ett projekt) kan köras genom Apache automatiskt. Detta måste fungera smidigt för att undvika att vi spenderar onödig tid på att för varje nytt projekt måsta skriva i en konfigurationsfil.

Denna helg har varit mycket av just “Mental brainfuck” för min del då konfigurationen visade sig vara betydligt mycket svårare än väntat samt att tanken lätt glidit iväg till bilkörningen som till stor del står i fokus just nu då uppkörning väntar nästa onsdag. Mot slutändan av denna dag så vände dock denna uppförsbacke då Django äntligen började fungera och jag fick en försmak av kraften hos Python kombinerat med Django. Fick dock en kort släng av förvirring då jag kikade på följande kod:

1
2
3
4
5
class Admin:
    fields = (
        (None, {'fields': ('question',)}),
        ('Date information', {'fields': ('pub_date',), 'classes': 'collapse'}),
    )

Men det klarnar förhoppningsvis med tiden.

Nästa vecka börjar inlärningen av Python och förhoppningsvis så kommer motivationen att hållas uppe.

Servern fixad!

Nu är äntligen servern fixad! Processorn hade vi sedan tidigare, men moderkort och minne fick vi inte förrän igår, detsamma gäller nätaggregatet. Först var det bara att ta ut de gamla prylarna, och in med de nya. Allting såg ut att funka hur bra som helst, tills vi upptäckte att nätaggregatet som satt i sedan tidigare var för gammalt – det saknade en 4-pinnars kontakt (kallas tydligen P4) som bara finns på lite nyare atx-moderkort. Det var bara att fara ned på Overclockers och handla ett nytt nätagg.

Efter det kom det dock nya problem – servern vägrade boota. Efter lite snabb felsökning var vi tvungna att ge upp för dagen och forsätta dagen därpå. Idag tog vi ut alla delar, och provade sedan att sätta i del för del tills samma fel uppstod igen, och felsökningen slutade då vi kopplade i cd-enheten. Detta resulterade i samma fel igen, datorn vägrade boota. Som tur var hade Rasmus en cd-enhet över som vi satte i servern, och den använder vi nu.

Total shoppinglista:

  • AMD Athlon64 3000+ 0kr
  • Asus A8N-E 250kr
  • 2x Corsair VS 512MiB DDR PC3200 250kr
  • FSP 350W 395kr

Allt som allt: 895kr

Det som är kvar att fixa nu är Django.

Serverspecifikationer

Vi har beslutat oss för att genomföra en ganska genomgående uppgradering av servern, i dagsläget är den utrustad med en Pentium III på 800MHz och 384MB SDRAM. Detta ska ersättas av en AMD Athlon64 3000+ och 1024MB DDR PC3200. Processorn och kylare har vi, men moderkort och minne har vi inte fixat ännu, dock är de på g.

På mjukvarufronten ska vi skita helt och hållet i XAMPP och istället använda Ubuntus apt-get för att installera Apache, MySQL och resten av mjukvaran vi nämnde tidigare.

För att vi ska kunna fixa mjukvarubiten krävs det dock att vi först fixar hårdvaran, och moderkort+minne kan vi tidigast få tag på imorgon (fredag), annars blir det förmodligen nästa vecka (vilket gör att schemat blir aningen försenat).

Planering för de närmsta veckorna

v40: Lägga upp projektbloggen [klart]

v41: Fixa servern:

  • Ta backup på databas och filer (htdocs, användardata)
  • Formatera och lägga in Ubuntu
  • Installera mjukvara (om vi ska använda något LAMPP-paket har vi inte bestämt ännu)
  • Återställa backuper

v42: Börja lära oss Pythonsyntax. Kapitel 1-8 i Python Tutorial
v43: Forts. Python och syntax. Kapitel 9-11 i Python Tutorial
v44: Lite mer avancerad Python, kika på databaskopplingar

Projektet tar sin början

Vi har nu börjat skissa på vårat projektarbete, och kommit fram till följande:

  • Servern ska fixas till innan nästa möte, Ubuntu ska läggas in och mjukvaran uppdateras (PHP, Apache, MySQL, Python, Django samt något versionshanteringssystem)
  • Vi ska spendera ungefär halva tiden på att lära oss Python/Django, och halva tiden på att koda själva webbsidan
  • Vi ska spendera cirka 3h i veckan på projektet, och ägna vissa helger åt det (s.k. kodarhelger)