Sträva efter enkelhet

Är det något jag alltid har gjort när jag programmerat så är det att sträva efter enkelhet. Allt för många krånglar till saker och ting. Till exempel använder onödiga ”hjälpmedel” i sitt arbetsflöde som oftast bara gör att du spenderar mindre tid att faktiskt skriva kod. Eller de som skriver kod som är ”avancerad” men som bara slutar med att vara svår att läsa och/eller förstå.

För mig är enkelhet att bara hålla sig till det absolut nödvändigaste. Jag använder t.ex inte Vagrant bara för det finns, men jag ser fördelarna med det. Det är helt onödigt för mig och jag klarar mig helt utan det när jag jobbar om dagarna. Samma sak gäller när jag skriver kod. Om jag inte behöver en riktigt smart algoritm så skriver jag den inte bara för att jag kan. Räckte det med en enkel IF/ELSE? Japp. Okej, då kör vi på det. Bara för att det var möjligt att lösa på ett annat mer avancerat sätt betyder inte att det alltid är bättre.

Detta är något jag tror många, speciellt nya utvecklare, inte strävar efter eller förstår för så många där ute vill visa upp hur ”duktiga” de är när de skrev sin avancerade kodlösning, följde ett nytt design pattern eller använder cutting edge hjälpmedel. Därför ville jag skriva några ord om det. Personligen behandlar jag alla hjälpmedel där ute (gulp, vagrant, bower, docker, diverse frameworks och så vidare)  precis som ett vanligt verktyg. Jag behöver t.ex inte en hammare när jag ska dra i en skruv, jag behöver en skruvmejsel. Jag kan hamra ner skruven men bara för att det går är det inte bättre och det passar inte till mitt ändamål.

100 likes på Facebook!

Idag uppfyllde vi en liten milstolpe med Mediastream genom att få 100 likes på Facebook. Efter bara en vecka!

100-likes

Under tiden har jag pumpat ut flertalet förbättringar som gör tjänsten stabilare och bättre. Ett fåtal personer har fått inbjudningar till betan och snart kommer det lite nya features som de får ta del av. Resterande personer som anmält sig till betan kommer kontinuerligt få inbjudan skickade till sig. Håll ögonen öppna!

Mediastream

Äntligen. Det är nog det ord som sammanfattar bäst hur jag känner just nu. Under en längre tid har jag jobbat med Mediastream som tills idag varit hemligt. Men nu kan jag äntligen börja prata om det och dela med mig av utvecklingen som kommer ske framöver.

Mediastream är kort och gott en tjänst för att optimera ditt företags marknadsföring. Genom att samla budget, uppföljning, statistik och avtalshantering under ett inlogg får du full koll och en oslagbar struktur.

För tillfället kan du anmäla dig till betan där du får möjlighet att testa tjänsten före alla andra.

Totally Tooling Tips

Google Developers har börjat köra en liten serie på Youtube där de ger utvecklare korta tips på lite allt möjligt. De har t.ex kört avsnitt om vilka färgteman de använder, Sublime plugins, DevTools tips och nu sist några genvägar du kan använda dig av i terminalen.

Avsnitten kommer ut en gång i veckan och de är ca 2-5 minuter långa.

Här finner ni hela spellistan:

Vim – Snabbare ESC

Något som varit irriterande när jag jobbat i Vim och tryckte på ESC så tog det en stund innan något hände. Jag bindade tangenterna JJ till att utföra <Esc> och då var det inga problem alls och det var respons på en gång. Men nu har jag äntligen hittat en lösning på problemet.

Genom att lägga in följande i .vimrc så kommer ESC vara så snabb som den ska vara:

if ! has('gui_running')
 set ttimeoutlen=10
 augroup QuickEscape
 autocmd!
 au InsertEnter * set timeoutlen=0
 au InsertLeave * set timeoutlen=1000
 augroup END
endif

Växla mellan Controller och Spec i Vim när du använder PhpSpec

PhpSpec kommer bli det jag använder under 2015 (och förmodligen en lång tid framåt) för att testa min kod på lite lägre nivåer än vad Codeception gör. Det som är fint med PhpSpec är att kod genereras åt dig medan du skriver och kör dina tester. Perfekt för att få en så smal kod som möjligt och spara lite tid.

Eftersom jag sitter och kodar på en ganska liten skärm och gärna inte kör med split screens i varken Vim eller Tmux så växlar jag mycket mellan mina php-filer och spec-filer. Därför tyckte jag det vore skönt med en function i Vim som gör detta på ett smidigt sätt.

Med det i bakhuvudet tryckte jag in följande i min .vimrc:

" switch between controller and spec file "
map <leader>sw :SwitchBetweenControllerAndSpec

command! SwitchBetweenControllerAndSpec call SwitchBetweenControllerAndSpec()

function! SwitchBetweenControllerAndSpec()
    let path = expand('%:p')
    let srcpath = './src'
    let specpath = './spec'
    " are we in a spec file? "
    let matches = matchlist(path, printf('^%s\(.\+\)Spec\.php$', fnamemodify(specpath, ':p')))
    if len(matches) > 0
      let file = fnamemodify(printf('%s/%s.php', srcpath, matches[1]), ':p')
      if bufexists(file)
        execute(printf('buffer %s', file))
        return
      endif
      execute(printf('edit %s', file))
    endif
    " are we in a php file? "
    let matches = matchlist(path, printf('^%s\(.\+\)\.php$', fnamemodify(srcpath, ':p')))
    if len(matches) > 0
      let file = fnamemodify(printf('%s/%sSpec.php', specpath, matches[1]), ':p')
      if bufexists(file)
        execute(printf('buffer %s', file))
        return
      endif
      execute(printf('edit %s', file))
    endif
    echo 'Current file is not a spec nor php file.'
endfunction

Detta är skrivet för att passa min Symfony2 setup men du kan enkelt bestämma vart din mapp för src och spec är genom att ändra värdet på srcpath och specpath. Om jag minns rätt så använder Laravel ./app och inte ./src och då skulle du kunna ändra srcpath till ./app för att allt ska rulla på igen.

Något jag ska göra framöver är att göra exakt samma sak fast för Behat och alla de olika filerna du vill växla mellan. Självklart kan du applicera detta på vilka filer som helst genom att bara ändra ändelserna i koden.

Tips på förbättringar? Skriv en kommentar!

Fixa multiple cursors bug i Vim vid användning av NeoComplete / NeoSnippets

Multiple cursors är ett väldigt användbart verktyg när du knackar kod. Däremot råkade jag ut för en liten bug efter jag bytte till neocomplete / neosnippets för autocompletion. Vad som hände var att när jag skulle ändra något så skrevs det bara in <Plug> om och om och om och om och om igen. Inte så bra kan man tycka…

multiple-cursors

Fixen var enkel när jag väl hittade den. Antingen använder du en fork av terryma’s repo som kristijanhusak har gjort som du hittar här. Eller så kan du ju kolla commiten som fixade problemet och implementera på egen hand.

Lycka till!

Halt and Catch Fire

Jag upptäckte nyligen den här serien från AMC som utspelar sig på 80-talet där IBM dominerar PC-marknaden och Apple börjar komma som en uppstickare. Det tog inte lång tid innan jag kollat på alla avsnitt (det var ju bara 10 stycken). Trevligt med en dramaserie på detta område, så det inte bara släpps komedier hela tiden.

”Madmen för nördar” läste jag någonstans och det stämde ganska bra eftersom serien fokuserar mycket på företagandet, ta chanser för att uppnå sina drömmar och jobba dygnet runt för att lyckas.

För fyra dagar sen gick de ut med att en andra säsong ska komma ut sommaren 2015 och det ser jag verkligen fram emot!

Uppdaterade dotfiles för Vim, Tmux och Bash

På Github hittar du mina dotfiles för Vim, Tmux och Bash som jag använder just nu. Det som är största skillnaden är att jag nu inkluderat ett script för att snabbt installera allt, inklusive plugins för Vim. Jag har även städat och tagit bort många av de filer jag inte längre använder, som t.ex de för I3WM med mera.

Du hittar allt på https://github.com/johndahlstrom/dotfiles. Enjoy!

Att byta ut Grunt mot Gulp

Av ren nyfikenhet skulle jag kolla på hur Gulp fungerade eftersom jag kört Grunt rätt länge nu. Alltid bra att jämföra olika verktyg då och då för du vill alltid ha det bästa när du jobbar med webdev (det vill i alla fall jag).

Eftersom Gulp var lätt att sätta sig in i blev processen inte så lång. Det jag behövde i nuläget var bara funktionerna för att köra linting och uglify på JavaScript, Sass/Compass på min CSS samt kombinera mina filer så det bara blir en fil av varje filtyp istället för flera. Jag inkluderade även Livereload eftersom det underlättar arbetet vid redigering av CSS.

Min gulpfile.js ser idag ut så här:

var gulp = require('gulp');
var sass = require('gulp-ruby-sass');
var autoprefixer = require('gulp-autoprefixer');
var uglify = require('gulp-uglify');
var concat = require('gulp-concat');
var gutil = require('gulp-util');
var jshint = require('gulp-jshint');
var livereload = require('gulp-livereload');

gulp.task('css', function() {
  return gulp.src('src/css/*.sass')
  .pipe(concat('styles.min.sass'))
  .pipe(gulp.dest('destination/css'))
  .pipe(sass({ style: 'compressed', compass: true, trace: true }))
    .on('error', handleError)
  .pipe(autoprefixer('last 15 version'))
  .pipe(gulp.dest('destination/css/'))
  .pipe(livereload())
});

gulp.task('js', function() {
  return gulp.src('src/js/*.js')
    .pipe(concat('scripts.min.js'))
    .pipe(gulp.dest('destination/js'))
    .pipe(jshint())
    .pipe(jshint.reporter('default'))
      .on('error', handleError)
    .pipe(uglify())
      .on('error', handleError)
    .pipe(gulp.dest('destination/js'))
    .pipe(livereload())
});

gulp.task('default', function() {
  gulp.run('css');
  gulp.run('js');
   gulp.watch('src/css/*.sass', function() {
     gulp.run('css');
   });
  gulp.watch('src/js/*.js', function() {
    gulp.run('js');
  });
});

function handleError(err) {
  console.log(err.toString());
  this.emit('end');
}

Notera funktionen ”handleError” längst ner i filen. Den är där för att Gulp stoppar watch processen vid ett fel. Så om jag skriver fel syntax i min js eller sass-fil så kommer den inte köra när jag rättar den – om jag inte använder den här funktionen och binder den till ”error” på följande vis:

.pipe(uglify())
  .on('error', handleError)

Jag antar att det är en bug för det kan omöjligt vara meningen att det ska vara så. Men med tanke på att Gulp är så pass nytt blir jag inte förvånad.

Det jag blev förvånad över däremot är att jag upplever att Gulp är snabbare än Grunt. Det hade jag inte väntat mig, utan jag trodde mer att det Gulp skulle vara bra på var att ha bättre syntax för samma saker som Grunt gör och på så vis vara lättare att hantera.

Så från att vara en snubbe som använder Grunt är jag nu en snubbe som använder Gulp! Det finns säkert mycket mer att göra med Gulp, men i nuläget behöver jag inte fler saker än dessa. Bara detta lilla hjälper mig väldigt mycket när jag utvecklar.

Har du tips på vad du använder Gulp (eller Grunt för den delen) så skriv gärna en kommentar!