El instinto…   2 comments

Yo soy informático, trabajo algunos años ya en computación, desde hace unos meses desarrollamos un framework con mi equipo y ahora lo estamos aplicando; y justo hoy acabo de darme cuenta de mi instinto, fue debido a una comparación.

Hoy no había mucho que hacer así que me dediqué a pensar en cómo integrar los sistemas que tenemos usando la LDAP y el correo electrónico; de pronto uno de mis compañeros se acercó y me dijo: “¿Recuerdas el problema que tenías ayer? He pensado en una solución.”, me mostró el código que hizo y realmente estaba optimizado, era un buen código, mucho mejor que el mío debo admitir, pero en vez de yo interesarme mucho en el tema y alegrarme o ponerme celoso, mi cabeza estaba en los paquetes que mi maquina Gentoo estaba compilando y en cómo iba a integrarlos, vale decir el código no me interesó mucho; pero, mi amigo estaba con todas las pilas en ello y explicándome con todas sus ganas.

Qué puedo rescatar de ésto: el instinto de cada uno…

Mi amigo es un desarrollador neto, su vida está en el código, es su arte y su mejor momento; el mío está en la integración de aplicaciones, en la infraestructura y la organización del equipo, soy desarrollador y también hago control de calidad, pero todo ello lo enfoco desde mi instinto (punto de vista).

¿Se puede dar cuenta uno que tan importante es la multiplicidad de instintos en un equipo? Y también la importancia del entusiasmo que cada uno pone en su parte; es como una comida cocinada con muchos sabores todos le dan una parte del todo, y mientras más hayan y más consistencia tengan sabrá mucho mejor 🙂 …

Enviar un correo usando el SMTP de Gmail, y Ruby + ActionMailer   3 comments

Desde hace muchos dias he estado buscando la manera de enviar correos usando Ruby, probe con varios ejemplos de internet, usando gemas y demas, ninguno funciono, hasta ahora.

El principal problema de usar Gmail, es que necesita autentificar por SSL/TLS, pero encontre un codigo en la lista de usuarios de Rails de Vancouver, lo modifique un poco, lo probe y voila! funciona de mil maravillas.

Aqui esta el archivo de correo (message.rb):

require action_mailer
require smtp_tls

class AnnounceMailer < ActionMailer::Base

def message(recipient)
from tu_correo@loquesea.com
recipients recipient
subject Aca va el subject
body <<EOS
Hola,

Este es un mensaje de muestra.

Saludos.
EOS
end
end

# Probar si se creo bien imprimiendo el mensaje.
puts AnnounceMailer.create_message( receptor@loquesea.com )

ActionMailer::Base.smtp_settings = {
:address => smtp.gmail.com,
:port => 587,
:authentication => :plain,
:user_name => tuUsuariode@gmail.com,
:password => secreto
}

# Enviar el mensaje
AnnounceMailer.deliver_message( receptor@loquesea.com )

Y aqui esta la libreria para manejar el SMTP con TLS (smtp_tls.rb):

<font color=”#a020f0″>require</font>&nbsp;<font color=”#6a5acd”>&quot;</font><font color=”#ff00ff”>openssl</font><font color=”#6a5acd”>&quot;</font><br>
<font color=”#a020f0″>require</font>&nbsp;<font color=”#6a5acd”>&quot;</font><font color=”#ff00ff”>net/smtp</font><font color=”#6a5acd”>&quot;</font><br>
<br>
<font color=”#2e8b57″><b>Net</b></font>::<font color=”#2e8b57″><b>SMTP</b></font>.class_eval <font color=”#a52a2a”><b>do</b></font><br>
<font color=”#a52a2a”><b>private</b></font><br>
<font color=”#a020f0″>def</font>&nbsp;<font color=”#008b8b”>do_start</font>(helodomain, user, secret, authtype)<br>
<font color=”#a52a2a”><b>raise</b></font>&nbsp;<font color=”#2e8b57″><b>IOError</b></font>, <font color=”#6a5acd”>'</font><font color=”#ff00ff”>SMTP session already started</font><font color=”#6a5acd”>'</font>&nbsp;<font color=”#a52a2a”><b>if</b></font>&nbsp;<font color=”#008b8b”>@started</font><br>
check_auth_args user, secret, authtype <font color=”#a52a2a”><b>if</b></font>&nbsp;user <font color=”#a52a2a”><b>or</b></font>&nbsp;secret<br>
<br>
sock = timeout(<font color=”#008b8b”>@open_timeout</font>) { <font color=”#2e8b57″><b>TCPSocket</b></font>.open(<font color=”#008b8b”>@address</font>, <font color=”#008b8b”>@port</font>) }<br>
<font color=”#008b8b”>@socket</font>&nbsp;= <font color=”#2e8b57″><b>Net</b></font>::<font color=”#2e8b57″><b>InternetMessageIO</b></font>.new(sock)<br>
<font color=”#008b8b”>@socket</font>.read_timeout = <font color=”#ff00ff”>60</font>&nbsp;<font color=”#0000ff”>#@read_timeout</font><br>
<font color=”#0000ff”>#@socket.debug_output = STDERR #@debug_output</font><br>
<br>
check_response(critical { recv_response() })<br>
do_helo(helodomain)<br>
<br>
<font color=”#a52a2a”><b>if</b></font>&nbsp;starttls<br>
&nbsp;&nbsp;<font color=”#a52a2a”><b>raise</b></font>&nbsp;<font color=”#6a5acd”>'</font><font color=”#ff00ff”>openssl library not installed</font><font color=”#6a5acd”>'</font>&nbsp;<font color=”#a52a2a”><b>unless</b></font>&nbsp;<font color=”#a52a2a”><b>defined?</b></font>(<font color=”#2e8b57″><b>OpenSSL</b></font>)<br>
&nbsp;&nbsp;ssl = <font color=”#2e8b57″><b>OpenSSL</b></font>::<font color=”#2e8b57″><b>SSL</b></font>::<font color=”#2e8b57″><b>SSLSocket</b></font>.new(sock)<br>
&nbsp;&nbsp;ssl.sync_close = <font color=”#ff00ff”>true</font><br>
&nbsp;&nbsp;ssl.connect<br>
&nbsp;&nbsp;<font color=”#008b8b”>@socket</font>&nbsp;= <font color=”#2e8b57″><b>Net</b></font>::<font color=”#2e8b57″><b>InternetMessageIO</b></font>.new(ssl)<br>
&nbsp;&nbsp;<font color=”#008b8b”>@socket</font>.read_timeout = <font color=”#ff00ff”>60</font>&nbsp;<font color=”#0000ff”>#@read_timeout</font><br>
&nbsp;&nbsp;<font color=”#0000ff”>#@socket.debug_output = STDERR #@debug_output</font><br>
&nbsp;&nbsp;do_helo(helodomain)<br>
<font color=”#a52a2a”><b>end</b></font><br>
<br>
authenticate user, secret, authtype <font color=”#a52a2a”><b>if</b></font>&nbsp;user<br>
<font color=”#008b8b”>@started</font>&nbsp;= <font color=”#ff00ff”>true</font><br>
<font color=”#a52a2a”><b>ensure</b></font><br>
<font color=”#a52a2a”><b>unless</b></font>&nbsp;<font color=”#008b8b”>@started</font><br>
&nbsp;&nbsp;<font color=”#0000ff”># authentication failed, cancel connection.</font><br>
&nbsp;&nbsp;<font color=”#008b8b”>@socket</font>.close <font color=”#a52a2a”><b>if</b></font>&nbsp;<font color=”#a52a2a”><b>not</b></font>&nbsp;<font color=”#008b8b”>@started</font>&nbsp;<font color=”#a52a2a”><b>and</b></font>&nbsp;<font color=”#008b8b”>@socket</font>&nbsp;<font color=”#a52a2a”><b>and</b></font>&nbsp;<font color=”#a52a2a”><b>not</b></font>&nbsp;<font color=”#008b8b”>@socket</font>.closed?<br>
&nbsp;&nbsp;<font color=”#008b8b”>@socket</font>&nbsp;= <font color=”#ff00ff”>nil</font><br>
<font color=”#a52a2a”><b>end</b></font><br>
<font color=”#a020f0″>end</font><br>
<br>
<font color=”#a020f0″>def</font>&nbsp;<font color=”#008b8b”>do_helo</font>(helodomain)<br>
&nbsp;<font color=”#a52a2a”><b>begin</b></font><br>
&nbsp;&nbsp;<font color=”#a52a2a”><b>if</b></font>&nbsp;<font color=”#008b8b”>@esmtp</font><br>
&nbsp;&nbsp;&nbsp;&nbsp;ehlo helodomain<br>
&nbsp;&nbsp;<font color=”#a52a2a”><b>else</b></font><br>
&nbsp;&nbsp;&nbsp;&nbsp;helo helodomain<br>
&nbsp;&nbsp;<font color=”#a52a2a”><b>end</b></font><br>
<font color=”#a52a2a”><b>rescue</b></font>&nbsp;<font color=”#2e8b57″><b>Net</b></font>::<font color=”#2e8b57″><b>ProtocolError</b></font><br>
&nbsp;&nbsp;<font color=”#a52a2a”><b>if</b></font>&nbsp;<font color=”#008b8b”>@esmtp</font><br>
&nbsp;&nbsp;&nbsp;&nbsp;<font color=”#008b8b”>@esmtp</font>&nbsp;= <font color=”#ff00ff”>false</font><br>
&nbsp;&nbsp;&nbsp;&nbsp;<font color=”#008b8b”>@error_occured</font>&nbsp;= <font color=”#ff00ff”>false</font><br>
&nbsp;&nbsp;&nbsp;&nbsp;<font color=”#a52a2a”><b>retry</b></font><br>
&nbsp;&nbsp;<font color=”#a52a2a”><b>end</b></font><br>
&nbsp;&nbsp;<font color=”#a52a2a”><b>raise</b></font><br>
<font color=”#a52a2a”><b>end</b></font><br>
<font color=”#a020f0″>end</font><br>
<br>
<font color=”#a020f0″>def</font>&nbsp;<font color=”#008b8b”>starttls</font><br>
getok(<font color=”#6a5acd”>'</font><font color=”#ff00ff”>STARTTLS</font><font color=”#6a5acd”>'</font>) <font color=”#a52a2a”><b>rescue</b></font>&nbsp;<font color=”#a52a2a”><b>return</b></font>&nbsp;<font color=”#ff00ff”>false</font><br>
<font color=”#a52a2a”><b>return</b></font>&nbsp;<font color=”#ff00ff”>true</font><br>
<font color=”#a020f0″>end</font><br>
<br>
<font color=”#a020f0″>def</font>&nbsp;<font color=”#008b8b”>quit</font><br>
<font color=”#a52a2a”><b>begin</b></font><br>
&nbsp;&nbsp;getok(<font color=”#6a5acd”>'</font><font color=”#ff00ff”>QUIT</font><font color=”#6a5acd”>'</font>)<br>
<font color=”#a52a2a”><b>rescue</b></font>&nbsp;<font color=”#2e8b57″><b>EOFError</b></font>, <font color=”#2e8b57″><b>OpenSSL</b></font>::<font color=”#2e8b57″><b>SSL</b></font>::<font color=”#2e8b57″><b>SSLError</b></font><br>
<font color=”#a52a2a”><b>end</b></font><br>
<font color=”#a020f0″>end</font><br>
<font color=”#a52a2a”><b>end</b></font><br>
</font><

require openssl
require net/smtp

Net::SMTP.class_eval do
private
def do_start(helodomain, user, secret, authtype)
raise IOError, SMTP session already started if @started
check_auth_args user, secret, authtype if user or secret

sock = timeout(@open_timeout) { TCPSocket.open(@address, @port) }
@socket = Net::InternetMessageIO.new(sock)
@socket.read_timeout = 60 #@read_timeout
#@socket.debug_output = STDERR #@debug_output
check_response(critical { recv_response() })
do_helo(helodomain)
if starttls
raise openssl library not installed unless defined?(OpenSSL)
ssl = OpenSSL::SSL::SSLSocket.new(sock)
ssl.sync_close = true
ssl.connect
@socket = Net::InternetMessageIO.new(ssl)
@socket.read_timeout = 60 #@read_timeout
#@socket.debug_output = STDERR #@debug_output
do_helo(helodomain)
end
authenticate user, secret, authtype if user
@started = true
ensure
unless @started
# authentication failed, cancel connection.
@socket.close if not @started and @socket and not @socket.closed?
@socket = nil
end
end

def do_helo(helodomain)
begin
if @esmtp
ehlo helodomain
else
helo helodomain
end
rescue Net::ProtocolError
if @esmtp
@esmtp = false
@error_occured = false
retry
end
raise
end
end

def starttls
getok(STARTTLS) rescue return false
return true
end

def quit
begin
getok(QUIT)
rescue EOFError, OpenSSL::SSL::SSLError
end
end
end

Para que funcione, se necesita la libreria OpenSSL instalada y la gema ActionMailer o Ruby On Rails que la trae en el paquete, si se usa Windows podria probar con Cygwin.

Espero les sea de utilidad.

PD: Siento las faltas ortograficas estoy en teclado ingles y sin ganas de modificar las X a espaniol 😛

Codigo  original de  http://bit.ly/9r8cx1

Publicado enero 31, 2010 por Sergio D. Rodríguez Inclan en General, Open Source, Ruby & Rails

Etiquetado con

¿Qué tan emprendedores somos?   1 comment

Ultimamente se me ha venido a la mente observando el comportamiento de varias personas, la mentalidad normal es conseguir un trabajo y dedicarse a él para sobrevivir, es muy poco aquel que busca un sueño, un objetivo o una meta; ¿de verdad no tenemos la seguridad suficiente como para invertir un poco de nuestro tiempo en empezar algo? todos tenemos sueños que realizar, como informáticos talves el desarrollar un software innovador, o crear una empresa solvente; todo es posible pero hay que dar el primero paso, aún siendo cuidadosos, asegurando un trabajo que pague nuestros impuestos, pero nunca, nunca hemos de abandonar un objetivo superior, trabajar en ello aun sea unos minutos al día, pero vamos a ello, la satisfacción seguramente es más grande al final.

Publicado julio 12, 2009 por Sergio D. Rodríguez Inclan en General

Etiquetado con ,

Gwibber 2.0 upcoming   5 comments

I have been working maintaining the Gwibber package on Gentoo for a while as a proxy, piteously, it could not get the main tree over the 0.7 version, but it is actively maintained on my personal repository at Gitorious. But what is Gwibber? for all the people who don’t know what is it, this is the definition given in it’s main page at Launchpad:

Gwibber is an open source microblogging client for GNOME developed with Python and GTK. It supports Twitter, Jaiku, Identi.ca, Facebook, Flickr, Digg, and RSS.

What is microblogging? you are invited to check Wikipedia (click here) for a better definition. Twitter, Identi.ca, etc., are networks where you can post tiny commentaries (less than 240 characters) but it’s completely adictive (it keeps me away from posting to my blog :/ ), you can follow any number of persons just adding them to your account, and, if your commentaries are interesting, other people will add you to their accounts. Actually Gwibber supports more networks than that definition says.

Last days two good things happened, the first was the dev (neurogeek) which does the commits for me went back from his vacations so newer versions of Gwibber will be available on the tree, the second is the upcoming of the 2.0 version with a new UI (commented by @BUGabundo), right now Gwibber looks like this:

Gwibber 1.2.0

Forget the missing icons I was hacking it a bit and lost them 😛

Any time soon Gwibber 2.0 will arribe with new UI, new functionalities and of course new networks to join, here you have a picture of what it is gonna be:

Gwibber 2.0

Gwibber 2.0

As you can see, a lot of UI improvementes were done, a side bar with all the network streams, new icons and … many more.

If you want to follow the development and the releases here are a few links you can visit:

Gwibber’s wishlist:
https://bugs.launchpad.net/gwibber/+bug/325046

Montly Snapshot I make of Gwibber and it’s dependencies:
http://dev.gentooexperimental.org/~zerox/

Gwibber’s open bug at Gentoo’s Bugzilla:
http://bugs.gentoo.org/show_bug.cgi?id=261160

My overlay on Gitorious:
http://gitorious.org/gentoo-ebuilds-maintenance/

Segphault’s screenshots:
http://www.scrnshots.com/users/segphault/screenshots/171554

Microblogging   Leave a comment

He aquí un pequeñísimo update a mi tan olvidado blog, ya que no puedo actualizarlo formalmente (y vaya que tengo una cola larga de posts comenzandos y sin concluir) cualquiera que por curiosidad quisiera enterarse qué hago, puede seguirme agregandome como @walsen en twitter o como @zerox por identi.ca 🙂

Publicado junio 27, 2009 por Sergio D. Rodríguez Inclan en General

Metodologías Ágiles (parte 1)   5 comments

Mucha gente tiene la duda de qué es “Agile”, de principio es confuso porque no se parece a lo que nos enseñan en las universidades, no tiene pasos específicos, tampoco cronográmas ni procesos a la vista como los tienen las metodologías tradicionales p.e. la Cascada o el Proceso Unificado.

waterfall_modelrup_model

¿Cuál es el problema de éstos modelos?

En los modelos lineales es necesario tener los requerimientos bien especificados desde el comiendo, el análisis, diseño deben estar completos en las primeras fases y no hay manera de pasar a la implementación ántes de éstos; el testeo se hace al final (gran error) lo cuál trae problemas de integración, males que podrían ser evitados desde el principio se encuentran (a veces no) faltando poco antes del lanzamiento del producto, en éste punto la adaptabilidad del producto a cambios y nuevos requerimientos es practicamente nula, lo unico que puede hacer el desarrollador es asegurar su trabajo mediante la firma de un papel sellando los requerimientos, al final sólo asegura el pago por el trabajo, no asegura la satifacción del cliente y la calidad del producto.

En un modelo del tipo RUP, iterativo – incremental y demás, las fases siguen estando bien definidas, en cada fase se realiza un poco del trabajo, análisis, diseño, implementación, prueba y despliegue, dandole más énfasis a cada parte o conjunto de partes a medida que transcurre el ciclo; todo ésto está muy bien pero lamentablemente la metodología se vuelve un monstruo porque exige demasiada carga en la documentación, todo el detalle exigido es una perdida de tiempo, se produce monton de material muchas veces inservible gastando tiempo y recursos valiosos (diagramas hasta para ir al baño), otro punto es la especialización de los profesionales, para cada fase un determinado tipo de profesional dando puntos cruciales de la información a algunos y con el riesgo de pararse el proyecto si ellos se ausentan por algún motivo; la separación de ramas y jerarquía entre el equipo (enorme equipo) hace que muchas veces exístan diferencias e imposiciones de ideas.

Agile

Agile no son pasos, gráficas elaboradas, o un plan maestro; Agile son consejos, buenas prácticas que muchos entendidos en software han puesto a nuestra disposición para usarlas, en otras palabras comparten su experiencia en una manera ordenada y sencilla de aplicar.

Éstos conceptos se pueden ver en el Agile Manifiesto que resume éste pensamiento:

Individuos e interacciones sobre procesos y herramientas

Software que funciona sobre documentación exhaustiva

Colaboración con el cliente sobre negociación de contratos

Responder ante el cambio sobre seguimiento de un plan

La gente nos importa, las personas son el recurso más valioso que se tiene, ellos son los que desarrollan el software no las herramientas ni los procesos, un programador feliz rinde mejor que uno con estrés, un cliente contento es mejor que uno disconforme.

No nos interesa crear 100.000 diagramas en herramientas super cargadas si sólo queremos tener una idea clara, nos basta un lápiz, una hoja de papel, o una pizarra y una camara fotográfica o celular para preservarla. Además ¡queremos Software ya! necesitamos que el cliente esté seguro que lo que pide es lo que necesita, para ello un demo rápido del producto nos da un feedback excelente; un demo cada cierto tiempo corto permite muchas cosas:

  • Adaptabilidad a los cambios de requerimientos.  Los diagramas de Gantt y Pert son OBSOLETOS, si alguien realiza un modelo predictivo por pasos NO ES AGILE, dar muerte a MS Project. No se puede predecir cómo serán los cambios de requerimientos en medio del proyecto, menos al final.
  • Predictibilidad a corto plazo, el cliente nos guiará, el mercado nos guiará y en un plazo cercano, dias, las funcionalidades tomarán forma.
  • Calidad, el testeo debe ir a la par del desarrollo, los bugs se encontrarán, reparán y documentarán a medida que el software tome forma, exísten muchas técnicas ágiles para ello, una es TDD (Test Driven Development).
  • Compartición y reutilización de código. Nuestra filosofía siempre ha de ser COMPARTIR, preservar conocimiento y reutilizarlo, ahorrar tiempo y esfuerzo, evitar trabajo excesivo y distribuir la carga mental entre todo el equipo y más (todos los participantes informáticos o no).

Metodologías Ágiles

Hay varias implementaciones de metodologías ágiles:

Cada cuál sigue sus propias tendencias pero siempre respetando los principios descritos anteriormente; algunas son muy simples, otras refuerzan documentación y procesos pero la mayoría puede adaptarse al ritmo del proyecto que se vaya a ejecutar.

scrumlargelabelled

400px-es_three_layers

Agile Software Buildings   Leave a comment

I’ve posted a little paper about the Agile Architect and the Software Buildings development, is an essay which gives an idea about real development and the rol of the people on the process, please read it and post your comments.

http://docs.google.com/Doc?docid=df728hnw_57zggk4hcf&hl=en

Contributions are always welcome 🙂

Publicado abril 14, 2009 por Sergio D. Rodríguez Inclan en General