You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
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 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:
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.
Sigue las siguientes instrucciones para hacer uso de ellos una vez instalados.
WinSCP
Ejecuta WinSCP y ante la ventana IP o nombre del servidor escribe 127.0.0.1 y en Puerto2222. 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.
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.
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
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.
Ante la ventana PuTTY Security Alert da clic al botón Sí. 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.
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.
Localiza la opción #ServerName www.example.com:80 (comentada) y deja la como ServerName slackware.red.virtual:80
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>
Localiza la línea #Include /etc/httpd/mod_php.conf (comentada) y deja la como Include /etc/httpd/mod_php.conf.
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.
Dentro de /srv/httpd/htdocs creamos el directorio pagina1.
Como usuario alumno accedemos a /srv/httpd/htdocs/pagina1 y creamos el archivo con nombre info.php con el siguiente contenido:
<?phpphpinfo();
?>
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.
Para activar el servicio de PostgreSQL primero se crea un cluster de PostgreSQL y finalmente se activa el servicio.
Creando el cluster de PostgreSQL
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 ... okcreating collations ... okcreating conversions ... okcreating dictionaries ... oksetting privileges on built-in objects ... okcreating information schema ... okloading PL/pgSQL server-side language ... okvacuuming database template1 ... okcopying template1 to template0 ... okcopying template1 to postgres ... okWARNING: enabling "trust" authentication for local connectionsYou 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/dataor pg_ctl -D /var/lib/pgsql/data -l logfile startroot@slackware:~#
Dentro de /var/lib/pgsql/data/ encontraremos los siguientes archivos:
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.
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 = '*'
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
Se asignan permisos de ejecución: chmod +x /etc/rc.d/rc.postgresql
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
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
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=>selectversion();
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
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:
Como usuario alumno captura lo siguiente en un archivo con nombre schema-biblioteca.sql:
createschemabiblioteca;
set search_path to biblioteca, public;
droptable if exists ejemplar;
droptable if exists libro_autor;
droptable if exists autor;
droptable if exists libro;
createtablelibro
( isbn varchar (13) primary key,
titulo_libro varchar (100) not null
);
createtableautor
( id_autor varchar(6) primary key,
nombre_autor varchar (80) not null
);
createtablelibro_autor
( isbn varchar(13) references libro (isbn),
id_autor varchar(6) references autor (id_autor)
);
createtableejemplar
( clave_ejemplar varchar(2) not null,
conservacion_ejemplar varchar (30),
isbn varchar(13) references libro (isbn)
);
\ir datos_biblioteca.sql
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');
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.
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.
En VirtualBox nos dirigimos a la configuración de la máquina virtual. Configuración > Red > Adaptador 1 > Reenvío de puertos.
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.
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.
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>
<?phpwhile ($line = pg_fetch_array($result, null, PGSQL_ASSOC)) {
foreach ($lineas$col_value) {
?>
<td><?phpechotrim($col_value); ?></td>
<?php
}
}
?>
</tr></table>
<?php// Liberando el conjunto de resultadospg_free_result($result);
// Cerrando la conexiónpg_close($dbconn);
?>
</body>
</html>
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.
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.
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
Renombra el archivo /etc/httpd/extra/httpd-vhosts.conf y crea uno nuevo vacío:
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):
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
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
Reinicia a Apache para que haga uso de su nueva configuración: /etc/rc.d/rc.httpd restart
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.
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>
<?phpwhile ($tupla = pg_fetch_array($resultado, null, PGSQL_ASSOC)) {
?>
<tr>
<?phpforeach ($tuplaas$atributo) {
?>
<td><?phpechotrim($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>
<?phpwhile ($tupla = pg_fetch_array($resultado, null, PGSQL_ASSOC)) {
?>
<tr>
<?phpforeach ($tuplaas$atributo) {
?>
<td><?phpechotrim($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>
<?phpwhile ($tupla = pg_fetch_array($resultado, null, PGSQL_ASSOC)) {
?>
<tr>
<?phpforeach ($tuplaas$atributo) {
?>
<td><?phpechotrim($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>
<?phpwhile ($tupla = pg_fetch_array($resultado, null, PGSQL_ASSOC)) {
?>
<tr>
<?phpforeach ($tuplaas$atributo) {
?>
<td><?phpechotrim($atributo); ?></td>
<?php
}
?>
</tr>
<?php
}
?>
</tbody>
</table>
<?phppg_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>
<?phpif (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>
<?phpwhile ($tupla = pg_fetch_array($resultado, null, PGSQL_ASSOC)) {
?>
<tr>
<?phpforeach ($tuplaas$atributo) {
?>
<td><?phpechotrim($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>
<?phpecho$contador++; ?>
</td>
<?phpforeach ($tuplaas$atributo) {
?>
<td><?phpechotrim($atributo); ?></td>
<?php
}
?>
<td>
<a href="04-informacion-libro.php?isbn=<?phpecho$isbn; ?>">Autores</a>
</td>
</tr>
<?php
}
pg_free_result($result);
pg_close($dbconn);
?>
</tbody>
</table>
</body>
</html>
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.
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.
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
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.
Realiza un fork de mi repositoriohttps://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.
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:~$ 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:
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.
Name: Nombre de tu repositorio, por ejemplo ci_sitio
Description: Escribe una pequeña descripción del propósito o contenido de tu repositorio.
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).
Repository type: Permite seleccionar al gestor de control de versiones para este repositorio. Bitbucket permite trabajar con Git o Mercurial, selecciona 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:
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:
Modificas tu repositorio, ya sea creando, borrando o actualizando archivos.
Notificas a git de tus modificaciones (git add -u)
Realizas un commit indicando a git que tus modificaciones están listas para ser subidas a Bitbucket (git commit -A)
Subes tus modificaciones a Bitbucket (git push origin master)
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.
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.
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.