Boletín
S2: Herramientas
Contenidos
Consulte también la documentación
del detector
de invariantes Daikon.
Directorios
Debe crear un directorio llamado
6.170 dentro de su directorio home en Athena y
dar permiso de lectura específicamente al personal
del curso 6.170. Esto hará posible que el personal
del curso 6.170 pueda ver y probar su código en
Athena, sin que todos los usuarios de Athena tengan acceso
a su código. (Dejar que alguien distinto a usted
y al personal tenga permiso de lectura de su directorio
~/6.170
o de cualquier otro lugar en el que usted guarde su código
del curso 6.170, constituye una violación de la
política de colaboración). El nombre del
grupo para el personal del curso 6.170 es system:6.170.
Athena% mkdir ~/6.170
Athena% fs sa ~/6.170 system:6.170 read
A continuación, debería
crear los subdirectorios ~/6.170/ex1, ~/6.170/ex2, etc.,
para guardar los ejercicios. Si lleva a cabo estos pasos
en el orden indicado, todos estos subdirectorios heredarán
el conjunto de permisos apropiados automáticamente
del directorio padre.
Si no sube su código al
lugar apropiado, no podremos recoger sus series de ejercicios,
su ayudante técnico (TA) se molestará
y esto repercutirá en su calificación.
Aunque ejecute el código
de la serie de ejercicios del curso 6.170 en su computadora,
éste debe funcionar también en Athena,
y debe colocar el código fuente y demás
ficheros en Athena para poder probarlos y calificarlos.
Cuando comience a elaborar su proyecto
final, le darán un directorio privado de grupo.
Podrá entonces asignar los permisos oportunos
para que los miembros de su grupo puedan tener acceso
a sus ficheros. Más adelante se le facilitará
más información al respecto.
Inicio
Cómo
utilizar Java
El kit de desarrollo de Java
de Sun Microsystems (Sun Microsystems' Java Development
Kit) (JDK) se encuentra disponible en Athena, y se puede
utilizar para codificar las soluciones de la serie de
ejercicios del curso 6.170. Antes de utilizar Java
en Athena, debe llevar a cabo algunos pasos básicos
de instalación.
Instalación
inicial
Tendrá que adjuntar los
directorios privados de
Java
y los del curso 6.170, además de fijar la variable
de entorno CLASSPATH.
Le facilitamos un script (conjunto de instrucciones)
que editará sus ficheros
de configuración ocultos, pero también
puede optar por hacer los cambios manualmente.
Inicio
Cómo
utilizar el script de ayuda
Escriba los siguientes comandos
en el prompt de su Athena%
add 6.170
student-setup.pl
Si ve el mensaje "instalación
de 6.170 completada", es que ha finalizado. Debe
salir y entrar de nuevo para que se apliquen los cambios.
Si aparece un mensaje de error, póngase en contacto
con el personal del curso. (El mejor modo de obtener
ayuda es pasarse por el despacho de los monitores de
prácticas (LA) durante sus horas de consulta
o pedir ayuda en el
foro de consulta Zephyr 6.170).
Inicio
Instalación
manual
En esta sección se describen
los pasos necesarios para la instalación inicial.
No es necesario leerla si ha utilizado el asistente
de script que se ha mencionado arriba, pero le
será útil si prefiere editar usted mismo
o si quiere saber con exactitud qué cambios se
han llevado a cabo.
Debe adjuntar los directorios
privados del curso "6.170" y los de "Java".
El directorio privado 6.170 contiene copias de
boletines, librerías de código que utilizará
cuando acabe sus series de problemas y código
fuente para algunas librerías. El directorio
privado de "java"
contiene el compilador de Java
javac
y el intérprete de Javajava.
Para adjuntar estos directorios
privados automáticamente
cuando entre en Athena, añada las siguientes
líneas a su fichero .environment:
add 6.170
add -f java_v1.3.0
Estas líneas tendrán
efecto la próxima vez que entre en Athena. Para
que se apliquen en la sesión actual, también
puede escribirlas en el prompt de Athena. Una vez
que haya adjuntado estos directorios privados, podrá
acceder al del
curso 6.170 a través
del directorio /mit/6.170.
Antes de utilizar Java, tendrá
que fijar su variable de entorno CLASSPATH. Añada
las siguientes líneas a su fichero .environment:
setenv CLASSPATHLIB
`perl -e 'print join(":", @ARGV);' /mit/6.170/lib/*.jar`
setenv CLASSPATH /mit/${USER}/6.170:${CLASSPATHLIB}
setenv RTJAR /mit/java_v1.3.0/jre/lib/rt.jar
Explicaciones:
- CLASSPATH: es la variable utilizada
por Java cuando se buscan clases para compilar
o ejecutar. Definimos esto para incluir todo el código
del curso 6.170 que escriba (la parte /mit/$USER/6.170)
además del código compilado que el personal
le facilite. (${CLASSPATHLIB}).
- CLASSPATHLIB: incluye librerías
de clases que han sido proporcionadas para el curso
6.170. Java no las utiliza directamente, pero
son útiles y es bueno que las tenga disponibles
en su entorno. (Si está escribiendo la línea
a mano, observe que las comillas externas son invertidas,
las siguientes comillas internas son comillas simples
y las comillas internas son dobles).
- RTJAR: incluye las clases estándar
de Java , tales como java.lang.Object.
Normalmente no usará esta variable, pero puede
que le haga falta si utiliza el compilador jikes,
que es otro alternativo a javac.
Asegúrese de que edita correctamente.
No podrá acceder a las clases que se han facilitado
para el curso 6.170 si no fija su CLASSPATH adecuadamente.
Inicio
Cómo
escribir y compilar el código
Para escribir el código
en Java, debe empezar editando un fichero fuente
de Java . Normalmente, los nombres de los
ficheros fuente de Java tienen una extensión
".java"
. Los ficheros fuente son simplemente ficheros de texto,
que se pueden crear y editar con Emacs o con su editor
de texto favorito.
Debe compilar su código
fuente antes de ejecutarlo. El compilador Javac se utiliza
para transformar los programas de Java en bytecode,
contenido en un fichero de clase. Los ficheros
de clase se reconocen por su extensión .class.
El bytecode de los ficheros de clase puede ejecutarse
entonces mediante el intérprete de Java
.
Puede encontrar a través
de la página de documentación
de Java de MIT (http://web.mit.edu/java/www/home.html)
una amplia documentación en línea para
javac, Java y otras herramientas del kit de desarrollo
de Java (JDK).
Un programa de Java contiene
uno o más paquetes, cada uno de los cuales define
un grupo de abstracciones relacionadas. Cada paquete
contiene una o más clases. Cada clase se crea
desde un fichero fuente que lleva a cabo las abstracciones.
Al utilizar Javac, se pueden
compilar uno o más ficheros fuente como ficheros
de clase para que los ejecute el intérprete.
Al menos una de las clases resultantes debe definir
un método llamado "main", que constituye
el punto de partida para la ejecución del programa.
Una vez compilados todos los ficheros fuente, el programa
puede ejecutarse utilizando java,
el intérprete de the Java . El ejecutar
la siguiente línea
javac [options]
file1.Java file2.Java...
generará los ficheros
de clase file1.class, file2.class, etc., para cada fichero
fuente especificado. Escriba "man
javac" en el prompt de Athena para obtener
más información sobre las opciones de javac.
Use prácticamente sin escepticón la opción
-g,que
proporcionará una salida de depuración mejorada.
Una vez que haya compilado su código
fuente en ficheros de clase, puede ejecutarlo con el
intérprete java
de Java . El comando
java options
classname
ejecutará la clase indicada
por classname. Esta clase debe existir en
su actual CLASSPATH o de lo contrario, tendrá que
usar la opción -classpath
para especificar un CLASSPATH distinto. La clase que ejecute
también debe contener el método "main"
mencionado anteriormente. Si quiere ejecutar una clase
que no se encuentre en el paquete por defecto, tendrá
que especificar el nombre completo de la clase. Por ejemplo,
utilice
java ps1.Test
para ejecutar el método
principal de la clase Test en el paquete ps1. Para obtener
una descripción completa de todas las opciones
de Java,
escribajava
-help en el prompt de Athena.
Inicio
Sitios
prácticos de Java
Inicio
Cómo
utilizar Emacs para editar el código en Java
El personal del curso 6.170
ha preparado un conjunto de adaptaciones
para Emacs para facilitar la edición del
código en Java. Para utilizar estas adaptaciones,
debe añadir la siguiente línea a su fichero
.emacs
(o crear un fichero .emacs
en su directorio home que contenga la siguiente
línea, si todavía no tiene uno):
(load "/mit/6.170/etc/emacs/6170.el")
Esto dará lugar a los
siguientes cambios:
- Pulsar RET
(intro) no sólo inserta una línea nueva
sino que crea una indentación
por defecto en la próxima línea.
C-j
sólo inserta una línea nueva.
- Pulsar C-c
C-c salva y compila el programa actual. Si
no hay un makefile en el directorio actual,
el comando por defecto ejecutado para los ficheros
de Java es javac
-g *.java.
- Pulsar C-h
f ejecuta jdk-lookup, que visualiza la documentación
JDK (kit de desarrollo de Java) para un paquete, clase,
método o campo de Java.
- Pulsar C-c
C-r comenta la zona seleccionada, y pulsar
C-u
C-c C-r descomenta esta zona. (Puede seleccionar
una zona en Emacs desplazándose hacia un extremo,
pulsar C-SPC,
y moverse hacia el otro extremo, o hacer un click
en un extremo y arrastrar hasta el otro extremo).
- Hacer
clic con el botón
central sobre el backtrace de una pila de Java
le llevará al código del cuadro sobre
el que ha pinchado.
- La
indentación
por defecto se reduce a dos espacios por sangría.
- En todas las funciones, y no
sólo al editar ficheros de Java, está
permitido marcar la sintaxis (conocido por "encerrar
la fuente", en la terminología
de Emacs).
Si le interesan algunas de estas
adaptaciones, añada la línea
(setq make-6170-changes
nil)
a su fichero .emacs
antes de cargarlo. Esto definirá todas las funciones
pero no realizará ninguna adaptación.
Si lo desea, puede echar un vistazo al fichero 6170.el
y copiar las partes que encuentre más útiles.
Inicio
Cómo
usar Javadoc y Six170Doclet para generar especificaciones
El kit de desarrollo de Java
de Sun incluye Javadoc, una herramienta
que crea especificaciones a partir de un código
fuente anotado con comentarios especiales. Los comentarios
pueden incluir "etiquetas" que van introducidas
por una arroba (@).
Six170Doclet
amplía a Javadoc para reconocer etiquetas
adicionales del curso 6.170, además de todas
las etiquetas
aceptadas por Standard Doclet de Sun. (Six170Doclet
funciona normalmente como preprocesador, creando un
nuevo fichero de entrada que se puede leer directamente
con Standard Doclet de Sun). Estas etiquetas adicionales
declaran campos de especificación para las clases
y cláusulas requires,
modifies y effects para los métodos.
Además de añadir
nuevas etiquetas, Six170Doclet
deduce automáticamente los resúmenes
de un método que falte y posee otras características
que facilitan la escritura y lectura de las especificaciones,
incluso al observar el propio código.
- Algunas etiquetas ampliadas
pertenecen a la información general de una
clase; se utilizan para definir formalmente qué
representa un Tipo de Datos Abstracto.
| @specfield name
: T // text |
Indica que name
es un campo de especificación abstracta
de tipo T para la clase, y añade
text como comentario si está presente. |
| @derivedfield name
: T // text |
Es lo mismo que specfield,
excepto que éste también añade
la propiedad "derivada" a la información
de salida. |
| @endspec |
Comunica a Javadoc
que no hay más campos abstractos que documentar
en la especificación. |
Los campos derivados se pueden
considerar funciones de un estado preexistente. Así,
si una clase tuviera un specfield
@specfield n : integer
podríamos definir un campo
derivado
@derivedfield pos
: boolean // pos = true iff n > 0
A los campos derivados no se les
permite mantener ningún tipo de información
que pudiera no estar ya calculada en el estado actual
del objeto. Por lo tanto, debe utilizar specfields
para introducir nuevas variables de estado, y campos
derivados para introducir funciones en esas variables
de estado.
Los campos derivados no son obligatorios
en las especificaciones, pero pueden reducir complejidad
y redundancia.
| @requires X |
Declara que X es
una condición previa para el procedimiento |
| @modifies Y |
Declara que el procedimiento
no modificará nada que esté fuera
de Y siempre que X se mantenga |
| @effects Z |
Declara que si X
se mantiene al comienzo del método, Z
se mantendrá al final del mismo. |
Después de ejecutar javadoc,
debería comprobar la salida. Es posible que tenga
que añadir saltos de línea (<br>)
o saltos de párrafo (<p>)
para mejorar la legibilidad. Por otra parte, si omite
ciertas etiquetas (como @endspec), el texto posterior
puede no aparecer en la salida. Finalmente, dado que
gran parte del texto de los comentarios de Javadoc
está insertado en un documento HTML, debe tener
cuidado con las partes que se puedan interpretar como
etiquetado HTML. Por ejemplo, si escribe
@effects Adds <x>
and <y>
<x> y <y> serán
interpretados en la salida como etiquetas HTML (y no
se verán en un navegador).
Infórmenos sobre cualquier
comportamiento extraño o cualquier queja sobre
Six170Doclet
y envíelo a rhlee@mit.edu
( en vez de a 6.170-staff@mit.edu).
Inicio
Foros de
consulta del sistema Zephyr
Es posible que le interese apuntarse
a diversas listas de consulta del sistema Zephyr relacionados
con esta clase. Estas listas pueden resultar muy útiles,
ya que actúan como complemento a las visitas
que pueda hacer al monitor de prácticas dentro
del horario establecido. El principal gforo de consulta
se llama 6.170 y Zephyr le permite entrar en contacto
con compañeros de clase y con los monitores de
prácticas que estén de turno. (Los monitores
de prácticas dan preferencia a los estudiantes
que los visitan en persona durante el horario de las
mismas, ya que éste es el mejor modo de comunicarse
con ellos cualquiera que sea su duda. Sin embargo, también
intentarán controlar la lista y facilitarán
su ayuda a través de este sistema, si disponen
del tiempo necesario).
Inicio
Aspectos
prácticos
Para apuntarse, escriba
zctl add
message 6.170 \*
Para escribir a la lista, escriba:
zwrite -i
6.170
Para borrarse escriba
zctl delete
message 6.170 \*
Para salir solamente de la sesión
actual, sustituya "unsub" por "delete"
en la línea de arriba:
zctl unsub message
6.170 \*
Para obtener más información
sobre zctl,
escriba "man
zctl" en el prompt de Athena o échele
un vistazo a Inessential
Zephyr (Tablón de procesamiento de información
para el estudiante), disponible en línea.
Inicio
Directrices
La lista de consulta 6.170
está pensado exclusivamente para preguntas y
respuestas relacionadas con las series de problemas
y con Java. Normalmente, los ayudantes técnicos
(TA) y los monitores de prácticas (LA) se conectarán
por lo general a la lista del curso 6.170 siempre que
el ratio de señal a ruido permanezca alto. En
algunas ocasiones responderemos a preguntas en las listas,
particularmente si observamos confusión general
o alguna respuesta que "no sea del todo correcta".
Sin embargo, si tiene alguna pregunta para su ayudante
técnico (TA), mejor envíele un e-mail.
Además, no aseguramos que sea un miembro del
personal quien responda a las preguntas de la lista.
Para asegurarse de que le atienden, haga una visita
a cualquier monitor de prácticas (LA) o ayudante
técnico (TA) en horario de consulta o prácticas.
No todas las preguntas son adecuadas
para la lista de consulta Zephyr. Entre estas se encuentran:
-
"Esta es mi solución.
¿Es la adecuada? ¿Es la acertada?"
(Esto supera la política de no colaboración
por difundir su solución. Mostrar más
de 5 líneas de código en el foro constituye
una violación de la política de colaboración
en el sistema Zephyr ).
-
"¿Qué papel
tiene de la función
foo en el JDK (Kit de desarrollo de Java)?""¿Qué
argumentos toma?"
Estas preguntas muestran pruebas de pereza. En vez
de esto, debería investigar la
documentación de la API de JDK (kit
de desarrollo de Java).
-
"¿Hay aIgún
monitor de prácticas (LA) o ayudante técnico
(TA) en línea?"
En primer lugar, esta pregunta carece de relevancia:
estar en línea no es lo mismo que estar de
turno. En segundo lugar, incluso si un monitor de
prácticas (LA) estuviese de turno, éste
podría estar ayudando a otros estudiantes
(especialmente a aquellos que asisten a las horas
de consulta de las prácticas en persona).
Debería pasarse por la consulta de un ayudante
técnico (LA) o monitor de prácticas
(TA) o bien simplemente debería poner su
pregunta en la lista y esperar a que le respondan.
Si quiere hablar sobre temas relacionados
con el curso 6.170 que no sean preguntas o respuestas
específicas, tendrá que utilizar la lista
de distribución 6.170.d.
Por ejemplo, si quiere iniciar un debate sobre
las ventajas estéticas de Java, desea hablar
sobre el maravilloso estilo de redacción de los
autores de la serie de problemas o necesita expresar
su frustración por el error que ha estado buscando
durante dos horas, debe usar la lista 6.170.d
y no la 6.170.
Los aspectos prácticos
de la lista 6.170.d
son idénticos a los de la 6.170,
con la excepción de que hay que añadir
un .d
en el lugar clave de los ejemplos de arriba.
Inicio
Bitácora
Zephyr
Puesto que la lista de consulta
Zephyr suele tener bastante tráfico, el flujo
constante de grupos de noticias puede resultar molesto.
Además, algunos estudiantes pasan bastante tiempo
DESCONECTADOS (¡!), y por tanto, no SEpueden beneficiar
de los debates en tiempo real que tienen lugar en la
lista.
El zlog 6.170 ofrece la solución
a estos dos problemas. Registra cada mensaje enviado
a la lista Zephyr del curso 6.170. De este modo, puede
darse de baja de la lista de consulta y leer por separado,
por su cuenta y a su ritmo, las conversaciones que otros
están teniendo en ella. También puede
revisar las conversaciones que tuvieron lugar mientras
estaba desconectado. Normalmente resulta bastante útil
echar un vistazo a este registro de mensajes y conversaciones
antes de comenzar a hacer la serie de problemas, para
comprobar si otros estudiantes han encontrado dudas
comunes sobre el tiempo de ejecución de Java,
y para prepararlas de antemano.
Inicio
Cómo
utilizar zlog
El zlog del curso 6.170 está
guardado en el directorio privado zlog en Athena. Para
acceder a él, en primer lugar, escriba en el
prompt de Athena:
Athena% add zlog
El zlog del curso 6.170 se encuentra
en el directorio /mit/zlog/6.170
El zlog es un fichero de texto
como cualquier otro. Por tanto, pruebe a abrirlo con
un explorador de texto cualquiera. Sin embargo, puede
extenderse bastante, lo cual dificulta la navegación
por los mensajes.
Por ello, es aconsejable que pruebe
el comando tail como método alternativo
a la lectura de zlog. El comando tail es
semejante a los comandos cat y head
de Unix, con la excepción de que en vez de comenzar
al principio de un fichero y sacar por pantalla las
líneas sucesivas, comienza en algún punto
cercano al final del fichero y luego saca el resto del
fichero en el terminal. De este modo no tendrá
que desplazarse a través de las páginas
de los grupos de noticias de Zephyr que vio la última
vez que entró en el sistema: sólo verá
las últimas enviadas.
Puede decirle a tail
que comience desde un offset arbitrario desde
el final o principio del fichero. La acción por
defecto de
Athena% tail /mit/zlog/6.170
es imprimir las diez últimas líneas de
zlog. Para que comience más atrás, pase
la opción -number a tail,
donde number es el número de líneas
para imprimir en offset el punto de partida desde
el final del fichero. Por tanto,
Athena% tail -50 /mit/zlog/6.170
saca las 50 últimas líneas de log.
Puede incluso tener a tail
en espera, e imprimir nuevos mensajes
a medida que van entrando, si no quiere mezclar
las conversaciones del grupo de noticias 6.170 con sus
conversaciones personales en Zephyr. Para hacer esto,
utilice la opción -f tal y como
se muestra en:
Athena% tail -f /mit/zlog/6.170
Para obtener más información
sobre el comando tail, lea la página
del manual que obtendrá escribiendo en el prompt
de Athena:
Athena% man tail
Inicio
Cómo
crear archivos PDF
Puede entregar diagramas (u otros
trabajos que no estén escritos en código)
electrónicamente en formato PDF. Puede pasar
de PostScript a PDF ejecutando Adobe Acrobat Distiller,
como se indica a continuación:
Athena% add acro
Athena% distill file.ps
y se crea un fichero.pdf
Por favor, tenga en cuenta que
Adobe Acrobat Distiller solamente se encuentra disponible
para las plataformas de Sun. Si esto supone un problema,
puede optar por ejecutarlo en un servidor
de marcado o puede también utilizar la
función ps2pdf del directorio privado
gnu.
Inicio
Visio®
Visio® 2000 se puede descargar
como un fichero zip (comprimido). Nota:
debe disponer de una dirección IP en MIT para
descargar este fichero. Además, es bastante extenso.
(224 MB). Por ello, contamos con algunas copias en CD
para los estudiantes que tengan problemas para descargarlo.
Visio® es un programa para dibujar diagramas que
se puede utilizar para modelos de objeto y para diagramas
de dependencia de módulos. Para obtener más
información al respecto, consulte el sitio web de Visio®
2000
Si al instalar
Visio® 2000 en una computadora con Windows 2000
aparece un mensaje de error similar a "Visio2000:
Error Message: The Procedure Entry Point GBL Could Not
Be Located in the Dynamic Link Library Vislib32.dll"
("Visio2000: Mensaje de error: El punto de entrada
al procedimiento GBL no podría estar localizado
en la librería de enlaces dinámicos Vislib32.dll"),
consulte la Ayuda
de Microsoft).
Las plantillas de Visio® del
curso 6.170 para Visio®
v.5 están disponibles en ficheros zip
(comprimidos). Utilícelas en sus OM (modelos
de objeto) y en sus MDD (diagramas de dependencia de
módulos). Después de la descarga y la
descompresión, el directorio 6.170 debe colocarse
en el subdirectorio Solutions
de su instalación de Visio® .
Si está trabajando en Athena
o no tiene ordenador con plataforma Windows, puede utilizar
Dia® en vez de Visio®.
Inicio
Dia®
Si no tiene un ordenador con Microsoft
Windows (y por tanto no puede ejecutar Visio®),
hay un programa alternativo para dibujar diagramas,
llamado "dia".
Si ha añadido el directorio
privado 6.170 y está trabajando en un ordenador
con plataforma Sun o Linux, entonces tendría
que ser capaz de ejecutarlo al escribir
Athena% dia
&
Dia® puede exportar sus diagramas
como archivos postscript encapsulados, que puede
luego convertir a pdf. O también puede imprimir
los diagramas desde el propio Dia®.
Si tiene problemas al ejecutar
dia, envíe un e-mail a pnkfelix@mit.edu (y no
al personal del curso 6.170).
Si tiene problemas al utilizar
Dia®, eche un vistazo a los siguientes enlaces:
Tutorial de Dia
Página
principal del curso de Dia®
El curso 6.170 no ofrece respaldo
oficial a Dia® (no pregunte a su ayudante técnico
cómo utilizarlo; es muy posible que no lo sepa),
pero es una alternativa a Visio®.
Inicio
CVS (Sistema
de versiones concurrentes)
El CVS (Sistema de versión
concurrente) permite que múltiples usuarios editen
los mismos ficheros independientemente, trabajando sobre
sus propias copias. Hay un "depósito"
donde se guardan los ficheros principales. Cada usuario
"comprueba" una copia de trabajo. Luego edita
esa copia, "registra" o "compromete"
sus cambios de nuevo en el depósito, y "actualiza"
para incluir los cambios de otros en sus copias de trabajo.
El CVS también realiza un seguimiento de las
versiones antiguas de sus ficheros, de modo que puede
comparar versiones o volver a una versión anterior
si un cambio produce un error.
Los depósitos de un CVS
contienen ficheros de texto tales como ficheros fuente
(.Java),
Makefiles
y alguna documentación. Los depósitos
no deben contener ficheros compilados (.class)
o generar ficheros de texto como la documentación
de Javadoc. El depósito de su CVS debe
contener solamente ficheros que no se puedan regenerar
a partir de los otros ficheros del depósito.
Aquí tiene una lista típica
con los pasos que hay que seguir para trabajar con un
CVS:
- "Actualice" los ficheros
que están ya revisados.
- Añada / edite un fichero.
- "Actualice" de nuevo para
ver si los ficheros del depósito han guardado
los cambios desde que usted comenzó a editarlos.
Si ha sido así, los cambios se fusionarán
en su copia de trabajo automáticamente.
- Si hay un "conflicto de
fusión", en el cual dos cambios están
reñidos el uno con el otro, decida manualmente
qué cambio va a mantener.
- "Comprometa", o dicho de otro
modo, "Registre" el fichero.
Cada usuario tendrá su propia
copia de trabajo en algún sitio. Le aconsejamos
que cree un grupo de directorios /mit/6.170/groups/seNNM/username
.
Inicio
Programa
de instalación
Instalación
Si está trabajando sobre
Athena, añada esta línea a su fichero
~/.environment:
add gnu
Si trabaja desde casa con un ordenador
Linux, es posible que ya tenga instalado el sistema
CVS. Para ordenadores con plataforma Windows, descargue
WinCVS de http://www.wincvs.org/
o una versión no gráfica de http://www.cvshome.org/;
Échele también un vistazo a los
consejos de Jeremy Nimmer sobre cómo hacer que
un CVS funcione en un ordenador Windows. Para Macs,
descárguese MacCVS de http://www.maccvs.org/.
Por favor, tenga en cuenta que
sólo ofrecemos respaldo para la utilización
de un sistema CVS en Athena.
Instalación
por grupo
Hay dos pasos en la instalación
de un sistema CVS. En primer lugar, se crea el depósito
y se le añade un módulo. Luego, cada usuario
revisa ese módulo.
Un "módulo" es un grupo
de ficheros dentro de un sistema CVS. Probablemente
sólo necesitará un módulo para
el curso 6.170; llamémosle gb.
Ejecute los siguientes comandos una vez por grupo:
setenv CVSROOT /mit/6.170/groups/seNNM/.cvs
cvs init
cd /mit/6.170/groups/seNNM
mkdir $USER; cd $USER
mkdir gb; cd gb
cvs import -m "Start" gb seNNM start
cd ..
(El flag -m denota
un mensaje de registro, hablaremos más de esto
más tarde. Los parámetros
seNNM y start
son arbitrarios, pero deben estar ahí para la
ejecución del comando cvs
import).
Instalación
por usuario
Después de crear el depósito,
cada usuario debe comprobar el módulo gb
de su directorio de trabajo. En primer lugar, créese
un directorio de trabajo y trasládelo a éste:
cd /mit/6.170/groups/seNNM
mkdir -p $USER; cd $USER
Luego, compruebe el módulo
gb:
- Comprobación local
(desde Athena):
cvs -d /mit/6.170/groups/seNNM/.cvs
checkout gb
- Comprobación remota
(desde un ordenador distinto a Athena):
setenv CVS_RSH
ssh
cvs -d :ext:USERNAME@Athena.dialup.mit.edu:/mit/6.170/groups/seNNM/.cvs
checkout gb
Finalmente, cree un fichero ~/.cvsrc
que contenga las siguientes dos líneas:
diff -u update
-d -P
Eche un vistazo al
manual para obtener más información
sobre los ficheros ~/.cvsrc.
Inicio
Manejo
básico
Cómo
actualizar sus ficheros
Para actualizar su copia de trabajo
con la revisión más reciente del depósito
(pero guardando cualquier cambio que haya realizado
en su copia local), utilice:
cvs update
El sistema CVS intentará
fusionar los cambios que se hayan llevado a cabo desde
el más reciente cvs
update realizado por usted y por otros compañeros.
Si algunos de sus cambios entra en conflicto con los
de otros, cvs
update le informará de ello, y el fichero
fuente se cambiará para incluir ambas versiones
de cualquier parte del conflicto (la suya y la del depósito),
en este formato:
<<<<<<< nombre del fichero
SU VERSIÓN
=======
VERSIÓN del depósito
>>>>>>> número de revisión de la versión del depósito
Debe resolver el conflicto editando
el fichero, quitando los marcadores, y dejando la versión
del código que prefiera (o fusionándolos
a mano). (Buscar "<<<"
hasta que haya logrado resolver todos los conflictos
es por lo general una buena idea). Una vez que haya
resuelto todos los problemas, puede enviar sin miedo
el fichero al depósito.
Tenga en cuenta que el sistema
CVS funciona línea
por línea,
es decir, solamente sabe si se han hecho cambios, se
ha añadido o se ha borrado una línea completa.
(cvs
update muestra el estado de los ficheros de su
directorio de trabajo que han cambiado o que son distintos
al depósito, con un flag de una letra:
"U" significa que ha sido reemplazado con
la copia más reciente del depósito. "M"
significa que su copia de trabajo es distinta a la última
versión del depósito, y que la fusión
ha tenido éxito. "C" significa que
existen conflictos de fusión).
Cómo
asignar, añadir y eliminar archivos
Para enviar al depósito
un fichero editado por usted, utilice:
cvs commit -m "a
log message" filename
Si omite el nombre del fichero,
el sistema CVS enviará todos los ficheros al
directorio actual. El mensaje es de registro y le permite
llevar un control de los cambios sin necesidad de leer
todo el código. Esto es muy práctico,
y debe introducir siempre un mensaje de registro descriptivo;
no debe poner algo como:" Algunos errores
reparados". Si omite el flag -m, el sistema
CVS le hará dejar un mensaje de registro.
Para añadir un fichero al
depósito, use el comando:
cvs add filename
Para eliminar un fichero del depósito:
rm filename
cvs rm filename
cvs commit -m "Eliminado el fichero por tales motivos"
Estos comandos sólo indican
el fichero que hay que añadir o borrar. Después
de ejecutar cvs
add o cvs
rm, aún tendrá que hacer uso del
comandocvs
commit para realmente avisar al depósito
de que ha habido un cambio.
Para mover o renombrar un fichero
o directorio en el sistema CVS, debe eliminarlo de un
lugar y añadirlo al sitio en el que lo quiera
poner.
Cómo
añadir y eliminar subdirectorios
Puede añadir un subdirectorio
mediante los comandos:
mkdir dirname
cvs add dirname
el comando cvs
add añade un subdirectorio rápidamente,
sin necesidad de asignarlo.
Con el sistema CVS no puede eliminar
un subdirectorio. (El comando cvs
rm no se puede ejecutar sobre un directorio.)
Lo mejor que puede hacer es utilizar rm
y cvs
rm para borrar todo lo de ese directorio, y luego
ejecutar cvs
update -P para deshacerse de cualquier subdirectorio
vacío que haya quedado en su directorio de trabajo.
Cómo
rastrear los cambios
Para observar el cambio de registro,
que es una lista de mensajes que se utiliza cuando se
comprueban los cambios, ejecute
cvs log filename
Para ver las diferencias entre
la copia del directorio de trabajo y la copia más
reciente del depósito:
cvs diff [filename]
Omita filename para poder
ver las diferencias entre todos los ficheros. Ejecute
el flag -r1.xx
para compararlo con una revisión en concreto,
y utilice dos flags -r
flags para comparar dos versiones entre sí.
Inicio
Consejos
y técnicas
CVS (Sistema
de versiones concurrentes) en Emac
El sistema Emac ha incluido ayuda
para un sistema CVS. Existen dos modos de llamar a los
comandos de un sistema CVS desde un Emac: desde dentro
de un buffer (memoria intermedia) que está
visitando a un fichero o desde un buffer que
enumera todos los ficheros modificados y le deja realizar
operaciones en ellos.
Los comandos de un sistema CVS
que llevan a cabo acciones desde un buffer que
está visitando a un fichero se prefijan con C-x
v. Los comandos más útiles son
C-x v =: vc-diff
- Muestra las diferencias entre
su copia de trabajo y la versión del depósito,
como cvs
diff.
C-x v =: vc-next-action
- En la mayoría de los
casos, este comando compromete los cambios que usted
ha hecho, como cvs
commit. Introducirá un mensaje de registro
en un buffer especial y luego escribirá
C-c
C-c para asegurar realmente el fichero.
C-x v C-h: show VC bindings
- Enumere todos los comandos comenzando
por C-x
v.
Puede utilizar, como alternativa,
el paquete pcl-cvs para ejecutar los comandos del sistema
CVS y navegar por la salida. El principal comando es:
M-x cvs-update RET
que ejecuta cvs
update y coloca los resultados en un buffer
*cvs*
para que les pueda echar un vistazo. Después puede
operar en cada línea utilizando comandos como los
siguientes:
=: cvs-mode-diff
- Muestra diferencias entre su
copia de trabajo y la versión del depósito,
como cvs
diff.
f: cvs-mode-find-file
- "Encuentra" (edita) el fichero
en Emac.
c: cvs-mode-commit
- Asegura sus cambios, como cvs
commit. Introducirá un mensaje de registro
en un buffer especial y luego escribirá
C-c
C-c para asegurar realmente el fichero.
g: cvs-update
- Vuelve a ejecutar cvs
update y actualiza el buffer actual
(*cvs*)
mostrando los nuevos resultados.
r: cvs-mode-remove
- Borra el fichero y ejecuta cvs
remove sobre él. Aún tiene que
asegurar ese cambio.
m: cvs-mode-mark
- Marca un fichero para indicar
una operación posterior. Esto le permite operar
sobre múltiples ficheros a la vez, y por ejemplo,
puede asegurarlos simultáneamente con el mismo
mensaje de registro. La mayoría de las funciones
de un sistema cvs (asegurar, eliminar, etc.) operan
sobre todos los ficheros marcados, o sobre el fichero
bajo el cursor Emac ("señalando")
si no hay ficheros marcados.
u: cvs-mode-unmark
- Desmarca el fichero al momento.
h: cvs-mode-help
- Ofrece una guía de ayuda
(muy breve) sobre los comandos
-
Inicio
Cómo
minimizar los conflictos de fusión
¡Un sistema CVS no sustituye
a la tarea de administración del trabajo! La
coordinación del trabajo es importante, incluso
si trabaja individualmente. Si es posible, debe evitar
trabajar con el mismo fichero al mismo tiempo. Si trabaja
con el mismo fichero, hágalo sobre partes distintas.
La modularización del código en múltiples
ficheros hace normalmente que sea más fácil
equiparar el trabajo. Siempre deber consultar las decisiones
de diseño de gran importancia con sus compañeros,
antes de llevarlas a cabo, sobre todo si se trata de
interfaces que afectarán a su código.
¿Cuando debería comprometerse?
Si se compromete frecuentemente sin haber hecho las
pruebas apropiadas, es posible que introduzca errores
en el depósito, que repercutirán en el
trabajo de sus compañeros. No obstante, si rara
vez se compromete, sus compañeros usarán
código obsoleto, que hace que se despercidien
esfuerzos y que surjan los conflictos de fusión.
No existe una regla estricta y
rápida, pero una buena regla
consiste en asegurarse
de que todo al menos compila antes de que lo
revise. No hay nada más molesto que tener que
cerrar su código para compilar después
de comprobar que alguien ha introducido cambios.
Otra buena regla (aunque esta es
bastante más dúctil) consiste en la posibilidad
de evitar dejar algo sin revisar cuando pare hasta el
próximo día. Pueden pasar muchas cosas
mientras no está codificando, y normalmente es
mejor hacer su cambio dentro de un orden de trabajo,
y comprobarlo antes de irse. Dado que la regla anterior
(la de nunca comprobar código que no funciona)
es más importante, ésta puede resultarle
difícil de cumplir si está llevando a
cabo grandes cambios. Por ello, suele ser buena idea
abordar un problema en el momento, y así podrá
acabar cada parte más rápidamente y mantener
el depósito actualizado.
El coordinar sus esfuerzos con
los de sus compañeros es, por supuesto, la verdadera
clave para evitar problemas de fusión. De nuevo,
¡un CVS no sustituye a la tarea de administración
del trabajo!
Inicio
Dificultades
Aquí le facilitamos algunos
consejos para evitar problemas frecuentes que surgen
con el uso del sistema CVS:
-
No edite el depósito
manualmente. No está diseñado para
que el manejo por humanos.
-
Trate de no realizar cambios
drásticos a la vez. Esto reducirá
los conflictos de fusión y es una buena costumbre
en lo general.
-
Ejecute siempre el comando
cvs
update antes de editar un fichero. Es fácil
que se le olvide. Si le ocurre, puede que acabe
editando una versión obsoleta, lo que puede
provocar serios problemas de fusión.
- En caso de que otro miembro
del grupo no haya revisado sus cambios y no esté
disponible, es posible que quiera hacerlo usted por
él. Puede hacer esto simplemente ejecutando
cding
en su directorio de trabajo y haciendo desde allí
un cvs
commit. Esto sería como último
recurso. Además,
antes de hacerlo, debería hacer un cvs
diff para averiguar exactamente qué
cambios han llevado a cabo, y si realmente quiere
revisarlos.
- Tenga cuidado con el tabulador.
Las tabulaciones automáticas de Emac pueden
tener un ancho distinto para alguna gente, y otros
editores de texto pueden pueden tratar las tabulaciones
de modo distinto, tanto en anchura, como en relación
a si son tabulaciones (OK), espacios o ambas cosas.
Todos los editores utilizados por sus compañeros
deben compartir la misma convención para las
tabulaciones. La razón para esto es (Esto
se debe a) que un sistema CVS compara en base a líneas
individuales, de modo que las diferencias en cuanto
a tabulaciones pueden causar serios problemas de fusión.
Este es simplemente un caso específico de "Hay
que establecer una convención con respecto
al formato del código".
Inicio
Más
información
Un sistema CVS puede hacer muchas
más cosas que no se mencionan en esta breve guía
para principiantes. Por favor, si necesita más
ayuda, lea la documentación.
Para leer el manual del sistema
CVS en Athena, ejecute el comando info
cvs. Otra forma de hacerlo desde Emac es, hacer
do M-x
info RET m cvs RET, donde M-x
consiste en pulsar x mientras mantiene pulsada la tecla
meta o de control o la tecla alt, RET es la tecla intro,
y no necesita mantener los espacios. Ponga especial
atención a las secciones "Cómo empezar
un nuevo proyecto", y "Visión conjunta
/ Una sesión de muestra". Además,
si alguno de los miembros de su grupo quiere trabajar
desde casa, querrá leer la sección "depósito
/ depósitos remotos".
Inicio
|