Marcus Olsson

Frilansande webbutvecklare

11 februari 2016 av Marcus Olsson

Wordpress-admin utan lösenord

Ganska ofta blir jag tillfrågad att göra enklare uppdaterar på wordpress-sajter – och inte allt för sällan får jag endast en databasdump och temafilerna att gå på. I dessa fall kan det vara lite småklurigt att komma åt admin-kontot beroende på hur din lokala miljö är uppsatt – kanske är det krångligt att få mailfunktionerna att fungera för att återställa lösenordet, och att be om admin-lösenordet ska man självfallet inte göra.

Hur som, det finns en väldigt enkel väg runt detta. Wordpress tillåter en nämligen att man stoppar in ett MD5-hashat lösenord i databasen utan att "salta" det först. Så leta upp en admin-användare i databasdumpen, döp om denna till något passande (eller för all del, använd användarnamnet rakt av) och stoppa in ett passande lösenord – jag brukar köra på "admin" rakt av i min lokala miljö av smidighetsskäl.

Så här ser det ut hashat och klart:

21232f297a57a5a743894a0e4a801fc3

Nu kan du lätt och smidigt logga in och börja hacka runt.

2 februari 2016 av Marcus Olsson

Jekyll har nu ett profile-verktyg

Länge har jag tampats med att Jekyll (som den här webbplatsen använder sig av) tar frustrerande lång tid att generera marcusolsson.me.

Problemet i mitt fall ligger i att Liquid (template-språket för Jekyll) ofta kräver onödig och överflödig kod för att kunna genomföra de allra enklaste sakerna, som till exempel en enkel for-loop för att strukturera upp ett inläggs- och taggarkiv.

Men i.o.m. version 3 av Jekyll så har vi i alla fall fått ett nytt hjälpmedel att hitta de potentiella flaskhalsarna för ens webbplats i form av den nya "options flaggan" --profile.

Jekyll profile

För ett tag sedan uppdaterade jag både Ruby och Jekyll vilket resulterade i att jag fick ner genereringstiden från ~140 sekunder (jag vet…) till cirka 30 sekunder – efter ytterligare lite fixande och trixande med --profile är jag nu nere på dryga 16 sekunder. Mycket mer vettigt – om än fortfarande irriterande varje gång man ska testa mindre CSS-ändringar.

Sedan första februari är Jekyll 3 även tillgängligt för GitHub Pages för de som använder det.

19 januari 2016 av Marcus Olsson

Användare och desire paths

Desire path Bild: Flickr/Alan Stanton. Modifierad. CC BY-SA 2.0.

För många år sedan läste jag något väldigt intressant om planeringen av ett campus; när campuset för ett stort amerikanskt universitet byggdes, så bestämde man sig för att inte asfaltera några gångbanor – istället så lät man eleverna vandra fritt över området under en hel termin. Först därefter så asfalterade man – där eleverna redan hade gått upp gångar i gräset.

Om detta verkligen har skett eller inte – det vet jag ej. Men historien fastnade hos mig och passar ofta som ett exempel på ett bra tankesätt och metodik när man först börjar utveckla en webbapplikation (eller vilken typ av applikation som helst egentligen som verkliga användare använder).

Målet är ofta att utveckla flöden och produkter som är enkla i sin design och funktion, tillräckligt enkla att snabbt forma efter användarens önskemål och behov. Misstaget som många tyvärr gör är att man specificerar dussintalet avancerade funktioner; vilken data (om det ens finns någon) som ligger till grund för besluten bryr man sig sällan om – "Det ska bara vara så" eller "Våra konkurrenter har den funktionen". Detta resulterar ofta i onödigt dyra, stora och komplexa byggen som ingen någonsin har efterfrågat.

Satsa istället på att få ut en MVP (Minimum Viable Product), lägg resurser på verktyg för att mäta hur användarna använder produkter, låt dem enkelt komma i kontakt med dig – kontinuerligt iterera med datan du får ut som underlag. Så får du en produkt som folk faktiskt vill och kan använda.

Mer om "desire paths" hos Wikipedia.

12 januari 2016 av Marcus Olsson

Äldre versioner av IE går i graven

Internet Explorer Logotyp

Idag, den 12:e januari 2016 avslutar Microsoft all framtida utveckling och support för de äldre versionerna av internet explorer.

Detta betyder i praktiken att Microsoft endast stödjer Internet Explorer 11 samt deras nya webbläsare "Edge" i nuläget – det enda undantaget är de användare som är kvar på Windows Vista, där stödjs fortsättningsvis Internet Explorer 9 till viss del.

IE 8, 9 (förutom ovannämnda undantag) samt 10 bör därför ses som utdaterade och osäkra.

Om du ännu inte uppdaterat till Internet Explorer 11 så rekommenderas du starkt att göra så för att fortsättningsvis kunna surfa säkert och ta del av moderna webbtekniker. Givetvis finns det andra webbläsare att välja mellan också; så som Chrome och Firefox.

Läs mer hos Microsoft – End of IE Support.

28 december  2015 av Marcus Olsson

Årets mest lästa inlägg – 2015

Ännu ett år, ännu en genomgång av vad folk har läst här på min webbplats.

Som många bloggar verkar antalet läsare ha minskat något – men de totala besöken har ökat rejält, detta då särskilt till mina projekt- och kontaktsidor, vilket har också märkts av då antalet projektförfrågningar har ökat markant under 2015.

Antalet månader i sträck där jag har skrivit åtminstone ett inlägg är nu dessutom uppe i 50 månader. Får se hur länge den sviten kan hålla i sig.

I alla fall, de mest lästa inläggen för 2015!

  1. Cloudflare, värt att använda?
    Precis som förra året blev mitt inlägg kring Cloudflare (skrivet i september 2013) årets mest lästa inlägg.

  2. Ett bra exempel på en dålig artikel
    Också ett gammalt inlägg (juli 2013) som har seglat upp i topp i år. I inlägget skriver jag om källkritik och avsaknaden av denna hos vissa journalister.

  3. Stripe finns nu i Sverige (i β-form i alla fall)
    En kort notis om att Stripe äntligen finns tillgängligt i Sverige. Från juli 2014.

  4. Tummen upp för Linnéuniversitetet
    Som vanligt inför sista ansökningsdagen för universiteteten så ramlar det in en hel drös med besökare som vill läsa om webbprogrammeringsprogrammet vid LNU – som titeln avslöjar; det är ett riktigt bra program!

  5. Främlingsfientliga avslöjas via hashningen hos Disqus
    Fortfarande ett bland mina mest lästa texter någonsin, där jag skriver om hur Researchgruppen förmodligen gick tillväga när du avslöjande en rad rasistiska uttalanden från flera SD-politiker (inga hack inblandade).

  6. Det säkra lösenordet – inte så svårt som man tror
    Det äldsta inlägget på listan (från 5 juni 2012) – om hur många tänker fel när de väljer ett säkert lösenord, och vad man faktiskt bör tänka på.

  7. 23andMe – få reda på allt om dig själv
    Det första inlägget från 2015 på listan (bara någon vecka gammalt dessutom); en kort text om mina tankar och erfarenheten av DNA-testningtjänsten 23andMe. Fick stor spridning på Facebook under ett par dagar.

  8. Laravel 5 har anlänt
    Vet i ärlighetens namn inte varför det här inlägget fick så många besökare, bara en notis om att Laravel 5 precis hade släppts.

  9. Smart och effektiv kundtjänst hos Dropbox
    Skrev en kort text om mina erfarenheter om Dropbox kundtjänst. Detta är ett inlägg som jag bör återbesöka och lägga till en notis i; 2-3 gånger per år sedan inlägget publicerades (2012) så har folk ringt till mig för att få support för Dropbox. Inte riktigt det som var tanken.

  10. Snabbstarta ditt projekt med Flight, php-activerecord och Twig
    Kodexempel på hur man kan koppla ihop micro-ramverket "Flight-PHP" med phpActiverecord och Twig för att bygga små till medelstora applikationer. Verkar ha en hel del utländska läsare (länkad från ett GitHub-repo) – kul att se att lite folk läser mina texter när jag skriver om kod i alla fall.

Detta är förmodligen årets sista inlägg – god fortsättning och gott nytt år på er!

22 december  2015 av Marcus Olsson

SpaceX har lyckats!

I natt svensk tid så lyckades SpaceX till slut att landa det första steget i sin trestegsraket "Falcon 9" – och givetvis bröt eufori ut i deras anläggning i Hawthorne.

Detta är ett stort steg i jakten på att göra rymdraketer – och på sikt rymdresor – betydligt billigare än vad de är idag genom att återanvända dyra motorer och andra komponenter.

SpaceX släppte också den här magnifika bilden som visar både uppskjutningen och landningen genom en 11 minuter lång exponering:

SpaceX Landing Från SpaceX Flickr-konto; CC0 1.0

21 december  2015 av Marcus Olsson

23andMe – få reda på allt om dig själv

Jag har under många år spanat på 23andMe – tjänsten som kartlägger ditt DNA för att bland annat ta reda på om man har gener som kan öka risken för diverse sjukdomar.

I mitten av oktober slutade jag att bara spana och beställde hem ett "DNA collection kit". Efter att ha spottat i ett rör, skickat tillbaka och väntat fem veckor så fick jag tillgång till mitt resultat.

23andMe DNA collection kit En styck "DNA collection kit" med enkla och tydliga instruktioner.

I resultaten får man reda på om ens DNA innehåller varianter och mutationer av vissa gener som kan bidra till utvecklingen av diverse sjukdomar så som Parkinsons och Alzheimers. För kvinnor kan det även vara bra att veta att man får reda på om man har en variant av genen BRCA1 och BRCA2 som i många fall orsakar bröst- och livmodercancer.

23andMe Parkinson's genome Bär inte på någon av de varianterna som associeras med Parkinsons.

Man får även ut resultat för ärvda anlag, t.ex. sådana anlag som kräver genetiska mutationer från båda föräldrarna för att du ska kunna utveckla en viss sjukdom (t.ex. cystisk fibros och Gauchers sjukdom). Har man ärvt en av varianterna kan man alltså vara en "bärare" som kan trigga åkommor i nästa generation – vilket kan vara bra att känna till den dagen man skaffar barn. Hur man reagerar på vissa mediciner (bl.a. sådana mot diabetes och diverse blodförtunnare) får man också reda på.

Slutligen så får man en överblick och fakta för lite mindre allvarliga anlag, t.ex. laktosintolerans, sannolikheten för "rödhårighet" (eller om man är bärare av varianten av MC1R som orsakar rött hår) och hur många procent neandertalare man är.

23andMe Neanderthal Ancestry Antagligen är jag 2,8% neandertalare.

Bland alla övriga funktioner på deras webbplats kan man också hitta ett verktyg där man kan matcha ens DNA mot andra användare för att hitta eventuella avlägsna släktingar (detta är en "opt-in"-funktion – man måste godkänna möjligheten att ens föräldrar kanske inte är de man växte upp med…). Småkul är det att se ett hundratal kusiner i 4:e led på andra sidan Atlanten.

23andMe och FDA

Värt att känna till är att FDA (Food and Drug Administration, amerikanska läkemedelsverket) och 23andMe har haft en längre dispyt kring presentationen av resultaten – detta har resulterat i att 23andMe visar relativt få anlag för sjukdomar och annat jämfört med sin tidigare version. I korthet så är FDA rädda för att folk tar förhastade beslut baserat på resultaten, vilket kanske är sunt att tänka på.

Hur som är deras relation nu på bättringsvägen och ny data presenteras ständigt allt eftersom 23andMe upfyller FDAs krav.

Jag själv tycker att 23andMe i sitt nuvarande utförande förklarar mycket tydligt vad resultaten innebär, vilken forskning som ligger som grund och hur man kan ta reda på mer.

Full kontroll över ditt DNA

23andMe är utomordentligt duktiga på att förklara hur DNA:t lagras, vilka rättigheter du har och vilka skyldigheter de har. Efter att man har skickat in sitt DNA så sparas det för framtida användning och forskning. Men du kan när som helst begära att de förstör dina prover och uppgifter.

Du kan också exportera datan från 23andMe för att sedan importera den i andra tjänster så som Promethease om du känner för att lära dig ännu mer om ditt DNA.

Värt att tänka på

Som vi alla vet; resultatet av ens DNA är ingen diagnos. Allt vi gör och var vi befinner oss påverkar också riskerna för sjukdomar och andra åkommor, vad DNA:t kan visa på är dock hur vi kan minimera riskerna och göra bättre val.

Därmed var även det sagt.

14 december  2015 av Marcus Olsson

Adobe gör en perfekt övergång

Adobe släppte häromdagen sin års-/kvartalsrapport för Q4 2015. Ointressant som tusan kan man tyckas – men inte alls. Den visar på hur ett företag kan göra en nästan perfekt övergång från att sälja fysiska produkter till en molnbaserad prenumerationstjänst. Något som flera företag (särskilt när det kommer till olika typer av media) verkar ha väldigt svårt att hantera på ett bra sätt.

Adobe achieved record quarterly revenue of $1.31 billion, representing year-over-year growth of 22 percent.

Intäkter $1,31 miljarder dollar – nytt rekord för företaget. Detta är då alltså mindre än två år efter att de lanserade "Creative Cloud" som är deras nuvarande prenumerationstjänst med mjukvaror så som Photoshop, Illustrator och InDesign.

Ni som inte minns det; Adobe brukade sälja otroligt dyra fysiska förpackningar/paket ("Creative Suite"), där programmen fanns på en CD/DVD (eller diskett ännu längre tillbaka). Dessa var man dessutom tvungen att köpa igen när en ny version släpptes. Numera kan man betala från 89kr/mån för att få tillgång till Photoshop som uppdateras automatiskt när det behövs.

I en tid när det ofta krävs nya företag (Uber, Netflix etc.) kommer in och rör om i grytan för att driva en branch frammåt är det förfriskande och roligt att se "en av de gamla" lyckas med en i princip perfekt övergång till modernare tider.

Läs mer: Adobe Reports Annual Revenue, Adobe’s Record Revenue (Techcrunch)

22 november 2015 av Marcus Olsson

Tillgänglighet och öppettider i vinter

Under ett par veckor i vinter så kommer det att gå på halvfart här på kontoret. Jag jobbar alltid med att försöka vara tillgänglig så mycket som möjligt, men nu i vinter så kan det vara bra att känna till ett par saker om man försöker nå mig.

Fullbokad ett tag framöver

För närvarande har jag full beläggning året ut och kommer inte att ta mig an nya projekt förren tidigast februari 2016. Fram till dess gäller vanliga villkor och tider vid vidareutveckling och uppdateringar av existerande och redan påbörjade projekt.

Tillgänglighet

Mellan den 2:a och 13:e december kommer jag dessutom att vara otillgänglig då jag går på en kort semester. Övriga december (inkl. mellandagarna) och större delen av januari gäller vanliga tider där jag tillgänglig större delen av tiden.

För de som jag driftar servrar åt så fungerar allt som vanligt; alla aktuella webbplatser ligger under strikt bevakning och åtgärdas snarast utifall de skulle råka ut för några problem.

Är det några som helst frågor är det bara att kontakta mig via e-post så svarar jag så snart jag kan.

Trevlig vinter – och ta väl hand om er!

13 november 2015 av Marcus Olsson

Laravel-tips del 5 – model binding med relationer

Ett tips som sparar tid i enklare applikationer som inte kräver mycket manipulation med data som ska sparas i databasen.

Ponera att man har sin vanliga Users-tabell:

Schema::create('users', function (Blueprint $table) {
    $table->increments('id');
    $table->string('email')->unique();
    $table->string('password', 60);
    $table->rememberToken();
    $table->timestamps();
});

Och en user_metas-tabell för att spara undan användarnas personliga data:

Schema::create('user_metas', function (Blueprint $table) {
    $table->increments('id');
    $table->integer('user_id')->unsigned();
    $table->string('name');
    $table->string('phone');
    $table->timestamps();

    // Relationship
    $table->foreign('user_id')->references('id')->on('users')->onDelete('cascade');
});

Använder man sedan den traditionella Form-helpern (illuminate/html innan Laravel 5, och numera LaravelCollective/html), så ser man väldigt ofta något liknande det här i sin blade-template:

{!! Form::model($user, ['route' => ['users.update', $user->id], 'method' => 'put']) !!}
    {!! Form::label('email', 'E-mail') !!}
    {!! Form::text('email', null) !!}
    {!! Form::label('name', 'Name') !!}
    {!! Form::text('name', null) !!}
    {!! Form::label('phone', 'Telephone') !!}
    {!! Form::text('phone', null) !!}
{!! Form::close() !!}

Och i controllern:

public function update(Request $request, $id)
{
    $user = User::findOrFail($id);
    $user->email = $request->input('email');
    $user->save();

    $user->userMeta->name = $request->input('name');
    $user->userMeta->phone = $request->input('phone');
    $user->userMeta->save();

    return redirect(route('users.index'));
}

Men – om man nu vill göra det snabbt och enkelt, så är det bra att känna till att man enkelt kan kombinera model-binding tillsammans med sin data betydligt smidigare:

// edit.blade.php
{!! Form::model($user, ['route' => ['users.update', $user->id], 'method' => 'put']) !!}
    {!! Form::label('email', 'E-mail') !!}
    {!! Form::text('email', null) !!}
    {!! Form::label('user_meta[phone]', 'Name') !!}
    {!! Form::text('user_meta[phone]', null) !!}
    {!! Form::label('user_meta[name]', 'Name') !!}
    {!! Form::text('user_meta[name]', null) !!}
{!! Form::close() !!}

// UserController.php
public function update(Request $request, $id)
{
    $user = User::findOrFail($id);
    $user->fill($request->except('user_meta'));
    $user->save();

    $user->userMeta()->save($request->input('user_meta'));

    return redirect(route('users.index'));
}

Se till att sätta $guarded till [] eller liknande om du vill använda dig av fill().

Ju fler fält det rör sig, destå mer kod tjänar man på den här metoden.