Para nuestro juego Spacewar!, creamos un archivo de paquete dedicado
Spacewar!.pck.st. Esta es la forma de proceder al escribir un paquete
externo: definir un paquete dedicado y, de vez en cuando, guardar el
trabajo con el botón save de la herramienta Installed
Packages (véase Véase Figura 2.3).
Cuis-Smalltalk utiliza GitHub para alojar, versionar y comparar su desarrollo principal, así como para gestionar un conjunto de paquetes externos (es decir, código que se mantiene de forma independiente y fuera de Cuis-Smalltalk, pero que está estrechamente relacionado con él).
Los archivos del paquete son archivos de texto simples, codificados para el alfabeto latino (ISO 8859-15) y gestionados sin problemas por GitHub. Cuis-Smalltalk utiliza la convención de salto de línea LF (código ASCII 10), tal y como prefiere GitHub. Esto permite a Git/GitHub comparar versiones y fusionar ramas.
Se utilizan repositorios GitHub independientes para los proyectos, es decir, paquetes o conjuntos de paquetes estrechamente relacionados que siempre se cargan y mantienen juntos como un todo.
Tu flujo de trabajo diario con Cuis-Smalltalk para desarrollar un paquete externo será similar al siguiente:
No guardar la imagen es simplemente un consejo de buenas prácticas para cuando tu objetivo principal sea crear código nuevo. Ya hemos hablado de las advertencias sobre guardar la imagen en relación con la gestión del código (Véase La imagen). Pero, de vez en cuando, te encontrarás en la posición de un explorador cuando abras varios navegadores de código y lugares de trabajo para averiguar algo. En este caso, el estado del sistema, las ventanas abiertas y los fragmentos de código contienen el valor que te interesa, y guardar la imagen es la forma correcta de preservar el estado del sistema.28
Como se describe en el flujo de trabajo diario, es una buena costumbre no guardar toda la imagen, sino solo el paquete modificado del código fuente editado. Sin embargo, cada vez que iniciamos una sesión de programación, resulta tedioso configurar la imagen para que se adapte a nuestras necesidades y gustos personales.
Las cosas que uno puede querer personalizar en la imagen son:
Queremos registrar estas preferencias de imagen en un script
setUpEnvironment.st que se ejecutará al inicio. En GNU/Linux, se
le pide a Cuis-Smalltalk que ejecute un script con el -s, por
ejemplo squeakVM Cuis5.0.image -s setUpEnvironement.st, donde
setUpEnvironement.st. es un archivo que contiene código
Smalltalk. Un ejemplo real podría ser:
../cogspur/squeak Cuis5.0-4426 -s ../scripts/setUpEnvironment.st
Describimos en detalle un ejemplo de script de configuración que organiza el entorno, tal y como se muestra en la Figura 9.13. Es interesante el código Smalltalk que se adentra en áreas heterogéneas de Cuis-Smalltalk, como las herramientas de desarrollo, el sistema Morph, las preferencias y el manejo de colecciones.
Figura 9.13: Entorno de una imagen iniciada con el script de configuración
Empecemos por cerrar las ventanas abiertas. El código se coloca en un
bloque al que se le envía el mensaje #fork para esperar a que
el entorno se inicialice correctamente.
| world morph area extent |
world := UISupervisor ui.
[
| area extent morph | "used later"
UISupervisor whenUIinSafeState: [
children := world submorphs reject: [:aMorph | aMorph is: #TaskbarMorph].
children do: [:child | child delete].
]
] fork
Todo el entorno de interfaz de usuario de Cuis-Smalltalk es un tipo de Morph,
una instancia de WorldMorph. Sus submorphs son ventanas, menús,
la barra de tareas o cualquier tipo de morph con el que el usuario pueda
interactuar. Para acceder a esta instancia de WorldMorph, se
solicita al UISupervisor con el mensaje #ui. Una vez
seleccionados todos los morphs del mundo excepto la barra de tareas –en
realidad, #reject:–, los #delete del mundo.
A continuación, cambiamos las preferencias. Coloca el siguiente código después de la línea anterior que elimina los hijos.
"Change to Dark theme" Feature require: #'Theme-Themes'. DarkTheme beCurrent. "Adjust font size" Preferences at: #defaultFontSize put: 12. "Adjust taskbar size" morph := UISupervisor ui taskbar. morph scale: 1 / 2. Display fullScreenMode: true. self runningWorld doOneCycleNow.
Necesitamos el paquete Theme-Themes; como no está instalado en la imagen predeterminada, se buscará en el disco para su instalación. En cuanto al acceso a la barra de tareas, recuerde que hemos eliminado todos los morphs excepto la barra de tareas del mundo, por lo que la barra de tareas es realmente la primera de la colección de submorphs del mundo. Por último, actualizamos la escala de la barra de tareas y solicitamos a Cuis-Smalltalk que se muestre a pantalla completa. Como hemos cambiado varias partes visuales, solicitamos un ciclo de actualización del entorno (es decir, el mundo en ejecución en la terminología de Cuis-Smalltalk).
Antes de instalar las herramientas, le preguntamos a un
RealEstateAgent el área libre. Lamentablemente, este agente no
tiene en cuenta el área ocupada por la barra de tareas, por lo que
debemos ajustar su respuesta. A continuación, calculamos una cuarta
parte de esta extensión de área libre (la mitad del ancho y la mitad del
alto constituyen una cuarta parte del área libre total):
Coloca el siguiente código después del código anterior.
"Compute the available free space for windows placement" area := RealEstateAgent maximumUsableArea extendBy: 0 @ morph morphHeight negated. extent := area extent // 2.
Ahora estamos listos para instalar algunas herramientas. Los tres primeros navegadores ocupan cada uno una cuarta parte de la pantalla:
"Open a few System Browsers" Browser open morphPosition: 0 @ 0; morphExtent: extent. Browser open morphPosition: area width // 2 @ 0; morphExtent: extent. "Open a System Browser on a specific class" morph := Browser open morphPosition: area extent // 2; morphExtent: extent. morph model setClass: Integer selector: nil.
A continuación, en el cuarto restante libre, instalamos un espacio de trabajo que ocupa dos tercios del área y una transcripción que ocupa un tercio. El espacio de trabajo se instala con algunos contenidos predeterminados. Tenemos que hacer un pequeño truco porque, al solicitar un nuevo espacio de trabajo, Cuis-Smalltalk no responde a la instancia creada, por lo que tenemos que buscarla en las ventanas del mundo.
Coloca el siguiente código después del código anterior.
"Open a Workspace with some default contents" morph := Workspace open. morph model actualContents: '"Some code" 1 + 2. "Other code" 5 * 3.'. morph morphPosition: 0 @ (area height // 2); morphExtent: extent x @ (2 / 3 * extent y). "Open a transcript for logs" Transcript open morphPosition: 0 @ (area height // 2 + (2 / 3 * extent y)); morphExtent: extent x @ (1 / 3 * extent y).
Por supuesto, debes ajustar el argumento del mensaje
#actualContents: a un código significativo para tu uso.
Para obtener más información sobre la política de guardado de imágenes, lee este debate en la comunidad Cuis aquí y aquí