All posts by claus

Amazon Cognito/IAM and Facebook login, part one

This guide will show you how to create services at Amazon and pair them with a Facebook login in order to access resources within the rich Amazon ecosystem.

A later post will show basic javascript code so you can login and retrieve information from a DynamoDB table.

I recommend reading ‘Serverless Single Page Apps’ by Ben Rady. You can buy the book in print and/or pdf from This gives a nice introduction to Amazon’s web-services.

Perform the following steps to create the required amazon services in order to authenticate using Facebook credentials.

Open a browser at and login/register and add a new app. In the dashboard the App Id will be used when creating a pool at Amazon.

Open a browser at and login/register.

Click on ‘Cognito, User Identity and App Data Synchronization’ in the third column in the section Mobile Services.


Click on ‘Managed Federated Identities’ in the next step.


Click on ‘Create new identity pool’.


Enter the name of the new pool in ‘Identity pool name’. Here I name it Generic Pool. Do not enable ‘Unauthenticated identities’ unless you provide anonymous access. Select the Facebook tab in ‘Authenticated providers’ and enter your App Id provided by Facebook and click ‘Create Pool’.


Click Allow to grant access to your ressource.


When access have been granted some example code shows how to access the ressource, in this case javascript.


Use the Dashboard to see information about the pool.


Open ‘Identity & Access Management’ in ‘Security & Identity’ in the second column.


Click on Roles in the left column and your newly created roles appear.


Clicking on Cognito_GenericPoolUnauth_Role shows that no policies are attached to this role. Since we don’t want to open up for anonymous access we just leave it as it is.


We want to allow Cognito_GenericPoolAuth_Role access to DynamoDB so click on ‘Attach Policy’ in ‘Managed Policies’ in the Permissions tab.


Select AmazonDynamoDBFullAccess and click ‘Attach Policy’ to allow this role to use DynamoDB.


The policy is then shown in ‘Managed Policies’.


Time to create tables in DynamoDB. Open and click on ‘Create table’.


In this example I create a table with a partition- and sort-key.


When the table is created you can click on the Items tab on the right side and create an item.


Clicking on the ‘Create item’ button brings up a modal window. Enter the partition key and sort key and then append any desired fields.


I’ve inserted one record which we will retrieve later.

Click on the ‘Access control’ tab on the right hand side and select Facebook as the ‘Identity provider’. Select all Actions just beneath and ‘All attributes’ in ‘Allowed attributes’ and click ‘Create policy’. This will bring up the policy on the right which you can copy and paste into an editor and we’ll use it later when create a custom policy.


Lets create a custom policy that allow access our newly created table. Click on ‘Create policy’.


Select ‘Create Your Own Policy’.


Give it a descriptive name and description and paste the policy copied from above and click ‘Validate Policy’.


Click ‘Create Policy’ to save the policy.


Add the newly created policy to a role. Select Role from the left side and ‘Create New Role’.


Enter a name for the role and ‘Next Step’.


Select ‘Role for Identity Provider Access’ and then ‘Grant access to web identity providers’.


Select Facebook from ‘Identity Provider’ and enter the Application ID that is assigned by Facebook when the application was created and click on ‘Next Step’.


Click on ‘Next Step’.


Then you are asked to attach a policy. Select the one you just created and click ‘Next Step’. You may have to search for the policy in the filter input field.


Review and click ‘Create Role’.


Click on Groups in the left pane and ‘Create New Group’.


Enter the name of the group in ‘Group Name’ and click ‘Next Step’.


Enter the name of the policy you just created in the search field and select the policy and click ‘Next Step’.


Review and click ‘Create Group’.


Click on the group you just created.


A message notifies that this group has no users. Click on ‘Add Users to Group’.


Select the user and click ‘Add Users’.


The group is created, the policy is attached, the user is added to the group.


Now is the time to put the App ID assigned by Facebook and the pool ID by Amazon to some use. We will build a simple page in html and javascript to connect to the Amazon Cognito service using the javascript SDK from Facebook and Amazon. Don’t forget to change the invalid Facebook App ID in this example from 9012345678 to the real one given by Facebook.


When clicking on the Facebook button a new window will appear with a username and password dialog. Enter your credentials. The first time you open a new app from Facebook it asks for permission to access your public profile, which is basically your name, email-address if any and user-id. Click Okay to continue.


If permission is granted a new window will show what the app then can do. This can post on Facebook on your behalf and you can limit who will receive these messages. This app won’t post any messages. Click Okay.


When you are all set this is what the page looks like.



In a upcoming post I will link to the code I have and how you move it to Amazon’s S3 storage and serve it from there. As you can see the app is run from localhost. This will change when the code is copied to S3.

I hope you have enjoyed this post. It was originally intended as an reminder to myself but I figured others might find it useful as well.

Take care.

Websocket based server written in C++, part 1

I have written some small web apps that make use of a websocket based server in C++. I use the excellent framework websocketpp that makes it a breeze to use websockets in C++. It is a header only library so you only need to add the header file in your project to use it. In some cases it does need the boost libraries and I had to install and link to the boost system. It is not a big deal adding boost on mac from macports. Get it at

The first app I wrote is based on an example that the author of websocketpp have provided on his website. I have modified it to fit my needs.

The app keeps track of a football league and while not rocket science I did learn a lot from this. It is very simple at the moment and can only keep track of goals and points and is not intended to replace the tools the big newspaper sites use for the various leagues around the world. My target audience is more the local leagues that do not have a dedicated journalist to update the table, cards given, corners and other useful information. My idea is to have friends and families update the goal score, crowdsourcing in other words.

I have also written a javascript client that talks to the server. They use json which is an integral part of javascript but not of C++. So I added nlohman/json that can be downloaded at This is also a header only framework and makes it easy to use json in C++.

I use postgresql as database. This is a database I am very comfortable with and have used it since  version 7 back in 2002.

Postgresql provides an official C++ driver I use.

The server is at and the client at

The first version had all the logic in main.cpp but I have later moved the websocket-part into a websocketserver class and database calls to a database class.

The next step was to add a simple database connection pool. When searching I came across this stackoverflow thread that inspired me.

I added pooling by using std::stack pushing and popping them on and off. Easier than I initially thought it would be.


Detect long-press in javascript


I recently had the need to detect a long-press on a button in javascript. I did a search on google on onmousedown, onclick, onmouseup, javascript and found some examples on These examples showed how to set a timeout before executing some function.

So I came up with this solution where I can perform one action depending on how long I press a button.


<!doctype html>
 <meta charset="utf-8">
 <button id="button">click</button>
 <script type="text/javascript" src="func.js"></script>


(function(window, document, undefined){
 'use strict';
 var start;
 var end;
 var delta;
 var button = document.getElementById("button");

 button.addEventListener("mousedown", function(){
   start = new Date();

 button.addEventListener("mouseup", function() {
   end = new Date();
   delta = end - start;
   if (delta > 0 && delta < 500) {
   alert("less than half second:");
 if (delta > 500 && delta < 1000) {
   alert("more than half second and less than a second:");
 if (delta > 1000) {
   alert("more than a second:");
})(window, document);

I forgot where I found the IIFE syntax example which I build this upon. There are many.

I assume there are many ways to detect a long-press.

Apple har lanceret ny iPad Pro, nye iPhone modeller

Onsdag den 9. sept. 2015 har Apple, som forventet, lanceret en iPad Pro. Det er en iPad med større skærm, og sikkert til glæde for Bill Gates, en stylus, som en følgesvend. Bliver spændende at se, hvor tro denne bliver. Men Apple har i mange år, især den gode Steve Jobs, peget fingre af Microsoft, fordi de udstyrede deres mobiler med en stylus. Men nu vælger Apple altså at bruge dette værktøj.

Det kan siges til Apples forsvar, at de er gode til at time introduktionen af ting de førhen har forsaget. De har en tålmodighed som få andre firmaer besidder, og når de først går i gang, så har de lagt en nøje plan for hvordan den udføres. Og med den store skærm, mener de tiden er inde.

Der kom også nye iPhones, med haptic feedback, nye funktioner som kan vise indholdet af en mail, uden at åbne den, forhåndsvisning vil de fleste nok kalde det. Så har de introduceret hvad der svarer til højre-klik på en PC, det være sig Windows, Linux, Mac OS X.

Og så har de lavet en smart ting når man tager billeder. De tager nogle billeder før, og nogle efter, man har taget billedet. Om den automatisk går i gang med at tage billeder, inden man trykker, og så smider de væk, som er ældre end x sek. ved jeg ikke. Men der kan laves små film, og det kan bruges i mange situationer. Foruden billeder med familie og venner, tror jeg det kommer til at blive brugt meget i verdens brændpunkter, dvs. fotodokumentarisme på et nyt niveau, der kan skabe meget stærke og skelsættende billedserier.

Touch, feedback, hele måden man bruger en mobil på, forandres med de nye mobiler og den kommende iOS 9.

Der var stillet store forventninger til det nye  tv. Mange havde regnet med det blev en boks ala. det vi kender i dag, og at det var indholdet, som var det skelsættende. Apple mener selv det er apps, dvs. programmer, som kommer til at definere vores måde at konsumere indhold på. De brugte Netflix og hulu som eksempel på programmer som er med til at forandre vores måde at se fjernsyn på. For mine børns vedkommende har den nye hverdag været her et par år nu. De har set masser af film på youtube, og det kommer de til at fortsætte med. Om de gider at flytte det over på en lille boks som er koblet på et fjernsyn, usikker.

Skal de have ændret deres vaner, er det muligheden for at spille spil, men heller ikke der ser jeg noget nyt, som ikke kan dækkes idag med deres iPad’er. Jeg er vildt fascineret når de kan sidde i sofaen dybt begravet i Minecraft, sidde og snakke med hinanden i den virkelige verden, og gå rundt i den virtuelle, på samme tid.

Apple lancerede også  watch i nye farver, samt nye armbånd. Tjaa, nyheder måske, men det synes jeg er i den lette ende.

Der er to ændringer ved denne lancering som glæder mig. Dels har Apple fokus på at få flere kvinder til at præsentere deres produkter, dels har de sat deres priser på lagring i iCloud ned. De har nu 50 GB, 200 GB samt 1 TB til hhv. $0,99, $3,99 samt $9,99. I norske priser er det 8 kr., 29 kr. samt 79 kr.

Apple har internt startet flere programmer som skal få kvindeandelen i vejret. Ved forrige lancering begyndte de at have kvinder med, og det er en tendens som heldigvis er kommet for at blive.

En anden tendens vi ser i deres præsentation er at de i større henvender sig til den almindelige, måske ikke altid så teknisk kyndige forbruger, illustreret ved at et par var inviteret til et bryllup, og så sad de ved det kommende  tv og så på tøj, som de så endte med at bestille. Ved at gøre begivenheden mere folkelig, håber de at associere sig selv med gode oplevelser, det være sig med at tage billeder, købe ind (apple pay), retningsangivelser, musik, film, træning ( watch) og andre gøremål.

Apple lancerer en ny stueenhed

Onsdag den 9. sept. 2015 vil Apple lancere nogle nye produkter, blandt andet nye udgaver af deres kendte iphone serie. Der kommer et lidt nyere kamera, lidt kraftigere processor, lidt stivere ramme, og ikke mindst en haptic feedback mekanisme, som kendes fra deres nye macbook og pro linie af bærbare, hvor musepegefeltet ikke længere bevæger sig, men ryster og får os til at tro, pegefeltet faktisk har bevæget sig.

Der kommer også en opfølger til appletv. Rygterne har længe verseret, og de sidste informationer går på at den bliver lidt dyrere end den nuværende generation. Der vides ikke hvad dette skyldes, ej heller hvilken form den helt præcis får. Det er nogenlunde sikkert der kommer en ny processor, en A8, som sidder i den nuværende iphone 6 og 6plus. Den vil måske have talegenkendelse, heraf slagordet ‘Hey Siri, give us a hint.”

Men prisøgningen er lidt pudsig. Og Apple kan ikke bare lancere en opfølger til appletv, uden at der kommer helt nye funktioner til. Et gæt fra min side er at der følger en trackpad-lignende enhed med, som der kan navigeres med, og som helt erstatter den nuværende fjernbetjening. Det kan forklare hvorfor den bliver dyrere. Men de har helt sikkert andre es de hiver ud af ærmet.

Det bliver uanset spændende hvad som løber af stabelen.

Der købte jeg et  ur

På vej hjem fra ferie i DK, stoppede vi ved Apple Store i Malmö, og jeg købte et  watch sport 42mm space gray UR.

Det grå ur var et naturlig valg. Jeg kan godt lide farven, er forholdsvis neutral. Uret fås også som sølvfarvet. Armbåndet fås i hvid, blå, grøn og rosa er også meget pæne, og sprælske, men jeg ser ikke for mig at gå rundt med sådanne farver. Skulle jeg have valgt en anden farve, var det blevet den sølvfarvede med det grønne armbånd. Armbåndet kan byttes, så det kan passer til forskellige anledninger.

Uret virker med en iphone 5 eller nyere. Da jeg skulle parre uret med mobilen, skulle jeg tage et billede på uret af noget der lignede mælkevejen, som snurrer hurtig rundt. Det var en flot effekt, og jeg er lidt svag for sådanne, så jeg synes det er flot Apple lægger det ekstra i måden uret parres med mobilen. Andre vil mene det er unødvendig. Uanset så erstatter det en QR-kode.

Nu har jeg brugt det i lidt over en måned. I starten var det uvant. Vi har mange ting som viser dato og tid, dashboardet i bilen, mobilen, osv. at det at bruge uret til at det,  virker lidt påtaget og overflødig i starten. Først efter jeg havde gået med det en stund, det virket naturlig. Bla. når man går ud i gangen for at hjælpe ungerne med tøjet, og de spørger hvor mange minutter der er, inden de skal gå, ser jeg på uret.

Noget af det første jeg gjorde da vi kom hjem om aftenen var at lægge watchOS 2.0 beta på. Efter den var opdateret, skiftede jeg udseendet på urskiven og lagde mig til at sove med uret på håndleddet. Da jeg vågnede dagen efter, var der ikke liv i uret, og i et øjeblik strejfede tanken mig at jeg netop havde købt et nyt ur, og gjort det til et flot designet aluminium og glas. En tråd på foreslog jeg holdt begge knapper inde nogle sekunder, og heldigvis virkede uret alligevel. Tråden foreslog også jeg byttede urskiven, og det hjælper. Så der er sikkert en funktion som langsomt men sikkert æder ram, og til sidst fryser uret. Heldigvis var løsningen enkel, og jeg slap for at sende uret ind til Apple, så de kunne lægge appleOS 1.0 tilbage.

En af grundende til jeg købte uret var pulsmåleren. Den skulle efter sigenden være pålidelig. Jeg har en mio Alpha pulsmåler, som sidder på håndleddet, dvs. du slipper for en rem om brystet. Men den kunne pludselig hoppe fra 110-120 i puls til 200, mens jeg gik en tur, hvilket ikke stemte. Andre gange kunne den gå ned fra 160-170 til 90. Andre gange skulle den bruge nogle forsøg på at begynde at måle pulsen. Så til sidst var det bare irriterende.

-uret måler pulsen ca. hver tiende minut, og hvis du starter motions-app’en på uret, måler den kontinuerlig. Jeg ved ikke om den er mere robust når uret bevæger sig på håndleddet. Skærmen er ikke tændt hele tiden, men af og til har jeg set uret leder efter pulsen. Det bliver lettere at se, når trediepartsprogrammer får adgang til pulsmåleren.

Pr. idag kan runkeeper, endomondo, strava osv. ikke få adgang til pulsmåleren, fordi tredieparts-appleOS ver. 1.0-programmer afvikles på mobilen, og kun skærmbilledet sendes frem og tilbage. Med den kommende appleOS 2, kan tredieparts-programmer afvikles på uret, og så får de sandsynligvis adgang til pulsmåleren. Når jeg er ude og bevæge mig, starter jeg både runkeeper og træningsprogrammet på uret.

Træningsprogrammet kalibrerer skridtlængde med urets gps, og den bliver derfor mere nøjagtig efter et par gange, mens runkeeper og venner som kører på mobilen, bruger gps’en og kan derfor være mere nøjagtige. Så nøjagtig som en gps nu kan være.

Jeg er begyndt at sætte større og større pris på fonten som Apple har udviklet til uret. Den hedder San Francisco, og det bliver også den nye standardfont på  ios 9 og El Capitan, som kommer hhv. i september og oktober.

Apple watch

Apple lancerede, under stor bevågenhed, deres smarte ur den 24. april 2015. Produktet er det første som er udviklet uden Steve Jobs strenge blik, og har derfor været set på som en lakmustest på, om Apple vitterlig kan skabe nye platforme, som en opfølger til de meget populære iPhone og iPad, og som en ny vækstmotor.

Første lanceringsbølge traf USA, England, Kina, Hong Kong, Australien, Canada, Frankrig, Tyskland, Japan. Vi andre kan forvente at få uret i løbet af 2015.

Uret har fået en god modtagelse, uden at anmelderne er gået helt af skaftet. En form for kontrolleret begejstring. De ser uret har mange muligheder, samtidig med at de føler, uret mangler en tydelig mission.

Uret kommer sikkert til at sælge godt, på trods af at den første udgave kræver en iPhone 5 eller nyere for i det hele taget at virke. Der vil være nok personer som ønsker at prøve ny teknologi, til at salgstallene vil være pæne.

Jeg har ikke selv haft anledning til at prøve uret, og kan derfor ikke sige noget fornuftig om den daglige brug. Men ud fra de anmeldelser af bla. John Gruber, vil der være én ting, som kan gøre det til en succes. Og det er haptic feedback, som er Apples navn på den vibrering du vil mærke, når uret vil fortælle dig noget. Den har de fået meget stor opmærksomhed under udviklingen af produktet, og med god grund.

Uret har begrænset batteri, og vil efter ca. 18 timer lades op igen. For at skærmen skal være slukket så ofte som mulig for at spare på strømmen, skal uret få din opmærksomhed på anden vis, bla. via vibrering. Lykkedes Apple med dette, vil det give så stor nytteværdi, at det kan øge salgstallene markant.

I en periode pendlede jeg jævnlig lidt over to timer til og fra arbejde, og havde mobilen i bukse- eller jakkelommen. Den er som regel på lydløs, og fik jeg undervejs en sms om at købe et eller andet, var det ikke altid jeg fik læst beskeden. Her kan en diskret vibrering få min opmærksomhed, og jeg ville kunne læse korte beskeder, mens jeg holdt hænderne på rattet.

Uret er også udstyret med en pulsmåler. Joanna Stern fra WSJ har testet pulsmåleren, og den er ret nøjagtig. Jeg har i dag en MIO Alpha pulsmåler, som fungerer helt OK. Bortset fra at den kan være lang tid om at komme i gang med at måle pulsen, og nogle gange går amok og måler al for høj puls.

Hvis Apple watch har overkommet de småting som MIO Alpha af og til bøvler med, kan det være en god anledning til at købe uret. Har du lyst, har du lov, men pr. i dag er der i følge anmelderne ikke nogen grund til at købe denne udgave. Og vente til næste udgave af uret kommer på markedet.


John Gruber:

Joanna Stern:

Ars Technica: