viernes, 22 de abril de 2016

Articulo Científico: Características de Programación Orientada a Objetos

Introducción


En este artículo se mencionaran algunos de los aspectos más fundamentales de la programación moderna/Declarativa, tales como clases, objetos, herencia entre otros que se definirán y explicaran en el artículo, para continuar se definirá lo que se llama Paradigma en su origen significaba un ejemplo ilustrativo, en particular enunciado modelo que mostraba todas las inflexiones de una palabra. En el libro The Structure of Scientific Revolutions, el historiador Thomas Kuhn describía un paradigma como un conjunto de teorías, estándares y métodos que juntos representan un medio de organización del conocimiento: es decir, un medio de visualizar el mundo.
Se mencionó anteriormente la palabra declarativa haciendo referencia a al paradigma Declarativo ya que es este de donde se obtiene los diferentes elementos que contendrá este artículo. El declarativo es un tipo de programación en el cual es programador escribe el algoritmo que resuelve un problema determinado, asease le digo que hacer y cómo hacerlo, de aquí nace el paradigma Orientado a objetos la orientación a objetos puede describirse como el conjunto de disciplinas (ingeniería) que desarrollan y modelizan software que facilitan la construcción de sistemas complejos a partir de componentes.

Palabras clave: Orientada a objetos, clases, herencia, interfaces

  

Clases
Una  clase, es simplemente una abstracción que hacemos de nuestra experiencia sensible. El ser humano tiende a agrupar seres o cosas  -objetos-con características similares en grupos  -clases-. Así, aun cuando existen por ejemplo multitud de vasos diferentes, podemos reconocer un vaso en cuanto lo
Vemos, incluso aun cuando ese modelo concreto de vaso no lo hayamos visto nunca.
(Introducción a la OOP. Versión 1.0. Autor: Francisco Morero)


Una clase  contiene toda la información que se necesita para crear y dar forma a los objetos ya que estos se verán afectados en su comportamiento gracias a las cualidades que su clase contenga, la clase permite encapsular bajo un mismo nombre los métodos y propiedades que serán manipulados en el objeto

 A partir del concepto de clase podemos decir que un objeto es una instancia de una clase, para que se entienda de una mejor manera el concepto, visualice  a la clase como un molde, y al objeto como el resultado de este molde, cada característica que el modelo posea afectara  todo objeto que se cree de esa clase.

Al momento de hablar de comportamiento de un objeto vemos que este concepto está dado por la clase, ya que el hecho que los objetos pertenezcan a una clase , se hace con el objetivo de que tenga un comportamiento similar para el uso de su información.

 




Objeto
Un objeto es una agrupación de código, compuesta de propiedades y métodos, que pueden ser manipulados como una entidad independiente. Las propiedades definen los datos o información del objeto, permitiendo consultar o modificar su estado; mientras que los métodos son las rutinas que definen su comportamiento
(Duarte H. Material para la clase Programación Orientada a Objetos.)

Como se mencionó anteriormente, una clase es era una agrupación de código, es normal que el objeto sea un medio para manejar la información agrupada y esto se logra mediante las propiedades y métodos que su clase le ha impregnado, las propiedades contendrán la información  y los métodos el comportamiento o la forma de hacer ciertas manipulaciones sobre la información.


A pesar que cada objeto es generado de una misma clase base, cada objeto será único, ya que contendrá información distinta a otro objeto, aunque sean de la misma clase, piense en una imagen hecha con cerámica, aunque todas son cerámicas cada una contiene elementos diferentes que hacen una sola imagen al estar juntas.





Herencia
La herencia es una de las características más importantes de la programación actual y del paradigma POO ya que esta cualidad nos permite la reutilización  de código, nos ahorra no solo tiempo sino la depuración de errores, es gracia a este criterio que muchos lo ponen como una característica indispensable en un lenguaje que se haga llamar orientado a objetos, este caso solo mencionare la herencia simple.
(Autor: Francisco Morero)

Este tipo de herencia simple es en la que solo se hereda de una superclase, al heredar, la clase toma directamente el comportamiento de su superclase pero claro esta pude ser derivada de otra y de otra clase, se heredan todas aquellas propiedades y métodos que se permitan, esto se logra gracias a un cierto tipo de palabras reservadas, Private esta palabra india que no se heredará , ya que se puede hacer que solo se hereden ciertas características.

Lo más común al heredar es que se agreguen características nuevas a la clase que está heredando porque si no es así  sería mejor solo implementar la superclase, al heredar se hace lo que se conoce como una sobre escritura de métodos, es muy poco probable que lo que se modifique sean datos.   




Métodos
Los  métodos  describen  el  comportamiento  asociado  a  un  objeto, representan las acciones que pueden realizarse por un objeto o sobre un  objeto,  la  ejecución  de  un  método  puede  conducir  a  cambiar  el estado del objeto o dato local del objeto. en la POO el cuerpo de un método consta de un bloque de código procedimental que ejecuta la acción  requerida,  todos  los  métodos  que  alteran  o  acceden  a  los datos de un objeto se define dentro del objeto, Un método dentro de un objeto se activa  por un mensaje que se envía por otro objeto al objeto que contiene el método
(Duarte H. Material para la clase Programación Orientada a Objetos.)


Se puede entender un método como una sentencia de código que tiene o tendrá un efecto sobre el objeto que se relacione con dicho método, este método tendrá efectos sobre la información que el objeto contenga o sobre el objeto en general
Por lo general estos métodos se necesitan de un parámetro para ejecutarce, cabe mencionar que están los métodos tipo VOID  cuya activación no requiere mensaje o parámetro.

Existen diferentes tipos de métodos:
1.    Inicializadores
2.    Getters
3.    Setters
4.    Constructores
5.    Destructores

Cabe resaltar que el constructor es el más importante de estos métodos, ya que este es el encargado de la inicialización del objeto en cuanto es creado, de ahí el nombre de constructor, él toma cada propiedad del objeto y le da una instancia , también el constructor lleva el mismo nombre de la clase en la que reside.
Los  métodos get y set son utilizados para obtener información de una variable, esto ayuda a ser más natural al momento de programar y le método set es el que modifica el valor de una variable.



Propiedades

Todo objeto puede tener cierto número de propiedades, cada una de las cuales tendrá, a su vez, uno o varios valores. Las propiedades corresponden a las clásicas "variables" de la programación estructurada ya que esta se utiliza en información ya clasificada. Son, por lo tanto, datos encapsulados dentro del objeto, junto con los métodos y las relaciones. Las propiedades de un objeto pueden tener un valor único o pueden contener un conjunto de valores más o menos estructurados (matrices, vectores, listas, etc.).
( Scott M (2006). Programming Languages Pragmatics)


Además, los valores pueden ser de cualquier tipo (numérico, alfabético, u otro variable primitiva.) si el sistema de programación lo permite. Los atributos están asociados a clases y objetos, y describen la clase o el objeto de alguna manera. Las entidades de la vida real están a menudo descritas con palabras que indican características estables. La mayoría de los objetos físicos tienen características tales como forma, peso, color y tipo de material. Las personas tienen características como fecha de nacimiento, padres, nombre y color de los ojos.

Una característica puede verse como una relación binaria entre una clase y cierto dominio. Los atributos describen el estado del objeto. Un atributo consta de  dos partes: un nombre de atributo y un valor de atributo. En la mayoría de los casos, un dominio el posible conjunto de valores que una variable puede llegar a tener.

Las propiedades pueden ser heredadas o propias


Miembros estáticos
Metodos:
Una clase estática es básicamente igual que una clase no estática, pero existe una diferencia: no se pueden crear instancias de una clase estática.  En otras palabras, no puede utilizar la palabra clave new para crear una variable del tipo clase.  
(https://msdn.microsoft.com/es-es/library/79b3xss3.aspx)

Dado que no hay ninguna variable de instancia, el acceso a los miembros de una clase estática se realiza mediante el propio nombre de clase.  Por ejemplo, si cuenta con una clase estática que se denomina MATH dentro del cual esta una función llamada sqrt().

Las clases estáticas son de tipo sellado y, por consiguiente, no pueden heredarse.  No pueden heredar de cualquier clase, excepto Object ya que de esta clase heredan todas las demás clases que creemos por forma automática.  Las clases estáticas no pueden contener un constructor de instancia, recordando que al declarar un método o una propiedad estática esta lo que hace es reservar de forma permanente un espacio en memoria, para poder así almacenar su valor fijo.

  Propiedades:

Las variables estáticas en php es una variable con un dato inicial ya establecido, en php no se puede acceder a este tipo de variables con el operando (->). y su valor es estático (es decir, no puede variar ni ser modificado). Ésta, se define anteponiendo la palabra clave static al nombre de la variable.




                                   
Clases Abstractas
Una clase abstracta es aquella que construimos para derivar de ella otras clases, pero de la que no se puede  instanciar. Por  ejemplo: la clase mamífero, no existe como tal en la naturaleza, no existe ningún ser que sea tan solo  mamífero (no hay ninguna instanciación directa de esa clase), existen humanos, gatos, conejos, etc.
Todos ellos son mamíferos, pero no existe un animal que sea solo mamífero.
(Introducción a la OOP. Versión 1.0.0 – Autor: Francisco Morero)

Las clases abstractas nos permiten jerarquizar de una mejor manera, ya que esta clase nos permite generar métodos generales, para darle forma a proyectos que son modulares y grandes, ya que propagan un comportamiento en común, solo diciendo el nombre y no como hacerlo, por esto es que las clases que lo heredan, están en la obligación de sobrescribir dicho método, ya que el que es de la clase abstracta no tiene “cuerpo” declarado .Si una clases contiene uno o más métodos abstractos está clase debe ser abstracta.

Del mismo modo la clase que se halla al inicio de la jerarquía de clases, normalmente es creada para que contenga aquellos datos y métodos comunes a todas las clases que se le derivan, estas son clases abstractas.  


Como podemos apreciar en esta imagen , la clase caballo sería una clase abstracta, ya que son las demás clases de caballos la que la implementan, usando esto como un formato a seguir , cabe mencionar que las clases que heredan de una clase abstracta están obligados a sobrescribir los métodos que se requieren.



Excepciones
Es un evento que ocurre durante la ejecución de un programa y que interrumpe el flujo normal de operación, es decir en el momento en el que ocurre algo que esta fuera de las manos del programador , como por ejemplo un  error al conectarse a la red y que no haya servicio de internet o algo por el estilo, entre  las que más me han dado problema es la NullPointerException! .


Existen muchos tipos de excepciones, casi una por cada tipo de error, por lo que si tenemos error de entrada/salida de datos, el programa debería de lanzar una excepción de tipo IOException esta se usa de ejemplo ya que es de las más comunes.
Tipos de excepciones:
         Implícitas.
-                                                         Definidas por el lenguaje
  Explícitas.
-                                                         Definidas por el programador

Como manejarlas
·         Debe ser simple de usar y de entender
·         Debe separar el código del tratamiento de excepciones del código normal
·         Implementar un tratamiento uniforme de las excepciones
·         Permitir que las acciones de recuperación sean programadas
Si se desea que la aplicación siga ejecutándose después del error, entonces se usa:
 Try: para poner en alerta al programa sobre el código que puede lanzar una excepción.
 Catch: para capturar y manejar cada excepción que se lance.
 Finally: código que se ejecutará haya o no excepciones.








Conclusiones:
  • Hay muchas características que hacen de la programación orientad a objetos una de las más fuertes en el día de hoy, sin embargo seguirá evolucionando según pase el tiempo y adaptándose a los cambios y necesidades que vayan surgiendo en el camino.

  • La programación orientada a objetos permite la optimización del código generado gracias a que mediante técnicas de herencia, atributos estáticos entre otros permiten, que el código sea genérico de manera que sea reutilizable, ahorrando  el tiempo y errores en el tiempo de compilación.

  • Resolver un problema bajo el paradigma de la programación orientada a objetos implica determinar  una jerarquía  y caracterizar los diferentes objetos que intervienen en el problema, para poder relacionarlos de la forma correcta.




Referencias
Lista de Referencias

[1] Scott M (2006). Programming Languages Pragmatics

[2] https://msdn.microsoft.com/es-es/library/79b3xss3.aspx 
 [3] Aguilar L. J (1996). Conceptos fundamentales de programación orientada a objetos. En J. Domínguez (Ed.) Programación Orientada a Objetos (pp 66 – 111). España: McGraw-Hill.

[4] Schuerer K. , Maufrais C, Letondal C, Deveaud E, & Petit M (2008). Introduction to
Programming using Python Programming Course for Biologists at the Pasteur Institute .Extraído el 15 de Septiembre de 2010 desde 
http://www.pasteur.fr/formation/infobio/python/support.pdf

 [5] Eiffel (programming language). (2010, 25 de agosto). In Wikipedia, The Free Encyclopedia. Recuperado 06:31, agosto 31, 2010 de http://en.wikipedia.org/w/index.php?
title=Eiffel_(programming_language)&oldid=380870822

[6] Duarte H. Material para la clase Programación Orientada a Objetos.

viernes, 19 de febrero de 2016

Sqlmap 



En este video se muestra como realizar una inyeccion sql a una pagina web. Las herramientas que deben de tener para realizar estos ataques son:

  • Una distribucion de linux que tenga integrada sqlmap , en mi caso usare Kali la cual ya lo trae integrado.
  •  Pagina web a la cual se le desea realizar el ataque


Como hacer SQL Injection con SQLMAP-KALI

SQLMAP-KALi

Con esta herramienta podemos probar la seguridad de nuestras Bases de datos y  ver sus vulnerabilidades para poder así mejorarlas, Kali que es una entrega de linux (back track) viene con esta herramienta.

SQL injection es un ataque , que encabeza el TOP 10  de OWASP , ya que es fácil de hacer,  que consta de inyectar directamente comando de SQL para poder obtener datos valiosos,esto se debe a una debilidad o carencia de validación de entradas de datos.

ahora un vídeo, de como hacerlo: 


  

viernes, 29 de enero de 2016

Articulo Cientifico:Sistemas basados en Reglas



SISTEMAS BASADOS EN REGLAS



Resumen
En la actualidad la vida cotidiana, presenta diversos  escenarios  que se rigen bajo una serie de reglas deterministas: transacciones bancarias, sistemas de seguridad, el control de tráfico aéreo. Los sistemas basados en reglas son una de las herramientas proporcionadas por la inteligencia artificial(IA), muy útil para este tipo de problemas, ya que las reglas deterministas  constituyen un procedimiento relativamente sencillo para los sistemas expertos.Tomando en cuenta que una regla se escribe normalmente como “Si premisa, entonces conclusión”, el sistema basados en reglas, podrá tomar decisiones o ayudar en la toma de decisiones según el cumplimiento de las reglas.El artículo contiene fundamentos y definiciones básicas para poder entender de manera  el funcionamiento de un sistema basado en reglas.


Palabras clave:Decisiones, Base de conocimiento, Regla,experto




Sistemas Expertos

El humano desde tiempo atrás ha incursionado en la rama de la inteligencia artificial que es la manera en como un robot puede imitar acciones de las personas,  realizando todo esto mediante sistemas expertos. “El objetivo de los sistemas expertos es emular el razonamiento de un experto (reglas de decisiones, mecanismos cognitivos). Se utiliza por lo tanto como un sistema de apoyo a la toma de decisiones.” (EURODECISION, 2014).Los sistemas expertos fueron usados por primera vez en 1960, en donde se crearon para situaciones determinadas (sistemas de reglas) en mismo años y años más tarde llegaron las situaciones interactivas; Medida de incertidumbre (Medidas difusas) creadas en 1970 y las redes de probabilidad creada entre 1980-90
Las reglas de decisiones es lo que llamamos sistemas basados en reglas. Existen diversas situaciones en donde se utilizan este tipo de sistemas, para poder realizar las reglas es necesario contar con premisas y conclusiones que se pueden obtener mediante el motor de inferencia aplicando la lógica clásica.


Cuerpo

Sistema basado en reglas:
La vida real está basada en hechos y reglas. Hechos son aquellos acontecimientos que pasan en la vida y reglas son normas que ya están establecidas. Los sistemas basados en reglas ayudan a tomar decisiones en momento predeterminados con respuestas previstas, son uno de los tipos de sistemas expertos más sencillos y útiles a la hora de su implementación. Este sistema hace uso de la lógica y de ciertos algoritmos, en donde una situación lleva a utilizar una de las reglas establecidas logrando una respuesta estipulada.
Los sistemas basados en reglas están intervienen hechos y reglas, para tener claro estas dos palabras se pueden identificar por lo siguiente:
Hechos:
·         Se conocen.
·         Pueden cambiar de una situación a otra.
·         Son diferentes
·         Se almacenan en la memoria de trabajo
Reglas:
·         Son normas utilizadas en una situación común
·         Son iguales
·         La información es de naturaleza permanente.
·         Almacenada en la base de conocimiento.
Ejemplo: Notas
Ejemplos de reglas:
·         Regla 1: Si nota > 9, entonces calificación = sobresaliente.
·         Regla 2: Si puesto < 20 o nota > 7, entonces Admitir = sí y Notificar = sí.
Una Reglas puede estas compuestas por una respuesta lógica que este relacionando dos o más objetos o situaciones, e incluye dos partes, lo que es la premisa y la conclusión. Lo que da como resultados “si premisa, entonces conclusión”
Las premisas son frases que afirman o niegan algo con una seria de razones articuladas y la conclusión es una expresión lógica tras la premisa.


Ejemplo: Cajero Automático (Gutiérrez)
Un cliente desea sacar dinero de un CA:
1.    Introduce la tarjeta en el CA, la máquina la lee y la verifica.
2.    Si la tarjeta no es verificada con éxito (porque no es legible), el CA devuelve la tarjeta al usuario con el mensaje de error correspondiente.
3.    En otro caso, el CA pide al usuario su número de identificación personal (NIP).
4.    Si el número fuese incorrecto, se dan tres oportunidades de corregirlo.
5.    Si el NIP es correcto, el CA pregunta al usuario cuánto dinero desea sacar.
6.    Para que el pago se autorice, la cantidad solicitada no debe exceder de una cierta cantidad límite diaria,
7.    además de haber suficiente dinero en su cuenta.
En este ejemplo se pueden ver siete situaciones que a cualquier persona le puede ocurrir  para las cuales se dan un conjunto de valores. De estas situaciones se pueden realizar 7 reglas.




La Regla 1 indica cuando debe realizarse el pago en el cajero automático y cuando se cumpla alguna de las demás reglas este pago debe ser denegado. Es aquí en donde se ve como funciona el sistema de reglas en una situación real a la hora de tomar decisiones.


Motor de inferencia:
Los elementos que integran el motor de inferencia son:
  1. Base de Hechos:   los datos(hechos o evidencia)
  2. Base de conocimiento:  el conjunto de reglas de la base de conocimiento
  3. Módulo de Explicación.


El motor utiliza estos elementos para obtener nuevos resultados o hechos.Este es considerado el cerebro del sistema, ya que define un proceso de búsqueda para poder dar una respuesta utilizando la base de conocimiento  y las consultas de los usuarios.


Los hechos son conocidos en una situación particular, que ya sea por un orden natural o bien por el cumplimiento de sentencias que lleva a un hecho determinado, se debe de considerar que los hechos deben de ser relevantes,para tener una base de hechos, clara y concisa.
Las reglas o conocimiento  tienden por lo general a ser estáticas, pero si se le añade la capacidad de aprendizaje , esta regla podría cambiar.
La interpretación de las reglas conlleva los siguientes pasos  básicos(Luis Valencia Cabrera):
  1. Reconocimiento de patrones: comparación de los patrones en las  reglas con los elementos de la memoria de trabajo. Aquellas reglas  que pueden aplicarse se almacenan en la Agenda.
  2. Resolución de conflictos: elección de una regla entre las satisfechas por la memoria de trabajo y ejecución de su parte ENTONCES (conclusión).
  3. Ejecución: La ejecución de las reglas da lugar a cambios en la memoria de trabajo. (También podrían añadirse nuevas reglas) Para obtener conclusiones  reglas y estrategias de inferencia y control.
La estrategia de control especifica la forma de resolver  conflictos


El proceso de razonamiento: es una progresión de un conjunto de datos de partida hacia una solución o conclusión,para ayudar a visualizar mejor este concepto se presentan lo que se denominan reglas de inferencia:
  • Modus Ponens
  • Modus Tollens
  • Encadenamiento de reglas
  • Encadenamiento de reglas orientado a objetos


(Prof. José Manuel Gutiérrez)
El Modus Ponens: es quizás la regla de inferencia más comúnmente utilizada. Se utiliza para obtener conclusiones simples. En ella, se examina la premisa de la regla, y si es cierta, la conclusión pasa a formar parte del conocimiento. Como ilustración, supóngase que se tiene la regla, “Si A es cierto, entonces B es cierto" y que se sabe  que “A es cierto". La regla Modus Ponens concluye que “B es cierto". Esta Regla de inferencia, que parece trivial, debido a su familiaridad, es la base de un gran número de sistemas expertos.


Modus Tollens: se utiliza también para obtener conclusiones simples. En este caso se examina la conclusión y si es falsa, se concluye que la premisa también es falsa. Por ejemplo, supóngase de nuevo que se tiene la regla, “Si A es cierto, entonces B es cierto" pero se sabe que “B es falso". Entonces, utilizando la regla Modus Ponens no se puede obtener ninguna conclusión pero la regla Modus Tollens concluye que “A es falso".


Estas dos últimas reglas son utilizadas para obtener conclusiones simples, pero no siempre la mejor respuesta es la más simple, debido a esto a lo largo de la historia, tanto de los sistemas expertos, como de la inteligencia artificial, han surgido algoritmos que nos ayudan en situaciones que son más complejas, podremos observar que resaltaron uno de los paradigmas más populares en la últimas décadas, que es “Orientado a Objetos”.


Encadenamiento de Reglas
Una de las estrategias de inferencia más utilizadas para obtener conclusiones compuestas es el llamado encadenamiento de reglas. Esta estrategia puede utilizarse cuando las premisas de ciertas reglas coinciden con las conclusiones de otras. Cuando se encadenan las reglas, los hechos pueden utilizarse para dar lugar a nuevos hechos. Esto se repite sucesivamente hasta que no pueden obtenerse más conclusiones. El tiempo que consume este proceso hasta su terminación depende, por una parte, de los hechos conocidos, y, por otra, de las reglas que se activan. Este algoritmo puede ser implementado de muchas formas. Una de ellas comienza con las reglas cuyas premisas tienen valores conocidos. Estas reglas deben concluir y sus conclusiones dan lugar a nuevos hechos. Estos nuevos hechos se a~naden al conjunto de hechos conocidos, y el proceso continúa hasta que no pueden obtenerse nuevos hechos.


Encadenamiento orientado a objeto
El algoritmo de encadenamiento de reglas orientado a un objetivo requiere del usuario seleccionar, en primer lugar, una variable o nodo objetivo; entonces el algoritmo navega a través de las reglas en búsqueda de una conclusión para el nodo objetivo. Si no se obtiene ninguna conclusión con la información existente, entonces el algoritmo fuerza a preguntar al usuario en busca de nueva información sobre los elementos que son relevantes para obtener información sobre el objetivo.













Conclusiones     

  • El sistema basada en reglas sirve de apoyo a la hora de tomar decisiones en una determinada situación. En donde la reglas deben estar compuestas por premisas y conclusiones para dar a el sistema órdenes y opciones.
  • Notando que en la actualidad la inteligencia artificial, se presenta en distintos ámbitos de la vida cotidiana, desde lo comercial,social,educativo, etc, viento estos ámbitos, es claro ver que los sistemas expertos basados en reglas son una gran herramienta, para aquellas tareas monótonas.
  • Los sistemas basados en reglas tiene sus ventajas y desventajas, como todas los avances tecnológicos  que ha tenido la humanidad,por una parte tenemos que el sistema puede ir creciendo, es decir es escalable, tiene un servicio de (24/7) lo que le da una gran disponibilidad, ahora viene aquí las desventajas, podría darse el caso de un encadenamiento infinito, la cantidad de reglas puede llegar a crecer de una manera descontrolada.




Referencias
Castillo, E., Gutiérrez, J.M. y Hadi, H (1997), Expert Systems and Probabilistic
Network Models. Springer, New York. Versión Española editada por la Academia
Española de Ingeniería.


Durkin, J. (1994), Expert Systems: Design and Development. Maxwell Macmillan, New York.


Roman (s.a.) Inteligencia Artificial:los Sistemas Expertos. [En línea].
<http://www.rinconcitodelphi.com/articulos/IA/Articulo.htm> [2005, julio 14].


Samper, J. (s.a.) Introducción a los Sistemas Expertos. [En línea].
<http://www.redcientifica.com/doc/doc199908210001.html> [2005, julio 16].


Enrique Castillo, José Manuel Gutiérrez,  Ali  S. Hadi.
Sistemas Expertos y Modelos de Redes Probabilísticas
http://personales.unican.es/gutierjm/papers/BookCGH.pdf