Blogg

Här finns tekniska artiklar, presentationer och nyheter om arkitektur och systemutveckling. Håll dig uppdaterad, följ oss på Twitter

Callista medarbetare Jan Västernäs Callista medarbetare Peter Merikan

The Perfect Desktop

// Jan VästernäsPeter Merikan

Idag skall Peter berätta om hur han konfigurerar sin Mac för att uppnå en bra arbetsmiljö för sina utvecklingsprojekt.

Jan : Peter jag har förstått att du scriptar det mesta av uppsättningen ?

Peter : Jag det stämmer, systemutveckling är ett hantverk och datorn är mitt snickarbälte:-) Så det är värt att lägga lite tid på att få den effektiv. Fördelen med att scripta installationer och konfiguration är att man får bättre kontroll. Det blir väldigt enkelt att återskapa en miljö tex efter en krash eller om man byter dator eller vill jobba på flera olika maskiner.

Jan : Ok det låter bra, vill du berätta hur du går tillväga om du börjar med en tom maskin ?

Peter : Förutsättningen är att MacOs redan är installerat. I det här sammanhanget pratar man ofta om “dotfiles”. Det handlar om de text-baserade konfigurations-filerna som styr konfigurationen för olika applikationer. De är ju som default dolda och några exempel är ~/.zshrc för z-shell, ~/.vimrc för vim osv. Det finns många olika exempel på olika samlingar av dotfiles att hitta på nätet och mina ligger också i ett öppet repo på github.

Eftersom alla mina dotfiles ligger i ett externt git-repo på github https://github.com/merikan/dotfiles får jag alltid in samma konfiguration. Genom att titta på commit-historiken kan jag även följa vilka ändringar jag gjort genom årens lopp. Har hållit på att finslipa detta under nästan 15 år så det har hänt lite.

Alternativet hade ju varit att göra alla konfigurationsändringar manuellt i enskilda dotfiler på min dator. Det handlar om ett 30-tal olika filer för mig. Idag finns ju ingen seriös utvecklare som skulle utveckla kod utan att jobba med ett externt repo med versionhantering, men att tänka på samma sätt med dotfilerna är det inte så många som gör ännu.

Jan : När du framställer det på det viset så låter det ju helt självklart ! Nu har vi alla dotfiles på github och vad gör du nu då ?

Peter : Första steget är att hämta hem dotfilerna. Jag öppnar en terminal och skriver

$ git clone https://github.com/merikan/dotfiles .dotfiles

Då blir jag promtad om att installera xcode command line tools. Det gör jag och sedan kan jag köra clone-kommandot igen.

$ git clone https://github.com/merikan/dotfiles .dotfiles
$ cd .dotfiles
$ ./install

Sista raden är den som triggar allt som händer. Och det är inte bara att sätta upp konfigurations-dotfilerna utan även att installera alla applikationer som jag vill använda.

Jan : Jaha - det sa du inte i början ?

Peter : Nej man kan ju inte avslöja allt direkt. install-scriptet kommer från en produkt som heter Dotbot. Dotbot fixar till allt som jag vill skall hända med konfiguration och applikationer. Jag styr vad den skall göra med hjälp av en egen konfigurationsfil som också ligger på mitt github-repo. https://github.com/merikan/dotfiles/blob/master/install.conf.yaml

Dotbot gör följade saker

  • Skapar kataloger
  • Symlänkar in alla konfigurations-dotfiler på rätt ställen
  • Installerar olika programvaror i en tvåstegsraket
  • Drar igång sdkman för att installera olika javaversioner och annan JVM-baserad programvara som tex Groovy, Scala, Kotlin, Ceylon, Ant, Gradle, Grails, Maven. Jag har gjort ett eget script som jag kallat för sdkit för att styra sdkman.
  • Drar igång homebrew för att installera resten av applikationerna. Jag har gjort ett eget script som jag kallat för brewit för att styra homebrew.

Dessa saker installeras mha homebrew

brew "aria2"                           # multi-protocol & multi-source command-linedownload utility
brew "asciinema"                       # record and share terminal sessions
brew "bash" 
brew "bash-completion" 
brew "brew-cask-completion" 
brew "ccat"                            # colorizing cat  
brew "clair-scanner"                   # scan local docker images
brew "cloc"                            # count lines of code  
brew "cowsay"                          # the cow says  
brew "ctop"                            # top-like interface for container metrics  
brew "curl"                            # curl
brew "dfc"                             # displays file system space usage using graphs and colors
brew "diff-pdf"                        # visually compare two PDF files
brew "wagoodman/dive/dive"             # exploring a docker image, layer contents etc 	ways to 
brew "doxygen"                         # Generate documentation from source code 
brew "fasd"                            # quick access to files and directories
brew "ffmpeg"                          # record, convert and stream audio and video
brew "fzf"                             # a command-line fuzzy finder
brew "ffmpeg"                          # to record, convert and stream audio and video 
brew "go"                              # golang sdk
brew "goreleaser/tap/goreleaser"       # release automation tool for Go projects
brew "ghq"                             # git remote repository management made easy
brew "gibo"                            # easily accessing gitignore boilerplates
brew "git"                             # cli client for git
brew "git-flow-avh"                    # git-flow addon for git client
brew "gitleaks"                        # audit git repos for secrets
brew "git-secret"                      # scan git commits for secrets and credentials
brew "gnupg"                           # gpg
brew "gron"                            # make JSON greppable!
brew "htop"                            # an interactive process viewer for Unix
brew "httpie"                          # HTTP command-line client
brew "hugo"                            # open-source static site generator
brew "icdiff"                          # improved colored diff
brew "imagemagick"                     # create, edit, compose, or convert bitmap images
brew "jenv"                            # manage your java environment
brew "jid"                             # drill down JSON interactively by using filtering queries
brew "jq"                              # command-line JSON processor, like sed
brew "jo"                              # small utility to create JSON objects
brew "joplin"                          # note taking and to-do application 
brew "kompose"                         # A conversion tool to go from Docker Compose to Kubernetes
brew "kubectl"                         # kubernetes controller
brew "kubectx"                         # kubectx: manage and switch between kubectl contexts, kubens: 
brew "kubernetes-helm"                 # helm packagemanager for kubernetes
brew "kubespy"                         # observing Kubernetes resources in real time
brew "johanhaleby/kubetail/kubetail"   # tail Kubernetes logs from multiple pods
brew "jesseduffield/lazygit/lazygit"   # simple terminal UI for git commands 
brew "lnav"                            # watch and analyze your log files from a terminal. 
brew "lua"                             # a powerful, efficient, lightweight, embeddable scripting
brew "mackup"                          # keep application settings in sync 
brew "maven-completion"                   
brew "mas"                             # Mac App Store command-line interface
brew "midnight-commander"              # visual file manager
brew "mitmproxy"                       # a free and open source interactive HTTPS proxy
brew "mplayer"                         # UNIX movie player
brew "ncdu"                            # a disk usage analyzer with an ncurses interface
brew "nmap"                            # port scanning utility for large networks
brew "nativefier"                      # Make any web page a desktop application
brew "node"                            # node.js
brew "openshift-cli"                   # openshift cli 
brew "packer"                          # package VMs 
brew "packer-completion" 
brew "plantuml"                        # draw UML diagrams
brew "pip-completion"                   
brew "potrace"                         # transforming bitmaps into vector graphics
brew "python"                          # python programming
brew "reattach-to-user-namespace"      # Reattach process (e.g., tmux) to background
brew "rest-shell"                      # Spring HATEOAS-compliant REST shell
brew "ripgrep"                         # recursively searches directories for a regex pattern
brew "rsync"                           # provides fast incremental file transfer.
brew "ruby"                            # ruby environment
brew "shellcheck"                      # a static analysis tool for shell scripts
brew "ssh-copy-id"                     # ssh copy 
brew "stunnel"                         # SSL tunneling program
brew "the_silver_searcher"             # ag a code searching tool similar to ack
brew "tig"                             # text-mode interface for git
brew "tldr"                            # Simplified and community-driven man pages (https://tldr.sh/)
brew "tmux"                            # terminal multiplexer
brew "tree"                            # list contents of directories in a tree-like format
brew "vim"                             # highly configurable text editor
brew "watch"                           # execute a program periodically and watch the output
brew "wget"                            # non-interactive network downloader
brew "yarn"                            # JavaScript package manager
brew "youtube-dl"                      # download videos from youtube and many more sites
brew "zsh"                             # shell 

### ---------------------------------------------------- ###
### Casks (http://caskroom.io/)             ###
### ---------------------------------------------------- ###
# Note: Casks with version 'latest' will not be updated due to no checksum change
cask "java"                            # java 
cask "adium"                           # instant messaging
cask "alfred"                          # a must have for boost productivity 
cask "android-sdk"                     # android sdk
cask "android-studio"                  # android IDE 
cask "android-file-transfer"           # transfer files from Android device 
cask "arq"                             # backup for mac
cask "asciidocfx"                      # markup editor and pdf,epub, mobi,docbook creator
cask "atom"                            # yet another editor
cask "backuploupe"                     # browse your timemachine backups
cask "bartender"                       # organize your menu bar icons
cask "bitbar"                          # put the output from any script or program in your Menu Bar
cask "brave-browser"                   # privacy focused, performance oriented browser
cask "calibre"                         # e-book reader and library management application
cask "clementine"                      # music player and radio streamer
cask "chromium"                        # open-source browser
cask "cyberduck"                       # client for FTP and SFTP, WebDAV, and cloud storage
cask "dash"                            # API documentation browser
cask "dbvisualizer"                    # universal database tool (skip Java deps)
cask "docker"                          # docker for mac
brew "docker-completion"               # docker completion
brew "docker-compose-completion"       # docker compose completion
brew "docker-machine-completion"       # docker machine completion
cask "dropbox"                         # personal cloud storage service 
cask "eclipse-java"                    # eclipse ide for java developers
cask "balenaetcher"                    # Burn images to SD cards & USB drives, safely and easily.
cask "evernote"                        # taking notes
cask "expandrive"                      # map a drive to any cloud
cask "flux"                            # get rid of the blue light
cask "firefox-developer-edition"       # a browser
cask "gimp"                            # an Image Editor (I probably never be able to learn)
cask "gitkraken"                       # Git GUI client for Windows, Mac and Linux 
cask "gitup"                           # awesome Git Gui Client 
cask "google-chrome"                   # a browser 
cask "google-photos-backup-and-sync"   # Google Photos Backup And Sync
cask "hammerspoon"                     # powerful automation of MacOS, actions and wm
cask "handbrake"                       # open source video transcoder
cask "horos"                           # a free, open source medical image viewer
cask "hyperswitch"                     # awesome keyboard window switcher for Mac
cask "icolors"                         # a color picker and hex converter
cask "inkscape"                        # A powerful, free design tool
cask "insomnia"                        # superduper rest client
cask "intellij-idea"                   # awesome java IDE
cask "iterm2"                          # Terminal emulator for macOS
cask "jdiskreport"                     # analyses your disk drives and shows charts and tables
cask "joplin"                          # a FOSS note taking and to-do application
cask "karabiner"                       # keyboard customizer for macOS
cask "kdiff3"                          # utility for comparing and merging files and directories
cask "keepassxc"                       # a great FOSS Password Manager
cask "keystore-explorer"               # open source GUI replacement for the keytool and jarsigner
cask "keybase"                         # crypto for everyone!
cask "keycastr"                        # keystroke visualizer
cask "markright"                       # a markdown editor
cask "meld"                            # visual diff and merge tool
cask "minikube"                        # kubernetes mini
cask "minishift"                       # openshift mini
cask "moeditor"                        # all-purpose markdown editor
cask "obs"                             # foss for video recording and live streaming
cask "opera"                           # browser
cask "mysqlworkbench"                  # gui tool for mysql 
cask "paintbrush"                      # clean and simple paint program
cask "pencil"                          # open-source GUI prototyping tool
cask "phoenix-slides"                  # image viewer
cask "postman"                         # nice rest client
cask "robo-3t"                         # free lightweight GUI for MongoDB 
cask "skype"                           # video conf
cask "sketch"                          # sketchapp - design tool
cask "sketch-toolbox"                  # some useful plugins for sketchapp
cask "skitch"                          # take screenshots of all or part of your screen
cask "sonos"                           # Sonos controller
cask "spectacle"                       # move and resize windows
cask "soapui"                          # soap and rest testing tool
cask "sonos"                           # controller for sonos speakers
cask "sourcetree"                      # awesome git client 
cask "spectacle"                       # move and resize windows
cask "spotify"                         # music for everyone
cask "sublime-text2"                   # text editor
cask "thunderbird"                     # free email application from Mozilla
cask "tunnelblick"                     # free, open source graphic user interface for OpenVPN
cask "vagrant"                         # vm management
brew "vagrant-completion"                      
cask "virtualbox"                      # virtualizer for x86 hardware
cask "virtualbox-extension-pack" 
cask "visual-paradigm-ce"              # software modelling tool
cask "visual-studio-code"              # a great editor
cask "vlc"                             # media player
cask "wavebox"                         # desktop app for web (gmail)
cask "xquartz"                         # X windows on Mac
cask "yed"                             # graph editor
cask "zoomus"                          # video communications

## quick-look-plugins see:https://github.com/sindresorhus/quick-look-plugins
cask "qlcolorcode"                     # preview source code files with syntax highlighting
cask "qlstephen"                       # preview plain text files with unknown file extension.
cask "qlmarkdown"                      # preview Markdown files
cask "quicklook-json"                  # preview JSON files
cask "betterzip"                       # preview archives
cask "quicklook-csv"                   # preview CSV files
cask "qlimagesize"                     # display image size and resolution
cask "webpquicklook"                   # preview WebP images
cask "suspicious-package"              # preview the contents of a standard Apple installer package
cask "qlvideo"                         # display thumbnails, static previews, cover art and metadata     for video files
## -- fonts                     
cask "font-fira-code"                  # monospaced font with programming ligatures
cask "font-go-mono"                    # golang fonts   
cask "font-hasklig"                    # a code font with monospaced ligatures
cask "font-inconsolata"                # a great programmers font
cask "font-monoid"                     # a ppen source coding font with ligatures
cask "font-monoisome"                  # monoid with Font Awesome support

### ---------------------------------------------------- ###
### Mac App Store command line interface    ###
### https://github.com/mas-cli/    mas      ###
### ---------------------------------------------------- ###

mas "Bredbandskollen", id: 1147976909
mas "Keynote", id: 409183694
mas "Kindle", id: 405399194
mas "Numbers", id: 409203825
mas "Pages", id: 409201541
mas "Pocket", id: 568494494
mas "Slack", id: 803453959
mas "The Archive Browser", id: 510232205
mas "The Unarchiver", id: 425424353
mas "Tomato One", id: 907364780
mas "Twitter", id: 409789998
mas "Wunderlist", id: 410628904

Jan : Ja det var ju en ganska lång lista. Funderar på hur lång tid det skulle ta att installera det manuellt ? Och hur mycket fel det skulle kunna bli ?

Peter : Det skulle nog ta lite tid. När jag kör det som ett script tar det c:a 30 minuter men då kan jag ju ta en fika under tiden.

Sedan har vi några saker till som jag gör i separat steg. Installerar powerline fonts som jag använder för att få tydligare effekter i terminalen vilket är ett av mina viktigaste arbetsverktyg.

$ cd /tmp && git clone https://github.com/powerline/fonts.git && cd fonts && ./install.sh

Jan : lite mer gui-effekter på promten då alltså ?

Peter : Javisst ! Sedan är det en hel del inställningar i MacOS som jag vill ändra tex hotkeys för att nå olika desktoppar osv. Det gör jag också med ett script som startas.

$ ~/bin/macos_settings

Scriptet innehåller ett 100-tal inställningar som passar min smak. Bara för att ta ett exempel

echo "Finder: show hidden files by default"
defaults write com.apple.finder AppleShowAllFiles -bool true

Några manuella steg som avslutning. Använd zsh istället för bash

$ chsh -s /bin/zsh

Vissa programvaror består av en mer komplex struktur och konfiguration som gör att det blir väldigt krångligt om man skulle scripta installationen av dem. Lösningen är då att ha dem liggandes på Dropbox och att skapa länkar dit. Det handlar tex om

  • atom
  • bartender
  • gitup
  • insomnia
  • sublime-text-2
  • vscode
  • spectacle

Mackup hjälper mig att lösa detta.

$ mackup restore

Det är några manuella steg till men totalt sett brukar det ta c:a 30 minuter så tillsammans med install-scriptet handlar det om ungefär en timme.

Jan : Då har vi gått från en tom dator till en superladdad välkonfigurerad fungerande utvecklingsmiljö på en imponerande snabb tid tycker jag. Vad gör du löpande ?

Peter : Jag brukar köra ./install ungefär en gång per vecka eller när det behövs. Då får jag in uppdateringar av programvaror ifall det finns sådana och även uppdatering av konfiguration om jag ändrat på github. Innebär också att jag löpande testar mina egna script så de funkar ifall det skulle bli en krash. Tar några minuter att göra beroende på hur mycket som ändrats.

Jan : Tack Peter för beskrivningen av detta. Känns som vi dokumenterat detta ganska övergripande men det finns mer detaljer att dyka ner i vid intresse ?

Peter : Så är det, skall inte vara för enkelt :-) Nä nu kastar jag mig tillbaks till promten igen.

Tack för att du läser Callistas blogg.
Hjälp oss att nå ut med information genom att dela nyheter och artiklar i ditt nätverk.

Kommentarer