Skip to content

Instantly share code, notes, and snippets.

@nihilismus
Last active December 14, 2015 12:39
Show Gist options
  • Save nihilismus/5087728 to your computer and use it in GitHub Desktop.
Save nihilismus/5087728 to your computer and use it in GitHub Desktop.
BDC0706

Conociendo el entorno

Existen dos cuentas de usuarios que pueden ser usadas, alumno y root. La cuenta de usuario alumno es de tipo normal y es la cuenta que se usará la mayor parte del tiempo. La cuenta de usuario root es de tipo administrador y es la cuenta que solo se usará para realizar modificaciones en el sistema operativo, por ejemplo:

  • Reiniciar/detener el S.O.
  • Administrar cuentas de usuario. Crear, eliminar, modificar su información/contraseña.
  • Administrar procesos/servicios (servidor HTTP/SSH/FTP, SGBD, etc). Configurarlos, iniciarlos, detenerlos.
  • Administrar software (paquetes) a nivel S.O. Descargar el código fuente del software y compilarlo (de ser requerido) o bien descargar e instalar el paquete del software, así como actualizarlos.

Una vez iniciada la sesión como usuario alumno se encuentra uno ante una shell, la shell BASH, en el directorio personal, /home/alumno. Lo anterior lo pueden verificar mediante los siguientes comandos:

alumno@slackware:~$ echo $SHELL
/bin/bash
alumno@slackware:~$ pwd
/home/alumno
alumno@slackware:~$ 

Dentro de nuestra sesión como usuario alumno podemos iniciar sesión como usuario root haciendo uso del comando su -:

alumno@slackware:~$ su -
Contraseña: 
root@slackware:~# echo $SHELL
/bin/bash
root@slackware:~# pwd
/root
root@slackware:~# 

La shell del usuario root es la shell BASH y su directorio personal es /root.

Para salir de la sesión como usuario root ejecutamos el comando exit y regresaremos a la sesión como usuario alumno. Podemos tener abiertas tantas sesiones como usuario alumno y root deseemos al mismo tiempo.

Como usuario root podemos obtener información sobre varios aspectos del S.O. mediante ciertos comandos, ejemplos:

  • Versión del kernel Linux: uname -a
  • Por cuanto tiempo ha estado en ejecución el S.O.: uptime
  • Uso de RAM/swap: free -m
  • Uso de sistemas de archivos/discos duros/particiones: df -h
  • Usuarios existentes en el S.O.: cat /etc/passwd
  • Usuarios autentificados ante el S.O.: who o w
  • Dispositivos PCI detectados por el S.O.: lspci
  • Información sobre la configuración de las interfaces de red: ifconfig -a o ip addr show
  • Servidor DNS usado por el S.O.: cat /etc/resolv.conf
  • Gateway, Puerta de Salida o Puerta de Enlace usado por el S.O.: route -n o netstat -r
  • Servicios de red y puertos en espera de conexión: netstat -plutn
  • Conexiones externas de red: netstat -pautn
  • Procesos siendo ejecutados por el usuario alumno: ps aux | egrep '^alumno'

Para la edición de archivos de texto se cuenta con 2 editores de texto, nano y vi, siendo nano el editor de texto con un uso más familiar.

Accediendo de forma remota

Para acceder de forma remota a la máquina virtual podemos hacer uso del servicio de SSH, ya activado por default.

Los programas que nos permitirán acceder desde Windows (anfitrión de la máquina virtual) a GNU/Linux (máquina virtual) serán:

Sigue las siguientes instrucciones para hacer uso de ellos una vez instalados.

WinSCP

  1. Ejecuta WinSCP y ante la ventana IP o nombre del servidor escribe 127.0.0.1 y en Puerto 2222. Opcional, en los campos Usuario y Contraseña escribe los datos del usuario con el que quieres iniciar sesión. Recurda que existen dos para nuestro uso: alumno y root. Finalmente da clic al botón Conectar.

  2. Ante la ventana que nos pregunta ¿Seguir conectado y guardar la clave del servidor? da clic sobre Si. Si en el paso anterior no indicaste los datos del usuario con el que iniciaras sesión sus datos te serán solicitados, ingresalos.

  3. Finalmente, una vez que te hayas autentificado verás una ventana la cual es la interfaz principal de WinSCP, dividida en dos partes, la izquierda muestra tus archivos locales(Windows) mientras que la derecha muestra los archivos remotos(GNU/Linux). Podrás subir (copiar) archivos entre tu equipo local y el remoto si arrastras los iconos de la izquierda a la derecha y de igual forma, podrás descargar (copiar) archivos entre el equipo remoto y tu equipo local si arrastras los iconos de la derecha a la izquierda.

PuTTY

  1. Ejecuta Putty. En la ventana Putty Configuration crearemos una sesión:
  • Dentro de Category > Session, en la opción Host Name (or IP address) escribe 127.0.0.1 y en Port escribe 2222. En Saved Sessions escribe 127.0.0.1:2222.
  • Dentro de Category > Window > Translation en la opción Remote character set selecciona UTF-8
  • Regresa a Category > Session y dale clic al botón Save y finalmente al botón Open.
  1. Ante la ventana PuTTY Security Alert da clic al botón . Acto seguido en la ventana con fondo negro (terminal) nos solicitará el nombre de usuario (alumno o root) con el cual iniciaremos sesión así como su contraseña (password). Ingresamos los datos solicitados y obtendremos una shell desde el equipo remoto. En está terminal podremos ejecutar los comandos propios del S.O. GNU/Linux. Para cerrar sesión ejecutamos el comando exit.

Servidor Web Apache

Es importante la lectura de los siguientes documentos disponibles libremente en Internet:

Opcionalmente puedes encontrar más documentos que te pueden ser útiles:

Recuerda que el Servidor Web Apache (de ahora en adelante simplemente Apache) ya se encuentra instalado en la máquina virtual.

Información sobre Apache en el S.O.

Puesto que Apache es un servicio de sistema trabajaremos con la cuenta de usuario root.

  • El archivo ejecutable de Apache se llama httpd, en otros S.O. se llama apache o apache2.
root@slackware:~# which httpd
/usr/sbin/httpd
  • Para obtener la versión de Apache con la cual estamos trabajando:
root@slackware:~# httpd -v
Server version: Apache/2.4.3 (Unix)
Server built:   Aug 23 2012 11:07:26
  • Para obtener las opciones con las que fue compilado:
root@slackware:~# httpd -V
Server version: Apache/2.4.3 (Unix)
Server built:   Aug 23 2012 11:07:26
Server's Module Magic Number: 20120211:6
Server loaded:  APR 1.4.6, APR-UTIL 1.4.1
Compiled using: APR 1.4.6, APR-UTIL 1.4.1
Architecture:   32-bit
Server MPM:     event
  threaded:     yes (fixed thread count)
    forked:     yes (variable process count)
Server compiled with....
 -D APR_HAS_SENDFILE
 -D APR_HAS_MMAP
 -D APR_HAVE_IPV6 (IPv4-mapped addresses enabled)
 -D APR_USE_SYSVSEM_SERIALIZE
 -D APR_USE_PTHREAD_SERIALIZE
 -D APR_HAS_OTHER_CHILD
 -D AP_HAVE_RELIABLE_PIPED_LOGS
 -D DYNAMIC_MODULE_LIMIT=256
 -D HTTPD_ROOT="/usr"
 -D SUEXEC_BIN="/usr/bin/suexec"
 -D DEFAULT_PIDLOG="/var/run/httpd.pid"
 -D DEFAULT_SCOREBOARD="logs/apache_runtime_status"
 -D DEFAULT_ERRORLOG="logs/error_log"
 -D AP_TYPES_CONFIG_FILE="/etc/httpd/mime.types"
 -D SERVER_CONFIG_FILE="/etc/httpd/httpd.conf"
  • Para obtener su archivo de configuración:
root@slackware:~# httpd -V | grep SERVER_CONFIG_FILE
 -D SERVER_CONFIG_FILE="/etc/httpd/httpd.conf"
  • Para obtener el directorio raíz de los archivos expuestos por Apache al exterior:
root@slackware:~# egrep '^DocumentRoot' /etc/httpd/httpd.conf
DocumentRoot "/srv/httpd/htdocs"
  • Para obtener el estado de ejecución de Apache, en éste caso se encuentra detenido:
root@slackware:~# apachectl status

Looking up localhost
Making HTTP connection to localhost
Alert!: Unable to connect to remote host.

lynx: Can't access startfile http://localhost/server-status

Configuración básica de Apache

Para configurar Apache requerimos editar su archivo de configuración, /etc/httpd/httpd.conf.

RECOMENDACIÓN: Antes de modificar algún archivo del sistema realiza un respaldo del mismo.

Nota que los comentarios en el archivo de configuración de Apache inician con el carácter # y que los comentarios no son tomados en cuenta por Apache.

  1. Localiza la opción #ServerName www.example.com:80 (comentada) y deja la como ServerName slackware.red.virtual:80

  2. Localiza el siguiente extracto de configuración:

#
# DirectoryIndex: sets the file that Apache will serve if a directory
# is requested.
#
<IfModule dir_module>
    DirectoryIndex index.html
</IfModule>

Deja el anterior extracto como:

#
# DirectoryIndex: sets the file that Apache will serve if a directory
# is requested.
#
<IfModule dir_module>
    DirectoryIndex index.php index.html
</IfModule>
  1. Localiza la línea #Include /etc/httpd/mod_php.conf (comentada) y deja la como Include /etc/httpd/mod_php.conf.

  2. Una vez realizadas las anteriores modificaciones podremos comprobar la correcta sintaxis del archivo de configuración de Apache, previa ejecución del mismo.

root@slackware:~# httpd -f /etc/httpd/httpd.conf -t
Syntax OK

Administración del proceso de Apache

De forma manual, por el usuario root:

  • Para iniciar al proceso de Apache: apachectl start
  • Para detenerlo: apachectl stop
  • Para reiniciarlo: apachectl restart

De forma automática cuando iniciemos, reiniciemos o apaguemos la computadora asigna permisos de ejecución al archivo /etc/rc.d/rc.httpd.

root@slackware:~# chmod +x /etc/rc.d/rc.httpd

Opcionalmente, podremos ejecutar de forma directa ese mismo archivo, consiguiendo los mismos efectos que el comando apachectl.

  • Para iniciar al proceso de Apache: /etc/rc.d/rc.httpd start
  • Para detenerlo: /etc/rc.d/rc.httpd stop
  • Para reiniciarlo: /etc/rc.d/rc.httpd restart

Acceso a Apache

Para acceder haremos uso del navegador web Mozilla Firefox, simplemente visita la dirección http://127.0.0.1 o bien http://localhost y obtendrás el mensaje It works! en el navegador web por parte de Apache.

Otra forma, desde el equipo anfitrión (Windows) de la máquina virtual (GNU/Linux) visita con algún navegador web la dirección http://127.0.0.1:8080, obteniendo los mismos resultados.

Prueba de funcionamiento entre Apache y PHP

Como usuario root se crea un directorio al cual el usuario alumno tendrá acceso de escritura, dicho directorio será el lugar en donde el usuario alumno almacene los archivos que conformen su sitio web.

  1. Dentro de /srv/httpd/htdocs creamos el directorio pagina1.
root@slackware:~# mkdir -p /srv/httpd/htdocs/pagina1
root@slackware:~# chown -R alumno:apache /srv/httpd/htdocs/pagina1
  1. Como usuario alumno accedemos a /srv/httpd/htdocs/pagina1 y creamos el archivo con nombre info.php con el siguiente contenido:
<?php
  phpinfo();
?>
  1. Accedemos a http://127.0.0.1/pagina1 (o bien http://127.0.0.1:8080/pagina1 desde el anfitrión) con el navegador web, ante lo cual obtendremos un listado de los archivo existentes dentro del directorio /srv/httpd/htdocs/pagina1, siendo el archivo info.php el único en él.

La página web fue generada automáticamente por Apache al no encontrar el archivo index.php o bien index.html (opción DirectoryIndex en el archivo httpd.conf anteriormente editado).

A partir de ahora podrás trabajar como usuario alumno en el directorio /srv/httpd/htdocs/pagina1. Nota que podrás subir archivos a dicho directorio mediante WinSCP desde el anfitrión.

PostgreSQL

Para activar el servicio de PostgreSQL primero se crea un cluster de PostgreSQL y finalmente se activa el servicio.

Creando el cluster de PostgreSQL

  1. Como usuario root ejecuta el comando: su - postgres -c "initdb -D /var/lib/pgsql/data".
root@slackware:~# su - postgres -c "initdb -D /var/lib/pgsql/data"
The files belonging to this database system will be owned by user "postgres".
This user must also own the server process.

The database cluster will be initialized with locales
  COLLATE:  C
  CTYPE:    es_MX.UTF-8
  MESSAGES: es_MX.UTF-8
  MONETARY: es_MX.UTF-8
  NUMERIC:  es_MX.UTF-8
  TIME:     es_MX.UTF-8
The default database encoding has accordingly been set to "UTF8".
The default text search configuration will be set to "spanish".

fixing permissions on existing directory /var/lib/pgsql/data ... ok
creating subdirectories ... ok
selecting default max_connections ... 100
selecting default shared_buffers ... 24MB
creating configuration files ... ok
creating template1 database in /var/lib/pgsql/data/base/1 ... ok
initializing pg_authid ... ok
initializing dependencies ... ok
creating system views ... ok
loading system objects' descriptions ... ok
creating collations ... ok
creating conversions ... ok
creating dictionaries ... ok
setting privileges on built-in objects ... ok
creating information schema ... ok
loading PL/pgSQL server-side language ... ok
vacuuming database template1 ... ok
copying template1 to template0 ... ok
copying template1 to postgres ... ok

WARNING: enabling "trust" authentication for local connections
You can change this by editing pg_hba.conf or using the option -A, or
--auth-local and --auth-host, the next time you run initdb.

Success. You can now start the database server using:

    postgres -D /var/lib/pgsql/data
or
    pg_ctl -D /var/lib/pgsql/data -l logfile start

root@slackware:~# 

Dentro de /var/lib/pgsql/data/ encontraremos los siguientes archivos:

root@slackware:~# tree -L 1 /var/lib/pgsql/data/
/var/lib/pgsql/data/
├── PG_VERSION
├── base
├── global
├── pg_clog
├── pg_hba.conf
├── pg_ident.conf
├── pg_multixact
├── pg_notify
├── pg_serial
├── pg_snapshots
├── pg_stat_tmp
├── pg_subtrans
├── pg_tblspc
├── pg_twophase
├── pg_xlog
└── postgresql.conf

12 directories, 4 files

Los archivos que nos serán de interes son:

  • postgresql.conf: Archivo de configuración de PostgreSQL.
  • pg_hba.conf: Archivo de configuración para la autentificación de clientes.

Configuración del cluster de PostgreSQL

Requerimos conexión de forma remota a PostgreSQL así como una cuenta de usuario para trabajar con bases de datos.

  1. Editamos el archivo postgresql.conf para esperar conexiones en todas las interfaces de red que tengamos disponibles:

Localizamos la línea con la opción #listen_addresses = 'localhost' (comentada por default) y la dejamos como listen_addresses = '*'

  1. Agregamos la siguiente línea al final del archivo pg_hba.conf:
host    all             programador           all                     md5

Administración del proceso de PostgreSQL

Utilizaremos el script /etc/rc.d/rc.postgresql para iniciar, detener o reiniciar al proceso de PostreSQL

  1. Se asignan permisos de ejecución: chmod +x /etc/rc.d/rc.postgresql
  2. Se inicia el proceso de PostgreSQL: /etc/rc.d/rc.postgresql start.
  • Para detenerlo: /etc/rc.d/rc.postgresql stop
  • Para reiniciarlo: /etc/rc.d/rc.postgresql restart

Podemos verificar la ejecución de PostgreSQL con el comando netstat -plutn

root@slackware:~# /etc/rc.d/rc.postgresql start
Starting PostgreSQL
waiting for server to start.... done
server started
root@slackware:~# netstat -plutn
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
tcp        0      0 0.0.0.0:6000            0.0.0.0:*               LISTEN      1540/X
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      1259/sshd
tcp        0      0 0.0.0.0:5432            0.0.0.0:*               LISTEN      2752/postgres
tcp6       0      0 :::6000                 :::*                    LISTEN      1540/X
tcp6       0      0 :::80                   :::*                    LISTEN      1407/httpd
tcp6       0      0 :::22                   :::*                    LISTEN      1259/sshd
tcp6       0      0 :::5432                 :::*                    LISTEN      2752/postgres

Finalmente, agrega las siguientes líneas al archivo /etc/rc.d/rc.local:

if [ -x /etc/rc.d/rc.postgresql ]; then
  /etc/rc.d/rc.postgresql start
fi

Y al archivo /etc/rc.d/rc.local_shutdown las siguientes lineas:

if [ -x /etc/rc.d/rc.postgresql ]; then
  /etc/rc.d/rc.postgresql stop
fi

Si el archivo /etc/rc.d/rc.local_shutdown no existe, puedes crearlo con el comando touch /etc/rc.d/rc.local_shutdown y asignale los permisos de ejecución con chmod +x /etc/rc.d/rc.local_shutdown

Creación del usuario programador dentro de PostgreSQL

  1. Crearemos la cuenta de usuario programador (usada en el archivo pg_hba.conf).
root@slackware:~# su postgres -c "createuser -d -P -e -W programador"
Enter password for new role:
Enter it again:
Password:

Como ejemplo, la contraseña asignada a esté usuario fue 12345.

Acceso local a PostgreSQL mediante psql

  1. Desde la línea de comandos, ya sea como usario root o alumno podemos iniciar una sesión en PostgreSQL con la cuenta programador:
alumno@slackware:~# psql -U programador postgres
psql (9.2.1)
Type "help" for help.

postgres=> select version();
                                      version                                      
-----------------------------------------------------------------------------------
 PostgreSQL 9.2.1 on i486-slackware-linux-gnu, compiled by gcc (GCC) 4.7.1, 32-bit
(1 row)
postgres=> \q
alumno@slackware:~#

Creando una base de datos como ejemplo

  1. Crea la base de datos prueba:
root@slackware:~# su - postgres -c "createdb -O programador prueba"

Puedes obtener una lista de las bases de datos de la siguiente forma:

alumno@slackware:~$ PAGER=cat psql -U postgres postgres -l
                                 List of databases
   Name    |    Owner    | Encoding | Collate |    Ctype    |   Access privileges   
-----------+-------------+----------+---------+-------------+-----------------------
 postgres  | postgres    | UTF8     | C       | es_MX.UTF-8 | 
 prueba    | programador | UTF8     | C       | es_MX.UTF-8 | 
 template0 | postgres    | UTF8     | C       | es_MX.UTF-8 | =c/postgres          +
            |             |          |         |             | postgres=CTc/postgres
 template1 | postgres    | UTF8     | C       | es_MX.UTF-8 | =c/postgres          +
            |             |          |         |             | postgres=CTc/postgres
(4 rows)
  1. Como usuario alumno captura lo siguiente en un archivo con nombre schema-biblioteca.sql:
create schema biblioteca;
set search_path to biblioteca, public;

drop table if exists ejemplar;
drop table if exists libro_autor;
drop table if exists autor;
drop table if exists libro;

create table libro
(	isbn varchar (13) primary key,
	titulo_libro varchar (100) not null
);

create table autor
(	id_autor varchar(6) primary key,
	nombre_autor varchar (80) not null
);

create table libro_autor
(	isbn varchar(13) references libro (isbn),
	id_autor varchar(6) references autor (id_autor)
);

create table ejemplar
(	clave_ejemplar varchar(2) not null,
	conservacion_ejemplar varchar (30),
	isbn varchar(13) references libro (isbn)
);

\ir datos_biblioteca.sql
  1. De igual forma, captura lo siguiente en un archivo con nombre datos-biblioteca.sql:
/* libro */
INSERT INTO libro (isbn,titulo_libro) VALUES ('6987714554','Ridiculus mus. Proin vel');
INSERT INTO libro (isbn,titulo_libro) VALUES ('5869985748','Cras');
INSERT INTO libro (isbn,titulo_libro) VALUES ('6874596184','Consectetuer, cursus et, magna.');
INSERT INTO libro (isbn,titulo_libro) VALUES ('5221695172','Pede, malesuada vel, venenatis vel,');
INSERT INTO libro (isbn,titulo_libro) VALUES ('1534359937','At arcu.');
INSERT INTO libro (isbn,titulo_libro) VALUES ('6875362773','Sem, consequat nec, mollis');
INSERT INTO libro (isbn,titulo_libro) VALUES ('2339525568','Sem elit, pharetra ut, pharetra');
INSERT INTO libro (isbn,titulo_libro) VALUES ('3886623311','Pellentesque ultricies dignissim lacus. Aliquam');
INSERT INTO libro (isbn,titulo_libro) VALUES ('6924296428','Lacinia orci,');
INSERT INTO libro (isbn,titulo_libro) VALUES ('1827617995','Eget nisi dictum');

/* autor */
INSERT INTO autor (id_autor,nombre_autor) VALUES ('C6G8D7','Mark Hurst Montoya');
INSERT INTO autor (id_autor,nombre_autor) VALUES ('S8I4Z6','Sean Thomas Thomas');
INSERT INTO autor (id_autor,nombre_autor) VALUES ('G3F4I7','Tobias Velez Willis');
INSERT INTO autor (id_autor,nombre_autor) VALUES ('D7Z7U6','Alea Mitchell Ryan');
INSERT INTO autor (id_autor,nombre_autor) VALUES ('S3G4Z2','Morgan Head Camacho');
INSERT INTO autor (id_autor,nombre_autor) VALUES ('I3A2M3','Idola Shaw Melton');
INSERT INTO autor (id_autor,nombre_autor) VALUES ('D7O2W3','Bert Morrow Aguilar');
INSERT INTO autor (id_autor,nombre_autor) VALUES ('T7Q6J9','Sandra Peterson Tucker');
INSERT INTO autor (id_autor,nombre_autor) VALUES ('Z4I1S5','Burke Watts Baird');
INSERT INTO autor (id_autor,nombre_autor) VALUES ('K4W1N6','Larissa Melendez Keller');

/* libro_autor */
INSERT INTO libro_autor (isbn,id_autor) VALUES ('6987714554','K4W1N6');
INSERT INTO libro_autor (isbn,id_autor) VALUES ('5869985748','Z4I1S5');
INSERT INTO libro_autor (isbn,id_autor) VALUES ('6874596184','T7Q6J9');
INSERT INTO libro_autor (isbn,id_autor) VALUES ('5221695172','D7O2W3');
INSERT INTO libro_autor (isbn,id_autor) VALUES ('1534359937','I3A2M3');
INSERT INTO libro_autor (isbn,id_autor) VALUES ('6875362773','S3G4Z2');
INSERT INTO libro_autor (isbn,id_autor) VALUES ('2339525568','D7Z7U6');
INSERT INTO libro_autor (isbn,id_autor) VALUES ('3886623311','G3F4I7');
INSERT INTO libro_autor (isbn,id_autor) VALUES ('6924296428','S8I4Z6');
INSERT INTO libro_autor (isbn,id_autor) VALUES ('1827617995','C6G8D7');
INSERT INTO libro_autor (isbn,id_autor) VALUES ('6987714554','Z4I1S5');
INSERT INTO libro_autor (isbn,id_autor) VALUES ('6987714554','I3A2M3');
INSERT INTO libro_autor (isbn,id_autor) VALUES ('5221695172','G3F4I7');
INSERT INTO libro_autor (isbn,id_autor) VALUES ('5221695172','C6G8D7');
INSERT INTO libro_autor (isbn,id_autor) VALUES ('2339525568','T7Q6J9');
INSERT INTO libro_autor (isbn,id_autor) VALUES ('5869985748','I3A2M3');
INSERT INTO libro_autor (isbn,id_autor) VALUES ('1534359937','S8I4Z6');
INSERT INTO libro_autor (isbn,id_autor) VALUES ('1534359937','K4W1N6');
INSERT INTO libro_autor (isbn,id_autor) VALUES ('1534359937','G3F4I7');
INSERT INTO libro_autor (isbn,id_autor) VALUES ('3886623311','Z4I1S5');

/* ejemplar */
INSERT INTO ejemplar (clave_ejemplar, conservacion_ejemplar, isbn) VALUES ('1','Buena','6987714554');
INSERT INTO ejemplar (clave_ejemplar, conservacion_ejemplar, isbn) VALUES ('2','Con hojas rayadas','6987714554');
INSERT INTO ejemplar (clave_ejemplar, conservacion_ejemplar, isbn) VALUES ('1','Faltan hojas','6874596184');
INSERT INTO ejemplar (clave_ejemplar, conservacion_ejemplar, isbn) VALUES ('1','Pesima','5221695172');
INSERT INTO ejemplar (clave_ejemplar, conservacion_ejemplar, isbn) VALUES ('1','Buena','1534359937');
INSERT INTO ejemplar (clave_ejemplar, conservacion_ejemplar, isbn) VALUES ('1','Buena','6875362773');
INSERT INTO ejemplar (clave_ejemplar, conservacion_ejemplar, isbn) VALUES ('2','Pesima','6875362773');
INSERT INTO ejemplar (clave_ejemplar, conservacion_ejemplar, isbn) VALUES ('1','Faltan hojas','2339525568');
INSERT INTO ejemplar (clave_ejemplar, conservacion_ejemplar, isbn) VALUES ('1','Sin portadas','2339525568');
  1. Mediante psql ejecuta el archivo schema-biblioteca.sql:

Nota que tanto schema-biblioteca.sql y datos-biblioteca.sql se encuentran en el mismo directorio y como propietario de ellos el usuario alumno.

alumno@slackware:~$ psql -a -d prueba -U programador -W -f schema_biblioteca.sql

Si todo fue bien el schema biblioteca ha sido creado dentro de la base de datos prueba.

Acceso remoto a PostgreSQL mediante pgAdmin

Descarga e instala la última versión de pgAdmin desde http://www.pgadmin.org/download/windows.php

Para acceder desde el anfitrión (Windows) al invitado (GNU/Linux, máquina virtual) debemos agregar una regla de reenvío de puerto en VirtualBox.

  1. En VirtualBox nos dirigimos a la configuración de la máquina virtual. Configuración > Red > Adaptador 1 > Reenvío de puertos.

  2. En la ventana Reglas de reenvío de puertos damos clic sobre el botón Agregar nueva regla (Ins) (con una cruz verde encima). En el nuevo registro ( Rule 3 ) que aparece en la tabla modificamos la columna Puerto anfitrión, escribimos 5454 y en la columna Puerto invitado escribimos 5432, finalmente damos clic en Aceptar y una vez más Aceptar.

  3. Inicia pgAdmin y accedemos a File > Add Server..., en la ventana New Server Registration introducimos los siguientes datos:

  • Name: 127.0.0.1:5454
  • Host: 127.0.0.1
  • Port: 5454
  • Maintenance DB: postgres
  • Username: programador
  • Password: 12345

Da clic sobre el botón OK e iniciarás una sesión en PostgreSQL dentro de la máquina virtual.

Prueba de funcionamiento entre PostgreSQL y PHP

Como usuario alumno crearas un script de PHP el cual realizará una consulta a PostgreSQL.

  1. Accede a /srv/httpd/htdocs/pagina1 y crea el archivo pg.php con el siguiente contenido:
<!DOCTYPE html>
<html>
<head><title>Prueba de conexión PHP - PostgreSQL</title></head>
<body>
<?php
// Basado en http://www.php.net/manual/es/pgsql.examples-basic.php

// Datos de conexión.
$servidorbd = "localhost";
$nombrebd = "postgres";
$usuariobd= "programador";
$contraseniabd = "12345";

$dbconn = pg_connect("host=$servidorbd dbname=$nombrebd user=$usuariobd password=$contraseniabd")
or die('No se ha podido conectar: ' . pg_last_error());

// Query a ejecutar.
$query = 'select version()';

// Ejecución del query
$result = pg_query($query) or die('La consulta fallo: ' . pg_last_error());
?>

<!-- El resultado será mostrado en una tabla HTML -->
<table><tr>

	<?php
	while ($line = pg_fetch_array($result, null, PGSQL_ASSOC)) {
			foreach ($line as $col_value) {
	?>
	<td><?php echo trim($col_value); ?></td>
	<?php
			}
	}
	?>

</tr></table>
<?php

// Liberando el conjunto de resultados
pg_free_result($result);

// Cerrando la conexión
pg_close($dbconn);
?>
</body>
</html>
  1. Con el navegador web accede a http://127.0.0.1/pagina1/pg.php. Obtendrás como resultado una página web que despliega el texto PostgreSQL 9.2.1 on i486-slackware-linux-gnu, compiled by gcc (GCC) 4.7.1, 32-bit. Revisa el código HTML de dicha página, observa y comparalo con el código del archivo pg.php.

La documentación oficial del modulo de PostgreSQL para PHP se encuentra disponible en http://php.net/manual/es/book.pgsql.php, así como la lista de funciones http://www.php.net/manual/es/ref.pgsql.php

VirtualHost en Servidor Web Apache

Se creará un Host Virtual (VirtualHost) en Apache basado en el Nombre de Dominio frame.works.com, de tal forma que cuando visitemos con el navegador web el dominio frame.works.com accedamos a Apache.

  1. Modifica el archivos de configuración de Apache.
  • Localiza la línea #Include /etc/httpd/extra/httpd-vhosts.conf (comentada) y deja la como Include /etc/httpd/extra/httpd-vhosts.conf.
  • Localiza la línea #LoadModule rewrite_module lib/httpd/modules/mod_rewrite.so (comentada) y dejala como LoadModule rewrite_module lib/httpd/modules/mod_rewrite.so
  1. Renombra el archivo /etc/httpd/extra/httpd-vhosts.conf y crea uno nuevo vacío:
root@slackware:~# mv /etc/httpd/extra/httpd-vhosts.conf /etc/httpd/extra/httpd-vhosts.conf.orig
root@slackware:~# touch /etc/httpd/extra/httpd-vhosts.conf
  1. Agrega el siguiente contenido a /etc/httpd/extra/httpd-vhosts.conf
<VirtualHost *:80>
    DocumentRoot "/srv/httpd/htdocs"
    ServerName localhost
    ErrorLog "/var/log/httpd/error_log"
    CustomLog "/var/log/httpd/access_log" common
</VirtualHost>

<VirtualHost *:80>
    DocumentRoot "/srv/httpd/htdocs/frame.works.com"
    ServerName frame.works.com
    ErrorLog "/var/log/httpd/frame.works.com/error_log"
    CustomLog "/var/log/httpd/frame.works.com/access_log" common
    Options FollowSymLinks
    RewriteEngine on
    <Directory "/srv/httpd/htdocs/frame.works.com">
        AllowOverride FileInfo
    </Directory>
</VirtualHost>
  1. Crea los directorios requeridos según la configuración para VirtualHost:
root@slackware:~# mkdir -p /srv/httpd/htdocs/frame.works.com
root@slackware:~# mkdir -p /var/log/httpd/frame.works.com
  1. Asigna como propietario del directorio /srv/httpd/htdocs/frame.works.com al usuario alumno
root@slackware:~# chown -R alumno /srv/httpd/htdocs/frame.works.com
  1. Agrega una nueva entrada en el archivo /etc/hosts para relacionar la actual dirección IP de la máquina virtual con el nombre de dominio frame.works.com:
  • Obten la dirección IP de la interfaz de red eth0 (en mi caso es 10.0.2.15):
root@slackware:~# ifconfig eth0 | grep 'inet '
        inet 10.0.2.15  netmask 255.255.255.0  broadcast 10.0.2.255
  • Agrega la siguiente línea al final del archivo /etc/hosts:
10.0.2.15    frame.works.com
  • Realiza una prueba enviando un ping al dominio frame.works.com:
root@slackware:~# ping frame.works.com
PING frame.works.com (10.0.2.15) 56(84) bytes of data.
64 bytes from frame.works.com (10.0.2.15): icmp_req=1 ttl=64 time=0.122 ms
64 bytes from frame.works.com (10.0.2.15): icmp_req=2 ttl=64 time=0.123 ms
64 bytes from frame.works.com (10.0.2.15): icmp_req=3 ttl=64 time=0.164 ms
64 bytes from frame.works.com (10.0.2.15): icmp_req=4 ttl=64 time=0.110 ms

--- frame.works.com ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 2999ms
rtt min/avg/max/mdev = 0.110/0.129/0.164/0.024 ms
  1. Corrobora la correcta configuración de Apache y VirtualHost:
root@slackware:~# httpd -S
VirtualHost configuration:
*:80                   is a NameVirtualHost
         default server localhost (/etc/httpd/extra/httpd-vhosts.conf:1)
         port 80 namevhost localhost (/etc/httpd/extra/httpd-vhosts.conf:1)
         port 80 namevhost localhost (/etc/httpd/extra/httpd-vhosts.conf:1)
         port 80 namevhost frame.works.com (/etc/httpd/extra/httpd-vhosts.conf:8)
         port 80 namevhost frame.works.com (/etc/httpd/extra/httpd-vhosts.conf:8)
ServerRoot: "/usr"
Main DocumentRoot: "/srv/httpd/htdocs"
Main ErrorLog: "/var/log/httpd/error_log"
Mutex rewrite-map: using_defaults
Mutex default: dir="/var/run/" mechanism=default 
PidFile: "/var/run/httpd.pid"
Define: DUMP_VHOSTS
Define: DUMP_RUN_CFG
User: name="apache" id=80
Group: name="apache" id=80
  1. Reinicia a Apache para que haga uso de su nueva configuración: /etc/rc.d/rc.httpd restart

  2. Finalmente ingresa con el navegador web a la dirección http://frame.works.com. Veremos el contenido del directorio /srv/httpd/htdocs/frame.works.com. Dicho directorio tiene como propietario al usuario alumno por lo que podrás crear/subir archivos en él.

Acceso desde el anfitrión al dominio frame.works.com

En el anfitrión (Windows) busca un archivo con nombre hosts (muy similar a /etc/hosts de GNU/Linux), posiblemente lo encuentres en el directorio C:\Windows\System32\drivers\etc, y agrega al final la línea 127.0.0.1 frame.works.com.

Finalmente accede con un navegador web desde el anfitrión a http://frame.works.com:8080

PostgreSQL, PHP, HTML y CSS

Dentro del directorio /srv/httpd/htdocs/frame.works.com y como usuario alumno crea los siguientes archivos.

01-libros.php

<!DOCTYPE html>
<head>
	<meta charset="UTF-8">
	<title>Listado de Libros</title>
	<style type="text/css">
		<!-- No se hace uso de CSS -->
	</style>
</head>
<?php
	$servidorbd = "localhost";
	$nombrebd = "prueba";
	$usuariobd= "programador";
	$contraseniabd = "12345";

	$dbconn = pg_connect("host=$servidorbd dbname=$nombrebd user=$usuariobd password=$contraseniabd")
	or die('No se ha podido conectar: ' . pg_last_error());

	$query = 'select isbn, titulo_libro from biblioteca.libro';

	$resultado = pg_query($query) or die('La consulta fallo: ' . pg_last_error());
?>

<body>
<table>
	<caption>Listado de Libros</caption>
	<thead>
		<tr>
			<th>ISBN</th>
			<th>Titulo de Libro</th>
		</tr>
	</thead>
	<tbody>

	<?php
	while ($tupla = pg_fetch_array($resultado, null, PGSQL_ASSOC)) {
	?>
		<tr>
	<?php
		foreach ($tupla as $atributo) {
	?>
			<td><?php echo trim($atributo); ?></td>
	<?php
		}
	?>
		</tr>
	<?php
	}

	pg_free_result($result);
	pg_close($dbconn);
	?>

	</tbody>
</table>
</body>
</html>

02-autores.php

<!DOCTYPE html>
<head>
	<meta charset="UTF-8">
	<title>Listado de Autores</title>
	<style type="text/css">
		<!-- No se hace uso de CSS -->
	</style>
</head>
<?php
	$servidorbd = "localhost";
	$nombrebd = "prueba";
	$usuariobd= "programador";
	$contraseniabd = "12345";

	$dbconn = pg_connect("host=$servidorbd dbname=$nombrebd user=$usuariobd password=$contraseniabd")
	or die('No se ha podido conectar: ' . pg_last_error());

	$query = 'select id_autor, nombre_autor from biblioteca.autor';

	$resultado = pg_query($query) or die('La consulta fallo: ' . pg_last_error());
?>

<body>
<table>
	<caption>Listado de Autores</caption>
	<thead>
		<tr>
			<th>ID</th>
			<th>Autor</th>
		</tr>
	</thead>
	<tbody>

	<?php
	while ($tupla = pg_fetch_array($resultado, null, PGSQL_ASSOC)) {
	?>
		<tr>
	<?php
		foreach ($tupla as $atributo) {
	?>
			<td><?php echo trim($atributo); ?></td>
	<?php
		}
	?>
		</tr>
	<?php
	}

	pg_free_result($result);
	pg_close($dbconn);
	?>

	</tbody>
</table>
</body>
</html>

03-libros-autores.php

<!DOCTYPE html>
<head>
	<meta charset="UTF-8">
	<title>Listado de Libros y Autores</title>
	<style type="text/css">
		<!-- No se hace uso de CSS -->
	</style>
</head>
<body>
<?php
	$servidorbd = "localhost";
	$nombrebd = "prueba";
	$usuariobd= "programador";
	$contraseniabd = "12345";

	$dbconn = pg_connect("host=$servidorbd dbname=$nombrebd user=$usuariobd password=$contraseniabd")
	or die('No se ha podido conectar: ' . pg_last_error());

	$query = 'select L.isbn, L.titulo_libro, A.id_autor,A.nombre_autor
		from biblioteca.libro as L
		inner join biblioteca.libro_autor as LA
			on (L.isbn = LA.isbn)
		inner join biblioteca.autor as A
			on (LA.id_autor = A.id_autor)
		group by L.isbn, A.id_autor
		order by L.titulo_libro, A.nombre_autor;';

	$resultado = pg_query($query) or die('La consulta fallo: ' . pg_last_error());
?>
<table>
	<caption>Listado de Libros y Autores</caption>
	<thead>
		<tr>
			<th>ISBN</th>
			<th>Titulo de Libro</th>
			<th>ID</th>
			<th>Nombre de Autor</th>
		</tr>
	</thead>
	<tbody>

	<?php
	while ($tupla = pg_fetch_array($resultado, null, PGSQL_ASSOC)) {
	?>
		<tr>
	<?php
		foreach ($tupla as $atributo) {
	?>
			<td><?php echo trim($atributo); ?></td>
	<?php
		}
	?>
		</tr>
	<?php
	}
	?>

	</tbody>
</table>

<?php
	$query = 'select isbn, titulo_libro
		from biblioteca.libro
		where isbn not in (select isbn from biblioteca.libro_autor);';

	$resultado = pg_query($query) or die('La consulta fallo: ' . pg_last_error());
?>
<table>
	<caption>Listado de Libros sin Autores asociados</caption>
	<thead>
		<tr>
			<th>ISBN</th>
			<th>Titulo de Libro</th>
		</tr>
	</thead>
	<tbody>

	<?php
	while ($tupla = pg_fetch_array($resultado, null, PGSQL_ASSOC)) {
	?>
		<tr>
	<?php
		foreach ($tupla as $atributo) {
	?>
			<td><?php echo trim($atributo); ?></td>
	<?php
		}
	?>
		</tr>
	<?php
	}
	?>

	</tbody>
</table>

<?php
	pg_free_result($result);
	pg_close($dbconn);
?>
</body>
</html>

04-informacion-libro.php

<!DOCTYPE html>
<head>
	<meta charset="UTF-8">
	<title>Listado de Libros</title>
	<style type="text/css">
		<!-- No se hace uso de CSS -->
	</style>
</head>
<body>
<?php
	if (empty($_GET['isbn'])) {
?>
	<p>Error, no se ha indicado el ISBN del libro</p>
	<p>
		La URL debe ser, como ejemplo:
		http://frame.works.com/04-informacion-libro.php?isbn=5869985748
	</p>
<?php
	} else {
		$servidorbd = "localhost";
		$nombrebd = "prueba";
		$usuariobd= "programador";
		$contraseniabd = "12345";
	
		$dbconn = pg_connect("host=$servidorbd dbname=$nombrebd user=$usuariobd password=$contraseniabd")
		or die('No se ha podido conectar: ' . pg_last_error());
	
		$query = "select L.isbn, L.titulo_libro, A.id_autor,A.nombre_autor
			from biblioteca.libro as L inner join biblioteca.libro_autor as LA
				on (L.isbn = '".$_GET['isbn']."' and L.isbn = LA.isbn)
			inner join biblioteca.autor as A
				on (LA.id_autor = A.id_autor);";
	
		$resultado = pg_query($query) or die('La consulta fallo: ' . pg_last_error());

		if (pg_num_rows($resultado) == 0) {
?>
	<p>No se ha encontrado algun libro con dicho ISBN</p>
<?php
		} else {
?>

<table>
	<caption>Informacion de Libro</caption>
	<thead>
		<tr>
			<th>ISBN</th>
	 		<th>Titulo de Libro</th>
			<th>ID</th>
			<th>Nombre de Autor</th>
		</tr>
	</thead>
	<tbody>

	<?php
	while ($tupla = pg_fetch_array($resultado, null, PGSQL_ASSOC)) {
	?>
		<tr>
	<?php
		foreach ($tupla as $atributo) {
	?>
			<td><?php echo trim($atributo); ?></td>
	<?php
		}
	?>
		</tr>
	<?php
	}

	pg_free_result($result);
	pg_close($dbconn);
	?>

	</tbody>
</table>
<?php
		}
	}
?>

</body>
</html>

05-lista-libros.php

<!DOCTYPE html>
<head>
	<meta charset="UTF-8">
	<title>Listado de Libros</title>
	<style type="text/css">
		<!-- No se hace uso de CSS -->
	</style>
</head>
<?php
	$servidorbd = "localhost";
	$nombrebd = "prueba";
	$usuariobd= "programador";
	$contraseniabd = "12345";

	$dbconn = pg_connect("host=$servidorbd dbname=$nombrebd user=$usuariobd password=$contraseniabd")
	or die('No se ha podido conectar: ' . pg_last_error());

	$query = 'select isbn, titulo_libro from biblioteca.libro';

	$resultado = pg_query($query) or die('La consulta fallo: ' . pg_last_error());
?>

<body>
<table>
	<caption>Listado de Libros</caption>
	<thead>
		<tr>
			<th>#</th>
			<th>ISBN</th>
			<th>Titulo de Libro</th>
			<th>Ver</th>
		</tr>
	</thead>
	<tbody>

	<?php
	$contador = 1;
	while ($tupla = pg_fetch_array($resultado, null, PGSQL_ASSOC)) {
		$isbn = $tupla['isbn'];
	?>
		<tr>
			<td>
				<?php echo $contador++; ?>
			</td>
	<?php
		foreach ($tupla as $atributo) {
	?>
			<td><?php echo trim($atributo); ?></td>
	<?php
		}
	?>
			<td>
				<a href="04-informacion-libro.php?isbn=<?php echo $isbn; ?>">Autores</a>
			</td>
		</tr>
	<?php
	}

	pg_free_result($result);
	pg_close($dbconn);
	?>

	</tbody>
</table>
</body>
</html>

06-tabla-estilo.php

<!DOCTYPE html>
<head>
	<meta charset="UTF-8">
	<title>Listado de Libros</title>
	<link rel="stylesheet" href="estilo_tabla1.css" type="text/css" />
	<!--
	<link rel="stylesheet" href="estilo_tabla2.css" type="text/css" />
	-->
</head>
<?php
	$servidorbd = "localhost";
	$nombrebd = "prueba";
	$usuariobd= "programador";
	$contraseniabd = "12345";

	$dbconn = pg_connect("host=$servidorbd dbname=$nombrebd user=$usuariobd password=$contraseniabd")
	or die('No se ha podido conectar: ' . pg_last_error());

	$query = 'select isbn, titulo_libro from biblioteca.libro';

	$resultado = pg_query($query) or die('La consulta fallo: ' . pg_last_error());
?>

<body>
<table>
	<caption>Listado de Libros</caption>
	<thead>
		<tr>
			<th>#</th>
			<th>ISBN</th>
			<th>Titulo de Libro</th>
			<th>Ver</th>
		</tr>
	</thead>
	<tbody>

	<?php
	$contador = 1;
	while ($tupla = pg_fetch_array($resultado, null, PGSQL_ASSOC)) {
		$isbn = $tupla['isbn'];
	?>
		<tr>
			<td>
				<?php echo $contador++; ?>
			</td>
	<?php
		foreach ($tupla as $atributo) {
	?>
			<td><?php echo trim($atributo); ?></td>
	<?php
		}
	?>
			<td>
				<a href="04-informacion-libro.php?isbn=<?php echo $isbn; ?>">Autores</a>
			</td>
		</tr>
	<?php
	}

	pg_free_result($result);
	pg_close($dbconn);
	?>

	</tbody>
</table>
</body>
</html>

estilo_tabla1.css

body {
	font: normal 11px auto verdana, arial, helvetica, sans-serif;
	color: #4f6b72;
	background: #e6eae9;
}

a {
	color: #c75f3e;
	text-decoration: none;  
}

a:hover {  
	color: #aaaaaa;
	text-decoration: none;  
}

table {
	width: 700px;
	padding: 0;
	margin: 0;
}

caption {
	padding: 0 0 5px 0;
	width: 700px;
	font: italic 11px verdana, arial, helvetica, sans-serif;
	text-align: right;
}

th {
	font: bold 11px verdana, arial, helvetica, sans-serif;
	color: #4f6b72;
	border-right: 1px solid #c1dad7;
	border-bottom: 1px solid #c1dad7;
	border-top: 1px solid #c1dad7;
	letter-spacing: 2px;
	text-transform: uppercase;
	text-align: left;
	padding: 6px 6px 6px 12px;
	background: #cae8ea;
}

td {
	border-right: 1px solid #c1dad7;
	border-bottom: 1px solid #c1dad7;
	background: #fff;
	padding: 6px 6px 6px 12px;
	color: #4f6b72;
}

estilo_tabla2.css

body {
	background: #888888;
}

table {
	border-collapse: collapse;
	border: 1px solid #38160c;
	font: normal 11px verdana, arial, helvetica, sans-serif;
	color: #f6ecf0;
	background: #641b35;
	width: 960px;
	}
caption {
	text-align: left;
	font: normal 11px verdana, arial, helvetica, sans-serif;
	background: transparent;
	}
td, th {
	border: 1px dashed #b85a7c;
	padding: .8em;
	color: #f6ecf0;
	}
thead th, tfoot th {
	font: bold 11px verdana, arial, helvetica, sans-serif;
	border: 1px solid #a85070;;
	text-align: left;
	background: #38160c;
	color: #f6ecf0;
	padding-top:6px;
	}
tbody td a {
	background: transparent;
	text-decoration: none;
	color: #f6ecf0;
	}
tbody td a:hover {
	background: transparent;
	color: #ffffff;
	}
tbody th a {
	font: normal 11px verdana, arial, helvetica, sans-serif;
	background: transparent;
	text-decoration: none;
	font-weight:normal;
	color: #f6ecf0;
	}
tbody th a:hover {
	background: transparent;
	color: #ffffff;
	}
tbody th, tbody td {
	vertical-align: top;
	text-align: left;
	}
tfoot td {
	border: 1px solid #38160c;
	background: #38160c;
	padding-top:6px;
	}
tbody tr:hover {
	background: #51152a;
	}
tbody tr:hover th {
	background: #51152a;
	}

Una vez que hayas capturado dichos archivos accede con el navegador web Firefox a http://frame.works.com. Obtendrás una lista de vínculos a los anteriores archivos, por ejemplo http://frame.works.com/01-libros.php. De igual forma desde el anfitrión podrás acceder a http://frame.works.com:8080.

Estudia el código en los scripts de PHP y el código HTML generado por ellos.

Trabajando con Git y Bitbucket

Documentación

Para las siguientes instrucciones te será de gran ayuda la lectura de los siguientes enlaces.

Pon especial atención a los sistemas de control de versiones distribuidos y al flujo de trabajo centralizado.

De igual forma puedes encontrar los siguientes videos en línea:

Bitbucket

  1. Accede a https://bitbucket.org/account/signup/

  2. En el formulario "Sign up for free" rellena los campos tomando en cuenta lo siguiente:

  • Account type: Selecciona Individual
  • First name: Tu nombre
  • Last name: Tus apellidos
  • Username: Forma tu nombre de usuario siguiendo el patrón ApellidoPaternoApellidoMaternoNombre, por ejemplo:
  • Email: Tu correo electrónico, por ejemplo [email protected]
  • Password y Password (again): La contraseña que deseas usar para tu cuenta de usuario en Bitbucket. Una vez rellenado el formulario da clic en Sign up e inmediatamente serás enviado a tu Dashboard.
  1. En tu correo electrónico llegará un correo de parte de Bitbucket solicitando que confirmes tu correo electrónico, visita la URL que te indican en dicho correo. Nota: Para volver a ingresar a tu cuenta de Bitbucket accede al formulario de Log in en https://bitbucket.org/account/signin/?next=/ e ingresa tu Username y Password para finalmente dar clic en Log in

  2. Mientras estás en tu sesión de Bitbucket accede a mi repositorio https://bitbucket.org/HernandezBlasAntonio/crudbiblioteca Navega por dicha página web, pon atención a las secciones:

    • Overview: muestra una vista general del contenido e historial del repositorio.
    • Source: muestra en forma de un explorador de archivos el código fuente disponible en el repositorio, desde directorios, scripts de php, archivos html, css, etc.
    • Commits: muestra una lista, en forma cronológica, de los commits o modificaciones registradas sobre el repositorio, lo que incluye datos sobre el quien, cuando y en que archivos realizó modificaciones. Un aspecto a notar es que cada commit lleva un mensaje detallando las modificaciones de tal forma que otra persona pueda entender la razón o justificación de dichos cambios.
  3. Realiza un fork de mi repositorio https://bitbucket.org/HernandezBlasAntonio/crudbiblioteca Da clic sobre el botón Fork ubicado en la parte superior de dicha página, lo cual te dirigirá al formulario Fork HernandezBlasAntonio / crudbiblioteca y en dicho formulario solo edita el campo Description indicando el porque estás haciendo el fork de mi repositorio, se creativo al respecto. Finalmente da clic al botón Fork repository.

  4. Si todo ha salido bien en el anterior punto serás automáticamente dirigido a tu repositorio, esto es, si tu Username es WilliamRussellBertrandArthur entonces tu repositorio será https://bitbucket.org/WilliamRussellBertrandArthur/crudbiblioteca

Git

  1. En la máquina virtual, desde la línea de comandos y como usuario alumno configurarás tres opciones de Git: tu nombre, correo electrónico y editor de texto, según sea tu caso.
alumno@slackware:~$ git config --global user.name "William Russell Bertrand Arthur"
alumno@slackware:~$ git config --global user.email [email protected]
alumno@slackware:~$ git config --global core.editor nano
  1. Clona tu repositorio localizado en https://bitbucket.org/WilliamRussellBertrandArthur/crudbiblioteca a tu máquina virtual dentro de /srv/www/htdocs/frame.works.com:
alumno@slackware:~$ cd /srv/www/htdocs/frame.works.com
alumno@slackware:/srv/www/htdocs/frame.works.com$ git clone https://bitbucket.org/WilliamRussellBertrandArthur/crudbiblioteca.git

Observa que a la URL de tu repositorio se le agrega al final .git para ejecutar el comando git clone. Espera unos minutos en lo que tu repositorio ubicado en Bitbucket es clonado a tu máquina virtual. Verás al final de la ejecución de git clone algo como:

Cloning into 'crudbiblioteca'...
remote: Counting objects: 33, done.
remote: Compressing objects: 100% (31/31), done.
remote: Total 33 (delta 14), reused 0 (delta 0)
Unpacking objects: 100% (33/33), done.
  1. Finalmente, puedes leer el historial de modificaciones (commits) registrados en tu repositorio local.
alumno@slackware:~$ cd /srv/www/htdocs/frame.works.com/crudbiblioteca
alumno@slackware:/srv/www/htdocs/frame.works.com/crudbiblioteca$ PAGER=cat git log

Nota que ahora existen 3 repositorios desde tu perspectiva.

  1. Mi repositorio: https://bitbucket.org/HernandezBlasAntonio/crudbiblioteca
  2. Tu repositorio remoto: https://bitbucket.org/WilliamRussellBertrandArthur/crudbiblioteca
  3. Tu repositorio local: /srv/www/htdocs/frame.works.com/crudbiblioteca

Publica tus modificaciones

Para publicar las modificaciones que hayas hecho en tu repositorio local ejecuta los siguientes comandos:

  alumno@slackware:~$ cd /srv/www/htdocs/frame.works.com/crudbiblioteca
  alumno@slackware:/srv/www/htdocs/frame.works.com/crudbiblioteca$ git add .
  alumno@slackware:/srv/www/htdocs/frame.works.com/crudbiblioteca$ git commit
  alumno@slackware:/srv/www/htdocs/frame.works.com/crudbiblioteca$ git push origin master

Observaciones

  • El comando git add tiene como parámetro un punto.

  • Al momento de ejecutar git commit se abrirá automáticamente el editor de texto nano. En la parte superior del "archivo" que está abierto en nano escribe un mensaje indicando todas las modificaciones que hayas hecho siendo lo más claro y exacto en tu mensaje. Una vez que hayas escrito el mensaje guarda los cambios y cierra a nano (^O ^X).

  • Al momento de ejecutar git push origin master se te solicitará un password (contraseña), es la contraseña de tu cuenta de usuario en Bitbucket, ingresa la y espera a que el proceso termine.

Una vez que hayas ejecutado lo anterior las modificaciones en tu repositorio local habrán sido enviadas a tu repositorio remoto (Bitbucket). Visita la página de tu repositorio local y pon especial atención a la sección Commits, ahí encontrarás el Commit history (historial de commits). Sobre la columna Commit encontrarás un vinculo, accede a él y revisa su contenido.

Trabajando con un repositorio

Vista general:

Se desea tener un repositorio remoto-centralizado en Bitbucket en el cual podamos mantener nuestro proyecto. Lo anterior se realiza de una forma muy sencilla.

Creando un repositorio en Bitbucket

  1. Con tu cuenta de usuario de Bitbucket accede a https://bitbucket.org/repo/create
  2. Llena el formulario Create a new repository:
  3. Name: Nombre de tu repositorio, por ejemplo ci_sitio
  4. Description: Escribe una pequeña descripción del propósito o contenido de tu repositorio.
  5. Access level: Si dejas seleccionada está opción tu repositorio será privado (no podrá ser visto por ningún otro usuario/invitado salvo tu mismo o a otro usuario que le des acceso), en caso contrario tu repositorio será público (cualquier otro usuario/invitado podrá acceder (leer) a tu repositorio).
  6. Repository type: Permite seleccionar al gestor de control de versiones para este repositorio. Bitbucket permite trabajar con Git o Mercurial, selecciona Git.
  7. Project management: Permite crear un Issue tracking (http://es.wikipedia.org/wiki/Sistema_de_seguimiento_de_incidentes) y un Wiki para este repositorio.
  8. Language: Selecciona el lenguaje de programación más sobresaliente en tu aplicación.
  9. Da clic sobre el botón Create repository.

Una vez echo lo anterior serás dirigido a tu nuevo repositorio, ejemplo https://bitbucket.org/WilliamRussellBertrandArthur/ci_sitio

Creando el repositorio local

En este caso lo único con lo que contamos hasta este momento es el repositorio en Bitbucket por lo que haremos lo siguiente, como ejemplo:

  1. Como usuario root:
root@slackware:~# cd /srv/www/htdocs
root@slackware:/srv/www/htdocs# mkdir ci_ejemplos
root@slackware:/srv/www/htdocs# chown -R alumno ci_ejemplos
  1. Como usuario alumno:
alumno@slackware:~$ cd /srv/www/htdocs/ci_ejemplos
alumno@slackware:/srv/www/htdocs/ci_ejemplos$ git init
alumno@slackware:/srv/www/htdocs/ci_ejemplos$ git remote add origin https://[email protected]/WilliamRussellBertrandArthur/ci_sitio.git

Crea un archivo con el nombre README.md dentro de tu repositorio y en él escribe una descripción más extensa y clara de tu repositorio para posteriormente ejecutar:

alumno@slackware:/srv/www/htdocs/ci_ejemplos$ git add .
alumno@slackware:/srv/www/htdocs/ci_ejemplos$ git commit
alumno@slackware:/srv/www/htdocs/ci_ejemplos$ git push origin master

Una vez realizado lo anterior podrás visualizar en la sección de Commits tus modificaciones subidas (git push origin master) a tu repositorio en Bitbucket.

Ciclo de trabajo

A partir de aquí seguirás un ciclo:

  1. Modificas tu repositorio, ya sea creando, borrando o actualizando archivos.
  2. Notificas a git de tus modificaciones (git add -u)
  3. Realizas un commit indicando a git que tus modificaciones están listas para ser subidas a Bitbucket (git commit -A)
  4. Subes tus modificaciones a Bitbucket (git push origin master)
  5. Regresa al punto 1

Observaciones

  • Todos los comandos a ejecutar de git debes hacerlos en la raíz de tu repositorio local, en este caso fue /srv/www/htdocs/ci_ejemplos

  • Para trabajar de una forma más cómoda con el framework y Apache crea un VirtualHost con el dominio http://ci.com que tenga como DocumentRoot al directorio /srv/www/htdocs/ci_ejemplos.

  • Después de realizar tu primer commit integra al framework en tu repositorio manteniendo el ciclo de trabajo indicado.

Jueves 4 de Abril de 2013:

He creado un repositorio con algunos ejemplos de PHP para que los estudien.

El repositorio es: https://bitbucket.org/HernandezBlasAntonio/ejemplos

Lo que harán será clonar dicho repositorio en su máquina virtual:

alumno@slackware:~$ cd /srv/httpd/htdocs/frame.works.com
alumno@slackware:/srv/httpd/htdocs/frame.works.com$ git clone https://bitbucket.org/HernandezBlasAntonio/ejemplos.git

El segundo comando viene indicado en el botón "Clone" del repositorio.


Sobre Bitbucket:

  1. Asigna una foto a tu perfil en Bitbucket con el servicio de Gravatar

Crea tu cuenta de usuario en http://es.gravatar.com usando el mismo correo electrónico que usas en Bitbucket.

Una vez que hayas creado tu cuenta de usuario en Gravatar sube tu foto personal, actualizada, a él.

Bitbucket automáticamente obtendrá tu foto del servicio de Gravatar.

  1. Sigue y has que los demás te sigan ;)

Bitbucket cuenta con la idea de followers (seguidores), algo similar a Twitter.

En mi caso, mis seguidores son: https://bitbucket.org/HernandezBlasAntonio/profile/followers y las personas a las que sigo son: https://bitbucket.org/HernandezBlasAntonio/profile/following

Una vez que visites el "profile" de otra persona tienes disponible el botón "Follow", eso te convertirá en su seguidor.

De igual forma puedes ser seguidor de un repositorio en particular.

  1. Envío/recibo de mensajes (inbox)

Puedes enviar y recibir mensajes de otros usuario en Bitbucket, puedes acceder a tu bandeja de entrada (inbox) en https://bitbucket.org/account/notifications/

  1. Importante

Varias cuentas de usuario fueron mal creadas ya que no siguieron las indicaciones en cuanto al formato del nombre de usuario https://gist.github.com/nihilismus/5087728#bitbucket

Elimina tu cuenta de usuario de Bitbucket si tu nombre de usuario no cumple el formato indicado y vuelve a realizar el "fork/clone" del repositorio https://bitbucket.org/HernandezBlasAntonio/crudbiblioteca

Ejemplos de nombres de usuario correctamente hechos:

Para eliminar tu cuenta de usuario en Bitbucket accede a https://bitbucket.org/account/user/ABCD/delete/ donde ABDC es tu nombre de usuario actual, el que no cumple el formato indicado.

Solo les estoy dando "follow" a las cuentas de usuario que tienen el formato correcto en su nombre de usuario. De igual forma solo se revisarán los trabajos de aquellos que su cuenta de usuario tenga el formato correcto así como una foto que ayude a identificarlos de forma rápida.

PostgreSQL

1 pg_ctl: old server process (PID: x) seems to be gone

Éste error se presenta cuando el proceso de PostgreSQL no fue detenido de forma correcta mediante el archivo /etc/rc.d/rc.local_shutdown.

Solución: como usuario root borra (comando rm) el archivo /var/lib/pgsql/data/postmaster.pid, inicia a PostgreSQL y verifica su ejecución.

2 PostgreSQL daemon was not properly shutdown

Vease el error #1

Trabajos

Lunes 25 de Marzo de 2013:

Una vez que tengas tu repositorio de crudbiblioteca tanto en Bitbucket y en tu máquina virtual envía un correo electrónico a mi cuenta en gmail con el Subject o Asunto "1er Frameworks NombreCompleto #NumeroDeControl" para enviarte las indicaciones sobre el trabajo.

Ejemplo de Subject: 1er Frameworks William Russell Bertrand Arthur #07160123

La entrega del trabajo será el 8 de abril del 2013.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment