lunes, 27 de febrero de 2012

Udacity, la primea universidad online gratuita para todo el mundo


El renombrado profesor de Stanford, Sebastian Thrun, ha dejado la docencia en el centro y ha anunciado un proyecto revolucionario: Udacity, una “universidad” online gratuita e interactiva para cualquier persona en el mundo. El primer curso: cómo construir un motor de búsqueda.

En la pagina web dice:
Creemos que la enseñanza universitaria puede ser a la vez alta calidad y bajo costo.

La verdad es que estoy totalmente de acuerdo con esta premisa, y voy a aprovechar haciendo estos cursos.

Dejo el link:
http://www.udacity.com/

sábado, 25 de febrero de 2012

Agile Open Paraná 2012




En el contexto de los exitosos eventos del Agile Open Tour, se organizará un nuevo Agile Open Paraná 2012 "Compartiendo Metodologías Ágiles" el Viernes 30 de Marzo.


No tengo ni una sola palabra para agregar. En realidad 2... 


Ha inscribirse!!

Dejo el link:



jueves, 23 de febrero de 2012

Hyperpolyglot


Cuando alguien hace un buen trabajo no queda otra que sacarse el sombrero y si es licito compartir ese trabajo a la comunidad. Por esta razón quiero compartir una pagina que encontré que tiene diferentes comparaciones de lenguajes de programación. Estas comparaciones son muy completas y tienen una buena calidad.

Las comparativas son:


Interpreted Languages:PHP, Perl, Python, Ruby
Interpreted Languages:Tcl, Lua, JavaScript, Io
Operating System Automation:POSIX Shell, AppleScript, PowerShell
C++ Style Languages:C++, Objective C, Java, C#
Pascal Style Languages:Pascal, Ada, PL/pgSQL, MySQL
Lisp Dialects:Common Lisp, Scheme, Clojure, Emacs Lisp
Type Inference Languages:Standard ML, OCaml, Scala, Haskell
Untyped Declarative Languages:Prolog, Erlang, Oz
Concatenative Languages:Forth, PostScript, Factor
Tabular Data Selection:SQL, Awk, Pig
Computer Algebra Software:Maxima, Mathematica
Numerical Analysis Software:Fortran, MATLAB, R, NumPy


Dejo el link:
http://hyperpolyglot.org/

miércoles, 22 de febrero de 2012

Code Hero

"Code Hero" es el video juego que fue diseñado para aprender a programar en javascript. Es un juego en primera persona y usa la api Unity3D.
Lo realmente malo es que se descarga para windows o mac solamente; pruebo si mi wine lo tira!

Dejo el video:



Dejo link:
http://primerlabs.com/codehero

LungoJS



Quiero compartir un screencast sobre LongoJS un framework que aprovecha las caracteristicas de HTML 5, CSS 3 y javascript para desarrollar aplicaciones moviles.

LungoJS - RESTful + Templating + Cache (Spanish) from LungoJS on Vimeo.


Dejo la fuente y links:
http://www.genbetadev.com/desarrollo-aplicaciones-moviles/lungojs-usando-restful-templating-cache-screencast
http://vimeo.com/37014134
http://www.lungojs.com/

Apache celebra su 17 aniversario con un release de su servidor

Leo en infoq que el servidor Apache cumple 17 añitos y para festejarlo libera su versión 2.4 de su servidor http.


Dejo mis felicitaciones!!


Y dejo links:
http://httpd.apache.org/
http://www.infoq.com/news/2012/02/Apache-HTTP-Server-2-4


martes, 21 de febrero de 2012

viernes, 17 de febrero de 2012

Spring data y mongodb parte 2

Spring data nos brinda muchos beneficios para poder utilizar MongoDB entre los cuales ya nombramos en este post:

http://emanuelpeg.blogspot.com/2012/02/mongodb-spring-data.html

Pero vamos a empezar?

Spring MongoDB requiere MongoDB 1.4 o superior y JDK 1.5 o superior. Obiamente que lo ideal seria utilizar Spring MongoDB en un proyecto que use Spring.

Antes que nada debemos iniciar MongoDB como lo explica el siguiente post:

Podemos hacer un proyecto Spring con maven y agregar las siguientes dependencias:


    org.springframework.data
    spring-data-mongodb
    1.0.0.M5
  


y el siguiente repositorio:


  
    spring-milestone
    Spring Maven MILESTONE Repository
    http://maven.springframework.org/milestone
  



Debemos agregar un archivo log4j.properties si necesitamos ver el log. El archivo va a contener lo siguiente:

http://emanuelpeg.blogspot.com/2012/02/instalar-mongodb-en-linux.html

log4j.category.org.springframework.data.document.mongodb=DEBUG
log4j.appender.stdout.layout.ConversionPattern=%d{ABSOLUTE} %5p %40.40c:%4L - %m%n


Para el siguiente ejemplo vamos hacer una clase persona:

package org.spring.mongodb.example;

public class Person {

  private String id;
  private String name;
  private int age;
   
  public Person(String name, int age) {
    this.name = name;
    this.age = age;
  }
  
  //Getters and setters
  
  @Override
  public String toString() {
    return "Person [id=" + id + ", name=" + name + ", age=" + age + "]";
  }
  
}


Buenisimo, ahora hacemos un main para probar:

package org.spring.mongodb.example;

import static org.springframework.data.mongodb.core.query.Criteria.where;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.data.mongodb.core.MongoOperations;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.query.Query;

import com.mongodb.Mongo;

public class MongoApp {

  private static final Log log = LogFactory.getLog(MongoApp.class);

  public static void main(String[] args) throws Exception {

    MongoOperations mongoOps = new MongoTemplate(new Mongo(), "database");

    mongoOps.insert(new Person("Joe", 34));

    log.info(mongoOps.findOne(new Query(where("name").is("Joe")), Person.class));

    mongoOps.dropCollection("person");
  }
}


Es magia.

En 4 lineas de código se guarda en la base de datos NoSQL MongoDB y se consulta con una consulta con where y se logea el resultado y al terminar la prueba se borra los datos; en 4 lineas.

En este pequeño ejemplo se pueden ver 4 cosas:

  • Se puede instanciar MongoTemplate con el objeto estandar de MongoDB com.mongodb.Mongo y el nombre de la base.
  • Se puede guardar un POJO así de simple sin metadata, ni herencia, ni nada raro.
  • MongoDB sabe el ObjectID por convensión, se maneja el campo id por convesión
  • La clase Persona puede tener solo getters, dado que asigna los datos por convensión. Si los nombres de los parametros del contructor coinciden con los datos usa estos datos para construir el objeto.



Para la proxima un ejemplo más copado. Continuara...

miércoles, 15 de febrero de 2012

Apache Apollo la nueva generación de mensajería!





ActiveMQ Apollo es más rapido, seguro, confiable y facil de mantener broker de mensajería. El cual fue construido a partir de Apache ActiveMQ. Los ingenieros de Apache le dieron una vuelta de rosca a ActiveMQ.

Apollo sólo soporta el protocolo STOMP pero al igual que ActiveMQ, ha sido diseñado para correr sobre varios protocolos. En futuras versiones se añadirá soporte OpenWirepor lo que puede ser compatible con ActiveMQ 5.x clientes JMS.

Entre los cambios de arquitectura podemos nombrar:


  • Refactor basado en Thread Model
  • Implementación para scala 2.8
  • Protocolo agnóstico
  • Administración basada en REST



Dejo links:
http://activemq.apache.org/apollo/
http://activemq.apache.org/apollo/documentation/architecture.html
http://activemq.apache.org/apollo/documentation/getting-started.html

martes, 14 de febrero de 2012

Documentación completa de Play Framework disponible en español


Me llego el siguiente mail de la gente de play, una gran noticia:

"Finalmente hemos concluido la traducción de la documentación de Play
Framework. Pueden consultarla en http://playdoces.appspot.com/

Hace apenas tres meses anunciábamos en esta lista que junto con varios
colegas iniciábamos la traducción de la documentación de Play
Framework, y al mismo tiempo invitábamos a todos los usuarios de este
framework a sumarse a la tarea.

Hoy, mientras nos preparamos para el lanzamiento de play 2.0, gracias
a la colaboración de colegas de América Latina y España ya podemos dar
por concluida la traducción de toda la documentación del sitio de play
Framework.

Aquí tienen los links:

Página principal: http://playdoces.appspot.com/

Si vives en alguno de los países a quienes google restringe el acceso
a las aplicaciones de Google Application Engine (¿qué habrá pasado con
el lema de “No seas malo”?), también tenemos una copia del sitio
alojada en openshift: http://playdoces-opensas.rhcloud.com/

Anuncio de la versión 2.0 de play: http://playdoces.appspot.com/2.0

Hola mundo en play: http://playdoces.appspot.com/documentation/latest/firstapp

Tutorial completo de play: una aplicación completa paso a paso:
http://playdoces.appspot.com/documentation/latest/guide1

y muchos artículos más que pueden encontrar en
http://playdoces-opensas.rhcloud.com/documentation/latest/home

También pueden ver el anuncio en el blog:
http://playlatam.wordpress.com/2012/02/14/documentacion-completa-de-play-framework-disponible-en-espanol/

Queremos agradecer a @rodriguezlaurag y @mfmontanari de Argentina,
@gualtrapa de España, @pjquero de Venezuela and @alfonsokim de México,
y también a los desarrolladores de la traducción japonesa del sitio de
Play, @garbagetown y @ikeike443, cuyo trabajo forkeamos
descaradamente.

Esperamos que nos ayuden a difundir esta noticia y que esta iniciativa
ayude a impulsar el uso de Play en los países de habla hispana.

Saludos

Sas (@develsas)"



Felicitaciones!! 

lunes, 13 de febrero de 2012

Más de Spring Data y MongoDB

Sigo leyendo sobre spring-data un proyecto que se las trae. Ahora vamos analizar el proyecto Spring Data con MongoDB.

Repository es la interfaz más general de Spring Data; CRUDRepository extiende esta y agrega metodos basicos para hacer las operaciones CRUD.


public interface CrudRepository
    extends Repository {
                                                                                         
    T save(T entity);
                                                                                         
    T findOne(ID primaryKey);
                                                                                         
    Iterable findAll();

    Long count();
                                                                                         
    void delete(T entity);
                                                                                         
    boolean exists(ID primaryKey);
                                                                                         
    // … more functionality omitted.
}



PagingAndSortingRepository nos provee los metodos de busqueda:


public interface PagingAndSortingRepository extends CrudRepository {

    Iterable findAll(Sort sort);

    Page findAll(Pageable pageable);
}





Donde Pageable es una clase que sirve para paginar; por ejemplo si quisieramos ir a 2 pagina y la pagina va cada 20 filas se debe instanciar de la siguiente manera: new PageRequest(1, 20)

Seteamos spring para que cree los proxys de nuestra interfaces:


  






Luego inyectamos el objeto a la clase que lo deberia usarlo:

public class SomeClient {

  @Autowired
  private PersonRepository repository;

  public void doSomething() {
    List persons = repository.findByLastname("Matthews");
  }
}




Tambien se pueden definir implementaciones para las interfaces por ejemplo si tenemos un metodo particular. Simplemente hay que definir la implementación:


interface UserRepositoryCustom {

  public void someCustomMethod(User user);
}


class UserRepositoryImpl implements UserRepositoryCustom {

  public void someCustomMethod(User user) {
    // Your custom implementation
  }
}


Como se puede ver no hay que extender de ninguna clase de Spring data, ni hay que hacer algo raro. Ahora hacemos la interfaz posta, la cual va tener los metodos que provee Spring Data y el metodo custom:


public interface UserRepository extends CrudRepository, UserRepositoryCustom {

  // Declare query methods here
}



Esa es una primera parte de Spring Data con MongoDB. Mientras voy aprendiendo escribo algo acá!

Dejo link:
http://static.springsource.org/spring-data/data-document/docs/current/reference/html/

viernes, 10 de febrero de 2012

Instalar MongoDB en Linux

No es el super tutorial, no por culpa mía sino que es muy fácil instalar mongoDB. 
Empezamos bajando la base de este link: http://www.mongodb.org/downloads 
Una vez que hallamos bajado el archivo nos logeamos como root en el directorio que se bajo la base y movemos el archivo a opt (o a la que quieran ustedes)


# mv mongodb-linux-x86_64-2.0.3-rc0.tgz /opt/
# cd /opt


Ahora vamos a descomprimir el archivo y de paso borramos el tgz:


# tar -xvf mongodb-linux-x86_64-2.0.3-rc0.tgz 
# rm mongodb-linux-x86_64-2.0.3-rc0.tgz 

Se crea la carpeta data

# mkdir -p /data/db/
# chown `id -u` /data/db

Luego de crear el directorio de datos dado que MongoDb usa una carpeta para datos con el path configurable pero nosotros vamos usar el path por defecto.

Y ahora a levantar:

# cd mongodb-linux-x86_64-2.0.3-rc0/bin
# ./mongod

Ahora podemos jugar un rato: 

#db.foo.save( { a : 1 } )
#db.foo.find()

Dejo links:

miércoles, 8 de febrero de 2012

NoSQL

Dejo un gráfico que muestra en que conceptos se basaron para desarrollar las bases NoSQL.

Los puntos son: Consistencia, distribuido o capacidad de distribuirse y disponibilidad. En El grafico se puede ver por ejemplo que Voldemort es una base clave-valor que se apoyo sobre los conceptos de disponibilidad y capacidad de distribuirse.


NoSQL y SQL amigos?


Xeround esta brindando un servicio donde mezcla base de datos NoSQL con bases de datos SQL de forma híbrida. En front-end se trabaja con una base MySQL pero el corazón del servicio es una base NoSQL distribuida de 50 gigas.

Xeround provee base de datos como servicio para aplicaciones MySQL en la nube. De esta forma el desarrollador trabaja con una base MySQL sin tener que lidiar con detalles de bases NoSQL.

El servicio se ejecuta en la nube proporciona la alta disponibilidad (99,9%) y la escalabilidad en general,asociado a un almacén de datos NoSQL, que se puede implementar en Amazon EC2 y Rackspace, y puede ser utilizado como un add-on de Heroku para bases de datos de hasta 500 MB.

Dejo links:
http://www.infoq.com/news/2012/02/Hybrid-SQL-NoSQL
http://xeround.com/
http://xeround.com/developers/



martes, 7 de febrero de 2012

Smalltalk y Javascript un solo corazón!


Cada vez estamos en la era donde se va a poder escribir cualquier programa en cualquier lenguaje en cualquier tecnología . Y este es un buen ejemplo! Compilar Smalltalk a Javascript.

Existen varios proyectos que permiten hacer esto:

ST2JS:
ST2JS – Smalltalk to Javascript translator
http://www.squeaksource.com/ST2JS/
ST2JS – Traductor de Smalltalk a JavaScript (Parte I)
http://diegogomezdeck.blogspot.com/2006/07/st2js-traductor-de-smalltalk.html
ST2JS – Traductor de Smalltalk a JavaScript (Parte II)
http://diegogomezdeck.blogspot.com/2006/07/st2js-traductor-de-smalltalk_28.html

Otro proyecto muy bueno es S8, paso a copiar y pegar un párrafo de la presentación de este framework:

"El pasado sábado 17 tuvo lugar una importante reunion de Smalltalkig donde definimos el alcance de lo que llamamos Proyecto S8 y el rol que queremos que Smalltalking juegue en ese Proyecto. S8 comenzo siendo un proyecto personal de Alejandro Reimondo de desarrollo de un Smalltalk corriendo sobre la maquina virtual javascript open source de Google, la famosa V8 (de alli su nombre). Durante el transcurso de ese proyecto que aun continua en desarrollo, nos dimos cuenta que S8 podria transformarse en una plataforma de desarrollo para otros frentes, incluso aquellos que no necesiten soporte de V8 (un ejemplo de ello es el smalltalk jtalk o su nuevo nombre Amber). Es por ello que decidimos ponerle licencia MIT y potenciar una comunidad que utilize la herramienta desde Smalltalking. De esa forma le daremos previsibilidad a la herramienta y sustentabilidad en el tiempo, dos cosas que para los smalltalkers es fundamental"

Copiado textualmente de :
http://leodemarco.blogspot.com/2011/09/lanzamiento-de-s8-en-smalltalking.html

Dejo la fuente:
http://ajlopez.wordpress.com/2011/09/22/smalltalk-and-javascript/

domingo, 5 de febrero de 2012

Configuración De Servidores Con GNU/Linux

Quiero compartir un libro de Linux totalmente gratuito y sobre licencia Creative Commons. Es de muy buena calidad, dejo el link:

http://www.mediafire.com/?axozs408qao4a83

viernes, 3 de febrero de 2012

MongoDB + Spring Data

Ya hablamos bastante de spring data y también de mongoDB. El proyecto Spring Data intenta facilitarnos el acceso a diferente repositorios de datos. En esta oportunidad vamos a hablar de como nos facilita el acceso y manejo de la base de datos noSQL MongoDB.

Recordemos que MongoDB es una base documental, clave-valor; escrita en c++. Es conocida como la MySQL de las bases NoSQL. Dado que es liviana, muy usada y fácil de usar.

Spring Data nos provee:

  • Configuración basada en Spring con XML o anotaciones
  • MongoTemplate nos brinda la principales funcionalidades que se pueden aplicar a la base MongoDB.
  • Traducción de las excepciones a excepciones más amigables.
  • Mapeos de objetos integrados con Spring's Conversion Service
  • Querys, criterias y DSLs basados en java.
  • Implementaciones de interfaces de repositorio con métodos comunes.
  • Integración con QueryDSL!!
  • Persistencia cross-store; soporta entidades de JPA
  • Log4j
  • Integración con Map-Reduce
  • Monitorización y administración basado en JMX 


Para utilizar esta herramienta con maven es necesario agregar el siguiente repositorio:


    spring-milestone
    Spring Maven MILESTONE Repository
    http://maven.springframework.org/milestone



y la siguiente dependencia:


 org.springframework.data
 spring-data-mongodb
 1.0.0.RC1
 



Dejo links:
http://www.springsource.org/spring-data/mongodb
http://static.springsource.org/spring-data/data-document/docs/current/reference/html/

Apache MINA


Apache MINA es un Framework de aplicación de red que ayuda a los usuarios a desarrollar aplicaciones con un alto rendimiento y alta escalabilidad fácilmente. Este framework provee una API asincrona sobre varios protocolos como TCP/IP y UDP/IP a gracia a Java NIO. Con lo que se puede hacer Comet muy fácilmente. 

Las APIs NIO se introdujeron en Java 1.4 y son utilizadas desde entonces por un gran número de aplicaciones. Las APIs NIO permiten operaciones de IO sin bloquear sin bloquear el procesamiento con esto.

Mina es un framework de aplicación de red simple, pero con todas estas funcionalidades:
  • Unifica la API para distintos tipos de transporte: TCP / IP y UDP / IP a través de Java NIO
  • Comunicación serie (RS232) a través de RXTX
  • Interfaz de filtro como un punto de extensión, similar a los filtros de Servlet
  • API de bajo nivel y de alto nivel: De bajo nivel: usos ByteBuffers, De Alto Nivel: definidos por el usuario utiliza objetos de los mensajes y códecs.
  • Manejo de hilos modificable: u solo hilo o un grupo de subprocesos, más de mil grupos de subprocesos (es decir, SEDA)
  • Sobrecarga de protección y limitación del tráfico
  • Unidad de capacidad de prueba y los objetos mock
  • Se puede administrar con JMX
  • Basada en Stream  I/O soportado vía StreamIoHandler
  • Integración con contenedores conocidos como PicoContainer y Spring
Esta bajo licencia Apache 2. 


CriteriaQuery de JPA vs Criteria de Hibernate vs QueryDSL

Estuve leyendo sobre la API de Criteria de JPA, y la verdad es que no me gusto.

Vamos por parte porque usar esta API? Porque nos provee la seguridad por tipo; escribiendo hql o ejbql por ejemplo tenemos el problema que al modificar un objeto; las consultas no se enteran y por lo tanto pueden explotar. Este problema se podría atacar haciendo una buena batería de test y ir corriéndola con maven por ejemplo. Pero lo ideal es que al modificar la clase se rompa donde esta siendo usada esa propiedad de esta manera el programa no compila hasta que no solucione todo. A la vez las herramientas de refactor me podrían ayudar modificando las consultas.

Veamos un ejemplo de criteria con JPA:

CriteriaQuery criteria = builder.createQuery( Person.class );
Root personRoot = criteria.from( Person.class );
criteria.select( personRoot );
criteria.where( builder.equal( personRoot.get( Person_.eyeColor ), "brown" ) );
List people = em.createQuery( criteria ).getResultList();


Esto en hql seria: from Person p where p.eyeColor = 'brown' (un poco mas fácil) Pero porque tanta cosa? Veamo el ejemplo de JPA, antes que nada necesitamos crear un builder de la query luego con ese builder creamos la query donde le decimos lo que vamos a consultar y que vamos a seleccionar y luego con el builder agregamos la condición. Cuando agregamos la condición (si fueron observadores) vieron que llama a una clase Person_ esta clase es la que contiene la metainformación de la clase y obviamente hay que programarla seria algo así:

import javax.persistence.metamodel.SingularAttribute;
import javax.persistence.metamodel.SetAttribute;
import javax.persistence.metamodel.StaticMetamodel;

@StaticMetamodel( Person.class )
public class Person_ {
    public static volatile SingularAttribute id;
    public static volatile SingularAttribute name;
        public static volatile SingularAttribute eyeColor;
    public static volatile SingularAttribute age;
    public static volatile SingularAttribute address;
    public static volatile SetAttribute orders;
}


Luego de hacer todo eso no me acuerdo que estoy consultando. Hay cosas que muy fácilmente se podrían mejorar como por ejemplo no puede suponer que lo que consultamos es lo que debe seleccionar? Todo hay que decirle!

Veamos como se puede hacer la consulta con Criteria de Hibernate:

List people = sess.createCriteria(Person .class).add( Restrictions.eq("eyeColor", "brown") ); 

Bastante más fácil pero se puede ver un pequeño problema si yo cambio en mi clase la propiedad "eyeColor" esta consulta va a seguir compilando pero va explotar cuando la ejecute. Ahora veamos como podríamos hacer esto con QueryDSL:

JPAQuery query = new JPAQuery(em);
QPerson p = new Qperson("p");
query.from(p).where(p.eyeColor.eq("brown"));


QueryDSL genera un tipo para consultar con el nombre Qperson que sería como este:

public class QPerson extends EntityPathBase{
…
}


Como conclusión podemos decir que es complejo hacer consultas de forma tipada y que queden bien es más complejo aun. De igual forma la API de Criteria de JPA se podria mejorar mucho más. Y esto se ve cuando miramos proyectos que nacieron para simplificar esta API como QueryDSL.

Con Heroku, Neo4J se va a las nubes!

Una base de datos NoSQL que esta haciendo su camino hacia la nube, es Neo4J, una base de datos gráfica; de la cual ya hablamos. Además de otras mejoras como Cypher (el motor de consulta), web de administración, actualización Lucene. Neo4J 1.6 ahora se puede acceder desde Heroku actualmente a través de un add-on beta a través de una interfaz REST. Hay un número de clientes REST Neo4J permitidos; y como es REST se puede consultar de diferentes lenguajes como: .NET, Python, Django, PHP, Ruby y Java. 

Heroku adds-on permite a los usuarios que puedan ampliar la funcionalidad básica, añadir características o conectarse a servicios externos, el último de ellos el caso de cómo se accede desde Heroku a Neo4J.

Dejo links:
http://blog.neo4j.org/2011/12/neo4j-labs-heroku-neo4j-and-google.html
http://addons.heroku.com/neo4j
http://devcenter.heroku.com/articles/neo4j

Postgres Plus® Cloud Database

La verdad estoy sorprendido al leer esto: EnterpriseDB ha anunciado la disponibilidad de Postgres Plus Nube de base de datos (PPCDB), una base de datos con un servicio que ofrece PostgreSQL 9.1 y Postgres Plus Advanced Server 9.0 como IAM en Amazon AWS. OpenStack incluirá soporte para PPCDB.

PPCDB viene con una interfaz web para la instalación y la gestión de casos individuales o grupos de bases de datos Postgres en la nube, y funciones de escala automática, leer y escribir en el balanceador de carga, la replicación binaria, conmutación por error, de auto-aprovisionamiento, almacenamiento elástico, la clonación de DB, y automatización copias de seguridad.

Postgres Plus Advanced Server incluye compatibilidad con Oracle permite a los desarrolladores ejecutar  SQL de Oracle contra una base de datos PostgreSQL.

Dejo un video:



Dejo Links:
http://www.infoq.com/news/2012/02/PostgreSQL-Neo4J-Cloud
http://www.enterprisedb.com/products-services-training/products-overview/postgres-plus-cloud-database