mandag 29. februar 2016

Redis service bus for API calls

Redis service bus for API calls means that I can store the
users context (geo fence) as a time+place context.
Instead of having all the users query the same API calls for the same context, why not geo fence the API queries and let redis act as a remote storage for the results? That's what I asked my self in my undergoing bachelors project.

My Android app "Kontekst" (Norwegian for Context) will query data sources like YR and NILU – Norsk institutt for luftforskning.

The context of the user shold show data relevant for the user and the user should not have to wait for the same data delivered to other users in the same context. There is the dimension place (location) and there is time. Time doesent stand still even though the user does and after 10 minutes, the data is considered stale when it comes to air quality and the local weather situation.

Yet there are hundreds of thousands of inhabitants, even in the city of Bergen, Norway! So why not use the contexts and harvest the great powers of Redis?

søndag 7. februar 2016

Redis, put your socks on!

Instead of handling connections via the TCP connection, one of the most important yields of Redis performance enhancment would have to be getting the sockets up and running.

On unbuntu server 14.04 you have the settings by doing like so:
sudo su
vi /etc/redis/redis.conf

Find the socket by searching in vim:
:/unixsocket <enter>

When you find the line with redis socket, just uncomment it, so it becomes:
unixsocket /var/run/redis/redis.sock
unixsocketperm 755

Then write and quit vim.
:wq

Then you need to reload the redis server, you can do it like so:
service redis-server restart

You can of course try to force a reload instead of doing a restart, but I find redis to often need a restart where Nginx often have enough with a reload. 

So, what are the gains my dear sir?
I did some benchmarks on my 5$ VPS.

First look at redis without socks (TCP):
root@xxxx:/var/www/kontekst# redis-benchmark -q -n 10000
PING_INLINE: 57471.27 requests per second
PING_BULK: 54347.82 requests per second
SET: 24038.46 requests per second
GET: 25974.03 requests per second
INCR: 26315.79 requests per second
LPUSH: 25641.03 requests per second
LPOP: 40650.41 requests per second
SADD: 65789.48 requests per second
SPOP: 44247.79 requests per second
LPUSH (needed to benchmark LRANGE): 43290.04 requests per second
LRANGE_100 (first 100 elements): 24570.02 requests per second
LRANGE_300 (first 300 elements): 11185.68 requests per second
LRANGE_500 (first 450 elements): 6997.90 requests per second
LRANGE_600 (first 600 elements): 6930.01 requests per second
MSET (10 keys): 37735.85 requests per second

Then the next one is looking at socks for less overhead:

(Remember to change your sock location!)
root@xxxx:/var/www/kontekst# redis-benchmark -q -n 10000 -s /.../.../.../redis.sock

PING_INLINE: 108695.65 requests per second
PING_BULK: 112359.55 requests per second
SET: 109890.11 requests per second
GET: 111111.11 requests per second
INCR: 90090.09 requests per second
LPUSH: 128205.12 requests per second
LPOP: 129870.13 requests per second
SADD: 67114.09 requests per second
SPOP: 61728.39 requests per second
LPUSH (needed to benchmark LRANGE): 60606.06 requests per second
LRANGE_100 (first 100 elements): 23752.97 requests per second
LRANGE_300 (first 300 elements): 9149.13 requests per second
LRANGE_500 (first 450 elements): 8361.20 requests per second
LRANGE_600 (first 600 elements): 5896.23 requests per second
MSET (10 keys): 56497.18 requests per second

So the socks connection gives: 53497.18 - 37735.85 = 15761,33 increase in requests per second!
This is completely free and takes you 2 lines of configuration... So why not do it? Even if your Redis handles it's IO today, you will of course put less strain on CPU and Memory too.

5$ VPS rocks the boat!

I'm fairly impressed by the 5$ VPS by Digital Ocean (DO), which gives you real SSD storage, 512 Mb RAM and 1 core, 1Tb traffic out. The fact that I got 10$ after signing up (for free) is also nice.

Digital Ocean has a lot of guides about everything you can imagine and they have a place where the community helps out. I even figured out they pay people to write guides!

You can get a lot done on Linux even with half a gigabyte of RAM. In a couple of days I've set up Ubuntu Server 14.04 (LTS), NGINX, PHP7, MySQL, Redis and grade A+ HTTPS using letscrypt.com.

A+ with let's crypt :-)

Redis caching WordPress objects
Redis caches all objects from my Wordpress instance, also it will cache my API calls from third parties (though with expiration). NGINX does both static file cache, also gzip compression etc.

In comparison of my previous webhotel, can now do "what I want" (within reason). Let's say I want a failover cluster, then I just make a new "droplet" (virtual server) and I do some configuraion for a failover cluster. I moved my domain to theire DNS, so I can have full control in one place.

NGINX is a great server, but I would also like to try this setup:
NGINX (reverse proxy) > Openlightspeed > Redis

OR:
NGINX (reverse proxy) > Apache > Redis
In my latest example I would want to use mod_pagespeed in apache, as this is pluggable. In NGINX you have to compile it your self, so it's a bit more work when you are upgrading NGINX and have to compile dependencies.

I'm running NGINX with HTTP/2, compression, cache etc. It flies! It's so much faster than regular hosting deals. Of course it's more work to get it up and running than just uploading files to a shared webhost.

If you want to try digital ocean today, use my referral link please :-)

>> Digital Ocean (DO), <<

Also remember to find your place with lowest ping:
http://speedtest-sfo1.digitalocean.com/

For me AMS2 was fastest and had lowest ping, ping is by all means the most important factor when it comes to internet services, as a high latency will give a slow page even though it's very light and optimized to fly.

tirsdag 15. desember 2015

Arduino - HXJ-17 mikrofon og hvordan den virker - Video!

Et bilde sier mer enn tusen ord og en video har 24 bilder i sekundet, derfor følte jeg at et par minutters video kan vise mer enn mange artikler med tekst.

Når det er skrevet, så vil videoen nedenfor vise hvordan mikrofonen fungerer og at den ikke er usensitiv som mange på Internett påstår.



Relatert lenke:

mandag 14. desember 2015

Hacke en ikealampe med Arduino og Adafruit Neopixel klone - Video!

Som alltid åpnet jeg posten og til min store glede var det elektronikk der! Min NeoPixel klone var kommet frem, helt fra min gode venn (av mange andre) som sender meg gaver fra Kina.

Når det er sagt, hva er neopixel? Jo, det er en ring med RGB-led som er unikt adresserbare.
Dette betyr at du gjennom 3 kabler (data + strøm + jord) kan styre/adressere "uendelig" med leds.

Jeg kjører her en demo på en ESP8266 (NodeMCU V1), men i praksis kan man gjøre dette på nesten hva som helst av Arduinokompatible enheter.

For å teste dette veldig kjapt, tok jeg å lastet ned biblioteket til Adafruit og la det inn i Arduino library-mappen. Deretter limte jeg inn konstantene for å mappe om til riktig pinout på ESP8266:

#define NODEMCU_D0 16
#define NODEMCU_D1 5
#define NODEMCU_D2 4
#define NODEMCU_D3 0
#define NODEMCU_D4 2
#define NODEMCU_D5 14
#define NODEMCU_D6 12
#define NODEMCU_D7 13
#define NODEMCU_D8 15
#define NODEMCU_D9 3
#define NODEMCU_D10 1
#define NODEMCU_D12 10

Jeg valgte å deretter definere pinout i Adafruit-koden:
#define PIN            4
Som man ser der oppe, er 4 = D2 (altså plugger jeg da data-linjen inn på D2 på ESP8266).

Sketchen jeg testet, er den som heter "buttoncycler" som man finner under examples  etter man har lagt inn library. Jeg måtte derfor definere opp en knapp også:
#define BUTTON_PIN   5    
Vi ser der oppe at Pin 5 på Arduino tilsvarer D1 på ESP8266, altså tok jeg en kabel på D1 som er han i andre enden. Jeg har ikke knapp tilgjengelig så jeg tok enda en kabel på GND (jord). Når koden er som den er, vil de to kablene kortsluttet for et øyeblikk tilsvare en "momentary switch", en øyeblikksbryter. Sketchen vil starte animasjoner, den cycler gjennom 10 moduser.

Man må også definere antall piksler man har, jeg har her 24 piksler:
#define PIXEL_COUNT 24

Ellers er det egentlig ikke så mye å gjøre, last det over på NodeMCUen og lek i vei :-)

Her er demovideoen når jeg testet

Relaterte lenker

mandag 7. desember 2015

Lag en imponerende bluescreen presentasjonsvideo på 1-2-3

Fremfor å vise videoene dine "ramme til ramme", viser jeg her hvordan du kan lage imponerende innramminger på 1-2-3, som mitt eksempel her:
Denne videoen har jeg aldri vist på tven min, men her ser du bilde av tven
og det ser jo ekte ut, sant? Vi bruker her noe man kaller "blue screen" som
de fleste har hørt om, for å gi en ny dimmensjon til videoen.


Det ser kanskje fancy ut, men det tar ca 10 minutter å "ramme inn" videoen, hvis du har klart et kamera. Enten trenger du Adobe Photoshop + Adobe Premiere, eller du kan hoppe over Photoshop hvis du har mulighet for å vise en solid bakgrunnsfarge på TVen din. Det er også mulig å bruke et laken, klippe ut fargede ark osv. Fantasien setter grenser, som alltid!

1) Ta bilde av TV-apparatet ditt

Du trenger ikke å bry deg om hva som er på skjermen, men hvis du ikke har Photoshop kan du velge å vise en blå eller grønn video (søk etter green background eller blue background på youtube og vis dette på tven)

2) I Photoshop lager du et nytt dokument på 1920x1080 piksler

Her drar du nå inn bildet av tven din og slå på grid (CTRL+ * ). Trykk så CTRL+T (transform).
Nå må du trekke ut bildet slik at kantene går rett, slik at du ikke får forvrengt bilde.
Bildet lagres nå ned som bluescreen.jpg med kvalitet 12.

3) Opprett Adobe premiere prosjekt, dra inn bildet du lagde i steg 2.

Pass på at du velger HDV og 1080P 24fps prosjekt.
Importer bildet inn i prosjektmappen, dra det så inn på tidslinjen i det øverste videosporet.
Nå må du åpne effektbiblioteket og trekk så bluescreen over laget ditt bluescreen.jpg

Hvis alt gikk som forventet, skal dette bli resultatet:

Man kan nå legge andre lag under dette laget og det ser ut som presentasjonen foregår på tv-apparatet. Den samme effekten kan man selvsagt bruke andre steder, i en bok osv. Man kunne også filmet tven sin mens den viste en solid bakgrunnsfarge. For en "sanntids"-bakgrunnsfarge er det viktig å tenke på at man ikke må stå foran bildet med samme farge som den man skal gjøre transparent. La oss si at jeg ønsket å stå foran tv-apparatet og filme, mens jeg skulle bluescreene inn en annen video på tven. Hvis jeg da hadde på meg blå genser, hadde jeg blitt usynlig der genseren var, det samme hadde skjedd med øynene mine.

Hvis du har blå øyne kan du da prøve en "grønn bluescreen", en green screen. Eller du kan bruke andre farger, da kan du velge en av de andre keyene (flere å velge mellom).


torsdag 3. desember 2015

Loddestemningen

Beklager ordspillet - loddestemningen. Men stemningen for å lodde kom over meg, så det var passende følte jeg. 


Dette er en flux capacitor, den gjør tidsreise mulig.
Neida, det er en 16 bit ADC (analog til digital converter).
16 bit ADC gir 4 inputs gjennom i2c, det betyr at man trenger bare 2 kabler inn mot Arduino og kan da koble enten 4 sensorer på den, eller man kan kjøre en differensialmåling på 2 sensorer for enda mer nøyaktig måling (da hele 16 bit, mot 15 bit hvis man kjører 4 sensorer).

Man kan også programmere den fra koden sin og velge å forsterke signal med  2/3x (standard), 1x, 2x, 4x, 8x og 16x. Så hvis man har for eksempel 1V maks ut fra en analog sensor, kan man øke gain med 4 og få ut 4V maks. Når det er sagt, kan man også adressere de ved å laske over mot "addr". Mer om det i guiden hos adafruit:

Man kan altså kjøre 4 16 bit ADC for å gi 4x4 = 16 analoge input med 15bit målinger inn gjennom da 2 ledninger mot mikrokontrolleren! (pluss strøm og jord) eller: 2x4 = 8 x 16bit målinger gjennom to ledninger.. Man må selvsagt ha kabler til sensorer og mellom enhetene i i2c bussen :-)


Her ser vi en lyssensor jeg loddet på pinner.
Jeg har nå i praksis 3 typer lyssensorer, hvor av dette er den beste av de til vanlig lysmåling. Men jeg har også noen UV-målere samt noen enklere målere enn den her.

Liten Arduino Pro Micro før jeg lodder fast pinnene.

Her er alt jeg loddet i kveld, man ser to kapasitive
Touch sensorer, samt en 16 bit adc, en voltage divider
Og en lyssensor.