Warning: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead in /www/webvol34/an/96qmbdpibm1sspm/danielliljeberg.se/public_html/blog/wp-content/mu-plugins/gkphp.php on line 1
Archive for juni, 2010 « Daniel Liljeberg

Arkiv för juni, 2010

Warning: Use of undefined constant archives - assumed 'archives' (this will throw an Error in a future version of PHP) in /www/webvol34/an/96qmbdpibm1sspm/danielliljeberg.se/public_html/blog/wp-content/themes/cordobo-green-park-2/archive.php on line 32

Warning: Use of undefined constant page - assumed 'page' (this will throw an Error in a future version of PHP) in /www/webvol34/an/96qmbdpibm1sspm/danielliljeberg.se/public_html/blog/wp-content/themes/cordobo-green-park-2/archive.php on line 32

Warning: A non-numeric value encountered in /www/webvol34/an/96qmbdpibm1sspm/danielliljeberg.se/public_html/blog/wp-content/themes/cordobo-green-park-2/archive.php on line 32

Warning: A non-numeric value encountered in /www/webvol34/an/96qmbdpibm1sspm/danielliljeberg.se/public_html/blog/wp-content/themes/cordobo-green-park-2/archive.php on line 32
class="post-105 post type-post status-publish format-standard hentry category-php">

Lägg till border runt bild i PHP

11 juni, 2010

Fick en fråga häromdagen om hur man kan skapa en border runt en bild i PHP. Slängde ihop en liten kodsnutt som som jag tänkte dela med mig av här.

/** Function to create a border around an image*/function drawBorder($image_name, $r = 0, $g = 0, $b = 0, $thickness = 1){  $image = ImageCreateFromJPEG($image_name);  $color = ImageColorAllocate($img, $r, $g, $b);  $x1 = 0;  $y1 = 0;  $x2 = ImageSX($image) - 1;  $y2 = ImageSY($image) - 1;  for($i = 0; $i < $thickness; $i++)  {    ImageRectangle($image, $x1++, $y1++, $x2--, $y2--, $color);  }  return $image;}

Sedan kan du köra något i stil med

header('Content-type: image/jpeg');ImageJPEG(drawBorder("images/foo.jpg", 128, 128, 0, 3));

Bör förmodligen lägga till en switch-sats i funktionen som faktiskt kollar vilken typ av bild du använder dig av och använder sig av rätt ImageCreateFrom* funktion på bilden i fråga och lite exception handling. Men här har ni en grund.

Flattr this!

Warning: Use of undefined constant archives - assumed 'archives' (this will throw an Error in a future version of PHP) in /www/webvol34/an/96qmbdpibm1sspm/danielliljeberg.se/public_html/blog/wp-content/themes/cordobo-green-park-2/archive.php on line 32

Warning: Use of undefined constant page - assumed 'page' (this will throw an Error in a future version of PHP) in /www/webvol34/an/96qmbdpibm1sspm/danielliljeberg.se/public_html/blog/wp-content/themes/cordobo-green-park-2/archive.php on line 32

Warning: A non-numeric value encountered in /www/webvol34/an/96qmbdpibm1sspm/danielliljeberg.se/public_html/blog/wp-content/themes/cordobo-green-park-2/archive.php on line 32

Warning: A non-numeric value encountered in /www/webvol34/an/96qmbdpibm1sspm/danielliljeberg.se/public_html/blog/wp-content/themes/cordobo-green-park-2/archive.php on line 32
class="post-70 post type-post status-publish format-standard hentry category-okategoriserade">

Frilansare – En handelsvara eller ett jobb?

10 juni, 2010

Idag är det många som extraknäcker som frilansare eller som som sin huvudsakliga sysselsättning jobbar som självständig konsult eller frilansare. Det faktum att det är många som i olika omfattning jobbar som frilansare bidrar till att det finns ett brett spektrum av människor som är aktiva. Allt ifrån unga studenter som vill dryga ut kassan lite till erfarna utvecklare som jobbat på och med kritiska applikationer på professionell nivå i flera år. Mycket av resonemanget här passar in på frilansare i många olika branscher, men jag hämtar mina erfarenheter mestadels från IT branschen.

Ett populärt ställe för dessa personer att söka uppdrag är på diverse siter inriktade på att förmedla kontakter mellan frilansare och projektbeställare. Flertalet av dessa fungerar som så att en projektbeställare lägger upp en beskrivning av projektet och frilansare sedan “budar”, d.v.s. presenterar sina priser för att lösa projektet. Ett annat populärt upplägg är när projektbeställaren på förväg anger en budget och de frilansare som vill ta sig an jobbet måste rätta sig efter detta. Något som dock blivit uppenbart när jag själv varit i kontakt med denna typ av siter är prisnivåerna som ofta är förvånansvärt låga. Även om en projektbeställare ber om en komplett webbaserad lagerlösning som i runda slängar hade tagit två manmånader att utveckla så ligger kanske budgeten för projektet på 20.000-40.000kr, ibland ännu lägre. Samma tidåtgång från en större konsultfirma hade haft en nota på runt 250.000-300.000kr. Då skulle man kunna tänka att alla frilansare hade rynkat på näsan och undrat i vilken verklighet projektbeställaren levde och låta denna själv få förstå detta då ingen visade intresse i projektet. Men så är inte fallet, utan mot allt sunt förnuft så är det ofta massor med bud om att göra projekten för dessa låga ersättningar och ibland ännu lägre. Varför skulle någon vilja gå ännu lägre då? Jo, för att få projektet så klart. Samma sak återfinns även i enklare projekt där en projektbeställare kan be om en komplett Joomla site designat och utvecklad på en vecka för 1000kr. Frågorna som då blir intressanta att besvara är

  • Varför är priserna så låga?
  • Tjänar beställarna på att priserna är så låga?
  • Gynnas marknaden som helhet av det nu rådande läget?

Varför anser jag att priserna är låga?

Låt oss utgå ifrån ett exempel ifrån verkligheten:
En projektbeställare vill ha en site till sitt nystartade företag. Siten skall designas och kodas för 5000kr. Siten skall bestå av en framsida och fyra undersidor.

Om vi utgår ifrån att en person sköter både design och kodning för att få det så billigt som möjligt så är ett rätt normalt tillvägagångssätt att man gör en design ide som kunden får se. Detta kan ske på papper eller som en bildfil i datorn. Om kunden vill ha ändringar så iterarar man här tills kunden är nöjd. När kunden godkänner designen så för man över den till HTML och CSS. Efter att detta är klart så börjar man koda funktionalitet i ett språk som ASP, PHP, ASP.Net och kanske en del scriptning i Javascript.

Frilansaren jobbar under förmiddagen ihop ett förslag som skickas till kunden. Kunden har några få ändringar som denne vill införa och en reviderad version skickas på eftermiddagen till kunden. Designen godkänns och dag två påbörjas jobbet med att föra över designen till HTML och CSS. Arbetet är klart strax innan lunch och kodningen av funktionaliteten påbörjas under eftermiddagen dag två. Det är inga avancerade saker som skall kodas utan bara kontaktformulär och ett enklare administrationssystem för kunden att lägga upp nyheter och bilder, kodingen av detta är avklarat vid slutet av dag tre. Dag fyra sker installation på kundens webhotel och kunden informeras om hur allt fungerar etc. Denna enkla uppgift har då tagit iaf fyra mandagar och då räknar vi med att kunden varit så precis med sin design idé att denne bara behövde nämna en mindre ändring och inte kommit på några nya ideér under resans gång. Sanningen bakom denna typ av “små” projekt är dock ofta det motsatta. Kunden kommer på designen allt eftersom och funktioner växer fram i takt med att projektet fortlöper. Men, om vi ändå tänker oss att detta projekt tog fyra mandagar så har vi en timpenning på ca 156kr, inklusive moms då kunden satt sitt totala tak på 5000kr.

Om vi räknar på denna timpenning och full beläggning med en månad ledighet under året hamnar vi på en årsvinst på 206.000kr (ex moms då detta inte påverkar din vinst) för frilansaren. Då skall man veta att hundra procent debiterbar tid är väldigt, väldigt sällsynt.

Efter skatter, egenavgifter osv hamnar vi på en årslön 122.000kr. Detta ger en månadslön, efter skatt, på 10.166kr vilket motsvarar en lön på runt 13-14.000 om man istället var anställd. Då en någorlunda erfaren webbutvecklare kan ligga runt 25-30.000kr i månadslön och systemutvecklare i andra språk ännu högre så ser man snabbt att ersättning för jobbet är på tok för liten. Vad skedde då med detta projekt? Skrattade folk åt ersättningsnivån och önskade projektbeställaren lycka till att hitta någon som ville ta sig an projektet? Nej, istället var det uppemot 70 frilansare som slogs om uppdraget. Projektet tog ju sedan naturligtvis längre tid än de estimerade fyra dagarna samt att kunden kom på ny funktionalitet under resans gång. Slutresultatet var att ersättningen för arbetet blev ännu lägre än i exemplet ovan. Det är nog rätt uppenbart för alla att detta är en orimlig ersättningsnivå för det utförda arbetet, men hur kommer det sig då att det gång på gång sker arbeten till sådana kraftiga underpriser? Varför gör frilansare med på det och tjänar projektbeställarna verkligen något på detta?

De låga priserna kan förmodligen förklaras på flera sätt. Först har vi det faktum att vi alla när vi begär in offerter på jobb i hemmet osv jagar det billigaste priset (något som inte heller alltid är det bästa alternativet som en populär tv serie tydligt har visat). Lägg då till det faktum jag nämnde innan, att frilansarna består av allt från extraknäckande studenter till professionella individer som jobbat flera år med utveckling, kanske har familj, hus och tänker på saker som sitt pensionssparande. Vem av dessa två kan erbjuda det lägsta priset? Studenten vinner nog den fajten. Studenten kan ha råd att jobba till underpris då deras utgifter ofta inte är i närheten av de som en arbetande person med familj och hus. Det lilla extra studenten tjänar på sitt frilansande är ju ändå ett stort plus i kassan för denne. Men de långsiktiga effekterna kan bli att marknaden acklimatiserar sig till dessa underpriser. Studenten kommer skjuta sig själv i foten då denna lite senare i livet själv kommer märka att ersättningen inte går att leva på. Då är det lätt att tänka att man lätt kan få mera ersättning då man nu har mera erfarenhet, men precis som för alla som idag försöker sälja sina tjänster så kommer man märka att det finns nya studenter med låga priser att matcha.

Man skulle kunna tänka sig att erfarenheten hos seniora utvecklare väger tungt hos projektbeställarna. Men om det står mellan två personer som båda lovar att de löser uppgiften och den ena säger sig göra det för 250kr/timme och den andre vill ha 800kr/timme så väljer nästan alla den som tar 250kr/timme. Något som dock visat sig med tiden är att många som nappar på “bästa priset” i slutändan får betala mycket dyrt för sitt val. Självklart finns det utvecklare som jobbar till underpris, men ändå gör ett bra jobb. Men väldigt många kunder vittnar om personer som pressat sina priser för att få uppdraget. När det väl skett så har själva samarbetet inte alls förflutit så smärtfritt som kunden först fått bilden av att det skulle göra. Kommunikationen är ofta bristfällig, leveransdatum skjuts hela tiden framåt, folk hoppar av projekten mitt i och en del lösningar är helt enkelt bara tekniskt ogenomtänkta, något som ofta beror på bristande arbetslivserfarenhet hos den som utför projektet. En mera erfaren utvecklare som pressar sitt pris för att matcha alla de låga priserna på marknaden kan också lätt få problem. Man måste planera tiden precist för att hinna pressa in så mycket jobb som möjligt för att få in tillräckligt med pengar så att det går runt. Problematiken blir då att det blir väldigt svårt för projektet att vara dynamiskt och växa med tiden då utvecklaren med stor sannolikhet måste ha parallella projekt löpande.

Vad blir då resultatet av detta i längden, tjänar någon egentligen på att en marknad acklimatiserar sig till en prisnivå som är ohållbar? Hur reagerar marknaden när vändningen kommer och frilansare inser att de måste börja ta betalt för sina tjänster, och varför finner sig frilansare i att vara en handelsvara? Kommer frilansmarknaden att tömmas på kompetent folk då de hellre tar anställningar för vettiga löner?


Flattr this!

Warning: Use of undefined constant archives - assumed 'archives' (this will throw an Error in a future version of PHP) in /www/webvol34/an/96qmbdpibm1sspm/danielliljeberg.se/public_html/blog/wp-content/themes/cordobo-green-park-2/archive.php on line 32

Warning: Use of undefined constant page - assumed 'page' (this will throw an Error in a future version of PHP) in /www/webvol34/an/96qmbdpibm1sspm/danielliljeberg.se/public_html/blog/wp-content/themes/cordobo-green-park-2/archive.php on line 32

Warning: A non-numeric value encountered in /www/webvol34/an/96qmbdpibm1sspm/danielliljeberg.se/public_html/blog/wp-content/themes/cordobo-green-park-2/archive.php on line 32

Warning: A non-numeric value encountered in /www/webvol34/an/96qmbdpibm1sspm/danielliljeberg.se/public_html/blog/wp-content/themes/cordobo-green-park-2/archive.php on line 32
class="post-94 post type-post status-publish format-standard hentry category-eclipse category-subversion">

Merge branch med trunk med Subversion och Eclipse

10 juni, 2010

Många har idag insett fördelarna med någon form av versionhantering när de utvecklar. Vare sig du använder dig av CVS, SVN, git, perforce eller något annat system så finns det mycket att tjäna på denna typ av system. Detta blir speciellt uppenbart när många personer jobbar på ett gemensamt projekt och flera olika team kanske jobbar på olika features parallellt. Här kommer vi att tala om Subversion (SVN) och konceptet branches (grenar) som existerar i de flesta versionhanteringssystem. Var branches gör är att de låter dig hantera olika versioner av din kodbas parallellt för saker som att underhålla gamla versioner, utveckling av nya features eller experimentella features som kanske aldrig blir en del av produkten. Men med branching så kommer också något som kallas merging, alltså att slå ihop ändringarna i din parallella kodbas med den ursprungliga igen. Detta görs mer eller mindre bra i olika versionhanteringssystem. Här skall jag visa hur du går tillväga om du använder SVN via Subclipse under Eclipse.

För en som aldrig gjort detta tidigare så kan det vara lite av en djungel, speciellt när man gör det från terminalen. Fram tills nydligen hade inte SVN något direkt bra stöd för det heller om man skötte ofta mergning med ett externt python script. Nu klarar dock SVN av det hela och med Subclipse kan det nästan bli riktigt enkelt även för någon som aldrig tidigare gjort en merge. Stegen är i princip identiska med de hos alla GUI’n för SVN eller om man gör det direkt i terminalen.

Merge Branch till Trunk

Låt oss säga att du haft en sprint (om ni tex kör SCRUM) eller bara är klar med en ny feature som ni utvecklat i en egen branch för att inte störa kodbasen i trunken (som ofta är bra att hålla i ett skick där det går att kompilerbar och släppa). Vad vi nu vill göra är alltså att föra in våra ändringar ifrån vår branch tillbaka till vår trunk. Vad vi nu skall göra, steg för steg, är följande.

  1. Se till att all kod i trunken är uppdaterad (vilket den normalt skall vara om folk inte arbetar mot trunken i sin dagliga utveckling, något jag avråder ifrån).
  2. Lös alla konflikter.
  3. Se till att din working copy nu är trunk, dvs ditt du skall merga till. Här blir många ofta konfunderade och tänker att de måste ju stå i den branch de vill merga in till trunk. Men tänk som så att du skall stå där dit du vill lägga in ändringarna som gjorts i någon annan branch.
  4. Välj Merge ifrån Team menyn på trunk.
  5. Som From URL pekar du på den branch du vill merga ihop med din trunk. I detta fall branch 2.65 av bar.
  6. Ändra From Revision till den senaste revisionen som mergades ihop med din trunk. Detta är då man generellt inte vill hålla på att merga hela branchhistoriken. Du vill bara köra merge på de ändringar som skett sedan du sist gjorde en merge.Jag vet inte om SVN nu har något bra system för att hålla koll på detta själv, men förut (och jag fortfarande) letar upp detta revisionsnummer genom att ditta på mina logg över commit meddelanden. Håll även detta revisionsnummer i minnet då vi kommer använda det i vårt commit message för mergen senare. I många fall, speciellt om man inte mergat fram och tillbaka som en galning, kan man komma undan med att köra HEAD:HEAD när man gör sin merge.
  7. To Revision skall oftast vara HEAD då man vill merga till och med sin sista commit.
  8. Klicka nu på Merge och låt SVN göra sitt jobb.
  9. Lös alla uppkomma konflikter.
  10. Gör en commit som inkluderar hela din merge. Ett exempel på commit message för en merge kan vara

Hoppas denna lilla snabba guide kan hjälpa några av er.

Flattr this!

Warning: Use of undefined constant archives - assumed 'archives' (this will throw an Error in a future version of PHP) in /www/webvol34/an/96qmbdpibm1sspm/danielliljeberg.se/public_html/blog/wp-content/themes/cordobo-green-park-2/archive.php on line 32

Warning: Use of undefined constant page - assumed 'page' (this will throw an Error in a future version of PHP) in /www/webvol34/an/96qmbdpibm1sspm/danielliljeberg.se/public_html/blog/wp-content/themes/cordobo-green-park-2/archive.php on line 32

Warning: A non-numeric value encountered in /www/webvol34/an/96qmbdpibm1sspm/danielliljeberg.se/public_html/blog/wp-content/themes/cordobo-green-park-2/archive.php on line 32

Warning: A non-numeric value encountered in /www/webvol34/an/96qmbdpibm1sspm/danielliljeberg.se/public_html/blog/wp-content/themes/cordobo-green-park-2/archive.php on line 32
class="post-84 post type-post status-publish format-standard hentry category-okategoriserade">

Spray hackat igen!

2 juni, 2010

Spray, en av Sveriges största portaler och communitys på internet, har hackat… för andra gången!

– Obehöriga kunde under en kort stund komma åt våra användares lösenord, säger Fredrik Pallin, presschef på företaget.

Många var vi som rynkade på ögonbrynen när Spray hackades för ett antal månader sedan. Via ett säkerhetshål hade anfallare kunnat ladda upp ett script som gjorde det möjligt att söka ut information om alla användare på Spray. Då sparades lösenorden i klartext och Spray fick stå med svansen mellan benen och skämmas lite över vad som till synes såg ut som dålig hantering av säkerheten för användarna. Det var inte första gången Spray hackades och man lovade bättring. Därför är jag än mer förvånad och i det närmaste förfärad över den till synes låga kvalitén på koden hos Spray när ytterligare ett säkerhetshål rapporterades. Denna gång har Spray iofs hashat lösenorden med SHA1, men då man får ut all information om användaren och dennes säkerhetsfråga i klartext vilket gör det rätt enkelt att ta över kontot.

Information i klartext

Gruppen “Vuxna Förbannade Hackare” har tagit på sig attacken och det är inte första gången Spray blir överbemästrade av denna grupp.
Säkerhetshålet diskuteras på Flashback, låt oss hoppas att Spray läser på lite om it-säkerhet och systemutveckling nu.

Flattr this!