Certificación TCAD

Titanium Certified App Developer

El día de ayer obtuve la certificación TCAD (Titanium Certified Application Developer) de Appcelerator Inc para el desarrollo de aplicaciones móviles utilizando el framework Titanium Mobile.

Para la certificación puedes estudiar los materiales en línea o asistir a algunas de las clases que dan diferentes instituciones, los temas incluidos en el examen son los siguientes:

  1. Javascript
  2. Appcelerator Cloud Services
  3. Desarrollo multiplataforma
  4. Contenido web
  5. Multimedia
  6. Sistema de archivos
  7. Geolocalización
  8. Mapas
  9. Bases de datos SQLite
  10. Propiedades de la aplicación
  11. Redes
  12. SDK Android
  13. SDK iOS
  14. Titanium
  15. Interfaz de usuario
  16. Despliegue y publicación de aplicaciones

Para aprobar la certificación necesitas un mínimo de 75% de respuestas correctas y tienes 90 minutos para contestar el examen. Esta certificación es prerequisito para obtener la TCMD (Titanium Certified Mobile Developer).

Personalmente me pareció facil el examen de la certificación ya que considero que cuento con algo de experiencia desarrollando aplicaciones con este framework.

Considero Titanium Mobile una excelente opción para desarrollar aplicaciones móviles por su facilidade de uso y soporte de la comunidad.

Filtrado de correos por IMAP

Desde hace tiempo necesitaba filtrar correos en una cuenta que no contaba con filtros de correo server-side y la mejor opción que encontre es imapfilter, una herramienta que realiza el filtrado de correos por medio de IMAP.

Imapfilter es muy fácil de configurar y es muy flexible, permite utilizar varias cuentas e incluso mover mensajes entre ellas.

Los requerimientos son muy básicos (Lua, PCRE y OpenSSL) y la instalación es sencilla.

La configuración se realiza por medio de un archivo similar a este:

---------------
--  Options  --
---------------

options.timeout = 120
options.subscribe = true

----------------
--  Accounts  --
----------------

-- Connects to "imap1.mail.server", as user "user1" with "secret1" as
-- password.
account1 = IMAP {
    server = 'imap1.mail.server',
    username = 'user1',
    password = 'secret1',
}

-- Another account which connects to the mail server using the SSLv3
-- protocol.
account2 = IMAP {
    server = 'imap2.mail.server',
    username = 'user2',
    password = 'secret2',
    ssl = 'ssl3',
}

-- Get a list of the available mailboxes and folders
mailboxes, folders = account1:list_all()

-- Get a list of the subscribed mailboxes and folders
mailboxes, folders = account1:list_subscribed()

-- Create a mailbox
account1:create_mailbox('Friends')

-- Subscribe a mailbox
account1:subscribe_mailbox('Friends')

-----------------
--  Mailboxes  --
-----------------

-- Get the status of a mailbox
account1.INBOX:check_status()

-- Get all the messages in the mailbox.
results = account1.INBOX:select_all()

-- Get newly arrived, unread messages
results = account1.INBOX:is_new()

-- Get unseen messages with the specified "From" header.
results = account1.INBOX:is_unseen() *
          account1.INBOX:contain_from('weekly-news@news.letter')

-- Copy messages between mailboxes at the same account.
results:copy_messages(account1.news)

-- Get messages with the specified "From" header but without the
-- specified "Subject" header.
results = account1.INBOX:contain_from('announce@my.unix.os') -
          account1.INBOX:contain_subject('security advisory')

-- Copy messages between mailboxes at a different account.
results:copy_messages(account2.security)

-- Get messages with any of the specified headers.
results = account1.INBOX:contain_from('marketing@company.junk') +
          account1.INBOX:contain_from('advertising@annoying.promotion') +
          account1.INBOX:contain_subject('new great products')

-- Delete messages.
results:delete_messages()

-- Get messages with the specified "Sender" header, which are older than
-- 30 days.
results = account1.INBOX:contain_field('sender', 'owner@announce-list') *
          account1.INBOX:is_older(30)

-- Move messages to the "announce" mailbox inside the "lists" folder.
results:move_messages(account1['lists/announce'])

-- Get messages, in the "devel" mailbox inside the "lists" folder, with the
-- specified "Subject" header and a size less than 50000 octets (bytes).
results = account1['lists/devel']:contain_subject('[patch]') *
          account1['lists/devel']:is_smaller(50000)

-- Move messages to the "patch" mailbox.
results:move_messages(account2.patch)

-- Get recent, unseen messages, that have either one of the specified
-- "From" headers, but do not have the specified pattern in the body of
-- the message.
results = ( account1.INBOX:is_recent() *
            account1.INBOX:is_unseen() *
            ( account1.INBOX:contain_from('tux@penguin.land') +
              account1.INBOX:contain_from('beastie@daemon.land') ) ) -
          account1.INBOX:match_body('.*all.work.and.no.play.*')

-- Mark messages as important.
results:mark_flagged()

-- Get all messages in two mailboxes residing in the same server.
results = account1.news:select_all() +
          account1.security:select_all()

-- Mark messages as seen.
results:mark_seen()

-- Get recent messages in two mailboxes residing in different servers.
results = account1.INBOX:is_recent() +
          account2.INBOX:is_recent()

-- Flag messages as seen and important.
results:add_flags({ '\\Seen', '\\Flagged' })

-- Get unseen messages.
results = account1.INBOX:is_unseen()

-- From the messages that were unseen, match only those with the specified
-- regular expression in the header.
newresults = results:match_header('^.+MailScanner.*Check: [Ss]pam$')

-- Delete those messages.
newresults:delete_messages()

Si el servidor IMAP permite mantener conexiones en reposo puedes dejar el script corriendo todo el tiempo y en el momento que entre un correo lo filtrará.

Por el momento lo instalé en mi servidor web y estoy filtrando dos cuentas de correo pero se me ocurren muchos usos para esta herramienta.

 

Módulo de Banorte Payworks para Magento

Desarrollando una tienda en línea para un proyecto propio decidí desarrollar el módulo para recibir pagos en Magento por medio de Banorte Payworks, desde mi experiencia, siempre ha sido difícil desarrollar algo para Magento por la poca documentación que existe.

Después de horas de pruebas e investigación pude desarrollar el módulo y adaptarlo para poder configurar el comportamiento en los diferentes escenarios.

Como comenté en posts anteriores mi interés es hacer cada vez más uso de esta plataforma de pagos que a mi consideración es una excelente alternativa a las típicas procesadoras de pagos (Paypal, DineroMail, etc.).

Si alguien está interesado el módulo está a la venta.

Actualización 21/12/12: Hay una nueva versión del módulo que soporta 3D Secure y mensualidades sin intereses.


Si quieres recibir más información sobre este módulo en tu correo, puedes utilizar el siguiente formulario:

Mi experiencia en cetesdirecto.com

Nunca he sido bueno ahorrando dinero a pesar de haberlo intentado por diferentes medios y métodos pero a final de cuentas dejaba de depositar el dinero y al poco tiempo lo gastaba.

Conocí cetesdirecto.com hace más de un año y me gustó que para mi registro pudiera usar mi FIEL provista por hacienda que equivale a mi firma autógrafa por lo que no tuve que ir a firmar papeles a una sucursal ni nada parecido, cosa que se valora ya que en el caso de un banco se tiene que invertir tiempo para poder abrir una cuenta de inversiones pequeña y muchas veces los ejecutivos no tienen conocimiento de estos instrumentos.

Configuré una herramienta llamada ahorro recurrente que te hace un cargo a tu cuenta bancaria por el monto y en las fechas que indiques, esto es lo que me ha servido para ahorrar porque al igual que me cobran servicios a mi tarjeta (préstamo de auto, celular, etc) ahora me cobran dinero para invertir recurrentemente.

Los rendimientos no son muy altos (4.4% anual aproximadamente en Cetes a 28 días) pero en mi caso me funciona bastante bien, esta configurado para reinvertirse automáticamente después del periodo y si tengo una emergencia puedo vender los certificados para tener mi dinero antes o desactivar la reinversión automática y esperar a que termine el plazo para luego solicitar el retiro.

Hace unos días subí el monto de mi ahorro recurrente y me enteré de que tienen web móvil para consultar las inversiones, el principal atractivo que veo (además de obtener rendimientos de tu dinero) es la disponibilidad de fondos e información ya que en cualquier momento puedes saber cuanto tienes.

Espero seguir con este buen sabor de boca con el servicio e iré actualizando conforme use más el sitio.

Módulo de Banorte Payworks para WHMCS

Aprovechando que me decidí a integrar WHMCS e hice el módulo para registro de dominios con dynadot, decidí de una vez implementar el sistema de pagos Banorte Payworks para el procesamiento de tarjetas de crédito de forma transparente (el cliente no sale de mi sitio ni ve el logotipo de Banorte Payworks).

El módulo permite hacer la captura del dinero y reembolsos (pero solo por el monto total, Banorte Payworks no permite reembolsos parciales).

Espero que con esta implementación empiece a hacer uso de la plataforma ya que casi cumplo un año de haberla contratado y realizo menos de 5 transacciones al mes.

Voy a poner el módulo a la venta por si alguien está interesado en implementarlo.

NOTA: Este módulo es para Payworks 1.

Módulo de registro Dynadot para WHMCS

Hace unos días instalé WHMCS para automatizar la creación de cuentas de hosting y dominios, al comprar la licencia me ofrecieron una cuenta reseller de Enom la cual tiene muchos productos pero se tienen que hacer depósitos prepagados de 100 dólares mínimo, se me hace elevado para la cantidad de dominios que registro al mes.

Desde hace años vengo utilizando Dynadot para registrar los dominios que compro y me gusta bastante por la interfaz limpia además de que tengo acceso a precios de mayoreo.

Estuve buscando un módulo de registro Dynadot pr WHMCS pero no encontré por ningún lado, salvo uno en venta pero no estaba seguro de que funcionaría así que ayer en un tiempo libre me puse manos a la obra.

El módulo ya está probado y funciona perfectamente a pesar de las limitaciones de la API de Dynadot, puse el módulo a la venta en $130 MXN ($9.4 USD) para quien esté interesado, el módulo permite registro, renovación y cambio de DNS y me encargaré de hacer actualizaciones conforme liberen nuevas versiones de la API. Pueden comprarlo aquí.

Como instalar APF para cPanel

Estoy configurando un nuevo servidor para mudar los sitios web que estoy hospedando y quise aprovechar para documentar como instalar APF (Advanced Policy Firewall) en un servidor con cPanel (Prácticamente es lo mismo si tiene cPanel o no, sólo configuraremos distintos puertos).

Debes entrar como root a la consola y de preferencia moverte a un directorio temporal

1) Descarga los archivos de APF

# wget http://www.rfxnetworks.com/downloads/apf-current.tar.gz

2) Extrae el contenido del tar.gz y te diriges al directorio (varia según la versión)

# tar -zxf apf-current.tar.gz
# cd apf-9.7-2

3) Debes correr el instalador dentro de dicha carpeta

# ./install.sh

4) Ahora debemos editar los puertos en el archivo de configuración

# nano -w  /etc/apf/conf.apf

Los puertos entrantes deben quedar de la siguiente manera para un servidor con cPanel

# Common ingress (inbound) TCP ports
IG_TCP_CPORTS=" 20,21,22,25,26,53,80,110,143,443,465,993,995,2082,2083,2086,2087,2095,2096,3306,6666"

# Common ingress (inbound) UDP ports
IG_UDP_CPORTS="21,53,465,873"

# Common ICMP (inbound) types
# 'internals/icmp.types' for type definition; 'all' is wildcard for any
IG_ICMP_TYPES="3,5,11,0,30,8"

Y los salientes de la siguiente manera

# Common egress (outbound) TCP ports
EG_TCP_CPORTS="21,22,25,26,37,43,53,80,110,113,443,465,873,2089,3306"

# Common egress (outbound) UDP ports
EG_UDP_CPORTS="20,21,53,465,873"

# Common ICMP (outbound) types
# 'internals/icmp.types' for type definition; 'all' is wildcard for any
EG_ICMP_TYPES="all"

Para que APF monitoree los puertos salientes es necesario buscar

EGF="0"

y sustituirlo por

EGF="1"

5) Guardamos y cerramos nuestro archivo (CTRL+X) e iniciamos APF

# /usr/local/sbin/apf -s

6) Prueba que todo funcione (SSH, webmail, cPanel, WHM, etc.), si todo funciona correctamente volvemos a editar el archivo de configuración

# nano -w  /etc/apf/conf.apf

Buscamos y cambiamos

DEVEL_MODE="0"

por

DEVEL_MODE="1"

7) Guardas, cierras y reinicias APF

/usr/local/sbin/apf -r

¡Listo! APF está corriendo y monitoreando tu servidor

Habilitar acceso anónimo en SharePoint Foundation 2010

Para poder habilitar el acceso anónimo a un sitio de SharePoint Foundation 2010 primero necesitamos activarlo en la aplicación web siguiendo los siguientes pasos como administrador:

  1. Acceder al panel de Internet Information Services (IIS) Mannager en Windows Server
  2. Seleccionar la aplicación web a la que queremos habilitar el acceso anónimo
  3. Hacer clic en el ícono de Authentication
  4. Hacer clic derecho sobre “Anonymous Authentication” y seleccionar la opción de “Enable”

Con estos pasos estamos permitiendo acceso anónimo a la aplicación web los siguientes pasos habilitarán dicho acceso para SharePoint Foundation 2010:

  1. Abrir el sitio donde se desea habilitar el acceso anónimo
  2. En el menú de “Site Actions” hacer clic en “Site Settings”
  3. En la página de “Site Settings”, en la columna de “Users and Permissions” hacer clic en “Advanced Permissions”
  4. En l página de “Permissions”, en el menú de “Settings”, hacer clic en “Anonymous Access”
  5. En la página de “Anonymous Access”, seleccionar las partes del sitio a las cuales se quiere habilitarel acceso anónimo

Es recomendable realizar las configuraciones en un sitio en blanco y posteriormente importar el contenido.

Configurar llaves para SSH

En el post anterior hablaba sobre criptografía de llave pública, ahora les explicaré como implementarla en un servidor para proteger el acceso a SSH.

El par de llaves puede ser generado en windows o en sistemas basados en UNIX con los siguientes pasos:

MacBook-Pro-de-Arturo-Leon:/ arturo$ cd ~/.ssh

Ya en la carpeta generamos nuestro par de llaves, al no pasar parámetros nos generará por defecto una llave RSA de 2048 bits

MacBook-Pro-de-Arturo-Leon:.ssh arturo$ ssh-keygen

Mostrará la siguiente salida, cuando te pide el archivo donde se guardará puedes presionar enter para dejarlo en default (id_rsa) o escribir uno y opcionalmente puedes usar una contraseña que agrega una capa extra de seguridad ya que para acceder al servidor se necesitará la llave y la contraseña, al no configurar una con la llave será suficiente para acceder.

Generating public/private rsa key pair.
Enter file in which to save the key (/Users/arturo/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /Users/arturo/.ssh/id_rsa.
Your public key has been saved in /Users/arturo/.ssh/id_rsa.pub.
The key fingerprint is:
75:fc:34:ab:80:21:7b:43:a8:ea:19:7b:f2:09:94:eb arturo@MacBook-Pro-de-Arturo-Leon.local
The key's randomart image is:
+--[ RSA 2048]----+
|                 |
|       .   .     |
|      o o . o o  |
|   . . + + . o o |
|  o . . S .   o  |
| . o   . . . .   |
|  =         .    |
| o.=..           |
|  E+o            |
+-----------------+

Ya está generado el par de llaves, lo podemos comprobar listando el contenido del directorio

MacBook-Pro-de-Arturo-Leon:.ssh arturo$ ls
id_rsa		id_rsa.pub	known_hosts

id_rsa será nuestra llave privada mientras que id_rsa.pub será la llave pública. Ahora es necesario copiar el contenido de id_rsa.pub dentro de el archivo ~/.ssh/authorized_keys en el servidor remoto, puedes tener cuantas llaves quieras (una por línea).

En mi caso voy a deshabilitar el acceso a SSH utilizando contraseña editando el archivo /etc/ssh/sshd_config en el servidor remoto dejan el parámetro de la siguiente forma

PasswordAuthentication no

Y asegúrate que el acceso con llave esté habilitado

PubkeyAuthentication yes

Nos queda finalmente recargar la configuración de SSH con el siguiente comando

service sshd reload

Es recomendable primero activar el acceso con llave y luego deshabilitar el acceso con password para evitar quedar “fuera” de el servidor y no poder entrar para hacer correcciones.

Otras opciones para asegurar el servidor es cambiando el puerto por defecto que utiliza SSH, deshabilitar el acceso root, siempre contar con un firewall y tener el software actualizado.

Criptografía de llave pública

La criptografía de llave pública se refiere a un sistema criptográfico asimétrico que requiere dos llaves separadas, una para cifrar la información y otra para descifrarla, ninguna de las dos llaves puede realizar ambas funciones.

Bajo este esquema, cualquier persona puede cifrar mensajes usando la llave pública, pero solo quién tenga la llave privada puede descifrar el mensaje, la seguridad depende de la secrecía de dicha llave.

La criptografía asimétrica esta basada en relaciones matemáticas que no tienen una solución eficiente, el uso de estos algoritmos también permite verificar la autenticidad de el mensaje creando una firma digital usando la llave privada que puede ser verificado usando la llave pública.

Algunos ejemplos de protocolos utilizan la criptografía de llave pública son SSH, SSL y PGP.