Wednesday, April 30, 2014

Presentación de Defensa de tesis (Boceto)

Evidencia de la semana:
  • Avance en código o análisis.
  • Redacción de una presentación, la cual es una guía para la defensa de tesis

Tesis

El avance principal para esta entrega es la redacción de una presentación acomodando el trabajo hecho hasta ahora en un conjunto de diapositivos para después ser recicladas para la defensa de tesis. La presentación fue dividida de acuerdo a los principales capítulos de la tesis; previo a esto se agregó contenido y se reescribieron párrafos, esto con el fin de poder presentar de una manera más clara la presentación.

Aquí el primer boceto de la presentación:


Para esta semana también se trabajo en lo siguiente:
  • Corrección de errores de ortografía y puntuación.
  • Se agregaron más notas rojas para indicar el contenido que falta y su porqué.
  • Se agregaron más notas de pie de página.
  • Se modificó el contenido del capítulo de "Antecedentes".
  • Versión preliminar de capítulo "Metodología".
  • Se corrigió la bibliografía.

Código o análisis

El avance en esta semana consistió en avanzar el diseño y sobre todo la parte backend de la herramienta,  se terminó la función para llenar la tablas mediante llamada ajax, se mejoró la manera en que se despliega la información en la tabla, se agregó un nuevo modelo en la base de datos que es el que contiene la información de los resultados, se trabajó con la función que agrega el resultado a la base de datos, el home ahora ya tiene todos los campos que el usuario tiene que llenar y el cálculo principal se modificó en cuanto a cómo estaba acomodado, ahora tiene solo se hace en dos funciones pero es más corto en código.


Un error que tengo que solucionar es que en la tabla se muestran repetidos los materiales que se van agregando.

Algo más en lo que se trabajé es en la parte de análisis de datos; la herramienta ya cuenta con funciones para esto, lo que sigue faltando es la interpretación de patrones, pero ahora el proceso se realiza utilizando las librerías NumPy y Pandas. Esto se hizo porque son dos librerías que facilitan el manejo y transformación de datos en base de datos de acuerdo al libro "Python for Data Analysis", por ejemplo ahora el detectar anomalías basta ejecutar lo siguiente:

import numpy as np
from pandas import DataFrame, Series
np.random.seed(12345)
data = DataFrame(np.random.randn(1000, 4))
col = data[3]
col[np.abs(col) > 3]

Avance siguiente entrega

  • Terminar de corregir la bibliografía.
  • Versión preliminar de capítulo "Solución Propuesta".
  • Versión preliminar de capítulo "Experimentos".
  • Terminar la interpretación de patrones.

Thursday, April 10, 2014

10 fragmentos de código de .htaccess útiles

Un archivo .htaccess (hypertext access), también conocido como archivo de configuración distribuida, es un archivo utilizado por los servidores Apache que permite modificar distintos aspectos del sitio web sin necesidad de editar el archivo de configuración principal de Apache.

A continuación 10 fragmentos de código de .htaccess compilados por catswhocode. Antes de comenzar a editar el archivo recuerda realizar un respaldo de tu archivo .htaccess original.

Agregar o remover www de la URL

Por motivos de SEO, quizás siempre necesitas remover o usar el prefijo www en tu URL. El siguiente fragmento de código remueve el www de tu url y redirigiéndolo a cualquier url con el prefijo www o a la versión sin www. Sólo modifica las líneas 2 y 3 con la url de tu sitio.

Remover www
RewriteEngine On
RewriteCond %{HTTP_HOST} !^tu-sitio.com$ [NC]
RewriteRule ^(.*)$ http://tu-sitio.com/$1 [L,R=301]

Agregar www
RewriteEngine On
RewriteCond %{HTTP_HOST} ^tu-sitio.com [NC]
RewriteRule ^(.*)$ http://www.tu-sitio.com/$1 [L,R=301]

Fuente: http://css-tricks.com/snippets/htaccess/www-no-www/

Prevenir el hotlinking

Hotlinking es una mala práctica que consiste en usar imágenes en tu sitio web que se encuentran en otro sitio web. Cuando alguien hace hotlinking de alguna imagen en tu sitio, utiliza tu ancho de banda lo cual es un beneficio para ese alguien. Para prevenir esto sólo agrega el siguiente fragmento de código a tu .htaccess después de reemplazar las urls que vienen de ejemplo por tus url. Recuerda modificar la línea 3 con la url de tu sitio y la línea 6 con la ruta a la imagen que no tendrá hotlink.

RewriteEngine On
#reemplaza ?misitio\.com/ con la url de tu blog
RewriteCond %{HTTP_REFERER} !^http://(.+\.)?misitio\.com/ [NC]
RewriteCond %{HTTP_REFERER} !^$
#reemplaza /images/nohotlink.jpg con la ruta a la imagen que no tendra "hotlink"
RewriteRule .*\.(jpe?g|gif|bmp|png)$ /images/nohotlink.jpg [L]

Redireccionar los feeds de WordPress a Feedburner

Feedburner es un servicio web que te permite saber cuántas personas han leído tu blog vía feeds. Si utilizas WordPress, lo que debes hacer es redirigir todos los feeds de WordPress (rss, atom, etc) a tu Feedburner. En el siguiente fragmento de código reemplaza las líneas 2 y 3 con los datos de tu feedburner, y después colócalo en tu archivo .htaccess.

 RedirectMatch 301 /feed/(atom|rdf|rss|rss2)/?$ http://feedburner.com/yourfeed/
 RedirectMatch 301 /comments/feed/(atom|rdf|rss|rss2)/?$ http://feedburner.com/yourfeed/

Si estás cansado de las mismas páginas de error viejas y aburridas de tu sitio web, puedes crear algunos archivos html con el diseño que desees, súbelas a tu servidor y añade lo siguiente a tu archivo .htaccess modificando la ruta a cada página personalizada:

ErrorDocument 400 /errors/badrequest.html
ErrorDocument 401 /errors/authreqd.html
ErrorDocument 403 /errors/forbid.html
ErrorDocument 404 /errors/notfound.html
ErrorDocument 500 /errors/serverr.html

Fuente: http://css-tricks.com/snippets/htaccess/custom-error-pages/

Forzar la descarga de archivos específicos

Cuando en tu sitio tienes archivos mp3s, eps, xls, etc. para ser descargados, se puede forzar a que se descarguen en vez de dejar que el navegador decida que hacer.

El siguiente fragmento de código forzará la descarga de archivos .xls y .eps (el * significa que coincida con cualquier nombre de archivo, seguido de la extensión del archivo) en la ruta indicada así como sus subdirectorios.

<files xls="">
  ForceType application/octet-stream
  Header set Content-Disposition attachment
</files>
</files eps="">
  ForceType application/octet-stream
  Header set Content-Disposition attachment
<files>

Fuente: http://www.givegoodweb.com/post/30/forcing-a-download-with-apache-and-htaccess

Crea un registro de errores PHP

El siguiente fragmento de código proporciona una manera de registrar errores de archivos PHP en un archivo de registro de errores y además previene mostrarle estos errores al usuario. Sólo crea un archivo php_error.log en tu servidor, modifica la línea número 7 del fragmento que es la ruta al archivo creado (php_error.log) y añadelo a tu archivo .htaccess.

# no muestra errores a usuarios
php_flag display_startup_errors off
php_flag display_errors off
php_flag html_errors off
# registro a archivo
php_flag log_errors on
php_value error_log /ruta/a/php_error.log

Fuentehttp://css-tricks.com/snippets/htaccess/php-error-logging/

Retirar las extensiones de archivo de urls

Las extensiones de archivos pueden ser útiles para los desarrolladores, pero no hay necesidad de que los usuarios de tu sitio web las vean (además puede mejorar o acortar las url). El siguiente fragmento de código retira las extensiones .html de cualquier archivo html, pero puede ser fácilmente adaptado para retirar cualquier extensión.

RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}\.html -f
RewriteRule ^(.*)$ $1.html
# reemplazaa html con otra extension, ej: eg: php, htm, asp

Si quieres agregar un diagonal ("/") al final de la url sin la extensión del archivo agrega el siguiente fragmento después del fragmento anterior.

# anade un diagonal al final
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} !(\.[a-zA-Z0-9]{1,5}|/)$
RewriteRule (.*)$ /$1/ [R=301,L]

Fuentehttp://eisabainyo.net/weblog/2007/08/19/removing-file-extension-via-htaccess/

Evitar listado de directorios

En tu sitio web cuando una carpeta no tiene un archivo "index", Apache automáticamente despliega un listado con todos los archivos en la carpeta accesada. Si lo que no quieres es que todos vean los archivos que están en tu servidor, solo añade la siguiente línea a tu archivo .htaccess.

Options -Indexes

Reducir peso de las páginas comprimiendo información estática

¿Sabías que es posible enviar información comprimida a los visitantes de tu sitio, y que será descomprimida por el cliente? Este fragmento de código te ahorrará (y a tus visitantes también) ancho de banda y reducirá el peso de las páginas.

AddOutputFilterByType DEFLATE text/html text/plain text/xml application/xml application/xhtml+xml text/javascript text/css application/x-javascript
BrowserMatch ^Mozilla/4 gzip-only-text/html
BrowserMatch ^Mozilla/4.0[678] no-gzip
BrowserMatch bMSIE !no-gzip !gzip-only-text/html

Añadir automáticamente charset utf-8 a los archivos

Para prevenir problemas de codificación, puedes forzar a utilizar una codificación específica desde tu archivo .htaccess. De esta manera te asegurarás que tus archivos html se desplieguen con su charset correcto aunque olvides colocar la etiqueta <meta http-equiv="Content-Type"> directamente en tus archivos html.

<FilesMatch "\.(htm|html|css|js)$">
AddDefaultCharset UTF-8
</FilesMatch>

Wednesday, April 9, 2014

Conclusiones y trabajo a futuro.

Evidencia de la semana:

  • El avance en código o análisis.
  • El avance de ésta semana en redacción de tesis consiste en redactar una versión preliminar del capítulo de conclusiones.

Tesis

El avance principal de esta semana fue redactar una versión preliminar del capítulo de conclusiones, en el que se resume toda la tesis, se habla de las contribuciones que realicé en dicho trabajo y al final una discusión de los resultados experimentales; para esta semana también se trabajó en lo siguiente:
  • Se corrigieron errores de ortografía y redacción.
  • Se corrigieron algunas citas en la bibliografía.
  • Se agregaron notas en color rojo en algunos capitulos para indicar lo que hace falta agregar.
  • Se corrigió capítulo de antecendentes.
  • Se agregaron notas de pie de página.

Código

El avance en esta semana consistió en avanzar el diseño y sobre todo la parte de jquery de la herramienta, se agregaron funciones para obtener los materiales de manera dinámica, se decidió utilizar una navegación vertical y se comenzó a trabajar con las funciones para llenar las tablas mediante llamadas ajax.

Otra parte del avance se concentró en desarrollar la parte de análisis de agrupamiento o segmentación (clustering) en la parte de minería de datos, este avance aún no se ha terminado en cuanto a código. El avance en un principio se iba a realizar en la clasificación de patrones pero continuando con la lectura en minería de datos entendí que después de establecer relaciones y reglas en los datos, lo siguiente es el agrupamiento; con lo cual se obtienen grupos y estructuras en los datos que de cierta manera son similares.

El análisis de agrupamiento consiste en agrupar un conjunto de datos de tal manera que los objetos en el mismo grupo (cluster) son más similares entre sí que a las de otros grupos. El agrupamiento depende del tipo de segmentación que se quiera realizar. Dentro de las técnicas de clustering los algoritmos más usados podrían ser:
  • K-means
  • Kohonen
  • Redes Bayesianas
Para mi análisis de datos escogí el algoritmo K-means, el cual es un algoritmo que busca similitudes y diferencias entre los individuos pertenecientes a un dataset, la búsqueda la realiza de acuerdo a la distancia que hay entre uno y otro (generalmente se usa la distancia euclidiana). El objetivo de este algoritmo es encontrar los individuos mas parecidos entre si (de cierto modo los podemos llamar cercanos) y a la vez separarlos de aquellos diferentes a los mismos. Es decir el algoritmo a agrupa individuos que se parecen mucho y los separa de los otros grupos que a su vez se parecen mucho entre si pero son distintos de los otros grupos.

Este es el avance que tengo al momento.
import numpy as np

def converged(minimum, centroids):
    return ( set( [ tuple(a) for a in minimum ] ) == set( [ tuple(a) for a in centroids ] ) )


def cluster_points(X, minimum):
    clusters  = {}
    for x in X:
        best_key = min( [ ( i[0], np.linalg.norm( x - minimum[ i[0] ] ) ) \
                    for i in enumerate( minimum ) ], key=lambda t:t[1] )[0]
        try:
            clusters[best_key].append(x)
        except KeyError:
            clusters[best_key] = [x]
    return clusters

 
def reevaluate_centers(minimum, clusters):
    new_minimum = []
    keys = sorted(clusters.keys())
    for k in keys:
        new_minimum.append(np.mean(clusters[k], axis = 0))
    return new_minimum

 
def find_centers(X, K):
    centroids = random.sample(X, K)
    minimum = random.sample(X, K)
    while not converged(minimum, centroids):
        centroids = minimum
        
        clusters = cluster_points(X, minimum)

        minimum = reevaluate_centers(centroids, clusters)
    return(minimum, clusters)

Avances siguiente entrega


  • Terminar el diseño de experimentos en la redacción y la solución propuesta.
  • Terminar implementación de algoritmo K-means.
  • Avance en código de clasificación por categorías de los datos.


Monday, April 7, 2014

Cómo agregar Syntax Highlighter a Blogger

Si eres un blogger/desarrollador entonces tienes la necesidad de mostrar algunos segmentos de código o scripts como parte de tus entradas (posts) cuando estás escribiendo un tutorial, algún consejo o un hack. Lo que es importante para mostrar estos segmentos de código es que se encuentres en una parte resaltada, con colores, números de línea, que respete la sintaxis, etc; cuando se trata de Blogger, hace falta un plugin o widget para hacer esto posible. Por lo tanto, aquí, en este tutorial mostraré cómo añadir un resaltador de sintaxis (Syntax Highlighter) a blogger para dar a nuestros segmentos de código un aspecto nuevo y elegante.

Cómo agregar Syntax Highlighter a Blogger

Para hacer esto vamos a utilizar un resaltador de código llamado Syntax Highlighter, desarrollador por Alex Gorbachov, que es un resaltador comúnmente utilizado en sitios web y blogs. 

Aquí los pasos para agregar Syntax Highlighter a Blogger:

Añadir los scripts.

  • Copia las siguientes líneas.
     
     
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    

  • Accede a Blogger con tus credenciales.
  • Selecciona tu blog y navega a la sección de Plantillas
  • En la sección de Plantillas, haz clic en Edición de HTML.
  • Haz clic en un área en el editor y pulsa Ctrl + F para abrir el cuadro de búsqueda. 
  • Busque la etiqueta  </ head>
  • Pega las anteriores líneas de código justo por encima de la etiqueta </ head> y haz clic en el botón Guardar plantilla.

Resaltar código

Ya añadimos Syntax Highlighter a la plantilla, pero para que los segmentos de código se resalten tenemos que envolver el segmente por la etiqueta <pre> con un atributo especial para definir qué lenguaje estamos utilizando. Para eso hay que hacer lo siguiente:
  • Para agregar un segmento de código, hay que agregar colocar el código dentro de un par de etiquetas <pre> </pre> en el modo HTML del editor de entradas.



  • Obtendremos el siguiente resultado
  • print "hola mundo"
Saludos.

Saturday, April 5, 2014

Instalación de paquetes extra de LaTeX en Linux

Si deseas instalar un paquete TeX que no está en los repositorios que se instalan con LaTeX, echa un vistazo a la página web de CTAN o al Catálogo Online TeX (TeX Catalogue Online).

Descarga el paquete, abre la terminal y extraelo manualmente o con esta instrucción:
foo.tar.gz. tar-xvf

Accede a la carpeta, dentro de la carpeta debe estar un archivo foo.ins y ejecútalo usando LaTeX con la siguiente instrucción:
latex foo.ins

Esta instrucción genera un archivo foo.sty. Ahora tienes que crear una carpeta con el mismo nombre del archivo .sty en la ruta de LaTeX del sistema:
sudo mkdir /usr/local/share/texmf/foo

Después tienes que copiar el archivo .ins a esta carpeta que creaste:
sudo cp /ruta/al/archivo/foo.sty /usr/local/share/texmf/foo 

Por último tienes que actualizar la caché de paquetes LaTeX:
sudo texhash

Saludos.

Wednesday, April 2, 2014

Análisis de experimentos

Evidencia de para esta semana:
  • El avance de la redacción de tesis consistió en colocar gráficas que representan los resultados del análsis de experimentos.
  • Avance de esta semana en código.

Tesis

Para esta semana:
  • Se corrigieron errores de ortografía y redacción.
  • Se complementaron la sección "Agradecimientos".
  • Se corrigieron algunas citas en la bibliografía.
  • Se modificaron tablas en la sección "Resultados".
  • Se complementó la redacción del capítulo de "Resultados" agregando información sobre cómo se analiza cada figura y cuadro en dicha seción.

Avance de código

El avance en esta semana se concentró en corregir las llamadas AJAX porque no siempre funcionaban, esto debido a que tenía mal colocado un archivo javascript y me faltaba colocar unas llamadas a funciones de Dajax, también se agregaron lightboxes utilizando la librería javascript "nivo-lightbox", esto para minimizar el espacio del formulario y ocupar el menor espacio posible.

Además dentro de los lightboxes se colocaron tablas para ahí colocar los materiales utilizados en cada muro de la construcción, esto se hizo con la librería javascript "footable", cabe mencionar que esto último aún no está funcional; solo se agregaron las librerías y se hicieron pruebas con ella, para la próxima entrega estará implementado.

Por último, otro avance consistió en implementar un análisis de patrones de información mediante patrones secuenciales (Sequential Pattern mining), este tema trata sobre la búsqueda de patrones estadísticamente relevantes en los datos proporcionados de manera secuencial. En específico se utilizó el algoritmo Apriori, elcual permite la asociación y aprendizaje sobre las bases de datos transaccionales. 

Este algoritmo identifica los elementos frecuentes en la base de datos. Los conjuntos de los elementos frecuentes pueden ser utilizados para determinar reglas de asociación, las cuales permiten conocer las tendencias generales en la base de datos.

El código de este algoritmo aún no está implementado en la aplicación, para hacer pruebas se utilizó un dataset libre, el cual fue descargado de nycopendata.



Script corriendo:

En la imagen se puede apreciar como se detectan los elementos más frecuentes y al final se muestran reglas de asosiación entre los elementos.

Avance próxima semana.

  • Implementación de algoritmo Apriori en la aplicación.
  • Clasificación de patrones.