Búsqueda Fonética

Estaba descansando un día viernes después de la celebración del cumpleaños de un compañero del trabajo cuando mi jefe llega y me dice «Búsqueda fonética», mi primera reacción fue » D: , ya claro» y aqui me encuentro, buscando lo que más pueda sobre búsqueda fonética, algo tan nuevo para mí, quizás no tan nuevo para usted o quizás desconocido pero es algo interesante. La aplicación de búsqueda fonética es en registro de marcas, en el caso de yo tener una nueva marca que quiera registrar por Propiedad Intelectual debo saber primero si ya pertenece a otras marcas, en algunos lugares del mundo (México) creo es el primer paso mientras en Ecuador van a implementar (desconozco aún el asunto, el texto es para introducir al contexto).

Empecé a investigar, no hallaba mucha información en español y peor en inglés (preguntas en stackoverflow ), mientras buscaba una duda apareció, ¿Debo buscar en audio o texto?, luego recordé que sería una aplicación web en la que el usuario deberá buscar para saber si su posible marca está registrada o no

Ya dejaré el bla bla bla y entraré a lo técnico, ¿Qué es búsqueda fonética?  Wikipedia lo define como un método de reconocimiento de discurso y se enfoca en el audio, es una entrada my vaga de pocas líneas. Una definicón más agradable es de Answers: «Método para localizar información en un archivo en la que un algoritmo es usado para localizar combinaciones de caracteres que suenan similiares (audio) <<o se leen similares, esto lo añadí>> para una combinación específica»

A continuación un pequeño ejemplo ilustrativo sobre los resultados que debería obtener al buscar:

Marcas registradas

  • La casa del Detergete.
  • Mi Segunda casa.
  • La casa del Carburador.
  • La casa del Pañal.
  • Jardín Feliz.
  • Helados Patito.

Búsqueda:

  • Casa

Resultados:

  • La casa del Detergete.
  • Mi Segunda casa.
  • La casa del Carburador.
  • La casa del Pañal.

Buscando en la web encontré sobre el diseño de un sistema llamado BUFON (Búsqueda fonética, a Nathalie y a mí nos pareció gracioso, yo imagino un payaso). BUFON se integra con otros sistemas además de ser propietario para algún instituto de propiedad intelectual, lo analicé para introducirme en el tema. Lei sobre Solr y Lucen hasta que caí en manos de Open Search Server, apenas lo ví me pareció interesante y a mi jefe le agradó, la documentación es muy pobre así que por ahora está descartado.

Al tiempo en que estoy escribiento esta entrada, probaré son Sphynx, un full-text search engine. Veremos que tal me va y compartiré mi experiencia con Sphynx.

Le agradezco señor lector si leyó toda la entrada o se interesó. Entraré en más detalles en una próxima entrada sobre algoritmos relacionados a Búsqueda Fonética.

P.D.: Considero que estoy aprendiendo a escribir, en especial en un sentido en el que debo aprender a expresar el tecnicismo de una manera que el cliente entienda. Pronto habrá la siguiente parte de búsqueda fonética.

Sobre Scheduler y los registros

Es un post un poco técnico y objetivo, las opiniones corresponden al autor (yo) y no representan el lugar donde trabajo.

 

Como todos sabemos hubo cambios en la modalidad de registros para el Término I 2013-2014, la novedad principal es que mientras te registrabas, las personas que no le correspondían registrarse de acuerdo a las reglas de registro no podían consultar las materias a tomar.

¿Es esto bueno? Desde mi punto de vista sí, en ocasiones anteriores donde se registraban usuarios de acuerdo a las reglas y consultaban estudiantes hubo muchos problemas, siendo los más perjudicados los usuarios que debían registrarse. El servidor tenía que hacer dos trabajos:

  1. Registrar a los estudiantes en las materias a los estudiantes que por regla le correspondía registrarse.
  2. Consultar las materias disponibles a los estudiantes que por regla no podían registrarse pero consultaban materias.

¿Sirvió el nuevo método de registro? Al principio no, hubo los mismos problemas que en términos pasados, aplicación caída, servidor no responde, en teoría debía funcionar porque eran menos los estudiantes a registrar y el sistema debería responder con normalidad, es verdad que existen algunos problemas que son de exclusiva responsabilidad de las unidades académicas, por ejemplo exámenes que tenían horario tipo «01:30 – 13:30», un gran error de digitación que perjudicó mucho, se hizo lo humanamente posible por resolver lo más rápido (un día de registro fue feriado, complicó las cosas), otros errores en planificación de cursos.

¿Y qué onda con Scheduler? Scheduler es una aplicación escrita en java que te permite consultar tus materias disponibles y colocarlas en un planificador, das tu usuario y tu clave se consume un servicio web (hasta donde tengo entendido todo viaja seguro) ofrecido por el CSI y los datos obtenidos por ese servicio se transforman en el bonito horario que quieres planificar.

El gran detalle es que el método de bloqueo para que solo las personas que les correspondía registrar y consultar solo estaba en la capa de presentación (hasta donde sé), no en los servicios web, muchos estudiantes querían monitorear si los paralelos en que pensaban registrarse estaban con 0 cupos se dieron cuenta que al usar Scheduler podían «saltarse» ese bloqueo, entonces volvíamos a lo ocurrido en términos anteriores, el servidor debía responder por el servicio web que consumía Scheduler y por los estudiantes que debían registrarse.

El CSI se dió cuenta de este error y lo solucionó, lo que causó que Scheduler funcionara al igual que el Sistema Académico (con los bloqueos por promedio). El CSI envió un mail diciendo que no se debía entregar usuarios y contraseñas, @chimeco el autor de Scheduler aclaró en su post una explicación diciendo que su aplicación no es maliciosa. No dudo de la integridad de @chimeco, pero la explicación que da en el post (no desconfío de ella) puede probarse como falsa.

¿Cómo es eso? Fácil, @chimecho lo único que hace es mostrar los .class (bytecode) con la fecha de su última modificación, fácil compilo mis archivos el 29 de abril PERO con la fecha del reloj de windows cambiada al 24 de abril. Así que @chimeco, es una forma de demostrar que la aplicación pudo haber sido compilada el 29 de abril. (OJO no dudo del post del autor, nuevamente recalco que para mí no es la manera correcta de demostrar).

El CSI mandó un correo en general, lógico por la preocupación, hasta donde sé nunca dijeron «Scheduler es el culpable», y en algo tienen razón, no está autorizada. No es mi deber atacar  @chimeco, solo demostrar escenarios adicionales.

Ya hablaré sobre mi experiencia con los registros, desde el otro lado de la moneda.

Ruby Installer, Gem Install, GTK2 (Instalación y configuración en Windows 7)

 

Esta es una pequeña guía de como instalar Ruby y como trabajar en Windows.

 

 

Instalación de Ruby

 

En mi caso para instalar Ruby usaré el Ruby Installer que lo pueden obtener de este enlace: http://rubyinstaller.org/news/2011/10/31/rubyinstaller-1-9-3-p0-released/

Una vez descargado procedemos a ejecutar el Instalador y aparecerá lo siguiente:

 

Imagen1

Imagen 1: Pantalla inicial de Instalación de Ruby 1.9.3

 

Aceptamos la licencia de Ruby y luego damos clic en Next donde veremos la siguiente pantalla.

 

Imagen1 

Imagen 2: Selección de Tareas Opcionales de Ruby Installer

 

Es muy importante seleccionar la opción de “Add Ruby excutables to your PATH” si no deseas configurar las variables de entorno manualmente, ya que ciertas personas encuentran dificultoso configurar las variables de entorno, luego procedemos a dar clic en instalar

“Si deseas asociar tus archivos .rb (archivo fuente de Ruby) y .rbw(Workspace de Ruby) dale visto en “Associate .rb and .rbw files with this Ruby Installation”

“Si posteriormente trabajarás con Tcl/Tk añade el soporte dando visto en “Install Tcl/Tk support”

Imagen1 

Imagen 3: Instalación en curso de Ruby

 

Imagen1

Imagen 4: Finalización de la instalación de Ruby

 

Una vez finalizada la instalación de Ruby damos clic en finish y comprobaremos que Ruby esté instalado correctamente en nuestro ordenador, para esto es necesario abrir una ventana de comando de Windows ( Windows + R y escribir cmd), veremos la línea de comandos.

 

Imagen1

Imagen 5: Línea de Comandos de Windows

 

Ejecutamos el comando ruby en la línea de comandos, y sí todo está correctamente instalado veremos la siguiente pantalla:

 

Imagen1

Imagen 6: Correcta instalación de Ruby

A simple vista parece que nada haya pasado, pero si observamos bien, en el título de la Línea de Comando podemos observar que está escrito ruby, lo cual significa que hemos instalado correctamente.

 

Instalación de Gem Install

Gem Install es una interface de línea de comando para Ruby Gems. Con esto podemos instalar gemas localmente o remotamente, ver las gemas instaladas, buscar más gemas, y más.

Trabajamos de forma básica: Especificas una operación y opcionalmente algunos modificadores.

Finalmente podemos tener un archivo de configuración para especificar los argumentos de la línea de comandos más usados. (traducción parcial de http://docs.rubygems.org/read/chapter/9#page57)

Procedemos a descargar la última versión Gem Install que es la 1.8.11 de la siguiente dirección: http://rubyforge.org/frs/download.php/75474/rubygems-1.8.11.zip

Una vez descargado procedemos a descomprimir en alguna ubicación en mi caso será en C:\Ruby Gems\

Imagen1

Imagen 7: Carpeta con los archivos descomprimidos de Ruby Gem.zip

Podemos ver en la imagen los archivos que contiene nuestra carpeta Ruby Gems, como podemos ver los archivos .rb (ruby) tienen un ícono colorido, esto nos indica que están asociados a Ruby. El siguiente paso es abrir una línea de comandos y situarnos en el directorio donde tenemos guardado Ruby Gems

 

Imagen1

Imagen 8: Directorio donde tenemos instalado Ruby Gems

 

Si deseas tener una lista de los archivos que se encuentran en dicha carpeta puedes usar el comando dir, ahora para instalar Ruby Gems lo único que hacemos es escribir en la línea de comandos ruby setup.rb y listo se procederá a instalar Gem Install, finalmente observamos el mensaje de que fue correctamente instalado.

 

image

Imagen 9: Gem Install instaladas en nuestro sistema operativo

Instalación de Gtk2

 

Instalaremos la librería Gtk2, como ya estamos acostumbrados procedemos a abrir una línea de comandos y escribimos gem install gtk2

 

image

 

Imagen 10: Gtk2 correctamente instalado

 

Si desean probar ruby y gtk2 les adjunto el código fuente de un Hola Mundo con su Main

http://pastebin.com/yqrpZPQm => Hola Mundo

http://pastebin.com/wwaT5Xpf => Main

 

Pueden usar un editor de texto (bloc de notas) yo uso notepad++

 

Guardamos los dos archivos con extensión .rb y desde línea de comando desde la ubicación donde los tenemos almacenados ejecutamos la clase main.

ruby main.rb y obtenemos este resultado.

 

image

Imagen 11: Hola mundo hecho en Ruby usando Gtk2

 

by: Lord Istvath

Instalación de Dynamic Languages Toolkit, Ruby IDE, creación y configuración de proyectos Ruby (Hola Mundo)

 

Esta es una pequeña guía de como instalar bajo el entorno de Windows el Dynamic Languages Toolkit , que nos servirá para editar código, compilar, realizar debugs de lenguajes de programación dinámicos todo dentro del ambiente de Eclipse , en este caso usaremos el Lenguaje de Programación Ruby, configurar el intérprete de Ruby en Eclipse. Asumimos que el lector tiene instalada alguna versión de Ruby (en mi caso tengo la versión 1.86) y crearemos un proyecto típico dentro del mundo de la programación, el clásico Hola Mundo.

“The Eclipse Dynamic Languages Toolkit Project (El Proyecto Eclipse de kit de herramientas de Lenguajes dinámicos) es una herramienta para proveedores, investigadores y usuarios finales quienes confían en Lenguajes Dinámicos. DLTK se compone de un conjunto extensible de frameworks diseñados para reducir la complejidad de la construcción de entornos de desarrollo completo ofrecido para lenguajes dinámicos como PHP y Perl.

Además de un conjunto de frameworks DLTK provee ejemplos de Tcl, Ruby, Python, y entornos de desarrollo listos para usar fuera de la caja[1]

 

 

Dependencias

Nombre Tipo Enlace de Descarga
Eclipse Prerrequisito eclipse-platform-3.6.2-linux-gtk.tar.gz u otra plataforma
EMF Requerido emf-runtime-2.6.0.zip
ANTLR Runtime Usado para Python & Javascript org.antlr.runtime_3.0.0.v200803061811.jar
JDT Usado para Javascript org.eclipse.jdt-3.6.2.zip
DSDP TM RSE Opcional, usado para soporte de proyectos remotos RSE-runtime-3.1.2.zip
Mylyn Opcional mylyn-3.2.0.I20090617-0100-e3.4.zip
H2Database Opcional org.h2_1.1.117.v20091003-1000.jar

Tabla 1: Dependencias del DLTK y componentes opcionales

 

A continuación  los distintos componentes del Dynamic Languages Toolkit

Componentes del DLTK

Nombre

Requerimientos

Descarga del Runtime

Descargas del SDK

Tests

image    Core frameworks

image   EMF(Eclipse Modeling Frame)

imageDescarga 6,8mb image

imageDescarga 10,7mb image

imageDescarga 0,4mb  image

image   Ruby IDE

image   Core

imageDescarga 1,5mb image

imageDescarga 2,5mb   image

imageDescarga 1,0mb  image

image  Tcl IDE

image   Core,  image EMF

imageDescarga 5,9mb image

imageDescarga 5,9mb   image

imageDescarga 1,0mb  image

 

Asumiré que el lector posee en su ordenador alguna versión de Eclipse ( Indigo, Helios, Ganymedes, etc..) y el Eclipse Modeling Framework, en mi caso tengo Eclipse Indigo  por lo tanto procederé a descargar el Core frameworks y el Ruby IDE, aparecerán las siguientes pantallas:

 

image

Imagen 1: Selección del mirror para descargar el Core frameworks.

 

image

Imagen 2: Selección del mirror para descargar Ruby IDE.

Una vez descargados los archivos .zip correspondientes procedemos a abrir nuestro primer archivo .zip (dltk-core-S-3.0.1-201108261011.zip), en mi caso uso WinRar, nos dirigimos a la carpeta eclipse/plugins y extraeremos los archivos en siguiente ubicación “C:/eclipse/plugins” <<esta ruta varía dependiendo de donde tenga almacenado Eclipse>>.

Realizamos el mismo procedimiento con el siguiente archivo .zip (dltk-ruby-S-3.0.1-201108261011) de extraer el contenido de la carpeta “C:/eclipse/plugins

image

Imagen 3: Carpeta donde tengo almacenado Eclipse.

Una vez realizado estos pasos, Eclipse cuenta con el DLT, procedemos a verificar creando un proyecto en Ruby (el clásico Hello World)

File –> New Project –>

image

Imagen 4: Creación de un proyecto Ruby en Eclipse.

image

Imagen 5: Selección de un proyecto Ruby en el asistente de Eclipse.

image

Imagen 6: Creación del proyecto HolaMundo.

image

Imagen 7: Proyecto HolaMundo en el Script Explorer, se observan otros proyectos JAVA almacenados

en el mismo workspace.

File –> New –> Ruby Class

 

image

Imagen 8: Creación de una Clase Ruby

image

Imagen 9: Creación de la clase Main.

Código Ruby del clásico “Hola Mundo

class Main
puts «Hola Mundo!!!»
end

 

Ahora para ejecutar nuestro HolaMundo procedemos a configurar el intérprete de Ruby en Eclipse, procedemos a ir a Windows –> Preferences –>Ruby –> Interpreters

Damos clic en Add y aparecerá la siguiente ventana:

 

image

Imagen 10: Añadir Intérprete Ruby.

 

Procedemos a buscar la ruta donde tenemos instalado el Intérprete de Ruby, en mi caso mi path es: “C:/Ruby186/bin” y selecciono el archivo “ruby.exe

 

image

Imagen 11: Selección del Intérprete Ruby.

Damos clic en abrir, luego en ok y nuevamente en ok y tendremos listo nuestro Entorno de Desarrollo Integrado (IDE) para creación, compilación, interpretación, realización de debugs de Ruby, para probarlo ejecutamos nuestro Proyecto HolaMundo.Aparecerá el cuadro de diálogo Run As seleccionamos Ruby Script y procedemos a ver como nuestro mensaje aparece en la consola.

image

Imagen 12: Nuestro mensaje Hola Mundo visto en la consola de Eclipse

 

 

Conclusiones Finales:

 

Podemos ver como Eclipse es un IDE con una personalización increíble gracias a los plugins, adaptándose a las necesidades del desarrollador, dentro de el universo de Eclipse encontramos plugins para Inteligencia de Negocios(BIRT), Desarrollo de Aplicaciones móviles (Android, Blackberry, Nokia), Desarrollo Web (Aptana), UML (eUML2), y muchos más plugins que podemos encontrar en el eclipse market place

by: Lord Istvath

Disyunción Exclusiva (XOR)

En lógica matemática, circuitos y programación suele ser muy usado los operadores lógicos, tenemos conjunción, disyunción inclusiva, disyunción exclusiva, negación (más información operadores lógicos)

Definición: El operador lógico disyunción exclusiva nos dice que dadas dos proposiciones a y b, obtenemos un valor verdadero al aplicar el operador sí y solamente sí:

  • La proposición a tiene un valor de  verdad Verdadero y la proposición b un valor de verdad Falso.
  • La proposición a tiene un valor de verdad falso y la proposición b un valor de verdad verdadero.

A continuación la tabla de verdad de dicho operador lógico:

a b a v b
0 0 0
0 1 1
1 0 1
1 1 0

    Tabla 1: Tabla de verdad del operador lógico XOR

Equivalencia

Una manera de representar la disyunción exclusiva es usando disyunciones y conjunciones de la siguiente manera.

         (a ^ ¬b) v (¬a ^ b)

Ejemplos en la vida cotidiana

  • Estoy en Quito o estoy en Guayaquil.
  • Trabajo o voy al cine.
  • Como o duermo.
  • Mañana le presto el libro a María o le presto a José.

Como podemos observar en las oraciones, son acciones que solo se puede realizar una a la vez, como en el caso de la primera oración, no podemos estar en dos lugares al mismo tiempo.

Operador Disyunción Exclusiva en JAVA

Si el lector(a) no está interesado, puede obviar las siguientes líneas ya que es el uso de lo expuesto anteriormente en el lenguaje de programación JAVA.

En días anteriores he estado leyendo Introduction to JAVA Programming Comprehensive 8th edition por Y. Daniel Liang el cual me parece un texto muy interesante, he empezado la lectura del libro desde el inicio, tomando en cuenta que tengo bases de conocimientos en JAVA, en el capítulo 3 Selections encontré una tabla con los operadores lógicos, de los cuales dado los cursos de programación que he cursado, apuntes en la web, e-books, y  libros físicos de la universidad pensé que los conocía todos, cuando ¡oh, sorpresa!

Encontré un operador que realiza el trabajo de la disyunción exclusiva, anteriormente me había tocado en proyectos o ejercicios usar la equivalencia con conjunciones y disyunciones llevando mis expresiones a la forma (a &&  != b)  ||  (!= a  && b) de la sintaxis de java, una ventaja de dicho operador es que ya no debemos llevar a la forma equivalente y la lectura del código es un poco más fácil.

El operador Disyunción exclusiva es representado en java por el símbolo: ^.

Sintaxis: a ^ b

Ejemplos del uso de la Disyunción Exclusiva en programación

  • La Compañía XYZ ofrecerá descuentos a sus clientes afiliados de categoría A y con residencia en Guayaquil o a sus clientes de categoría B con residencia en Quito.
    • Como podemos ver un cliente de categoría A solo tiene un lugar de residencia registrado en  los datos de la compañía XYZ.
  • Si un dígito de el boleto de lotería comprado por un usuario coincide con un dígito en el boleto ganador, el premio es de $1000, (para efectos prácticos un boleto de lotería va desde el (000 al 999)
    • Vemos otro uso de la disyunción exclusiva ya que se pueden presentar los siguientes resultados (Ejercicio 3.15, Introduction to JAVA Programming) :

gameLottery

Boleto de Lotería Boleto Ganador
dígito 1 dígito ganador 1
dígito 1 dígito ganador 2
dígito 1 dígito ganador 3
dígito 2 dígito ganador 1
dígito 2 dígito ganador 2
dígito 2 dígito ganador 3
dígito 3 dígito ganador 1
dígito 3 dígito ganador 2
dígito 3 dígito ganador 3
Tabla 2: Resultados posibles de el problema de la lotería.

Dada la condición que, para ganar el premio de $1000 sólo debe coincidir un dígito con el boleto ganador, usamos una disyunción exclusiva para omitir los casos en el que el boleto ganador y el boleto de lotería coincidan en dos ocasiones, una implementación en java sobre la parte de coincidencia de un dígito en la lotería es la siguiente:

if( (d1 == dbg1 || d1 == dbg2 || d1 == dbg3)   ^ (d2 == dbg1 || d2 == dbg2 || d2 == dbg3) ^ (d3 == dbg1  || d3 == dbg2 || d3 == dbg3))
System.out.println( «Felicitaciones, GANASTE $1000»);

donde d1,d2,d3 son dígitos1, dígito2, dígito3 de el boleto de lotería respectivamente,  dbg1, dbg2, dbg3

Como podemos observar el uso del operador disyunción exclusiva nos evita a usar la forma equivalente y evitar confusiones al escribir el código.

¡Despertad!, un arma de doble filo

¡Despertad! es una publicación física en modo de revista a color de la WatchTower Bible and Tract Society of New York[1], que al menos en el país donde yo vivo se distribuye de manera gratuita a través de los Testigos de Jehová <<Dicen que los Testigos de Jehová son el spam en persona>>.

cover                          

                                                      Una portada de la revista ¡Despertad!

El contenido de dicha revista es variado de acuerdo a la región geográfica del planeta, desde consejos de como ahorrar dinero en tiempos de crisis, salud, medio ambiente hasta las primeras civilizaciones en el mundo.

Como mayoritariamente todo tiene un interés en la vida, la revista perteneciente a los Testigos de Jehová, la cual para ganar más adeptos, sabe publicar artículos con contenido científico, lo cual es muy interesante ya que se presentan temas interesantes relacionados con las propiedades anatómicas o químicas de la naturaleza (animales, plantas).

El punto se vuelve peligroso cuando dichas propiedades (muy interesantes y de grandiosa utilidad se las implementa en la civilización) se las atribuye al diseño inteligente, cuando se confunde ciencia con pseudociencia. Definamos que es Diseño Inteligente y Pseudociencia.

Diseño Inteligente: Es la forma que tienen para justificar los pro-religiosos que la evolución del hombre y las especies son atribuidas a un Creador, y que nada es casualidad en sus estructuras anatómicas.

Empezó a cobrar fuerza cuando las religiones descendientes del judaísmo, todas monoteístas, lo tomaron como argumento teológico para la justificación de la existencia de Dios.

Pseudociencia: Es una creencia que a pesar de parecer científica no se basa en un método científico válido o no es fiable de verificar. Suele caracterizarse por el uso de afirmaciones exageradas, vagas o de imposible verificación.

El término pseudociencia se suele considerar como inherentemente negativo, ya que sugiere que algo está siendo incorrectamente presentado como ciencia, quizá incluso de forma intencionada.[2]

Para no alargar el asunto con definiciones y más mi punto es que al publicar temas interesantes científicos la revista ¡Despertad! al final de dicho tema lo atribuye totalmente al diseño inteligente, siendo esto un acto de pseudociencia, lo cual es un engaño ya que las personas que no hayan tenido contacto en primera instancia con la ciencia o por lo menos el método científico, su mente se vuelve fácil de moldear y empezará a atribuir toda explicación o descubrimiento científico al diseño  inteligente, siendo su capacidad  de raciocinio mermada.

Como conclusión final puedo decir que la revista no es mala cuando toca temas científicos, pero no hay que dejarse engañar con la pseudociencia de fondo, Hay que tener un criterio científico formado o las bases para que no resulte peligrosa.

Nota Del Autor: Es una opinión netamente personal, no es mi intención ofender a la gente que tiene creencias religiosas, las respeto pero no las comparto, y esta entrada solo es una opinión sobre algo que considero importante, no tiene porque sentirse obligado estimado lector a compartirla, si lo hace perfecto sino, respeto su opinión.

Lord Istvath