Marcus Olsson

Frilansande webbutvecklare

Mobile Menu

30 september 2014 av Marcus Olsson

Vad kostar det att anlita en webbutvecklare?

Ett par, tre gånger i veckan så blir jag kontaktad av mindre företag och ibland även privatpersoner som kommer med webbprojekt som de önskar ha genomförda – vilket såklart är jätteroligt. Men ofta innehåller mailet (eller telefonsamtalet) frågan "vad kostar det?".

Det är här man ofta stöter på det första hindret – att räkna ut priser och kostnader för ett webbprojekt är inte att gå efter en lista som specificerar priser så som:

  • Nytt Wordpress-tema: 5000kr
  • Responsiv design för Wordpress-tema: 3000kr
  • Webbapplikation: 7000kr

Det vore såklart smidigt, men på både gott och ont är varje projekt unikt.

Hur jag arbetar

Jag brukar först diskutera igenom projektet noga med den blivande klienten/kunden, för att gå igenom vilka krav som finns för projektet och vilka funktioner som önskas. Detta momemtet är förmodligen en av de viktigaste punkterna under hela projektet för att få alla involverade nöjda med resultatet.

Därefter så tittar jag på kringliggande krav; vilka tekniska krav finns, kan man återanvända kod som redan finns, antingen från en befintlig webbplats, eller kanske programvaror eller moduler som finns open source? Vilken plattform är det frågan om, kommer programvaror att behöva licensieras?

Efter de här stegen har jag en rimlig uppfattning om vilken tidsåtgång det är frågan om och vilka extra kostnader som behövs för projektet, och kan därför skriva en offert.

I offerten brukar jag inkludera den faktiskt beräknade tidsåtgången, samt en "extratid" på 20%. Den extratiden är för oförutsedda händelser som kan inträffa under projektets gång, oftast att klienten ångrar sig gällande design och/eller funktioner och önskar fler korrekturomgångar.

Men faktum är att i åtta av tio projekt så används inte den extra planerade tiden.

Önskar du en prisuppskattning för ett kommande projekt?

Har du ett webbprojekt som du önskar genomföra? Du är alltid välkommen att kontakta mig för att påbörja en diskussion – inga projekt är för små eller stora.

18 september 2014 av Marcus Olsson

Snygga(re) URL:er med Jekyll och Nginx

Jekyll är nästan komplett "out of the box" – men det finns ändå en del saker som saknas, större kontroll över URL:er och bättre hantering av taggar och kategorier är några av dem.

URL:er ja – det finns det många åsikter om vad som är fel, vad som är snyggt och vad Google föredrar.

Jag föredrar permalänkar utan filändelser, och utan avslutande snedstreck ("trailing slash"). Tidigare när jag körde SecondCrack så var det inga som helst problem – då filerna t.o.m. genererades utan filändelser.

Men med Jekyll så är det lite annorlunda; man har stor frihet i hur man vill att ens permalänkar ska se ut så länge som man håller sig inom vissa ramar, t.ex (i _config.yml):

permalink: /:categories/:year/:month/:day/:title/
## /2014/09/18/snygga-urler-i-jekyll/

permalink: /:categories/:year/:month/:day/:title.html
## /2014/09/18/snygga-urler-i-jekyll.html

Detta är de två standardalternativen "pretty" respektive "date", men man kan plocka in en rad olika parametrar tecken efter tycke och smak.

Men då var det ju det att få bort både .html-ändelsen, och det avslutande sedstrecket. Vad vi är ute efter är:

## /2014/09/18/snygga-urler-i-jekyll

På Nginx gör det enklast genom att sätta permalink till pretty, sedan ändra i webbplatsens konfigurationsfil:

rewrite ^/index.html$ / permanent;
rewrite ^(/.+)/$ $1 permanent;
rewrite ^(/.+)/index.html$ $1 permanent;

location / {
	try_files $uri $uri/index.html =404;
}

Så långt är det inga konsigheter, – du kan nu besöka dina sidor utan vare sig ".html" eller "/". Men om du försöker bygga din webbplats med jekyll build nu och kollar på dina permalänkar som genereras via t.ex. {{ post.url }} i koden så ser du att du fortfarande har ett avslutande snedstreck. Trist. Detta är dessvärre någonting som man behöver plocka bort själv – enklast är förmodligen att skriva ett Liquid-filter. T.ex. så enkelt som:

module LastFilter
	def remove_last( input )
		input.chop
	end
end

Liquid::Template.register_filter(LastFilter)

Lägg i den koden i en .rb-fil i din _plugins-mapp så kan du använda filtret; {{ post.url | remove_last }} så blir du av med snedstrecket även i koden.

15 september 2014 av Marcus Olsson

Ny webb – igen!

Nästan precis 12 månader efter min senaste uppdatering av koden här på marcusolsson.me så lanserar jag återigen nytt, och ny byter jag också plattform.

Jag har i flera tidigare inlägg skrivit om hur jag har försökt hitta en plattform som passar mig, och t.o.m. diskuterat att bygga en egen (ett projekt som jag ganska snart fick lägga ner p.g.a. tidsbrist).

Ny flyttar jag i alla fall från PHP-baserade SecondCrack till Jekyll, en annan statisk plattform – men byggd i Ruby.

Varför? Jo – tyvärr så är SecondCrack är allt för buggigt och ouppdaterat för tillfället – det senaste året har jag själv lagt till flertalet funktioner för att försöka hålla webbplatsen flytande, men i slutändan tog det alldeles för mycket tid att underhålla. Vill jag publicera något som vill jag inte behöva att manuellt gå in och rensa cache och flytat runt filer. Nu håller jag tummarna för att Jekyll håller för mig i alla fall något år framöver.

Servern är bytt även den, från Apache till Nginx.

Ni som kommer hit ofta ser säkert att designen har fått ett mindre ansiktslyft – detta är dock minimalt, men all kod är ändå skriven från grunden för att enkelt kunna uppdatera designen framöver efter behov.

Ett par skärmdumpar för att minnas marcusolsson.me över tid och bevara för framtiden.

marcusolsson.me gammal 3 Marcusolsson.me som lanserades 2013

marcusolsson.me gammal 2 Marcusolsson.me från 2011

marcusolsson.me gammal 1 Marcusolsson.me 2009 – då med helt annan design

10 september 2014 av Marcus Olsson

Nytt från Apple 9 september

Än en gång var i stort sett allting känt via diverse läckor och rykten långt innan Apples stora konferens, men Apple bjöd ändå på två helt nya telefoner, Apple Watch samt Apple Pay.

iPhone

Precis som ryktena har talat om så fick vi se två nya iPhones, en 4,7” och en 5,5”. Detta är ett stort steg för Apple som alltid har hållit sig till mindre telefoner än många konkurrenter (iPhone 5 och 5S med sina 4,0” var större än sina föregångare dock).

Med de nya lurarna så är det de typiska uppgraderingar med snabbare processorer (A8), bättre kamera (den större 5,5” har t.o.m. optisk bildstabilisering), något vassare batteritid, bättre skärm m.m. Ett NFC-chip (Near Field Communication) är nu också inbyggt.

Designen blir kanske något av en vattendelare, med rundade hörn så påminner de nya telefonerna mer om t.ex. iPad:en, och kanske deras gamla 3GS? Men det blir förmodligen svårare att sticka ut gentemot Samsung, Motorola och de andra Android-telefonerna.

iPhone 6 och “6 Plus” blir namnen.

Kostar kommer de också att göra, 6395kr och 7395kr om man köper dem utan abonnemang.

'Iphone 6'

Apple Watch

Det senaste året så har bl.a. Samsung, LG och Motorola gett sig in i “wearables” med diverse “smartklockor” – nu är det Apples tur.

Detta är alltså klockan som det har ryktats om från och till under 2-3 år nu – vilket är ungefär lika länga som Tim Cook & Co. sade att de har jobbat med den.

'Apple Watch'

Många är förmodligen rätt så kluvna kring den här helt nya produkten från Apple, jag själv också.

Medan Apple gör så otroligt mycket rätt – t.ex. så finns både klockan och armbanden i rad olika designer och storlekar för att kunna marknadsföras till så många som möjligt – så känner jag att Apple missar något.

Gränssnittet och UI:t är helt anpassat till klockan, vilket är helt rätt – bara det att det inte är särskilt attraktivt. Samma sak gäller själva "klockhuset", den är långt ifrån ful – men jag har alltid tänkt mig att den dagen Apple släpper en smartwatch så kommer det vara något i still med Withings Activité (något mer digital kanske). Motorola släppte i förra veckan Moto 360 också som verkligen ser ut som en klocka.

Många andra frågetecken kvarstår med – vad är batteritiden? Vilka komponenter är faktiskt inbyggda, och vilka kräver en iPhone? T.ex. nämnde det att den enklaste modellen kräver en iPhone för GPS-funktionerna (dealbreaker för mig, förmodligen), det är dock oklart om detta gälla alla versionerna.

Men – Apple har inte släppt en halvhjärtat produkt sedan Pippin, och man får helt enkelt förlita sig (fram tills att den släpps i början av 2015) till att de har tänkt igenom produkten noga.

Priset, $359 för den allra enklaste. I svenska pengar blir detta förmodligen cirka 3200-3600kr, det är en rätt så dyr klocka det.

Apple Pay

Detta var förmodligen det mest intressant under hela presentationen.

Apple rullar alltså i.o.m. iPhone 6 ut en helt ny typ av betalningslösning. Inbyggt i iPhone 6 (och i Apple Watch) finns ett NFC-chip vilken via man kan betala via särskilda terminaler och appar.

Hela flödet är ganska imponerande; man fotograferar sina betalkort, och sedan verifierar man via sin bank att man är ägaren av kortet, och därefter kan man direkt börja shoppa med sin mobil – själva betalningen godkänns med ens fingeravtryck via TouchID. “No wallet required”.

Apputvecklare har direkt tillgång till att bygga in detta i sina applikationer – jag har dock ännu inte hittat någon information kring hur, eller om, även webbutvecklare kan få tillgång till den här lösningen.

I USA så rullar bl.a. Subway, McDonalds, Staples, Macys och många andra ut detta omgående. Flertalet banker deltar också från start.

När, och om detta ska fungera i Sverige är något oklart – vi till skillnad från USA gillar ju våra chip och PIN-koder för ökad säkerhet, dessutom är vi redan relativt “kontantlösa” gentemot andra länder. Och frågan är hur snabbt våra banker kan integreras i Apples system.

Detta kan blir extremt stort för Apple.

2 september 2014 av Marcus Olsson

Nyheter i Laravel 4.3

Inom de närmaste veckorna så kommer Laravel 4.3 släppas skarpt – redan nu kan man dra ner develop-branchen om man vill tjuvstarta lite.

Många nyheter är det att hålla koll på, så för att förbereda sig lite – och veta vad man ger sin in på så har jag samlat ett par matnyttiga länkar.

Laravel 4.3: New Awesome Form Validation →
Laracasts: What's new in Laravel 4.3 →

Bibliotek som numera kommer ingå i Laravel.

Flysystem →
Socialite →

En annan mycket trevlig nyhet är att man direkt via ramverket kommer att kunna cache:a sina routes istället för att behöva trixa med med before- och after-filter, som man gjorde förr:

/**
 * For caching routes
 */
Route::filter('cache', function($route, $request, $response = null) {

	$cacheTagKey = 'a_cache_tag_key';
	$cacheTime = 60*2; // 2 hours

	$key = Str::slug(Request::url());
	if(is_null($response) && Cache::tags($cacheTagKey)->has($key)) {
		return Cache::tags($cacheTagKey)->get($key);
	} elseif(!is_null($response) && !Cache::tags($cacheTagKey)->has($key)) {
		// Cache for 2 hours
		Cache::tags($cacheTagKey)->put($key, $response->getContent(), $cacheTime);
	}
});

Letar du efter en webbutvecklare med koll på Laravel? Kontakta mig.

1 september 2014 av Marcus Olsson

Säkerhet på nätet – en liten lathund

Fler och fler uppseendeväckande läckor av personlig data och uppgifter sker på nätet. Vi får höra om både stora avancerade attacker mot multinationella företag (läs om attacken mot Sony 2011), och om okända och kända personers privata bilder (senast idag) som läcker ut till allmänheten.

Men hur skyddar man sig?

Man kan tyvärr omöjligen skydda sig mot alla typer om intrång, men man kan med relativt enkla medel förhindra mycket – och dessutom minska eventuella skador.

Starka, och unika lösenord

Starka lösenord, de finns det många varianter och regler kring. Men ett starkt lösenord behöver inte se ut som "!Xkta#21PapQ3" och vara omöjliga att komma ihåg. Ett starkt lösenord kan också vara en fras, så som "en rolig gul gurka" – faktum är den typen av lösenord kan vara minst lika starka som föregående exempel (se t.ex. xkcds exempel).

Varje tjänst som du registrerar dig hos bör du dessutom registrera dig med ett unikt lösenord, detta för att förhindra att om du blir komprimerad hos en tjänst – att hackaren direkt har ditt lösenord till alla dina övriga tjänster. Det är svårt, men för att i alla fall göra det svårare för hackaren kan du för varje tjänst åtminstone lägga till ett eller två ord som beskriver vad tjänsten gör, t.ex. för Gmail: "en rolig gul gurka skickar mail".

Lösenord i textform – fly!

Om en "hackare" lyckas komma åt ditt konto hos stora företag så som Google, Apple eller Microsoft så beror det väldigt sällan på de företagen direkt har blivit attackerade – utan att hackaren har hittat svagheter en mindre säker tjänst som lagrar ditt lösenord i klartext, alltså att lösenordet inte är hashat eller krypterat.

Men hur vet du om en tjänst lagrar ditt lösenord i klartext? Ett enkelt sätt att ta reda på det är om du återställer ditt lösenord, och får det direkt skickat till dig där du kan läsa ditt gamla lösenord – då lagrar de inte ditt lösenord hashat, och följer därmed inte bästa praxis. Gå omedelbart in på tjänsten och byt lösenord till ett som du inte har någon annanstans.

Mail från Bloggportalen, från 2012, de har tack och lov ett säkrare system idag. Ja, lösenordet är redigerat.

Får du ett sådant mail, kontakta dessutom företaget och uppmärksamma dem kring säkerhetsproblemet – de lyssnar väldigt ofta.

2-stegs autentisering (2-step authentication)

Många tjänster, så som Gmail, Dropbox och inte minst Facebook erbjuder idag 2-stegs verifiering (eller "autentisering") för att minska en hackares möjlighet att komma åt ditt konto, om de redan har ditt lösenord från annat håll.

Det går vanligtvis till som så att du får en kod via SMS till din telefon som du måste skriva samtidigt som du loggar in på tjänsten. Detta höjer säkerheten avsevärt då hackaren även behöver ha tillgång till din mobiltelefon.

Skydda mailen, det är A och O

Skydda din e-post!. Din e-post är det allra viktigaste och din svagaste punkt. Kommer en hackare över din e-post så kan de från alla andra tjänster du använder "återställa" ditt lösenord. Ha alltid ett unikt lösenord för din mail, och om möjligt, sätt upp 2-stegs autentisering.

Automatisera alltihop, lösenordshanterare

Det finns flera lösenordshanterare på marknaden som automatiskt kan generera och lagra dina lösenord så att du själv inte behöver kämpa med det här varje gång du ska skapa ett konto eller logga in. Exempel är LastPass och min egna favorit; 1Password.

Fler tips och idéer? Något som du tycker är fel? @olssonm är jag på twitter.

29 augusti 2014 av Marcus Olsson

Jag stödjer nu Kiva.org

Kiva är en organisation som förmedlar lån till personer i länder och områden där det saknas tillgång till kapital och traditionella bankväsenden för att öka chanserna att forma sin egna framtid.

Ett lån via Kiva är inte en donation eller välgörenhet, utan just ett lån. Över 98% av alla lån via Kiva har betalats tillbaka – men det är inte det viktiga, utan mer tanken på att man kan hjälpa andra att inte bara skapa något bättre för sin egna framtid, utan också för sitt samhälle.

Lån som blir återbetalade kommer jag att återinvestera i Kiva.

Jag kommer främst att fokusera på att hjälpa kvinnor som vill ha möjligheten att skaffa sig en högre utbildning, samt de som söker finansiering för att starta upp sitt egna företag – något som man kanske tycker är svårt nog i ett land som Sverige, men som kan vara nästintill i många länder.

Varför inte vara med du också? Ta gärna kontakta med mig så sätter vi upp en gemensam Kiva-grupp för att tillsammans hjälpa andra att få lite bättre möjligheter.

Min Kiva.org-profil.

28 augusti 2014 av Marcus Olsson

Laravel tips del 2 – Dispatcher och cron-jobb

I stort sett varje riktig webbtjänst når någon gång punkten då saker och ting behöver automatiseras – vare sig det är filer som ska behandlas, tweets som ska skickas ut, data som ska hämtas via ett API eller någonting annat där du vill slippa göra en manuell åtgärd.

Cron-jobb är den allra vanligaste metoden att göra det här på. Kanske kör man med sin gamla trofasta crontab:

ProHockeyIQ Cron Tab Crontab från ProHockeyIQ i våras

Eller om man har någon form av hjälpverktyg t.ex. cpanel, eller kanske Forge för att underlätta lite:

Webbjobb.io Cron Tab Forge Crontab från Webbjobb.io genom Laravel Forge

För det är det stora problemet med Cron, syntaxen. Den är både relativt svår att lära sig, och är inte särskilt praktiskt om man behöver tyda vilka jobb man har schemalagda snabbt.

Jag själv brukar "fuska" genom att använda en GUI, t.ex. "Corntab" då jag alltid bladar ihop månad och dagen under en månaden (kan ställa till med ordentlig huvudvärk).

Lösningen – Dispatcher

Dispatcher gör det väldigt enkelt att programmatiskt bygga upp dina automatiserade jobb, samtidigt som den erbjuder en väldigt praktiskt överblick över dem när de väl är schemalagda.

För att sätta upp det i Laravel så är det bara att göra det klassiska; dra in biblioteket via composer:

"require": {
	"indatus/dispatcher": "~1.4"
}

Och sedan lägga till det bland ens providers:

'providers' => array(
	'Indatus\Dispatcher\ServiceProvider'
)

Det fina med Dispatcher är att det i grund och botten är ett vanligt Artisan-kommando (du använder väl kommandon för dina jobb?). Så om du redan har ett kommando som du vill använda tillsammans med Dispatcher så kan du bara lägga till följande klasser med use:

use Indatus\Dispatcher\Scheduling\ScheduledCommand;
use Indatus\Dispatcher\Scheduling\Schedulable;

Samt extend:a ScheduledCommand istället för Command:

class MyCommand extends ScheduledCommand {}

Om man vill skapa ett nytt kommando från scratch, är det bara att köra:

php artisan scheduled:make MyCommand

Som vanligt, glöm inte att registrera dina kommandon i Artisan.php:

Artisan::add(new MyCommand);

Dispatcher-kommandona fungerar identiskt med de vanliga Artisan kommandona, med undantaget att utöver fire-metoden så kan du använda schedule-metoden. Det är här magin händer.

Säg t.ex. att du har ett jobb som du vill köra varje veckodag, var tionde minut klockan 7 och klockan 8. Lite småjobbigt att pilla med stjärnorna här, inte sant? Med Dispatcher kan du enkelt uttrycka det genom:

public function schedule(Schedulable $scheduler) {
	return $scheduler->everyWeekDay()
					->hours(7, 8)
					->everyMinutes(10);
}

Svårare än så är det inte. Och om du vill ha ett argument till ditt kommando?

public function schedule(Schedulable $scheduler) {
	// Same as php artisan MyCommand task
	return $scheduler->args(array('task'))
					->everyWeekDay()
					->hours(7, 8)
					->everyMinutes(10);
}

Du kan nu köra php artisan scheduled:summary för att få en smidig överblick som är betydligt enklare att tyda än crontab -l.

Webbjobb.io Cron Tab Dispatcher

Men vad är det som faktiskt triggar jobben? Jo, det är php artisan scheduled:run, som du sätter ett cron-jobb på för att köra varje minut.

* * * * * php /sites/mysite.com/artisan scheduled:run

Så helt undan crontab:en kommer du inte, men i framtiden så är det bara att skapa fler kommandon om du behöver fler automatiserade jobb, utan att behöva gå in med crontab -e.

Spana in Dispatcher på GitHub. Jeffrey Way har också en bra screencast om just Dispatcher på Laracasts.