Docker fungerar inte på MacBook M1 (än)

2020-11-22 | Teknik

MacBook med Apples egendesignade processor började säljas 17 november.

Mitt intryck efter några dagar med en MacBook Air M1 är att datorn kommer med enorma förbättringar. Den är betydligt starkare än sina föregångare vad gäller prestanda. Och batteritiden sägs ha fördubblats (har dock inte verifierat detta).

Apples nya egentillverkade processor har en annan arkitekturen än Intels, som använts i tidigare MacBooks. Skillnaden i processor-arkitektur gör att program byggda för Intel-processor inte fungerar rakt av på nya MacBook.

För många applikationer lösningen tills vidare att använda Rosetta 2. Rosetta 2 översätter applikationen till någonting som den nya processorn förstår. Vi kan nog räkna med att det snart släpps kompatibla versioner av de flesta Mac-appar som ännu är under aktiv utveckling, så att Rosetta 2 med tiden blir överflödig.

Rosetta 2 löser dock inte alla problem. Det största problemet jag noterat hittills är att Docker än så länge inte går att köra på MacBook M1. Enligt Docker Inc så är dock arbetet med en ny M1-kompatibel version av applikationen i full gång (extern länk).

Docker på MacBook M1, som det ser ut idag

Med tanke på hur centralt Docker blivit för mjukvaruutveckling så är det nog bara en tidsfråga innan det kommer en fungerande Docker-release.

Kanske till jul?



PS. En recension för MacBook M1 gjord av MacWorld (IDG)
Test: MacBook Air med M1-processor – makalöst bra dator

Swish QR-koder via APIt

2019-05-27 | Teknik

Uppdatering: En mer utförlig beskrivning av hur du anropar Swish QR-generator API samt exempel i cURL och Python finns här.

Swish QR-koder förenklar betalningar via Swish. Genereringen av QR-koder kan ske statiskt eller dynamiskt.

Statiska QR-koder är inte specifika för ett visst köp utan kan återanvändas för flera betalningar. Ett exempel är försäljning av en viss typ av vara med ett fast pris (t.ex. enskilda majblommor) – betalningsuppgifter så som mottagare, meddelande och belopp förändras inte från försäljning till försäljning utan är konstanta. Statiska QR-koder går enkelt att skapa via QR-generatorn på Swish hemsida.

Dynamiska QR-koder är bra när betalningsuppgifterna varierar från köp till köp, exempelvis vid varuförsäljning på nätet. Vi ska titta närmare på dynamiska QR-koder. Dessa kan skapas via Swish QR API.

Dynamiska QR-koder

Nedan ska vi använda Swish QR API för att generera en QR-kod som innehåller en mottagares Swishnummer, ett betalningsmeddelande och ett belopp. När användaren scannar QR-koden med Swish-appen så blir dessa uppgifter förifyllda.

Några exempel med curl

Första steget blir att bekanta sig med Swish QR-API. Detta kan vi med fördel göra med curl.

API-dokumentationen (under General QR Code > View Guide) ger vägledning kring hur ett API-anrop ska se ut. API-resursen som vi är ute efter kallas ”Prefilled” i dokumentationen och har (idag) urlen:

https://mpc.getswish.net/qrg-swish/api/v1/prefilled

API-servern förväntar sig ett POST-anrop med Content-Type: application/json. Övrig data ska finnas i request-bodyn. Det krävs ingen autentisering i Prefill-fallet.

Dokumentationen innehåller inget konkret exempel på hur en Prefilled-förfrågan ska se ut. Däremot finns där ett JSON-schema som specificerar anropets utseende, så att det går att validera om ens anrop är okej.

Vi kan ta en JSON-validator till hjälp (det finns en t.ex. här) och utifrån JSON-schemat konstruera ett anrop som är okej. Efter en stunds testande med curl så fick jag fram kommando som hämtar en QR-kod och sparar den till output.png:

curl –data ’{”format”:”png”,”size”:300,”message”:{”value”:”test message”,”editable”:true},”amount”:{”value”:100,”editable”:false}}’ –header ”Content-Type: application/json” –output output.png –request POST https://mpc.getswish.net/qrg-swish/api/v1/prefilled

Om man scannar QR-koden så får man ett förifyllt betalmeddelandet (”test message”) och belopp (100 kr). Vi tittar snart på hur man även kan lägga till en mottagare.

curl-parametrar:

  • –data ’<json-sträng>’ är datat i anropets request-body
  • –header ”Content-Type: application/json” lägger till en header i anropet som säger att anropet innehåller json-data
  • –output output.png spara serverns respons (bild-datat) till en lokal fil
  • –request POST är anropets-metod; vi skickar ett POST-anrop

Det finns information om request-bodyns format i dokumentationen. I korthet: format är filformatet vi vill ha QR-koden i och size är bildens pixelstorlek (300 innebär 300×300 pixlar). editable styr huruvida användaren ska kunna ändra innehållet i respektive fält.

Om man även vill fördefinera en betalningsmottagare så gäller samma mönster som för message och amount:

"payee":{"value":"123456789","editable":true}

Om mottagarnumret är felaktigt så genereras QR-koden, men går inte att scanna i Swish-appen. Här är den färdiga QR-koden:

Swish QR-kod med meddelande (”test message”) och belopp (100). Mottagare är inte förifylld. Bildstorlek: 300×300 pixlar. Filstorlek: 38KB

När vi nu har ett fungerande anrop till API-servern så vet vi tillräckligt för att implementera detta på en hemsida eller webbtjänst.

Tidsbegränsade lösenord

2019-05-16 | Teknik

Från MySQL 5.7.4 och framåt är alla användares lösenord tidsbegränsade. Om en användares lösenord inte ändrats på 365 dagar så blir användarkontot nedlåst.

Denna förändring är bra att ha koll på, då en låst MySQL-användare kan innebära att webbfrontar och andra applikationer som beror på databasen slutar fungera. För affärskritiska system kan det vara värt att överväga om det inte är bäst att stänga av denna inställning.

Stänga av inställningen

Så här stänger man av det nya beteendet med tidsbegränsade lösenord (i detta exempel för root-användaren). Kolla först att inställningen är påslagen:

> mysql -u root -p
mysql> SHOW GLOBAL VARIABLES LIKE 'default_password_lifetime';
+---------------------------+-------+
| Variable_name | Value |
+---------------------------+-------+
| default_password_lifetime | 360 |
+---------------------------+-------+
1 row in set (0.00 sec)

”360” innebär 360 dagar innan lösenordet löper ut. Man stänger av tidsbegränsningen genom att ändra värdet till noll:

mysql> ALTER USER 'root'@'localhost' PASSWORD EXPIRE NEVER;

Det är alltid bra att kontrollera att det gick som det skulle, genom att köra ”SHOW GLOBAL…”-kommandot igen och verifiera att värdet ändrats från 360 till 0.

Sätta lösenordet

Om lösenordet redan har gått ut för användaren så får man först sätta det på nytt, annars får man felmeddelandet ”ERROR 1820 (HY000): You must SET PASSWORD before executing this statement”.

mysql> SET PASSWORD FOR 'root'@'localhost' = PASSWORD('somepassword');