Archive for the ‘oficina movil’ Category


Seguramente escuchas música con tu celular y tus audífonos y pensarás que es una buena manera de ir por la calle o en la oficina. Si estás contento con la calidad del audio déjame decirte que esa calidad es probablemente muy baja.

La música es en su origen analógica, pero por temas prácticos la convertimos en digital para poder tenerla en nuestros equipos móviles o en las computadoras. Es por esta razón que los puristas del audio aún siguen prefiriendo los tornamesas y los discos para cuando quieren la mas alta calidad de audio.  También es por esta razón que nuestros aparatos requieren de un componente para convertir el contenido digital de tu MP3, FLAC, ALAC o cualquier otro formato de música que tengas, a una señal que finalmente escuchas por los audífonos o parlantes. La noticia es que ese componente es muy malo en la mayor parte de dispositivos por lo que es muy posible que no estemos obteniendo la mejor calidad de audio.

Ahora veamos la solucion: La cadena de calidad.

Para obtener la mas alta calidad de audio debemos considerar todos los elementos de la cadena: la fuente – la conversión – el amplificador – el parlante.

La fuente: Si tu archivo es un MP3 que te bajaste de Internet es muy probable que sea muy malo. Servicios de música como Apple Music, Deezer o Spotify utilizan formatos HD como ALAC, FLAC y los fanáticos están usando DSD. Mientras mayor calidad, mayor tamaño del archivo. Si quieres alta calidad de audio, tendrás que esperar archivos mas grandes.

La conversión: La información digital se tiene que convertir a analógico para el que existe un componente denominado DAC (Digital to Analog Converter). Hay equipos que tienen un DAC mas o menos aceptable pero en general la regla es que cualquier DAC externo es mejor que un DAC interno. Los DAC externos los hay de todo precio y la ganancia en calidad es notable. Se caracteriza porque la conexión es a través del conector de datos (OTG para Android, Lightning para IOS y USB para la computadora)

El amplificador: La señal de audio analógico puede ser muy detallada pero no necesariamente en el nivel de volúmen adecuado ya sea porque fue mal grabada la fuente o el DAC es muy limitado. Es por eso que el Amplificador se encarga de nivelar las ondas analógicas. Dado que ya están manipulando la onda, por lo general también aprovechan para modular la señal incluso se suele combinar con un DAC para tener una solución única de conversión. Así que si tu música te parece que suena muy baja, es porque necesitas un amplificador. Se caracteriza porque se puede conectar mediante el jack de audio o por Bluetooth y no requiere una conexión de datos con el dispositivo.

El parlante: Aquí me refiero a cómo escuchamos la música, y puede ser por tus audífonos como por un parlante. Para muchos, es la forma más simple de mejorar el audio que escuchamos, la realidad es que es la mejor forma de botar el dinero. Puedes tener audífonos que pueden llegar a costar miles de dólares pero como ya expliqué, no hará nada para mejorar una señal de audio de mala calidad ni para amplificarla. Ciertamente hay audífonos que se escuchan mejor que otros pero es por su configuración base lo que no asegura que nuesta música se escuche bien en cada ocasión o que estemos obteniendo toda la calidad que se brinda en los demás elementos de la cadena.  Como un caso especial, hay algunos audífonos que si mejoran la señal que reciben ya que integran un DAC/Amp lo que los hace sonar muy bien y pueden agregar funciones interesantes como cancelación de ruido externo y amplificación.

Todo este lío se puede simplificar en lo siguiente:

  • Busca tu música de una fuente confiable. Si te los bajas de Internet, no te bajes los más pequeños, busca los más grandes. Si usas Deezer o Spotify, prueba las subscripciones pagadas que te dan la opción de audio de alta calidad.
  • Compra un DAC/Amp. Cómo dije, hay de todo precio y el salto de calidad es notable. Por ejemplo, Fiio K1  para equipos Android (no olvides comprar tu adaptador OTG) y el Fiio i1 para iPhone, ambos tienen un precio manejable y en el caso del Fiio K1 puede servir también para mejorar el audio de tu computadora.
  • Invierte en tus audífonos. Hay varios tipos y tamaños pero la sugerencia es :
    • Si vas a estar en la calle o en ambientes ruidosos: Cerrados que cubra todo el oído o dentro del oído. Cualquier Sony cerrado hará la tarea y en el caso de compactos el Xiaomi Piston 3
    • Si vas a estar en un ambiente cerrado: Abiertos definitivamente y un buen comienzo puede ser el Xiaomi Hifi

Lo mas importante es que empiecen desde lo básico y que luego vayan mejorando su cadena. De nada sirve tener unos audífonos muy caros si es que no tenemos un buen DAC o amplificador, o si usamos unos mp3 de baja calidad. Siempre se escucha el componente de menor calidad, así que compren con calma.

Advertisements

Apple acaba de aprobar SuperComics v2 para iOS con lo que completo las 3 principales plataformas de aplicaciones: Android, Windows Phone y iOS. Finalmente, cumplo con entregar una aplicación que soporta casi todo lo que hay en el mercado con una sola base de código. Aún en el horno está la versión para Windows 10 y para cuando le encuentre la forma de monetizarlo, la versión Web.

La motivación tras este proyecto fue la de realmente darle una mano al mundo Cómic en Perú, pues esta muy bien que salgan muchos a publicar pero para el coleccionista, hace falta un orden y saber, al menos, que hay para comprar en el kiosco, así que inicialmente este proyecto es un catálogo. Y el segundo punto es que sea realmente una aplicación móvil que demuestre que se puede hacer una aplicación multiplataforma con soporte de datos fuera de línea y todo que funcione con recursos limitados. Hasta ahora, me parece que se han cumplido los objetivos y aún hay espacio para mejoras.

Sobre el tema del catálogo de cómics: no soy un experto en el mundo editorial pero por lo poco que me han ido contando las personas que si están en este mundo, me doy cuenta que el detalle común es el super esfuerzo que hacen muchos para publicar, incluso yo diría que lo hacen por un tema de orgullo personal, o simplemente decir que sacaron un cómic por lo tanto, no se les puede pedir planificación ni estrategias de distribución ni de marketing. La suerte es que hay mucho compromiso de gente fanática que ayuda, como por ejemplo las tiendas de cómic que cada día son mas donde los dueños son los más fanáticos. A todos los que piensan publicar o ya están publicando cómics localmente yo les recomendaría estos tips:

  • Creen un roadmap: Si van a sacar un cómic, piensen primero en cuantos cómics serán y el formato, 5 grapas o 2 libros o lo que quieran, y establezcan un cronograma de publicación, cada 15 días, cada mes. Con esto podrán distribuir mejor sus recursos, y por sobre todo, podrán dedicar a alguien a la difusión. ¿Que tan grande debe ser el roadmap? dependerá de cuantas publicaciones quieran hacer: el cielo es el límite.
  • Comuniquen: la idea de comunicar es la de dar a conocer el roadmap al público objetivo con una doble intención: que la gente se entere y lo más importante: MEDIR. Crear un grupo de Facebook no es suficiente, tienen que estar al tanto de que artículo, foto o video ha sido el más visto, o cuantos Likes obtienen o corazones en Twitter, o reproducciones en Vine. Medir les permite establecer el tamaño de su público objetivo y determinar el tiraje de su cómic. Mientras mas tiempo comuniquen y mas tiempo midan, podrán determinar mejor el tamaño de su mercado.
  • Presenten: Si son un cómic nuevo, lo mejor es dar avances. A SpiderMan ya lo conozco, pero si me dicen “Capitan Guachiman” no tendré idea de lo que encontraré al abrir la revista. Otro punto importante es la impresión, no soy fan de las que se imprimen en papel couché y tienen el acabado de fotocopia, prefiero el acabado simple y opaco tipo Frank Miller, lo mismo aplica con los colores, si no coloreas bien, o no tienes plata para la imprenta, ve por los dibujos a tinta china y listo.

Como Bonus: las portadas. SuperComics se basa en mostrar portadas porque es la forma más fácil de identificar un cómic, pero lo principal es saber que números hay, desde cuando están disponibles y todo lo demás. En algunos casos, hay celos de parte de la editora en sacar las portadas antes de la publicación y es comprensible, pero la realidad es que si hablamos de Cómics gringos, todas las portadas ya están en Internet desde hace tiempo. Es mejor salir a comunicar con las portadas, como lo hacía Comics21 al principio, pues te hace más fácil la búsqueda de números atrasados y eso lo digo por experiencia: casí le he hecho aprender Inglés a la señora del Kiosco en Jesús maría donde compro mis revistas, pues yo le pedía “SpiderMan: One More Day issue 2” y la señora se echaba a bucear en la pila de revistas que tenía y pues fácil no resultaba. Ahora sólo le enseño la imagen y ya me saca la revista. Si la editora no quiere soltar las portadas, no hay problema mientras suelte el cronograma, aunque lo ideal es que suelte los dos.

Sobre la aplicación: Cuando decides coleccionar cómics es como cuando juntabas las figuritas de tu álbum, necesitas saber cuantos son, cuáles y cuando los puedes encontrar en tienda. Yo comencé con los cómics de Perú 21 y la cosa no era muy fácil pues no había gente que supiera vender cómics así que encontrabas cómics doblados o escondidos cuando ibas al kiosco, o peor aún, una semana había, y la otra no, fatal. Ahora el tema es más ordenado y si vas a una de las tiendas especializadas, hasta sales con tu bolsicartón gratis. A pesar de la mejora, sigue siendo necesario saber, cuantos, cuáles y donde encontrar tus cómics.

SuperComics utiliza el concepto “Off-line first” para mantener la base de datos de cómics en tu celular para que puedas consultarlos hasta en un sótano o en algún centro comercial caleta bien al fondo. Incluye tanto la portada como la información general del cómic. Además, podrás marcar dos cosas:

  • Nola/Yala: tal cual era con las figuritas, marcas si ya tienes el cómic y te evites de comprar repetidos.
  • Lista de compras: cuando te das el tiempo de revisar tu colección, sueles encontrar que por alguna razón te falta alguno y lo marcas en un papelito que luego se pierde. Ya no más, si lo marcas en compras, tendrás una sección donde verás los cómics que te faltan comprar y de esa manera vayas confiado a la tienda o a la reunión de coleccionistas para hacer tu intercambio.

Finalmente, si tienes la portada te gustaría pasársela a alguien, ya sea porque la quieres cambiar, o simplemente para sacarle cachita a alguien, así que también es posible que compartas la carátula por redes sociales. No todas las redes sociales dejan compartir la misma información, por ahora Twitter es mi favorito, pero si te gusta, también puedes compartir por Whatsapp.

Además de eso, existe un catálogo de Editores, los que pude conseguir hasta ahora, donde encontrarás las colecciones publicadas todas ordenadas para que las busques como te de la gana.

Y como no podía ser de otra manera, incluí una sección con las tiendas especializadas en cómics y su mapa para que las encuentres fácil.

Ahora bien, todo esto no valdría mucho si es que no estuviera al día. Actualmente la base de cómics en la aplicación es de aprox 400 cómics publicados desde el 2012 en adelante, lo que quiere decir que hay como 300 cómics más publicados desde el 2008 que aún no están registrados, aunque es sólo cuestión de tiempo. Para los que ya instalaron el App habrán notado que la primera vez se toma algo de tiempo y esto es porque se indexan todos los cómics localmente. Esto es para que no tengan que estar descargando la info desde Internet a cada rato, así que se les agradece la paciencia.

Sobre las actualizaciones estás son automáticas y van de dos tipos:

  • Mayores: Si son actualizaciones muy grandes (Principalmente cuando suba cómics antiguos) sacaré otra versión del app con toda la información incluida. Es por esto que el instalador debe rondar los 20 mb.
  • Menores: Lo nuevo es pequeño y se va actualizando automáticamente en tu app cada vez que tengas Internet. Para que se hagan una idea, cada cómic nuevo pesa unos 24Kb y en promedio salen 2 por semana, así que casi no te cuesta, y si gorreas Wifi de StarBucks te sale gratis.

Lo que se viene: 

  • Creo que la dinámica que mueve todo el tema de cómics es el intercambio, por lo que estoy trabajando en algún método para que puedas publicar tus repetidos y que los que estén a tu alrededor vean y puedan interactuar.
  • Ahora ya puedes marcar los cómics que ya tienes, pero deberías poder respaldar esos datos. O deberías poder reinstalar el app y recuperar todos tus cómics marcados. Técnicamente, esto ya es posible en la versión actual, pero supone un costo que no puedo asumir, así que sigo trabajando para bajar ese costo,o ver la forma que la gente interesada pague por el servicio.

La decepción:

  • Los códigos de barras: Hubiera sido genial que estos códigos nos ayuden a identificar los cómics, pero la verdad es que no sirven por una simple razón: no son únicos. En el caso de Comics de Perú21, suelen poner un mismo código a toda una colección, o sea hay 4 o 6 cómics con el mismo código, incluso han llegado a poner el mismo código de barras en más de una colección, plop. En Editora Vuk, han sido más cuidadosos y si tienen código único, en realidad tienen dos: un código para la colección y otro más para identificar el cómic. Otros simplemente no lo usan y ya. En conclusión, el código de barras es inútil para identificar el cómic, así que olvídate. Sería genial que todas las editoras usaran un sólo formato de código de barras, mientras tanto no será posible aprovecharlos en el app.

Download_on_the_App_Store_Badge_ES_135x40Spanish_wstore_black_258x67en_generic_rgb_wo_60


Aunque no tenga acceso a ninguno de estos dos equipos, podemos ver por las características sobre el papel y del rendimiento de los equipos de la generación anterior, como se comparan estas dos alternativas.

Primero, estas computadoras están orientadas para el trabajador móvil, tomador de notas que va desde el lápiz al teclado según sus necesidades y donde casi el centro de su productividad pasa por usar Office. Para ser más específicos, OneNote para la toma de notas con el lápiz, y Word, Excel y Powerpoint para la productividad de oficina tradicional con el teclado. En este caso, Pixel no ofrece una opción de lápiz, se supone que dejará que sus socios desarrollen esta opción

Ahora veamos punto por punto:

Sistema Operativo: Pixel C es android tal cual lo conocemos, mejor dicho Android 6 que vendrá con mejoras pero igual será muy parecido a lo que ya tenemos pero por sobre todo un sistema operativo de móviles.En el otro lado Windows 10 hace la diferencia.

Productividad: Office es aquí nuevamente la clave de todo. Como siempre en Surface tenemos la opción de ir por el full experience gracias a Office 365.

Teclado: Google si que la pensó bien al diseñar su teclado, ya que es rígido lo que significa que se puede utilizar sin problemas en cualquier circunstancia mientras que con Surface 4 siempre necesitaremos una mesa, de todas maneras, Surface ofrece un teclado con más funciones como el trackpad y el sensor de huellas.

Stylus: Pixel C no ofrece un stylus.

Batería: Google ofrece el Pixel C como un equipo de 10 horas de batería lo cual es aceptable para un tablet contra las 8 horas promedio que puede ofrece Surface 4

Precio: Obviamente Pixel C empieza más barato porque ofrece menos cosas, es así que comienza en 499 USD contra los 899 de Surface con stylus incluido. También el teclado aquí costará 150 USD en promedio.

En conclusión, Google diseño un gran teclado pero no es suficiente para hacer un gran producto.


Aunque no tenga acceso a ninguno de estos dos equipos, podemos ver por las características sobre el papel y del rendimiento de los equipos de la generación anterior, como se comparan estas dos alternativas.

Primero, estas computadoras están orientadas para el trabajador móvil, tomador de notas que va desde el lápiz al teclado según sus necesidades y donde casi el centro de su productividad pasa por usar Office. Para ser más específicos, OneNote para la toma de notas con el lápiz, y Word, Excel y Powerpoint para la productividad de oficina tradicional con el teclado. Además de eso, el stylus ha sido repensado como una herramienta para los artistas que antes pensaban solamente en Wacom para sus necesidades de sketching.

Ahora veamos punto por punto:

Sistema Operativo: Surface Pro 4 es una computadora que corre Windows 10, es decir, el mismo sistema operativo que tenemos en la laptop o PC, por lo que podremos cargar con todas las aplicaciones que ya usamos el día de hoy y no una versión móvil de las mismas. iPad Pro es una versión más grande del iPad que viene con iOS que es eso, un sistema operativo para móviles, que se porta muy bien, pero que no puede ejecutar las apps que ya tenemos en el laptop o PC que ejecuta Mac OS X, si bien se porta muy bien en los móviles, hay cosas que no puedo hacer.

Productividad: Ambas alternativas han sido promocionadas con Office, de hecho, Apple le hizo mas bulla a Office que el propio Microsoft (de hecho apenas mencionaron PowerPoint), y si asumimos que ambas ejecutan la versión mobile de Office, podremos decir que la experiencia es la misma. Solamente en el caso de que usemos la versión completa de Office 2016, el Surface será mas completo que iPad, y eso es posible ya que el equipo viene con un año de Office 365 que permite justamente eso, usar la versión full por 1 año y además, podremos usar todas nuestras apps que tenemos en el desktop.

Teclado: Apple me decepcionó con su teclado para el iPad Pro porque es una versión recortada del teclado de Surface. Ahora Microsoft entrega un teclado con mejor disposición, un mecanismo de tecla mejorado, mejor trackpad y un lector de huella digital. En ambos casos, el teclado no es rígido, lo que hace que el conjunto sea funcional pero algo débil, si es que tenemos que usarlo sobre las piernas.

Stylus: Apple reintrodujo el stylus como Apple Pen ofreciéndolo como herramienta de notas y además como pincel digital, a lo que muchos artistas respondieron con un no no, pues el rendimiento profesional de sus actuales máquinas no se puede igualar con la apuesta de Apple. Ahora el nuevo stylus de Microsoft ha recobrado la fuerza que perdió en su generación anterior y además se ve potenciado con todas aquellas funciones que reclamaron los artistas como sensor de presión (que también tiene Apple pencil) , puntas intercambiables, borrador, parallax y velocidad de respuesta a fin de sentir la máquina como un verdadero lienzo. Ahora sólo falta saber que opinan los artistas. Los tomadores de notas, igual agradeceremos las funciones adicionales.

Batería: Microsoft dice que Surface ofrece 9 horas de batería mientras que Apple dice que iPad Pro tiene 10 horas de batería. Lo cierto es que Surface sufre más con las apps cargadas que iPad por lo que estimo que esas 9 horas serán realmente unas 6 y en el iPad serán unas 8 a 9 horas, lo que igual es más de lo que tenemos ahora.

Precio: Apple comienza en 799 USD y Microsoft en 899 y en ambos casos el teclado sale como en 150 USD. Además, Apple no incluye el Apple Pen que cuesta 100 USD mientras que Microsoft si incluye el stylus lo que equipara el precio.

En conclusión, Microsoft realmente la ha hecho bien esta vez con Surface, puesto que técnicamente ofrece un producto superior, y peleando incluso el factor donde Apple ha reinado por años: el ‘cool’ factor.


Microsoft acaba de anunciar su nueva línea de equipos que marcan una tendencia clara en el tema de la computación móvil, ya no estamos atados a una PC. La PC ha muerto. Como siempre, la computación podríamos separarla en empresarial y de consumo.

En el mundo empresarial, el tema es claro, los teléfonos Lumia pueden ser estaciones de trabajo que el trabajador se puede llevar a su casa. De aquí en adelante, la solución empresarial pasará por lo potente que sea la herramienta de gestión y lo potente que sea una nube empresarial que gestione la información crítica. Las PCs ya pasaron a la historia. Teniendo en cuenta que tablets con full Windows 10 home ya están disponibles, incluso pequeñas cajitas que solo requieren de un monitor, podríamos esperar unas cajas parecidas corriendo Windows 10 Pro o Enterprise. Ahora, si es posible tener esa caja convertida en un teléfono, mucho mejor, mientras que se pueda controlar la seguridad de ese teléfono dentro de mis herramientas del dominio.

Al teléfono podríamos asignarle un grado de movilidad 1, ya que puedo trabajar en el mismo dispositivo y cuando quiera ser más productivo, podría ponerle un monitor, teclado y mouse. El problema es que esas cosas no están botadas por todas partes. Podría tener uno de esos en la oficina y otro en mi casa y ya no necesito PC.

El siguiente nivel es la tablet, o lo que hoy conocíamos como la línea Surface que tenía una versión Pro, ahora es simplemente Surface y es una tablet super delgada que tiene un teclado accesorio que le añade un trackpad multitouch, un lector de huellas y el mejor teclado portátil al día de hoy. Además, tiene un docking station que permite conectarle puertos USB adicionales, dos monitores y hasta un puerto Ethernet, que nuevamente puede usar un monitor externo y convertirse en una PC regular. La novedad aquí es el stylus que es simplemente lo que hacía falta para competir contra Apple porque tiene un muy pequeño parallax (lo que escribes se ve en la pantalla en el punto preciso que tocas), sensor de presión y hasta diferentes puntas como las que hay en los lápices reales. Han pensado hasta en el borrador y en el magneto que lo mantiene pegado al tablet cuando no está en uso. Es tan delgado que puede ser un reemplazo a nuestras libretas físicas del día de hoy sin problema.

Al tablet le damos movilidad 2, porque si bien podemos usarla como tablet y como laptop, la unión magnética del teclado y la tablet no ha cambiado por lo que se hace algo complicado trabajar si no tienes una mesa. Es lo mismo que se comentaba con el primer modelo de Surface lanzado al mercado.

La novedad mayor es la introducción de Surface Book que es una laptop con un concepto que no es nuevo pero que no tuvo mucho eco cuando Asus sacó su modelo transformer que tenía un teclado que le daba batería y disco adicional. En este caso, Surface book es una full laptop de 13 pulgadas que además es una tablet tal como el Surface regular, pero que incluye un teclado rígido que guarda un GPU Nvidia que le da un empujón cuando se trabaja en modo laptop. A un precio base de 1500 USD estamos hablando de una laptop que se vende como laptop, pero que no deja de lado la experiencia de su nivel inferior tipo Tablet note taker. Con una batería que ofrece 12 horas de duración promedio, estamos hablando de la primera laptop diseñada por Microsoft que se pone delante de la competencia en un segmento que Microsoft creó desde nada y que yo llamé Ultra Convertible.

A la laptop le damos la movilidad 3 porque puede ser utilizada en cualquier entorno gracias a su teclado rígido que es un accesorio obligatorio.

Pues bien, el problema ahora es que comprar.

Para la casa nos podría bastar la experiencia del teléfono pero quizá muchos opten por la opción tablet, lo que haría que el teléfono se vuelva en algo redundante, o tal vez podríamos considerar como una segunda PC.

Para la oficina, muchas de las estaciones podrían ser reemplazadas por teléfonos, o por cajas (que las consigues por menos de 100 USD) donde solo agregas Pantalla y teclado/mouse. Para experiencias mas top se puede usar la tablet, y los que requieren alta productividad se van con el tablet.

Para el super goloso, el laptop es la única opción.

El tema es que pasa cuando quieres subir. Para muchas de las tareas rutinarias, la experiencia teléfono tiene la potencia necesaria, pero la capacidad escribir en pantalla y un teclado puede ser el killer feature de Microsoft estas fiestas, por lo que para tareas comunes, el tablet será el equipo para la mayoría.

Si fuera Apple, tendríamos que decidir entre tablet o laptop, entre iOS y Mac OSX, pero con Microsoft esto no sucede ya que todos los equipos ejecutan Windows 10 con excepción del teléfono, pero han hecho un gran trabajo con lo que llaman aplicaciones Universales que permiten que las herramientas que necesitamos funcionen igual tanto en el teléfono como en la tablet y también en la laptop, Windows 10 mobile es exclusivo de los teléfonos ahora lo cual suena bien, porque en un teléfono queremos tener una batería de duración super larga.

Microsoft tiene en Windows 10 la llave para conquistar el mercado de computación personal y con estos nuevos equipos parece que tomará el liderazgo en el segmento de computadores móviles después de mucho tiempo, donde el mayor mérito está en crear un segmento nuevo y sorprender a los otros dos grandes como son Apple y Google y a la primera reacción de éstos, ganarles con no sólo un equipo sino con una estrategia, al punto que incluso sus competidores utilizar uno de los componentes de la estrategia como es Office 2016. Incluso en precios, parece que ni iPad Pro ni Pixel C podrán contra el Surface 4 Pro.

Espero que me caiga del cielo una Surface Book, que ya se puede pre ordenar con el modelo top of the line en 2700 USD. Dado que es un accesorio debería ser más fácil para Microsoft sacar teclados de distintos idiomas, el mayor problema con laptops Windows al día de hoy.


En las noticias se puede leer hoy que un Operador ofrece “Internet gratis” usando el famoso “Internet.org” de Facebook y los comentarios no son nada halagadores, comenzando con “engaño” hasta amenaza hasta “atentado” a la libertad de Internet.

La cruda realidad es lo siguiente:

  • Internet.org es una opción comercial creada por Facebook para capturar aquellos mercados donde el acceso a Internet aún no es masivo con la intención de “capturar” usuarios nuevos. Teniendo en cuenta que estos usuarios tendrían una experiencia limitada, Facebook se volvería el “internet” para los pobres.
  • Internet.org suena bonito para el operador por que se pueden utilizar dos palabras: “gratis” y “facebook”. Esto no puede sonar mal, más aún cuando hay otras páginas disponibles además de facebook.
  • Internet.org se basa en que Facebook te da acceso, así que ellos podrán ver todo lo que haces y hacer con eso lo que quieran.
  • Hay otro rollo más: Los que no pueden pagar un plan de datos, o los que tienen un plan prepago suelen apagar el servicio de datos para evitar el consumo de saldo. Los Operadores no se benefician de esto así que empezaron a ofrecer Whatsapp gratis y ahora también Internet.org, porque de esa manera ya no apagamos el servicio de datos por lo que queda abierta la posibilidad de que consumamos el servicio de datos ya sea a propósito o por casualidad.

Ninguna de estas cosas me parece mal, al final las empresas tratan de ganarse el pan. El problema está en el usuario: TIENE QUE ESTAR 100% SEGURO DE LO QUE ESTÁ COMPRANDO. Esto quiere decir que la Operadora tiene la obligación de explicar lo que vende y el consumidor también se debe informar por su lado. Ambos por igual.

Es cierto que para muchos tener full Internet es algo normal y hasta necesario, pero no todos tenemos la misma suerte. Si tuviera que elegir, no iría por Internet.org ni loco, pero ese es mi caso en particular y la razón no es que crea que Facebook es diabólico o que me parezca una estafa, simplemente que no me gusta que vean mi tráfico ni que me impongan a que lugares puedo entrar.

¿El acceso a Internet es un lujo? Si, suena feo pero lo es. La razón para esto es que Internet no es una librería, es más como un centro comercial donde puedes encontrar buenas cosas gratis o no. Hay buenos libros como los hay también malos y recontra malos y lo más doloroso es que es la mayoría. Es cierto que puedes entrar a cosas “pseudo educativas” como Wikipedia (que no sigue un método transparente para la creación de sus contenidos), Wattpad (donde hay libros gratis, pero no están curados por edades) y otros contenidos interesantes, pero no hay garantía de que encuentren algo que sea realmente tan confiable como lo que se puede encontrar en un libro impreso.

Cierto que estar en Internet es cool, incluso si ese “Internet” fuera solamente Facebook, pero de ahí a que se vuelva un “servicio público” lo dudo mucho, incluso si hablamos de un servicio tan básico como el correo electrónico.

Hace algún tiempo surgió el proyecto “Huascarán” que ofrecía Internet en colegios con las famosas laptops XO de la fundación “one laptop per child” de Mr Negroponte. Si bien la intención era buena, se trató de una iniciativa que olvidaba la capacitación de los profesores, tal vez en la tecnología y en los métodos que venían con él (entiendo que se capacitaba a los profesores en el método constructivista de la educación), pero no en los temas básicos de fondo que al final son los que más importan.

Si los libros son tan buenos, hay forma que hacerlos llegar de forma eficiente, controlada y con menores costos, y no hace falta que me ponga a decir cuales. El punto es que la tecnología no puede estar por encima del objetivo principal.

En fin, la conclusión es que si puedes vivir sin Internet, o con un Internet recortado y si tienes suerte podrías tener un Internet Full, pero eso no te hace ni mejor ni peor persona y tampoco quiere decir que tus oportunidades en la sociedad se reduzcan. En el peor de los casos, siempre es posible conseguir Internet de algún lado a un precio módico.

Tener Internet full y libre es lo ideal, pero si no te alcanza la plata aún tienes chances, Internet.org es una opción entre muchas pero debes saber realmente que estás comprando un servicio recortado y aceptarlo de tal forma, y si no te gusta un Internet limitado, no te preocupes, aún se puede vivir sin Internet.


Ya terminó el evento de Apple hoy  las sorpresas mas grandes no están en los productos mismos sino en la vision que tiene Apple sobre los mismos.

Todo empezó con el Nuevo OS para el Apple Watch lo que no sorprende mucho ya que lo que se ha visto es que se puede mejorar la productividad sin tener que sacar el teléfono del bolsillo. Es cierto, mas importante que la máquina es la usabilidad y son las aplicaciones las que definiran quien gana: Apple Watch o Android Wear.

Siguió la presentación con el iPad Pro, que es la version de Apple del Microsoft Surface, ya que se trata de lo mismo en esencia: una tablet que se puede convertir en laptop mediante un teclado opcional, incluso también presentaron un Lapiz (no es un stylus) lo que lo hace físicamente equivalente al modelo de Microsoft con una gran diferencia: iPad Pro no usa Mac OSX, usa iOS mientras que Surface usa Windows 10 al igual que la pc o laptop que ya tienes. Eso es grande pues puede ser que tengas muchas apps, pero nunca será igual que tener una laptop. Para un buen grupo de usuarios esto será suficiente, pero para los que esperaban una mac con pantalla táctil, creo que queda claro que no pasará muy pronto, incluso, muchos hipsters estarán odiando haberse adelantado a comprar el ya Viejo MacBook, o la ahora vetusta MacBook air ya que los precios indican ahora  que pueden tener un full laptop por aproximadamente 1200 dólares, lo cual es muy parecido a lo que pagaron por las MacBook.

¿Cómo puede entenderse que iPad Pro no tenga ni USB-C ni trackpad? pues parece que Apple estuviera pensando dejar de lado la línea de Macbooks para ir por iPad Pro, o incluso introducir uno con MacOSX. Al menos por el precio, parece que quisiera matar su propia linea de laptops ligeras, incluso ha considerado la ayuda de Microsoft para que Office sirva como punto de atracción para la nueva línea, lo que afecta directamente a la Surface de Microsoft ya que si nos vamos exclusivamente a la funcionalidad estamos hablando de dos equipos que harían lo mismo: Office y donde pierde Microsoft porque tiene ahora un precio mas alto considerando la línea Pro ya que el procesador del iPad proclama ser superior al del modelo básico.

Si solamente necesito Office para cuando estoy en la calle, elegiría el iPad Pro al Surface Pro. Se ve mejor y un precio mejor. Lamentablemente soy programador y necesito más que Office.

Apple TV es la decepción del evento, porque se trata de un equipo para volver el TV en algo más inteligente y fácil de usar mediante la inclusion de Siri, algo que lo iguala al nivel de un iPod Touch. Si consideramos que tenemos ese poder y más ya podríamos pensar en un equipo más pequeño que permita usar todas esas funciones desde el teléfono o desde el iPod, mas aún cuando 4K fue ignorado por completo. Incluso un Sistema operativo solo para esto parece una exageración. El precio más elevado que la generación anterior me hace pensar que éste no será el producto Estrella de apple.

iPhone 6s trae todo lo que se esperaba, mejor procesador, mejores cámaras, mejor pantalla, y 3D touch o lo que hasta hoy era Force Touch. Podríamos explayarnos en las nuevas características técnicas pero eso no es lo más importante. Lo que importa es que Apple ofrece un programa propio que permite que tengas un Nuevo iPhone cada año por 32 dólares mensuales por 2 años. Asombroso, hasta yo aplicaría.

En conclusion, la estrategia es clara, sistemas operativos especializados para cada experiencia: WatchOS, tvOS incluso iOS definen la nueva experiencia de cómputo para Apple, y trata de decirnos que las laptops ya fueron. Y quizá hasta mas importante es que la tecnología es tan cambiante que a veces es mejor alquilarla que comprarla, suscribo eso completamente.


Esta es una continuación de la serie sobre desarrollo en móviles que comencé aquí. Les recomiendo comenzar a escribir el código fuente desde la parte 1 ya que no se publica el código para descarga.

Me he tomado algo de tiempo para escribir este post por una simple razón: es hora de limpiar el código. Hasta ahora el código que han ido desarrollando es funcional pero tiene cosas que les va a crear problemas cuando quieran hacer algo mas grande. Lo bueno en todo esto es que si han ido cambiado el código desde el post 1, entonces estos cambios les harán mucho sentido. La buena noticia en todo esto, es que puedo publicar todo el código sin problemas.

Comencemos con el archivo app.js:


angular.module('starter', ['ionic','controller','service'])
.run(function($ionicPlatform) {
$ionicPlatform.ready(function() {
// Hide the accessory bar by default (remove this to show the accessory bar above the keyboard
// for form inputs)
if(window.cordova && window.cordova.plugins.Keyboard) {
cordova.plugins.Keyboard.hideKeyboardAccessoryBar(true);
}
if(window.StatusBar) {
StatusBar.styleDefault();
};
});
})
.config(function($stateProvider, $urlRouterProvider) {
$stateProvider
.state('app',{
cache:false,
abstract: true,
views:{
"home":{
templateUrl:"templates/menu.html",
controller:"menuController as menu"
}
},
resolve:{
cats: function(db){
return db.getCats();
}
}
})
.state('app.news', {
cache:false,
url: "/:catId",
views: {
"menuContent":{
templateUrl: "templates/news.html",
controller: "newsController as news"
}
},
resolve:{
noticias:function($stateParams,db){
return db.getNews($stateParams.catId);
}
}
})
.state('app.detail', {
cache:false,
url: "/detail/:id",
views: {
"menuContent":{
templateUrl: "templates/detail.html",
controller: "detailController as detail"
}
},
resolve:{
noticia: function($stateParams,db){
return db.get($stateParams.id);
}
}
});
$urlRouterProvider.otherwise('/');
})

Empecemos poniendo atención en la definición de los estados a partir de la línea 14.

  • Si tenemos un estado que muestra datos que cambian muy seguido en la base de datos, lo mejor es desactivar el cache. Eso lo hacemos mediante el atributo “cache:false” como pueden ver en la definición de cada estado.
  • Los datos es mejor cargarlos en la definición del estado. Esto se traduce en la utilización del atributo “resolve” donde verán que hacemos la llamada al servicio que recupera los datos y los pasa mediante una variable al controlador. Podrán ver que un estado puede recibir parámetros y estos nos sirven para recuperar los datos llamando a los servicios.
  • $ionicPlatform.ready() es muy importante. Conforme nuestro proyecto crezca, notarán que hará falta inicializar algunos componentes o plugins de Cordova. Cordova es el core de todo esto y la noticia es que se demora en cargar, por lo que si tenemos que inicializar algún componente o plugin propio de Cordova tienen que ponerlo dentro de esta función pues se ejecuta cuando ya es un hecho que Cordova ya está cargado.

Ahora nos toca ir a revisar el archivo controller.js


angular.module('controller',['service'])
.controller('menuController',
['$scope',
'$state',
'cats',MenuController])
.controller('newsController',
['$scope',
'$state',
'noticias',NewsController])
.controller('detailController',
['$scope',
'$state',
'noticia',DetailController]);
function MenuController($scope,$state,cats){
$scope.cats = cats.rows;
};
function NewsController($scope,$state,noticias){
$scope.notas=noticias.rows;
$scope.$on('db:changed',
function(event,changed){
$state.go('.', null, { reload: true });
console.log('Recargando noticias');
});
};
function DetailController($scope,$state,noticia){
$scope.event= noticia;
$scope.$on('db:changed',
function(event,changed){
$state.go('.', null, { reload: true });
console.log('Recargando Noticia');
});
};

Aquí si hay varias cosas para revisar. Primero, si bien no hay reglas a la hora de programar, si existen buenas prácticas y la mejor que he encontrado es esta: Angular Style Guide, así que apliquemos algunas reglas.

  • La primera es lo que se llama IIFE. Considerando que el app.js es el archivo principal, tanto controller.js como service.js deben tener todo el código contenido en una estructura como esta:
    • (function(){ … })(); En nuestro caso, hemos incumplido esto para simplificar la explicación, pero pueden agregarlo y verán que el código funciona sin problemas.
  • Verán que las definiciones de cada controlador ahora es algo diferente y es por dos razones:
    • Dependency injection: Esto es casi un formalismo, es decir, la podríamos saltar sin problema pero nos costará cuando usemos herramientas para comprimir nuestro código o para cuando querramos empaquetar nuestro código para evitar copiones. Si se fijan el primer controlador, verán que primero indicamos todos los componentes, entre comillas, que vamos a utilizar dentro del controlador, y luego, tenemos una función como parámetro final sin comillas. Finalmente la función es definida al final incluyendo como parámetros todos los componentes que vamos a usar ya sin comillas.
    • Siguiendo las sugerencias de estilo, el código de cada controlador es ahora puesta en una función aparte a fin de facilitar la lectura del código
  • La base de datos puede cambiar. Para esto tienen que pensar mucho en como diseñar sus estados. En cada controlador he incluido un $scope.$on para recibir el evento $broadcast con el nombre ‘db:changed’ que ya veremos exactamente cuando se genera pero básicamente es que cuando se detecte un cambio en la base de datos debemos refrescar los datos, en nuestro caso, hemos elegido volver a correr el estado mediante la línea $state.go() que vuelve a correr el código.
    • Algo es super importante: Cuando refrescan un estado, el estado padre no se refresca, pero si vemos bien en nuestro caso, el controlador del estado padre no tiene nada de código para refrescar. La clave aquí es que el estado padre se trata de un estado abstracto y estas si se refrescan junto con los estados hijos. Es por eso que basta con refrescar los estados hijos.

Nota final, hay casos en los que su vista no requiera refrescar datos a cada rato, así que evalúen activar el cache o que el refresco de los datos venga de algún evento como un click en algún botón, o un cambio de estado. Refrescar automágicamente cuesta.

Ahora veamos el service.js


angular.module('service',[])
.factory('db',['$q','$rootScope',DbService]);
function DbService($q,$rootScope){
var key = 'bentareadyessharyinessee';
var pass = 'OnEixgKgpt8LyEtl0S5DkAon';
var remote = 'https://'+key+':'+pass+'@supermio.cloudant.com/news';
var db;
function changed(change){
console.log('cambios en la base de datos');
$rootScope.$broadcast('db:changed',change);
};
return {
init: function(){
if (!db) db = new PouchDB('news');
this.replicate();
return true;
},
replicate: function(){
if (!db) this.init();
db.replicate.from(remote,
{live:true,
retry:true})
.on('paused',function(changes){
changed(changes);
});
},
get: function(id){
if (!db) this.init();
return db.get(id);
},
getCats: function(){
if (!db) this.init();
return db.allDocs(
{startkey:'cat_',
endkey:'cat_\uffff',
include_docs:true});
},
getNews: function(catId){
if (!db) this.init();
if (catId)
return db.query('news/topic',
{key:[catId],
include_docs:true,
descending:true});
else return db.allDocs({startkey:'news_\uffff',
endkey:'news_',
descending: true,
include_docs:true});
}
}
};

  • Cuiden la replicación.
    • En la línea 20 verán que iniciamos la replicación  y con el atributo “live” y esto nos garantiza que los cambios se pasan casi instantáneamente pero como todo en la vida, tiene costo, así que consideren tenerlo apagado y encenderlo cuando haga falta. El siguiente atributo “retry” se refiere a que la replicación continúe luego de una falla en la red, tenganlo siempre en true, pero no se confíen.
    • Al encender la replicación podemos especificar eventos. En nuestro caso en la línea 23 encendemos el soporte del evento “paused” que se refiere a que la replicación “live” ya no recibe nuevos cambios, así que podemos decir que la base de datos remota y local son iguales. En nuestro caso, este es un buen momento para refrescar las vistas. Hay otro evento que es “change” que se genera con cada cambio que se recibe, lo cual es bueno pero no tanto porque si refrescamos aquí, tendríamos ejecutando el refresco muchas veces, sobre todo para la corrida inicial y nuestra base de datos local está vacía. Luego utilizaremos estos eventos para crear notificaciones locales.
  • Cuídense de los procesos asíncronos. Todos los métodos en el servicio “db” son iguales en una cosa: todos son asíncronos. Tal como les recomendé, usen los estados en el archivo app.js para llamar a estos métodos y se librarán de la pesadilla de javascript llamada “Promesas”. Ya luego veremos como manejar promesas.

Y listo, todos los demás archivos van iguales y en lineas generales podrán ver que el código está más limpio y ordenado, además, estamos llamando todos los datos directamente desde la base de datos.

Nota final: en lo que se refiere a performance, el consejo básico es que diseñen su app para que no tenga que refrescar automáticamente nada de nada, a menos que sea absolutamente necesario por la simple razón que si bien PouchDB es una buena base de datos, puede volverse bastante pesada si tienen que lidiar con una gran cantidad de datos. Refrescar datos por eventos es la mejor estrategia.

Como podrán ver, no han habido nuevas funciones que hayamos incluido, pero al menos hemos mejorado el código y espero que los consejos y el estilo de programación mostrado aquí les sirva para organizar su código en algo que puedan mantener y entender con facilidad.


Aceptémoslo, no sabemos comprar computadoras.

Es muy difícil escoger la computadora correcta con el precio correcto y es por eso que aún muchas personas o no tienen ningún PC o tienen un equipo por el que han pagado un montón de plata. Si no me cree haga un pequeño ejercicio y compare el precio de una Tablet de Apple o de Samsung versus el precio de alguna laptop que vea en cualquier tienda por departamentos o más fácil pregunten ¿Cuánto costó su teléfono celular?. Simplemente no hay justificación para que siquiera el precio sea similar. Facilidad de uso se dice, mejor digamos moda.

Windows 10 ha hecho más que factible algo que ya se venía dando con Ubuntu, computadoras a un precio bajo con la capacidad de utilizar los mismos programas que tenemos en la PC. ¿De que precio estamos hablando? Revisemos este cuadro:

Opción Precio Característica
HP Stream 7 99 USD · Tablet con pantalla táctil

· 1 gb de memoria

· 32 gb de disco

· Windows 8.1 con Bing actualizable a Windows 10 Home

· MicroSD

Asus Vivo Stick 130 USD · Se conecta a la TV por hdmi

· Teclado y mouse por Bluetooth o USB

· 32 gb de disco

Por los precios mostrados podríamos comprar solamente tablets de marca dudosa.

Incluso hay una laptop (HP Stream 11) cuyo precio de 220 dólares suena a estafa pero no lo es.

La clave en todo esto es el Internet. Mientras tengamos acceso a Internet, la capacidad de estos equipos queda en segundo plano para potenciar lo que se denomina Experiencia. Para verlo más claro, veamos el caso más común para una computadora mientras estamos en la casa: necesitamos escribir un correo electrónico. Primero, no hace falta mucho procesador para escribir, y tampoco es que escribamos a full velocidad, así que si nos toma unos 5 minutos en escribir el correo, seguramente al menos la mitad del tiempo, la PC se la pasó sin hacer nada. Hay otras labores como la de retocar fotos donde si se requiere de potencia, pero ya existe software que trabaja muy bien, y lo encuentran en cualquier smartphone. Lo que debemos notar es que un super procesador y un procesador simple no tendrán mucha diferencia al realizar estas tareas básicas, o en el peor de los casos, la mejoría en la experiencia será mínima. Tareas simples pueden tener una buena experiencia en equipos ligeros.

Es cierto que estos equipos tienen un precio que da miedo pero después de mis pruebas, puedo recomendarlas sobre todo para cuando necesitamos realmente trabajar con aplicaciones que usamos en las PCs. Principalmente, esto puede ser el retorno de la PC a la sala y sobre todo a un precio más cercano a lo real.

Productos que faltan

Ok, ya tenemos computadoras en un stick y tablets con Windows, pero falta aún una forma de utilizarlos correctamente. Para eso recuperemos el concepto de Docking Station, es decir una forma de utilizar estos nuevos aparatos tal cual una PC tradicional. Según esto tendremos dos tipos:

  • Para Tablets (precio aprox:520 USD) : 
    • Monitor o TV con capacidad WiDi o DLNA (Cualquier SmartTV) (400 USD)
    • Teclado y Mouse bluetooth o USB con cable OTG (Por ejemplo, Logitech K400) (30 USD)
    • Wifi para compartir la pantalla y acceso a Internet (30 USD)
    • Opcional: adaptador USB a HDMI para no depender del WiDi  (60 USD)
  • Para Compute Stick (precio aprox 330 USD):
    • Monitor o TV con puerto HDMI (300 USD)
    • Teclado y Mouse Bluetooth o USB (30 USD)
    • Wifi para acceso a Internet

Notas: Los precios deben ser bien entendidos. No es la idea comprar un monitor TV sino utilizar el que ya tengamos. Y si bien 32 gb suena a poco, debemos tomar en cuenta que el Internet es básico para almacenar lo principal en la nube.

Nota 2: Ya es hora de tener un monitor con parlantes y con el puerto hdmi en el frente

Un punto a considerar puede ser el tiempo para boot. Para las tablets se tiene disponible el perfil Connected Standby o Instant go que pueden revisar aqui que permite que la tablet se comporte como un celular. Para los sticks su bajo consumo permite que trabajen encendidos por largo tiempo, y si es posible usar Hibernation entonces es posible guardar el estado cuando las llevemos de un lado a otro.

Finalmente, Windows 10 colaboró en consolidad esta alternativa especialmente para la computadora de la casa y muy pronto para el trabajo en empresas pero tengan en cuenta que Ubuntu también está presente aunque de forma más tímida. Y para los fanáticos extremos, un equipo Android con root pueden probar DriveDroid y utilizar su teléfono como un usb booteable


Esta es una continuación de la serie sobre desarrollo en móviles que comencé aquí. Les recomiendo comenzar a escribir el código fuente desde la parte 1 ya que no se publica el código para descarga.

En la parte 8 dejamos el app con menus que permiten mostrar las noticias por categorías, pero faltaba cargar las categorías directamente de la base de datos, de tal forma que se vayan mostrando automáticamente las categorías nuevas.

Las categorías serán extraídas de la base de datos en una consulta bastante simple y debemos considerar lo siguiente:

  • Debemos poder establecer el orden en que se muestran las categorías. Para eso deberíamos agregar un campo que nos permita establecer el orden.
  • Debemos poder desactivar las categorías. Para eso también agregaremos un campo que indique el estado

Ok, hagamos esto primero entonces, felizmente tenemos pocas categorías. Para ejemplo, veamos como quedaría “cat_01”:


{
"_id": "cat_01",
"_rev": "2-df694a2ed157b1403baa2ca9214d801b",
"nombre": "Nacional",
"descripcion": "Noticias del país",
"tipo": "topic",
"orden":1,
"estado":1
}

Lo mismo para todas las demás categorías. Con estos cambios, consultaremos las categorías, las ordenamos por el campo orden y las filtramos por el campo estado.

Ahora para hacer la consulta tenemos dos alternativas:

  • Usando la clave principal: Todas las categorías tienen un id que comienza con “cat_” entonces podemos usar la clave por defecto. El orden será el orden de las claves: cat_01 luego cat_02 y así, igual podemos ordenarlo al mostrarlo.
  • Creando una vista: estaremos creando un índice solamente para recuperar categorías, ¿valdrá la pena? pues son pocas categorías así que aún no vale la pena ir por este camino.

Listo, ahora empieza lo complicado. Necesitamos que la lista de categorías sea pasado al estado inicial para que pueda ser mostrado. Recordemos que hemos definido un estado abstracto para incluir el sidemenu. Como en el ejemplo anterior, pasar datos a un estado requiere el uso de “resolve”, eso es fácil, lo  complicado es que tenemos que hacer la consulta a la base de datos para obtener esas categorias. Si revisan el archivo app.js, por ninguna parte hago alguna llamada al factory “db” que contiene todas nuestras operaciones por lo que si llamamos alguna operación de datos en el “app.js” simplemente fallarán porque acuerdense que inicializamos la factory db con el método db.init()  en el controlador “newsController” en la línea 8 del archivo “controllers.js” como pueden ver aquí:


.controller('newsController',function($scope,db){
db.init();
$scope.notas=[];
$scope.$on('refrescar',function(event,news){
$scope.$apply(function(){
$scope.notas = news;
})
})
})

Esto nos funcionó en su momento, y como ya podrán darse cuenta, es una mala práctica inicializar las cosas en un controlador. Incluso llamar a un inicializador puede resultar malo. Así que comenzaremos modificando el archivo “services.js” para dos cosas:

  • Ejecutar la rutina init() cuando haga falta y no tener que llamarla en ningún lugar. De esta manera simplemente llamaremos a las consultas y siempre tendremos la db lista.
  • Agregar el método para consultar las categorias

El primer paso es fácil: simplemente agregamos estas líneas al comienzo de cada método:


if (!db) {
this.init();
}

Simple, preguntamos si la variable interna es nula o no, y ejecutamos el método init() cuando haga falta. Agregamos eso a todos los métodos del factory.

El segundo paso también es simple, al igual que el método “mostrar” usamos el método allDocs así:


getCats: function(){
if (!db) {
this.init();
}
return db.allDocs({startkey:'cat_',endkey:'cat_\uffff',include_docs:true})
}

Con tanto cambio, el archivo services.js. quedará así:


angular.module('services',[])
.factory('db',function($rootScope){
var key = 'bentareadyessharyinessee';
var pass = 'OnEixgKgpt8LyEtl0S5DkAon';
var remote = 'https://'+key+':'+pass+'@supermio.cloudant.com/news';
var db;
var cat;
var mostrar = function(){
db.allDocs({startkey:'news_\uffff',endkey:'news_',descending: true,include_docs:true})
.then(function(result){
$rootScope.$broadcast('refrescar',result.rows);
});
};
var mostrarCat = function(catId){
if (catId)
db.query('news/topic',{key:[catId],include_docs:true,descending:true}).then(function(result){
$rootScope.$broadcast('refrescar',result.rows);});
else mostrar();
};
return {
init: function(){
if (!db) {
db = new PouchDB('news');
}
mostrarCat(cat);
this.replicate();
},
replicate: function(){
if (!db) {
this.init();
}
db.replicate.from(remote,{live:true,retry:true})
.on('paused',function(info){
mostrarCat(cat);
});
},
get: function(id){
if (!db) {
this.init();
}
return db.get(id);
},
setCat: function(id){
if (!db) {
this.init();
}
cat = id;
mostrarCat(cat);
},
getCats: function(){
if (!db) {
this.init();
}
return db.allDocs({startkey:'cat_',endkey:'cat_\uffff',include_docs:true})
}
}
});

Y listo, ahora vamos al archivo “app.js” donde vamos a agregar el resolve al estado abstracto:


.state('app',{
abstract: true,
views:{
"home":{
templateUrl:"templates/menu.html",
controller:"menuController as menu"
}
},
resolve:{
cats: function(db){
return db.getCats();
}
}
})

Agregamos la llamada al nuevo método y la pasamos al controlador a través de la variable “cats”. No se olviden de que, ya que estamos llamando a un factory definido en el modulo “services”, tenemos que agregarlo como dependencia. Así que la primera línea de nuestro “app.js” será ahora así.


angular.module('starter', ['ionic','controllers','services','ui.bootstrap'])

Y listo, terminamos con este archivo. Ya terminamos actualizando el modelo, ahora toca el controlador. Aquí simplemente tenemos que recoger la variable cats con las categorias y quitar cualquier llamada a “db.init()”. El controlador “menuController” quedaría así:


.controller('menuController',function($state,$scope,db,cats){
$scope.cats = cats.rows;
$scope.setCat = function(id){
$state.go('app.news');
db.setCat(id);
};
})

Acuérdense que cuando llamamos a la base de datos obtenemos un objeto y dentro de ese objeto el array “rows” nos trae los registros que queremos.

Ahora así quedaría el controlador “newsController”:


.controller('newsController',function($scope){
$scope.notas=[];
$scope.$on('refrescar',function(event,news){
$scope.$apply(function(){
$scope.notas = news;
})
})
})

Como ven, sólo le hemos quitado la llamada a “db.init()”. Y con esto hemos acabado con el controlador y vamos a arreglar la vista en el archivo “menu.html”. Si se fijan en la línea 25 comienza una lista donde todos los valores son estáticos y va hasta la línea 38. Reemplazamos todo eso por un iterador y quedaría así:


<ion-list>
<ion-item collection-repeat="cat in cats | orderBy: 'doc.orden'| filter:{'doc':{'estado':1}}" nav-clear menu-close ng-click='setCat(cat.id)'>
{{cat.doc.nombre}}
</ion-item>
</ion-list>

Cosas interesantes aqui:

  • Collection-repeat es propio de Ionic y es más eficiente en listas largas
  • El array cats es el que metimos en el $scope desde el controlador y tiene todas nuestras categorías.
  • Mediante “orderBy” las ordenamos por el campo “orden” que agregamos.
  • Y mediante “filter” mostramos solamente los que tienen estado =1

Todo lo demás viene del template anterior, incluso para llamar al método “setCat” llamamos al cat.id.

Y listo!, Si prueban el código hasta aquí funcionará, pero hay algunas limitaciones:

  • Si agregan una categoría en el servidor o se cambia el orden de alguna, no se refresca en la lista del menú automáticamente
  • Al inicio se mostrarán todas las noticias, incluidas las que pertenezcan a categorías inactivas

Esas las veremos en el siguiente post. Lo que si es urgente es corregir el estilo del código, siendo el más urgente el que figura en el controlador “detailController” donde verán que tenemos una llamada a db.get y esperamos por la respuesta. Si se habrán dado cuenta, para las categorías es lo mismo pero no esperamos por respuesta en ningún lado, simplemente esperamos valores y ya, así que usemos ese patrón aquí y corrijamos el controlador para que se vea así:


.controller('detailController',function($scope,db,noticia){
$scope.event=doc;
});

y tendríamos que cambiar el resolve de la ruta en el archivo “app.js” para que se vea asi:


resolve:{
noticia: function($stateParams,db){
return db.get($stateParams.id);
}

Y listo. La explicación para este cambio es que como casi todo en JavaScript es asíncrono, tenemos que usar un modelo llamado “promesas” para esperar por la respuesta y hacer algo con eso. Es por esto que usamos objeto.then() y dentro del then() incluimos una función con una operación. Pues bien, al momento de utilizar estados, el componente detrás de toda esa magia (UI-Router!!!) hace muchas cosas bien, y una de esas cosas es manejar la resolución de las promesas y es tan inteligente que esperará hasta que la promesa sea resuelta y podamos recibir los documentos en el controlador. Con eso nuestro código queda mas limpio.

Promises es todo un tema y siempre es un motivo de confusión así que mejor dejar que sea UI-Router quien las maneje. Así que para que se diviertan notarán que para cargar las noticias para la categoría seleccionada podemos usar el mismo esquema anterior. A ver si pueden completarlo por su cuenta.

NOTA: Ya un lector notó que todo es sobre leer datos en el cliente y tiene una razón. Grabar datos es bien simple pero supone que tengamos mucho cuidado durante el diseño, porque si dejamos escribir a un usuario, debemos tener en cuenta que cualquier usuario podrá hacerlo a menos que pongamos un control. Establecer un control requiere de cierto manejo adicional que aún falta explicar. Para que lo vean en perspectiva: 

  • Cualquiera puede escribir:
    • No hace falta establecer usuario y pass al inicio
    • Se debe tener cuidado de no duplicar el id del documento que se vaya a grabar
    • La replicación debe modificarse, porque si hay muchos usuarios, estaremos recibiendo muchos cambios y datos en nuestra db local.
  • Todos usuarios registrados pueden escribir:
    • Hay que incluir usuario y pass
    • También la replicación se tiene que ajustar para controlar los datos entrantes.
  • Sólo algunos usuarios registrados pueden escribir:
    • Usuario y clave es obligatorio
    • Hay que determinar quien puede escribir y quien no. Podemos integrar la autentication propia de CouchDB para determinar esto, pero esto aplica a todos los documentos, lo cual no necesariamente es bueno.
    • La replicación también se modifica pero ya es más simple

Recuerden que más importante que empezar a construir es sentarse a diseñar.





%d bloggers like this: