Translate

viernes, 9 de junio de 2017

Masivo de correos, la forma más fácil y rápida de hacer de publicitar tu empresa


No es muy común esta clase de post en el blog pero tuve una respuesta positiva enviando mails masivos. Por lo que quiero compartir con ustedes mi experiencia.

Que es el Email marketing??  Se lo conoce como ciberbuzoneo  o en inglés: e-mailing es un método de marketing directo que utiliza el correo electrónico como medio de comunicación comercial para enviar mensajes a una audiencia. De esta forma podes tener al tanto a tus clientes de las novedades de tu empresa, nuevos productos, ofertas, etc...

Si buscamos email marketing en la wikipedia:

"La publicidad por correo electrónico, email marketing, marketing por email, correo comercial o email comercial,1 es enviar un mensaje comercial directamente utilizando como canal el correo electrónico. En su sentido más amplio, cada email que se envía a un cliente o potencial cliente puede ser considerado como email marketing. Normalmente implica utilizar un correo para enviar anuncios, peticiones de negocios, solicitar ventas o donaciones, y está principalmente orientado a crear lealtad, confianza, o concienciación de marca.

La publicidad por correo electrónico puede efectuarse a listas compradas o una base de datos de clientes actual. En términos generales, el término marketing por email es normalmente utilizado para referirse a enviar mensajes de email con el propósito de mejorar la relación de una empresa con sus clientes actuales o anteriores, para generar lealtad del cliente y empresarial, adquiriendo clientes nuevos o convenciendo clientes actuales para adquirir algo inmediatamente, y añadiendo los anuncios a mensajes de email enviados por otras compañías a sus clientes."

Pero preparar una campaña de envío masivo de correos no es algo que se deba hacer a la ligera, dado que podemos ser vistos como spammer. El spammer hacen referencia a los mensajes no solicitados, no deseados o con remitente no conocido (correo anónimo), habitualmente de tipo publicitario, generalmente son enviados en grandes cantidades (incluso masivas) que perjudican de alguna o varias maneras al receptor. Pero si lo que enviamos al usuario es información útil y cuidada el puede ver con buenos ojos estos correos.

Para evitar caer en la bandeja de spam de tus suscriptores es interesante que cumplas con los siguientes factores:

  • Trabaja siempre con una base de datos propia actualizada y segmentada. Muchas empresas envían sin problemas cada día cientos de miles de correos electrónicos en campañas de Email Marketing orientadas a convertir sus listas de registros en clientes.
  • Tus mensajes deben ser relevantes siempre. Si tienes alguna duda, revisa y analiza los contenidos tanto de texto como audiovisuales para garantizar que son realmente de interés para quien los va a recibir.
  • No olvides incluir un enlace de baja de la suscripción bien visible. No tiene sentido seguir enviando emails a usuarios que no quieren recibirlos. No sólo es un riesgo que corre tu empresa de ser calificada por dichos usuarios como spam sino que, lo que es peor, es una inversión sin justificación ni retorno. Si no quieren recibir tus emails mejor que se puedan dar de baja fácilmente. Piensa siempre en tus usuarios, si muchos se dan de baja reflexiona sobre los contenidos que ofreces y adáptalos a tu audiencia.

Por otro lado, debes contar con una herramienta profesional para realizar el envío masivo de correos. Aunque algunas de las aplicaciones de correo electrónico habituales pueden ser utilizadas para lanzar ciertos mensajes, a partir de un número determinado comienzan a pesar más sus desventajas.

Todas las plataformas profesionales diseñadas para enviar miles de correos a la vez respetan la legalidad, funcionan con proveedores de servicios de internet de calidad con el fin de asegurar que tus correos son enviados y te ofrecen unas estadísticas y un soporte que resolverá tus dudas y, sobretodo, te permitirá tomar las decisiones adecuadas para mejorar la eficacia de tus campañas de Email Marketing.

Como conclusión les aconsejo que vean con buenos ojos el envio de correos masivos dado que si se lo realiza correctamente es una excelente oportunidad para su empresa. 

Dejo link: https://es.wikipedia.org/wiki/Email_marketing

Cristal, rápido como C, amigable como Ruby


Cristal es un lenguaje similar a ruby que viene creciendo bastante, entre sus características podemos nombrar:

Sintaxis: La sintaxis de cristal es muy similar a la de ruby, lo que lo hace fácil de leer y de escribir.

Veamos un ejemplo:

# A very basic HTTP server
require "http/server"

server = HTTP::Server.new(8080) do |context|
  context.response.content_type = "text/plain"
  context.response.print "Hello world, got #{context.request.path}!"
end

puts "Listening on http://127.0.0.1:8080"
server.listen


Es un lenguaje compilado, lo que lo hace más rápido y con menos uso de memoria.

Chequeo de tipos, cristal es de tipado estático y hace chequeos de tipo en tiempo de compilación.

Chequeo de posibles errores por valores nulos. 

if rand(2) > 0
  my_string = "hello world"
end


puts my_string.upcase

y si compilamos:

$ crystal hello_world.cr
Error in hello_world.cr:5: undefined method 'upcase' for Nil (compile-time type is (String | Nil))

puts my_string.upcase
                        ^~~~~~

Macros, que permiten extender el lenguaje:

class Object
  def has_instance_var?(name) : Bool
    {{ @type.instance_vars.map &.name.stringify }}.includes? name
  end
end

person = Person.new "John", 30
person.has_instance_var?("name") #=> true
person.has_instance_var?("birthday") #=> false

y mucho más!!


Dejo link:
https://crystal-lang.org/

martes, 6 de junio de 2017

Empezando con Elixir 4

Pattern Matching

Pattern Matching es una parte importante y poderosa de elixir. Esto permite machear valores simples, estructura de datos e incluso funciones. Veamos como trabaja:

El operador Match
En elixir el operador = es un operador de macheo. Elixir espera que coincida los valores de la mano izquierda con los valores de la mano derecha. Si coinciden, devuelve el valor de la ecuación. De lo contrario, se produce un error. Vamos a ver un ejemplo:

iex> x = 1
1

Ahora vamos a probar el macheo:

iex> 1 = x
1
iex> 2 = x
** (MatchError) no match of right hand side value: 1

Ahora veamos ejemplos con varias estructuras:

# Lists
iex> list = [1, 2, 3]
iex> [1, 2, 3] = list
[1, 2, 3]
iex> [] = list
** (MatchError) no match of right hand side value: [1, 2, 3]

iex> [1 | tail] = list
[1, 2, 3]
iex> tail
[2, 3]
iex> [2 | _] = list
** (MatchError) no match of right hand side value: [1, 2, 3]

# Tuples
iex> {:ok, value} = {:ok, "Successful!"}
{:ok, "Successful!"}
iex> value
"Successful!"
iex> {:ok, value} = {:error}
** (MatchError) no match of right hand side value: {:error}

Operador Pin

El operador de = realiza la asignación cuando el lado izquierdo de la coincidencia incluye una variable. En algunos casos, este comportamiento no es deseable. Para estas situaciones tenemos el operador pin: ^.

Veamos un ejemplo:

iex> x = 1
1
iex> ^x = 2
** (MatchError) no match of right hand side value: 2
iex> {x, ^x} = {2, 1}
{2, 1}
iex> x
2


iex> key = "hello"
"hello"
iex> %{^key => value} = %{"hello" => "world"}
%{"hello" => "world"}
iex> value
"world"
iex> %{^key => value} = %{:hello => "world"}
** (MatchError) no match of right hand side value: %{hello: "world"}

En Elixir 1.2 se agrega soporte para que el pin funcione en mapas o funciones.

iex> key = "hello"
"hello"
iex> %{^key => value} = %{"hello" => "world"}
%{"hello" => "world"}
iex> value
"world"
iex> %{^key => value} = %{:hello => "world"}
** (MatchError) no match of right hand side value: %{hello: "world"}

Veamos un ejemplo con funciones:

iex> greeting = "Hello"
"Hello"
iex> greet = fn
...>   (^greeting, name) -> "Hi #{name}"
...>   (greeting, name) -> "#{greeting}, #{name}"
...> end
#Function<12.54118792/2 in :erl_eval.expr/5>
iex> greet.("Hello", "Sean")
"Hi Sean"
iex> greet.("Mornin'", "Sean")
"Mornin', Sean"

Dejo link: https://elixirschool.com/lessons/basics/pattern-matching/

domingo, 4 de junio de 2017

9 lenguajes que deberías aprender en el 2017


Muy pocas veces me encuentro con un articulo que dice que debemos aprender algo y coincido, normalmente son tecnologías ya consolidadas pero esta vez me encontré con un articulo que no le importo hacer futurología y tiro algunos nombres de lenguajes que son poco comunes en estas listas.

Los lenguajes que debemos aprender son:

  • Kotlin: como era de esperar, todo el mundo habla de él luego de convertirse en el lenguaje soportado por Android. 
  • Elm: Lenguaje funcional por demás interesante, permite compilar a html y javascript.
  • Julia: Similar a python pero dedicado a la ciencia. 
  • Elixir: Lenguaje funcional que hemos hablado ciento de veces en el blog.
  • Rust: Lenguaje de propósito general, que se parece mucho a C++
  • Crystal: Este si no lo conocía, se viene un post en breve. 
  • Groovy: En serio? yo creía que venia bajando su popularidad y de repente aparece en esta lista. 
  • R: Si haces algo con estadísticas debes conocer a R, es un lenguaje funcional dedicado a la estadísticas, que cada vez adquiere más adeptos. 
  • Go: El lenguaje de google viene lento pero seguro ganando mercado. 

Entre las cosas que me llamaron la atención puedo nombrar:

  • El 90% de los lenguajes nombrados tienen al menos un post en el blog! (tengo que hacer algo de publicidad)
  • Podríamos decir que la mitad o más son lenguajes funcionales, o que aplican técnicas de programación funcional, Entonces, a aprender funcional, no?


Por lo tanto decidí compartir este articulo:
http://www.rankred.com/new-programming-languages-to-learn/


Un resumen de Scala for the Impatient, parte 20


Encadenado de paquetes

La definición de paquetes puede tener nombres encadenados por punto, por ejemplo:

package com.horstmann.impatient {
   package people {
     class Person
     …
  }
}

Notación Top-of-File

Similar a java podemos optar por notación al principio de la clase, este paquete va a finalizar en el final del archivo. Por ejemplo:

package com.horstmann.impatient
package people
class Person


Esto es similar a :

package com.horstmann.impatient {
package people {
class Person
...
// Until the end of the file
}
}

Esta notación es útil cuando tenemos un solo paquete para todo un archivo.

Objetos paquete

Un paquete puede contener object, class o traits pero no una definición de funciones o variables por limitaciones en la maquina virtual java. Pero se puede definir un objeto paquete, este objeto contendrá variables o funciones globales en el paquete.

Veamos un ejemplo:

package com.horstmann.impatient
package object people {
val defaultName = "John Q. Public"
}
package people {
class Person {
var name = defaultName // A constant from the package
}
...
}

Note que defaultName no es necesario dado que se encuentra en un objeto con el mismo nombre del paquete, y podemos acceder a los valores desde otro paquete con el siguiente nombre: com.horstmann.impatient.people.defaultName

Es buena idea crear usar el mismo esquema de paquetes que los directorios de los archivos fuente. Y podemos poner un archivo package.scala donde van a estar los objetos de paquete, para tener una convención.

Visibilidad de paquetes. 

En java si una clase no es declarada como publica, privada o protected, es default y solo puede ser vista en el paquete. En scala existen calificadores que nos permiten hacer esto y tener mayor control de la visibilidad:

package com.horstmann.impatient.people
class Person {
private[people] def description = "A person with name " + name
...
}

Y se puede extender la visibilidad a paquetes padres:

private[impatient] def description = "A person with name " + name

Imports

Podemos importar una clase particular, para no utilizar el nombre largo:

import java.awt.Color

o podemos importar todos los elementos de un paquete de la siguiente manera:

import java.awt._

Como podemos ver es similar al * de java. También se pueden importar todos los miembros de una clase o objeto:

import java.awt.Color._
val c1 = RED // Color.RED
val c2 = decode("#ff0000") // Color.decode

Esto es similar a static import de java.

Importado todo un paquete podemos acceder a los objetos o clases de los subpaquetes con el nombre del subpaquete + el nombre de la clase o objeto:

import java.awt._
def handler(evt: event.ActionEvent) { // java.awt.event.ActionEvent
...
}

Como dice el comentario estamos usando  java.awt.event.ActionEvent cuando nombramos  event.ActionEvent porque  java.awt fue importado en su totalidad.

sábado, 3 de junio de 2017

Realm. un sitio donde publican buenos cursos.



Quiero compartir este sitio, donde publican buenos cursos que son bastantes teóricos.

Hay de todos los temas, pero los temas más importantes:

  • Android  
  • Apple  
  • Javascript  
  • Xamarin  
  • Architecture

Y encontré muy buenos cursos sobre programación funcional.

Dejo link: http://news.realm.io/news

martes, 30 de mayo de 2017

Plasma, simple por defecto, potente cuando se necesita

Tenemos el anunció de Plasma 5.10 y hago este post porque me sorprendió, muy bonito y funcional.

En el siguiente video se ven muchas novedades, vamos q tener que instalarlo y usarlo!!



domingo, 28 de mayo de 2017

Un resumen de Scala for the Impatient, parte 19


Paquetes

Los paquetes en Scala son similares a lo propuesto en java o en los espacios de nombre de C++, esto es un mecanismo para el manejo de nombres, por ejemplo el nombre Map puede referirse a una estructura de datos mapa o diccionario de datos del paquete scala.collection.immutable y scala.collection.mutable sin que haya conflicto. Uno puede acceder a esta clase por medio de su nombre, scala.collection.immutable.Map o scala.collection.mutable.Map. Alternativamente podemos utilizar alias.

Para agregar algo a un paquete  

package com {
package horstmann {
package impatient {
class Employee

}
}
}

Ahora la clase Employee es accesible desde el paquete com.horstmann.impatient.

A diferencia de las clases u objetos, los paquetes pueden ser definidos en multiples archivos. Por ejemplo si decidimos agregar la clase Manager al paquete anterior:

package com {
package horstmann {
package impatient {
class Manager

}
}
}
 
Notemos que no existe una relación entre el directorio que contiene a la clase y el sistema de paquetes.

package com {
package horstmann {
package impatient {
class Employee

}
}
}

package com {
package bigjava {
class Counter

}
}
}

Reglas de Alcance

En Scala, las reglas de ámbito para los paquetes son más consistentes que en Java. Los paquetes de Scala anidan como todos los demás ámbitos, es decir se puede acceder a los nombres del ámbito de que están incluidos en ese ambito. Por ejemplo,

package com {
package horstmann {
object Utils {
def percentOf(value: Double, rate: Double) = value * rate / 100
...
}
package impatient {
class Employee {
...
def giveRaise(rate: scala.Double) {
salary += Utils.percentOf(salary, rate)
}
}
}
}
}

Como se puede ver Utils puede ser accedido por Employee porque esta en el ambito.

package com {
package horstmann {
package impatient {
class Manager {
val subordinates = new collection.mutable.ArrayBuffer[Employee]
...
}
}
}
}

Este código aprovecha el hecho de que el paquete scala siempre se importa. Por lo tanto, el paquete es en realidad scala.collection.

Y ahora supongamos que alguien crea el siguiente paquete, tal vez en un archivo diferente:

package com {
package horstmann {
package collection {
...
}
}
}

Ahora la clase Manager ya no compila. Dado que busca un miembro mutable dentro del paquete com.horstmann.collection y no lo encuentra.

En Java, este problema no puede ocurrir porque los nombres de los paquetes son siempre absolutos, comenzando en la raíz de la jerarquía del paquete. Pero en Scala, los nombres de los paquetes son relativos, al igual que los nombres de las clases internas. Con las clases internas, uno no suele tener problemas porque todo el código está en un archivo, bajo el control de quien está a cargo de ese archivo. Pero los paquetes son estructuras abiertas. Cualquier persona puede contribuir a un paquete en cualquier momento.

Una solución es utilizar nombres de paquetes absolutos, empezando por _root_, por ejemplo:

val subordinates = new _root_.scala.collection.mutable.ArrayBuffer[Employee]

Otro enfoque es usar cláusulas de paquete "encadenadas".

Un resumen de Scala for the Impatient, parte 18


Enumeraciones

Al contrario de java o c++, Scala no cuenta con enumeraciones. Pero la librería estándar de scala cuenta con una clase Enumeration, que nos ayudara a trabajar con enumeraciones.

Lo que tenemos que hacer es un objeto que extienda de la clase Enumeration:

object TrafficLightColor extends Enumeration {
  val Red, Yellow, Green = Value
}

Este objeto tiene 3 propiedades Red, Yellow, Green inicializadas como valor. Alternativamente se le puede pasar al valor un id y un nombre o las dos cosas:

val Red = Value(0, "Stop")
val Yellow = Value(10) // Name "Yellow"
val Green = Value("Go") // ID 11

Si no se especifica el id, se asignara uno más del asignado previamente y por defecto el nombre es el nombre del campo.

Ahora usted se puede referirse a la enumeración TrafficLightColor como TrafficLightColor.Red, TrafficLightColor.Yellow, TrafficLightColor.Green. Si esto resulta tedioso, puede importar la clase:

import TrafficLightColor._

Hay que recordar que los valores Red, Green y Yellow son de tipo Value, no TrafficLightColor, si se  quiere se puede definir un alias:

object TrafficLightColor extends Enumeration {
type TrafficLightColor = Value
val Red, Yellow, Green = Value
}

Ahora el tipo TrafficLightColor.TrafficLightColor, se va importar y podremos usarlo:

import TrafficLightColor._

def doWhat(color: TrafficLightColor) = {
if (color == Red) "stop"
else if (color == Yellow) "hurry up"
else "go"
}

El id es el valor retornado cuando se llama a la enumeración y el nombre es lo que se llama cuando se llama al método toString

Si llamamos a TrafficLightColor.values podremos obtener todos los valores:

for (c <- TrafficLightColor.values) println(c.id + ": " + c)

Para terminar, podemos buscar un valor por id o nombre, si deseamos buscar el valor Red :
TrafficLightColor(0) // Calls Enumeration.apply
TrafficLightColor.withName("Red")


jueves, 25 de mayo de 2017

Testing en C++

El problema es fácil de plantear, debemos probar una clase en C++ en el entorno qt y deseamos hacerlo con el framework de unit test: UnitTest++

UnitTest ++ es un framework de testing para C ++. Fue diseñado para hacer desarrollo basado en pruebas en una amplia variedad de plataformas. La simplicidad, la portabilidad, la velocidad y la pequeña huella son aspectos muy importantes de UnitTest ++. UnitTest ++ es en su mayoría estándar C ++ y hace un uso mínimo de la biblioteca avanzada y características del lenguaje, lo que significa que debe ser fácilmente portátil a casi cualquier plataforma. Se puede instalar en  las siguientes plataformas:

  • Windows
  • Linux
  • Mac OS X


Desde Linux es fácil instalar el framework:

sudo apt-get install libunittest++-dev

o

sudo yum install  libunittest++-dev

Instalado este framework abrimos nuestro qt y nuestro proyecto, y agregamos en el .pro la siguiente linea: 

LIBS += -lunittest++

Con esta linea agregamos el framework de test y ahora podemos escribir un test, por lo tanto creamos un archivo .cpp nuevo y realizamos un test. 

En el siguiente ejemplo voy a testear una lista de enteros: 

#include <unittest++/UnitTest++.h>
#include "list.h"

TEST(sizeEquals1) {
    List list;
    CHECK(list.add(2));
    CHECK(list.getSize()==1);
}

TEST(sizeEquals2) {
    List list;
    CHECK(list.add(2));
    CHECK(list.add(2));
    CHECK(list.getSize()==2);
}

TEST(sizeEquals1WithRemove) {
    List list;
    CHECK(list.add(2));
    CHECK(list.add(2));
    CHECK(list.remove(2));
    CHECK(list.getSize()==1);
}

int main()
{
    return UnitTest::RunAllTests();
}
Y eso es todo, solo debemos correr el main y obtendremos el resultado de los tests, por ejemplo: 

../Collections/test.cpp:22: error: Failure in sizeEquals1WithRemove: list.getSize()==1
FAILURE: 1 out of 3 tests failed (1 failures).
Test time: 0.00 seconds.

Lo que esta diciendo aquí es que fallo el test sizeEquals1WithRemove. Y si todos los test terminan bien: 

Success: 3 tests passed.
Test time: 0.00 seconds.
Press <RETURN> to close this window...


Dejo link: 

miércoles, 24 de mayo de 2017

Try C#

Notaron que hace poco dije que .net core se viene con todo, bueno por lo tanto es buena idea estudiar C# y que mejor que tomar un curso de codescholl totalmente gratuito.

Code School
 
Try C#
You can build just about anything with C# — from web, desktop, and mobile apps to game development. Learn the basics of this general-purpose language and run your first C# console application when you play Try C#.
View the Course
What You'll Learn
89042fdf-a254-4aaa-98d9-33f0a608770b.png
 
Level 1: Introduction
Learn how to create and run a C# console application.                  
70861114-c2dc-4732-a588-b19113edeff6.png
 
Level 2: Variables
Explore data types as well as declare, store, and retrieve variables.
b685758e-eaf2-48c5-bda3-f26794d60926.png
 
Level 3: Conditions
Discover how to use conditions to change program flow.
Why Try C#?
Course Instructor Eric Fisher walks through the factors in choosing what programming language to learn andwhy you should try C#.
 
Twitter IconFacebook IconLinkedIn Icon

martes, 23 de mayo de 2017

Infografia de Kotlin

Hasta hace poco, si nombrabas Kotlin, pensaban que hablabas de la capital de Bielorrusia y ahora que Android le dio cobijo, esta en todas partes y bueno, tengo que hacerme eco de este entusiasmo:

Why learn Kotlin programming?

sábado, 20 de mayo de 2017

Kotlin, es un lenguaje oficial para programación en la plataforma Android


Ya es noticia en todos lados, y una gran noticia. La plataforma Android tiene un nuevo lenguaje con soporte oficial y es Kotlin.

Siempre me pregunte cuando nacio Android porque no hicieron su plataforma multilenguaje. Si bien habia muchos desarrolladores Java, java venia bajando. Es más creo que Android lo levanto mucho.

Pero como sabemos la plataforma Java tiene mucho futuro, pero el lenguaje empieza su desenso, que es natural y bueno. Kotlin es un lenguaje moderno, en muchos puntos parecido a Scala y me gusta mucho.

Jetbrains, la empresa creadora dle lenguaje la viene pegando increiblemente, IntelliJ IDEA como ide oficial de android, Kotlin como lenguaje oficial y si son de .net la ide JetBrains Rider sugerida como una IDE para programar en .net core. Me saco el sombrero!!

Espero que google siga agregando lenguajes a su plataforma!!

Dejo link:
https://kotlinlang.org/
https://www.infoq.com/news/2017/05/android-kotlin

viernes, 19 de mayo de 2017

Y lo que viene es .net core

La verdad que llegue muy tarde a .net core y todavia esta bastante verde. Pero me sorprendio.

Si bien existe posibilidades de ejecutar codigo .net con mono o otros tantos frameworks. .net core brinda algo que en la ecuaci{on le da mucho peso y es que es totalmente open source y gratuito y esta apoyado por microsoft y apoyada por otras empresas.

Si bien hoy es un salto grande y todavia no esta listo, para producción vamos a tener que estudiarla porque tiene mucho futuro. A simple vista parece que solo es un intento de microsoft para ganar un mercado virgen para él, pero cuando vemos otras empresas interesadas en el proyecto ahi lo tomamos en serío.

Sin más solo anuncio que me voy a poner a estudiar, y les aconsejo que lo hagan tambian.

Dejo link:
https://dotnet.github.io/

miércoles, 17 de mayo de 2017

Desde java a Dart



Encontre esta pagina para aprender Dart para los programadores Java. Esta muy bueno, con ejemplos concretos y es muy pedagojico. Muy recomendado!!

Dejo link:
https://codelabs.developers.google.com/codelabs/from-java-to-dart