Strekmann

2017-04-10
sigurdga

flex-basis på ios9

Det ser ut som flex-basis ikke bør være noe annet enn auto eller andre former for full bredde når flex-direction: column. Hvis denne for eksempel er satt til 25 % fordi elementet skal ta 25 % av bredden for desktop med flex-direction: row, og du ikke har endret flex-basis, så vil dette føre til at elementene legger seg oppå hverandre.

Dette ser ut til å gjelde Chrome og Safari på IOS9. Ikke IOS8, eller andre operativsystemer. For eksempel vil flex-basis 25% likevel gjøre at elementet fyller hele bredden når flex-direction: column, for alle andre.

Det er kanskje bedre å rendre mobilversjonene først, og så endre for større skjermer med media-query, enn motsatt. Men det er sikkert merkelige problemer da også.

2017-03-21
sigurdga

Hvordan vi gjør backup

Backup er vanskelig. Det er mange hensyn å ta, med tanke på sikkerhet, personvern og stabilitet. Vi tar automatisk, kryptert, inkrementell backup med Borg, som vi lagrer på to steder.

For hvert av våre prosjekter kjører vi en nattlig cronjobb som gjør backup med Borg. For prosjekter med mye tekst, f.eks dumper fra databaser, bruker vi komprimering. Vi har en sentral backupserver som mottar allerede krypterte backupdata, og tar vare på dem. Vi tar vare på én kopi per dag den første uka, så tar vi vare på ukeskopi resten av måneden, og seinere månedskopier for ti år.

Vi har sekundær backupserver som henter siste versjon av all backup tidlig på morgenkvisten, slik at vi har alt i minst to kopier.

På grunn av krypteringen, kan ikke backupdata åpnes på backupserverne uten nøkkelen som ble opprettet da første backup ble laget. Denne nøkkelen har vi lagret i PGP/GnuPG-kryptert distribuert Git-repository (med Pass). Og nøkkelen for å åpne dette hemmelige nøkkelrepositoriet ligger på tre krypterte minnepenner. Det kan høres voldsomt ut, og vi bør kanskje vise dette med en tegning, men det er alltid vanskelig å ta vare på passord, for om det lagres noe sted, trenger man alltid et nytt passord eller en ny nøkkel.

For prosjektene som vi deployer med Ansible, har vi backup av database for seg, og backup av opplasta eller genererte filer (shared) for seg. For prosjektene som vi ennå ikke har satt opp med Ansible, tar vi backup av prosjektrota med alle filer. Etter hvert som flere prosjekter blir deployet med Ansible, tar vi bare backup av database og opplasta data. Selve koden er lagret i Git, hos oss og hos Gitlab.

Alle backupsett har blitt testet med kopi av opprinnelig nøkkel, så vi vet at det vil virke om uhellet skulle være ute. Og backup-oppsettet har vi dokumentert på vår lukkede wiki på Gitlab.

Andre ting, som mail og annen serverkonfig, gjør vi backup av på samme måte i det samme systemet, men for noen eldre systemer bruker vi Attic som Borg har blitt bygget på.

2017-02-20

Eslint-regler

Vi prøver å ha et minimalt sett av Eslint-regler, samtidig som vi baserer oss på Airbnbs regelsett. Det betyr motsetninger, men akkurat nå er regelsettet vårt definert slik:

{
    "parser": "babel-eslint",
    "extends": "airbnb",
    "rules": {
        "arrow-body-style": ["error", "always"],
        "brace-style": [ 2, "stroustrup", {
            "allowSingleLine": true
        }],
        "indent": [ 2, 4, {"SwitchCase": 1} ],
        "max-len": 1,
        "no-underscore-dangle": ["error", {
            "allow": [
                "_id",
                "_type",
                "_json",
                "__INITIAL_STATE__"
            ]
        }],
        "no-unused-vars": [ 1, {
            "vars": "all",
            "args": "after-used",
            "argsIgnorePattern": "req|res|next"
        }],
        "quotes": [ 2, "single"],
        "react/forbid-prop-types": 0,
        "react/jsx-filename-extension": [2, {
            "extensions": [".js", ".jsx"]
        }],
        "react/jsx-indent": [2, 4],
        "react/jsx-indent-props": [2, 4],
        "react/prefer-stateless-function": 0,
        "react/require-default-props": 0,
    },
}

Vi håper å lage en pakke for å forenkle vår definisjon av hvordan koden ser ut. Men det får bli en annen gang.

2017-01-24
sigurdga

Aggressiv telefonselger

For ca en halvtime ringte det en telefonselger. Han het Anders og ringte fra 180.no. Og så mista han headsettet.

Han fortalte hva tjenesten gikk ut på, og at firmaet mitt kunne være oppført under bransjeord. Det sa jeg at jeg ikke var interessert i.

Han prøvde å si at 1.3 millioner bruker appen deres før de søker i google. Og jeg var tydelig på at jeg ikke trengte det.

Han spurte rett ut om jeg ikke ville ha flere kunder. Det stemmer, sa jeg, vi trenger ikke flere kunder.

Vi hadde en samtale om at det var lett å bli lurt av sånne telefoner, og at om han var en good guy i forhold til de andre, så skulle jeg likevel ikke ha noe.

Jeg var tydelig på at jeg ikke skulle ha noe.

Han skulle ikke si noe til sjefen, og skulle bare la det stå. Fint, sa jeg.

Så får vi se. Nå har jeg i alle fall skrevet det ned mens jeg fortsatt husker det, i tilfelle det skulle dukke opp en regning.

Telefonterror-appen fanget ikke opp nummeret hans, men det gjør det nå.

2016-12-30
sigurdga

Når Relay ikke kan lage clientMutationId

Vi er inne i en serie av feilmeldinger fra Relay som ikke alltid er like enkle å forstå seg på. Nå skal vi se hva Relay egentlig klager på når den sier at den ikke kan lage en clientMutationId:

Cannot set property ‘clientMutationId’ of undefined

Eller:

Cannot create property ‘clientMutationId’ on string ‘[…]’

Den første betyr at du ikke returnerer noe fra mutateAndGetPayload, og den andre betyr at du returnerer en streng som ikke kan brukes av Relay til å lage clientMutationId.

Om du bare har en “lokal” database-id, som du vil bruke til å lage en globalID som Relay kan fjerne i frontend, kan du bruke toGlobalId(), som tar inn et typenavn og en lokal id og returnerer en global ID. Dette gjør du i outputFields.

Arkiv