Reviewing Instant Apache Solr for Indexing Data How-to

Instant Apache Solr for Indexing Data How-to Cover Recently I’ve had the chance of reviewing a new book about Solr: Instant Apache Solr for Indexing Data How-to thanks to the author Alexandre Rafalovitch for providing me the opportunity of doing this. It was a pleasant reading, really interesting so here are my impressions.

A remarkable point about this book is the the approach used with examples, basically the examples are first guaranteed to work and then explained in a great detail without overwhelming the reader. It’s fair to say that I was already familiar with Solr, so I knew several of the concepts explained in the first chapters, although I’ve been using a previous version (3.6) of Solr, so this book offers a very good perspective to dose seeking for a preliminary introduction into Solr 4. The author manages to expose some very complicated topics in a very fancy and yet simple form smoothly driving you from simpler topics into advanced ones.

Continuar leyendo ‘Reviewing Instant Apache Solr for Indexing Data How-to’

PyJupiter meet the World, World this is PyJupiter

From a few months now I’ve been using Jupiter to speed up certain tasks in my laptop (usually I work with an external monitor in my home, so I’m constantly connecting and disconecting the monitor from my Acer Aspire One D250, obviously its more comfortable to work in a 15.6″ display that in the built in 10.1″ laptop display).

Jupiter is great without any doubt. But for me has some “issues”. The main one is that the GUI is developed in C#, this means that needs mono installed to work. In Ubuntu 11.10 (distribution that I’m using right now) mono came installed by default, applications like Banshee are also developed in mono. In the future nearby (with Ubuntu 12.04), this is not true any more.

Besides all this, in Ubuntu 11.10, installing Jupiter also means installing all this packages:

libmono-corlib2.0-cil libmono-data-tds2.0-cil libmono-i18n-west2.0-cil libmono-messaging2.0-cil libmono-posix2.0-cil libmono-security2.0-cil libmono-sharpzip2.84-cil libmono-sqlite2.0-cil libmono-system-data-linq2.0-cil libmono-system-data2.0-cil libmono-system-messaging2.0-cil libmono-system-web2.0-cil libmono-system2.0-cil libmono-wcf3.0-cil libmono2.0-cil

This is about 17MB of packages that I need to install just to use the Applet. Besides all these elements, the original implementation uses an icon in the notification area, in Unity the use of an indicator provides e better integration, and I really like keeping my system organize.

Keeping all this in mind, i started to rewrite the GUI part of Jupiter in something called PyJupiter, essentially I continue using all the bash scripts and just rewrote the GUI, using Python, PyGTK, and improving the integration with Unity using an indicator. After some advise from the original developer Andrew Wyatt I also included the systray icon to keep compatibility with those users that don’t use Unity. Also I included some multithread capabilities, so each submenu is rendered by a different thread increasing the ideal of a responsive interface. Some minor tweaks have also been made in the menu, using radio buttons or check boxes instead of the original asters to indicate the active element.

I’ve packaged the system into a deb package, so installation in Ubuntu 11.10 is easy, for those distributions RPM based the code is inside the deb file, so packaging for others systems should be easy.

So without anymore delay I’ll give you PyJupiter (Download).

Please share any comments/thoughts in the comments.

Mistery Solved! Rajesh usa Mac

Para aquellos que no lo saben soy un gran fan de la serie The Big Bang Theory que es actualmente transmitida actualmente por CBS, es simplemente de otro mundo esta serie.

En fin, los protagonistas poseen (como buenos geeks) sus portátiles, ya en internet podemos encontrar referencias sobre los modelos que utilizan sus protagonistas. En fin Rajesh Ramayan Koothrappali utiliza una MacBook Pro (creo) y aunque siempre supuse que utilizaba Mac en esa laptop nunca en la serie se confirmó pues siempre aparecía teniendo una videoconferencia con sus padres en la primera y segunda temporadas. Ahora en la tercera en el capítulo 17 “The Precious Fragmentation” podemos observar,  cuando se dispone a realizar una un chat de video (a través de iChat supongo), con claridad las marcas distintivas de un Sistema Operativo Mac y a juzgar por  el wallpaper podríamos asumir que es MacOS X 10.5 Leopard en alguna de sus actualizaciones, tal parece que nuestro querido Rajesh no ha actualizado a Snow Leopard todavía :-).

En fin, aquí les dejo una toma del momento en que se puede observar que la portátil posee Mac instalado.

Rajesh usa Mac!

URL Validator en Rails

Hace un tiempo que he comenzado a estudiar Ruby on Rails, es algo que había puesto en espera durante mucho tiempo. Yo vengo de utilizar symfony para algunos proyectos en los que me he visto involucrado y al final me he acostumbrado bastante, porque de por sí symfony es un gran framework y ahorra muchísimo trabajo, desde los validators que ofrece hasta muchas de las funcionalidades como el Admin Generator que realmente son una pasada.

Pues bueno, la cosa es que necesité validar en Rails que una URL entrada por el usuario fuera válida, en symfony, para esto simplemente definía de la siguiente forma:


$this->validatorSchema['url'] = new sfValidatorUrl(array('required'=>true));
$this->validatorSchema['url']->setMessage('invalid', 'Please enter a valid web address (http://google.com)');

Esto lo ponía en el método configure() de la clase correspondiente a mi formulario y listo!.

En Rails, me encontré que esto no era tan sencillo, de hecho buscando en Google encontré varios ejemplos de personas que lo hacían utilizando expresiones regulares. Aunque esto para nada es extraño realmente no me gusta memorizar algo tan largo y buscando me encontré con esta otra alternativa, utilizando validates_format_of


validates_format_of :url, :with => URI::regexp(%w(http https))

La cosilla está en que el método regexp de URI admite como parámetros la lista de protocolos que deseamos que se validen y en función de esto genera las expresiones regulares correspondientes y por tanto validará todo lo que URI.parse sea capaz de parsear.

De Regreso del RECPAT 2009

El día primero de diciembre recibí la confirmación de que el trabajo que había enviado al VII Congreso Nacional de Reconocimiento de Patrones fue aceptado y luego de hacerle algunas correcciones el día 3 envié la versión camera-ready que fue la que finalmente envié.

Continuar leyendo ‘De Regreso del RECPAT 2009′

Escribir gramáticas en LaTeX (latex-bnf)

Para la asignatura de Programación IV (Teoría de Lenguajes y Compilación) me ha tocado implementar un intérprete, al final me he decidido a utilizar ANTLR3. Al final como tengo que entregar un informe sobre la tarea, y como para todos mis informes de la Universidad utilizo LaTeX, pues me he puesto a buscar como escribir gramáticas en un documento de LaTeX, me encontré varios paquetes (simple búsqueda por grammar en la CTAN) sin embargo me decanté por latex-bnf la cuestión fue que cuando lo fuí a utilizar en mi Sistema (MacOS X 10.5.5 + MacTex 2007 + TextMate) y guiándome por el documento de ejemplo, me encuentro que daba error al tratar de utilizar pdflatex como generador del documento. 

La cuestión es que al parecer el paquete tiene su tiempito ya y en la documentación te especifican que para utilizarlo debes poner la línea:

\documentstyle[bnf]{article}

Sin embargo, cuando utilizamos esta línea en por ejemplo un artículo que estemos escribiendo, obtenemos el siguiente error:

Latex Error: ./untitled 2.tex:10 LaTeX Error: LaTeX2e command \usepackage in LaTeX 2.09 document.

En mi caso la solución que encontré luego de “trastear” un tiempo, fue que con un simple:

\documentclass{article}
\usepackage{bnf}

Teniendo el fichero: bnf.sty en el mismo directorio del documento que estemos redactando, o en su variante teniendo el paquete latex-bnf instalado correctamente en nuestro sistema LaTeX.

Autenticando contra un LDAP desde Python

Desde hace ya algún tiempo soy un lector asiduo de los blogs de Zuzel, Yasser, Luis y otros muchachos de la UH, que poseen su blog. Realmente son algunos de los escasos blogs que existen en Cuba que se actualicen y que además publican contenidos que me resulten interesantes :-).

En fin gracias a un trabajo que presentó Zuzel en la Jornada Científica en la Universidad de la Habana llegúe al DrProject, que según su propia web:

DrProject is a web-based project management portal that integrates revision control, issue tracking, mailing lists, a wiki, and other tools that software development teams need to succeed. DrProject was designed to be simple enough for undergraduate students to master in less than an hour, and is now being used by universities, open source projects, and commercial teams in several companies.

Me pareció bastante interesante y además mucho más sencillo que otros como el GForge, además el atribuido adicional de tener a una experta cerca era tentadora. Pues nada me puse en contacto con ella y como para ella no era ningún problema el venir hasta la Universidad, ayudarme a instalar y configurar, pues asi lo hicimos. Luego de luchar con algunas “p” mal escritas :-), se logró hacer funcionar todo sin mayores problemas.

De todo el proceso, la parte que más le interesaba a Zuzel era la de hacer autenticar al drproject contra el LDAP de la Universidad, luego de escribir algún que otro código lo dejamos con una autentificación, que en ese momento, pensé que funcionaba, la cuestión fue que al final, luego de probar varias veces llegué a la conclusión de que realmente no funcionaba, pues cualquier combinación de usuario / contraseña que le proporcionaba se logeaba perfectamente.

Entonces fue cuando comenzé a buscar información sobre la librería python-ldap que estábamos utilizando para la autentificación, luego de una búsqueda bastante amplia, no encontré ninguna información que me fuera del todo clara o que me proporcionara algún ejemplo que me permitiera adaptarlo de forma rápida y fácil a mis necesidades. Finalmente, pude encontrar en estos artículos la mejor información disponible, y aquí un ejemplo que aunque orientado a django me fue muy útil para lograr un script funcional. A continuación dejo el código del fichero validate.py que se encarga de realizar la autentificación desde la interfaz web del DrProject:

Expliquemos un poco el código:

AD_DNS_NAME = 'uci.cu'
AD_LDAP_PORT = 389
AD_SEARCH_DN = 'OU=UCI Domain Users,DC=uci,DC=cu'
AD_SEARCH_FIELDS = ['displayname', 'mail', 'mailnickname', 'title']
AD_LDAP_URL = 'ldap://%s:%s' % (AD_DNS_NAME, AD_LDAP_PORT)
DOMAIN = "uci.cu"

Estas líneas son simplemente de configuración para establecer el AD_LDAP_URL que es la URL que se utiliza para conectar al servidor LDAP.


username = sys.stdin.readline().strip("\n")
password = sys.stdin.readline().strip("\n")
try:
l = ldap.initialize(AD_LDAP_URL)
r = l.simple_bind_s("%s@%s"%(username, DOMAIN), password)
l.unbind_s()
sys.exit(0)
except ldap.LDAPError, e:
# print e.message['info']
if type(e.message) == dict and e.message.has_key('desc'):
print e.message['desc']
else:
print e
sys.exit(1)

Esta es la función validate que es la que encarga de corroborar las credenciales del usuario. En el caso particular de DrProject se leen el usuario y la contraseña mediante la entrada estándard y luego se comprueban con el servidor LDAP.

Finalmente lo que se incluye es una llamada a la función validate para ejecutarla:


if __name__ == '__main__': validate()

De esta forma se logra que el DrProject autentique directamente contra un servidor LDAP, lo cual puede ser útil debido a que la gestión de usuarios no queda de parte del DrProject y además se evita que los usuarios tengan que crearse nuevas cuentas y recordar más contraseñas :-)



Seguir

Recibe cada nueva publicación en tu buzón de correo electrónico.