fredag 25. september 2015

Arduinokomponenter på vei i posten :)

Jeg er en verdensvant Internetthandler og denne uken har jeg ikke gjort skam på min ordrehistorikk. Følgende komponenter har jeg bestilt, for å hjelpe å holde liv i banken min DNB som sliter med oppsigelser for tiden

Romeo V2

Av mange arduinobaserte kretskort på markedet, er dette en som er fin for å starte utviklingen på. Det er mye som kan brukes ut av boksen, uten å fikle for mye med løse komponenter, breadboards og loddetangen. Jeg er for all del ikke redd for en loddetang, men det er greit å ha et proto-brett som er fleksibelt og kan benyttes til mer enn en ting. Her er det utallige muligheter, det er vel i praksis fantasien som setter grenser. ( lenke )


Bilde hentet fra dfrobot.com

Støvsensor

En sensor for å måle støvpartikler, enkelt og greit :-) Den bruker optisk måling av partikler, samt det er en motstand som fungeer som varmeelement for å skape sirkulasjon av luften. ( lenke )

Sensoren brukes ofte i luftrensere og har visstnok ganske god kvalitet når det gjelder nøyaktighet av svevestøvmålinger (PM2.5). Den kan påvirkes av lysinntrengning bak sensoren, da det er optisk virkemåte.
Bilde hentet fra dfrobot.com

Støvsensoradapter

For å koble støvsensoren opp, er det en fordel med adapteren,. Denne gjør at man med enkelhet kan koble sensoren mot Arduino. (lenke)


Bilde hentet fra dfrobot.com

Barometrisk sensor

Den barometriske sensoren BMP180 fungerer ved å måle trykk og temperatur. Høyde og trykk har ikke et statisk forhold, selv jordens rotasjon påvirker dette. Ofte er det slik at man kalibrerer telefoner og annet ved enten sjønivå (0 meter over havet), eller ved en kjent høyde. Dette blir da utfallet av en ligning med ukjent. En utfordring med høydemåler er at høyden da vil påvirkes av temperaturen, siden trykket endres ved temperatur. Dette kompanseres dog ved å bruke bibliotek til sensoren.

Bilde hentet fra ebaylenken nedenfor

Jeg kjøpte to sensorer på ebay, til kr. 11 per stk ( lenke

MircoSD

Mikrokontrollere har som kjent lite lagring, vi snakker her ikke megabytes men kilobytes. Det er plass til lite programmering og plass til enda mindre lagring. Hva hvis kommunikasjonen går ned? Kanskje man bør bufre til microsd og overføre ved gitte intervaller?
Bilde hentet fra ebay.

XBee USB Adapter

Dette adapteret er strengt tatt ikke nødvendig, men det gjør at man kan flytte radiodelen lenger unna kretskortet. Adapterkotet skal benyttes sammen med mottakerside (Rasberry Pi 2) og det blir da bare å koble opp primært jord, +5v, rx til tx og tx til rx (data). Kortet kostet hele 26,54 Kr på ebay! XBee er altså en formfaktor som kan brukes til mange forskjellige trådløse teknologier, men denne adapteren gjør at du kan enten bruke dupont-kabler eller usb-kabel ut mot mikrokontrollerens kretskort.
Bilde hentet fra ebay

XRF XBee

Jeg bestilte to stykker XRF Xbee, hvor av en skal monteres inn i XBee USB Adapteren og deretter skal jeg bruke dupont kabler ned til Rasberry Pi 2. Den andre skal monteres rett i socketen på Arduino Romeo V2. Det blir rene "Plug and pray".

Bilde hentet fra dfrobot.com
Nå skal det sies at en alternativ løsning enn å kjøpe to XRF XBee i mitt tilfelle, ville være å kjøpe en "Slice of radio" som er laget for å monteres rett på IO socketen til Rasberry Pi. Men det jeg ikke likte med "Slice of Radio"; er at den dekker over alle IO-pins. Det vil jo si man må enten la vær å bruke resten, eller man må stacke mye i høyden. Ved å derimot bruke den adapteren ovenfor fra ebay, vil jeg kunne bruke dupont kabler ned på IO-pins som er aktuelle å bruke (RX mot TX og TX mot RX).

Med XRF XBee har man mulighet for lang rekkevidde og lavt forbruk, det er også mulig å sette den i sovemodus når radiomodulen ikke er aktiv. I teorien kan man også koble dupontkabler rett på XRF XBee og man trenger ikke drivere hvis man gjør det på denne måten. Det fins jo alternative løsninger som bruker usb-adaptre som vil kreve drivere i Linux.

Analog Ambient Light Sensor

Det er rett å slett en lyssensor, bestilte to på gøy fra dfrobot.com.
Det er ingen begrensninger for hva man kan bruke denne til, så fremt man bare vil bruke den til noe som har med lysnivå å gjøre :-) Eksempel kan være å slå av taklyset når det er lyst nok ute, eller slå på lyset når det er mørkt ute.. Begge deler er selvsagt også mulig!

Bilde hentet fra dfrobot.com

DHT11 Temperatur og fuktsensor

Sensoren måler fukt og temperatur, men er da naturligvis påvirkelig av kretskortenes varmeutvikling, så vel som lysinntrengning. Nøyaktighetsgraden er +-1C, DHT22 har +-0.5C som nok kanskje egentlig er et bedre valg.. Etterpåklokskap er også klokskap, vil jeg påstå! Nok et produkt fra dfrobot.com

Bilde hentet fra dfrobot.com

Kabler

Det er ikke et must, da man får kabler med adapterne og enhetene fra dfrobot, men det skader ikke å ha noe slitk liggende. I alle fall ikke når det er hele 11,56kr på ebay! Dette heter altså "dopont male to female". Det kan også hete noe som "dupont wire jumper cable".
Bilde hentet fra ebay



Takk til

På lik linje med de som vinner en oscarnominasjon, føler jeg at jeg må takke litt for min egen handleliste. Jeg har ikke bare gått random amok med bankkortet mitt, jeg har faktisk fått litt hjelp til å filtrere ut hva som kan være greie produkter (med unntak av et par av sensorene og kablene, der gikk jeg kanskje amok på egenhånd).

Men uansett er det en digresjon. Nils Jacob Berland har hjulet meg med tips og råd, jeg snublet for en tid tilbake over friskby bergen ( https://www.facebook.com/friskbybergen?fref=ts ), som har et spennende prosjekt med å få frisk luft inn i ryggmargen til skoler. Prosjektet vil jeg si er en innovasjonsprosess både ved at man får elever til å jobbe med utvikligen av - og utplassere sensorer. Dette er et spennende prosjekt som fattet min interesse og jeg tok kontakt med de på facebook for en tid tilbake.

Det er helt sikkert mulig for flere å slenge seg på, om man jobber med visualisering, modellering av data, kommunikasjon, maskinvare, osv. For meg er dette spennende, særlig at alt blir åpen kildekode og at man kan selv utvikle sine egne punkter.

onsdag 16. september 2015

Er dine Wordpress innstikk og webmaler klare for WordPress 4.3 og PHP 7? Jeg viser deg vanlige feilmeldinger og sannsynlige løsninger!

For å unngå en total krasj når PHP 7 går i stabil lansering, har WordPress med versjon 4.3 lagt til rette for en mest mulig sømløs overgang. Dette høres bra ut og det er i praksis det.

I det stille vil derimot dine eksisterende nettsteder, innstikk og webmaler generere feil. Tilsynelatende fungerer nettstedet ditt gjerne som før, men hvis du ikke fikser feilene, vil det bli total krasj når webhotellet ditt oppgraderes til PHP 7.

Noen frustrerte lesere vil kanskje tenke: For noen slemme WordPress-utviklere, men den gang ei! Du har nå en utmerket mulighet for å gjøre klar nettstedet ditt for en sømløs overgang. PHP7 vil blant annet ikke støtte måten man definerte klasser eldre WordPress-versjoner, som baserte seg på PHP 4 kompabilitet. Denne kompabiliteten fungerer i PHP 5.5 og i WordPress 4.3, men er egentlig faset ut.

Hvis du velger å overse meldingene WordPress kan gi deg nå, ber du om trøbbel senere. Det hjelper ikke at du venter med å oppgradere WordPress, da webhotellet ditt nok oppgraderes før eller siden.

I artikkelen vil jeg ta for meg vanlige feil og vanlige fiks, samt hvordan du kommer kjapt i gang på 1-2-3.

1. Kom i gang med logging

Det er ikke så vanskelig å komme i gang med logging, selv om manualen til WordPress kanskje burde ha et mer nevenyttig eksempel enn det du finner her: Debugging_in_WordPress. Men fortvil ei, jeg skal hjelpe deg i gang!

Du må tenke gjennom et par ting
  • Gjør det noe at dine brukere ser masse feilmeldinger?
    • Hvis ja, må du logge til disk eller bare vise feil til deg selv
    • Hvis nei, kan du logge til skjerm og ev. disk
  • Har du tid til å sitte i timesvis med det?
    • Hvis nei, betal meg for å gjøre det!
  • Store logger tar stor plass, ikke start logging og glem den i noen år :)
  • Husk at loggene er hendelsstyrt, du må kjøre gjennom alle funksjoner og interaksjonsmuligheter for å avdekke feilene.
  • Logg til disk vil ikke differensiere alle feiltyper per site, i en multisiteløsning, dette er av den enkle årsaken at WordPress merger funksjonsfilen med sin egen funksjonsfil.
    • Feil på function.php vil du måtte identifisere gjennom visuell bekreftelse
    • Feil på selve temafilene (single.php, index, osv) vil du kunne lese direkte i loggen.
Når de tingene ovenfor er nevnt, står det ingen god måte å gjøre logging bare synlig for admin.
Hvis du sitter alene på din egen IP (din arbeidsplass eller ditt hjem), kan du gjøre det veldig enkelt:
if ($_SERVER['REMOTE_ADDR'] == '127.0.0.1') {
  // Slå på logging
define('WP_DEBUG', true);
// Aktiver loggfil til /wp-content/debug.log
define('WP_DEBUG_LOG', true);
// Slå av eller på feil og advarsler som vises på skjerm
define('WP_DEBUG_DISPLAY', true);
@ini_set('display_errors',1);
// Bruk utviklerversjoner av core JS og CSS-filer (bare nødvendig hvis du endrer kjernefilene)
define('SCRIPT_DEBUG', true);
}
else {
define('WP_DEBUG', false); // Slå av logging
}
Koden ovenfor legges inn i wp-config.php, over linjen /* That's all, stop editing! Happy blogging. */.
Man må legge inn sin egen public IP, med mindre man kjører mot localhost. IPen kan man finne på www.minip.no.

Noen tips:
Vil du bare logge til disk? Slå av WP_DEBUG_DISPLAY. Vil du bare logge til skjerm? Slå av WP_DEBUG_LOG.

Hvis du vil slå av all logging, kan du i praksis kommentere vekk alle linjene med:
/*
... koden her
*/

2. Identifiser feilene

Den kalte constructor-metoden for WP_Widget er foreldet

Feilen vil nok veldig mange støte på, av den enkle årsak at ikke alle utviklere av innstikk er klar over at de må oppdatere de for at de skal fungere på WordPress 4.3 og med kommende PHP 7. Mange innstikk har ikke blitt utviklet på lang tid. Hvis innstikket er ryddig kodet opp, bør det være relativt enkelt å fikse det.. Jeg kommer med to eksempler til samme innstikk her.

Feilmeldingen ser for eksempel slik ut
Notice: Den kalte constructor-metoden for WP_Widget er foreldet siden versjon 4.3.0! Bruk __construct() isteden. in ... on line ...

Konstruktøren fra instikket som gir trøbbel
function DTS_View_Full_Website() {
Set the new widget css class and description
$widget_ops = array(
'classname'   => 'dts_view_full_website',
'description' => 'Add a link for mobile users'
);

Build an instance of the new widget
$this->WP_Widget('dts_view_full_website', 'View Full Website', $widget_ops);

} // DTS_View_Full_Website 

Hvordan kode dette om til PHP7-støttet kode, som er det som bør brukes i WordPress 4.3?
Manualen sier hva som skal gjøres, men kanskje den er litt lite spesifikk.

Slik skal det se ut for å fungere
function __construct() {
$widget_ops = array( 'classname' => 'DTS_View_Full_Website', 'description' => 'Add a link for mobile users' );
parent::__construct( 'css-class', 'Title', $widget_ops );

Foreldede funksjoner i tema

Det er ikke uvanlig at man har et tema gjennom flere WordPress-versjoner, særlig ikke hvis det innehar en stor grad av skreddersøm. Da kan man oppleve feilkoder som dette:
PHP Notice:  add_custom_background er foreldet siden versjon 3.4! Bruk add_theme_support( 'custom-background', $args ) isteden. in ... on line ...
Det er jo logisk for alle som kan WordPress å lete i functions.php filen etter koden som gir feil og deretter kommentere den ut:
// This theme allows users to set a custom background
//add_custom_background();

Deretter kan man gå til [codex.wordpress.org/Function_Reference/add_theme_support] for å finne koden man trenger for sin utdaterte støttefunksjon:
$defaults = array(
'default-color'          => '',
'default-image'          => '',
'wp-head-callback'       => '_custom_background_cb',
'admin-head-callback'    => '',
'admin-preview-callback' => ''
);
add_theme_support( 'custom-background', $defaults );

Uforståelig feilmelding er ikke uvanlig

Hvordan skal man for eksempel skjønne denne feilmeldingen?
: Undefined variable: description in on line 
Ikke bare var den kryptisk, men den manglet linjenummer og litt annet. I dette tilfellet er det lurt å se i HTML-koden i nettleseren og se hva som ligger nært feilmeldingen. Meldingen sier riktignok at det er en udefinert variabel, men for å slippe å lete seg gjennom alle de modulære malfilene, er det lurt å vite sånn ca hvor det er eller hva det har tilknytning til.

Ved å se i HTML-koden, ser vi at det hører til menyen og vi ser da umiddelbart i alle fall en feil:
'walker'          => new description_walker
Det er en manglende parantes () som sier at det er en funksjon, derfor tror WordPress det er en konstant. Når det er fikset er fremdeles feilen der, derfor går inn i loggene på disken og finner følgende relatert feilmelding:
:  Declaration of description_walker::start_el() should be compatible with Walker_Nav_Menu::start_el(&$output, $item, $depth = 0, $args = Array, $id = 0) in 
What the bacon, tenkte du kanskje nå? Men det er egentlig ikke så mystisk.
Når vi extender en klasse fra WordPress, er det viktig at den ser lik ut i de ytre rammene.

Hvis temaet er godt bygd opp, skal det ligge en walker-kode i functions.php med navnet  vi kjenner
Walker, Texas Ranger!
til fra forrige feilmelding: description_walker. Etter denne koden er lokalisert, kan vi på samme måte som vi gjorde i et tidligere eksempel. endre syntaksen. Vi må gå inn i WordPress sin core trac for å se hvordan funksjonen start_el walker som utvider klassen Walker_Nav_Menu defineres i versjon 4.3. [ https://core.trac.wordpress.org/browser/tags/4.3/src//wp-includes/nav-menu-template.php ]

I dette spesifikke eksempelet må vi passe på at vår skreddersøm walkerkode har de samme parametrne som er i kjernen til WordPress, altså:
 &$output, $item, $depth = 0, $args = array(), $id = 0
Etter å ha oppdatert dette, forsvinner feilmeldingene ovenfor og menyen ser igjen fin ut.

Undefined index in...

Det kan være flere årsake for en undefined index in..., men ofte er det en matrise som brukes feil.

I dette tilfellet var det en enkel linje som skulle bort, det var litt spøkelseskode fra et innstikk som ikke lenger er i bruk:
wp_deregister_script('prettyphoto');

Undefined variable in..

Hvis du har fikset utallige feil og fremdeles ser følgende feil, ikke gi opp!
Notice:  Undefined variable: description in 
Hvordan vet vi hva dette er? Jo, vi kan se hvor den kommer fra ved å se i HTML-kilden:
<div data-role="panel" id="lPanel" data-display="overlay" data-position="left" data-position-fixed="true" data-theme="b">
Det sier oss at det er venstremenyen som gir problemer, den menyen vi allerede nå har fikset på to ganger og har fjernet mange feilmeldinger. Men vi er altså ikke helt ferdig med å mekke på den. Når vi ser i venstremenyen, ser vi at det ikke er så mye kode der. Dette er jo et bra tegn, siden den koden skal ligge i functions.php. Vi besøker derfor nok en gang walker-koden som vi måtte utbedre tidligere.

Denne gangen vet vi at vi leter etter en variabel med navn description.
Langt inne i vår walker-kode finner vi linjen:
$item_output .= $description.$args->link_after;
Problemet vårt er i de tilfeller hvor det ikke er lagt beskrivelse inn, da vil den prøve å bruke en variabel som ikke er initialisert. For å ordne det på en elegant måte, kan vi bruke en ternary operator. Det er viktig at denne legges tidligere i koden enn konkateneringen av variablene.

Ternary operators er egentlig ganske enkelt, den har syntaksen:
$variabel = (booleansk verdi ? sann : usann);

Vi lager derfor følgende kode som vi legger over den linjen hvor description konkateneres:
$description = (!isset($description) ? "" : $description);
Det den gjør, er å sette seg selv til en tom streng, hvis den ikke er definert. Ikke definert tilsvarer sånn ca. NULL i databasesammenheng, det er ikke det samme som 0 eller "", som de fleste IT-folk bør vite.

Undefined offset in,..

Denne meldingen slår seg gjerne ut som
Notice: Undefined offset: 8 in ... on line ...

Nok en intetsigende feil sier du og jeg kan godt være enig. Men i bunn og grunn betyr den at du er
Feil i koden gjør at hull i nummerserie
gir øunskede resultater og feil i logg.
utenfor matrisens definisjoner. Det vil mest sannsynlig være en bug/feil, av og til trenger den ikke krasje skriptet ditt, men kan gi uønskede resultater.

Det er en relativt enkel måte å fikse den bug'en der, det er nok å endre litt på løkken, slik at hull i nummerserien ikke påvirker resultatet. Fremfor å iterere over en heltallsverdi som øker med hver iterasjon, itererer vi over verdiene i en matrise og deretter bruker den som nøkkel.

Her er en linje fjernet, det er ny måte
å iterere løkken på og sjekk av numerisk
verdi er overflødig.

Deprecated: mysql_real_escape_string()

Lenge var mysql real escape string måten man unngikk sql-injeksjon, men denne skal ikke brukes sammen med WordPress 4.3. I vanlig PHP-kode skriver man i dag PDO eller bruker mysqli. I WordPress har man derimot innebygde funksjoner for å tilrettelegge for trygge sqlspørringer.

Feilmeldingene manifesteres som
Deprecated:  mysql_real_escape_string(): The mysql extension is deprecated and will be removed in the future: use mysqli or PDO instead in...
og...
Warning:  mysql_real_escape_string(): Can't connect to local MySQL server through socket 
Man lurer gjerne på hvorfor dette skjer - siden alt virket før WordPress 4.3, men igjen er det WordPress som vil ha mest mulig sømløs overgang til PHP 7 og det betyr de må ha kontroll over funksjonskall i webmalene dine. Derfor må du inn der hvor du kjører  mysql_real_escape_string-kall og endre dette til innebygde funksjoner.

Eksempel på kode som måtte endres (skreddersøm søk):
$querystrToIndeks = sprintf("
SELECT post_title, ID, post_excerpt, post_content,
(post_title REGEXP '%s') as rIn ......
LIMIT 10", mysql_real_escape_string(strip_tags(trim($_REQUEST['term']))), ...........;
For å få den til å virke i WordPress 4.3 og fungere i PHP 7, må man gjøre små endringer
$querystrToIndeks = $wpdb->prepare("
SELECT post_title, ID, post_excerpt, post_content,
(post_title REGEXP '%s') as rIn ......
LIMIT 10", strip_tags(trim($_REQUEST['term'])), ...........;
Les gjerne mer om wpdb: codex.wordpress.org/Class_Reference/wpdb

Når du har kommet så langt, er du gjerne nesten i mål og kan glede deg til å spise en god hamburger dekket av bacon og ost. Men før den tiden er der, må du først fikse resten. Sannsynligheten er stor for at din gamle webmal også gir følgende feilmelding:
Notice:  Undefined property: stdClass::$post_author
Notice:  Undefined property: stdClass::$post_date
Fristelsen er kanskje nå stor for å rive ut håret, sende PC-en på gjenvinning og sparke ut vinduet. Men fortvil ei, dette er bare WordPress som sier til deg: heisann, du har ikke forfatter og dato! Så vi må bare legge de på spørringene mot databasen.

Gammel spørring
  SELECT post_title, ID, post_excerpt, post_content,
(post_title REGEXP '[(]%s[)]') as rIn ....
Ny spørring
  SELECT post_title, ID, post_excerpt, post_content, post_author, post_date,
(post_title REGEXP '[(]%s[)]') as rIn

3. Spis hamburger med bacon og ost

Nam nam!

Relaterte lenker:

Les mer om 4.3 oppgraderingen, som er en viktig mlepæl: make.wordpress.org/core/tag/4-3/


tirsdag 15. september 2015

Vil du lage ditt neste nettsted med material design?

Når du starter på neste webprosjekt er det jo som alltid utallige valg å ta.
For det første skal du velge teknologisk plattform, med de valgene som hører med der.

Skal du ha PHP eller ASP.NET, skal du ha MSSQL, MySQL, Oracle eller kanskje du skal benytte deg av Firebase eller mongoDB? Skal du bruke et Content Management System (CMS), skal du kode opp Model View View Model (MVVM)-binding mellom en JSON-kilde og AngularJS?

Når valgene er gjort og du har en løsning som kanskje er installert, skal du ta fatt på grensesnittet. Fremdeles er det mange timer frem til mål og kanskje du av gammel vane vurderer å bruke bootstrap som før, eller kanskje du vurderer å benytte deg av skreddersøm HTML5 og CSS3, som du beriker med JQuery og andre rammeverk?

Hva om du vil prøve noe nytt, hva om du vil prøve Material Design?

Google to the rescue

Google har en har en dedikert nettside design.google.com, som hjelper deg med tips om alt fra kerning til marger, fonter, navigasjon, layout og annet.

Viktige inspirasjonskilder kan man også dra fra Google sine material design guidelines på samme nettsiden: design.google.com/resources/#material-design-guidelines.

Men det du kanskje ikke visste, er at Google nå også har lansert Material Design Lite (MDL) som åpen kildekode. MDL er altså et responsivt rammeverk som fungerer uten javascript og degraderer i eldre nettlesere.

Sitat fra http://www.getmdl.io/:

Material Design Lite lets you add a Material Design look and feel to your websites. It doesn’t rely on any JavaScript frameworks and aims to optimize for cross-device use, gracefully degrade in older browsers, and offer an experience that is immediately accessible. Get started now.

MDL kan tilpasses relativt enkelt, man kan gjennom fargehjulet velge annet fargetema, på følgende nettside: getmdl.io/customize/index.html# 


Komme raskere i gang med Web 2.0 elementer

De fleste nettsteder i dag benytter seg av Web 2.0, den interaktive webben. Som regel brukes det mye tid på å kode opp ting som kart og øvrige interaksjonselemeneter som de fleste forventer er på plass i dag. Med Polymer kan du komme raskere i gang med ditt neste prosjekt, rammeverket er enkelt å bruke og lager effektive interaksjonselementer for webben.

Sitat fra www.polymer-project.org/1.0/

Polymer 1.0 has been rebuilt from the ground up for speed and efficiency. The new, leaner core library makes it easier than ever to make fast, beautiful, and interoperable web components. If you haven't used Polymer before, it's time to try it out. If you haven't tried it recently, time to take another look.

Oppsummering

Det er egentlig ingen konklusjon her, men jeg anbefaler å besøke og lese godt opp på google sine designsider. Det ligger mange ressursser tilgjenglig for nedlasting, alt fra maler til material design ikoner, man kan bruke google fonter og mye annet. Selv om material design er i vinden nå, vil mest sannsynlig material design holde seg relevant lenger enn mange andre design. Dette er på grunn av de enkle og rene linjene, samt tanker rundt god UXD og forståelig innhold, navigasjon og tilpassing til flere skjermer.

fredag 11. september 2015

Ny Apple TV er allerede utdatert

Hva gjør et produkt utdatert? Noen vil kanskje si at det ikke lengerer fungerer, men jeg vil hevde at det er utdatert hvis det teknologisk sett ligger bak markedet. Det kan gjerne defineres som en form for planlagt foreldelse, men i dette tilfellet er foreldelsen på plass før produktet treffer markedet.

4K er i vinden som aldri før. 3D viser seg å være på vei ut, men High Dynamic Range (HDR) og 4K er på vei inn. Kort fortalt er 4K fire ganger så mange piksler som 1080P - også kjent som fullhd. Dette gjør bildene skarpere, tekst mer lesbar og alt ser mer realistisk ut. HDR gir økt kontrast og dybde, samt man får en annen dybdefølelse.

HDR er noe man bare ser på dyrere TV-apparater i året 2015, men 4K har blitt et allemannseie. Man kan selvsagt argumentere mot mengden innhold i 4K, men det er fremtiden og det er nåtiden. Netflix begynte å strømme 4K i 2014 og begynner snart med HDR.

Når Apple lanserer en ny tredjegenerasjons Apple TV uten 4K og derfor også uten HDR, vil det si at man ikke kan strømme innhold i 4K og derfor ikke får utnyttet skjermkvaliteten på TVer som selges i dag.

Nå kan man kanskje spørre seg selv om hva man da skal med en tredjegenerasjons Apple TV.
Det er et godt spørsmål, den vil jo i praksis bare være brukbar for de som ikke har Smart-TV og ikke har 4K TV, ikke har chromecast eller en eldre Apple TV.

Det blir en mindre og mindre markedsandel, etter hvert som forbrukerne oppgraderer til større TV-apparater med 4K og innebygde Smart-TV-funksjoner. Hvorfor koble på en boks som gir dårligere kvalitet enn det som er innebygd?

Kanskje det beste alternativet til Apple TV er Nvidia sin Shield med Android TV, denne støtter 4K og baseres på Android TV - som er utformet for TV-skjerm. I tillegg støtter den strømming av spill fra nettet eller fra en PC med Nvidia skjermkort. Dette gjør at du kan bruke den som en konkurrent til en spillkonsoll. Har man et strammere budsjett og fullhd, er det ikke dumt å kjøpe en Chromecast for en latterlig lav pris.

Se gjerne sammenlig mellom de mest aktuelle konkurrentene:
http://shield.nvidia.com/android-tv/shield-androidtv-vs-appletv-vs-roku-vs-firetv