lunes, 28 de octubre de 2013

Downloading an Entire Web Site with wget



If you ever need to download an entire Web site, perhaps for off-line viewing, wget can do the job—for example:

$ wget \
     --recursive \
     --no-clobber \
     --page-requisites \
     --html-extension \
     --convert-links \
     --restrict-file-names=windows \
     --domains website.org \
     --no-parent \
         www.website.org/tutorials/html/





This command downloads the Web site www.website.org/tutorials/html/.

The options are:

--recursive: download the entire Web site.

--domains website.org: don't follow links outside website.org.

--no-parent: don't follow links outside the directory tutorials/html/.

--page-requisites: get all the elements that compose the page (images, CSS and so on).

--html-extension: save files with the .html extension.

--convert-links: convert links so that they work locally, off-line.

--restrict-file-names=windows: modify filenames so that they will work in Windows as well.

--no-clobber: don't overwrite any existing files (used in case the download is interrupted and
resumed).


source: http://www.linuxjournal.com/content/downloading-entire-web-site-wget

lunes, 21 de octubre de 2013

Instalar Python, NumPy, SciPy y matplotlib en Mac OS X con dobleclicks


En este post esta como instalar Python, NUmPy, SciPy y matplot en Lion, pero incluye muchas lineas de comando y modificar tu .bash_profile y tratando con problemas de compiladores y demas. Eso es lo que se llama generalmente compilarlo por ti mismo (CIY method). La forma mas sencilla, es un metodo que generalmente se llama el metodo del doble click, o sea, que todo se hace con clicks.

El metodo CIY se usa mas para usuarios avanzados, que quieran tener una instalacion muy personalizada.

Hasta hace poco el metodo CIY era la unica forma de tener todo funcionando en Lion, pero los programadores de NumPy, SciPy, and matplotlib han hecho un DMG para hacer el proceso mucho mas sencillo. Una vez que conoces Python, se van a ver en la necesidad de instalar otros paquetes, yo les sugiero pip.

Instalar Python

Vas a la pagina de Python y descargas el paquete llamado Python 2.7.2 Mac OS X 64-bit/32-bit x86-64/i386 Installer. Double-click al archivo dmg descargado para instalarlo.

Instalar NumPy

Vas a la pagina NumPy y descargas el paquete denominado numpy-1.6.1-py2.7-python.org-macosx10.6.dmg. Double-click al archivo dmg descargado para instalarlo. 

Instalar SciPy

Vas a la pagina SciPy y descargas el paquete denominado scipy-0.10.1-py2.7-python.org-macosx10.6.dmg. Double-click al archivo dmg descargado para instalarlo. 

Install matplotlib

Vas a la pagina matplotlib y descargas el paquete denominado matplotlib-1.2.0-py2.7-python.org-macosx10.6.dmg.Double-click al archivo dmg descargado para instalarlo. Felicidades! Ya debe estar funcionado. Cuando queiras actualizarlos, visita a la pagina y descargate la ultima version de esos archivos. Probemos en una terminal con Python a ver si funciona.

import numpy
import scipy
import matplotlib
Las instrucciones pueden tener ya un tiempo, si no le funciona chequee en  “Install Python” los nuevos terminos.

fuente: http://penandpants.com/2012/03/01/install-python-2/

lunes, 14 de octubre de 2013

Razonamiento del sentido Comun (Reasoning Common Sense)


Unas observaciones, de la excelente presentacion de CYC en Google Tech 2006 denominada 
"Computers versus Common Sense".

enlace http://www.youtube.com/watch?v=gAtn-4fhuWA 


La conferencia fue hecha en el 2006, por lo cual hay puntos señalados que no tienen validez en la actualidad, como que Google no te da respuestas concretas a algunas de tus pregunta. Ya que actualmente, pones en Google “President of Cuba” y Google te muestra una tarjeta con el nombre del presidente de Cuba.
Otro punto es que, según el ejemplo que dio del perro y la madre, que dice:

El perro de mi mama murió.

Y el programa le preguntó: háblame mas sobre su madre; porque era lo único que sabía.
Pues la razón que pase eso, a mi manera de ver, es que, el programa que recibe la pregunta, si desconoce un concepto, debería preguntárselo al usuario y así, el programa tener el concepto del usuario. Y poder inferir conocimiento.
Por ejemplo:
Si el software no sabe que es dog, el preguntaría:
Perdóname, no se lo que es dog.¿Me podrías definirlo?

De esa manera podría crear definiciones de cosas con los usuarios, uno a uno y de esa manera para un usuario tendrías una definición, sin embargo podrías usar esa misma definición para la definición general, cogiendo lo común que cada uno dice o al menos la unión. O podría ser como un nCaptcha. De esa manera estamos enseñando a las maquinas hacer y saber las cosas.
Dicho lo anterior, el principal problema parece venir de que no se sabe trabajar con lo desconocido, y eso es lo que la maquina debe saber preguntar. Como saber sobre lo desconocido.
Si usas un sistema estático, creo que resultaría sencillo, porque al final, si tienes el conocimiento representado con un numero finito de propiedades, pp1, pp2, ... ,ppN, entonces las preguntas serian de acuerdo a esas propiedades. Digo sistema estático a un sistema donde la cantidad de propiedades que se trabajan son fijas y son las mismas.
Por ejemplo:

Dime la descripción, dime el nombre, etc.


Todas estas preguntas es sobre lo desconocido. Como es estático, se podría hacer un estudio mas detallado de cuales propiedades depende una de otras, cuales preguntar primero, etc.

Ahora si se trabaja con un sistema dinámico, o sea, que la cantidad de propiedades no es fija, sino que ira variando. Entonces se debería preguntar por las mas frecuentes, por las propiedades que aparezcan en todos los objetos, o por lo menos en los que mas, y así de alguna manera puedes terminar clasificándolo en una categoría. Por ejemplo:
Una clase podría ser los objetos que tienen descripción, en este sentido todo lo que existe en el mundo tiene una descripción, una definición y un nombre, a eso se le denomina objeto, ahora si además de eso tiene una propiedad tamaño, entonces se puede decir que es medible, y de la propiedad tamaño debería existir un conjunto de reglas que podamos inferir solo desde esa propiedad. La idea aquí, es que dada una propiedad se infiera todo el conocimiento de ella independiente del objeto (como si fueran estructuras algebraicas). De esa manera, si el usuario especifica que ese concepto tiene esa propiedad, ya puedes inferir conocimiento.

¿Que mas pasa la propiedad tamaño? Es que tamaño puede ser que se modifique, puede ser fija, puede cambiar en la instancia o puede tener varios tamaños. Luego se irán haciendo clustering, de acuerdo a sus propiedades sin valores (a su clase). Pero la clase también se puede definir por instancias, por ejemplo:

Tengo clase persona. Y la instancia de la edad es menor que 15 años se considera un niño y no un adolescente. Entonces ahí se tiene una clase niño que depende de los valores de la instancia. Pero creo que esta forma de clasificar (por valores de instancias) seria el ultimo a tomar en cuenta.
Se empieza hablar sobre las construcciones de las base de datos y los errores que tienen la gente a introducir datos, es verdad, que a la hora de concebir el modelo debería concebirse la semántica, como se expone en el video, si esta la fecha de contratación y esta la fecha de nacimiento, es real que debería haber entre ellos una diferencia de al menos 18 años (edad a la cual se permite trabajar) , para así evitar errores. La idea principal es que deberían haber relaciones verificables entre los datos como la expuesta anteriormente. Pero si algo no cumple con el patrón (la edad es menor que 18 años) también debería poder agregarse, pero con el objetivo de que sea como excepción warning de la regla, ya que, podría darse que alguien muy talentoso que tuviera solo 15 años y pudiera trabajar en la empresa, sin embargo podría ser también un error, entonces el usuario que entra los datos, se le avisa que algo parece no estar bien, en este caso la fecha de nacimiento con la fecha en que empezó a trabajar, si el operador decide insertar los datos igualmente, este dato pasaría a tener un warning diciendo que es una excepción de la regla.

Se habla también del completamiento de contenido por el conocimiento, como el ejemplo del niño y la mama. Creo q seria incorrecto ese completamiento. Ya que podría tener otra interpretación diferente a la “que se cree que será el sentido comun”. Porque lo que significa evidente para ti, no tiene porque ser claro para mi. Los ejemplos que pone son muy sencillos, y al parecer, la única respuesta es esa, pero puede ser que no. Que después de tanto conocimiento la respuesta sea mucho mas completa y compleja. Y no resultaría evidente.(18:10)

Se habla también del completamiento de información de las base de datos, lo mismo que hicieron con lo de rellenar o ver si tenia datos inválidos.

Algunas de las estrategias es que Cycs tiene muchas micro definiciones.
Se habla también que la cantidad de conceptos no es muy importante, principalmente porque hay algunas definiciones (pocas), que abarcan mucho conocimiento, que funcionan como axiomas (34:36).
Hay una regla que creo que se asume muy bien, que dice: “Si dos objetos no se sabe su relación taxonómica entonces se consideran disjuntos”. Porque al final una clase puede ser tan especifica como se quiera, se habla de clases y de instancias de clases pero al final son lo mismo, lo que las clases son instancias sin valores. (video en 35:30)
Si existen dos clases que no se conocen (dos taxones, dos ramas de la taxonomía), entonces se asume que son disjuntas. Y en realidad lo son, porque en su nivel de especificidad se hacen diferentes. Pero que pasa si una es una instancia de la otra.? No pasa nada porque también se puede ver como subconjunto pero también como diferentes grupos como lo son clases y lo son las instancias.
Open CYC es una ontología abierta. Y podemos usarla tanto para investigación como para comercialización.

Estas son unas notas, perdonen si no todas las ideas estan muy esclarecidas y si el cambio de las mismas sea muy brusco.

miércoles, 2 de octubre de 2013

Una forma rapida de dar semantica a tu web

RDF (Resource Description Framework) es la forma de dar semantica a tu pagina. Con RDF se puede describir cualquier concepto, relacion o objeto del universo.

Hay tres cosas principales en las que se basa RDF, sujeto, predicado y objeto.

Sujeto: Es lo que se quiere describir.
Predicado: Generalmente se refiera a un atributo de lo que estas describiendo.
Objeto: Es lo que estas referenciando con el Predicado.

Jorge le gustan las manzanas.

Jorge - es el sujeto, lo que se esta describiendo
le gustan - es el predicado un atributo de Mauricio
las manzanas: es el objeto al cual se le aplica el predicado

Usando esta simple idea podemos definir cualquier cosa.

RDF usa URI (es igual que URL pero en vez de ser una local, la URI referencia a un recurso, de facto, una URL es un tipo de URI) para especificar sujetos y predicados.

Un ejemplo de URI:

http://www.ejemplo.org/uris/largas/son/muy/pesadas/de/escribir


Como podemos ver que las URI son muy largas, y pueden ser muy pesadas, por eso en RDF hay las CURI (Compacta URI). CURI es la forma de escribir mas corto la URI.

un ejemplo de una CURI es:

 foaf:name

http://xmlns.com/foaf/0.1/name

Como podemos ver foaf:name es la abreviación de la uri http://xmlns.com/foaf/0.1/name , donde foaf  equivale a http://xmlns.com/foaf/0.1/ y lo que viene despues, en este caso, name, equivale a agregar a la URI, en este caso name.

Ahora no debemos preocuparnos que significa esa URI, ya que despues lo explicare.

RDF es un concepto no es una syntaxis, entonces debemos aprender a como escribir afirmaciones.

Recordemos que en RDF todo es SUJETO, PREDICADO, OBJETO.

Una afirmacion en RDF es una tripleta, si cojemos el ejemplo anterior, podemos darnos cuenta que hicimos una afirmacion en forma de tripleta. Entonces en RDF lo escribir de la siguiente manera:

@prefix pref: <http://ejemplo.org/vocabulary#> .
<#jorge> pref:gustan <#manzanas> .

El "@prefix" nos especifica quien va ser nuestra CURI pref que en este caso es <http://ejemplo.org/vocabulary#> . En la siguiente linea esta definida la tripleta, empezando con el sujeto <#jorge> , los signos de mayor y menor es para especificar que es una URI. El predicado es pref:gustan, que es tambien una URI y el objeto es <#manzanas> que tambien es una URI. Y al final de la tripleta hay un punto para indicar el final de la afirmacion. Pueden escribir cuantas tripletas quieran, mientras mas tripletas haya con un sujeto, mas informacion hay de ese sujeto.

Si nos fijamos pref apunta a algo que dice vocabulary, en español, vocabulario.
Un vocabulario, define que es lo que una tripleta realmente significa. Sin un vocabulario, la tripleta no tendria un concepto global para todos. Un famoso vocabulario se llama Friend of a Friend, también conocido como foaf.  (Si esto no queda claro, siga leyendo entendera mejor con el ejemplo)

foaf tiene muchas relaciones entre personas definidas y tiene muchos conceptos para definir personas. foaf sera el primer vocabulario que vamos a usar en este articulo.

Usando foaf es muy facil describir personas en la Web, todo lo que se necesita es una URI que hable sobre una persona y un URI para usar el predicado que nos convenga. Vamos hacer un ejemplo, especificando que Jorge es una persona y el nombre completo de Jorge.

Lo primero que vamos hacer es especificar que vamos a usar el vocabulario foaf . En nuestro HTML, hacemos esto usando nuestro atributo xmlns . Y lo especificamos de la siguiente manera xmlns:foaf="http://xmlns.com/foaf/0.1".

Tambien vamos a necesitar dos atributos RDF, about property . El primer atributo es about y se usa para especificar el sujeto. De la siguiente forma about="#jorge". El segundo atributo es property y se usa para especificar el predicado. De la siguiente manera property="foaf:name". Finalmente para asignar el valor, nosotros lo ponemos entre las etiquetas que tienen esos atributos. A seguir pongo el ejemplo completo:

<body xmlns:foaf="http://xmlns.com/foaf/0.1">
    <span   about="#jorge" property="foaf:name">
    Jorge McDreaming 
    </span>
<body>


Si ahora quisieran cambiar el nombre completo en iniciales JM no hay que cambiar nada, solamente la entrada del nombre y los datos estarian actualizados.
En tripleta seria

@prefix foaf: <http://xmlns.com/foaf/0.1> .
<#jorge> foaf:name "Jorge McDreaming" .

Pero tenemos que definir que Jorge es una persona, para eso debemos agregar typeof="foaf:Person" . type sirve para especificar un tipo, un tipo es la clase que debe pertenecer el sujeto, que es una relacion especial del sujeto. El tipo que estamos especificando en este caso es Persona.

<body xmlns:foaf="http://xmlns.com/foaf/0.1">
    <span   about="#jorge" property="foaf:name" typeof="foaf:Person">
    Jorge McDreaming 
    </span>
<body>

Ahora queremos definir una relacion entre esas dos personas. La relacion sera conoce, queremos especificar que Jorge conoce a Sheldon. Primero mostraremos como quedaran las afirmaciones que Jorge y Sheldon son personas.


<body xmlns:foaf="http://xmlns.com/foaf/0.1">

    <span   about="#jorge" property="foaf:name" typeof="foaf:Person">
    Jorge McDreaming 
    </span>

    <span   about="#sheldon" property="foaf:name" typeof="foaf:Person">
    Sheldon Cooper 
    </span>

<body>

Finalmente para espcificar que Jorge y Sheldon son amigos, usamos el atributo rel y el atributo resource. Tambien usamos un vocabulario que tiene foaf que es knows conocer. Luego quedaria especificado todo de la siguiente manera:

<body xmlns:foaf="http://xmlns.com/foaf/0.1">

    <span   about="#jorge" property="foaf:name" typeof="foaf:Person">
    Jorge McDreaming 
    </span>

    <span   about="#sheldon" property="foaf:name" typeof="foaf:Person">
    Sheldon Cooper 
    </span>
    
    <span about="#jorge" rel="foaf:knows" resource="#sheldon">
    Jorge conoce a Sheldon
    </span>   

<body>

Con esto ya tenemos las ideas basicas y podemos crear cualquier semantica compleja.

Asi es como una web semantica es construida, una tripleta atras de otra. Una tripleta relacionado con otra y asi.