3 Bases de Datos NoSQL más populares para iniciarse en la Nube

20/11/2017
Artículo original

Bd Cloud

El camino del Cloud generalmente se inicia en migraciones a plataformas de Infraestructura como Servicio (IaaS); en donde realizamos un espejo virtual de nuestra estructura física, sobre la que desplegamos nuestras aplicaciones.

El siguiente paso llega cuando reconocemos que el verdadero valor y productividad de la Nube está en la Plataforma como Servicio (PaaS); y nos enfrentamos a nuevos retos en forma de la transformación y reconstrucción del software, en la búsqueda de la óptima relación coste/beneficio.

Y una de las decisiones iniciales que más impacto tiene, es adoptar el almacenamiento de nuestra información en Bases de datos como Servicio, al seleccionar cual vamos a utilizar en nuestro software; siendo las soluciones NoSQL, un primer paso asequible, de notable sencillez, potente y de coste contenido.

¿Por qué transformar hacia la sencillez?

Lo primero que hay que tener claro es que la adopción de este tipo de servicio no es una “bala de plata” que valga para todos los casos de uso. Es más, las bases de datos relacionales de toda la vida, tiene ventajas y desventajas inherentes, estudiadas y reconocidas sobre este tipo de servicios de almacenamiento.

Sin embargo, para aplicaciones que requieran una forma especialmente económica de almacenar los datos, que se adapten a las características de estos servicios WCS y que permitan cambiar la lógica de persistencia – la capa de almacenamientos de datos – de forma sencilla para migrar a las API de conexión, pueden ser una solución con un ratio de eficiencia excelente.

La clave está en la complejidad de la estructura de datos y de las operaciones relacionales que tengamos que realizar sobre el conjunto de tablas.

Las tres que vamos a analizar en este artículo, son del tipo Wide Column Store (WCS), herederas de este paper de BigTable, que define un almacenamiento en tablas bidimensionales en donde las primeras columnas son los índices (entre una y tres columnas) que identifican de forma inequívoca las filas horizontales que almacenan los registros. A continuación, se define un número indeterminado de columnas en donde se construye la estructura de campos de los registros, de forma totalmente flexible, basado en un formato clave/valor.

Esta aproximación dinámica de la estructura de datos permite evolucionar y transformar la persistencia de la información, sin estar constreñida por las rígidas convenciones de los sistemas relacionales.

También son plataformas con un rendimiento especialmente bueno, tanto en operaciones de lectura como de escritura, al tener un motor de base de datos muy sencillo, orientado a realizar solo lo que se necesita (Listar, Insertar, Actualizar y Borrar), sin pesados lenguajes de explotación como es SQL, y evitando tener que dar soporte a comandos complejos como pueden ser JOIN, GROUP, ORDER, etc.

En resumen, son ligeras, sencillas y rápidas. Y, al ser un servicio Cloud, nos permiten olvidarnos de gestionar el escalado, la alta disponibilidad y la partición de datos; siendo la propia plataforma quien se encarga de asegurar unos acuerdos de servicios (SLA) de más del 99.99%.

Las más sencillas, que no las menos potentes

Public Cloud Market Blog Image 2 640x413

En estos momentos, se está consolidando un monopolio tricefálico en las tecnologías Cloud, estando Amazon en cabeza con una presencia en el mercado de casi el 47%, seguido desde muy de lejos por Microsoft Azure con el 10%, y Google cerrando el club al estar rozando el 4%. El grupo genérico perseguidor está encabezado por IBM y su SoftLayer, que obtiene cerca de un 3%; completándose el restante 36% con una miríada de pequeñas plataformas.

Apache Cassandra es la base de datos WCS que reina de forma indiscutible en este segmento del mercado; pero no la hemos incluido en el análisis al no existir un servicio cloud que nos permita consumirla en formato PaaS.

Sin embargo, SimpleDB de Amazon, Azure Tables de Microsoft y Cloud BigTable de Google, sí que son servicios cloud de base de datos NoSQL, que representan el primer eslabón a la persistencia de información más allá del almacenamiento binario.

En la siguiente tabla se puede observar la comparativa directa de los tres servicios:

Descripción

Microsoft Azure Table Storage

Amazon SimpleDB

Google Cloud Bigtable

Modelo de base de datos

Wide column store

Wide column store

Key-value store

Desarrollador

Microsoft

Amazon

Google

Publicación inicial

2012

2007

2015

Esquema de datos

Libre

Libre

Libre

Tipos predefinidos

Si

no

no

Métodos de acceso

RESTfull API

RESTfull API

gRPC (using protocol buffers) API HBase compatible API (Java)

Lenguajes soportados

.Net (todos), C++, Java, JavaScript, PHP, Python, Ruby

.Net (todos), C, C++, Erlang, Java, PHP, Python, Ruby, Scala

Go, Java

Método de particionado

Sharding Sharding ninguno

Consistencia

Immediate Consistency

Eventual Consistency Immediate Consistency

Immediate Consistency

Transacciones

Bloqueo optimísitico

no

Operaciones atómicas en un registro

Control de acceso

Derechos de acceso basados en permisos sobre le servicio, autenticación por clave privada y firmas compartidas

Derechos de acceso vía AWS Identity and Access Management (IAM)

no

Popularidad

Puesto 66

Puesto 91

Puesto 159

Hay que señalar que SimpleDB no es realmente una BD de tipo WCS, sino Key-value Store. Su funcionamiento es prácticamente igual que las del resto de la comparativa, teniendo su principal diferencia en que no está diseñada para grandes volúmenes de información, como si lo están sus contrincantes.

Sin embargo, la hemos incluido en la comparativa porque Amazon no tiene un servicio WCS, y DynamoDB - que si se puede utilizar de esta forma - se clasifica dentro de un nivel superior de complejidad en donde estaría acompañada por CosmosDB o similares.

Las tres magníficas

Las Tres Magnificas

Utilizando las propias páginas para de cálculo de precios de las tres plataformas Cloud, nos hemos encontrado que los costes son dispares para configuraciones similares: noviembre del 2017, 1Tb. de almacenamiento, en los CPD de Irlanda, con la réplica geográfica por defecto.

  • Amazon SimpleDB: 281$/mes
  • Google BigTable: 174$/mes
  • Azure Tables: 75$/mes

Pero estos precios hay que cogerlos con cuidado, porque hay establecida una guerra sostenida que permite que haya una variación constante (a la baja) de los mismos; que cada calculadora solicita datos diferentes para realizar la previsión de costes; y que los tramos hasta el primer Gigabyte, son gratuitos en las tres Nubes.

Ciertamente no van a ser causas objetivas basadas en métricas de rendimiento o de volumetrías varias las que nos deberían hacer decantarnos por alguna de estas tres magníficas plataformas.

Son realmente rápidas tanto en operaciones de escritura como de lectura, tienen una capacidad de almacenamiento que solo tiene como límite nuestro presupuesto, y la disponibilidad, estabilidad y resiliencia están aseguradas por las Condiciones del Servicio.

Por lo cual cobran importancia factores menos obvios, como puede ser el conocimiento que tengamos del Cloud que lo soporta. Por ejemplo, si el equipo de desarrollo está habituado a entornos Microsoft, va a tender a utilizar Azure y las Tables Storage; en cambio, si la aplicación funciona sobre AWS, lo normal sería decantarse por SimpleDB de Amazon; y escogeríamos Google si nuestro lenguaje principal de trabajo fuese Go.

Ranking Ranking de popularidad

Si acaso señalar como ventaja o desventaja, según el caso, el que BigTable de Google utilice una Api de acceso propia, no tan conocida como la universal API RESTfull de Microsoft y Amazon.

La documentación en todos los casos es excelente y muy abundante en todas las Cloud, yendo un pasito por delante la de Microsoft – que está haciendo un esfuerzo hercúleo por solventar el que era su punto débil hace unos años.

Amazon ofrece, sin embargo, el servicio más longevo y – por ende – más maduro y conocido. Hay que reconocer que llevarle más de una década de ventaja a sus competidores proporciona una seguridad y estabilidad que no se deben olvidar.

Google, a su favor tiene que el servicio de Bigtable es utilizado de forma interna en plataformas tan exigentes como Analytics, Maps, Gmail, etc. confirmando que cumple con las características esperadas.

En resumen, para escoger entre Tables, SimpleDB o Bigtable, lo que hay que hacer es mirar alrededor: qué es lo que sabemos hacer, con qué se tiene que integrar y qué plataforma Cloud es la que mejor queremos trabajar.

Cualquiera de las tres es excelente.

Mas información | Comparativa en DB-Engines; Azure Tables Storage, Amazon SimpleDB, Google Bigtable

También te recomendamos

MongoDB: creación y utilización de índices

24 FRASES Y MOMENTOS QUE EXPLICAN POR QUÉ SERÉIS AMIGAS SIEMPRE

NoSQL y Relaciones

-
La noticia 3 Bases de Datos NoSQL más populares para iniciarse en la Nube fue publicada originalmente en Genbeta Dev por Juan Quijano .

¿Cómo integrar OpenCV y Python en Windows?

20/11/2017
Artículo original

Espero y este post sea de tu agrado, no olvides compartirlo en su redes sociales y sobre todo.. Gracias por seguirnos!

En algunos días comenzaré a subir articulos sobre OpenCV con Python por lo que estoy dejando preparada mi maquina para esto, el primer paso en la instalación de todas nuestras herramientas es Integrar Opencv y Python en nuestro windows. En algunos días realizaremos varios ejemplos de visión por computadora con python y la librería opencv. Ya hemos utilizado algunas librerías con python, como por ejemplo pygame para juegos. Algunas de las cosas que he tenido pendiente por hacer y que realmente tengo muchas ganas es implementar el reconocimiento de objetos con este lenguaje. Pero no simples reconocimientos de rostros que

Compartir en Facebook

Comparte en Google Plus

Compartir en Twitter

El post ¿Cómo integrar OpenCV y Python en Windows? aparece en el Blog de Jonathan Melgoza

10 cosas que cualquier programador debería saber cuando consigue su primer empleo

17/11/2017
Artículo original

Resulta fácil hablar en retrospectiva, echando la vista atrás, así que aquí dejo algunas lecciones que he aprendido desde que empecé a trabajar como programador profesional.

Este artículo es una traducción del original por James R. Stoup.

0000 - Es fácil caer bien

Si llegas a tu hora, vistes decentemente, sonríes y no te comportas como un demente al menos le caerás bien a algunas personas. De hecho, conseguir caerle bien a tus compañeros de trabajo es bastante fácil.

Ahora, ¿quieres tener muchos amigos? Ten un recipiente con caramelos en tu escritorio y mantenlo lleno. Te sorprenderá la cantidad de amigos que tienes de repente.

0001 - Es difícil ganarse el respeto

Sin importar si no tienes experiencia o si llevas 20 años en la industria, nadie te respeta cuando entras por primera vez por la puerta. Esto no significa que no les caigas bien, o que ir a trabajar sea algo desagradable para ti. Esto solo significa que aún no has hecho nada para darles una razón para respetarte.

La forma más rápida de ganarte el respeto es hacer bien el trabajo. No hace falta hacer un trabajo fenomenal, ni un trabajo "impresionantemente hermoso", sino un trabajo efectivo y constante. Tienes que demostrarles a los demás que se puede contar contigo tanto para terminar un trabajo como para hacerlo correctamente, y no tendrás que preocuparte por ganarte el respeto de tus compañeros.

0010 - Todo lo que has aprendido en la universidad es inútil

Aprenderás más en los primeros 6 meses en tu primer trabajo que durante toda tu estancia en la Universidad. ¿Y sabes qué? Tener un trabajo es mucho más estresante porque un día tu jefe te va a pedir que hagas todas esas cosas grandiosas que pusiste en tu currículum. ¿Sabes todas esas cosas que supuestamente aprendiste como estudiante?. Bueno, si fracasas, no puedes volver a matricularte en el curso el próximo semestre. Lo siento, esta vez solo te despiden. Vi como esto sucedía recientemente en mi trabajo. Contrataron a un tipo para un proyecto concreto y fue despedido cuando resultó que no sabía cómo hacerlo.

Aquí va un consejo de máximo interés para aquellos novatos en empresas: la mayoría de los empleadores tienen un periodo de prueba de unos 90 días máximo. Y, básicamente, si te equivocas gravemente, resultas ser un idiota o encuentran que mentiste en tu curriculum, entonces te echan sin miramientos. Es algo a tener muy en cuenta :)

0011 - Nunca dejes de aprender

Lo mejor que puedes hacer es entrar con la mentalidad del que piensa "no sé nada, pero quiero aprender". Esto hará que las cosas sean menos vergonzosas cuando te des cuenta de lo inútil que eres en realidad. Tienes que darte cuenta de que prácticamente todo el mundo sabe más que tú sobre todo.

La buena noticia es que la mayoría de la gente compartirá gustosamente sus conocimientos contigo si haces preguntas inteligentes y prestas mucha atención a lo que hacen los demás. A todo el mundo le gusta pensar que sus opiniones y experiencia son valiosas, así que no dudes en pedir consejos sobre cómo mejorar tu flujo de trabajo. Puedes aprender algo de cada persona con la que trabajas tan solo preguntando. Pídeles consejos, trucos, hacks, métodos o cualquier otra cosa que tú veas que hacen bien y que dominan.

Y observa cómo usan la línea de comandos. Todo el mundo hace las cosas de manera diferente y hay un montón de trucos ocultos esperando para ser descubiertos. Los programadores mediocres (y/o mayores) tienden a pensar que "su" camino es el mejor y por eso nunca piden consejo. Los programadores inteligentes están dispuestos a aceptar el hecho de que podría haber una mejor manera de hacer las cosas. Esto significa que tienes que estar dispuesto a cambiar los lenguajes de programación, entornos, sistemas operativos o editores de texto.

¿Qué? Renunciar a <insertar mi-manera-de-hacer-cosas aquí>? por "¡todo el mundo menos yo sabe qué es el mejor!" Tienes que superar esa mentalidad.

Oh, y es a la vez humillante y frustrante dejar tu zona de confort de lo que ya sabes hacer por algo nuevo y desconocido. Apesta. ¡Supéralo!. La programación es difícil y ser un programador de máximo nivel lo es aún más. Llora en tu tiempo libre.

0100 - Te la juegas a vida o muerte con tu editor de texto, así que elije sabiamente

Si crees que estoy exagerando date un paseo por cualquier empresa de programación y pregunta qué editor de texto es el mejor. Las respuestas típicas tienden a ser Vi, Emacs y algunos IDE (normalmente Eclipse o Xcode). De hecho, probablemente te sorprenderás de la cantidad de personas que todavía utilizan Vi como su primera elección.

La idea que quiero transmitir es que si todavía no estás utilizando ninguno de estos editores, podrías tener un problema. Ve a hablar con uno de los mejores programadores de tu oficina y pregúntale qué utiliza. Luego, asiente con la cabeza sabiamente sobre su respuesta, imprime una hoja de trucos y empieza a aprender ese editor. Rápidamente.

0101 - A nadie le importa en dónde has estudiado

Si alguien te pregunta dónde has estudiado, no te alarmes, no te están juzgando, están intentando mantener una conversación cordial. Si sabes programar bien, entonces a nadie le importa un bledo qué institución ha emitido tu título académico

¿Quieres saber lo que les importa incluso menos? Tus notas académicas. No te molestes en decírselo a nadie porque te hará parecer un presuntuoso. No puedo enfatizar esto lo suficiente.

0110 - El silencio nunca pasa de moda

¿Eres nuevo en el trabajo y no sabes qué decir? No digas nada. Asiente y sonríe. ¿La gente te excluye de su conversación? Cálmate. Ellos no te conocen y tú no los conoces. Dales tiempo y la mayoría de ellos ya vendrán a hablar contigo. Hacer amigos lleva tiempo.

Y sí, sé que es un asco ser el chico nuevo. He estado ahí, me ha pasado. Estoy de acuerdo, no mola. Pero a veces tienes que tragar y esperar. Si no eres un freak, y haces bien tu trabajo, tarde o temprano te convertirás en parte del equipo. La única manera de acelerar este proceso es si eres supera atractivo físicamente para el género opuesto en la oficina. Buena suerte con eso :-P

0111 - Si das con personas raras y desagradables, apechuga con ello

Es imposible caerle bien a todo el mundo. A veces es porque los otros tienen graves problemas emocionales y no se llevan bien con nadie, y te odian por defecto. Estas personas nunca cambian así que tienes que aprender a trabajar con ellas.

Si has logrado hacer un enemigo muy rápidamente, entonces tienes que hacer todo lo que sea necesario para convertirlo en un amigo porque nunca se sabe cómo van a salir las cosas en el futuro y no conviene estar a mal con nadie en el trabajo. He visto suceder esto varias veces. El tipo con el que te cabreas hoy resulta ser tu jefe mañana.

1000 - Llévate bien con los de sistemas

¿Quieres tener siempre el mejor equipo? Se amable con los tipos que se encargan de sistemas. Aquí va una pequeña pista para todos los nuevos en las empresas de programación por el mundo adelante, la mayoría de la gente sólo habla con los de sistemas cuando necesitan algo o cuando algo se rompe. Después de un tiempo, ese tipo de cosas tienden a agriar tu visión del mundo. Así que pasa por su oficina de vez en cuando para hablar. No es para quejarte, no para mendigar un equipo o una instalación, sólo para saludar y preguntar cómo va su vida. Esta es una inversión que siempre vale la pena.

1001 - Nunca te librarás del politiqueo en la oficina

Como el chico nuevo en la oficina (suponiendo que comienzas en una posición lo suficientemente baja) no deberías tener que preocuparte mucho por esto. Pero ten por seguro que cuanta más responsabilidad obtengas, más tendrás que hacer el juego. No puedes escaparte, no importa lo mucho que lo intentes. Puedes elegir no jugar, pero esa elección conlleva sus propias consecuencias.

Esta es una lección difícil de aprender para los muy frikis, ya que preferimos trabajar con los ordenadores más que con la gente. Todo ese rollo de no ser perfil de "personas" pudo haber sido un factor de motivación para acabar trabajando con ordenadores en un principio. Si es tu caso, lo siento, pero si alguna vez quieres avanzar más allá de un cierto nivel de desarrollo profesional en tu carrera tendrás que formar parte de la gestión y unirte al circo político, y a todo esa cultura empresarial en general.

Buen fin 2017 en Hospedaje web – Ofertas y Descuentos

17/11/2017
Artículo original

Espero y este post sea de tu agrado, no olvides compartirlo en su redes sociales y sobre todo.. Gracias por seguirnos!

¿Necesitas un hospedaje web? Estos día son excelentes para adquirir un plan de hosting en muchas empresas en México pues se celebra el Buen Fin 2017 donde podemos hacernos de grandes ofertas y descuentos en planes de hospedaje web de todos los tamaños y caracteristicas, vamos a revisar cuales son los mejores proveedores que tienen rebajas estos días.. Como buenos cazadores de ofertas no podemos dejar pasar esta fecha para hacerte de un plan de hospedaje web con hasta 50% de descuento para disfrutarlo todo el año, o dos, o tres o los que quieras! Este post planeamos actualizarlo varias

Compartir en Facebook

Comparte en Google Plus

Compartir en Twitter

El post Buen fin 2017 en Hospedaje web – Ofertas y Descuentos aparece en el Blog de Jonathan Melgoza

.NET y WebAssembly - ¿Es esto el futuro del Front-End?

14/11/2017
Artículo original

Nota: este artículo es una traducción del original de Scott Hanselman, con su permiso.

Hace 6 años Erik Meijer y yo hablábamos de cómo JavaScript es/era una especie de lenguaje ensamblador. Se convirtió en un debate/discusión interesante (algunas personas realmente no compraban esta idea) pero yo seguí adelante con la idea. Actualmente el mundo de WebAssembly va viento en popa y es compatible con Chrome, Firefox, y está en desarrollo en Edge, Opera y Safari.

"La avalancha ya ha comenzado. Es demasiado tarde para que los guijarros voten". Embajador Kosh

Hoy, en 2017, WebAssembly es algo grande y puedes aprender sobre ello en http://webassembly.org. Incluso hice un podcast sobre WebAssembly con el compañero de Mozilla David Bryant (realmente deberías ver mi podcast, estoy muy orgulloso de él. Es bueno).

La clásica aplicación TODO escrita en C#, y .NET y Blazor

La imagen anterior es de la presentación de Steve Sanderson en el NDC. Está programando la clásica aplicación de lado cliente con JavaScript para llevar una lista de tareas (ToDo)... con la salvedad de que está escribiendo el código en C#.

¿Qué es WebAssembly?

"Webassembly o WASM es un formato bytecode de bajo nivel para secuencias de comandos en el lado del cliente (el navegador), evolucionado desde JavaScript". Puedes compilar fácilmente a WebAssembly desde C y C++ hoy en día... y más lenguajes de programación se están subiendo al carro para incluir WebAssembly como objetivo de compilación cada día.

Puesto que trabajo en .NET de código abierto y como .NET Core 2.0 es multi-plataforma con una versión inminente, merece la pena explorar dónde encaja WebAssembly en el mundo .NET.

He aquí algunos proyectos que he identificado que ayudan a unir el mundo de .Net con el mundo de WebAssembly. Creo que esto va a ser la bomba en los próximos 18 meses.

WebAssembly para .NET

A pesar de su nombre tan general, este proyecto OSS está destinado a consumir archivos binarios WASM y ejecutarlos desde dentro de los ensamblados de .NET. Para ser claros, esto no compila lenguajes de .NET (C#, VB.NET, F #) a WebAssembly, esto es para usar WebAssembly como si fuera cualquier otra pieza de código compilado reutilizable. ¿Tienes un archivo WASM que realmente quieres llamar desde. NET? Esto es para eso.

Curiosamente, este proyecto no lanza un motor de JavaScript V8 o Chakra para ejecutar WASM, lo que hace es leer el bytecode y convertirlo a .NET a través de System.Reflection.Emit. ¡Muy curioso!

Mono y WebAssembly

Una de las grandes cosas que ocurren en el ecosistema .NET es que existe más de un ".NET" en la actualidad. En el pasado, .NET era una cosa que instalabas en Windows y que por regla general te daba miedo. Hoy, .NET 4.x+ está instalado prácticamente en todas las máquinas Windows del mundo, y tenemos .NET Core que se ejecuta en Docker, en Mac, en Windows, en una docena de sistemas Linux... incluso en Raspberry Pi, y Mono es otra instancia de .NET que permite ejecutar código .NET en docenas de otras plataformas. Existen múltiples "instancias de .NET" en desarrollo activo por ahí.

El proyecto MONO tiene dos prototipos utilizando MONO y WebAssembly.

El primero utiliza el modo de compilación estático completo tradicional de Mono. Este compiló tanto el runtime de Mono C y las bibliotecas de clase Mono junto con el código de usuario a código de WebAssembly. Genera una gran aplicación compilada estáticamente. Puedes probar este Hola Mundo completamente compilado estáticamente aquí. La compilación estática completa actualmente vive aquí.

Así que eso es un Hola Mundo totalmente compilado estáticamente... Es todo Mono y tu aplicación metida en WebAssembly. Tienen otro prototipo con una perspectiva diferente:

El segundo prototipo compila el runtime de Mono C en WebAssembly y, a continuación, utiliza el intérprete IL de Mono para ejecutar el código manejado. Esta es una descarga más pequeña, pero viene a expensas de rendimiento. El prototipo de ejecución de modo mixto actualmente vive aquí.

Aquí tienen mucho de Mono ejecutándose en el WebAssembly, pero tu código IL se interpreta. ¡Una de las maravillas de la informática -hay más de una forma de hacer las cosas, y a menudo cada una es impresionante a su manera!

"Blazor"-Framework experimental de UI ejecutando .NET en el navegador

Con una idea similar al segundo prototipo del proyecto Mono, Steve Sanderson tomó otra "instancia de .NET", el proyecto Open Source de 6 años de antigüedad DotNetAnywhere (DNA), y lo compiló en WebAssembly. DNA era un runtime interpretado de .NET escrito en C portable. Toma el estándar IL o CIL (lenguaje intermedio común) y lo ejecuta "en dispositivos con recursos limitados en los que no es posible ejecutar un runtime completo de .NET (por ejemplo, Mono)". Ingenioso, ¿no? ¿Qué "dispositivo con limitaciones de recursos tenemos seis años después?" Vaya, es la pequeña máquina virtual -la MV JavaScript que tu navegador ya tiene, ahora accionado por un formato bytecode estándar llamado WebAssembly.

Para comprobar el concepto, Steve compila DotNetAnywhere a WASM pero luego lo lleva más lejos. Ha combinado modelos de programación estándar que vemos en la web con cosas como Angular, Knockoutjs, o Ember excepto que en lugar de programar la UI de aplicaciones web en JavaScript, lo haces en C#- un lenguaje de programación .NET.

Aquí, en el medio de algunos fragmentos de Razor (básicamente HTML con C# inline), hace lo que parece una llamada a un backend. Esto es código en C#, pero se ejecuta como WASM en el lado del cliente dentro de una aplicación de Blazor:

@functions {
    WeatherForecast[] forecasts;

    override protected async Task InitAsync()
    {
        using (var client = new HttpClient())
        {
            var json = await client.GetStringAsync(AbsoluteUrl("/api/SampleData/WeatherForecasts"));
            forecasts = JsonUtil.Deserialize<WeatherForecast[]>(json);
        }
    }
}

Esto permitiría a un programador de .NET utilizar los mismos modelos de datos en el cliente y el servidor -muy parecido a un JavaScript bien factorizado hoy en día-, así como el uso de otras bibliotecas .NET con las que podrían estar familiarizados o sentirse cómodos.

¿Por qué hacer esta locura? "Para ver cómo de bien podría funcionar un framework semejante y comprobar cuánto le importaría a la gente." ¿Hasta dónde puede llegar esto? David Fowler ya tiene la depuración funcionando (repito de nuevo, TODO esto son prototipos) en Visual Studio Code. No hace falta que creas mi palabra, mira el vídeo en el que Steve presenta el concepto en la Conferencia NDC.

Blazor como prototipo ya tiene a muchas personas entusiasmadas, y recientemente se ha celebrado un hackthon de Blazer del que han salido unas muestras interesantes, incluyendo una aplicación completa.

¿Otras posibilidades?

Existen muchos otros proyectos que están compilando o transpilando cosas a JavaScript. ¿Se pueden modificar para soportar WebAssembly? Puedes coger F# y compilarlo a JavaScript con el Fable Project de F#, y algunas personas han preguntado acerca de WebAssembly.

En este punto está claro que todo el mundo está haciendo prototipos, hackeando cosas y disfrutando.

¿Qué opinas TÚ sobre WebAssembly?

Teoría de Categorías en Scala - Tipos y funciones

13/11/2017
Artículo original

Este artículo forma parte de una serie sobre Teoría de Categorías en Scala que estoy escribiendo basándome en el libro de Bartosz Milewski. Conforme voy leyendo, tomo notas y intento resolver los ejercicios propuestos por Bartosz, pero en Scala. El producto de ese trabajo son estos artículos que comparto en este blog. Todo el código está en elbaulp/Scala-Category-Theory, también puedes visitar la tabla de contenidos de esta serie.

En el artículo anterior escribí sobre composición en Teoría de Categorías, hoy voy a hablar sobre tipos y funciones en Teoría de Categorías.

Tipos y Funciones

Se pueden componer flechas, pero no cualquier par de flechas, el destino de una flecha debe coincidir con el origen de la otra. En términos de programación: El tipo de retorno de una función debe coincidir con el tipo de entrada de la siguiente función.

¿Qué son los tipos?

Puedes pensar en un Tipo como Conjuntos, estos pueden ser finitos (Booleanos, Chars) o infinitos (Cadenas de texto, Enteros). En teoría de categorías existe una Categoría de Conjuntos, llamada Set (Conjunto). En esta categoría, los objetos son conjuntos, y las flechas funciones de un conjunto a otro.

La definición de arriba es en el mundo matemático, en la realidad puedes pensar en los conjuntos como tipos en un lenguaje de programación y en las funciones en el Set como funciones en dicho lenguaje de programación. Pero hay un problema, en matemáticas una función simplemente sabe la respuesta, pero en un lenguaje de programación eres tú quien debe implementar el código que calcule esa respuesta, y hay algunas funciones que nunca retornan. Como solución, muchos lenguajes de programación tienen un tipo llamado Tipo de fondo (Bottom type), todos los tipos extienden de él. En Haskell este tipo se denota por _|_, en scala por Nothing (Puedes ver la documentación de este tipo). Una función que devuelve el tipo fondo se llama Función Parcial.

El modelo matemático

Si eres desarrollador, estoy seguro que como muchos, te has encontrado ejecutando un intérprete en tu cabeza, mientras depurabas algún programa. El ser humano no es muy bueno en esta tarea, ya que es muy complicado llevar cuenta de todas las variables. Existen alternativas para saber si un programa es correcto, la Semática Formal. En resumen, la Semántica Formal es un método para formalizar el significado de un lenguaje de programación, se ocupa de encontrar objetos matemáticos (llamados dominio) que representan lo que hace el programa.

Por contra a la Semántica Formal está la Semántica Operacional. Esta intenta demostrar ciertas propiedades de un programa (como su corrección), para ello construye demostraciones lógicas, aunque a menudo es complejo.

Teniendo un modelo matemático (Semántica Formal) es posible escribir demostraciones formales que verifiquen la corrección de un programa.

Funciones Puras e Impuras

Las funciones puras son aquellas que devuelven siempre el mismo resultado para la misma entrada, sin efectos colaterales. Las funciones matemáticas son un buen ejemplo de funciones puras. Por el contrario, las funciones impuras tienen efectos colaterales.

Ejemplos de Tipos

Al fin hemos llegado al asunto de este artículo, los tipos.

Voy a empezar desde abajo, es decir, con el Conjunto Vacío.

¿Qué tipo definiría al Conjunto Vacío? Piensa un momento, lo mencioné un poco más arriba. En Haskell este tipo es Void, en Scala Nothing. Este conjunto no tiene ningún elemento. Anteriormente dije que hay una categoría llamada Set, en la que los objetos son conjuntos y las flechas son funciones. En este contexto, si A es un conjunto (El conjunto vacío), solo hay una función f de {} a A, la Función Vacía.

¿Podrías definir una función que tome como parámetro un objeto de tipo Void (un conjunto vacío)? sí, pero no podrías llamarla, ya que no puedes pasarle un parámetro de tipo Void. Sin embargo, el tipo de retorno de esta función podría ser de cualquier tipo. Este tipo de funciones (las que devuelven cualquier tipo) se llaman polimórficas en el tipo de retorno, ejemplos:

noPuedesLlamarme :: Void -> a

Una letra en minúscula en la declaración de una función en Haskell significa que a puede ser de cualquier tipo. En Scala:

def noPuedesLlamarme(a:Nothing) = 1
def noPuedesLlamarme(a:Nothing) = "str"

¿Cual sería el tipo asociado al Conjunto Unitario? es decir, un conjunto de un solo elemento (Un posible valor). En C++ ese tipo es void (No lo confundas con el Void de Haskell, que representa el conjunto vacío). void en C++ es un conjunto unitario, ya que tiene un único elemento. De hecho, puedes llamar a funciones que reciben void como argumento. Ejemplos de estas funciones son int f314() { ret 314 }, si la llamas, siempre devolverá 314. Aunque parezca no estar recibiendo ningún argumento, no es así. Si no pudieras pasarle argumento alguno no podrías llamarla. Por tanto, toma como argumento un valor ficticio con una única instancia (El conjunto Unitario, en este caso 314). El mismo ejemplo en Haskell y Scala:

f314 :: () -> Integer -- De Unit a Integer
f314() = 314

Aquí es más evidente que f314 toma un parámetro, el tipo Unit (El cual permite un solo valor). Puedes llamar a esta función con f314(), lo cual denota más explícitamente que toma un solo parámetro.

En Scala, el tipo representando el Conjunto Unitario también se llama Unit, su único valor se denota con (), como en Haskell:

def f314() = 314 /* de () => Int */

Aunque todo esto te parezca un sin sentido, o absurdo, el objetivo es construir los conceptos de abajo a arriba. Conforme profundices más en Teoría de Categorías, todo irá ganando sentido. Por ejemplo, con el conocimiento adquirido hasta el momento puedes evitar mencionar explícitamente elementos en un conjunto, ahora simplemente los referencias con flechas (Funciones en este caso, ya que estamos tratando con la categoría Set). Las funciones que van de Unit a cualquier tipo A están en correspondencia una-a-una con los elementos de dicho conjunto A.

¿Qué pasa con las funciones que devuelven void (en C++) o Unit (en Scala, Haskell)? Normalmente este tipo de funciones tienen efectos colaterales, pero si son puras simplemente hacen corresponder elementos de un conjunto A a un Conjunto Unitario. Es decir, todos los elementos en un conjunto A irán a parar al mismo valor. Ejemplos:

fInt :: Integer -> ()
fInt x = ()

En Haskell _ significa que da igual el argumento que le pases a la función f, ya que lo va a ignorar, puedes definir la función anterior de forma más genérica:

unit :: a -> ()
unit _ = ()

No importa qué tipo de argumento le pases a unit, siempre va a hacer corresponder ese argumento a Unit. Este es el equivalente en Scala:

def unit[T](a:T):Unit = ()

El siguiente paso lógico en los tipos es el conjunto de dos elementos, que corresponde con bool en C++, Bool en Haskell y Boolean en Scala. Las funciones a booleanos se llaman predicados, seguro que estás familiarizado con nombre como isDigit, isLower, isLetter etc.

Ejercicios

Quiero compartir contigo algunos de los ejercicios que he resuelto de los que propone Bartosz. Ten en cuenta que puedo estar equivocado, si detectas un error, o crees que algo puede mejorarse, deja un comentario. Puedes ver la lista de ejercicios completa en el blog de Bartosz (Enlazado en las referencias), yo solo he resuelto el 1 y el 6.

  • Ejercicio 1
  • Esta es mi solución. Intenté hacerlo con un Map inmutable, pero no supe hacerlo funcionar:
case class Memoize[A, B](f: A => B) {
  private[this] val values: mutable.Map[A,B] = mutable.Map.empty
  def apply(x: A) = values getOrElseUpdate(x, f(x))
}

Puedes probarlo con esta función:

def f(a:Int) = {
  Thread.sleep(5000)
  a*a
}
val b = Memoize(f)
b(10) // Takes 5 secs
b(10) // immediate
  • Ejercicio 6

Scala Category Theory functions and types

Referencias

Envío de emails masivos con MailRelay

11/11/2017
Artículo original

Espero y este post sea de tu agrado, no olvides compartirlo en su redes sociales y sobre todo.. Gracias por seguirnos!

¿Necesitas enviar muchos correos a tus clientes y prospectos? ¿Necesitas una solución a este problema? Nuestra estrategia de marketing nunca esta completa sin el email marketing, el día de hoy vamos a hablar sobre una herramienta enfocada a esto: MailRelay para el envío de emails masivos. Seguramente tú como empresa o personas destinada al marketing de tu empresa más de una vez has necesitado que enviar emails, hasta aquí todo normal. Pero muchas veces necesitamos enviar un email a cientos e incluso miles de personas de una sola vez. El propósito de este envío masivo puede ser diverso: envío de

Compartir en Facebook

Comparte en Google Plus

Compartir en Twitter

El post Envío de emails masivos con MailRelay aparece en el Blog de Jonathan Melgoza

Puntos de venta – Herramientas para Pymes

10/11/2017
Artículo original

Espero y este post sea de tu agrado, no olvides compartirlo en su redes sociales y sobre todo.. Gracias por seguirnos!

¿Tienes un negocio fisico? ¿Necesitas una solución para las ventas? ¿Tu gestión de inventario es un desastre? No te preocupes! Existen muchas herramientas tecnológicas que nos hacen mucho más fácil nuestro día a día en varios sectores de nuestra vida cotidiana, este caso no es la excepción! Conoce lo que son los puntos de venta y lo pueden hacer por tu negocio leyendote este post. Hace un par de día recien hablamos sobre la necesidad de un software de contabilidad electrónica para tu negocio y de la importancia que tiene para llevar una mejor contabilidad, pagos, facturas, nomina, etc. Hoy

Compartir en Facebook

Comparte en Google Plus

Compartir en Twitter

El post Puntos de venta – Herramientas para Pymes aparece en el Blog de Jonathan Melgoza

Mover el almacenamiento local de Google Drive File Stream a donde queramos

09/11/2017
Artículo original

Hace poco Google lanzó para todo el mundo un nuevo cliente se sincronización para Google Drive llamado Google Drive File Stream (GDFS a partir de ahora):

De hecho ahora es el único cliente que te deja descargar:

y el anterior (que tenía sus cosas buenas, como poder copiar automáticamente a Drive carpetas de tu equipo) dejará de funcionar en las próximas semanas.

Aunque todavía le tienen que pulir algunos detalles, la verdad es que el sistema está muy bien ya que te permite acceder a todos tus archivos en la nube sin necesidad de guardarlos en tu equipo, sincronizando momentáneamente solo los que vayas a utilizar o bien si le dices que quieres alguna carpeta o archivo concretos siempre en local. Además te deja cambiar entre cuentas, lo cual es muy cómodo.

Nota: He decir que lo he probado con una carpeta enorme que tengo en Dropbox con más de 200.000 archivos y unas cuantas decenas de GB, y el sistema va fatal en estas dimensiones. Para empezar tarda mucho más que Dropbox en sincronizar (días de hecho), y cuando lo consigue va "renqueando" porque cualquier cambio que hagas tarda en aparecer, si intentas hacer una comparación entre carpetas para ver las diferencias te acaba por colgar el equipo... Lo dicho: aún tiene bastante que mejorar si lo quieren usar a nivel empresarial que es lo que pretenden. Ahora, par aun uso más "normal", funciona muy bien y me parece muy útil. Ahora bien, están todos a años luz de Dropbox, a excepción quizá de pCloud, que va de maravilla también y usa un sistema similar al de Google pero mejor implementado (y además ¡son europeos! y tienes 25Gb en la versión gratuita).

Bien, el caso es que cuando le dices a GDFS que quieres tener una carpeta sincronizada en local, sin tener que ir a buscar los archivos a la nube, lo que hace es almacenar una caché (con una estructura muy rara, que no replica los archivos reales pro que puede llegar a ocupar mucho espacio), en una carpeta concreta de tu disco duro que además no puedes cambiar. Otras herramientas como pCloud te dejan decidir exactamente donde quieres hacer esa caché:

De hecho ambas lo guardan por defecto en el mismo lugar (en tu perfil de usuario) pero GDFS no te permite cambiarlo.

En mi caso, en el ordenador que uso habitualmente tengo un disco duro muy rápido SSD para el sistema operativo y aplicaciones que no suele tener mucho espacio libre, otro disco SSD grande para máquinas virtuales y cosas que necesitan velocidad, y dispongo de un disco convencional de tamaño considerable en el que almaceno con coste mínimo información que no necesita velocidad par trabajar: código fuente, backups temporales, experimentos... y por supuesto todos mis archivos de la nube que  están sincronizados localmente (Drobpox y compañía).

Con versiones anteriores del cliente de Google Drive se podía escoger esta ubicación, pero con GDFS no es posible. Pero ¿cómo podemos engañarlo para colocar la caché donde queramos?.

Muy sencillo, pero hay que hacerlo con cuidadito. Vamos a verlo...

Lo primero que debemos hacer es salir de GDFS pulsando sobre su incono al lado del reloj de Windows y luego en el menú hamburguesa de la derecha:

Aunque hayas salido y haya desaparecido el icono de al lado del reloj debes asegurarte de que de verdad se han terminado todos los procesos asociados, para lo cual abre el administrador de tareas (CTRL+MAYS+ESC) y búscalo en la lista de procesos en segundo plano: No debe aparecer ahí (normalmente hay 3):

Bien, ahora lo que tenemos que hacer es cambiar la ubicación de la caché. Para ello vete con el explorador de archivos a la carpeta: 

C:\Users\<usuario>\AppData\Local\Google

donde <usuario> es el nombre de tu cuenta de usuario (con la que accedes a Windows).

Copia la carpeta DriveFS a la ubicación donde quieras tener ubicada la caché. ¡Muévela entera!. Dependiendo de la cantidad de archivos que hayas sincronizado localmente el proceso puede tardar más o menos, pero probablemente unos cuantos minutos a nada que tengas.

Bien, una vez movida, debes hacer creer a GDFS que sigue estando allí, pero en realidad no será así. Para ello usaremos el mismo truco que ya expliqué hace unos meses para mantener sincronizados los ajustes de Visual Studio Code entre equipos: crear un link simbólico a la carpeta que acabamos de mover.

Abre una línea de comandos como administrador en la carpeta inicial (C:\Users\<usuario>\AppData\Local\Google) y escribe:

mkdir DriveFS D:\Carpeta\DriveFS

siendo D:\Carpeta\DriveFS el lugar donde hayas copiado la carpeta original. Puedes verlo en esta animación:

¡Listo!

Ahora arranca de nuevo Google Drive File Stream y verás que funciona con normalidad, solo que ahora estará guardando todos sus archivos en la ubicación que has elegido previamente.

¡Espero que te resulte útil!

Paginación básica con PHP

09/11/2017
Artículo original

Espero y este post sea de tu agrado, no olvides compartirlo en su redes sociales y sobre todo.. Gracias por seguirnos!

¿Tienes que presentar bastantes datos en una página o app web? ¿Quieres implentar una paginación básica con PHP? No te preocupes! Hoy vamos a revisar como realizar esta funcionalidad muchas veces presentada en nuestros proyectos. Ya hemos hablado en anteriores post como crear un filtro de productos con php y mysql, el día de hoy vamos a ver algo que complementa perfectamente este post.. veremos como realizar una paginación básica con PHP de tal modo que nuestro proyecto sea capaz de paginar una gran cantidad de resultados en varias páginas (como su nombre lo indica). Esto lo haremos con un

Compartir en Facebook

Comparte en Google Plus

Compartir en Twitter

El post Paginación básica con PHP aparece en el Blog de Jonathan Melgoza

Página Siguiente