24 de febrer del 2018

Ionic: aplicació per saber l'hora de sortida/posta del sol (II)

Part II: Versió "clavada a ferro"

Aquest article ens mostrarà com fer una aplicació amb Ionic per saber l'hora de sortida i posta de sol en un lloc determinat.

En la primera part vàrem preparar el projecte inicial.

Ara farem una primera versió senzilla, on fixarem el lloc i el dia. Més endavant anirem modificant el codi per fer-lo més útil en general (i de passada anirem veien diferents tècniques).

En lloc de fer el càlcul de l'hora de sortida/posta de sol directament, l'aplicació es connectarà a internet per a obtenir-la. Amb una cerca ràpida a Google podem trobar una API que sembla feta a mida a https://sunrise-sunset.org/api.

En una primera versió, podem fer una petició simple amb:
 https://api.sunrise-sunset.org/json?
             lat=36.7201600&lng=-4.4203400&formatted=0

I obtindrem una resposta en JSON similar a:


Fixeu-vos que només necessitem la latitud i la longitud i fer una petició a l'API anterior per obtenir les dades que necessitem en la nostre aplicació.

En una aplicació Ionic, per poder fer peticions web, primer hem d'importar el mòdul HttpClientModule al fitxer app.module.ts. Quedaria com segueix:
 ...
 import { SplashScreen } from '@ionic-native/splash-screen';

 import { HttpClientModule } from '@angular/common/http';

 @NgModule({
  declarations: [
   ...
  ],
  imports: [
    BrowserModule,
    HttpClientModule,
    IonicModule.forRoot(MyApp)
  ],
  bootstrap: [IonicApp],
  ...

Amb això ja podem implementar la funcionalitat desitjada en la pàgina home.ts:
 import { Component } from '@angular/core';
 import { NavController } from 'ionic-angular';

 import { HttpClient, HttpHeaders, HttpParams } from '@angular/common/http';

 @Component({
  selector: 'page-home',
  templateUrl: 'home.html'
 })
 export class HomePage {
  API: string = "https://api.sunrise-sunset.org/json";
  
  // Estany de Sant Maurici
  lat: number = 42.582104;
  lon: number = 1.0008419;

  sunrise : string;
  sunset : string;

  constructor(  public navCtrl: NavController,
                public http: HttpClient )
  { }

  ionViewDidLoad() {
    console.log("Calling API...");

    let data = {  lat: this.lat.toString(), 
                  lng: this.lon.toString(),
                  formatted: "0"
                };

    const params = new HttpParams({fromObject: data});
    const headers = new HttpHeaders().set("Accept", "application/json");
    let options = { headers: headers, 
                    params: params, 
                    withCredentials: false
                  };

    this.http.get(this.API, options).subscribe(answer => {
      console.log(answer);

      if (answer['status']=="OK") {
        let date_options = {hour: "2-digit", minute: "2-digit"};

        this.sunrise = new Date(answer['results'].sunrise)
                               .toLocaleTimeString("ca-ES", date_options);
        this.sunset = new Date(answer['results'].sunset)
                               .toLocaleTimeString("ca-ES", date_options);

        console.log(this.sunrise);
        console.log(this.sunset);
      }
    },
    err => console.log(err)
    );
  }
 }

Observem l'estructura:
  • [4] Hem importat les classes que necessitarem.
  • [11-18] Declarem les variables internes a la classe, amb el seu tipus (gràcies, Typescript !) i opcionalment amb un valor per defecte. Aquí fixarem el valor de la latitud i la longitud del lloc que ens interessi a partir de les dades GPS (que podem obtenir a través de google maps, per exemple).
  • [21] Afegim el proveïdor per a les connexions a internet en el constructor.
  • [24] ionViewDidLoad és una funció que es crida una sola vegada, i és el lloc ideal per posar-hi codi d'inicialització. En aquest cas, com que les nostres dades no varien gaire sovint, les podem inicialitzar aquí. Val la pena consultar els cicles de vida d'una pàgina a Ionic a NavController.
  • [27-30] Preparem les dades en el format requerit per l'API. Necessitem convertir els números en strings.
  • [32-37] Generem els paràmetre i capçaleres de la nostre petició a l'API, i finalment ho posem tot plegat en un objecte options.
  • [39-55] Fem la petició i quan obtenim la resposta, extraiem les dades que volem mostrar. En cas d'error, traiem un missatge per la consola.
Val la pena comentar que la petició web retornarà les dades al cap d'un temps indeterminat. Per això, el valor es retorna a través d'un Observable, al qual ens subscrivim per rebre el seu valor quan estigui disponible.

Fixem-nos com el fitxer home.ts actua com a controlador de les dades de la classe. Per la seva banda, la visualització d'aquestes es fa en el fitxer home.html:
<ion-header>
  <ion-navbar>
    <ion-title>Sortida/posta de Sol</ion-title>
  </ion-navbar>
</ion-header>

<ion-content padding>
  <ion-list>
    <ion-item-divider color="light">Lloc</ion-item-divider>
    <ion-item>
      <ion-label>Latitud</ion-label>
      <ion-note item-right>{{ lat }}</ion-note>
    </ion-item>
    <ion-item>
        <ion-label>Longitud</ion-label>
        <ion-note item-right>{{ lon }}</ion-note>
      </ion-item>
  
    <ion-item-divider color="light">Data</ion-item-divider>
    <ion-item>
      <ion-note item-right>Avui</ion-note>
    </ion-item>

    <ion-item-divider color="light">Horari</ion-item-divider>
    <ion-item>
      <ion-icon name="sunny" color="orange" item-left></ion-icon>
      <ion-note item-right>{{ sunrise }}</ion-note>
    </ion-item>
    <ion-item>
      <ion-icon name="moon" color="blue" item-left></ion-icon>
      <ion-note item-right>{{ sunset }}</ion-note>
    </ion-item>

  </ion-list>
</ion-content>

L'estructura utilitza tags tipus html que, de fet, són components pre-definits de Ionic. Amb això podem construir una interfície d'usuari agradable sense molt d'esforç: amb llistes, icones, etiquetes, etc...

El més destacable és com podem utilitzar en el fitxer html les variables que tenim definides en el nostre controlador, gràcies als operadors d'enllaç de dades d'Angular. En la nostre aplicació només utilitzem l'operador d'interpolació, {{ var }}, que serà substituït en la pàgina de sortida pel valor que tingui la variable en la classe en cada moment.

Bé, ha arribat el moment de veure el resultat:
 $ ionic serve -c -s

El resultat ens apareixerà en una finestra nova al navegador:


Observem com gràcies a les "Eines de desenvolupador" podem veure els missatges que surten per la consola. En el cas d'un objecte com el que obtenim de la petició a l'API [línia 40], el podem expandir i veure'n tots els detalls.

Però anem a veure com es genera l'aplicació mòbil. De fet, si tenim els SDK d'Android i el XCode ja instal·lats i configurats, és tan senzill com:
 $ ionic cordova build android
 $ ionic cordova build ios

El resultat es pot veure a continuació:


A l'esquerra hi ha una captura de pantalla directe des d'un Samsung S6, i a la dreta el resultat en l'emulador d'un iPhone 7.

Tal com es pot observar, Ionic ens permet obtenir una aplicació que corre en els dos principals sistemes operatius mòbils (i en la web, tot sigui dit de passada) a partir d'un mateix codi.

I parlant de codi, si us animeu a provar l'aplicació, la teniu disponible al GitHub: v0.1 (clavada a ferro). Proveu-la, i ja em comentareu.

Més endavant anirem modificant l'aplicació per permetre variar el lloc i la data, la qual cosa ens permetrà veure noves tècniques de programació, ús del GPS en els dispositius mòbils, etc...
Seguiu l'evolució de l'aplicació:

22 de febrer del 2018

Ionic: aplicació per saber l'hora de sortida/posta del sol (I)

Part I: Preparació

Per mostrar les excel·lències de Ionic, anem a fer una aplicació senzilla. En aquest cas, una que ens indiqui a quina hora surt i s'amaga el sol en un lloc determinat, en un dia determinat. Pot ser interessant per una sortida romàntica o en el seu defecte, per fotògrafs solitaris ;-)

Si no coneixeu Ionic o encara no l'heu instal·lat, podeu llegir el meu article al respecte.

En primer lloc, crearem l'aplicació partint d'una base que ja ens dona el propi Ionic. Per això fem:
$ ionic start SunriseSunset

Escollim la base 'tabs', indiquem que volem generar codi iOs/Android i comença la instal·lació. Quan ens pregunti si volem integrar l'aplicació amb Ionic Pro, li podem dir que no, de moment.

El resultat és un directori SunriseSunset ja preparat. Podem comprovar que tot ha anat bé amb:
$ cd SunriseSunset
$ ionic serve -c -s

Això compilarà l'aplicació i ens obrirà una finestra en el navegador per defecte. En el Chromium, obrim les "Eines per a desenvolupadors" i la barra de selecció de dispositius i se'ns mostrarà alguna cosa similar a:


Podem interactuar amb les icones tal com ho faríem en un dispositiu mòbil. També veurem els missatges que vagin apareixent en la consola, la qual cosa ens serà molt útil per depurar el codi, més endavant.

Si comprovem els missatges que ens ha donat durant la creació del directori font, podrem veure com ja està tot preparat per treballar amb el git (que és sistema de control de versions més utilitzat en l'actualitat). Per defecte està pensat per treballar amb Ionic Pro, però res no ens impedeix de fer-ho en el nostre compte personal a Github.

Primer hem de crear un repositori remot a Github i després associar-hi el nostre directori de treball. Ho podem fer seguint les indicacions de https://help.github.com/articles/adding-an-existing-project-to-github-using-the-command-line/ amb:
$ git config --global user.email "el_teu_correu@email.com"
$ git config --global user.name "El Teu Nom"
$ git config --global push.default simple
$ git commit -m "Ionic. Template tabs."
$ git remote add origin https://github.com/_usuari_/SunriseSunset.git
$ git push -u origin master

Tot seguit comprovem com el nostre repositori a Github ja conté el codi:

Per editar el codi, recomano el VisualStudioCode. És un editor lleuger que ens permetrà treballar sense distraccions i de forma eficient, amb compleció de codi, ajuda en línia i una multitud d'altres funcionalitats que anireu descobrint sobre la marxa.


En la imatge es pot veure l'estructura de fitxers del projecte (a l'esquerra) i el codi HTML modificat amb tags propis del Ionic.

Amb això acabem les tasques de preparació i ja ho tenim tot a punt per a implementar el que vulguem.

Ben aviat comprovarem el senzill que resulta fer l'aplicació que ens hem proposat. Serà en la segona part :-)

Seguiu l'evolució de l'aplicació:

18 de febrer del 2018

Ionic: aplicacions multi-plataforma amb el mateix codi

Com qui no vol la cosa, porto treballant amb Ionic des de fa gairebé un any i mig. Vaig arribar a Ionic v1 buscant una plataforma que permetés desenvolupar aplicacions multi-plataforma (Android, iOS i web) amb els mínims canvis de codi. Justament això era el que oferia Ionic v1.

Però no tot era perfecte. Al cap d'un mes, vaig voler provar una de les betes de Ionic 2. I ja no hi va haver tornada enrere. La nova versió de Ionic afegia el que li mancava a Ionic v1: una millor estructuració del codi, orientació a objectes i SOBRETOT verificació de tipus gràcies a la substitució del javascript pel Typescript com a llenguatge base de programació.


La ràpida evolució d'Ionic m'ha provocat alguns inconvenients quan s'han introduït canvis que trencaven la compatibilitat amb el codi anterior, però en general ha evolucionat en la bona direcció.

És interessant destacar que la base del Ionic és Angular i les tecnologies web: javascript, HTML5 i CSS. Això vol dir que es beneficia directament de l'evolució dels navegadors i de tot el suport a internet en general. I la propera versió, Ionic 4, generarà directament components web, pel que es podrà utilitzar amb qualsevol framework enlloc d'Angular.

Bé, crec que ja he fet prou venda del producte.

Properament veurem com de fàcil és fer una aplicació mòbil amb Ionic. Però mentrestant, si voleu provar Ionic, us aconsello que seguiu les instruccions d'instal·lació per a la vostra plataforma a https://ionicframework.com/getting-started.

Com a consell addicional, instal·leu primer el NVM seguint les instruccions de https://ionicframework.com/docs/developer-resources/using-nvm/. Això us permetrà canviar fàcilment les versions del Node, necessari per executar Ionic, i evitarà problemes de permisos (o haver d'utilitzar el sudo per instal·lar paquets).

Si teniu dubtes, podeu utilitzar els comentaris (o anar directament al fòrum de Ionic). Ànims !

18 de juliol del 2017

LEDE amb adblock: adéu als anuncis no desitjats

Fa poc vaig actualitzar el meu encaminador (router) amb una versió de LEDE amb Fast Path, gràcies a la qual estic aprofitant al màxim la meva connexió de fibra.

Però disposar de LEDE té moltes altres avantatges. Una d'elles és que s'hi pot instal·lar un bloquejador d'anuncis global, sense haver d'anar navegador per navegador, ni dispositiu per dispositiu.

Suposo que no cal que us digui que els anuncis són necessaris per al manteniment de moltes pàgines i serveix gratuïts a internet. Però una cosa és l'ús i l'altra l'abús:


Dos terços de la pàgina dedicats a la publicitat ?? Anem a posar-hi remei. Connectem a l'encaminador (LEDE/Openwrt) per SSH:
$ ssh root@192.168.1.1

I instal.lem els paquets necessaris:
# opkg update
# opkg install adblock luci-app-adblock libustream-mbedtls
# logread -e "adblock"

La darrera línia serveix per comprovar que tot ha anat bé. De totes maneres, la millor opció és anar a la pàgina web de l'encaminador:


Aquí cal comprovar que el bloquejador estigui actiu i que tingui un cert número de dominis bloquejats. El número exacte depen de les llistes que tinguem activades (jo, de moment, tinc les que venien per defecte).

El resultat? Jutgeu vosaltres mateixos amb la mateixa pàgina inicial:


El resultat és una navegació més neta (i ràpida).

I si voleu col·laborar al manteniment d'alguna pàgina en concret, sempre podeu afegir-la a la llista blanca (Advanced -> Edit Whitelist) i tornareu a veure-hi els anuncis. Però a la resta, bon vent i barca nova !

13 de juliol del 2017

LEDE amb Fast Path activat: 300 MB simètrics

Ja fa temps vaig parlar de com posar un firmware Gargoyle (Openwrt) als encaminadors (routers) TP-Link TL-WR1043ND i TP-Link WDR3600 per gaudir de diferents avantatges, però principalment per la facilitat de "trastejar" amb ells.

LEDE es defineix com "un re-inici de la comunitat de l'Openwrt". Va néixer per donar un nou impuls a l'Openwrt, que porta més de dos anys sense treure noves versions. I certament ho ha fet. S'han actualitzat els controladors de les xarxes sense fils (que era un dels temes que més problemes donava) i, en general, s'han afegit molts canvis que havien quedat bloquejats sense arribar al nucli de l'Openwrt.

Actualment, la versió estable de LEDE és la 17.01.2. Us recomano provar-la.

Però si voleu més emoció, podeu instal·lar una versió "en proves" que afegeix el Fast Path, gràcies a l'usuari gwlim (Github). Què és això? Sense entrar en detalls tècnics, es podria dir que optimitza els camins que segueixen els paquets en l'encaminador. L'efecte? Millora la velocitat de les connexions, tant per cable com per xarxa sense fils.

Evidentment, he volgut veure-ho per mi mateix. He instal·lat una versió preparada pel mateix gwlim en el meu TP-Link WDR3600.

Els resultats parlen per ells mateixos:
  1. Prova amb el firmware Gargoyle 1.5. i amb els serveis de "Qualitat de Servei" activats (quotes i priorització de tràfic). Resultat 70MB / 10MB.
  2. Prova amb el firmware Gargoyle 1.5. sense serveis addicionals. Resultat 125MB / 111MB.
  3.  Prova amb firmware LEDE 17.01 amb Fast Path actiu preparada per gwlim. Resultat 304MB / 300MB.


Totes les proves s'han fet amb connexió per cable, en el mateix encaminador i amb pocs minuts de diferència.

Les proves són consistents en diferents pàgines:


En resum, una gran millora que permet treure el màxim profit del servei de fibra contractat, pràcticament triplicant la velocitat obtinguda i sense haver de mantenir l'encaminador de Movistar ni comprar un encaminador d'altes prestacions.

10 de març del 2017

Acer Swift 3 SF314-51-72LF : primeres impressions

El final del 2016 ens va portar la sorpresa d'afegir al mercat un conjunt de portàtils tipus "ultra-lleuger" (per sota del 1,5Kg), amb bones prestacions, i a un preu finalment raonable (per sota dels 1000€). Fins aquell moment, aquest tipus de portàtils estaven situats en la gama professional, és a dir, al voltant dels 1500€.

Hi ha diverses opcions, però nosaltres ens hem decantat per l'Acer Swift 3 SF314-51-72LF amb les següents especificacions:
  • Processador Intel® Core™ i7-7500U (2n, 4t) 2,70GHz fins a 3.5GHz, 
  • 8Gb RAM DDR4
  • 256Gb SSD
  • Pantalla de 14" LED FullHD 1920x1080
  • Intel HD Graphics 620
  • Ports: 1 USB 2.0, 1 USB 3.0, 1 USB-C, 1 HDMI, 1 lector de targetes SD
  • WiFi-ac, Bluetooth
  • Lector d'empremtes, Webcam HD (720p)
  • Windows 10 Home de 64 bits
  • 1.5 Kg, fins a 10h de bateria, acabats metàl·lics
  • Preu recomanat 900 €
Es tracta d'un ordinador lleugerament gran, ja que té una pantalla de 14". La pantalla és Full HD 1920x1080, tot i que hi ha hagut molta confusió amb aquest model i sovint ve anunciat com a pantalla HD (1366x768). La tecnologia és LED, mate. De bona qualitat, però no és un panell IPS. La mida i resolució són ideals per treballar a nivell universitari.

Els acabats són metàl·lics, en color daurat (no el meu favorit, però és el que hi havia). En general, les dimensions són fines, lleugerament més grans que les d'un MacBook Air.

Podem veure el gruix comparant-lo amb una moneda d'euro. També aprecien el lector de targetes, la sortida d'auriculars i un port USB 2.0.

La vista per l'altre costat ens mostra un aparell fi i estilitzat. Observem la resta de connexions: a la corrent, el port HDMI, el USB 3.0 i el USB-C.
El teclat és bo, agradable al tacte, retroil·luminat en color blau i de bona mida. Té lector d'empremtes i una gran zona tàctil si no volem utilitzat un ratolí.


A l'hora de treballar obtenim unes molt bones prestacions, gràcies al seu processador i7, els seus 8GB de memòria i el seu disc SSD (que és la millor inversió que podeu fer en qualsevol ordinador, si encara treballeu amb discos durs convencionals). En general, treballa en complet silenci.

El seu pes és raonable, igual que les 10 hores de bateria, que com qualsevol portàtil, es poden quedar a la meitat si el fem treballar en alguna cosa més que navegar per internet o enviar correus.

Afegim-hi els complements: una bona wifi amb cobertura 5Ghz, Bluetooth, lector d'empremtes i webcam a 720p i obtenim una molt bona màquina a un preu raonable.

Ideal per a un estudiant universitari amb pressupost ajustat però amb necessitats de càlcul considerables.

Punts forts:
  • Procesador i7 de setena generació.
  • Disc dur SSD de 256 Ghz.
  • Pantalla Full HD 1920x1080.
  • Relativament lleuger i amb bona durada de bateria.
  • Magnífica relació qualitat/preu.
Punts dèbils:
  • La pantalla no és IPS.
  • Daurat? No podria ser en color platejat?
En resum, m'atreviria a dir que tenim un portàtil amb una magnífica relació qualitat/preu, especialment si podem aprofitar alguna oferta que ens situï per sota dels 850€.

Ara bé, si anem molt justos de pressupost, podem optar per sacrificar una mica de processador i optar per seu germà petit, el Acer Switft 3 SF314-51-52H, que té les mateixes característiques però incorpora un processador i5 enlloc d'un i7. El seu preu recomanat és de 800€, però es pot trobar en oferta per sota dels 750€ amb una mica de sort.

Dues molt bones opcions d'Acer per al segment mitjà. Què n'opineu?

5 de març del 2017

Nintendo Switch: primeres impressions

Si hi ha una cosa que m'agrada de Nintendo és que procura fer les coses de manera diferent a les dues grans. Ho va fer amb la Wii i penso ho ha tornat a fer amb la Switch.

Però anem a pams. La Nintendo Switch surt a un preu lleugerament superior als 300€ (entre 315€ i 330€, segons si s'hi acompanya alguna coseta més), sense cap paquet d'oferta.

Oficialment, això és perquè cada jugador pugui escollir el joc que més li agrada. Una excusa molt pobre, si tenim en compte que a la data de sortida només hi ha disponible el Zelda Breath of the Wild (bé, per ser del tot correctes, han sortit un parell de jocs més, però de segona fila, cap que pugui anar en un paquet en condicions).

Sigui com sigui, hem sortit ràpidament tota la família per aconseguir-la el primer dia, i això és el que hem obtingut:

La caixa és força més petita que la d'una PS4 o XBox. En obrir-la, hi trobem la pantalla i els dos comandaments. Fixeu-vos en la part davantera de la caixa, que ens indica com connectar-la ràpidament (són les millors instruccions que trobarem).

En aixecar el primer nivell, descobrim un petit manual a l'esquerra (a sota hi ha el carregador), al centre el bloc del comandament i a la dreta la part de la consola que es queda fixa (la que connectarem a la tele).

Traiem totes les peces i descobrim també el cable HDMI i les dues cintes per als comandaments (millor posar-les si hi han de jugar nens).

Per jugar amb la tele, cal muntar el comandament a part i posar la pantalla dins del seu suport. El comandament és més estret i petit que el de la PS4, però resulta còmode i agradable. Els botons són de fàcil accés i còmodes.

El suport té una tapa que s'obre per darrera, i així podem accedir a les connexions pel cable HDMI i el carregador de corrent.

La Switch ve únicament amb 32GB de memòria interna, però cal tenir present que els jocs van en targeta, pel que no s'instal·len. Sigui com sigui, aquesta memòria es pot ampliar amb una targeta microSD normal. D'entrada, no serà necessari, a menys que vulguem fer captures de pantalla com bojos.

Els jocs s'insereixen en la part dreta de la consola. L'obertura sembla fràgil, cosa que pot ser un problema més endavant, si canviem de joc molt sovint. Ara per ara, amb un sol joc èpic a la llista, no té més importància.

La Nintendo Switch arriba amb una actualització de dia zero (cosa que comença a ser massa habitual en jocs i consoles). Sorprenentment, l'actualització es fa en menys d'un minut. I ja estem a punt per jugar !

Els gràfics són correctes (caldrà veure fins on pot arribar, quan disposem de jocs més exigents) i les sensacions al jugar són molt bones. La pantalla portàtil és de mida mitjana, brillant i lleugera, res a veure amb la de la Wii U.

En general, a tota la família ens ha agradat. Hi ha hagut "baralles" per jugar-hi, fet que ja vol dir alguna cosa.

Tot seguit provaré de resumir els punts fort i els fluixos. Segur que em deixo alguna cosa (o algú ho veu diferent), però podeu complementar el que us sembli en els comentaris.

Punts forts:
  • Format innovador, que facilita la convivència familiar en poder alliberar la tele i continuar jugant en bona qualitat, com si res, en qualsevol moment.
  • Bones prestacions, tot i que està per demostrar amb un catàleg de jocs disponibles també en les consoles de la competència, per poder comparar en condicions.
  • Pot treballar en wifi en la banda dels 5 Ghz. Si tenim un encaminador (router) que ho suporti, podem evitar les congestions habituals de les xarxes sense fils en la banda dels 2.4 Ghz.
  • És completament silenciosa, en tot moment.
Punt dèbils:
  • Els comandaments només es poden carregar quan estan connectats a la pantalla portàtil. Potser haurem d'abandonar la tele i passar-nos al format portàtil en mig de la gran batalla !!!
  • Només funciona per wifi, cosa que pot ser un problema en entorns molt "sorollosos".
  • El catàleg de jocs inicial és ridícul, es miri com es miri. Per sort, el Zelda és molt Zelda i pot amargar aquesta mancança prou temps com per que es pugui alleugerir aquest tema.
En la valoració subjectiva de la rebuda familiar, puc assegurar que de moment la Nintendo Switch assoleix amb una nota molt alta. I vosaltres, com ho veieu?