Notas sobre PostgreSQL

Para hacer login al servidor PostgreSQL se ejecutan dos comandos:

  • $ sudo su - postgres es útil para loguearse como el usuario postgres
  • Después de eso con el comando psql podemos hacer login al prompt de PostgreSQL (el servidor)

psql -U user -d database -h 127.0.0.1 -W.

Roles

PostgreSQL administra los permisos bajo el concepto de “roles”.

Crear roles (dentro del servidor PostgreSQL): # create role developer;. Un método alternativo para crear roles es usar el comando createuser en el prompt PostgreSQL.

Listar los roles \du. Eliminar roles se hace de la siguiente forma: # drop role developer;.

Privilegios

Los roles tienen privilegios. Por ejemplo, cuando un rol no tiene permiso para loguearse se lo podemos otorgar así: alter role developer with login o así alter user developer CREATEDB.

De la misma forma otorgamos todos los permisos a un rol así: GRANT ALL PRIVILEGES ON DATABASE database to usuario;

Obtener permisos de administrador

Para acceder directamente desde el prompt de tu usuario, hay que crear un rol y una base de datos que tengan el mismo nombre de tal usuario.

Suponiendo que el nombre de tu usuario es hariseldon, Hacemos lo siguiente: desde el prompt del usuario postgres creamos un rol createuser hariseldon. Aparecerá un prompt para que indiquemos que queremos que este nuevo rol tenga privilegios de administrador. Después basta crear una base de datos con el nombre hariseldon: create database hariseldon.

Resetear contraseña

alter user postgres with password ''

Mostrar tablas en la base de datos

\dt

\d+ table es el equivalente a describe table de MySQL.

El equivalente a use database de MySQL es \c database.

Respaldar y restaurar

Otra de las funciones que nos conviene saber es cómo respaldar y restaurar bases de datos.

Respaldar: pg_dump -U usuario nombredb -f respaldodb.sql.

Antes de restaurar hay que asegurarse de que la base de datos ha sido creada: $ psql -U usuario -d database -f script.sql.

Otros tips

Darle la propiedad de una base de datos a determinado rol:

ALTER DATABASE name OWNER TO developer;

Heredar los privilegios de otro rol:

GRANT admin TO joe;

Ejecutar instrucciones SQL desde un archivo:

psql -d myDataBase -a -f myInsertFile

Algunas consultas útiles

  • select datname from pg_database: Esta consulta nos da una lista de las bases de datos que existen, me gusta más que la salida de \l.
  • select * from pg_stat_activity: Esta consulta nos da una lista de las bases de datos con una sesión abierta.

Los pocos libros que leí en 2013

2013 fue un año malo en cuestión del número de libros leídos: apenas cuatro. Peor aún, no resumí ninguna de esas lecturas. Sin embargo, no fue un año pésimo, dos de esos libros los leí en inglés y uno de ellos era una trilogía, así que en cierta forma realmente leí seis libros. Otra excusa barata es que leí bastantes artículos científicos en inglés. En fin, sólo para que no se pierda la bonita costumbre de escribir cosas en el blog, a continuación el micro resumen de estas lecturas:

Outliers de Malcolm Gladwell: En esta obra el señor Gladwell nos enseña lo que ya sabíamos: El éxito es producto del esfuerzo y el trabajo duro. Pero el autor va más allá y nos muestra a través de muchos ejemplos la razón del éxito, no sólo de un árbol, sino de un bosque. Es un libro que vale la pena leer más de una vez.

The Hunger Games de Suzanne Collins: El libro es bueno, no más. Hay momentos muy interesantes, pero le faltó sangre y le sobró miel.

Trilogía de la Fundación de Isaac Asimov: Por mucho este fue el libro que más me gustó este año. Ni duda cabe que desde la aparición del Mulo en la trama la historia te engancha en serio. Todo verdadero geek debe leer este libro.

Travesuras de la Niña Mala de Mario Vargas Llosa: Fue mi regreso a la literatura hispanoamericana y el primer libro que leí de Mario Vargas Llosa. Un libro cursi que tiene de todo. Es ese tipo de libro que te hace pensar “ojalá hubiese leído este libro en la secundaria”.

Leeré más en 2014

Aunque seguramente tendré menos tiempo libre en este año, trataré (nuevamente) de alcanzar la meta de leer más de veinte libros (y resumir al menos la mitad). Experimentaré leyendo dos al mismo tiempo, uno en inglés: The Lord of the Rings y otro en español: Ernesto Guevara, también conocido como el Che.

En 2013, vergonzosa y tristemente, dejé muchas lecturas a la mitad, espero corregir esa mala costumbre y leer con más seriedad. De la misma forma espero gastar menos tiempo en lecturas poco provechosas. Que así sea.

Una curiosidad en Linux con los archivos cuyo nombre empieza con un guión -

Si queremos eliminar o crear o listar en la terminal de Linux archivos cuyo nombre es algo así: ---name.jpg o -nombre.txt necesitaremos un truquillo, el cual será añadir doble guión -- después del comando en cuestión y antes del nombre del archivo que deseamos eliminar o crear o listar:

Para eliminar un archivo cuyo nombre es -file.odt haríamos lo siguiente: rm -- -file.odt. O bien para listar un archivo cuyo nombre es --file.pdf ejecutaríamos: ls -- --file.pdf.

La razón de ser de este comportamiento es evitar que el sistema piense que le estamos mandando a ejecutar una opción que no existe.

Doble guión en acción

Doble guión en acción

¿Cómo configurar Vim para evitar archivos swap?

Algo que me molesta de Vim es que a veces al abrir un archivo me topo con algo así:

Found a swap file, Vim

Found a swap file, Vim

Para evitar esto hay que añadir a nuestro archivo .vimrc la línea:

set noswapfile

Ojo: Evitar los archivos swap no es una buena idea (el archivo swap almacena los cambios en el proceso de edición), ya que el archivo swap funciona como archivo de recuperación cuando Vim se rompe. Pero la verdad a mí me molesta mucho.

Notas sobre Git y Github

¿Qué es Git?

Git es un sistema de control de versiones distribuido (no existe un servidor central), fue creado por Linus Torvalds. Un sistema de control de versiones es útil para cosas como:

  • Crear un historial de las versiones de tu código, snapshots.
  • Revertir los cambios hechos en un proyecto.
  • Trabajar con muchos desarrolladores al mismo tiempo.

La colección de archivos y el historial completo son almacenados en un repositorio.

Clonar

El proceso de hacer una copia local de un repositorio externo es conocido como cloning.

Cambios en el repositorio

Un cambio se hace en dos pasos:

  • Staging: Se añade el archivo al index: git add 'algo'
  • Committing: Se almacenan los cambios en el repositorio: git commit 'algo'

Instalar Git

La instalación en sistemas Debian y derivados es sencilla: sudo aptitude install git. Lo que se instala con este comando es un cliente Git.

También existen buenos servidores Git como Gitolite.

Configurar Git

Ya con Git instalado vamos a configurar algunos datos:

git config --global user.name "John Winston Lennon"
git config --global user.email "j.w.lennon@gmail.com"

Estos datos son útiles si usamos servicios como Github o Bitbucket.

Manos a la obra con Github

Github es una plataforma Git en la nube. Generas una cuenta, creas llaves SSH o bien trabajas a través de HTTPS.

Lo que haremos ahora será clonar el repositorio del proyecto Class2Go, que es una plataforma MOOC de la Universidad de Stanford, (dado que este repo es bastante extenso, se puede elegir cualquier otro):

git clone git@github.com:omartrinidad/class2go.git
Clonando un repositorio

Clonando un repositorio

Después de eso vamos a la cuenta de Github que aloja el proyecto Class2Go y picamos en el botón Fork. En automático tendremos una copia de ese proyecto a nuestra disposición.

Fork

Fork

Entramos a la carpeta que se ha generado, modificamos el archivo README.md y ejecutamos los siguientes comandos:

git add README.md
git commit -m "Modificamos el archivo README"

En caso de que hayamos modificado más de un archivo también es posible utilizar wilcards:

git add *.py
git commit -m "Se han modificado todos los archivos Python"

Sin embargo los archivos que hemos modificado aún no están en el nuestro repositorio madre. Si es la primera vez que hacemos un cambio ejecutaremos:

git push -u origin master

El cambio se debe haber efectuado, lo que hemos hecho es un fork, o sea, a partir de un proyecto de código abierto podremos empezar a escribir el nuestro (similar a un sisma religioso según Wikipedia).

A partir de la segunda vez podemos usar una versión abreviada:

git push

¿Qué pasa si alguien más realizó un cambio en el archivo que pretendemos cambiar? Recibiremos un mensaje de error, para saltar ese error debemos ejecutar el comando:

git pull

Lo que este comando hace es jalar al repositorio local hasta el último cambio hecho en el repositorio mamá.

Crear un repositorio

Ahora vamos a crear un repositorio desde cero, se supone que estamos usando Github, picamos el botón indicado para crear un repositorio o vamos a la url https://github.com/new:

Crear un repositorio desde Github

Crear un repositorio desde Github

mkdir mirror
cd mirror
git init

El comando git init crea una carpeta llamada .git que es donde se guarda la magia detrás de Git.

git add .
git commit -m "Cambios en los archivos de este folder"
git remote add origin git@github.com:omartrinidad/mirror.git
git push -u origin master

El comando remote add origin añade un repositorio remoto, en este caso el que anteriormente creamos en Github: mirror.

Otros comandos útiles en Git

git log

Nos ayuda a ver el historial de commits con información como fecha, autor, comentario.

git status

Nos dice qué onda con los commits, si hay commits pendientes nos avisa, si no los hay pues también.

Referencias

Propósito de guidata(hObject, handles) en Matlab

Cada objeto (o figure, o axes, o button, o textbox, etc.) es representado por una variable handles. O sea hObject.

Si estás construyendo una GUI, seguro quieres almacenar datos acerca del estado del programa dentro de la GUI en algún lado. Piensa en una GUI con dos botones (uno con una +, otro con un -) y un texto que inicia en 1. Si el usuario hace click en +, el texto debería incrementar, si el usuario hace click en - debería decrementar.

En algún lugar de la GUI, una variable contador necesita almacenarse. Una forma de hacerlo es almacenarla (la variable) en el guidata de la GUI, que es una ubicación especial específica para GUIs. Creo que aquí hay dos razones de por qué es especial:

  1. Cada hObject (un pushbutton, un axes, etc.) que es hijo de la misma figura apunta al mismo guidata. Así que es un lugar común para todas las partes de la GUI compartir datos.
  2. Cualquier función callback en la GUI automáticamente obtiene el guidata como su tercer argumento. O sea, siempre que hagas click en el botón de una GUI con alguna configuración para guidata, el parámetro de entrada (por default) es siempre una copia de guidata(GUIhandle), hecha al momento exacto de hacer click al botón.

De tal manera que una función callback lucirá de la siguiente forma:

function pushButtonCallback(buttonHandle, eventData, handles)
...
disp(handles)

Ahora, handles es sólo una estructura, vamos a decir que nosotros hemos almacenado el contador que estamos utilizando en handles.counter, pero también queremos este valor disponible para cada uno de los otros callbacks. Para hacer eso, necesitamos actualizar el campo handles.counter y entonces, poner los handles de regreso en el guidata de la GUI. Tan pronto como hemos hecho eso, la próxima vez que un usuario le de click a un botón usará la versión actualizada de handles.

function plusPushButtonCallback(buttonHandle, eventData, handles)
% En ESTE punto, 'handles' es sólo una copia del guidata de la GUI

handles.counter = handles.counter + 1;
% En ESTE punto, 'handles' es diferente al guidata de la GUI

guidata(buttonHandle, handles);
% En ESTE punto, 'handles' ha regresado como el nuevo guidata de la GUI

Este post es la traducción de una respuesta a la pregunta ¿Cuál es el próposito o rol de guidata(hObject, handles)? en el foro oficial de Mathworks: aquí.

2012: 314159bits in review

LoL, I like the review prepared by monkeys WordPress. Albeit in this year that is ending I didn’t publish many posts it was the best year for my humble blog:

The WordPress.com stats helper monkeys prepared a 2012 annual report for this blog.

Here’s an excerpt:

4,329 films were submitted to the 2012 Cannes Film Festival. This blog had 26,000 views in 2012. If each view were a film, this blog would power 6 Film Festivals

Click here to see the complete report.