av .

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.

/**
 * 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.

av .

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.

"Bloggportalen osäkert lösenord" 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.

av .

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.

av .

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.

av .

Laravel tips del 1 – loggar

Dela upp loggarna per dag (och typ)

Tidigare versioner av Laravel (4.1 och neråt), delade upp loggarna per dag och typ (cli, apache2handler etc.). Men i och med introduktionen av artisan tail (se dokumentationen) så valde de att samla all loggning i en och samma fil. Men föredrar man den tidigare metoden och man inte använder tail-kommandot så är det enkelt fixat.

I app/start/global.php hittar man raden

Log::useFiles(storage_path().'/logs/laravel.log');

Byt ut det mot följande istället:

Log::useDailyFiles(storage_path().'/logs/laravel.log');

Bonus; om man vill ha det riktigt i detalj, kör också med PHP-funktionen php_sapi_name() för att se vilket interface som PHP körs med när logfilen skrivs:

$logFile = 'log-' . php_sapi_name() . '.txt';
Log::useDailyFiles(storage_path() . '/logs/' . $logFile);

Nu kommer du direkt kunna söka upp dina loggfiler både baserade på interface och datum. Filnamnen kommer se ut något liknande som:

log-fpm-fcgi-2014-07-02.txt

Logga SQL-queries

Jagar du efter SQL-optimeringar med hjälp av eager loading, eller testar du dina cache:ningsmetoder? Då bör du logga dina queries under utvecklingen så att du i detalj kan se vad som händer under huven när Eloquent (eller för all del Query Builder) gör sitt jobb.

Detta görs enklast via Event::listen, på illuminate.query:

Event::listen('illuminate.query', function($query, $bindings, $time, $name) {
    $query = str_replace(array('%', '?'), array('%%', '%s'), $query);
    $query = vsprintf($query, $bindings);
    $data = compact('query', 'time', 'name');
    Log::info($data);
});

Ett tips här är att i din miljös database-config sätta ett värde, t.ex. log till true eller false så att du enkelt kan styra i vilka miljöer du vill logga dina queries.

if (Config::get('database.log', false)) {
    // Code
}

Att logga queries är smidigast om man samtidigt använder tail-kommandot för att få ut datan direkt i terminalen.

Ordna med irriterade 404-loggar

Som standard så loggar Laravel alla fel, inklusive 404:or, i samma format. T.ex:

[2014-07-02 09:06:33] local.ERROR: exception 'Symfony\Component\HttpKernel\Exception\NotFoundHttpException' in /home/vagrant/Code/laravel/vendor/laravel/framework/src/Illuminate/Routing/RouteCollection.php:146

// ## Stack trace

Detta är minst sagt onödigt när det kommer till 404:or, och hjälper en inte särskilt mycket att ens se vilken URL som triggade felet.

Men, det är enkelt fixat!

Igen i app/start/global.php så finns den lilla kodsnutten:

App::error(function(Exception $exception, $code)
{
    Log::error($exception);
});

Nu är det endast 404:or vi vill ordna annorlunda (fler exempel kommer i framtida blogginlägg), så det fixar man rimligtvis snyggast så här:

App::error(function(Exception $exception, $code)
{
    switch ($code) {
        case 404:
            Log::error($code . ' thrown @ ' . Request::url());
            break;

        default:
            Log::error($exception);
            break;
    }
});

Nu kommer något liknande:

[2014-07-02 09:16:33] local.ERROR: 404 thrown @ http://site.dev:8000/this/is/a/404 [] []

att dyka upp i loggen istället. Självklart kan man använda Log::error($exception); också om man vill ha hela trace:en.

Hoppas att det här är till användning för andra Laravel-fantaster, har du själv några tips? @olssonm är jag på Twitter.

av .

Mapbox släpper Mapbox GL för webben

Jag har tidigare skrivit om Mapbox och deras fantastiska desktop-applikation “Tilemill” för att skapa interaktiva kartor. Sedan dess har jag bytt ut Google Maps till Mapbox för de flesta projekten som jag behöver kartor till (se t.ex. min kontaktsida).

Tidigare i år lanserade de Mapbox GL för kartor i iOS, OSX och Linux-applikationer, nu lanserar de även API:et för webben.

Med det kan man enkelt strukturera upp kartor direkt via JSON-data istället för att behöva gå via deras Mapbox-studio (som fortfarande är ett riktigt smidigt verktyg), och allting renderas effektivt med hjälp av WebGL.

Läs mer i Mapbox blogginlägg.

av .

Splitvision skaffar ny webb

Splitvision är en del av Borås Elnät (ett kommunalt bolag), som levererar anslutning till Borås stadsnät till de boende i Borås.

Det finns många fel med Splitvision och hur el- och bredbandsnätet hanteras, så som det ofta blir med liknande monopolställningar (läs t.ex. om hur kommunen har satt olagliga priser och tagit ut pengar ur företaget).

Men, den här bloggposten är inte en direkt klagopost på SplitVision eller Borås Elnät, utan mer än förundran över deras nya webbplats.

Här om dagen skulle jag se efter deras driftinfo för att se om det var några störningar under den fruktansvärda åskan (störningar som för övrigt alltid måste rapporteras till underleverantörer, även om det alltid är hos dem felet ligger hos).

Som en förmodad majoritet av svenskarna skulle ha gjort så öppnade jag upp Google, och skrev in “Splitvision Borås driftinfo”. Länken i SERP:en förbryllade mig då visade sig vara en 302 redirect till boraselnat.se istället för till splitvision.se, och jag vet sedan tidigare att de har haft en sida för just driftinfo.

Splitvision Borås SERP Splitvision Borås driftinfo

Så jag testade att googla efter “splitvision borås” istället.

Splitvision Borås SERP splitvision borås

“Oj, vad hände här?”. Som befarat så har något satt meta-taggen robots till “noindex”. På alla webbplatsens sidor (webbplatsen använder Wordpress, så förmodligen är “Search Engine Visibility” satt till att vara gömd). Även description-taggen saknas (skulle såklart inte hjälpt mycket i det här fallet).

<meta name='robots' content='noindex,follow' />

Mycket riktigt har alla sidorna fallit bort från Google.

Splitvision Borås SERP

Det finns säkert någon anledning till varför man har valt att göra så här – jag kan dock inte komma på en enda. Ingen bra sådan i alla fall.

När jag väl surfade in på sidan, kom fram till driftinformationen som jag sökte efter – så noterade jag footern.

Splitvision Borås SERP

Om du tycker att texten är lite svårläslig så är du inte ensam om det.

Nu är jag ingen som helst expert (eller ens kunnig) på kommunala offentliga upphandlingar eller liknande (som deras webbplats bör ha gått igenom, eller har jag fått det hela om bakfoten?) fungerar. Men ändå bör WCAG-standarden finnas med på ett hörn någonstans?

Hur som helst, sidan passerar den inte – på flera punkter – just kontrasterna i navigationen är en av punkterna.

Splitvision Borås SERP

Läs mer om hur man kalkylerar kontraster här.

Kanske är jag lite överkritiskt, men det är ju inte några särskilt bra fel att ha på en kommunal webbplats.

Inte heller att webbplatser är obrukbar i IE8 är någon höjdare. Kanske inte den webbläsaren man riktar sig primärt mot idag, men man bör i alla fall kunna ta del av en del av innehållet på webbplatsen? Förmodligen lätt fixat med html5shiv/m.

Splitvision Borås SERP

Igen – är kanske lite väl hård på Splitvision här, och webbutvecklaren (eller webbutvecklarna?). Men när man idag kan anlita en webbutvecklare och bygga webb relativt billigt med ett bra resultat om man gör lite eftersökningar så är inte det här okej. Självklart kan det ha förekommit andra hinder och problem under utvecklingen också, men då ska man avvakta med att publicera sidan.

Som indirekt “kund” till ett kommunalt bolag (påtvingad sådan genom deras monopol) så är det dessutom lite trist med det här resultatet.

Men webb är ju inte särskilt viktigt? Eller hur var det nu?

Webbplatsen är i alla fall responsiv, det är ju alltid något. Om någon nu hittar dit.

av .

Programmeringsspråk i Sverige 2014

De populäraste programmeringsspråken – webbjobb.io

För någon vecka sedan lanserade jag webbjobb.io – en enkel liten sida som samlar jobbannonser inom webb på ett lättöverskådligt vis.

Projektet är mest för “skojs skull”, att ha koll på vad som händer i branschen och se vilka företag som söker utvecklare.

Här om dagen ville jag ha en liten mer specifik inblick i vilka programmeringsspråk som eftersöks, så jag lade satte ihop “De populäraste programmeringsspråken” för att presentera detta på ett bra vis.

Det som är intressant här är de programmeringsspråken som eftersöks är inte alltid samma språk som man faktiskt läser om och diskuterar. Java är t.ex. det absolut mest eftersökta språket (ett språk som få jag känner har läst ett jobbat mycket med), följt av Javascript och C#.

Sidan är fortfarande något under utveckling – och datan innan mitten av mars är något missvisande (har inte så mycket data att jobba med ännu) – men jag jobbar på att förbättra den över tid.

av .

Stripe finns nu i Sverige (i β-form i alla fall)

Stripe finns fr.o.m. idag i Sverige, i alla fall i en privat beta – vilket förhoppningsvis innebär att det snart är fritt fram för alla andra.

Tidigare i år hade jag turen att få jobba med Stripes API under uppbyggnaden av ProHockeyIQ, och precis allting är så bra med dem som hype:n säger.

Det är väldokumenterat (Stripe API Reference) med riktigt bra kodexempel, de har stabila färdiga bibliotek för en rad språk och ramverk (Github), de har bra och snabb support – och framför allt; de är billiga (2.9% + 30¢ per transaktion).

Om du någon gång kommer att behöva integrera betalning i ditt system – och speciellt återkommande sådana, då kan jag inget annat än att rekommendera Stripe.

av .

Ett år som egen företagare!

Idag är det precis ett år sedan jag lämnade mitt fasta, trygga jobb för att testa att köra mitt egna race som egen företagare.

Efter par tröga månader under sommaren 2013 innan jag hade alla papper i ordning (tips; starta aldrig företag på sommaren) och fått in de första pengarna i företaget, så har det där efter flutit på fantastiskt bra.

Jag ska inte sticka under stolen med att jag har haft lite tur också, jag har i princip aldrig behövt marknadsföra mig eller “fråga runt” efter arbete. Affärsrelationer har uppståt av ren slump, och fantastiska kunder har återkommit med fler spännande projekt – vilket har gjort att jag i nuläget tyvärr måste neka en del mindre uppdrag.

Vill i alla fall säga ett stort tack till alla fantastiska tidigare (och framtida) kunder för förtroendet!

Efter nästa vecka (18 juli) tar jag ett litet sommaruppehåll – jag kommer som alltid att kolla av mailen, men kan vara lite senare än vanligt på att svara. Men, i börjar av augusti är det dags för nya spännande uppdrag!

Redan nu kan du kontakta mig om du vet att du behöver en webbutvecklare till hösten.

av .

Googles nya designspråk: Material Design

Under Googles årliga utvecklingskonferans “I/O” presenterade de igår deras nya designspråk, som de har valt att kalla för “Material Design”.

Ser onekligen bra ut, och man får hålla tummarna nu för att Android-utvecklarna blir lika duktiga som iOS-utvecklarna på att följa OS:ets riktlinjer.

De har även publicerat en helt separat sida som handlar just om design (google.com/design) där de skriver (något “hyperboliskt”):

Material is the Metaphor

A material metaphor is the unifying theory of a rationalized space and a system of motion. Our material is grounded in tactile reality, inspired by our study of paper and ink, yet open to imagination and magic.

Vad betyder det ens? Och jag som tyckte att Apples Jony Ive talade i gåtor när han skulle beskriva nya produkter.

av .

Lite bättre och enklare e-postmallar

Att göra e-postmallar är kul, men kan vara väldigt komplicerat och tidskrävande. HTML och CSS för e-postklienterna går tvärtemot vad man har vet är bäst om inline CSS, layouts med tabeller och liknande.

Tidigare i år tröttnade jag på att om och om igen skriva inline-CSS (och använda MailChimps Inliner Tool) så jag skapade ett workflow för att underlätta processen.

Gulp.js

Till att börja med satte jag upp Gulp för att hantera byggandet av mallen automatiskt med LESS-kompilering, CSS-prefixing samt det viktigaste; att skjuta in all CSS inline.

Det fina med den här metoden är att man helt enkelt kodar mallen precis som om det vore en webbsida, och ut spottas en mall som är redo att användas för ens val av tjänst för e-postutskick (jag rekommenderar CampaignMonitor och MailChimp).

Koden hittar du på GitHub (tillsammans med grunden till en basic mall, inte direkt redo att användas).

Responsiva e-postmallar

Alla vill ha responsiva mallar, så tid har även lagts på att undersöka metoder på att skapa så väl fungerade responsiva mallar som möjligt.

Responsiva e-postmallar är lite av en “hit or miss”; det gäller att man har en någorlunda utplanerad plan, och att man har koll på vilka e-postklienter / tjänster som faktiskt stödjer det här.

Den enklaste formen av responsiva mallar är så klart att köra med en flytande layout, alltså:

.wrapper {
    width: 100%;
    max-width: 700px;
}

Där bredden anpassas efter enheten. Nackdelen med den här metoden är dock att man inte har möjligheten att visa/gömma innehåll, eller att t.ex. få en två-kolumnslayout att bli till en kolumn på ens iPhone.

Man blir helt enkelt tvungen att på hederligt vis använda media-queries:

@media screen and (max-width: 480px) {
    td.col {
        width: 100% !important;
        display: block;
    }
}

<table>
    <tr>
        <td class="col" width="50%">
            <p>Kolumn 1</p>
        </td>
        <td class="col" width="50%">
            <p>Kolumn 2</p>
        </td>
    </tr>
</table>

Vad som händer här att td-elementen (som har display: table-cell; som standard) sätts som block, och kommer att ta upp hela bredden. Metoden fungerar mycket bra i de allra flesta mailklienterna, med undantag; GMails egna app för Android och iOS (Androids och iOS standard mailläsare fungerar det dock med) – då den klienten envisas med att rensa bort alla <style>-taggar. Hoppas på ändring från Google där snart.

Bonus, alternerande layout till en kolumn

Ett vanligt sätt att presentera t.ex. produkter på i ett mail är följande vis:

"Mail produkter icke responsiv"

Men vad händer om layout:en är responsiv? Jo:

"Mail produkter responsiv fel"

Produkterna alternerar inte som man har tänkt sig… Men, det finns ett väldigt enkelt knep man kan använda sig av, via attributen dir och align:

<table dir="rtl">
    <tr>
        <td dir="rtl" class="col" align="right" width="50%">
            <img src="#">
        </td>
        <td dir="ltr" class="col" align="left" width="50%">
            <p>Text</p>
        </td>
    </tr>
</table>

Ger:

"Mail produkter responsiv rätt"

dir är egentligen till för att bestäma hur texten ska “flöda” i ett element, rtl (right to left) eller ltr (left to right). Men med det kan vi också styra hur kolumnerna ska stapla sig ovanför varandra.

Källkod finns på GitHub. Min gulpfile.js är anpassad efter hur jag föredrar att jobba, men är enkel att anpassa efter dina egna behov. Frågor eller kommentarer? @olssonm är jag på Twitter.

av .

Nytt från Apple 2 juni – WWDC 2014

Apple bokstavligt talat radade upp nyheterna under deras WWDC konferans i San Francisco. Det må visserligen inte ha presenterats någon ny hårdvara, men nyheterna var knappast färre för det.

Jag kan omöjligt täcka allting här; jag rekomenderar att spana in deras preview-sida för OS X Yosemite, iOS 8 samt deras developer-sidor.

Riktigt kul att Apple lyfte utvecklarna ännu mer än vad de brukar göra under sina Word Wide Developer Conferences – och att de tillägnade väldigt mycket tid åt deras SDK och dess API:er.

OS X Yosemite

'OS X Yosemite'

Nästa version av OS X kommer att heta “Yosemite” (efter nationalparken i Kalifornien) och innehåller en rad nyheter där det mest påtagliga är ett helt nytt UI som hämtar mycket ifrån iOS 7. Det mesta är platt, med många semitransparenta element – och med nya ikoner, så klart.

Ut åker också Lucida Grande som typsnitt, in kommer ett Helvetica-liknande sådant (jag har inte lyckats hitta om det är en light-variant på “Helvetica Neue” eller ett eget typsnitt).

Spotlight

Spotlight (som jag själv använder otaliga gånger varje dag) öppnas numera mitt på skärmen (a lá Alfred, och tidigare Quicksilver) och hämtar sökningar från ännu fler datakällor, och med previews.

iOS integrering – “Handoff”

Apple tillåter nu ens iPhone att ge extra funktioner till ens Mac, som exempel visade de upp möjligheten att ta emot och svara på samtal samt SMS direkt i OS X. Utvecklare kommer även att ha tillgång till det här API:et.

iCloud Drive

Apple kommer att tillåta användare att direkt komma åt dokument och data lagrat på iCloud istället för att behöva öppna den tillhörande applikationen. Detta gör även att man kan öppna dokument i en App, som hör till en annan. Tänk dig t.ex. att öppna ett excel-dokument i Numbers.

Apple passade även på att slänga in en rad mindre nyheter, så som att man i nya OS X kommer att kunna ändra ens menu-bar till svart (äntligen!).

iOS 8

'iOS 8'

På utsidan kanske inte iOS 8 är någon större uppdatering; ja – det omryktade “Health” gör debut i den kommande uppdateringen, där en rad hälsoappar kan lämna data så att man kan hålla koll på allt ifrån vikt till blodtryck och hur långt man har sprungit. iCloud Drive kommer även till iOS.

Message-appen har fått en rad nyheter, så som att lämna röstmeddelanden och filmer direkt i appen. Att ha möjligheten att lägga till personer i konversationer är även det nytt.

Notifikationerna är nu också interaktiva – vilket innebär att man t.ex. kan svara på ett SMS direkt ifrån notifikationen.

Apple har också gjort om hur tangentbordet fungerar, för att försöka åtgärda de allt för ofta “autocorrect fails”.

För utvecklare; Xcode, iOS SDK och Swift

Apple gör i och med iOS 8 någonting som de aldrig tidigare har gjort; de öppnar upp systemet. Nästan helt.

Det går knappt att beskriva hur stort det här kommer att vara för utvecklare; appar kan nu dela data direkt via operativsystemet, appar har åtkomst till OS-specifika funktioner så som touchID, full kontroll över kameran – och Siri (ska bli ruskigt spännande att se vad folk kommer på där).

Utvecklare kan också via “App Extension” nå en rad områden i operativsystemet, t.ex. notification centre för att placera sina egna widgets (följ matchresultat m.m.), som insticksmoduler i Safari (t.ex. för att översätta webbsidor m.m.) och liknande.

Apple tillåter t.o.m. utvecklare att utveckla nya tangentbord för iOS-enheter (något som Steve Jobs skulle ha starka invändningar emot?).

Swift

Till sist, det förmodligen största för iOS- och OS X-utvecklare på många år, Apple presenterade ett helt nytt programmeringsspråk som de kallar för Swift.

Tidigare har Apple använt sig av Objective-C, en gammal relik från NeXTSTEP-eran och för många med en invecklad syntax.

Swift är designat för att vara enklare, snabbare, renare och mer modernt. Apple har redan lagt ut en bok i iBooks-store för att hjälpa en komma igång redan nu. Till hösten när nya OS X och iOS släpps så börjar de ta emot applikationer skrivna i Swift.

iOS och Mac OS Xs framtid ser mycket ljus ut.

av .

Namespawner – reloaded

Jag skrev tidigare om Forge – en ny plattform för att underlätta driften och uppsättningen av PHP-applikationer. Så efter lite “down time” de senaste dagarna så har jag mer i detalj satt in mig i hur Forge är tänkt att fungera.

Som test så skrev jag igår om Namespawner som en Laravel-applikation och deploy:ade den via ett BitBucket-repo. Tillsammans med Homestead var det hela extremt smidigt, ett par knapptryck och någon $ vagrant up är det enda som krävs för att ha en komplett utvecklingsmiljö som återspeglar ens produktionssever perfekt. Mer eller mindre noll konfiguration krävs – tror att man efter många år äntligen har hittat ett arbetssätt som faktiskt snabbar upp ens arbete avsevärt.

Namespawner var det också ja. En liten applikation som jag sjösatte för cirka 3 år sedan – mest på skoj – som av någon outgrundlig anledning får uppemot 70-80 besökare om dagen. Lite pinsamt, då den har varit trasig sedan i september i fjol. Men nu ska de flesta problemen vara åtgärdade, som så när på att de flesta som förser whois-data kör extrema rate-limits numera. Enkelt åtgärdat med ett par slumpmässiga proxy-servrar – men i utbyte att whois-lookup:en tar extremt lång tid.

Men nu finns applikationen att spana in på nytt i alla fall, på namespawner.com hittar man den.

av .

På söndag är det val

Val till Europaparlamentet – stoppa Sverigedemokraterna

Politik skriver jag inte ofta om här, men detta är så otroligt viktigt att jag måste.

På söndag är det val till Europaparlamentet, som sig brukligt är var femte år. Senast, 2009, var valdeltagandet ytterst låga 45,5% – visserligen någon procentenhet över snittet i Europa – men fortfarande riktigt uselt i en modern demokrati.

Att läsa på inför valet och faktiskt göra ett val tar endast ett par minuter – det är ens skyldighet. Att gå till vallokalen tar i de flesta fallen ännu mindre tid. Det är ett gigantiskt problem att över halva Sveriges befolkning väljer att ligga hemma i soffan och titta på Tv (eller vad man nu kan tänkas göra) istället för att säga sitt om hur vår framtid ska se ut.

Ett till problem – Sverigedemokraterna

Att vi i Sverige har människor som av någon outgrundlig anledning ogillar folk från andra länder såpass mycket att de om och om igen väljer in de mest inkompetenta människorna in i maktens korridorer är skrämmande – så otroligt skrämmande.

Tillräckligt mörkrädd är man över att clowner (den läskiga sorten) som Åkesson, Söder & Co har något som helst inflyttande över svensk politik – men nu i Europaparlamentsvalet så har en ny mästerclown uppenbarat sig – Kristina Winberg.

Problemet med Winberg är flera; hon är uppenbart okunnig och opåläst om vad hennes potentiella uppdrag innebär (länk – där hon blir fullständigt decimerad av Marit Paulsen), hon ljuger rakt upp i ansiktet på journalister (länk) och hon har absolut ingen koll på sitt egna partiprogram (länk).

Förstanamnet för SD till Europaparlamentet.

I de senaste opinionsmätningarna så får SD 8,6% – man kan bara hoppas på att de 8,6% av väljarkåren “bara” är fruktansvärt dåligt informerade, och inte delar Winbergs verklighetsuppfattning (och inkompetens).

Ta dig ett par minuter på söndag och rösta för frihet och demokratin, och emot Sverigedemokraterna.

av .

Laravel Forge och Homestead

I måndags lanserade Taylor Otwell (skaparen av Laravel) det smidiga verktyget Forge.

Med Forge får man möjligheten att från en enda plats sätta upp och konfigurera servrar på både Digital Ocean, Amazon Web Services, Linode och Rackspace med en enhetlig konfiguration – som är följande:

  • Ubuntu 14.04
  • PHP 5.5
  • Nginx
  • MySQL/PostgreSQL

En rad andra saker får man med “på köpet” också, så som Beanstalkd (perfekt för Laravels Queue-funktioner) och Memcached (för att cache:a – så klart). SSH-nycklar, ENV-variabler och liknande hanterar Forge också.

Att skicka upp ny kod är så enkelt som att pusha till GitHub (eller sedan i morse; BitBucket) så hanterar Forge resten.

Forge kostar endast $10 i månaden, och är egentligen en självklarhet om du hanterar mer än ett PHP-projekt (och speciellt då Laravel-projekt).

Men vad är då Homestead?

Homestead är en “Vagrant box” som innehåller en identisk konfiguration som de servrarna som sätts upp via Forge – på detta vis slipper man stöta på problem som orsakas av att ens utveckleckningsmiljö skiljer sig från produktionsmiljön.

Forge hittar du på forge.laravel.com, och dokumentation för hur man sätter upp homestead hittar du under dokumentationen för Laravel 4.2

Med den här länken och koden SSDMAY10 (giltig t.o.m. 31 maj) får du $10 att sätta upp en server på Digital Ocean (ja, det är en referral-länk).

av .

The Heartbleed Bug

'The Heartbleed bug'

En stor brist i OpenSSL, som en stor del av alla servarna på internet använder sig av för att kryptera trafik, har upptäckts.

CVE-2014-0160 eller “the heartbleed bug” som buggen även kallas för, möjliggör att en hackare (eller rättare benämnt; crackare) kan läsa av minnet på målservern och på så sätt inte bara ha möjligheten att läsa av t.ex. e-postadresser och lösenord, utan även komma åt själva krypteringsnyckeln.

Att göra sig av med säkerhetshålet är tyvärr en ganska utdragen process, för att läsa den detaljerade versionen, gå till heartbleed.com – men på t.ex. askubuntu.com har flera användare lämnat väldigt hjälpsamma steg-för-steg guider.

Drabbade versioner av OpenSSL är alla versioner mellan 1.0.1 och 1.0.1f. För att se vilken version man kör kan man använda OpenSSL-prompten:

$ openssl
OpenSSL> version
OpenSSL 1.0.1 14 Mar 2012

Notera att t.ex. Ubuntu fortfarande visar 1.0.1 även efter uppdateringen, detta eftersom att de endast patchar ursprungsversionen.

Ett smidigt testverktyg för att se om din server är drabbad: filippo.io/Heartbleed.

Läs mer om buggen på heartbleed.com

av .

Ett par oumbärliga utvecklingsverktyg

När man bygger och utvecklar stora applikationer kan vara det vara svårt att få allting testat på rätt sätt, särskilt om man använder sig av en rad olika API:er. Här följer ett par verktyg som jag har haft mycket nytta av och har räddat mig otaliga gånger om.

Ultrahook

Ultrahook

Många API:er och webbtjänster förlitar sig på “webhooks” för att t.ex. hålla din egna data i synk med deras. Bl.a. Stripe (ex. ny kund, betalning genomförd) och CampaignMonitor (ex. ny prenumerant, prenumerant uppdaterat e-post) är två tjänster som använder sig mycket av den här tekniken som jag har jobbat mycket med.

Med Ultrahook kan man enkelt route:a så att deras hooks skickas till din lokala utvecklingsmiljö för att möjliggöra snabba tester.

ultrahook.com kan du läsa om hur man installerar och använder verktyget.

Mailtrap.io

Att slå av mailutskick när utvecklar lokalt (eller på t.ex. ens staging- eller utvecklingsserver) är en bra idé så att man inte öser ner kunder med diverse mailutskick. Men när man faktiskt vill testa så att mailen ser bra ut och levereras med rätt data? Mailtrap.io! Det är en enkel SMTP-tjänst (som är gratis) med inbyggt mailläsare och rubbet.

Med den kan du fortfarande “skicka” dina mail, bara det att de fastnar hos Mailtrap istället för att gå vidare till kund eller användare – och du kan snabbt kolla av innehållet så att det stämmer.

Virtualbox och Browserstack

Virtualbox är en enkel och snabb väg att installera Windows så att man kan köra de där obligatoriska testerna i Windows.

Browserstack

Browserstack är ett virtualiseringsverktyg för att testa ens produkt i alla möjliga webbläsare och operativsystem. Perfekt för snabba visuella tester – tyvärr så är det flash-baserat och att använda “developer tools” kan vara riktigt frustrerande i den relativt begränsade miljön.

Virtualbox är helt gratis (kräver Windows-licens, dock), medan Browserstack är $39 i månaden.

Xcode (med iOS simulatorn)

För att testa ens applikation på en mobil enhet.

Om man använder Homebrew (ett måste, läs bl.a. min guide) så kan man köra $ brew install ios-sim för att installera ios-sim för att sedan enkelt starta upp simulatorn för sig själv via terminalen

$ ios-sim start

CodeKit

CodeKit

Kanske inte så mycket med testning att göra – men likt riktigt användbart.

CodeKit har rad olika egenskaper, så som att konkatenera (första gången man skriver det på svenska…) och “lint:a” javascript-filer, kompilera LESS, komprimera bilder m.m.

Har även stöd för auto-reload i webbläsaren för de där småfixarna i CSS:en.

T.ex. Grunt.js är ett alternativ, men i det här fallet gillar jag att ha ett robust allt-i-ett verktyg som i alla fall hittils har klarat alla mina krav.

$29 kostar CodeKit just nu, väl spenderade pengar.

av .

Ny bloggplattform – krav

I lite drygt två har gått sedan jag lämnade Wordpress för det mycket trevliga verktyget secondcrack. Men redan efter cirka 100 inlägg så börjar plattformens tillkortakommanden ställa till besvär för mig.

Koden är illa underhållen (länk till GitHub-repot) och är alldeles för rörig för ödsla tid för att göra några större uppdateringar på egen hand (har redan lagt ner otaliga timmar för att få Google att ens kunna navigera webbplatsen), och DropBox för Linux (som jag använder för att publicera inläggen) är rejält buggigt emellanåt.

Jag har spanat runt efter nya plattformar och verktyg tidigare (tidigare skrivit om det lite här), och har bestämt mig för att jag tar och skriver en helt egen plattform istället.

“Men alla nya då? Det har ju kommit flera bra plattformar på sistonde, Ghost, Anchor CMS med flera?” säger du. Ja, absolut – och de är utmärkta för de allra flesta, men jag stöter alltid på hinder som hindrar mig från att kunna använda plattformen som jag vill.

Mina krav på plattformen är helt enkelt följande:

Snabbhet

Att få det så mycket snabbare än en flat file-plattform (som secondcrack är) är kanske inte vidare troligt, men med APC, Memcache och andra cache-verktyg så tror jag ändå att man kan komma mycket nära med en databasbaserad lösning.

Minimalistiskt

Inte bara designen och layouten jag pratar om här (om det ens blir en ny) – utan även att försöka få kodbasen så minimalistisk som möjligt. Eventuellt kommer jag använda mig av fristående komponenter, t.ex. FlightPHP.

Mer realistiskt så blir det förmodligen Laravel för projektet (mest p.g.a. tiden) dock – kanske inte direkt minimalistisk bas, men åtminstone någorlunda elegant.

Även antalet “features” ska försöka hållas till endast de som jag själv behöver.

Sökmotoroptimerad

När jag gick från Wordpress till secondcrack föll jag som en sten i sökresultaten. Efter mycket jobb är jag tillbaka – denna gången är det ett krav från start.

Remote publishing

Man ska kunna publicera inlägg utan att behöva vara inloggad på webbplatsen. Om detta ska hanteras via DropBox (helst inte), e-post eller annat vis återstår att se.

Markdown

Så klart.

Backup

Någon typ av koppling till DropBox eller liknande så att jag kan sova på nätterna.

Release

Senast 31:a maj.

Vad har ni för krav på en bra bloggplattform? Känner ni redan till ett “perfekt” verktyg? @olssonm är jag på Twitter.

av .

Facebook köper Oculus för $2 miljarder

Facebook verkar minst sagt vara inne i en fas där de spenderar pengar på allt; efter Instagram ($1 miljard), WhatsApp ($19 miljarder) så köper de nu Oculus för $2 miljarder.

Oculus är företaget bakom virtual reality plattformen/enheten “Oculus Rift”, som fick liv tack vare en mycket lyckad kampanj på Kickstarter där de drog in över $2,4 miljoner. De har sedan dess släppt två iterationer av sin prototyp som bl.a. spelutvecklare har haft tillgång till för att skapa nya spelupplevelser och applikationer.

Produkten har fått väldigt gott omdöme om de som har haft chansen att prova den, och flera andra företag ger sig nu in i samma område (Sony presenterade t.ex. Morpheus förra veckan).

Vad Facebook kommer att ha för nytta och användning av Oculus är ännu osäkert, men runt omkring i industrin så är det en hel oroligheter just nu, Marcus Persson (Notch, skaparen av Minecraft) skrev t.ex. på Twitter:

We were in talks about maybe bringing a version of Minecraft to Oculus. I just cancelled that deal. Facebook creeps me out.

Boing Boing skrev även de en något negativ text:

For decades, the idea of living inside a virtual reality has captivated developers’ imaginations.

[…]

But there’s always been a dark cloud over that endeavor: The possibility that these virtual worlds might become tainted or be misused. It’s a major concern, a warning regularly beaten into the minds of those who believed.

[…]

At long last, a hero emerged. Oculus made it possible to dip your head into the simplest of these worlds, to really feel like you had escaped our shared reality into another.

[…]

Suddenly, users were booting up and creating any virtual world they wanted, and that power made them think they might be able to influence the real world a bit. Hopes were high! Oculus seemed untouchable; the white knight of VR.

Well, fuck it. Facebook just bought the thing.

Får hoppas att Facebook förvaltar Oculus väl, och låter plattformen även fortsättningsvis att vara öppen för utvecklare.