Entrar
¿Nuevo usuario? Inscribirme
squeakRos
? ¿Ya estás suscrito? Entra a Yahoo!

Consejos

¿Sabías que...?
Podés cambiar el orden de los mensajes. Simplemente hacé clic en el enlace de columna fecha. Tus preferencias se guardarán, por lo tanto no necesitarás hacerlo otra vez cuando vuelvas a entrar.

Mensajes

  Mensajes Ayuda
Avanzado
Mensajes 507 - 536 de 3478   Más reciente  |  < Más reciente  |  Más antiguo >  |  Más antiguo
Mensajes: Mostrar resúmenes de los mensajes   (Agrupar por tema) Clasificar por fecha v  
#536 De: "Lic. Edgar J. De Cleene" <edgardec2001@...>
Fecha: Jue, 10 de Mar, 2005 8:26 am
Asunto: Re: empotrar ventana SO
edgardec2001
Sin conexión Sin conexión
Enviar correo Enviar correo
 
On 09/03/05 18:57, "Eduardo Ferro Aldama" <eduardo.ferro@...>
wrote:

> Es para llamar programas echos en Python + Gtk/Gnome... y también para
> poder ejecutar aplicaciones linux.... ahora tengo un sistema hecho con
> Python + Gtk que permite usar el ordenador como un sistema de ocio pero
> para ello ejecuta y controla muchas aplicaciones linux... Simplemente
> queria ver la posibilidad de sustituir la parte Python+Gtk por
> smalltalk. Simplemente por tener un ejemplo que conozco mejor para ir
> aprendiendo Squeak...
>
> Creo que más o menos me he explicado... aunque vistas las
> contestaciones, aunque echare un vistazo a lo que me habeis comentado
> pero más que nada para conocer, porque no me parece que sea sencillo
> integrar cosas externas tan facilmente.
>
>
> --
> Hasta otra!
Ahora esta mas claro.
Tu repuesta son los OS Process, fijate lo que le contesto a Augusto.
Si se puede llamar procesos externos y programas .
El tema es que mi mundo (el viejo y querido Mac) , no existe mas, ahora es
un Unix mas (al estilo Apple) y he evitado meterme en el lo mas que puedo.
Pero veo que no hay mas remedio, así que me tendré que poner.
En todo caso, viendo que hay linux fans en la lista, podremos intercambiar
info.
Para que sepan,  Dan Ingalls ya tiene lista la SqueakPC hace un año.
Se parece sospechosamente a la nueva Mac mini, pero es todo estado sólido.
Botea en un linux modificado recontra recortado y entra a Squeak.

Busquen el GraphViz y los .st para haccerlo andar desde Squeak.
Así podremos intercambiar info precisa y cuando terminemos tendremos el know
how de manejar la consola desde Squeak.

Edgar

#535 De: "Lic. Edgar J. De Cleene" <edgardec2001@...>
Fecha: Jue, 10 de Mar, 2005 8:17 am
Asunto: Re: Re[2]: empotrar ventana SO
edgardec2001
Sin conexión Sin conexión
Enviar correo Enviar correo
 
On 10/03/05 00:04, "Augusto J. Sacchetto" <asacchetto@...> wrote:

>
>
> On Wed, 09 Mar 2005 22:57:56 +0100
> Eduardo Ferro Aldama <eduardo.ferro@...> wrote:
>
> eduardo.ferro> > Seré curioso, que aplicaciones o cosas externas queres llamar
> ?
> eduardo.ferro> > O lo que queres es solo la "apariencia " de tus ventanas
> normales.
> eduardo.ferro> > Porque si es esto útimo, hay muchisimas soluciones.
> eduardo.ferro>
> eduardo.ferro> Es para llamar programas echos en Python + Gtk/Gnome... y
> también para
> eduardo.ferro> poder ejecutar aplicaciones linux.... ahora tengo un sistema
> hecho con
> eduardo.ferro> Python + Gtk que permite usar el ordenador como un sistema de
> ocio pero
> eduardo.ferro> para ello ejecuta y controla muchas aplicaciones linux...
> Simplemente
> eduardo.ferro> queria ver la posibilidad de sustituir la parte Python+Gtk por
> eduardo.ferro> smalltalk. Simplemente por tener un ejemplo que conozco mejor
> para ir
> eduardo.ferro> aprendiendo Squeak...
>
> Espero que nadie se enoje por lo que voy a preguntar (alerta de off-topic)
> pero aprovecho para sacarme las dudas: es muy difícil/complicado/tedioso
> armar una aplicación usando GTK? Digo, por lo que estuve leyendo para
> armar las interfaces hay que escribir bastante código, y ya de por sí parecía
> bastante engorroso... ¿hay algún entorno de desarrollo que hayas
> utilizado para facilitarte la tarea de armar la interfase gráfica de tu
> aplicación/es (estoy pensando en algo similar a Visual Studio en Windows)?
>
> Cualquier recurso al que me puedas apuntar (sitios, libros, listas de
> correo, etc) será bienvenido... ;-)
>
> PD: Si, ya sé... porque no uso Squeak... bueno, es que nunca le agarré
> la mano al smalltalk... pero le tengo fe al Squeak, por eso sigo
> suscripto a la lista... ;-)
> --
> Augusto J. Sacchetto <asacchetto@...>
>
>
>
>
> correo electrónico a: squeakRos-unsubscribe@...
>
>
> correo electrónico a: squeakRos-unsubscribe@...
>
>
> Enlaces de Yahoo! Grupos
>
>
>
>
>
>
>
Augusto:
Bueno que sigas en contacto.
En estos dias, en la lista en ingles, esta viniendo info de como lanzar
programas externos, que hagan algo y despues seguir en Squeak.
Para los muy curiosos les paso un link

http://www.graphviz.org

Es un sistema graficador interesantisimo en la onda soft libre.
La implementacion Mac ganó el premio 2004 de soft.
Ahora , uno de los tipos que realmente sabe y comparte , John Pierce, esta
tomando esto , ya tiene la forma de llamar y obtener resultados para
Windows.

Les paso el sitio de la consultora de John, tiene cosas realmente
profesionales.

http://squeak.saltypickle.com.

Si tenes ganas , nos reunimos, el mundo Squeak ha cambiado un monton desde
la última vez.

Ahora que a los argentinos nos empiezan a dar bola, creo que lo que se viene
será espectacular.

Edgar

#534 De: "Augusto J. Sacchetto" <asacchetto@...>
Fecha: Jue, 10 de Mar, 2005 3:04 am
Asunto: Re[2]: empotrar ventana SO
asacchetto@...
Enviar correo Enviar correo
 
On Wed, 09 Mar 2005 22:57:56 +0100
Eduardo Ferro Aldama <eduardo.ferro@...> wrote:

eduardo.ferro> > Seré curioso, que aplicaciones o cosas externas queres llamar ?
eduardo.ferro> > O lo que queres es solo la "apariencia " de tus ventanas
normales.
eduardo.ferro> > Porque si es esto útimo, hay muchisimas soluciones.
eduardo.ferro>
eduardo.ferro> Es para llamar programas echos en Python + Gtk/Gnome... y también
para
eduardo.ferro> poder ejecutar aplicaciones linux.... ahora tengo un sistema
hecho con
eduardo.ferro> Python + Gtk que permite usar el ordenador como un sistema de
ocio pero
eduardo.ferro> para ello ejecuta y controla muchas aplicaciones linux...
Simplemente
eduardo.ferro> queria ver la posibilidad de sustituir la parte Python+Gtk por
eduardo.ferro> smalltalk. Simplemente por tener un ejemplo que conozco mejor
para ir
eduardo.ferro> aprendiendo Squeak...

Espero que nadie se enoje por lo que voy a preguntar (alerta de off-topic)
pero aprovecho para sacarme las dudas: es muy difícil/complicado/tedioso
armar una aplicación usando GTK? Digo, por lo que estuve leyendo para
armar las interfaces hay que escribir bastante código, y ya de por sí parecía
bastante engorroso... ¿hay algún entorno de desarrollo que hayas
utilizado para facilitarte la tarea de armar la interfase gráfica de tu
aplicación/es (estoy pensando en algo similar a Visual Studio en Windows)?

Cualquier recurso al que me puedas apuntar (sitios, libros, listas de
correo, etc) será bienvenido... ;-)

PD: Si, ya sé... porque no uso Squeak... bueno, es que nunca le agarré
la mano al smalltalk... pero le tengo fe al Squeak, por eso sigo
suscripto a la lista... ;-)
--
Augusto J. Sacchetto <asacchetto@...>

#533 De: Eduardo Ferro Aldama <eduardo.ferro@...>
Fecha: Mié, 9 de Mar, 2005 9:57 pm
Asunto: Re: empotrar ventana SO
drtrucho
Sin conexión Sin conexión
Enviar correo Enviar correo
 
Buenos dias!

> >
> > Buenos dias!
> >
> > Me gustaria saber si exsite alguna clase Squeak que permita empotrar una
> > aplicación gráfica con ventana (no realizada en squeak) dentro del
> > entorno squeak... es decir un objeto que me permita ejecutar un proceso
> > y que si es gráfico me permita ver la ventana como si fuese dentro del
> > squeak....
> >
> > Si eso no existe también me conformaria en que categoria de clases debo
> > mirar para clases de control de procesos y llamadas a programas, aunque
> > no puedan ser gráficos
> >
> > Gracias de antemano
> En realidad Squeak eatá pensado como "autosuficiente", es decir todo es
> Squeak y el SO es solamente un inconveniente necesario para poder usar
> Squeak.

Soy consciente de ello y a ver para cuando un sistema operativo OO con
todo integrado, la verdad que sería fenomeno.

Lo que comento, lo quiero para poder integrar unas aplicaciones que ya
tengo hechas en otro lenguaje

>
> Por suerte , en esta lista no somos tan fanas, y si existen modos de
> "enganchar" con otras "aplicaciones"/
>
> Una es via FFI, que te permite hacer llamadas al sistema operativo, yo tengo
> hechas apiCalls al Mac OSX.
> Hay gente que ha hecho cosas sorprendentes.
> Otra forma son los OS Process, donde tambien se llaman a procesos tipo Unix
> (esto viene aparte y debes cargarlo de Squeak Map)

Voy a mirar esto último a ver si me permite manejar procesos linux
externos

> Seré curioso, que aplicaciones o cosas externas queres llamar ?
> O lo que queres es solo la "apariencia " de tus ventanas normales.
> Porque si es esto útimo, hay muchisimas soluciones.

Es para llamar programas echos en Python + Gtk/Gnome... y también para
poder ejecutar aplicaciones linux.... ahora tengo un sistema hecho con
Python + Gtk que permite usar el ordenador como un sistema de ocio pero
para ello ejecuta y controla muchas aplicaciones linux... Simplemente
queria ver la posibilidad de sustituir la parte Python+Gtk por
smalltalk. Simplemente por tener un ejemplo que conozco mejor para ir
aprendiendo Squeak...

Creo que más o menos me he explicado... aunque vistas las
contestaciones, aunque echare un vistazo a lo que me habeis comentado
pero más que nada para conocer, porque no me parece que sea sencillo
integrar cosas externas tan facilmente.


--
Hasta otra!
   Eduardo Ferro Aldama        http://personales.ya.com/eferro
   eduardo.ferro@...
   eferro@...

#532 De: Eduardo Ferro Aldama <eduardo.ferro@...>
Fecha: Mié, 9 de Mar, 2005 9:46 pm
Asunto: Re: empotrar ventana SO
drtrucho
Sin conexión Sin conexión
Enviar correo Enviar correo
 
El lun, 07-03-2005 a las 07:23 -0300, Germán Arduino escribió:
> > O lo que queres es solo la "apariencia " de tus ventanas normales.
> > Porque si es esto útimo, hay muchisimas soluciones.
>
> Si es este el caso, tanto apariencia como las ventanas fuera de la
> imagen e integradas con el SO, una experiencia muy interesante es
> wxSqueak, http://homepage.mac.com/rgayvert/wxsqueak.html

Yo realmente simplemente estaba pensando en manejar algunos programas
que ya tengo echos en otros lenguajes para irlos portando poco a poco
pero poderlos arrancarlos desde squeak

Gracias de todas formas....

De todas formas le he estado echando un vistazo a el enlace que me has
dado

--
Hasta otra!
   Eduardo Ferro Aldama        http://personales.ya.com/eferro
   eduardo.ferro@...
   eferro@...

#531 De: "Lic. Edgar J. De Cleene" <edgardec2001@...>
Fecha: Mar, 8 de Mar, 2005 8:42 am
Asunto: Re: Continuando con redes TCP....
edgardec2001
Sin conexión Sin conexión
Enviar correo Enviar correo
 
Es medio raro lo que contas.
Voy a ver tu codigo para mañana mandarte alguna opinion.
Mi experiencia en la UTN nunca colgo ninguna maquina ni lo que hice en casa con dos equipos.
Mi jefe de equipo Cees de Grot, que es quien me provee la cuena en holanda, acaba de implementar un programa de chat completo y tiene muchas subpartes interesantisimas con respecto a UDP.

Edgar

#530 De: Hernan Karate <hernan_karate@...>
Fecha: Lun, 7 de Mar, 2005 3:09 pm
Asunto: Continuando con redes TCP....
hernan_karate
Sin conexión Sin conexión
Enviar correo Enviar correo
 
Hola, nuevamente escribimos a la lista para pedir una mano. Resumiendo rapidamente: nuestra ausencia fue para hacer algunas adaptaciones a lo que nos mando Edgar. Las minimas modificaciones y adaptaciones fueron hechas y finalmente tenemos un prototipo primitivo del servidor TCP. El UDP se concreto con exito y funciona relativamente bien. El problema se suscito cuando al probar el servidor TCP varias veces (un numero variable) se rompio la VM, dejando a squeak colgado y tuvimos que reiniciar la PC porque las DLL no se liberaban y quedaba parte de la VM en ram, por consiguiente luego de la primer caida teniamos que reiniciar la pc... se caia de vuelta a la 5º ejecucion y lo mismo... variando el numero de ejecuciones. Nuestra duda se incremento cuando nos enteramos que algunas personas opinan que Squeak anda flojito en redes ¿Es eso cierto? ¿Acaso el codigo adaptado tiene algun error inherente que produce la falla? ¿Somos muy maletas? Esperamos ayuda y sugerencias. Muchas gracias, abajo enviamos el codigo y los ejemplos para montar un servidor y un cliente.
 
|t| "Ejemplo de servidor"
t:=TCPServer new.
t initialize: 8000.
t condition: [false].
t parameters: (Array new).
t listen.
 
 
|c| "Ejemplo de cliente"
c:=ClientApplicationModel newTCP: hostname atPort: 8000.
c client talk: 'conectarse'
c client talk: 'FIN' "indispensable, por ahora"
c client disconnect.
 
 
Ahora adjuntamos el .st
 
Object subclass: #AbstractClient
 instanceVariableNames: 'socket application buffer'
 classVariableNames: ''
 poolDictionaries: ''
 category: 'MetoPoo - Capa de red'!
!AbstractClient methodsFor: 'getters' stamp: 'AAT 1/4/2005 20:50'!
application
^ application! !
!AbstractClient methodsFor: 'getters' stamp: 'A 1/8/2005 15:49'!
buffer
 ^buffer.! !
!AbstractClient methodsFor: 'getters' stamp: 'AAT 1/4/2005 21:10'!
socket
^socket.! !

!AbstractClient methodsFor: 'initialize-release' stamp: 'AH 1/13/2005 23:29'!
connectTo: aHostName port: aPort application: anApplication bufferSize: anInteger
 self subclassResponsibility.! !

!AbstractClient methodsFor: 'setters' stamp: 'ah 1/7/2005 12:07'!
application: anApplication
 application:=anApplication.! !
!AbstractClient methodsFor: 'setters' stamp: 'A 1/8/2005 15:49'!
buffer: aBuffer
 buffer:= aBuffer.! !
!AbstractClient methodsFor: 'setters' stamp: 'AAT 1/4/2005 21:08'!
socket: aSocket
 socket:=aSocket.! !

!AbstractClient methodsFor: 'talking' stamp: 'AH 1/13/2005 23:31'!
talk: aMessage
 self subclassResponsibility.! !

!AbstractClient methodsFor: 'disconnecting' stamp: 'AH 1/13/2005 23:30'!
disconnect
 self socket closeAndDestroy.! !
"-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- "!
AbstractClient class
 instanceVariableNames: ''!
!AbstractClient class methodsFor: 'instance creation' stamp: 'AH 1/13/2005 23:28'!
connectTo: aHostName port: aPort application: anApplication
 self subclassResponsibility.! !
!AbstractClient class methodsFor: 'instance creation' stamp: 'AH 1/13/2005 23:27'!
connectTo: aHostName port: aPort application: anApplication bufferSize: anInteger
 self subclassResponsibility.! !

Object subclass: #ClientApplicationModel
 instanceVariableNames: 'client'
 classVariableNames: ''
 poolDictionaries: ''
 category: 'MetoPoo - Capa de red'!
!ClientApplicationModel methodsFor: 'getters' stamp: 'A 1/8/2005 17:50'!
client
 ^client.! !

!ClientApplicationModel methodsFor: 'initialize-release' stamp: 'AH 3/3/2005 11:06'!
initializeTCP: aHostName atPort: aPort
 self client: (TCPClient connectTo: aHostName port: aPort application: self).
! !
!ClientApplicationModel methodsFor: 'initialize-release' stamp: 'AH 3/3/2005 11:08'!
initializeUDP: aHostName atPort: aPort
 self client: (UDPClient connectTo: aHostName port: aPort application: self).
! !

!ClientApplicationModel methodsFor: 'private' stamp: 'A 1/8/2005 18:00'!
cantConnectToPort: aPort
 Transcript show: 'Jaja, no te pudiste conectar'! !
!ClientApplicationModel methodsFor: 'private' stamp: 'A 1/8/2005 17:58'!
cantSend: aMessage
 "No se me ocurre que poner como comentario"
 Transcript show: 'no se pudo enviar el mensaje:',aMessage.! !
!ClientApplicationModel methodsFor: 'private' stamp: 'AH 1/12/2005 14:55'!
serverNoResponse
 Transcript show: 'El servidor no me respondio'.! !
!ClientApplicationModel methodsFor: 'private' stamp: 'A 1/8/2005 17:57'!
serverResponse: aBuffer count: aNumber
 "Este mensaje es enviado por el cliente con lo servidor contesta luego del envio de un paquete"
 "Version rata ya que no utiliza la longitud del buffer."
 Transcript show: 'El servidor me respondio:',aBuffer.! !

!ClientApplicationModel methodsFor: 'setters' stamp: 'A 1/8/2005 17:49'!
client: aClient
 client:= aClient.! !
"-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- "!
ClientApplicationModel class
 instanceVariableNames: ''!
!ClientApplicationModel class methodsFor: 'instance creation' stamp: 'AH 3/3/2005 11:17'!
newTCP: aHostName atPort: aPort
 ^ super new initializeTCP: aHostName atPort: aPort.! !
!ClientApplicationModel class methodsFor: 'instance creation' stamp: 'AH 3/3/2005 11:17'!
newUDP: aHostName atPort: aPort
 ^ super new initializeUDP: aHostName atPort: aPort.! !
!ClientApplicationModel class methodsFor: 'instance creation' stamp: 'AH 3/3/2005 11:23'!
newUDPWithFirstServerAtPort: aPort
 | server |
 server:= ((self loopForServersAtPort: aPort) first) key.
 ^ self newUDP:server atPort: aPort.
 ! !

AbstractClient subclass: #TCPClient
 instanceVariableNames: ''
 classVariableNames: ''
 poolDictionaries: ''
 category: 'MetoPoo - Capa de red'!
!TCPClient methodsFor: 'initialize-release' stamp: 'ah 2/26/2005 16:00'!
connectTo: aHostName port: aPort application: anApplication bufferSize: anInteger

 self application: anApplication.
 self newSocketFor: aHostName to: aPort.
! !
!TCPClient methodsFor: 'initialize-release' stamp: 'AH 3/3/2005 15:24'!
newSocketFor: aHostName to: aPort
 
 socket _ (Socket tcpCreateIfFail: [self application cantConnectToPort: aPort]).
 socket connectTo: (NetNameResolver addressForName: aHostName) port: aPort.
 socket waitForConnectionFor: (Socket standardDeadline).
 
 
 ! !

!TCPClient methodsFor: 'talking' stamp: 'AH 3/7/2005 10:51'!
talk: aMessage
 
 "Permite enviar un mensaje utilizando la coneccion TCP. Envia la respuesta del servidor a la aplicacion para que decida que hacer"
 
 
 | objRec bytesRec |
 objRec:= String new.
 (socket isValid and: [socket
isConnected])
  ifTrue: [socket sendData: aMessage.]
  ifFalse: ["stale connection" socket
destroy.
     socket := nil.
     self application cantSend: aMessage].
    
 
 bytesRec:= self socket receiveDataTimeout: 50 into: objRec.
 (bytesRec = 0) ifFalse: [ self application serverResponse: objRec count: (objRec size)]
     ifTrue: [ self application serverNoResponse]! !
"-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- "!
TCPClient class
 instanceVariableNames: ''!
!TCPClient class methodsFor: 'instance creation' stamp: 'AH 1/12/2005 15:00'!
connectTo: aHostName port: aPort application: anApplication
 ^super new connectTo: aHostName port: aPort application: anApplication bufferSize: 5000.! !
!TCPClient class methodsFor: 'instance creation' stamp: 'AH 1/12/2005 14:59'!
connectTo: aHostName port: aPort application: anApplication bufferSize: anInteger
 ^super new connectTo: aHostName port: aPort application: anApplication bufferSize: anInteger.! !

Object subclass: #TCPServer
 instanceVariableNames: 'application buffer clients condition parameters port socket'
 classVariableNames: ''
 poolDictionaries: ''
 category: 'MetoPoo - Capa de red'!
!TCPServer methodsFor: 'listen' stamp: 'A 3/7/2005 10:59'!
listen
| command iPAddress s |
socket _ Socket
tcpCreateIfFail: [^ Transcript show: 'Se rompio todo'].
socket listenOn: (self port).
[self evaluate] whileFalse:
[
 socket waitForConnectionFor: (Socket deadlineSecs: 30) ifTimedOut: [^true.].
 [socket isConnected]
whileTrue:
  [ socket dataAvailable ifTrue:
  [
   command _ socket getData.
 
  iPAddress := NetNameResolver stringFromAddress: socket remoteAddress.
   s := String new.
   s := iPAddress , Character tab asString , 'Envio ',command
printString.
   Transcript show: s;cr.
   (command='FIN') ifFalse:
    [
     socket sendData: 'OK'.
     socket sendData: 'Hola, espero que llegue al menos la mitad de este texto'.
     socket sendData: ('Y un cachito de este \' withCRs).
     socket sendData: 'FIN'.
    ]
   ifTrue:
    [
     socket sendData: 'Hasta la vista baby echecopar'.
     socket disconnect
    ].
  ]
 ].
].
socket
destroy.! !

!TCPServer methodsFor: 'initialize-release' stamp: 'AAT 2/26/2005 15:57'!
initialize: aPort
 "Guarda en la variable port el numero de puerto en el cual esta inicializado."
 self port: aPort.
 self buffer: (String new: 1024).
 self clients: Dictionary new.
 Socket initializeNetwork.
 self socket: Socket newUDP.
 self socket: ( self socket setPort: aPort).
 self buffer: (String new: 4000).! !

!TCPServer methodsFor: 'setters' stamp: 'AAT 2/26/2005 15:58'!
application: anApp
 application:=anApp.! !
!TCPServer methodsFor: 'setters' stamp: 'AAT 2/26/2005 15:58'!
buffer: aBuffer
 buffer:=aBuffer.! !
!TCPServer methodsFor: 'setters' stamp: 'AAT 2/26/2005 15:59'!
clients: aDictionary
 clients:=aDictionary.! !
!TCPServer methodsFor: 'setters' stamp: 'AAT 2/26/2005 15:59'!
condition: aConditionBlock
 condition:= aConditionBlock.! !
!TCPServer methodsFor: 'setters' stamp: 'AAT 2/26/2005 16:00'!
parameters: anArray
 parameters:=anArray.! !
!TCPServer methodsFor: 'setters' stamp: 'AAT 2/26/2005 16:00'!
port: aPort
port:=aPort.! !
!TCPServer methodsFor: 'setters' stamp: 'AAT 2/26/2005 16:01'!
socket: aSocket
socket:=aSocket.! !

!TCPServer methodsFor: 'private' stamp: 'AAT 2/26/2005 16:02'!
evaluate
 ^(self condition) valueWithArguments: self parameters.! !

!TCPServer methodsFor: 'getters' stamp: 'AAT 2/26/2005 16:05'!
application
^application! !
!TCPServer methodsFor: 'getters' stamp: 'AAT 2/26/2005 16:06'!
buffer
^buffer.! !
!TCPServer methodsFor: 'getters' stamp: 'AAT 2/26/2005 16:06'!
clients
^clients! !
!TCPServer methodsFor: 'getters' stamp: 'AAT 2/26/2005 16:07'!
condition
^condition.! !
!TCPServer methodsFor: 'getters' stamp: 'AAT 2/26/2005 16:07'!
parameters
^parameters! !
!TCPServer methodsFor: 'getters' stamp: 'AAT 2/26/2005 16:07'!
port
^port.! !
!TCPServer methodsFor: 'getters' stamp: 'AAT 2/26/2005 16:09'!
socket
^socket.! !

AbstractClient subclass: #UDPClient
 instanceVariableNames: ''
 classVariableNames: ''
 poolDictionaries: ''
 category: 'MetoPoo - Capa de red'!
!UDPClient methodsFor: 'initialize-release' stamp: 'AH 1/13/2005 22:38'!
connectTo: aHostName port: aPort application: anApplication bufferSize: anInteger

 self application: anApplication.
 self buffer: (String new: anInteger).
 self socket: (Socket udpCreateIfFail: [self application cantConnectToPort: aPort]).
 self socket setPeer: (NetNameResolver addressForName: aHostName) port: aPort.
 self socket waitForConnectionFor: (Socket standardDeadline).! !

!UDPClient methodsFor: 'talking' stamp: 'AH 1/13/2005 22:31'!
talk: aMessage
 
 "Permite enviar un mensaje utilizando la coneccion UDP. Envia la respuesta del servidor a la aplicacion para que decida que hacer"
 
 
 | bytesRec |
 (self socket isConnected)
  ifTrue: [
    (self socket) sendData: aMessage.  "aca se podria poner un waitForSendDone"
    bytesRec:= self socket receiveDataTimeout: 10 into: (self buffer).
    (bytesRec = 0) ifFalse: [self application serverResponse: (self buffer) count: bytesRec]
        ifTrue: [self application serverNoResponse]      
    ]
  ifFalse: [self application cantSend: aMessage]
 ! !
"-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- "!
UDPClient class
 instanceVariableNames: ''!
!UDPClient class methodsFor: 'instance creation' stamp: 'AH 1/13/2005 22:39'!
connectTo: aHostName port: aPort application: anApplication
 ^super new connectTo: aHostName port: aPort application: anApplication bufferSize: 5000.! !
!UDPClient class methodsFor: 'instance creation' stamp: 'AH 1/13/2005 22:39'!
connectTo: aHostName port: aPort application: anApplication bufferSize: anInteger
 ^super new connectToPort: aPort application: anApplication bufferSize: anInteger.! !

!UDPClient class methodsFor: 'utilities' stamp: 'AH 1/13/2005 22:40'!
getBroadcastIp
 |address|
 address:=self getMyIp.
 ((address at: 1) >=192) ifTrue: [address at: 4 put: 255. ^address].
 ((address at: 1) >=128) ifTrue: [address at: 4 put: 255. address at: 3 put: 255. ^ address].
      address at: 4 put: 255. address at: 3 put: 255. address at: 2 put: 255.
 ^address! !
!UDPClient class methodsFor: 'utilities' stamp: 'AH 1/13/2005 22:40'!
getMyIp
 ^ NetNameResolver primLocalAddress.! !
!UDPClient class methodsFor: 'utilities' stamp: 'AH 1/13/2005 22:41'!
loopForServersAtPort: aPort
 "busca durante 10 segundos los servidores disponibles y los retorna en un diccionario servers. Esto permite al usuario decidir con que servidor conectarse y de que manera hacerlo"
 
 ^ (self loopForServersAtPort: aPort ifFail:[]).! !
!UDPClient class methodsFor: 'utilities' stamp: 'ah 2/26/2005 15:13'!
loopForServersAtPort: aPort ifFail: failBlock
 "busca durante 10 segundos los servidores disponibles y los retorna en un diccionario servers. Esto permite al usuario decidir con que servidor conectarse y de que manera hacerlo"
 
 
     | inicio servers udpSocket bytesRec buffer|
 buffer:= String new: 5000.
 udpSocket:= (Socket udpCreateIfFail: failBlock).
 udpSocket setPeer: (self getBroadcastIp) port: aPort.
 
 inicio:= (DateAndTime now) asSeconds.
 servers:= OrderedCollection new.
 [(inicio + 10) >= (DateAndTime now) asSeconds] whileTrue:
  [udpSocket sendData: 'xxx'.
  bytesRec:= udpSocket receiveDataTimeout: 10 into: buffer.
  (bytesRec = 0) ifFalse: [servers add: (Association key: (udpSocket peerName) value: (udpSocket remoteAddress) ) ] ].
 
 udpSocket closeAndDestroy.
 
 ^ servers.! !

Object subclass: #UDPServer
 instanceVariableNames: 'port buffer clients socket condition parameters application'
 classVariableNames: ''
 poolDictionaries: ''
 category: 'MetoPoo - Capa de red'!
!UDPServer methodsFor: 'setters' stamp: 'AAT 1/5/2005 01:42'!
application: anApp
 application:=anApp.! !
!UDPServer methodsFor: 'setters' stamp: 'AAT 1/5/2005 01:43'!
buffer: aBuffer
 buffer:=aBuffer.! !
!UDPServer methodsFor: 'setters' stamp: 'AAT 1/5/2005 01:44'!
clients: aDictionary
 clients:=aDictionary.! !
!UDPServer methodsFor: 'setters' stamp: 'AAT 1/5/2005 01:43'!
condition: aConditionBlock
 condition:= aConditionBlock.! !
!UDPServer methodsFor: 'setters' stamp: 'AAT 1/5/2005 01:46'!
parameters: anArray
 parameters:=anArray.! !
!UDPServer methodsFor: 'setters' stamp: 'AAT 1/5/2005 03:21'!
port: aPort
port:=aPort.! !
!UDPServer methodsFor: 'setters' stamp: 'AAT 1/5/2005 02:08'!
socket: aSocket
socket:=aSocket.! !

!UDPServer methodsFor: 'initialize-release' stamp: 'AAT 1/8/2005 02:57'!
initialize: aPort
 "Guarda en la variable port el numero de puerto en el cual esta inicializado."
 self port: aPort.
 self buffer: (String new: 1024).
 self clients: Dictionary new.
 Socket initializeNetwork.
 self socket: Socket newUDP.
 self socket: ( self socket setPort: aPort).
 self buffer: (String new: 4000).! !

!UDPServer methodsFor: 'listen' stamp: 'AAT 2/26/2005 15:13'!
listen
 "Obtiene los mensajes enviados por los clientes y los envia luego a la aplicacion, tambien envia el tama–o de los mismos y la direccion del cliente. En caso que la aplicacion decida que corresponde responder enviara los mensajes a los clientes por medio del mensaje broadCast:with:to:"
 |n address|
 [self evaluate] whileFalse: [
  ((self socket) dataAvailable) ifTrue:
   [n := (self socket) receiveDataInto: buffer.
   address:=(self socket) address.
   "self application processBuffer: (address deepCopy) withMessage: (buffer deepCopy) and: (n deepCopy).   "
   "(self socket) address: address."
   (self socket) sendData: buffer count: n.
   ]].! !

!UDPServer methodsFor: 'private' stamp: 'AAT 1/5/2005 02:27'!
evaluate
 ^(self condition) valueWithArguments: self parameters.! !

!UDPServer methodsFor: 'getters' stamp: 'AAT 1/5/2005 02:03'!
application
^application! !
!UDPServer methodsFor: 'getters' stamp: 'AAT 1/5/2005 01:53'!
buffer
^buffer.! !
!UDPServer methodsFor: 'getters' stamp: 'AAT 1/5/2005 01:58'!
clients
^clients! !
!UDPServer methodsFor: 'getters' stamp: 'AAT 1/5/2005 01:48'!
condition
^condition.! !
!UDPServer methodsFor: 'getters' stamp: 'AAT 1/5/2005 01:48'!
parameters
^parameters! !
!UDPServer methodsFor: 'getters' stamp: 'AAT 1/5/2005 01:47'!
port
^port.! !
!UDPServer methodsFor: 'getters' stamp: 'AAT 1/5/2005 01:49'!
socket
^socket.! !

!UDPServer methodsFor: 'routing' stamp: 'AAT 1/8/2005 04:14'!
broadcast:  aMessage with: aSize to: aClientCollection
 (aClientCollection values) do: [ :clientAddress|
        (self socket) address: clientAddress.
        (self socket) sendData: aMessage count: aSize.
        Transcript show: aMessage.].! !

 


250MB gratis, Antivirus y Antispam
Correo Yahoo!, el mejor correo web del mundo
Abrí tu cuenta aquí

#529 De: Germán Arduino <garduino@...>
Fecha: Lun, 7 de Mar, 2005 10:23 am
Asunto: Re: empotrar ventana SO
garduino
Sin conexión Sin conexión
Enviar correo Enviar correo
 
> O lo que queres es solo la "apariencia " de tus ventanas normales.
> Porque si es esto útimo, hay muchisimas soluciones.
>

Si es este el caso, tanto apariencia como las ventanas fuera de la
imagen e integradas con el SO, una experiencia muy interesante es
wxSqueak, http://homepage.mac.com/rgayvert/wxsqueak.html

Si bien aún le faltan cosas (como un diseñador gráfico de UI) permite
(sobretodo en la nueva versión 0.4 recientemente liberada) hacer
aplicaciones de "negocios" como la gente espera ver.......y seguir
usando Squeak ! :)

Saludos.
gsa.

#528 De: "Lic. Edgar J. De Cleene" <edgardec2001@...>
Fecha: Lun, 7 de Mar, 2005 9:19 am
Asunto: Re: Consultas de eduardo
edgardec2001
Sin conexión Sin conexión
Enviar correo Enviar correo
 
On 06/03/05 19:38, "Eduardo Ferro Aldama" <eduardo.ferro@...>
wrote:

>
> El jue, 24-02-2005 a las 05:45 -0300, Lic. Edgar J. De Cleene escribió:
>
> Hola!
>
>> Eduardo:
>> Forwardee tus preguntas al grupo, en el futuro manda al grupo.
>> Conseguite el BobUI, si no podes conseguirlo avisa y yo subo una version
>> actualizada al sitio (para que todos lo vean), tus dudas son las de otro.
>> Como te habras enterado, soy parte de uno de los nuevos Team, para el nuevo
>> Squeak.
>> Esoy con unos chicos llamados Dan Ingalls y Ned Kontz , entre otros y con el
>> profe Juan Vuletich.
>> Espero quea hayas leido Pepito.
>
> Voy a buscar lo de BobIU por la web a ver cómo es...
> Felicidades por lo del equipo... la verdad es que habia leido que habia
> habido movimientos, pero no me habia metido a ver lo que habia
> pasado....
>
>
>> Vamos a hacer juntos el ejercicio de armar lo de la Biblioteca de libros, si
>> queres.
>> Te pido que de toda la experiencia , problemas, etc, hagas algo tipeado en
>> el Word nomas, para que cuando este terminado, lo subamos al grupo, a ver si
>> sale del coma 4 en que está.
>
> Me parece bien que lo hagamos juntos... de todas formas como ves voy
> pasito a pasito y miro las cosas cada bastante tiempo....
> de todas formas aunque no tengo ni idea el crear las clases Libro,
> Biblioteca, etc... no me cuesta, por lo menos mientras son objetos de
> "negocio", cuando me lio es cuando quiero dar un interface a esos
> objetos...
> En cuanto a lo de tomar notas, suelo hacerlo en un wiki que tengo en
> casa por lo que ir registrando los avances y las cosas que vaya probando
> no es problema....
>
> Por cierto que uso squeak 3.7 en linux, lo digo por si existen
> diferencias importantes entre versiones y necesito
>
>
>> Es Squeak esta en plena transformaciedon y tendra un constructor de
>> interfaces.
>> No te podria decir cuando.
>> Un abrazo y espero noticias cuando estes listo.
>
> Muchas gracias por el ofrecimiento... y espero que no sea demasiado
> pesado como alumno
>
> Gracias
Eduardo:
Si vos supieras las cosas que le pregungo por privado a Ned Kontz (uno de
los importantes y amables en la comunidad"

El BobUI está en SqueakMao o para los "iniciados" en SM.
La diferencia entre versiones es que podes tener mas o menos cosas.
Para trabajar "en serio" a este momento hay dos alternativas.
La version "universos" de Lex Spoon que tiene todo lo que hay que este
absolutamente probado y corra en Squeak

http://minnow.cc.gatech.edu/squeak/3835

La version "desarrolladores" con 3.8 y el script de carga de John Pierce

Mas tarde subire el BobUi al sitio, está atento en archivos

Edgar

#527 De: "Lic. Edgar J. De Cleene" <edgardec2001@...>
Fecha: Lun, 7 de Mar, 2005 9:06 am
Asunto: Re: empotrar ventana SO
edgardec2001
Sin conexión Sin conexión
Enviar correo Enviar correo
 
On 06/03/05 15:26, "Eduardo Ferro Aldama" <eduardo.ferro@...>
wrote:

>
> Buenos dias!
>
> Me gustaria saber si exsite alguna clase Squeak que permita empotrar una
> aplicación gráfica con ventana (no realizada en squeak) dentro del
> entorno squeak... es decir un objeto que me permita ejecutar un proceso
> y que si es gráfico me permita ver la ventana como si fuese dentro del
> squeak....
>
> Si eso no existe también me conformaria en que categoria de clases debo
> mirar para clases de control de procesos y llamadas a programas, aunque
> no puedan ser gráficos
>
> Gracias de antemano
En realidad Squeak eatá pensado como "autosuficiente", es decir todo es
Squeak y el SO es solamente un inconveniente necesario para poder usar
Squeak.

Por suerte , en esta lista no somos tan fanas, y si existen modos de
"enganchar" con otras "aplicaciones"/

Una es via FFI, que te permite hacer llamadas al sistema operativo, yo tengo
hechas apiCalls al Mac OSX.
Hay gente que ha hecho cosas sorprendentes.
Otra forma son los OS Process, donde tambien se llaman a procesos tipo Unix
(esto viene aparte y debes cargarlo de Squeak Map)

Seré curioso, que aplicaciones o cosas externas queres llamar ?
O lo que queres es solo la "apariencia " de tus ventanas normales.
Porque si es esto útimo, hay muchisimas soluciones.

Edgar

#526 De: Eduardo Ferro Aldama <eduardo.ferro@...>
Fecha: Dom, 6 de Mar, 2005 10:38 pm
Asunto: Re: Consultas de eduardo
drtrucho
Sin conexión Sin conexión
Enviar correo Enviar correo
 
El jue, 24-02-2005 a las 05:45 -0300, Lic. Edgar J. De Cleene escribió:

Hola!

> Eduardo:
> Forwardee tus preguntas al grupo, en el futuro manda al grupo.
> Conseguite el BobUI, si no podes conseguirlo avisa y yo subo una version
> actualizada al sitio (para que todos lo vean), tus dudas son las de otro.
> Como te habras enterado, soy parte de uno de los nuevos Team, para el nuevo
> Squeak.
> Esoy con unos chicos llamados Dan Ingalls y Ned Kontz , entre otros y con el
> profe Juan Vuletich.
> Espero quea hayas leido Pepito.

Voy a buscar lo de BobIU por la web a ver cómo es...
Felicidades por lo del equipo... la verdad es que habia leido que habia
habido movimientos, pero no me habia metido a ver lo que habia
pasado....


> Vamos a hacer juntos el ejercicio de armar lo de la Biblioteca de libros, si
> queres.
> Te pido que de toda la experiencia , problemas, etc, hagas algo tipeado en
> el Word nomas, para que cuando este terminado, lo subamos al grupo, a ver si
> sale del coma 4 en que está.

Me parece bien que lo hagamos juntos... de todas formas como ves voy
pasito a pasito y miro las cosas cada bastante tiempo....
de todas formas aunque no tengo ni idea el crear las clases Libro,
Biblioteca, etc... no me cuesta, por lo menos mientras son objetos de
"negocio", cuando me lio es cuando quiero dar un interface a esos
objetos...
En cuanto a lo de tomar notas, suelo hacerlo en un wiki que tengo en
casa por lo que ir registrando los avances y las cosas que vaya probando
no es problema....

Por cierto que uso squeak 3.7 en linux, lo digo por si existen
diferencias importantes entre versiones y necesito


> Es Squeak esta en plena transformaciedon y tendra un constructor de
> interfaces.
> No te podria decir cuando.
> Un abrazo y espero noticias cuando estes listo.

Muchas gracias por el ofrecimiento... y espero que no sea demasiado
pesado como alumno

Gracias

--
Hasta otra!
   Eduardo Ferro Aldama        http://personales.ya.com/eferro
   eduardo.ferro@...
   eferro@...

#525 De: Eduardo Ferro Aldama <eduardo.ferro@...>
Fecha: Dom, 6 de Mar, 2005 6:26 pm
Asunto: empotrar ventana SO
drtrucho
Sin conexión Sin conexión
Enviar correo Enviar correo
 
Buenos dias!

Me gustaria saber si exsite alguna clase Squeak que permita empotrar una
aplicación gráfica con ventana (no realizada en squeak) dentro del
entorno squeak... es decir un objeto que me permita ejecutar un proceso
y que si es gráfico me permita ver la ventana como si fuese dentro del
squeak....

Si eso no existe también me conformaria en que categoria de clases debo
mirar para clases de control de procesos y llamadas a programas, aunque
no puedan ser gráficos

Gracias de antemano

--
Hasta otra!
   Eduardo Ferro Aldama        http://personales.ya.com/eferro
   eduardo.ferro@...
   eferro@...

#524 De: "Lic. Edgar J. De Cleene" <edgardec2001@...>
Fecha: Mar, 1 de Mar, 2005 8:37 am
Asunto: Re: Consultas de eduardo
edgardec2001
Sin conexión Sin conexión
Enviar correo Enviar correo
 
Mario:
El Squeak está en vias de una enorme reorganizacion.
Entre varios equipos, hay uno denomindado Morphic Splitters en los que estoy
con Dan Ingalls, Ned Kontz, Juan Vuletich y otros.
Se va a hacer tambien una especie de GUI Builder, a la Visual Works.
Habría que junatar gente y dar una charla, el Squeak actual (y futuro), es
bastante distinto de cuando empezamos.
Dan Ingalls tambient tiene listo todo lo que sera base del 4.0, que será 64
bits y donde cambiara el formato de los objetos, etc.

Edgar

#523 De: "Lic. Edgar J. De Cleene" <edgardec2001@...>
Fecha: Jue, 24 de Feb, 2005 8:45 am
Asunto: Consultas de eduardo
edgardec2001
Sin conexión Sin conexión
Enviar correo Enviar correo
 
Eduardo:
Forwardee tus preguntas al grupo, en el futuro manda al grupo.
Conseguite el BobUI, si no podes conseguirlo avisa y yo subo una version
actualizada al sitio (para que todos lo vean), tus dudas son las de otro.
Como te habras enterado, soy parte de uno de los nuevos Team, para el nuevo
Squeak.
Esoy con unos chicos llamados Dan Ingalls y Ned Kontz , entre otros y con el
profe Juan Vuletich.
Espero quea hayas leido Pepito.
Vamos a hacer juntos el ejercicio de armar lo de la Biblioteca de libros, si
queres.
Te pido que de toda la experiencia , problemas, etc, hagas algo tipeado en
el Word nomas, para que cuando este terminado, lo subamos al grupo, a ver si
sale del coma 4 en que está.
Es Squeak esta en plena transformaciedon y tendra un constructor de
interfaces.
No te podria decir cuando.
Un abrazo y espero noticias cuando estes listo.

Edgar

#522 De: "Lic. Edgar J. De Cleene" <edgardec2001@...>
Fecha: Jue, 24 de Feb, 2005 8:38 am
Asunto: FW: [objetos] Separación Negocio Interfaz en Squeak
edgardec2001
Sin conexión Sin conexión
Enviar correo Enviar correo
 
------ Forwarded Message
From: Eduardo Ferro Aldama <eduardo.ferro@...>
Date: Wed, 23 Feb 2005 07:22:18 +0100
To: "Lic. Edgar J. De Cleene" <edgardec2001@...>
Subject: Re: [objetos] Separación Negocio Interfaz en Squeak


Buenos dias.
Primero disculparme por la tardanza en contestar, pero es que he tenido
problemas con el ordenador y habia extraviado parte del correo....
pero aunque con retrado contesto :-)


> > Buenos dias!
> >
> > Primero advierto a todos que estoy comenzando en esto de la tecnologia
> > de objetos...
> > Para conseguir comenzar a aprender estoy "jugando" y experimentando
> > con Squeak. Por ahora he conseguido hacer cosas sencillas jugando con
> > el depurador, browser y sobre todo leyendo con los ojos muy abiertos
> > la lista de smalltalking... ahora estoy intentando hacer un sistema de
> > [...]
> > - quién representa a un libro de mi biblioteca? cómo?
> > - cómo se unen la parte de interface con el modelo en sistemas squeak?
> > - Existe alguna recomendación "oficial" sobre cómo hacerlo?
> > algún "framework" signifique lo que signifique esto?
> > - Si mis libros conocen sus contenido (por ejemplo un .pdf), su
> > portada (.jpg), etc.... esos objetos son de modelo o de interface... y
> > dónde se ponen?... y como se renderizan llegado el momento?
> >
> > No quiero soluciones... sólo retos, aprender, equivocarme, volver a
> > equivocarme, crecer :-)
> >
> > Alguna luz para saber por dónde seguir?
> >
> >
> > Gracias de antemano por todo lo que podaís aportar al respecto....
> >

> Eduardo:
> Aunque seguramente los amigos de Smalltalking te darán mejores consejos, te
> cuento existe un grupo dedicado solamente a Squeak y a principiantes,
> llamado SqueakRos, que tiene un grupo yahoo y una página con algunos
> tutoriales en castellano e inglés.
>
> http://ar.geocities.com/edgardec2001/Welcome.html
> http://ar.groups.yahoo.com/group/squeakRos/

Si les he estado echando un vistazo... tanto a la página como a los
tutoriales aunque con el problema del ordenador no he podido meterme
demasiado en el tema

>
> Aclarando, dijo el lechero y le ponía agua a la leche.
>
> Un libro es un objeto.
> Una biblioteca, ente otras cosa, es una colección de libros.

Estos dos puntos los tenia claros...

> Por lo tanto , usa una colección tal como una OrderedCollection , que
> posteriormente podrás pedir que se ordene segun tus criterios en
> SortedCollection.

esta parte, lo que podriamos llamar negocio o modelo, la tenia ya hecha
y más o menos clara.... el problema venia cuando me ponia a intentar
crearle un




> En cuanto a Morphic, es un conjunto de artefactos visuales que en general
> tiene poco o nada que ver con programas comunes.
> Hay algunos morphs que te serviran para entrar datos , como el
> FillInTheBlankMorph.
> Otros te servirån para "visualizar" tus libros.
> Por ejemplo podrías usar algun tipo de PluggableList .
> Squeak no tiene un constructor de interfaces visuales como otros Smalltalk
> (o VisualBasic).
> Eso es lo que desconcierta.
> Así que si , vas a renegar, pero aprenderás un montón.
> Al final, te darás cuenta que no es tan feo como parece y si muy poderoso.
> A tus ordenes para tratar de ayudarte.


Le voy a ir echando un vistazo a esos morphs que comentas y a como se
usan a ver si eso me da alguna idea de por donde van los tiros...

Yo inicialmente estaba considerando un GUI sencillo al estilo de cajas
de texto y combos o algo simiñar... solo como primer paso y para
entender como se pueden hacer.

Gracias por el interes y por la información

--
Hasta otra!
   Eduardo Ferro Aldama        http://personales.ya.com/eferro
   eduardo.ferro@...
   eferro@...


------ End of Forwarded Message

#521 De: "Lic. Edgar J. De Cleene" <edgardec2001@...>
Fecha: Jue, 24 de Feb, 2005 8:38 am
Asunto: FW: [objetos] Separación Negocio Interfaz en Squeak
edgardec2001
Sin conexión Sin conexión
Enviar correo Enviar correo
 
------ Forwarded Message
From: Eduardo Ferro Aldama <eduardo.ferro@...>
Date: Wed, 23 Feb 2005 07:22:18 +0100
To: "Lic. Edgar J. De Cleene" <edgardec2001@...>
Subject: Re: [objetos] Separación Negocio Interfaz en Squeak


Buenos dias.
Primero disculparme por la tardanza en contestar, pero es que he tenido
problemas con el ordenador y habia extraviado parte del correo....
pero aunque con retrado contesto :-)


> > Buenos dias!
> >
> > Primero advierto a todos que estoy comenzando en esto de la tecnologia
> > de objetos...
> > Para conseguir comenzar a aprender estoy "jugando" y experimentando
> > con Squeak. Por ahora he conseguido hacer cosas sencillas jugando con
> > el depurador, browser y sobre todo leyendo con los ojos muy abiertos
> > la lista de smalltalking... ahora estoy intentando hacer un sistema de
> > [...]
> > - quién representa a un libro de mi biblioteca? cómo?
> > - cómo se unen la parte de interface con el modelo en sistemas squeak?
> > - Existe alguna recomendación "oficial" sobre cómo hacerlo?
> > algún "framework" signifique lo que signifique esto?
> > - Si mis libros conocen sus contenido (por ejemplo un .pdf), su
> > portada (.jpg), etc.... esos objetos son de modelo o de interface... y
> > dónde se ponen?... y como se renderizan llegado el momento?
> >
> > No quiero soluciones... sólo retos, aprender, equivocarme, volver a
> > equivocarme, crecer :-)
> >
> > Alguna luz para saber por dónde seguir?
> >
> >
> > Gracias de antemano por todo lo que podaís aportar al respecto....
> >

> Eduardo:
> Aunque seguramente los amigos de Smalltalking te darán mejores consejos, te
> cuento existe un grupo dedicado solamente a Squeak y a principiantes,
> llamado SqueakRos, que tiene un grupo yahoo y una página con algunos
> tutoriales en castellano e inglés.
>
> http://ar.geocities.com/edgardec2001/Welcome.html
> http://ar.groups.yahoo.com/group/squeakRos/

Si les he estado echando un vistazo... tanto a la página como a los
tutoriales aunque con el problema del ordenador no he podido meterme
demasiado en el tema

>
> Aclarando, dijo el lechero y le ponía agua a la leche.
>
> Un libro es un objeto.
> Una biblioteca, ente otras cosa, es una colección de libros.

Estos dos puntos los tenia claros...

> Por lo tanto , usa una colección tal como una OrderedCollection , que
> posteriormente podrás pedir que se ordene segun tus criterios en
> SortedCollection.

esta parte, lo que podriamos llamar negocio o modelo, la tenia ya hecha
y más o menos clara.... el problema venia cuando me ponia a intentar
crearle un




> En cuanto a Morphic, es un conjunto de artefactos visuales que en general
> tiene poco o nada que ver con programas comunes.
> Hay algunos morphs que te serviran para entrar datos , como el
> FillInTheBlankMorph.
> Otros te servirån para "visualizar" tus libros.
> Por ejemplo podrías usar algun tipo de PluggableList .
> Squeak no tiene un constructor de interfaces visuales como otros Smalltalk
> (o VisualBasic).
> Eso es lo que desconcierta.
> Así que si , vas a renegar, pero aprenderás un montón.
> Al final, te darás cuenta que no es tan feo como parece y si muy poderoso.
> A tus ordenes para tratar de ayudarte.


Le voy a ir echando un vistazo a esos morphs que comentas y a como se
usan a ver si eso me da alguna idea de por donde van los tiros...

Yo inicialmente estaba considerando un GUI sencillo al estilo de cajas
de texto y combos o algo simiñar... solo como primer paso y para
entender como se pueden hacer.

Gracias por el interes y por la información

--
Hasta otra!
   Eduardo Ferro Aldama        http://personales.ya.com/eferro
   eduardo.ferro@...
   eferro@...


------ End of Forwarded Message

#520 De: "Lic. Edgar J. De Cleene" <edgardec2001@...>
Fecha: Vie, 14 de Ene, 2005 12:45 pm
Asunto: Tutorial morphic y datos imagen
edgardec2001
Sin conexión Sin conexión
Enviar correo Enviar correo
 
Eduardo:
Trataré de ayudarte a construir tu programa.
Espero que hayas leído lo que tenemos en Internet y que hayas bajado los
libros SmalltalkByExample y Smalltalk with Style del sitio de Ducasse.

Hay una lista de links en el sitio, te mando una mas actualizada a[parte.
No te molestes en buscar en Internet, lo que deseas no existe. (hay muchos
tutoriales parciales a distintas cosas, dispersos por ahí_
Lo mas cercano sería el primer libro de Mark Guzdial.
Pero a no desesperarse, aquí te ayudaremos.

No sé como serán las bibliotecas en España, imagino que mucho mas modernas.
Aquí las bibliotecas tienen un salón grande con muchos ficheros metálicos
con rótulos y que contienen montones de fichas con datos como nombre,
título, clave.
No tienen fotos.

Pero eso no importa.
Quisiera saber como has "importado" o visto tu .jpg dentro de Squeak.
Hay muchas formas de hacerlo.

Así que te dare una posible solución al problema que deberás ver si te
sirve.

Como el Squeak va  cambiando, usar el 3.8b 6548
Hagamos una clase libro (Ver página web)
Hagamos que sus variables de instancia sean autor, titulo, clave , foto.
Con el nombre de la clase seleccionado, hacer que aparezca el menú,
seleccionar "more" y luego create inst var accessor (ver fotito).
Aquí tienes tu clase, pero no como poner los datos o verlos.
La forma clásica es usar el Workspace y el Transcript,
A los alumnos que se encuentran con Smalltalk por primera vez , generalmente
no se les deja hacer otra cosa (ni usan Squeak)
Como quieres una forma visual y usar Morph, veremos entonces como hacer una
especie de "form" de Visualbasic en Squeak.
Combinaremos la forma manual y codificaremos.
Mi estilo es usar siempore contenedores, asi que la "ficha" de carton de la
biblioteca, será un BorderedMorph.
En el Worspace hacemos
ficha := BorderedMorph new openInWorld
Saldra un pequeño rectangulo azul en el vertice superior de la pantalla.
Con el "halo", lo podemos manipular a gusto para que tenga el tamaño y color
que deseemos.
Con los inspectores podemos ver los valores de todo lo que deseamos tenga
nuestro objeto.
Ahora, al código,
Es costumbre que todos los objetos tengan una forma de "nacer" dentro del
sistema, esto se realiza solo una vez con el metodo initialize y como somos
ordenados (ja ja ja) ponemos el metodo initialize dentro de la categoria de
metodos initialization.

initialize
     super initialize.
     self extent: 512 @ 342;color: Color paleYellow.

Ahora vamos a necesitar "algo" para ingresar los datos.
Otra vez en el Workspace hacemos

campo _ TextMorph borderedPrototype openInWorld
Y veremos un texto transparente con letra grande aparecer en el vertice
superior de la pantalla.
Si seleccionamos con doble click borderedPrototype  ya hacemos control  m
(Alt m en Windows) nos sale una ventana con los implementadores del método,
buscamos el de TextMorph.

| t |
     t _ TextMorph authoringPrototype.
     t fontName: 'Accuny' pointSize: 12.
     t autoFit: false; extent: 100@20.
     t borderWidth: 1;color: Color red;
backgroundColor: Color paleBlue.
t openInWorld

Este es mas lindo, perdona si soy incoherente, pero lo voy haciendo y
escribiendo.
Pero te ira dando una pista de como se puede hacer algo.
Lo probas manualmente o con el Workspace y cuando te gusta lo transformas en
una clase.
Asi creariamos un clase Campo (al estilo de las viejas bases de datos o del
Pascal o Cobol)

Ahora necesitamos algo para las fotos.
Como esto es medio bravo y largo de explicar, te mando el código y si no
entendes algo pregunta.
Por ahora , baste saber que tenemos algo llamado MiFotoMiniatura que te
permitira visualizar tus jpg en tamaño miniatura.

Y para que todo funcione , hay que ensamblar todos estos elementos en un
todo.
A los morph se les pueden adicionar otros morphs hasta.
Así que tenemos nuestro contenedor Libro, nuestro Campo para ingresar texto
y nuesto visualizador de fotos MiFotoMiniatura.
Faltaria agregar estos elementos.

agregarCampos

self autor: Campo new.
autor topLeft: self topLeft + (10@10) asPoint.
self addMorph: autor.
titulo _ Campo new.
self addMorph: titulo.
titulo topLeft: self topLeft +( 10@30) asPoint.
clave _ Campo new.
self addMorph: clave.
clave topLeft: self topLeft + (10@50) asPoint.
foto _ MiFotoMiniatura new.
self addMorph: foto.
foto topLeft: self topLeft + (10@75) asPoint.

Donde llamar a agregarCampos ?
En el último renglon de initialize.
Te mando el st del ejercicio, para que lo veas y juegues un poco.
Seguramente te quedarán infinitas dudas, bienvenido al club.
Prometo mañana hacer otro para que veas como conectar esta "ficha" visual
con tu "negocio" o datos .
Manda foto de que se ve desde tu ventana, aqui somos curiosos.
Chau y espero no haberte cansado.

Edgar
.
TextMorph subclass: #Campo  instanceVariableNames: 'nombre' 
classVariableNames: ''  poolDictionaries: ''  category: 'LibrosEduardo'!  !Campo
methodsFor: 'initialization' stamp: 'edc 1/14/2005 09:31'! initialize super
initialize. 	 self contents: 'tipear aqui' translated asText.  self fontName:
'Accuny' pointSize: 12.  self autoFit: false; extent: 100@20.  self borderWidth:
1;color: Color red; backgroundColor: Color paleBlue. ! ! 
 BorderedMorph
subclass: #Libro  instanceVariableNames: 'autor titulo clave foto' 
classVariableNames: ''  poolDictionaries: ''  category: 'LibrosEduardo'! !Libro
commentStamp: 'edc 1/14/2005 07:23' prior: 0! Tomar esto como una primera
aproximación ! 
 !Libro methodsFor: 'accessing' stamp: 'edc 1/14/2005 07:23'!
autor  "Answer the value of autor" 
 ^ autor! !  !Libro methodsFor: 'accessing'
stamp: 'edc 1/14/2005 07:23'! autor: anObject  "Set the value of autor" 
 autor
_ anObject! !  !Libro methodsFor: 'accessing' stamp: 'edc 1/14/2005 07:23'!
clave  "Answer the value of clave" 
 ^ clave! !  !Libro methodsFor: 'accessing'
stamp: 'edc 1/14/2005 07:23'! clave: anObject  "Set the value of clave" 
 clave
_ anObject! !  !Libro methodsFor: 'accessing' stamp: 'edc 1/14/2005 07:23'! foto
"Answer the value of foto" 
 ^ foto! !  !Libro methodsFor: 'accessing' stamp:
'edc 1/14/2005 07:23'! foto: anObject  "Set the value of foto" 
 foto _
anObject! !  !Libro methodsFor: 'accessing' stamp: 'edc 1/14/2005 07:23'! titulo
"Answer the value of titulo" 
 ^ titulo! !  !Libro methodsFor: 'accessing'
stamp: 'edc 1/14/2005 07:23'! titulo: anObject  "Set the value of titulo" 
titulo _ anObject! ! 
 !Libro methodsFor: 'initialize-release' stamp: 'edc
1/14/2005 09:35'! agregarCampos  self autor: Campo new. autor topLeft: self
topLeft + (10@10) asPoint. self addMorph: autor. titulo _ Campo new. self
addMorph: titulo. titulo topLeft: self topLeft +( 10@30) asPoint. clave _ Campo
new. self addMorph: clave. clave topLeft: self topLeft + (10@50) asPoint. foto _
MiFotoMiniatura new. self addMorph: foto. foto topLeft: self topLeft + (10@75)
asPoint. .! !  !Libro methodsFor: 'initialize-release' stamp: 'edc 1/14/2005
09:28'! initialize     super initialize.     self extent: 512 @ 342;color: Color
paleYellow.  self agregarCampos. ! ! 
 ImageMorph subclass: #MiFotoMiniatura 
instanceVariableNames: 'index'  classVariableNames: ''  poolDictionaries: '' 
category: 'LibrosEduardo'!  !MiFotoMiniatura methodsFor: 'menus' stamp: 'EDC
8/22/2002 11:30'! addCustomMenuItems: aCustomMenu hand: aHandMorph 
 "Include
our modest command set in the ctrl-menu"  super addCustomMenuItems: aCustomMenu
hand: aHandMorph.  aCustomMenu addLine.  self addMenuItemsTo: aCustomMenu hand:
aHandMorph! !  !MiFotoMiniatura methodsFor: 'menus' stamp: 'edc 10/1/2003
10:22'! addMenuItemsTo: aMenu hand: aHandMorph 
 | menu |  menu _ MenuMorph new.
menu 	 color: (Color 			 r: 0.4 			 g: 0.4 			 b: 0.4).  menu 	 color: (menu
color alpha: 0.5).  menu 	 add: 'rotar contra reloj ' 	 target: self 	 action:
#rotarCCW.  menu 	 add: 'rotar sentido reloj ' 	 target: self 	 action:
#rotarCW. menu 	 add: 'ver Original ' 	 target: self 	 action: #verOriginal. 
menu items 	 do: [:i | i color: Color red; 				
			 font: (StrikeFont 					
familyName: 'Comic Bold' 					 size: 12 					 emphasized: 1)].  menu
invokeModal! !  !MiFotoMiniatura methodsFor: 'menus' stamp: 'edc 10/2/2003
07:12'! initializarCon: unaImagen numero: unEntero 
 | rect text f frame |  f _
Form fromFileNamed: unaImagen.  f _ f scaledToSize: 80 @ 60.  self image: f. 
self index: unEntero.  rect _ RectangleMorph authoringPrototype
useRoundedCorners 			 color: (Color 					 r: 0.4 					 g: 0.4 					 b: 0.4 					
alpha: 0.5); 				 borderWidth: 2.  text _ TextMorph new contents: unEntero
asString; 				 textColor: Color red; 				 fontName: #ComicBold size: 9.  rect
extent: text extent + (8 @ 6) asPoint.  frame _ LayoutFrame new.  frame
leftFraction: 0.5 offset: text width // -2.  frame topFraction: 0 offset: 0. 
text layoutFrame: frame.  rect layoutPolicy: ProportionalLayout new.  rect
addMorph: text. 	
 rect openInWorld.  rect topLeft: self bottomLeft.  self
addMorph: rect.  self openInWorld! !  !MiFotoMiniatura methodsFor: 'menus'
stamp: 'edc 10/2/2003 08:49'! redraw  | m |  m _ submorphs at: 1.  self 	
privateRemoveMorph: (submorphs at: 1).  m topLeft: self bottomLeft.  self
addMorph: m.  ! !  !MiFotoMiniatura methodsFor: 'menus' stamp: 'edc 10/2/2003
08:51'! rotarCW  | f |  f _ self image 	 rotateBy: #right centerAt: self center.
self image: f.  self redraw! ! 
 !MiFotoMiniatura methodsFor: 'event handling'
stamp: 'edc 10/1/2003 09:24'! handlesMouseDown: anEvent 
 ^ Smalltalk isMorphic
not 	 or: [anEvent yellowButtonPressed]! !  !MiFotoMiniatura methodsFor: 'event
handling' stamp: 'edc 10/1/2003 10:21'! mouseDown: evt 
 evt yellowButtonPressed
ifTrue: [self processYellowButton: evt] 	 ifFalse: [^ evt hand
waitForClicksOrDrag: self event: evt]! !  !MiFotoMiniatura methodsFor: 'event
handling' stamp: 'edc 10/1/2003 09:48'! processYellowButton  | s |  s _ MiStack
allInstances 	 detect: [:each | each world == ActiveWorld]. s loadImage: self
index! !  !MiFotoMiniatura methodsFor: 'event handling' stamp: 'edc 10/1/2003
10:21'! processYellowButton: evt | menu | menu _ MenuMorph new defaultTarget:
self. 		 self addMenuItemsTo: menu hand: evt hand. 		 menu popUpEvent: evt in:
self world.! ! 
 !MiFotoMiniatura methodsFor: 'accessing' stamp: 'edc 9/29/2003
09:34'! index  "Answer the value of index" 
 ^ index! !  !MiFotoMiniatura
methodsFor: 'accessing' stamp: 'edc 9/29/2003 09:34'! index: anObject  "Set the
value of index" 
 index _ anObject! ! 
 !MiFotoMiniatura methodsFor: 'menu
commands' stamp: 'edc 10/2/2003 08:48'! rotarCCW  | f |  f _ self image
rotateBy: #left centerAt: self center.  self image: f.  self redraw! ! 
!MiFotoMiniatura methodsFor: 'menu commands' stamp: 'edc 3/25/2004 10:36'!
verOriginal  | s |  s _ MiStack allInstances last. 	
 s isInWorld 	 ifTrue: [s
loadImage: self index]! !

#519 De: "Lic. Edgar J. De Cleene" <edgardec2001@...>
Fecha: Jue, 13 de Ene, 2005 12:41 pm
Asunto: Re: Re: Multicast...¿como se puede hacer?
edgardec2001
Sin conexión Sin conexión
Enviar correo Enviar correo
 
On 12/01/05 16:12, "hernan_karate" <hernan_karate@...> wrote:

>
>
> Hola!! Primero gracias por responder a mi duda, segundo... te
> respondo las preguntas entre lineas ok?
>> A ver si te entiendo.
>> La máquina que esta escuchando es un server ?
> Si, además ejecutará una instancia del cliente.
>> Podrías definir mejor el problema >
> Si, basicamente es un juego, que ubica a los servidores sin tener
> idea de los nombres de los mismos (tipo counter strike). Esto explica
> por que uso UDP... si se hace con tcp debo conocer al host destino,
> en cambio con udp lo mando a la direccion de broadcast de la red y
> el / los servidor(es) capturan el datagrama y pueden responderme.
>
>> Hay ejercicios en OldSocket que yo mande a la lista como de Socket.
> Si, hemos dado de bruces contra OldSocket... con udp hemos podido
> transferir datos, pero a la hora de enviar paquetes, como bien dejas
> traslucir, seria mejor usar tcp... pero con tcp en squeak 3.7 varias
> veces hemos destrozado la vm, o salio un lindo primitive has falied
> en el acept... o en el waitForCon...For:
> De hecho
>> tengo una clase Socket levemente modificada que me resuelve todo
> tipo de
>> problemas.
> Podrias mandarnosla?
>> Porque udp ?
> (Udp solo lo usamos para buscar otras maquinas, la transmision
> efectiva de los datos seria por tcp)
>> Los niveles de complejidad son.
>> Socket para transmiitir bytes, texto u objetos (tal como en el TEG)
> pero
>> usando tcp.
>> TcpService para conexiones mas seguras y servicios
>> Komanche y sus derivados para armar swikis y otras cosas.
>> HttpView 2 para aplicaciones web livianas.
>> Seaside para aplicaciones web complejas.
> Digamos que querriamos hacer nuestro propio framework... estamos en
> problemas no?
>
> Muchas gracias por tu tiempo. Hasta luego

Clarísimo , lástima que estamos en vacaciones y el laboratorio está cerrado,
para probar en una red real.
Haata ahora siempre trabaje con tcp, conociendo o los IP o los nombres .

De todas maneras, te mando lo que vengo usando hace mucho tiempo sin
problemas, es el .cs del TEG que te puede dar un monton de ideas de como
implementar un server, mandar objetos por la red, etc.
Las modificaciones a Socket estan incluidas.
Creo que en los archivos hay un STEG.zip con los dibujos necesarios.
Tengo versiones en las que uso TcpService, si te hacen falta las mando.
Voy a buscar en los backup lo que se haya comentado de udp, me interesa
cualquier experimento que hagas (aunque no ande).
Te comento que tengo Mac, pero todas las pruebas han funcionado sin
problemas en la UTN con Windows 2000.
Este año creo que hare tambien experimentos con Linux, por lo que cuando los
tenga mandare mail a SqueakRos.

Como dice el amigo español, nos leemos.

Edgar
'From Squeak3.7 of ''4 September 2004'' [latest update: #5988] on 29 October
2004 at 7:32:06 am'! "Change Set:  TEG Date: 	 20 October 2004 Author: 	 Edgar
J. De Cleene  This is a experiment on packaging a game in .sar format"  ! 
Object subclass: #Jugador  instanceVariableNames: 'vive esHumano misPaises
misCartas miColor'  classVariableNames: ''  poolDictionaries: ''  category:
'Morphic-TEG'! Morph subclass: #DrawCard  instanceVariableNames: 'nombre
deQuienSoy numero'  classVariableNames: ''  poolDictionaries: ''  category:
'Morphic-TEG'! IconicButton subclass: #DrawPicture  instanceVariableNames:
'estado valor'  classVariableNames: 'MisDibujos'  poolDictionaries: '' 
category: 'Morphic-TEG'! Morph subclass: #InformaCartas  instanceVariableNames:
''  classVariableNames: ''  poolDictionaries: ''  category: 'Morphic-TEG'!
PolygonMorph subclass: #PaisMorph  instanceVariableNames: 'nombre ejEnPais
deQuienSoy instanciaTEG numero misLimites'  classVariableNames: '' 
poolDictionaries: ''  category: 'Morphic-TEG'! Object subclass: #TEGClient 
instanceVariableNames: 'socket serverName instanciaTEG'  classVariableNames: '' 
poolDictionaries: ''  category: 'Morphic-TEG'! TextMorph subclass: #TEGConsole 
instanceVariableNames: ''  classVariableNames: ''  poolDictionaries: '' 
category: 'Morphic-TEG'! BorderedMorph subclass: #TEGMain 
instanceVariableNames: 'cartasOrden losJugadores jugadoresVivos cartel pone
cambiosTotales playerTurn ronda limites done lim estado numCarta mazo
activeSocket serverOrClient socketList'  classVariableNames: 'NewFolder' 
poolDictionaries: ''  category: 'Morphic-TEG'! Object subclass: #TEGServer 
instanceVariableNames: 'port process ear socketList activeClient addClient
instanciaTEG maxClient'  classVariableNames: ''  poolDictionaries: ''  category:
'Morphic-TEG'! ImageMorph subclass: #TEGStartButton  instanceVariableNames: '' 
classVariableNames: ''  poolDictionaries: ''  category: 'Morphic-TEG'!  !Jugador
methodsFor: 'accesing'! esHumano  ^ esHumano! !  !Jugador methodsFor:
'accesing'! esHumano: t1 
 esHumano _ t1! !  !Jugador methodsFor: 'accesing'!
initialize  vive _ true.  esHumano _ false.  misPaises _ OrderedCollection new. 
misCartas _ OrderedCollection new! !  !Jugador methodsFor: 'accesing'! miColor 
^ miColor! !  !Jugador methodsFor: 'accesing'! miColor: t1 
 miColor _ t1! ! 
!Jugador methodsFor: 'accesing'! misCartas  ^ misCartas! !  !Jugador methodsFor:
'accesing'! misCartas: t1 
 misCartas add: t1! !  !Jugador methodsFor:
'accesing'! misPaises  ^ misPaises! !  !Jugador methodsFor: 'accesing'!
misPaises: t1 
 misPaises add: t1! !  !Jugador methodsFor: 'accesing'! vive  ^
vive! !  !Jugador methodsFor: 'accesing'! vive: t1 
 vive _ t1! !  !Jugador
methodsFor: 'as yet unclassified'! sortCartas  | t1 |  t1 _ SortedCollection
new.  t1 	 sortBlock: [:t2 :t3 | t2 \\\ 3 < (t3 \\\ 3)].  misCartas 	 do: [:t4 |
t1 add: t4].  misCartas _ t1 asOrderedCollection! ! 
 !Morph methodsFor:
'submorphs-accessing' stamp: 'edc 10/21/2004 12:04'! allSubmorphOfClass: aClass
^self submorphs 	 select: [:p | p isKindOf: aClass] thenCollect:[ :any| any].! !
!DrawCard methodsFor: 'initialization' stamp: 'edc 10/19/2004 09:05'!
dibujaUnaCarta: t1 
 | t2 t3 t4 t5 |  self numero: t1.  t4 _ #(#Soldado1 #Canon
#Caballo. ).  t1 > 42 	 ifTrue: [t3 _ self top + 5. 		 t4 			 do: [:t6 | 
				
self 					 addMorph: (DrawPicture new initializeWith: t6 escala: 0.7). 				 self
submorphs first center: self center. 				 self submorphs first top: t3. 				 t3
_ t3 + 40]] 	 ifFalse: [t5 _ t1 \\\ 3 + 1. 		 self 			 addMorphBack:
(DrawPicture new 					 initializeWith: (t4 at: t5) 					 valor: t1 					 pos:
self left + 20 @ self center y). 		 t2 _ StringMorph contents: self nombre. 		
t2 center: self center. 		 t2 top: self top + 8. 		 self addMorphBack: t2]! ! 
!DrawCard methodsFor: 'initialization'! initialize  super initialize.  self
setProperty: #dragEnabled toValue: true.  self extent: 80 @ 120.  self color:
Color lightGray.  self borderColor: Color black.  self borderWidth: 2! ! 
!DrawCard methodsFor: 'initialization'! initializeOff  self addMorph: (Form
fromFileNamed: 'TEGCarta.jpg') asMorph! !  !DrawCard methodsFor:
'initialization'! nombre: t1 limites: t2 
 | t3 t4 t5 |  nombre _ t1.  ejEnPais
_ 0.  self 	 vertices: t2 asArray 	 color: Color white 	 borderWidth: 2 	
borderColor: Color black.  t4 _ self center.  t5 _ Morph new.  t5 	 bounds:
(Rectangle 			 left: t4 x 			 right: t4 x + 15 			 top: t4 y 			 bottom: t4 y +
10).  t5 color: Color white.  self addMorph: t5.  t3 _ TextMorph new.  t3
autoFit: true.  t3 	 string: ejEnPais asString 	 fontName: #ComicBold 	 size: 18
wrap: false.  t3 contents: ejEnPais asString.  t3 bounds: t5.  t3 centered. 
self addMorph: t3.  t3 lock! !  !DrawCard methodsFor: 'access'! deQuienSoy  ^
deQuienSoy! !  !DrawCard methodsFor: 'access'! deQuienSoy: t1 
 deQuienSoy _ t1!
!  !DrawCard methodsFor: 'access'! nombre  ^ nombre! !  !DrawCard methodsFor:
'access'! nombre: t1 
 nombre _ t1! !  !DrawCard methodsFor: 'access'! numero  ^
numero! !  !DrawCard methodsFor: 'access'! numero: t1 
 numero _ t1! ! 
!DrawCard methodsFor: 'event handling'! click: t1 
 ^ self! !  !DrawCard
methodsFor: 'event handling'! doubleClick: t1 
 submorphs first 	 ifNil: [^ 0]. 
submorphs first delete.  self dibujaUnaCarta: numero! !  !DrawCard methodsFor:
'event handling'! handlesMouseDown: t1 
 ^ true! !  !DrawCard methodsFor: 'event
handling'! mouseDown: t1 
 t1 hand waitForClicksOrDrag: self event: t1.  t1 hand
grabMorph: self! ! 
 !DrawCard class methodsFor: 'as yet unclassified'!
initializeOff  | t1 |  t1 _ self new.  FileDirectory default pathParts last =
'STEG' 	 ifFalse: [TEGMain setFolder].  t1 addMorph: (Form fromFileNamed:
'TEGCarta.jpg') asMorph.  ^ t1! ! 
 !DrawPicture methodsFor: 'as yet
unclassified'! estado  ^ estado! !  !DrawPicture methodsFor: 'as yet
unclassified'! estado: t1 
 | t2 |  estado _ t1.  estado 	 ifTrue: [t2 _
submorphs first form. 		 t2 mapColor: Color white to: Color lightRed] 	 ifFalse:
[t2 _ submorphs first form. 		 t2 mapColor: Color lightRed to: Color white]! ! 
!DrawPicture methodsFor: 'as yet unclassified' stamp: 'edc 10/19/2004 08:29'!
initializeWith: t1 
	
	
 self labelGraphic: (MisDibujos at: t1).! ! 
!DrawPicture methodsFor: 'as yet unclassified' stamp: 'edc 10/19/2004 16:03'!
initializeWith: t1 escala: t2 
 | t3 |  t3 _ MisDibujos at: t1.  t3 _ t3
magnify: t3 boundingBox by: t2.  self labelGraphic: t3.  self setSwitchState:
false! !  !DrawPicture methodsFor: 'as yet unclassified' stamp: 'edc 10/19/2004
16:10'! initializeWith: t1 valor: t2 pos: t3 
 | t4 |  valor _ t2.  self estado:
false.  t4 _MisDibujos at: t1.  self labelGraphic: t4.  self position: t3.  self
borderNormal! !  !DrawPicture methodsFor: 'as yet unclassified' stamp: 'edc
10/19/2004 09:06'! initializeWith: t1 valor: t2 rect: t3 
 | t4 |  valor _ t2. 
self estado: false.  t4 _MisDibujos at: t1.  self labelGraphic: t4.  self
bounds: t3.  self comeToFront! !  !DrawPicture methodsFor: 'as yet
unclassified'! mouseUp: t1 
 (self containsPoint: t1 cursorPoint) 	 ifTrue:
[self setSwitchState: estado = false. 		 self doButtonAction] 	 ifFalse: [self
setSwitchState: estado = true]! !  !DrawPicture methodsFor: 'as yet
unclassified'! setSwitchState: t1 
 t1 	 ifTrue: [self borderColor: #inset. 		
self estado: true] 	 ifFalse: [self borderColor: #raised. 		 self estado:
false]! !  !DrawPicture methodsFor: 'as yet unclassified'! valor  ^ valor! ! 
!DrawPicture class methodsFor: 'objects from disk' stamp: 'edc 10/19/2004
09:16'! inicializarDibujos | path | path _ FileDirectory default pathName ,
FileDirectory slash , 'STEG',FileDirectory slash. MisDibujos _ Dictionary new.
MisDibujos at: #Soldado1 put: (Form fromFileNamed: path,'Soldado1.gif').
MisDibujos at: #Soldado5 put: (Form fromFileNamed: path,'Soldado5.gif').
MisDibujos at: #Soldado10 put: (Form fromFileNamed: path,'Soldado10.gif').
MisDibujos at: #Soldado20 put: (Form fromFileNamed: path,'Soldado10.gif').
MisDibujos at: #Soldado50 put: (Form fromFileNamed: path,'Soldado50.gif').
MisDibujos at: #Ok put: (Form fromFileNamed: path,'OK.gif'). MisDibujos at:
#Cancel put: (Form fromFileNamed:path, 'Cancel.gif'). MisDibujos at: #Muerte
put: (Form fromFileNamed: path,'muerte.gif'). MisDibujos at: #Split put: (Form
fromFileNamed: path,'Split.gif'). MisDibujos at: #Caballo put: (Form
fromFileNamed: path,'Caballo.gif'). MisDibujos at: #Canon put: (Form
fromFileNamed: path,'Canon.gif'). MisDibujos at: #CardsDLOG put: (Form
fromFileNamed: path,'CardsDLOG.gif'). 

 ! ! 
 !InformaCartas methodsFor:
'initialization' stamp: 'edc 10/19/2004 09:14'! initialize: t1 
 | t2 t3 t4 t5
t6 t7 t8 t9 t10 t11 |  super initialize.  self 	 bounds: (Rectangle 			 left:
710 			 right: 748 			 top: 220 			 bottom: 460).  self color: Color white. 
self borderColor: Color black.  self borderWidth: 2.  t2 _ t1 size.  t3 _ (216 /
t2) asInteger.  t4 _ 224.  t5 _ 224 + t3.  t6 _ 237.  t7 _ 247.  t3 _ t3 + 3.  1
to: t2 	 do: [:t12 | 
		 t8 _ Morph new. 		 t8 			 bounds: (Rectangle 					
left: 712 					 right: 748 					 top: t4 					 bottom: t5). 		 t8 color: (t1 at:
t12) miColor. 		 t8 borderColor: Color black. 		 t8 borderWidth: 2. 		 self
addMorph: t8. 		 (t1 at: t12) vive 			 ifTrue: [t9 _ Morph new. 				 t9 					
bounds: (Rectangle 							 left: 720 							 right: 738 							 top: t6 							
bottom: t7). 				 t9 color: Color white. 				 t9 borderColor: Color black. 				
t9 borderWidth: 2. 				 self addMorph: t9. 				 t10 _ StringMorph contents: (t1
at: t12) misCartas size asString. 				 t10 center: t9 center. 				 self
addMorph: t10] 			 ifFalse: [t11 _ DrawPicture new 							 initializeWith:
#Muerte 
							 valor: 0 							 pos: t8 topLeft. 				 self addMorph: t11]. 		
t4 _ t4 + t3. 		 t5 _ t5 + t3. 		 t6 _ t6 + t3. 		 t7 _ t7 + t3].  self
openInWorld! ! 
 !PaisMorph methodsFor: 'initialization'! initialize 
instanciaTEG _ ActiveWorld submorphs 			 detect: [:t1 | t1 class == TEGMain]. 
super initialize.  misLimites _ SortedCollection new! !  !PaisMorph methodsFor:
'initialization'! nombre: t1 limites: t2 
 | t3 t4 t5 |  nombre _ t1.  ejEnPais
_ 0.  self 	 vertices: t2 asArray 	 color: Color white 	 borderWidth: 2 	
borderColor: Color black.  t4 _ self center.  t5 _ Morph new.  t5 	 bounds:
(Rectangle 			 left: t4 x 			 right: t4 x + 15 			 top: t4 y 			 bottom: t4 y +
10).  t5 color: Color white.  self addMorph: t5.  t3 _ TextMorph new.  t3
autoFit: true.  t3 	 string: ejEnPais asString 	 fontName: #ComicBold 	 size: 18
wrap: false.  t3 contents: ejEnPais asString.  t3 bounds: t5.  t3 centered. 
self addMorph: t3.  t3 lock! !  !PaisMorph methodsFor: 'event handling' stamp:
'edc 10/8/2004 10:44'! click: t1 
 | t2 t3 |  t2 := 'Soy ' , nombre asString , '
numero ' , numero asString , 'y pertenezco a ' , deQuienSoy asString.  self
showBalloon: t2 hand: t1 hand.  t3 := 0. 	
	
 (instanciaTEG permitido: numero) 	
ifFalse: [^ false].  instanciaTEG submorphs 	 do: [:t4 | t4 class == DrawPicture
ifTrue: [t3 := t3 + 1. 				 instanciaTEG pone: instanciaTEG pone - 1. 				 t4
estado 					 ifTrue: [ejEnPais := ejEnPais + t4 valor. 						 t3 := t3 - 1.
t4 delete]]].  self mostrar.  t3 = 1 	 ifTrue: [instanciaTEG ronda <= 5 			
ifTrue: [instanciaTEG continue] 			 ifFalse: [instanciaTEG estado: 2]]! ! 
!PaisMorph methodsFor: 'event handling'! firstClickTimedOut: t1 
 | t2 t3 |  t2
_ owner rootForGrabOf: self.  t2 	 ifNil: [t3 _ self copy. 		 self board owner
owner addMorphFront: t3. 		 self world displayWorld. 		 (Delay forMilliseconds:
750) wait. 		 t3 delete] 	 ifNotNil: [t1 hand grabMorph: t2]! !  !PaisMorph
methodsFor: 'event handling'! handlesMouseDown: t1 
 ^ true! !  !PaisMorph
methodsFor: 'event handling'! mouseDown: t1 
 t1 hand waitForClicksOrDrag: self
event: t1! !  !PaisMorph methodsFor: 'event handling'! mouseEnter: t1 
 | t2 | 
t2 _ 'Soy ' , nombre asString , ' y pertenezco a ' , deQuienSoy asString.  self
showBalloon: t2 hand: t1 hand! !  !PaisMorph methodsFor: 'access'! add: t1 
ejEnPais _ ejEnPais + t1.  self mostrar! !  !PaisMorph methodsFor: 'access'!
deQuienSoy  ^ deQuienSoy! !  !PaisMorph methodsFor: 'access'! deQuienSoy: t1 
deQuienSoy _ t1! !  !PaisMorph methodsFor: 'access'! doubleClick: t1 
 1 	 to:
42 	 do: [:t2 | (instanciaTEG submorphs at: t2) 			 color: Color white]. 
(instanciaTEG submorphs at: numero) 	 color: Color green.  misLimites 	 do: [:t3
| (instanciaTEG submorphs at: t3) 			 color: Color red].  self borderWidth: 4;
borderColor: Color red.  ^ self numero! !  !PaisMorph methodsFor: 'access'!
ejercitos  ^ ejEnPais! !  !PaisMorph methodsFor: 'access'! ejercitos: t1 
ejEnPais _ t1.  self mostrar! !  !PaisMorph methodsFor: 'access'! misLimites  ^
misLimites! !  !PaisMorph methodsFor: 'access'! misLimites: t1 
 misLimites _
t1! !  !PaisMorph methodsFor: 'access'! mostrar  submorphs first contents:
ejEnPais asString.  submorphs 	 do: [:t1 | t1 center: self center]! ! 
!PaisMorph methodsFor: 'access'! noMostrar  submorphs 	 do: [:t1 | t1 delete]! !
!PaisMorph methodsFor: 'access'! nombre  ^ nombre! !  !PaisMorph methodsFor:
'access'! numero  ^ numero! !  !PaisMorph methodsFor: 'access'! numero: t1 
numero _ t1! !  !PaisMorph methodsFor: 'access'! otroLimites: t1 
 misLimites _
misLimites add: t1! !  !PaisMorph methodsFor: 'access'! redrawInColor: t1 
 self
color: t1.  submorphs first contents: ejEnPais asString.  submorphs 	 do: [:t2 |
t2 center: self center]! !  !PaisMorph methodsFor: 'as yet unclassified' stamp:
'edc 10/26/2004 08:18'! reset  self color: Color white. self deQuienSoy: 0. self
ejercitos: 0.! ! 
 !Socket methodsFor: 'receiving' stamp: 'edc 2/15/2004 09:17'!
getData  | t1 t2 |  (self waitForDataUntil: Socket standardDeadline) 	 ifFalse:
[self error: 'getData timeout'].  t1 _ String new: 4000.  t2 _ self 			
primSocket: socketHandle 			 receiveDataInto: t1 			 startingAt: 1 			 count: t1
size.  ^ t1 copyFrom: 1 to: t2! !  !Socket methodsFor: 'waiting' stamp: 'edc
4/12/2004 08:52'! waitForAcceptUntil: deadLine 
 "Wait and accept an incoming
connection"  self waitForConnectionUntil: deadLine.  ^ self isConnected 	
ifTrue: [self accept]! !  !Socket methodsFor: 'waiting' stamp: 'jm 3/2/98
18:15'! waitForConnectionUntil: deadline  "Wait up until the given deadline for
a connection to be established. Return true if it is established by the
deadline, false if not." 
 | status |  status _ self primSocketConnectionStatus:
socketHandle.  [(status = WaitingForConnection) and: [Time millisecondClockValue
< deadline]] 	 whileTrue: [ 		 semaphore waitTimeoutMSecs: (deadline - Time
millisecondClockValue). 		 status _ self primSocketConnectionStatus:
socketHandle]. 
 ^ status = Connected! !  !Socket methodsFor: 'waiting' stamp:
'edc 2/15/2004 09:19'! waitForDataUntil: deadline 
 "Wait up until the given
deadline for data to arrive. Return true if data 
 arrives by the deadline,
false if not."  | dataArrived |  [self isConnected & (dataArrived := self
primSocketReceiveDataAvailable: socketHandle) not 	 and: ["Connection end and
final data can happen fast, so test in this 
		 order " 		 Time
millisecondClockValue < deadline]] 	 whileTrue: [self readSemaphore
waitTimeoutMSecs: deadline - Time millisecondClockValue].  ^ dataArrived! ! 
!Socket methodsFor: 'waiting' stamp: 'edc 10/5/2004 11:44'!
waitForDisconnectionUntil: deadline  "Wait up until the given deadline for the
the connection to be broken. Return true if it is broken by the deadline, false
if not."  "Note: The client should know the the connect is really going to be
closed (e.g., because he has called 'close' to send a close request to the other
end) before calling this method. JMM 00/5/17 note that other end can close which
will terminate wait" 
 | extraBytes status |  extraBytes := 0.  status := self
primSocketConnectionStatus: socketHandle.  [((status = Connected) or: [(status =
ThisEndClosed)]) and: 	 [Time millisecondClockValue < deadline]] whileTrue: [ 	
self dataAvailable 		 ifTrue: [extraBytes := extraBytes + self
discardReceivedData]. 	 semaphore waitTimeoutMSecs: (deadline - Time
millisecondClockValue). 	 status := self primSocketConnectionStatus:
socketHandle]. 
 extraBytes > 0 	 ifTrue: [self inform: 'Discarded ', extraBytes
printString, ' bytes while closing connection.']. 
 ^ status ~= Connected ! ! 
!Socket methodsFor: 'waiting' stamp: 'edc 10/5/2004 11:42'!
waitForSendDoneUntil: deadline  "Wait up until the given deadline for the
current send operation to complete. Return true if it completes by the deadline,
false if not." 
 | sendDone |  [self isConnected & (sendDone := self
primSocketSendDone: socketHandle) not 		 "Connection end and final data can
happen fast, so test in this order" 	 and: [Time millisecondClockValue <
deadline]] whileTrue: [ 		 self writeSemaphore waitTimeoutMSecs: (deadline -
Time millisecondClockValue)]. 
 ^ sendDone! !  !Socket methodsFor:
'sending-receiving objects' stamp: 'dgd 2/22/2002 20:28'! getObject  "gets a
serialized object from this socket"  | encoded object |  encoded _ String new
writeStream.  [encoded size isZero] 	 whileTrue: [encoded nextPutAll: self
getData].  [self isConnected 	 and: [self dataAvailable]] 	 whileTrue: [encoded
nextPutAll: self getData].  object _ ReferenceStream unStream: encoded contents.
^ object! !  !Socket methodsFor: 'sending-receiving objects' stamp: 'dgd
2/22/2002 20:28'! sendObject: anObject 
 "sends a serialized object to this
socket"  | encoded |  encoded _ ReferenceStream streamedRepresentationOf:
anObject.  self sendData: encoded! ! 
 !Socket class methodsFor:
'remoteExamples' stamp: 'edc 2/15/2004 10:53'! remoteCommClient  | newSocket
objRec command serverName |  Transcript open.  Transcript show: 'starting remote
comm test'; 		 cr.  Transcript show: 'initializing network ... '.  Socket
initializeNetwork.  Transcript show: 'ok'; 		 cr.  serverName := '169.254.6.4'. 
command := FillInTheBlank request: 'Type remote image command' initialAnswer:
''.  newSocket := Socket newTCP.  newSocket 	 connectTo: (NetNameResolver
addressForName: serverName) 	 port: 8000.  newSocket waitForConnectionUntil:
Socket standardDeadline.  Transcript show: 'server start to perform
instructions'; 		 cr.  [command = 'FIN'] 	 whileFalse: [Transcript show:
'Command sended is ' , command; 				 cr. 		 newSocket sendObject: command. 		
newSocket 			 waitForConnectionUntil: (Socket deadlineSecs: 60). 		 [newSocket
isConnected] 			 whileTrue: [newSocket dataAvailable 					 ifTrue: [newSocket
dataAvailable 							 ifTrue: [objRec := newSocket getObject. 								
Transcript show: 'Resoonse is ' , objRec printString; 										 cr. 								
command := FillInTheBlank request: 'Type remote image command' initialAnswer:
'']]]].  newSocket closeAndDestroy! ! 
 !TEGClient methodsFor: 'as yet
unclassified'! initialize  | t1 |  instanciaTEG _ ActiveWorld submorphs 			
detect: [:t2 | t2 class == TEGMain].  instanciaTEG cartel newContents:
'TEGClient starting...'.  serverName _ FillInTheBlank request: 'Type server name
or IPAddress' initialAnswer: 'localhost'.  t1 _ FillInTheBlank request: 'Type
client name' initialAnswer: ''.  self newSocket.  socket sendData: t1. 
instanciaTEG activeSocket: self socket! !  !TEGClient methodsFor: 'as yet
unclassified'! newSocket  Socket initializeNetwork.  socket _ Socket newTCP. 
socket 	 connectTo: (NetNameResolver addressForName: serverName) 	 port: 8000. 
socket waitForConnectionUntil: Socket standardDeadline! !  !TEGClient
methodsFor: 'as yet unclassified'! socket  ^ socket! ! 
 !TEGConsole class
methodsFor: 'as yet unclassified'! default: t1 
 | t2 |  t2 _ self
borderedPrototype.  t2 privateOwner: t1.  t2 	 beAllFont: (StrikeFont
familyName: #ComicBold size: 18).  t2 color: Color red.  t2 newContents:
'SqueakRos fight the evil '.  t2 extent: t1 width - 30 @ 40.  t2 center: t1
center.  t2 top: t1 top + 10.  t1 addMorphBack: t2.  ^ t2! ! 
 !TEGMain
methodsFor: 'accessing'! activeSocket: t1 
 activeSocket _ t1! !  !TEGMain
methodsFor: 'accessing'! cambiosTotales  ^ cambiosTotales! !  !TEGMain
methodsFor: 'accessing'! cambiosTotales: t1 
 cambiosTotales _ t1! !  !TEGMain
methodsFor: 'accessing'! cartasOrden  ^ cartasOrden! !  !TEGMain methodsFor:
'accessing'! cartasOrden: t1 
 cartasOrden _ t1! !  !TEGMain methodsFor:
'accessing'! cartel  ^ cartel! !  !TEGMain methodsFor: 'accessing' stamp: 'edc
10/19/2004 17:04'! cartel: anObject  cartel _ anObject! !  !TEGMain methodsFor:
'accessing'! done  ^ done! !  !TEGMain methodsFor: 'accessing'! done: t1 
 done
_ t1! !  !TEGMain methodsFor: 'accessing'! estado  ^ estado! !  !TEGMain
methodsFor: 'accessing' stamp: 'EDC 6/29/2002 10:30'! estado: aInteger 
 estado
_ aInteger! !  !TEGMain methodsFor: 'accessing'! jugadoresVivos  ^
jugadoresVivos! !  !TEGMain methodsFor: 'accessing'! jugadoresVivos: t1 
jugadoresVivos _ t1! !  !TEGMain methodsFor: 'accessing'! limites  ^ limites! ! 
!TEGMain methodsFor: 'accessing'! limites: t1 
 limites _ t1! !  !TEGMain
methodsFor: 'accessing'! losJugadores  ^ losJugadores! !  !TEGMain methodsFor:
'accessing'! losJugadores: t1 
 losJugadores _ t1! !  !TEGMain methodsFor:
'accessing'! mazo  ^ mazo! !  !TEGMain methodsFor: 'accessing'! mazo: t1 
 mazo
_ t1! !  !TEGMain methodsFor: 'accessing'! numCarta  ^ numCarta! !  !TEGMain
methodsFor: 'accessing'! numCarta: t1 
 numCarta _ t1! !  !TEGMain methodsFor:
'accessing'! playerTurn  ^ playerTurn! !  !TEGMain methodsFor: 'accessing'!
playerTurn: t1 
 playerTurn _ t1! !  !TEGMain methodsFor: 'accessing'! pone  ^
pone! !  !TEGMain methodsFor: 'accessing'! pone: t1 
 pone _ t1! !  !TEGMain
methodsFor: 'accessing'! ronda  ^ ronda! !  !TEGMain methodsFor: 'accessing'!
ronda: t1 
 ronda _ t1! !  !TEGMain methodsFor: 'accessing'! serverOrClient  ^
serverOrClient! !  !TEGMain methodsFor: 'accessing'! serverOrClient: t1 
serverOrClient _ t1! !  !TEGMain methodsFor: 'accessing' stamp: 'edc 10/6/2004
16:25'! socketList: aDictionary 
 socketList := aDictionary.  done := true. ! ! 
!TEGMain methodsFor: 'as yet unclassified' stamp: 'EDC 6/27/2002 15:51'!
hacerListaPaises  | misLimites listaLimpia |  misLimites _ Set new.  "Deseo la
lista total de los paises limitrofes a mis paises"  (losJugadores at:
playerTurn) misPaises 	 do: [:pais | limites 			 do: [:each | (each includes:
pais) 					 ifTrue: [misLimites add: each]]].  "Debo eliminar de la lista las
fronteras de paises que ambos me  
 pertenezcan"  listaLimpia _ misLimites copy.
misLimites 	 do: [:frontera | (((losJugadores at: playerTurn) misPaises 					
includes: (frontera at: 1)) 				 and: [(losJugadores at: playerTurn) misPaises
includes: (frontera at: 2)]) 			 ifTrue: [listaLimpia remove: frontera]].
^listaLimpia! !  !TEGMain methodsFor: 'as yet unclassified' stamp: 'EDC
6/22/2002 11:01'! optimizarCambio  | index tipo otroIndex temp |  (losJugadores
at: playerTurn) misCartas 	 do: [:pais | ((losJugadores at: playerTurn)
misPaises includes: pais) 			 ifTrue: [index _ (losJugadores at: playerTurn)
misCartas indexOf: pais. 				 tipo _ pais \\\ 3]].  otroIndex _ 0. 
(losJugadores at: playerTurn) misCartas 	 do: [:otraCarta | 
		 otroIndex _
otroIndex + 1. 		 otraCarta \\\ 3 = tipo 			 ifTrue: [temp _ (losJugadores at:
playerTurn) misCartas at: index. 				 (losJugadores at: playerTurn) misCartas
at: index 					 put: ((losJugadores at: playerTurn) misCartas at: otroIndex).
(losJugadores at: playerTurn) misCartas at: otroIndex put: temp. 				 ^ true]]!
!  !TEGMain methodsFor: 'debug and other' stamp: 'edc 10/19/2004 16:49'! debug
^self inspect. ! !  !TEGMain methodsFor: 'debug and other'! split  self
eligeEjercitos: pone jugador: playerTurn! !  !TEGMain methodsFor: 'event
handling' stamp: 'EDC 5/17/2002 05:34'! handlesMouseDown: evt 
 "Prevent stray
clicks from picking up the whole game in MVC."  ^ Smalltalk isMorphic not 	 or:
[evt yellowButtonPressed]! !  !TEGMain methodsFor: 'event handling'! mouseDown:
t1 
 | t2 |  t1 yellowButtonPressed 	 ifFalse: [^ self].  t2 _ MenuMorph new
defaultTarget: self.  self addMenuItemsTo: t2 hand: t1 hand.  t2 popUpEvent: t1
in: self world! !  !TEGMain methodsFor: 'fileIn/out' stamp: 'EDC 6/23/2002
06:46'! grabaEstado  | outputStream |  outputStream _ ReferenceStream fileNamed:
'estado.teg'.  outputStream nextPut: losJugadores.  outputStream nextPut:
cartasOrden.  outputStream nextPut: jugadoresVivos.  outputStream nextPut:
playerTurn.  outputStream nextPut: ronda.  outputStream nextPut: numCarta. 
outputStream nextPut: cambiosTotales.  1 	 to: 42 	 do: [:pais | 
		
outputStream nextPut: (submorphs at: pais) ejercitos. 		 outputStream nextPut:
(submorphs at: pais) deQuienSoy].  outputStream close! !  !TEGMain methodsFor:
'fileIn/out'! leerEstado  | t1 |  t1 _ ReferenceStream fileNamed: 'estado.teg'. 
losJugadores _ t1 next.  cartasOrden _ t1 next.  jugadoresVivos _ t1 next. 
playerTurn _ t1 next.  ronda _ t1 next.  numCarta _ t1 next.  cambiosTotales _
t1 next.  1 	 to: 42 	 do: [:t2 | 
		 (submorphs at: t2) 			 ejercitos: t1 next.
(submorphs at: t2) 			 deQuienSoy: t1 next].  t1 close.  self miColor! ! 
!TEGMain methodsFor: 'game sequence' stamp: 'edc 10/19/2004 17:26'!
armaBatallones  | mitadChica s50 s20 s10 s5 s1 batallones |  batallones _ Array
new: 5.  mitadChica _ pone.  s50 _ 0.  s20 _ 0.  s10 _ 0.  s5 _ 0.  s1 _ 0.  s50
_ (mitadChica / 50) asInteger.  mitadChica _ mitadChica \\\ 50.  s20 _
(mitadChica / 20) asInteger.  mitadChica _ mitadChica \\\ 20.  s10 _ (mitadChica
/ 10) asInteger.  mitadChica _ mitadChica \\\ 10.  mitadChica = 5 	 ifTrue: [s1
_ 5] 	 ifFalse: [s5 _ (mitadChica / 5) asInteger. 		 s1 _ mitadChica \\\ 5]. 
pone <= 9 	 ifFalse: [[s50 + s20 + s10 + s5 + s1 <= 5] 			 whileTrue: [s10 > 0
ifTrue: [s10 _ s10 - 1. 						 s5 _ s5 + 2] 					 ifFalse: [s20 > 0 							
ifTrue: [s20 _ s20 - 1. 								 s10 _ s10 + 2] 							 ifFalse: [s50 > 0
ifTrue: [s50 _ s50 - 1. 										 s20 _ s20 + 2. 										 s10 _ s10 + 5]
ifFalse: [s5 > 0 											 ifTrue: [s5 _ s5 - 1. 												 s1 _ s1 +
5]]]]]].  batallones at: 1 put: s1.  batallones at: 2 put: s5.  batallones at: 3
put: s10.  batallones at: 4 put: s20.  batallones at: 5 put: s50.  ^ batallones!
!  !TEGMain methodsFor: 'game sequence' stamp: 'EDC 6/27/2002 16:06'!
atacaMaquina  | maxValue maxElement val reagrupa pasan paisAcacado paisAcacante
atacarA quedan listaLimpia |  listaLimpia _ self hacerListaPaises: true. 
listaLimpia 	 do: [:frontera | 
		 ((losJugadores at: playerTurn) misPaises 				
includes: (frontera at: 1)) 			 ifTrue: [paisAcacante _ frontera at: 1. 				
paisAcacado _ frontera at: 2] 			 ifFalse: [paisAcacante _ frontera at: 2. 				
paisAcacado _ frontera at: 1]. 		 maxValue == nil 			 ifTrue: ["first element"
maxValue _ (submorphs at: paisAcacante) ejercitos - (submorphs at: paisAcacado)
ejercitos. 				 maxElement _ paisAcacante] 			 ifFalse: [(val _ (submorphs at:
paisAcacante) ejercitos - (submorphs at: paisAcacado) ejercitos) > maxValue
ifTrue: [maxElement _ paisAcacante. 						 atacarA _ paisAcacado. 						
maxValue _ val]]].  atacarA 	 ifNil: [^ false].  paisAcacado _ atacarA. 
paisAcacante _ maxElement.  reagrupa _ self 			 suerte: (submorphs at:
paisAcacante) 			 contra: (submorphs at: paisAcacado).  reagrupa 	 ifTrue: [pone
> 2 			 ifTrue: [pasan _ (pone - 2 / 2) asInteger. 				 quedan _ pone - pasan.
(submorphs at: paisAcacante) 					 add: quedan. 				 (submorphs at: paisAcacado)
add: pasan. 				 (submorphs at: paisAcacado) 					 deQuienSoy: playerTurn. 				
^ true] 			 ifFalse: [^ false]] 	 ifFalse: [^ false]! !  !TEGMain methodsFor:
'game sequence'! ataque  | t1 t2 t3 t4 t5 |  estado _ 2.  Cursor crossHair 	
showWhile: [[Sensor anyButtonPressed] 			 whileFalse: [self currentWorld
displayWorldSafely; runStepMethods]. 		 t1 _ Sensor cursorPoint].  t3 _
submorphs 			 detect: [:t6 | t6 containsPoint: t1].  t2 _ t3 nombre.  PopUpMenu
confirm: t2.  ((losJugadores at: playerTurn) misPaises includes: t3 numero) 	
ifFalse: [^ self].  Cursor crossHair 	 showWhile: [[Sensor anyButtonPressed] 			
whileFalse: [self currentWorld displayWorldSafely; runStepMethods]. 		 t1 _
Sensor cursorPoint].  t4 _ submorphs 			 detect: [:t6 | t6 containsPoint: t1]. 
lim _ Array new: 2.  lim at: 1 put: t3 numero.  lim at: 2 put: t4 numero. 
(limites includes: lim) 	 ifFalse: [lim at: 1 put: t4 numero. 		 lim at: 2 put:
t3 numero. 		 (limites includes: lim) 			 ifFalse: [PopUpMenu inform: 'No son
limitrofes'. 				 ^ false]].  t5 _ self suerte: t3 contra: t4.  t5 	 ifTrue:
[self eligeEjercitos: pone jugador: playerTurn. 		 estado _ 3]! !  !TEGMain
methodsFor: 'game sequence'! continue  done _ true! !  !TEGMain methodsFor:
'game sequence'! continue: t1 
 t1 delete.  estado _ 4! !  !TEGMain methodsFor:
'game sequence' stamp: 'edc 10/19/2004 16:08'! dibuCartas: n hayCambio: aBoolean
| cardDialog laCarta loHizo rpos oK cartaNumero cancel |  cardDialog _
DrawPicture new initializeWith: #CardsDLOG.  oK _ DrawPicture new 			
initializeWith: #Ok 			 valor: 1 			 pos: 470 @ 327.  oK target: self.  oK
actionSelector: #cambiaCartas:.  oK 	 arguments: (Array with: cardDialog). 
cancel _ DrawPicture new 			 initializeWith: #Cancel 			 valor: 1 			 pos: 470 @
292 .  cancel target: self.  cancel actionSelector: #continue:.  cancel 	
arguments: (Array with: cardDialog). 	
 cardDialog position: 90 @ 90. 
cardDialog openInWorld.  1 	 to: n 	 do: [:t10 | 
		 t10 caseOf: { 			 [1] ->
[rpos _ 110 @ 110]. 			 [2] -> [rpos _ 286 @ 110]. 			 [3] -> [rpos _ 462 @
110]. 			 [4] -> [rpos _ 198 @ 254]. 			 [5] -> [rpos _ 374 @ 254]. 			 [6] ->
[rpos _ 110 @ 254]} 				 otherwise: [rpos _ 20 @ 20]. 		 cartaNumero _
(losJugadores at: playerTurn) misCartas at: t10. 		 cartaNumero > 42 			 ifTrue:
[laCarta _ DrawCard new dibujaUnaCarta: cartaNumero] 			 ifFalse: [laCarta _
mazo at: cartaNumero. 				 laCarta submorphs last noMostrar. 				 laCarta
submorphs last color: (submorphs at: cartaNumero) color]. 		 t10 <= 3 			
ifTrue: [aBoolean 					 ifTrue: [laCarta submorphs first estado: true]]. 		
laCarta position: rpos. 		 cardDialog addMorphBack: laCarta].  cardDialog
addMorphBack: oK.  cardDialog addMorphBack: cancel.  cardDialog submorphsDo:
[:m| m comeToFront].  self world displayWorld.  (losJugadores at: playerTurn)
esHumano 	 ifTrue: [aBoolean 			 ifTrue: [[estado = 4] 					 whileFalse: [World
doOneCycle]]. 		 estado _ 1] 	 ifFalse: [3 			 timesRepeat: [(Delay forSeconds:
1) wait. 				 SampledSound playSoundNamed: 'chirp'. 				 aBoolean 					 ifTrue:
[self cambiaCartas: cardDialog]. 				 loHizo _ true. 				 (Delay forSeconds: 3)
wait. 				 cardDialog delete. 				 ^ loHizo]]! ]style[(33 1334 44
423)f2b,f2,f2cred;,f2! !  !TEGMain methodsFor: 'game sequence' stamp: 'EDC
6/19/2002 09:38'! dibujaUnaCarta2: cardDialog 

 | p t tiempo |  cardDialog
openInWorld.  cardDialog center: Display center.  p _ Player new.  p costume:
cardDialog.  t _ 1.0.  p show.  1 	 to: 8 	 do: [:index | 
		 tiempo _ 1600 -
(100 * index). 		 (Delay forMilliseconds: tiempo) wait. 		 FMSound randomWeird1
play. 		 p setScaleFactor: t. 		 p forward: 100 atRandom. 		 p turn: 360
atRandom. 		 self world displayWorld. 		 t _ t - 0.125].  p erase! !  !TEGMain
methodsFor: 'game sequence' stamp: 'edc 10/19/2004 16:30'! eligeEjercitos:
aInteger jugador: j 
 | s50 s20 s10 s5 s1 posIcon nEjRec ejercitos batallones  l
r |  l _ self left + 155.  r _ self left + 195.  ejercitos _ Array new: 9. 
nEjRec _ Array new: 9.  1 	 to: 9 	 do: [:e | 
		 ejercitos 			 at: e 			 put:
(Rectangle 					 left: l + (e * 45) 					 right:  r + (e * 45) 					 top: self
bottom - 70 					 bottom: self bottom - 50). 		 nEjRec at: e put: 0]. 
batallones _ self armaBatallones.  posIcon _ 1.  s1 _ batallones at: 1.  s5 _
batallones at: 2.  s10 _ batallones at: 3.  s20 _ batallones at: 4.  s50 _
batallones at: 5.  s1 > 0 	 ifTrue: [1 			 to: s1 			 do: [:i | 
				 posIcon _
posIcon + 1. 				 self 					 addMorphBack: (DrawPicture new 							
initializeWith: #Soldado1 							 valor: 1 							 rect: (ejercitos at: i)).
nEjRec at: i put: 1]].  s5 > 0 	 ifTrue: [posIcon 			 to: s5 + posIcon - 1 			
do: [:i | 
				 posIcon _ posIcon + 1. 				 self 					 addMorphBack:
(DrawPicture new 							 initializeWith: #Soldado5 
							 valor: 5 							
rect: (ejercitos at: i)). 				 nEjRec at: i put: 5]].  s10 > 0 	 ifTrue:
[posIcon 			 to: s10 + posIcon - 1 			 do: [:i | 
				 posIcon _ posIcon + 1.
self 					 addMorphBack: (DrawPicture new 							 initializeWith: #Soldado10
valor: 10 							 rect: (ejercitos at: i)). 				 nEjRec at: i put: 10]].  s20 >
0 	 ifTrue: [posIcon 			 to: s20 + posIcon - 1 			 do: [:i | 
				 posIcon _
posIcon + 1. 				 self 					 addMorphBack: (DrawPicture new 							
initializeWith: #Soldado20 							 valor: 20 							 rect: (ejercitos at: i)).
nEjRec at: i put: 20]].  s50 > 0 	 ifTrue: [posIcon 			 to: s50 + posIcon - 1
do: [:i | 
				 posIcon _ posIcon + 1. 				 self 					 addMorphBack:
(DrawPicture new 							 initializeWith: #Soldado50 							 valor: 50 							
rect: (ejercitos at: i)). 				 nEjRec at: i put: 50]].  (nEjRec at: 9) 		 = 0 	
ifTrue: [self addMorphBack: (DrawPicture new 				 initializeWith: #Split 				
valor: 0 				 rect: (ejercitos at: 9); 					 target: self; 					 actionSelector:
#split)]! !  !TEGMain methodsFor: 'game sequence' stamp: 'EDC 5/2/2002 10:56'!
endGameFor: aInteger 
 ^ self halt.! !  !TEGMain methodsFor: 'game sequence'!
finAtaque  done _ true.  estado _ 3! !  !TEGMain methodsFor: 'game sequence'!
finRonda  playerTurn = 6 	 ifTrue: [ronda _ ronda + 1]! !  !TEGMain methodsFor:
'game sequence' stamp: 'EDC 6/27/2002 15:39'! fortificar  | p1 paisOrigen
paisDestino aString |  estado _ 2.  "Estado dos corresponde al ataque"  Cursor
crossHair 	 showWhile: [[Sensor anyButtonPressed] 			 whileFalse: [self
currentWorld displayWorldSafely; runStepMethods]. 		 p1 _ Sensor cursorPoint]. 
paisOrigen _ submorphs 			 detect: [:pais | pais containsPoint: p1]. 
((losJugadores at: playerTurn) misPaises includes: paisOrigen numero) 	 ifFalse:
[^ self].  aString _ paisOrigen nombre.  PopUpMenu confirm: aString.  Cursor
crossHair 	 showWhile: [[Sensor anyButtonPressed] 			 whileFalse: [self
currentWorld displayWorldSafely; runStepMethods]. 		 p1 _ Sensor cursorPoint]. 
paisDestino _ submorphs 			 detect: [:pais | pais containsPoint: p1]. 
((losJugadores at: playerTurn) misPaises includes: paisDestino numero) 	
ifFalse: [self halt].  lim _ Array new: 2.  lim at: 1 put: paisOrigen numero. 
lim at: 2 put: paisDestino numero.  (limites includes: lim) 	 ifFalse: [lim at:
1 put: paisDestino numero. 		 lim at: 2 put: paisOrigen numero. 		 (limites
includes: lim) 			 ifFalse: [PopUpMenu inform: 'No son limitrofes'. 				 ^
false]].  pone _ paisOrigen ejercitos - 1.  paisOrigen ejercitos: 1.  self
eligeEjercitos: pone jugador: playerTurn.  ! !  !TEGMain methodsFor: 'game
sequence' stamp: 'EDC 6/29/2002 10:19'! fortificarMaquina  | misLimites enemigo
misPaises reagrupar n batallon |  misLimites _ OrderedCollection new.  misPaises
_ (losJugadores at: playerTurn) misPaises asSortedCollection.  misPaises 	 do:
[:pais | 
		 enemigo _ false. 		 (submorphs at: pais) misLimites 			 do: [:each
| (misPaises includes: each) 					 ifFalse: [enemigo _ true]]. 		 enemigo 			
ifFalse: [(submorphs at: pais) ejercitos even 					 ifTrue: [reagrupar _
(submorphs at: pais) ejercitos - 2. 						 (submorphs at: pais) 							
ejercitos: 2] 					 ifFalse: [reagrupar _ (submorphs at: pais) ejercitos - 1.
(submorphs at: pais) 							 ejercitos: 1]. 					
				 n _ (submorphs at: pais)
misLimites size. 				 batallon _ (reagrupar / n) asInteger. 				 (submorphs at:
pais) misLimites 					 do: [:index | (submorphs at: index) 							 add:
batallon]]. 		 ]! !  !TEGMain methodsFor: 'game sequence' stamp: 'EDC 6/29/2002
08:21'! hacerLimites  | otroLimites |  1 	 to: 42 	 do: [:pais | 
		 otroLimites
_ limites 					 select: [:each | each includes: pais] 					 thenCollect: [:each2
| (each2 at: 2) 								 ~= pais 							 ifTrue: [each2 at: 2] 							 ifFalse:
[each2 at: 1]]. 		 (submorphs at: pais) 			 misLimites: otroLimites]. 
		 1 			
to: 42 			 do: [:pais2 | (submorphs at: pais2) 					 color: Color white]! ! 
!TEGMain methodsFor: 'game sequence'! leerCartas  | t1 t2 |  mazo _
OrderedCollection new.  t1 _ ReferenceStream fileNamed: 'cartas37.teg'.  1 	 to:
42 	 do: [:t3 | 
		 t2 _ t1 next. 		 (t2 submorphs at: 3) lock. 		 mazo add:
t2].  t1 close! !  !TEGMain methodsFor: 'game sequence' stamp: 'edc 10/19/2004
17:23'! makeMove 
 [jugadoresVivos > 1] 	 whileTrue: [submorphs 			 do: [:t1 |
t1 class == DrawPicture 					 ifTrue: [t1 delete]]. 		 (losJugadores at:
playerTurn) misPaises size = 0 			 ifTrue: [self muerte. 				 self finRonda.
playerTurn := playerTurn \\ 6 + 1] 			 ifFalse: [cartel color: (losJugadores at:
playerTurn) miColor. 				 cartel newContents: 'Ronda ' , ronda asString , '
Turno del jugador ' , playerTurn asString. 				 done := false. 				 estado := 1.
(losJugadores at: playerTurn) esHumano & (serverOrClient = #server) 					
ifTrue: [self sendMyData. 						 done := true]. 				 ronda caseOf: { 					 [1]
-> [pone := 5]. 					 [2] -> [pone := 4]. 					 [3] -> [pone := 3]. 					 [4] ->
[pone := 1]. 					 [5] -> [pone := 1]} 						 otherwise: [pone := self
cuantosEjercitos]. 				 ronda > 5 					 ifTrue: [submorphs last class ==
InformaCartas 							 ifTrue: [submorphs last delete] 							 ifFalse: [self
addMorphBack: (InformaCartas new initialize: losJugadores). 									 submorphs
last right: self right - 30]]. 				 (losJugadores at: playerTurn) misCartas size
>= 3 & (serverOrClient = #cliente) 					 ifTrue: [self verCartas]. 				
(losJugadores at: playerTurn) esHumano & (serverOrClient = #cliente) 					
ifTrue: [self eligeEjercitos: pone jugador: playerTurn. ]. 				 (losJugadores
at: playerTurn) esHumano not & (serverOrClient = #server) 					 ifTrue: [self
maquinaPone]. 				 [done] 					 whileFalse: [World doOneCycle]. 						
				
((losJugadores at: playerTurn) esHumano 						 and: [estado = 3]) 					 ifTrue:
[self obtenerCarta]. 				 self finRonda. 				 serverOrClient = #cliente 					
ifTrue: [self sendMyData] 					 ifFalse: [playerTurn := playerTurn \\ 6 + 1].
self world displayWorld]]! !  !TEGMain methodsFor: 'game sequence'! maquinaPone 
| t1 t2 t3 t4 |  t2 _ (losJugadores at: playerTurn) misPaises size.  t1 _ 1. 
[pone > 0] 	 whileTrue: [t3 _ (losJugadores at: playerTurn) misPaises at: t1. 		
(submorphs at: t3) 			 add: 1. 		 pone _ pone - 1. 		 t1 _ t1 + 1. 		 t1 > t2
ifTrue: [t1 _ 1]].  ronda > 5 	 ifTrue: [t4 _ self atacaMaquina. 		 t4 			
ifTrue: [self obtenerCarta]. 		 self fortificarMaquina].  done _ true! ! 
!TEGMain methodsFor: 'game sequence'! muerte  (losJugadores at: playerTurn) 	
vive: false.  jugadoresVivos _ jugadoresVivos - 1! !  !TEGMain methodsFor: 'game
sequence'! obtenerCarta  | t1 |  numCarta < 45 	 ifTrue: [t1 _ cartasOrden at:
numCarta. 		 (losJugadores at: playerTurn) 			 misCartas: t1. 		 t1 > 42 			
ifTrue: [self 					 dibujaUnaCarta2: (DrawCard new dibujaUnaCarta: t1)] 			
ifFalse: [self 					 dibujaUnaCarta2: (mazo at: t1)]].  numCarta _ numCarta + 1!
!  !TEGMain methodsFor: 'game sequence' stamp: 'edc 10/8/2004 10:50'! permitido:
t1 

 estado = 1 	 ifTrue: [((losJugadores at: playerTurn) misPaises includes:
t1) 			 ifTrue: [^ true]].  estado = 2 | (estado = 3) 	 ifTrue: [(lim includes:
t1) 			 ifTrue: [^ true]].  ^ false! !  !TEGMain methodsFor: 'game sequence'
stamp: 'edc 10/19/2004 09:29'! suerte: paisAtacante contra: paisAcacado 
 |
dadoAtaque dadoDefensa elColor |  cartel newContents: paisAtacante nombre , '
Ataca a ' , paisAcacado nombre.  cartel center: self center.  cartel top: self
top + 10.  cartel color: (losJugadores at: playerTurn) miColor.  (Delay
forSeconds: 1) wait.  self world displayWorld.  [paisAtacante ejercitos > 0 	
and: [paisAcacado ejercitos > 0]] 	 whileTrue: [dadoAtaque _ 0. 		 dadoDefensa _
0. 		 [dadoAtaque = dadoDefensa] 			 whileTrue: [dadoAtaque _ 6 atRandom. 				
dadoDefensa _ 6 atRandom]. 		 dadoAtaque > dadoDefensa 			 ifTrue: [paisAcacado
ejercitos: paisAcacado ejercitos - 1] 			 ifFalse: [paisAtacante ejercitos:
paisAtacante ejercitos - 1]].  paisAcacado ejercitos = 0 	 ifTrue: [elColor _
(losJugadores at: playerTurn) miColor. 		 paisAcacado color: elColor. 		
(losJugadores at: paisAcacado deQuienSoy) misPaises 			 remove: paisAcacado
numero 			 ifAbsent: []. 		 paisAcacado deQuienSoy: playerTurn. 		 (losJugadores
at: paisAcacado deQuienSoy) misPaises size = 0 			 ifTrue: [self muerte]. 		
paisAcacado deQuienSoy: playerTurn. 		 (losJugadores at: playerTurn) 			
misPaises: paisAcacado numero] 	 ifFalse: [^ false].  paisAtacante ejercitos > 2
ifTrue: [paisAcacado ejercitos: 2. 		 pone _ paisAtacante ejercitos - 2. 		
paisAtacante ejercitos: 0. 		 ^ true].  pone _ 0.  ^ false. ! !  !TEGMain
methodsFor: 'game sequence' stamp: 'edc 10/19/2004 15:52'! verCartas  | sold3
canon3 caba3 cambio soldado canon caballo resultado tipo laCarta |  sold3 _ 0. 
canon3 _ 0.  caba3 _ 0.  cambio _ 0.  soldado _ 0.  canon _ 0.  caballo _ 0. 	
cambio _ 0.  resultado _ false.  1 	 to: (losJugadores at: playerTurn) misCartas
size 	 do: [:i | 
		 laCarta _ (losJugadores at: playerTurn) misCartas at: i. 		
laCarta >= 43 			 ifTrue: [cambio _ cambio + 1. 				 ]. 		 tipo _ ((losJugadores
at: playerTurn) misCartas at: i) 					 \\\ 3. 		 tipo caseOf: { 			 [0] -> 
				
[sold3 _ sold3 + 1. 				 soldado = 0 					 ifTrue: [soldado _ i. 						 cambio _
cambio + 1] 					 ]. 			 [1] -> 
				 [canon3 _ canon3 + 1. 				 canon = 0 					
ifTrue: [canon _ i. 						 cambio _ cambio + 1] 					 ]. 			 [2] -> 
				 [caba3
_ caba3 + 1. 				 caballo = 0 					 ifTrue: [caballo _ i. 						 cambio _ cambio
+ 1] 					 ]} 				 otherwise: [Transcript open]].  sold3 >= 3 | (canon3 >= 3) |
(caba3 >= 3) | (cambio >= 3) 	 ifTrue: [resultado _ true].  (losJugadores at:
playerTurn) misCartas size > 3 	 ifTrue: [resultado 			 ifTrue: [self
optimizarCambio]].  "Si tengo mas de tres cartas, debo determinar si alguna es
de mis paises  
 y si la puedo cambiar"  resultado 	 ifTrue: [self dibuCartas:
(losJugadores at: playerTurn) misCartas size hayCambio: resultado]! !  !TEGMain
methodsFor: 'initialization' stamp: 'EDC 7/1/2002 08:34'! cuantosEjercitos  |
sumEj sudAmerica norteAmerica europa asia oceania africa |  self.  sumEj _ 0. 
sudAmerica _ 0.  norteAmerica _ 0.  europa _ 0.  asia _ 0.  oceania _ 0.  africa
_ 0.  1 	 to: 42 	 do: [:e | (submorphs at: e) deQuienSoy = playerTurn 			
ifTrue: [sumEj _ sumEj + 1. 				 (e >= 1 						 and: [e <= 4]) 					 ifTrue:
[sudAmerica _ sudAmerica + 1]. 				 (e >= 5 						 and: [e <= 12]) 					 ifTrue:
[norteAmerica _ norteAmerica + 1]. 				 (e >= 13 						 and: [e <= 20]) 					
ifTrue: [europa _ europa + 1]. 				 (e >= 21 						 and: [e <= 33]) 					
ifTrue: [asia _ asia + 1]. 				 (e >= 34 						 and: [e <= 37]) 					 ifTrue:
[oceania _ oceania + 1]. 				 (e > 38 						 and: [e < 42]) 					 ifTrue:
[africa _ africa + 1]]].  sumEj _ 1 + (sumEj / 3) asInteger.  (sudAmerica = 4 		
or: [oceania = 4]) 	 ifTrue: [sumEj _ sumEj + 2].  (norteAmerica = 7 		 or:
[europa = 7]) 	 ifTrue: [sumEj _ sumEj + 5].  asia = 8 	 ifTrue: [sumEj _ sumEj
+ 7].  africa = 5 	 ifTrue: [sumEj _ sumEj + 3].  sumEj < 3 	 ifTrue: [sumEj _
3].  ^ sumEj! !  !TEGMain methodsFor: 'initialization' stamp: 'edc 10/8/2004
09:54'! cuantosHumanos: aInteger 
  1 to:  aInteger do: [:i| (losJugadores at:
i) esHumano: true ].  ! !  !TEGMain methodsFor: 'initialization' stamp: 'EDC
6/10/2002 07:06'! distribuyePaises  | randomNumber cantPaises ordendePaises
totalPaises cualPais |  cantPaises _ 42 / jugadoresVivos.  ordendePaises _
OrderedCollection new.  [ordendePaises size < 42] 	 whileTrue: [(ordendePaises
includes: (randomNumber _ 42 atRandom)) 			 ifFalse: [ordendePaises add:
randomNumber]].  totalPaises _ 1.  1 	 to: jugadoresVivos 	 do: [:elJugador | 1
to: cantPaises 			 do: [:p | 
				 cualPais _ ordendePaises at: totalPaises.
(losJugadores at: elJugador) 					 misPaises: cualPais. 				 (submorphs at:
cualPais) 					 deQuienSoy: elJugador. 				 totalPaises _ totalPaises + 1]]! ! 
!TEGMain methodsFor: 'initialization'! initialize  | t1 t2 t3 t4 |  self
setFolder.  (StreamingMP3Sound onFileNamed: NewFolder pathName , FileDirectory
slash , 'combat.mp3') play.  super initialize.  self remoteCommServer.  self
extent: 750 @ 490.  self color: Color paleBlue.  self borderWidth: 2.  self
position: 18 @ 0.  self toggleStickiness.  self openInWorld.  miArchivo _
FileStream readOnlyFileNamed: 'PRUEBA'.  cartasOrden _ OrderedCollection new. 
[cartasOrden size < 44] 	 whileTrue: [(cartasOrden includes: (t4 _ 44 atRandom))
ifFalse: [cartasOrden add: t4]].  losJugadores _ Array new: 6.  1 	 to: 6 	 do:
[:t5 | losJugadores at: t5 put: Jugador new initialize].  (losJugadores at: 1) 	
esHumano: true.  jugadoresVivos _ 6.  1 	 to: 42 	 do: [:t6 | 
		 t2 _ String
new. 		 t2 _ self leerArchivo. 		 t3 _ OrderedCollection new. 		 t1 _ Point
readFromString: self leerArchivo. 		 t3 add: t1. 		 10 			 timesRepeat: [t1 _
Point readFromString: self leerArchivo. 				 t3 add: t1]. 		 self addMorphBack:
(PaisMorph new nombre: t2 limites: t3; 					 numero: t6)].  self
distribuyePaises.  self miColor.  ronda _ 1.  estado _ 1.  numCarta _ 1. 
playerTurn _ 1.  cambiosTotales _ 0.  self initialize2! !  !TEGMain methodsFor:
'initialization' stamp: 'edc 10/26/2004 09:12'! initialize2 
 limites := #(#(1
2) #(1 3) #(2 3) #(2 4) #(3 2) #(3 4) #(3 38) #(4 3) #(4 5) #(5 6) #(5 7) #(6 5)
#(6 7) #(6 9) #(6 10) #(7 8) #(7 9) #(8 9) #(8 11) #(8 12) #(9 10) #(9 12) #(10
13) #(11 27) #(12 13) #(13 14) #(14 15) #(14 18) #(15 16) #(15 18) #(15 19) #(16
17) #(16 20) #(16 20) #(16 21) #(16 22) #(16 23) #(17 19) #(18 19) #(19 38) #(20
16) #(20 21) #(20 23) #(20 38) #(20 39) #(21 25) #(22 23) #(22 24) #(22 29) #(23
24) #(23 39) #(23 40) #(24 33) #(25 21) #(25 29) #(29 33) #(33 29) #(38 39) #(38
40) #(38 41) #(40 41) #(20 23) #(19 20) #(39 40) #(25 26) #(26 27) #(31 32) #(27
32) #(30 32) #(29 30) #(34 35) #(37 35) #(35 36) #(11 12) #(40 42) #(42 41) #(34
37) #(36 37) #(33 34) #(24 29) #(28 30) #(25 30) #(18 17) #(18 19) #(17 20) #(21
22) #(21 29) #(25 28) #(26 28) #(26 31) #(28 31) #(30 31) ). 	
 done := true. 
self cartel: (TEGConsole default: self).  World displayWorldSafely.  self stop. 
(Delay forSeconds: 5) wait.  self leerCartas.  self startStepping.  done :=
false.  self serverOrClient = #server 	 ifTrue: [TEGServer start] 	 ifFalse:
[TEGClient new. [activeSocket dataAvailable] whileFalse. 	
 self askMyData. 
done := true]. 
 [done] whileFalse. 
 self makeMove! !  !TEGMain methodsFor:
'initialization' stamp: 'edc 10/26/2004 09:11'! initializeN  | t1 | 	
cartasOrden := OrderedCollection new.  [cartasOrden size < 44] 	 whileTrue:
[(cartasOrden includes: (t1 := 44 atRandom)) 			 ifFalse: [cartasOrden add:
t1]].  losJugadores := Array new: 6.  1 	 to: 6 	 do: [:t2 | losJugadores at: t2
put: Jugador new initialize].  jugadoresVivos := 6.  serverOrClient = #server 	
ifTrue: [self distribuyePaises. 		 self miColor].  ronda := 1.  estado := 1. 
numCarta := 1.  playerTurn := 1.  cambiosTotales := 0.  self initialize2! ! 
!TEGMain methodsFor: 'initialization'! leerArchivo  | t1 t2 |  t2 _ String new. 
[miArchivo atEnd] 	 whileFalse: [t1 _ miArchivo next asCharacter. 		 t1
asciiValue = 13 			 ifTrue: [^ t2]. 		 t2 _ t2 , t1 asString]! !  !TEGMain
methodsFor: 'initialization' stamp: 'edc 10/21/2004 12:11'! miColor  | t1 t2
paises |  t1 := Color 			 wheel: 6 			 saturation: 0.7 			 brightness: 0.9.  t2
:= 1.  t1 	 do: [:t3 | 
		 (losJugadores at: t2) 			 miColor: t3. 		 t2 := t2 +
1]. 	 paises := self submorphs 	 select: [:p | p isKindOf: PaisMorph]
thenCollect:[ :any| any].  paises 	 do: [:t4 | t4 color: (losJugadores at: t4
deQuienSoy) miColor. 		 t4 mostrar]! !  !TEGMain methodsFor: 'initialization'!
miColor: t1 
 1 	 to: 6 	 do: [:t2 | (losJugadores at: t2) miColor 			 ifNil:
[(losJugadores at: t2) 					 miColor: t1. 				 (losJugadores at: t2) misPaises
do: [:t3 | (submorphs at: t3) 							 color: t1]. 				 t2 = 6 					 ifTrue:
[cartel delete. 						 cartel _ TextMorph borderedPrototype. 						 cartel
beAllFont: (StrikeFont familyName: #ComicBold size: 18). 						 cartel color:
Color red. 						 cartel newContents: 'SqueakRos fight the evil '. 						 cartel
extent: self width - 30 @ 40. 						 cartel center: self center. 						 cartel
top: self top + 10. 						 self addMorphBack: cartel. 						 self startStepping.
self makeMove]. 				 ^ t2]]! !  !TEGMain methodsFor: 'initialization' stamp:
'edc 10/19/2004 16:22'! verificarCambio: cardDialog 
 | cambio soldado canon
caballo  dibujo |  soldado _ 0.  canon _ 0.  caballo _ 0. 
 cambio _ cardDialog
submorphs 			 count: [:m | m class name = 'DrawCard' 					 and: [m submorphs
first estado = true]].  cambio > 3 	 ifTrue: [(StreamingMP3Sound onFileNamed:
NewFolder pathName , FileDirectory slash , 'tramposo.mp3') play. 		 cartel
string: 'Tramposo '. 		 cartel center: cardDialog center. 		 cardDialog
addMorph: cartel].  dibujo _ cardDialog submorphs 			 select: [:m | m class name
= 'DrawCard' 					 and: [m submorphs first estado = true]] 			 thenCollect:
[:each | each numero \\\ 3].  cambio _ 0.  dibujo 	 do: [:tipo | tipo caseOf: {
[0] -> 
				 [soldado = 0 					 ifTrue: [soldado _ 1. 						 cambio _ cambio +
1]]. 			 [1] -> 
				 [canon = 0 					 ifTrue: [canon _ 1. 						 cambio _
cambio + 1]]. 			 [2] -> 
				 [caballo = 0 					 ifTrue: [caballo _ 1. 						
cambio _ cambio + 1]]} 				 otherwise: [Transcript open]].  dibujo _ cardDialog
submorphs 			 select: [:m | m class name = 'DrawCard' 					 and: [m submorphs
first estado = true]] 			 thenCollect: [:each | each numero >42 ifTrue: [cambio
_ cambio + 1 ]]. 
 cambio = 3 	 ifTrue: [^ true] 	 ifFalse: ["(StreamingMP3Sound
onFileNamed: NewFolder pathName , FileDirectory slash , 'tramposo.mp3') play."
cartel string: 'Tramposo '. 		 cartel center: cardDialog center. 		 cardDialog
addMorph: cartel. 		 self halt]! !  !TEGMain methodsFor: 'menus'!
addCustomMenuItems: t1 hand: t2 
 super addCustomMenuItems: t1 hand: t2.  t1
addLine.  self addMenuItemsTo: t1 hand: t2! !  !TEGMain methodsFor: 'menus'!
addMenuItemsTo: t1 hand: t2 
 t1 	 add: 'new game' 	 target: self 	 action:
#newGame.  t1 	 add: 'reset...' 	 target: self 	 action: #reset.  t1 	 add:
'grabar estado' 	 target: self 	 action: #grabaEstado.  t1 	 add: 'leer estado'
target: self 	 action: #leerEstado.  t1 	 add: 'debug' 	 target: self 	 action:
#debug! !  !TEGMain methodsFor: 'menus' stamp: 'EDC 6/26/2002 07:50'!
cambiaCartas: cardDialog 
 | tengo cambios hagaCambio |  estado _ 4.  cambios _
#(4 6 8 10 12 15 ).  (losJugadores at: playerTurn) esHumano 	 ifTrue:
[hagaCambio _ self verificarCambio: cardDialog] 	 ifFalse: [hagaCambio _ true].
cardDialog submorphs 			 do: [:m | m class name = 'DrawCard' 					 ifTrue: [m
submorphs first estado 							 ifTrue: [tengo _ (losJugadores at: playerTurn)
misPaises includes: m numero. 								 tengo 									 ifTrue: [(submorphs at: m
numero) 											 add: 2]. 								 (losJugadores at: playerTurn) misCartas
remove: m numero 									 ifAbsent: []]]].  cambiosTotales _ cambiosTotales +
1.  cambiosTotales < 7 	 ifTrue: [pone _ pone + cambios at: cambiosTotales] 	
ifFalse: [pone _ pone + 15 + 5 * (cambiosTotales - 6)]. cardDialog delete. ! ! 
!TEGMain methodsFor: 'menus' stamp: 'EDC 6/27/2002 16:05'! hacerListaPaises:
aBoolean  | misLimites listaLimpia |  misLimites _ Set new.  "Deseo la lista
total de los paises limitrofes a mis paises"  (losJugadores at: playerTurn)
misPaises 	 do: [:pais | limites 			 do: [:each | (each includes: pais) 					
ifTrue: [misLimites add: each]]]. 	
 listaLimpia _ misLimites copy. aBoolean
ifTrue: [ "Debo eliminar de la lista las fronteras de paises que ambos me  
pertenezcan"  misLimites 	 do: [:frontera | (((losJugadores at: playerTurn)
misPaises 					 includes: (frontera at: 1)) 				 and: [(losJugadores at:
playerTurn) misPaises 						 includes: (frontera at: 2)]) 			 ifTrue:
[listaLimpia remove: frontera]] ] ifFalse: [ "Debo eliminar de la lista las
fronteras de paises que ambos me  
 pertenezcan"  misLimites 	 do: [:frontera |
(((losJugadores at: playerTurn) misPaises 					 includes: (frontera at: 1)) 				
and: [(losJugadores at: playerTurn) misPaises 						 includes: (frontera at:
2)]) 			 ifFalse: [listaLimpia remove: frontera]]].  .  ^ listaLimpia ! ! 
!TEGMain methodsFor: 'menus' stamp: 'edc 10/26/2004 08:20'! reset self
submorphsDo: 	 [:p | (p isKindOf: PaisMorph) ifTrue:[ p reset]].  self halt. 	
self initializeN! !  !TEGMain methodsFor: 'sound effects'! soundEffects  | t1 t2
|  t1 _ 3 atRandom.  t2 _ 'batalla' , t1 asString , '.wav'.  (SampledSound
fromWaveFileNamed: t2) play! !  !TEGMain methodsFor: 'sending-receiving
objects'! askMyData  | t1 t2 t3 t4 t5 t6 |  t1 _ activeSocket getObject.  self 	
losJugadores: (t1 at: 1).  self 	 cartasOrden: (t1 at: 2).  self 	 ronda: (t1
at: 3).  self 	 numCarta: (t1 at: 4).  self 	 cambiosTotales: (t1 at: 5).  t2 _
t1 at: 6.  1 	 to: 42 	 do: [:t7 | 
		 t3 _ t2 at: t7. 		 t4 _ self submorphs
at: t7. 		 t4 			 ejercitos: (t3 at: 1). 		 t4 			 deQuienSoy: (t3 at: 2). 		 t5
_ t4 deQuienSoy. 		 t6 _ (self losJugadores at: t5) miColor. 		 t4
redrawInColor: t6].  self 	 playerTurn: (t1 at: 7)! !  !TEGMain methodsFor:
'sending-receiving objects'! sendMyData  | t1 t2 t3 t4 |  serverOrClient =
#server 	 ifTrue: [activeSocket _ socketList at: playerTurn].  (activeSocket
isValid 		 and: [activeSocket isConnected]) 	 ifTrue: [t1 _ OrderedCollection
new. 		 t1 add: self losJugadores. 		 t1 add: self cartasOrden. 		 t1 add: self
ronda. 		 t1 add: self numCarta. 		 t1 add: self cambiosTotales. 		 t2 _ Array
new: 42. 		 1 			 to: 42 			 do: [:t5 | 
				 t3 _ self submorphs at: t5. 				
t4 _ Array new: 2. 				 t4 at: 1 put: t3 ejercitos. 				 t4 at: 2 put: t3
deQuienSoy. 				 t2 at: t5 put: t4]. 		 t1 add: t2. 		 t1 add: self playerTurn.
activeSocket sendObject: t1].  [activeSocket dataAvailable] whileFalse.  self
askMyData! ! 
 !TEGMain class methodsFor: 'as yet unclassified'! debug  self
maquinaPone! !  !TEGMain class methodsFor: 'as yet unclassified'! makeRTS: t1 
| t2 t3 |  t1 delete.  Preferences disable: #cmdDotEnabled; 		 disable:
#cmdGesturesEnabled; 		 disable: #cmdKeysInText; 		 enable: #noviceMode; 		
disable: #warnIfNoSourcesFile; 		 disable: #warnIfNoChangesFile; 		 enable:
#eToyFriendly; 		 disable: #honorDesktopCmdKeys; 		 enable: #appendToErrorLog;
enable: #noDebugButton.  t2 _ FileDirectory localNameFor: Smalltalk imageName. 
t3 _ (t2 			 copyFrom: 1 			 to: (t2 findString: '.image')) 			 , 'RTS.image'. 
Smalltalk 	 changeImageNameTo: (FileDirectory default fullNameFor: t3); 		
closeSourceFiles; 		 openSourceFiles; 		 snapshot: true andQuit: true! ! 
!TEGMain class methodsFor: 'as yet unclassified'! new  | t1 t2 |  FileDirectory
default pathParts last = 'STEG' 	 ifFalse: [self setFolder].  t1 _ FileStream
readOnlyFileNamed: 'TEGBlank.morph'.  t2 _ t1 fileInObjectAndCode.  t2
openCenteredInWorld.  t2 initializeN! !  !TEGMain class methodsFor: 'as yet
unclassified'! reset  | t1 t2 |  FileDirectory default pathParts last = 'STEG' 	
ifFalse: [self setFolder].  t1 _ FileStream readOnlyFileNamed: 'TEGBlank.morph'.
t2 _ t1 fileInObjectAndCode.  t2 leerEstado.  t2 openCenteredInWorld.  t2
initialize2! !  !TEGMain class methodsFor: 'as yet unclassified' stamp: 'edc
10/21/2004 11:39'! start ^ ActiveWorld submorphs 			 detect: [:t1 | t1 class ==
TEGMain].! !  !TEGMain class methodsFor: 'as yet unclassified' stamp: 'edc
10/21/2004 11:40'! startAsCliente  | instanciaTEG |  instanciaTEG _ self start. 
instanciaTEG serverOrClient: #cliente.  instanciaTEG initializeN! !  !TEGMain
class methodsFor: 'as yet unclassified' stamp: 'edc 10/21/2004 11:41'!
startAsServer | instanciaTEG |  instanciaTEG _ self start.  instanciaTEG
serverOrClient: #server.  instanciaTEG initializeN  ! ! 
 !TEGServer methodsFor:
'as yet unclassified' stamp: 'edc 10/8/2004 09:42'! addClient: socket 
 |
iPAddress s | 	
 iPAddress := NetNameResolver stringFromAddress: socket
remoteAddress.  s := String new.  s := iPAddress , Character tab asString ,
socket getData printString , ' joining this game...'.  instanciaTEG cartel
newContents: s.  World displayWorldSafely.  activeClient := activeClient + 1. 
socketList at: activeClient put: socket.  activeClient < maxClient ifFalse: [
instanciaTEG cuantosHumanos: activeClient. 	 instanciaTEG socketList: self
socketList]  ! !  !TEGServer methodsFor: 'as yet unclassified'! newEar  | t1 | 
t1 _ Socket 			 tcpCreateIfFail: [self error: 'Unable to create a socket'].  t1
listenOn: port backlogSize: 6.  ^ t1! !  !TEGServer methodsFor: 'as yet
unclassified' stamp: 'edc 10/18/2004 17:17'! newProcess  | p |  p _ [self
serviceLoop] newProcess.  p priority: self class priority.  ^ p! !  !TEGServer
methodsFor: 'as yet unclassified'! port: t1 
 port _ t1! !  !TEGServer
methodsFor: 'as yet unclassified' stamp: 'edc 10/4/2004 17:08'! serviceLoop  |
conn |  conn _ nil.  ear _ self newEar.  [true] 	 whileTrue: [[conn isNil] 			
whileTrue: [conn _ ear waitForAcceptUntil: Socket standardDeadline]. 		 conn
isConnected 			 ifTrue: [activeClient = maxClient 					 ifFalse: [self
addClient: conn]. 				 conn _ nil] 			 ifFalse: [self error: 'Accepted
unconnected socket']]! !  !TEGServer methodsFor: 'as yet unclassified'!
socketList  ^ socketList! !  !TEGServer methodsFor: 'as yet unclassified' stamp:
'edc 10/19/2004 07:14'! start | |  maxClient := 0.  [maxClient between: 1 and:
5] 	 whileFalse: [maxClient := (FillInTheBlank request: 'How many players 1 -
5') asInteger].  instanciaTEG := ActiveWorld submorphs 			 detect: [:t1 | t1
class == TEGMain].  instanciaTEG cartel newContents: 'TEGServer starting for ' ,
maxClient asString , ' players'.  World displayWorldSafely.  socketList :=
Dictionary new.  activeClient := 0. 	
 process 	 ifNil: [Socket
initializeNetwork. 		 process _ self newProcess. 		 process resume] 	 ifNotNil:
[self error: 'TEG Server already started'] 		

	
	 ! !  !TEGServer methodsFor:
'as yet unclassified'! stop  process 	 ifNotNil: [process terminate. 		 process
_ nil. 		 ear closeAndDestroy. 		 ear _ nil]! ! 
 !TEGServer class methodsFor:
'defaults'! defaultPort  ^ 8000! !  !TEGServer class methodsFor: 'defaults'!
priority  ^ Processor lowIOPriority! !  !TEGServer class methodsFor: 'defaults'!
start  ^ self startOn: self defaultPort! !  !TEGServer class methodsFor:
'running'! startOn: t1 
 ^ self new port: t1; 		 start! !  !TEGServer class
methodsFor: 'running'! stop  self 	 allInstancesDo: [:t1 | t1 stop]! ! 
!TEGStartButton methodsFor: 'menu'! addMenuItemsTo: t1 hand: t2 
 | t3 |  t3 _
MenuMorph new.  t3 color: Color blue.  t3 	 color: (t3 color alpha: 0.5).  t3 	
add: 'Soy server' 	 target: TEGMain 	 action: #startAsServer.  t3 	 add: 'Soy
cliente ' 	 target: TEGMain 	 action: #startAsCliente.  t3 items 	 do: [:t4 | t4
color: Color yellow; 				
			 font: (StrikeFont 					 familyName: 'Comic Bold'
size: 18 					 emphasized: 1)].  t3 invokeModal! !  !TEGStartButton methodsFor:
'event handling'! handlesMouseDown: t1 
 ^ true! !  !TEGStartButton methodsFor:
'event handling'! mouseDown: t1 
 | t2 |  t1 yellowButtonPressed 	 ifFalse: [^
t1 hand waitForClicksOrDrag: self event: t1].  t2 _ MenuMorph new defaultTarget:
self.  self addMenuItemsTo: t2 hand: t1 hand.  t2 popUpEvent: t1 in: self world!
!  TEGMain class removeSelector: #resetFolder! TEGMain class removeSelector:
#setFolder! TEGMain removeSelector: #activeSocket! TEGMain removeSelector:
#dibujaRegion2:color:! TEGMain removeSelector: #elijeColor! TEGMain
removeSelector: #in:pos1:pos2:! TEGMain removeSelector: #informaCartas! TEGMain
removeSelector: #initializeP! TEGMain removeSelector: #lim! TEGMain
removeSelector: #lim:! TEGMain removeSelector: #maximo:! TEGMain removeSelector:
#miArchivo! TEGMain removeSelector: #miArchivo:! TEGMain removeSelector:
#minimo:! TEGMain removeSelector: #paises:! TEGMain removeSelector:
#ponerEjercitos:enPais:! TEGMain removeSelector: #repeat! "Postscript: Leave the
line above, and replace the rest of this comment by a useful one. Executable
statements should follow this comment, and should be separated by periods, with
no exclamation points (!!). Be sure to put any further comments in
double-quotes, like this one."  | fd path  oldFolder newFolderPath pos
relativeName b t|


 fd _ FileDirectory default.  (fd directoryExists:  'STEG') ifFalse:[fd
createDirectory: 'STEG'].
path _  fd pathName, FileDirectory slash ,'STEG', FileDirectory slash . (self
memberNames) do: [ :aFile| (aFile beginsWith: 'STEG') ifTrue:[ pos _ aFile
findString: '/'. relativeName _ aFile copyFrom: pos + 1 to: aFile size. 
relativeName  _ 'STEG/' , relativeName. 				 self extractMember: aFile
toFileNamed:  relativeName ]] . oldFolder := FileDirectory default.
newFolderPath := oldFolder pathName,FileDirectory slash,'STEG'. FileDirectory
setDefaultDirectory: newFolderPath. b _ self fileInMorphsNamed:
'STEG/TEGStartButton.morph' addToWorld: true. t _ self fileInMorphsNamed:
'STEG/TEGBlank.morph' addToWorld: true. b show. b position: 20@20. t show. t
center: World center. FileDirectory setDefaultDirectory: oldFolder pathName.
DrawPicture inicializarDibujos.!

#518 De: Eduardo Ferro Aldama <eduardo.ferro@...>
Fecha: Jue, 13 de Ene, 2005 8:43 pm
Asunto: datos imagen
drtrucho
Sin conexión Sin conexión
Enviar correo Enviar correo
 
Buenas!

Tengo la portada de un libro que quiero poder mostrar en squeak... el
caso es que he cargado el jpg en el squeak pero creo que el contenido
(los datos del jpg) creo que deberia estar en la clase del modelo pero
no se que clase y como puedo sacar los datos del jpg....

Gracias por anticipado!
--
Hasta otra!
   Eduardo Ferro Aldama        http://personales.ya.com/eferro
   eduardo.ferro@...
   eferro@...

#517 De: Eduardo Ferro Aldama <eduardo.ferro@...>
Fecha: Jue, 13 de Ene, 2005 8:45 pm
Asunto: tutorial morphic
drtrucho
Sin conexión Sin conexión
Enviar correo Enviar correo
 
Hola!
Sabeis de algún tutorial de morphic en el que se pueda ver la parte de
morphic (interface de usuario) y la parte de negocio y como se
relacionan entre ellas.
Todo lo que he visto de morphic no me ha aclarado como juntar el modelo
y el interface

gracias de antemano
--
Hasta otra!
   Eduardo Ferro Aldama        http://personales.ya.com/eferro
   eduardo.ferro@...
   eferro@...

#516 De: "hernan_karate" <hernan_karate@...>
Fecha: Mié, 12 de Ene, 2005 7:12 pm
Asunto: Re: Multicast...¿como se puede hacer?
hernan_karate
Sin conexión Sin conexión
Enviar correo Enviar correo
 
Hola!! Primero gracias por responder a mi duda, segundo... te
respondo las preguntas entre lineas ok?
> A ver si te entiendo.
> La máquina que esta escuchando es un server ?
Si, además ejecutará una instancia del cliente.
> Podrías definir mejor el problema >
Si, basicamente es un juego, que ubica a los servidores sin tener
idea de los nombres de los mismos (tipo counter strike). Esto explica
por que uso UDP... si se hace con tcp debo conocer al host destino,
en cambio con udp lo mando a la direccion de broadcast de la red y
el / los servidor(es) capturan el datagrama y pueden responderme.

> Hay ejercicios en OldSocket que yo mande a la lista como de Socket.
Si, hemos dado de bruces contra OldSocket... con udp hemos podido
transferir datos, pero a la hora de enviar paquetes, como bien dejas
traslucir, seria mejor usar tcp... pero con tcp en squeak 3.7 varias
veces hemos destrozado la vm, o salio un lindo primitive has falied
en el acept... o en el waitForCon...For:
De hecho
> tengo una clase Socket levemente modificada que me resuelve todo
tipo de
> problemas.
Podrias mandarnosla?
> Porque udp ?
(Udp solo lo usamos para buscar otras maquinas, la transmision
efectiva de los datos seria por tcp)
> Los niveles de complejidad son.
> Socket para transmiitir bytes, texto u objetos (tal como en el TEG)
pero
> usando tcp.
> TcpService para conexiones mas seguras y servicios
> Komanche y sus derivados para armar swikis y otras cosas.
> HttpView 2 para aplicaciones web livianas.
> Seaside para aplicaciones web complejas.
Digamos que querriamos hacer nuestro propio framework... estamos en
problemas no?

Muchas gracias por tu tiempo. Hasta luego

#515 De: "Lic. Edgar J. De Cleene" <edgardec2001@...>
Fecha: Jue, 6 de Ene, 2005 9:18 am
Asunto: Re: Multicast...¿como se puede hacer?
edgardec2001
Sin conexión Sin conexión
Enviar correo Enviar correo
 
On 05/01/05 11:46, "hernan_karate" <hernan_karate@...> wrote:

>
> Hola lista soy Hernan, un nuevo miembro. Escribo este mail porque
> necesito hacer un multicast en squeak. La idea es la siguiente:
> conectarme con udp a una maquina que esta escuchando, pero de la cual
> no conozco el nombre. He hecho algo asi en VW nc, pero no pude
> portarlo aun a squeak. ¿Podrian ayudarme?
A ver si te entiendo.
La máquina que esta escuchando es un server ?
Podrías definir mejor el problema >
Hay ejercicios en OldSocket que yo mande a la lista como de Socket. De hecho
tengo una clase Socket levemente modificada que me resuelve todo tipo de
problemas.
Porque udp ?
Los niveles de complejidad son.
Socket para transmiitir bytes, texto u objetos (tal como en el TEG) pero
usando tcp.
TcpService para conexiones mas seguras y servicios
Komanche y sus derivados para armar swikis y otras cosas.
HttpView 2 para aplicaciones web livianas.
Seaside para aplicaciones web complejas.

Espero tu aclaración a ver si te puedo ayudar mas (o preguntar yo a la lista
internacional si no manejas inglés).

#514 De: "hernan_karate" <hernan_karate@...>
Fecha: Mié, 5 de Ene, 2005 2:46 pm
Asunto: Multicast...¿como se puede hacer?
hernan_karate
Sin conexión Sin conexión
Enviar correo Enviar correo
 
Hola lista soy Hernan, un nuevo miembro. Escribo este mail porque
necesito hacer un multicast en squeak. La idea es la siguiente:
conectarme con udp a una maquina que esta escuchando, pero de la cual
no conozco el nombre. He hecho algo asi en VW nc, pero no pude
portarlo aun a squeak. ¿Podrian ayudarme?

#513 De: "Lic. Edgar J. De Cleene" <edgardec2001@...>
Fecha: Dom, 31 de Oct, 2004 10:13 am
Asunto: Ayuda importante para los alumnos subscriptos a la lista
edgardec2001
Sin conexión Sin conexión
Enviar correo Enviar correo
 
Chicos:
Aqui les mando una ayuda importante.
Parece ser que el buffer de recepción no se vaciara despues de leer cada
dato transmitido , probe´con Delay de distintos valores y no mejoró.
Así que como la idea original era hacer una simulación sencilla de Token,
les agrego este .cs.
Vean que han sido modificados el cliente y el server para que el server
envie un Character cr despues de cada mensaje (Si lo pensamos, no es tan
absurdo, despues de todo es un fin de linea en cualquier texto ASCII)
Obviamente, como puede haber varios mensajes , hay que parsearlos (vean el
findToken del cliente).
No les hice la lógica de cuando hay que mandar la lista de mensajes
acumulados al cliente en cuestion, laburen algo.
Recuerden:
Tienen toda esta semana y la próxima para consultarme por mail o en
cualquiera de los horarios.
A domicilio, ya saben la tarifa, las chichs una torta , los varones un
asado, (o al revés, no discrimino).

Buen domingo.
Edgar
'From Squeak3.7 of ''4 September 2004'' [latest update: #5989] on 31 October
2004 at 6:59:12 am'! Object subclass: #RemoteClient  instanceVariableNames:
'socket serverName'  classVariableNames: ''  poolDictionaries: ''  category:
'RemoteExperiments'! Object subclass: #RemoteServer  instanceVariableNames:
'socket'  classVariableNames: ''  poolDictionaries: ''  category:
'RemoteExperiments'! Object subclass: #VNCServer  instanceVariableNames: 'port
process ear socketList activeClient maxClient mensaje listaMensajes misClientes'
classVariableNames: ''  poolDictionaries: ''  category: 'RemoteExperiments'! 
!RemoteClient methodsFor: 'as yet unclassified' stamp: 'edc 10/27/2004 06:52'!
initialize 	
 Transcript open. 
 Transcript show: 'Probando conexion a red ...
'.  Socket initializeNetwork.  Transcript show: 'ok'; 		 cr.  serverName :=
FillInTheBlank request: 'Nombre server o IPAddress' initialAnswer: 'localhost'.
self newSocket. 
 self nextCommand: (FillInTheBlank request: 'Nombre usuario'
initialAnswer: 'Alumno desconocido')! !  !RemoteClient methodsFor: 'as yet
unclassified' stamp: 'edc 10/27/2004 06:52'! newCommand  ^ FillInTheBlank
request: 'Nuevo mensaje' initialAnswer: ''.  ! !  !RemoteClient methodsFor: 'as
yet unclassified' stamp: 'edc 4/22/2004 08:03'! newSocket  socket _ Socket
newTCP.  socket 	 connectTo: (NetNameResolver addressForName: serverName) 	
port: 8000.  socket waitForConnectionUntil: Socket standardDeadline! ! 
!RemoteClient methodsFor: 'as yet unclassified' stamp: 'edc 10/31/2004 17:46'!
nextCommand: aString 
 | objRec command stream mensajesRecibidos |  command :=
aString.  [command = 'FIN'] 	 whileFalse: [ 		 (socket isValid 				 and: [socket
isConnected]) 			 ifTrue: [Transcript show: 'Mandamos ' , command; 						 cr.
socket sendData: command.] 			 ifFalse: ["stale connection" 				 socket destroy.
socket := nil]. 			 objRec _ ''. 			 [objRec = 'FIN'] whileFalse: [ 		 [socket
dataAvailable] whileFalse. 		 stream := socket getData. 		 mensajesRecibidos _
stream findTokens: Character cr. 		 mensajesRecibidos do: [ :m| objRec _ m. 		
Transcript show: 'Respondio ' , objRec printString; 				 cr]]. 
		 command :=
self newCommand]! ! 
 !RemoteServer methodsFor: 'as yet unclassified' stamp:
'edc 10/23/2004 07:07'! initialize | command iPAddress s | Transcript open.
Transcript show: 'Starting server'. socket _ Socket 	 tcpCreateIfFail: [^
Transcript show: 'failed']. 	
	
 socket listenOn: 8000.  command := 'START'. 
[command = 'FIN'] 	 whileFalse: [  socket waitForConnectionUntil: (Socket
deadlineSecs: 30).  [socket isConnected] 	 whileTrue: [ socket dataAvailable 			
ifTrue: [command _ socket getData. 					
				 iPAddress := NetNameResolver
stringFromAddress: socket remoteAddress.  s := String new.  s := iPAddress ,
Character tab asString , 'Envio ',command printString. 				 Transcript show:
s;cr. 				 socket sendData: 'OK']]]. 	 socket destroy.! ! 
 !Socket methodsFor:
'receiving' stamp: 'edc 2/15/2004 09:17'! getData  | t1 t2 |  (self
waitForDataUntil: Socket standardDeadline) 	 ifFalse: [self error: 'getData
timeout'].  t1 _ String new: 4000.  t2 _ self 			 primSocket: socketHandle 			
receiveDataInto: t1 			 startingAt: 1 			 count: t1 size.  ^ t1 copyFrom: 1 to:
t2! !  !Socket methodsFor: 'waiting' stamp: 'jm 3/2/98 18:15'!
waitForConnectionUntil: deadline  "Wait up until the given deadline for a
connection to be established. Return true if it is established by the deadline,
false if not." 
 | status |  status _ self primSocketConnectionStatus:
socketHandle.  [(status = WaitingForConnection) and: [Time millisecondClockValue
< deadline]] 	 whileTrue: [ 		 semaphore waitTimeoutMSecs: (deadline - Time
millisecondClockValue). 		 status _ self primSocketConnectionStatus:
socketHandle]. 
 ^ status = Connected! !  !Socket methodsFor: 'waiting' stamp:
'edc 2/15/2004 09:19'! waitForDataUntil: deadline 
 "Wait up until the given
deadline for data to arrive. Return true if data 
 arrives by the deadline,
false if not."  | dataArrived |  [self isConnected & (dataArrived := self
primSocketReceiveDataAvailable: socketHandle) not 	 and: ["Connection end and
final data can happen fast, so test in this 
		 order " 		 Time
millisecondClockValue < deadline]] 	 whileTrue: [self readSemaphore
waitTimeoutMSecs: deadline - Time millisecondClockValue].  ^ dataArrived! ! 
!Socket methodsFor: 'waiting' stamp: 'edc 10/5/2004 11:44'!
waitForDisconnectionUntil: deadline  "Wait up until the given deadline for the
the connection to be broken. Return true if it is broken by the deadline, false
if not."  "Note: The client should know the the connect is really going to be
closed (e.g., because he has called 'close' to send a close request to the other
end) before calling this method. JMM 00/5/17 note that other end can close which
will terminate wait" 
 | extraBytes status |  extraBytes := 0.  status := self
primSocketConnectionStatus: socketHandle.  [((status = Connected) or: [(status =
ThisEndClosed)]) and: 	 [Time millisecondClockValue < deadline]] whileTrue: [ 	
self dataAvailable 		 ifTrue: [extraBytes := extraBytes + self
discardReceivedData]. 	 semaphore waitTimeoutMSecs: (deadline - Time
millisecondClockValue). 	 status := self primSocketConnectionStatus:
socketHandle]. 
 extraBytes > 0 	 ifTrue: [self inform: 'Discarded ', extraBytes
printString, ' bytes while closing connection.']. 
 ^ status ~= Connected ! ! 
!Socket methodsFor: 'waiting' stamp: 'edc 10/5/2004 11:42'!
waitForSendDoneUntil: deadline  "Wait up until the given deadline for the
current send operation to complete. Return true if it completes by the deadline,
false if not." 
 | sendDone |  [self isConnected & (sendDone := self
primSocketSendDone: socketHandle) not 		 "Connection end and final data can
happen fast, so test in this order" 	 and: [Time millisecondClockValue <
deadline]] whileTrue: [ 		 self writeSemaphore waitTimeoutMSecs: (deadline -
Time millisecondClockValue)]. 
 ^ sendDone! !  !Socket methodsFor:
'sending-receiving objects' stamp: 'dgd 2/22/2002 20:28'! getObject  "gets a
serialized object from this socket"  | encoded object |  encoded _ String new
writeStream.  [encoded size isZero] 	 whileTrue: [encoded nextPutAll: self
getData].  [self isConnected 	 and: [self dataAvailable]] 	 whileTrue: [encoded
nextPutAll: self getData].  object _ ReferenceStream unStream: encoded contents.
^ object! !  !Socket methodsFor: 'sending-receiving objects' stamp: 'dgd
2/22/2002 20:28'! sendObject: anObject 
 "sends a serialized object to this
socket"  | encoded |  encoded _ ReferenceStream streamedRepresentationOf:
anObject.  self sendData: encoded! ! 
 !Socket class methodsFor:
'remoteExamples' stamp: 'edc 2/15/2004 10:53'! remoteCommClient  | newSocket
objRec command serverName |  Transcript open.  Transcript show: 'starting remote
comm test'; 		 cr.  Transcript show: 'initializing network ... '.  Socket
initializeNetwork.  Transcript show: 'ok'; 		 cr.  serverName := '169.254.6.4'. 
command := FillInTheBlank request: 'Type remote image command' initialAnswer:
''.  newSocket := Socket newTCP.  newSocket 	 connectTo: (NetNameResolver
addressForName: serverName) 	 port: 8000.  newSocket waitForConnectionUntil:
Socket standardDeadline.  Transcript show: 'server start to perform
instructions'; 		 cr.  [command = 'FIN'] 	 whileFalse: [Transcript show:
'Command sended is ' , command; 				 cr. 		 newSocket sendObject: command. 		
newSocket 			 waitForConnectionUntil: (Socket deadlineSecs: 60). 		 [newSocket
isConnected] 			 whileTrue: [newSocket dataAvailable 					 ifTrue: [newSocket
dataAvailable 							 ifTrue: [objRec := newSocket getObject. 								
Transcript show: 'Resoonse is ' , objRec printString; 										 cr. 								
command := FillInTheBlank request: 'Type remote image command' initialAnswer:
'']]]].  newSocket closeAndDestroy! ! 
 !VNCServer methodsFor: 'as yet
unclassified' stamp: 'edc 10/30/2004 15:51'! addClient: socket 
	 | iPAddress
nombre |  iPAddress _ NetNameResolver stringFromAddress: socket remoteAddress. 
Transcript show: iPAddress; 		 tab. 	
 activeClient _ activeClient + 1. 
misClientes 	 at: iPAddress 	 ifAbsent: [ 	 [socket dataAvailable] whileFalse. 
nombre _ socket receiveData. 		 Transcript show: nombre; 		 cr. 		 misClientes 	
at: iPAddress put: nombre. 		 socketList at: activeClient put: socket. 		 ]. 
activeClient = maxClient 	 ifTrue: [self ringLoop]! !  !VNCServer methodsFor:
'as yet unclassified' stamp: 'edc 10/30/2004 12:13'! mensajesAlCliente self
halt.! !  !VNCServer methodsFor: 'as yet unclassified' stamp: 'edc 4/22/2004
11:09'! newEar  | socket |  socket _ Socket 			 tcpCreateIfFail: [self error:
'Unable to create a socket'].  socket listenOn: port backlogSize: 6.  ^ socket!
!  !VNCServer methodsFor: 'as yet unclassified' stamp: 'cwp 9/29/2002 19:54'!
newProcess  | p |  p _ [self serviceLoop] newProcess.  p priority: self class
priority.  ^ p ! !  !VNCServer methodsFor: 'as yet unclassified' stamp: 'cwp
9/29/2002 17:38'! port: aPort  port _ aPort! !  !VNCServer methodsFor: 'as yet
unclassified' stamp: 'edc 10/30/2004 15:31'! procesarMensaje  |   socket  | 
socket _ socketList at: activeClient.  [socket dataAvailable] whileFalse. 
mensaje _ socket receiveData.  mensaje = 'LEE' ifTrue: [self mensajesAlCliente
].  mensaje = 'MANDA' ifTrue: [socket sendData: 'Primera palabra nombre, luego
el mensaje'. 	 socket sendData: 'FIN'. 
	 [socket dataAvailable] whileFalse. 
mensaje _ socket receiveData.  listaMensajes add: mensaje].  mensaje =  'FIN'
ifTrue:[socketList at: activeClient put: 'FIN'].  ! !  !VNCServer methodsFor:
'as yet unclassified' stamp: 'edc 10/31/2004 06:57'! ringLoop  | socket   | 
[true] 	 whileTrue: [World displayWorldSafely. 		 activeClient _ activeClient \\
maxClient + 1. 		 socket _ socketList at: activeClient. 		 (socket isValid 				
and: [socket isConnected]) 			 ifTrue: [misClientes valuesDo: [:nombre| socket
sendData: nombre. 					 socket sendData: Character cr]. 						
					 socket
sendData: 'FIN'. 				 self procesarMensaje] ]! !  !VNCServer methodsFor: 'as yet
unclassified' stamp: 'edc 10/25/2004 07:46'! serviceLoop  | conn |  conn _ nil. 
ear _ self newEar.  [true] 	 whileTrue: [[conn isNil] 			 whileTrue: [conn _ ear
waitForAcceptFor: Socket standardDeadline]. 		 conn isConnected 			 ifTrue: [ 
self addClient: conn. 				 conn _ nil] 			 ifFalse: [self error: 'Accepted
unconnected socket']]! !  !VNCServer methodsFor: 'as yet unclassified' stamp:
'edc 10/30/2004 12:19'! start  maxClient := 0.  [maxClient between: 1 and: 5] 	
whileFalse: [maxClient := (FillInTheBlank request: 'Servidor para 1 - 5')
asInteger]. 
 Transcript open. Transcript show: 'Comienza server...';cr. 
socketList _ Dictionary new.  misClientes _ Dictionary new.  listaMensajes _
OrderedCollection new.  activeClient _ 0. 	
 process 	 ifNil: [Socket
initializeNetwork. 		 process _ self newProcess. 		 process resume] 	 ifNotNil:
[self error: 'Server ya comenzo']! !  !VNCServer methodsFor: 'as yet
unclassified' stamp: 'edc 10/25/2004 07:54'! stop  process terminate.  process _
nil.  ear closeAndDestroy.  ear _ nil. 
 Transcript closeAllViews! ! 
!VNCServer class methodsFor: 'defaults' stamp: 'edc 4/22/2004 10:52'!
defaultPort  ^ 8000! !  !VNCServer class methodsFor: 'defaults' stamp: 'cwp
9/29/2002 19:54'! priority  ^ Processor lowIOPriority! !  !VNCServer class
methodsFor: 'defaults' stamp: 'edc 10/25/2004 08:07'! start 
 ^ self startOn:
self defaultPort! !  !VNCServer class methodsFor: 'running' stamp: 'cwp
9/29/2002 17:37'! startOn: aPort  ^ self new port: aPort; start! !  !VNCServer
class methodsFor: 'running' stamp: 'cwp 11/3/2002 00:20'! stop  self
allInstancesDo: [:server | server stop]! !  Smalltalk removeClassNamed:
#RingServer!

#512 De: "Lic. Edgar J. De Cleene" <edgardec2001@...>
Fecha: Sáb, 30 de Oct, 2004 9:36 am
Asunto: Re: Squeak
edgardec2001
Sin conexión Sin conexión
Enviar correo Enviar correo
 
On 29/10/04 16:22, "Diego Lobos" <std70@...> wrote:

> Hola Edgar!
> te agradezco los links, he visitados varios de esos (y
> varios no).
>
> *aquí en Rosario tengo un grupo
> Estoy suscripto a SqueakRos hace unos meses.
>
Ok, entonces te contesto por el grupo
> *Específdicamente para tu pregunta , la repuesta
> podría ser usar un
> *Squeak pelado hasta MVC (te quedaría una imagen
> chiquita y liviana) y *usar FFI para acceder a las
> Api.
> Leí en el Swiki de Squeak que las FFI son lentas,
> aunque no se a que se refieren con lentas, voy a
> chequearlas un poco.
No se en Windows, pero en Mac la máquina vuela comparada con Morph cuando se
usan FFI.
Tanto es así que cuando salio el beta del Ambrai (usn smalltalk para Mac
10.3) , como viene con los fuentes me puse a ver como acceder a las API.
Con la invaluable ayuda d John MkIntosh algo logre hacer , pero estoy
bastante lejos del nivel de "los monstruos"
De lo que no me cabe duda es que se puede y que la diferencia de perfomance
es notable.
No se cual es el soporte en windows para todas las api ni cual podría ser la
diferencia de perfomance.
Hace los ejercicios que vienen en Squeak y contame



> Ya tengo algún trabajo hecho con Morphs (no mucho), y
> me he acostumbrado a poder llevarlos de acá para allá
> con facilidad, tengo la idea de que con MVC voy a
> tener que laburar más la parte gráfica, voy a
> chequearlo también.
>
> *Busquen algun 'sponsor" para Software Libre que les
> regale máquinas
> *nuevas y les tire uns pesos a algunos
> docentes/alumnos que armen un *grupo para desarrollar
> sofware.
>
> Si saliera bien la aplicación (esto bien a futuro) me
> gustaría ganar algo de plata con ella, esto es posible
> via Software Libre?
Es posible , ya que si no el cliente tendría que ponerse el a investigar y
programar.
Ese tiempo tuyo de investigar y programar te lo tienen que pagar.
Usando cualqueier soft comercial, si no son truchos, tienen que pagar ademas
licencias , etc
Eso si, si no anda no le vas a poder hechar la culpa a Bill Gates.


> Un abrazo, muchas gracias!
> Diego Lobos
Otro y a tus ordenes
Edgar

#511 De: "Lic. Edgar J. De Cleene" <edgardec2001@...>
Fecha: Vie, 29 de Oct, 2004 1:07 pm
Asunto: Re: [objetos] Squeak - Manual del Programador
edgardec2001
Sin conexión Sin conexión
Enviar correo Enviar correo
 
On 29/10/04 08:08, "Gustavo Torossi" <gmtorossi@...> wrote:

> Edgar:
> Te agradezto todas las guías que me brindas, pero por
> sobre todo, tu buena actitud y predisposición para
> ayudar.
> Soy docente en la UTN Resistencia, y comencé a ver
> Smalltalk hace poco cursando una materia de una
> maestria de la UNLP. Nunca fui mas alla de trabajos
> académicos y de experimentación, pero me fascinó su
> concepción. Hace poco comence a ver Squeak en el
> contexto de investigarlo como herramienta para el
> desarrollo de aplicaciones educativas, en una
> licenciatura en Tec.Educ. que curos, y en eso estoy.
> Lo primero que me "chocó" es que si bien por debajo
> esta un Smalltalk que parece no diferir mucho de los
> demas, en la superficie es bien distinto a VW,
> Dolphin, etc., y obviamente no está pensado para el
> tipo de aplicaciones más tradicionales como los otros
> ST que menciono, o incluso como otros lenguajes como
> Java.
> Nuevamente, muchas gracias, y seguimos en contacto.
> Saludos
>
> Gustavo.-
>

Mando copia al grupo para que alguno se prenda.
Te cuento mi experiencia.
Soy Licenciado en Química Industrial y estoy con las compu desde el 79.
Empecé con el Apple II (por eso soy fana de Apple , aunque tambien tremendo
crítico de los desastres que han hecho) y en el 81 llege a la UNRC (Rio
Cuarto) donde fui parte primero del consejo que manejaba una PDP 11-34 y
después cuando en el 84 se profesianalizo todo y recibimos el IBM 3031
(donado por IBM junto con otras 17 máquinas a otras universidades
nacionales).

Squeak comienza como proyecto interno en Apple con parte de la gente de
Xerox y parte de gente de Sun.
Tu problema (y el de todos los verdaderos Smalltalkers) , es que Morphic es
otra cosa (Self es su antecesor).
Y como bien dicen mis ex-alumnos (Andrés, Felix, Mariano) que me enseñaron
los primeros pasos en el 2001, Squeak parece haber sido hecho una noche de
LSD y rock and roll y a los tres días cuando se les pasó el mambo hicieron
Visual Works.
Squeak no es un producto terminado (alguna vez lo será ?) sino un lugar
donde cado uno que se metió trajo su locura.

Lo que puedo decir es que no se arrepentirán y que cada vez las cosas les
serán más fáciles.
Espero que lleguen al punto donde digan "Porque perdí tanto tiempo antes"

Y como siempre , voy por el choripán y la coca a dar charlas, cursos, etc
con CD llenos de cosas.

Edgar

#510 De: "Lic. Edgar J. De Cleene" <edgardec2001@...>
Fecha: Vie, 29 de Oct, 2004 9:36 am
Asunto: Re: [objetos] Squeak - Manual del Programador
edgardec2001
Sin conexión Sin conexión
Enviar correo Enviar correo
 
On 28/10/04 07:56, "Gustavo Torossi" <gmtorossi@...> wrote:

> Edgar:
> Casualmente ayer siguiendo unos links he descubierto
> vuestro sitio de Rosario, el cual es muy interesante.
> Desde ya muchas gracias por la invitacion y los
> enlaces.
> Tengo una base sobre Smalltalk pero he trabajado
> fundamentalmente con Visual Works. En Squeak estoy un
> poco desorientado, porque el entorno es un tanto
> distinto. Pregunto: existe por ej. algun GUI Painter o
> algo similar? como desarrollar interfaces, ventanas,
> al estilo VW o Dolphin?
> Muchas Gracias
Gustavo:
Una de las "contras" de Squeak es que no existe un constructor de interfaces
al estilo de las del Visual Works.
Existen los elementos aislados (botones, listas plugables, etc) y algo a
medio hacer para obtener el código a partir de un Morph ya creado.
Yo le agarre la mano muy fácil, pero sigo viendo que gente con años de
Smalltalk tienen dificultados.
Lo que te recomiendo.
Fijate en los proyectos que hay en la parte de archivos, te darán una idea,
los estoy actualizando a 3.7 y empaquetandolos como .sar, ya que parece ser
lo que se está usando.
Usá BorderedMorph como receptáculo de formularios, y valores relativos para
el posicionamiento de botones, etc.
Algo que podría servirte es el BobUi, es un intento de constructor de
interfaces que lamentablemente quien lo hizo no siguió desarrollando.
Hay que ver las cosas al estilo yanqui, es decir donde hay un problema hay
una oportunidad.
Es decir construir un Gui Painter te dará un lugar destacado en en mundo
Squeak.
Muchas veces me vi tentado, pero decidí concentrar mis esfuerzos en la
contrucción de un Squeak chico y todavía útil.
Eso se llama SqueakLight y lo tengo para 3.6 con menos de 4 mb , pudiendo
correr la mayoría de Morph y web con Comanche y HttpView.

A tus ordenes para cualquier consulta.

Edgar

#509 De: squeakRos@...
Fecha: Mar, 21 de Sep, 2004 9:25 am
Asunto: Nuevo archivo cargado en squeakRos
squeakRos@...
Enviar correo Enviar correo
 
Hola:

Este mensaje es una notificación de que ha sido cargado un archivo
nuevo en el área de archivos del grupo squeakRos.

   Archivo     : /SqueakRos.008.pr
   Cargado por : edgardec2001 <edgardec2001@...>
   Descripción : Lo primero a cargar despues de la imagen

Podés acceder a este archivo en la siguiente dirección web

http://ar.groups.yahoo.com/group/squeakRos/files/SqueakRos.008.pr

Para saber más sobre cómo compartir archivos en tu grupo, por favor
visitá

http://help.yahoo.com/help/ar/groups/files

Gracias,

edgardec2001 <edgardec2001@...>

#508 De: "Lic. Edgar J. De Cleene" <edgardec2001@...>
Fecha: Jue, 16 de Sep, 2004 9:19 am
Asunto: FW: Squeak 3.7 released!
edgardec2001
Sin conexión Sin conexión
Enviar correo Enviar correo
 
Aquí el resumen del 3.7.
Ahora es oficial.

------ Forwarded Message
From: Doug Way <dway@...>
Reply-To: The general-purpose Squeak developers list
<squeak-dev@...>
Date: Wed, 15 Sep 2004 13:09:22 -0400
To: squeak-dev@...
Subject: Squeak 3.7 released!


Squeak 3.7 is released!  It was a bit of a long time coming, but it is
now available for download at http://squeak.org.  Thanks to everyone
who contributed in one way or another.

PR announcements will be going out to various public places soon.

Here's a summary of the major new features in 3.7, copied from the
"What's New" section in the Welcome Window:
------------------------------------------------------------------
      * Version 2 of SqueakMap, a major upgrade which supports multiple
releases for packages, user accounts and much more.
      * Babel, a framework for supporting language translations in the
UI. (e.g. French, Swedish, etc.)
      * SmaCC, the Smalltalk Compiler Compiler deployment runtime from
John Brant.  The SmaCC development tool lets you define a
parser/compiler.
      * Some packages removed and placed on SqueakMap, including the XML
parser and IRC.
      * The Accufonts bitmap font set.  This means the original Apple
NewYork font has been removed, to help clean up the Squeak-L licensing
issue regarding fonts.
      * BitstreamVeraFonts, a set of free TrueType/antialiased fonts.
      * Chronology package. This contains ANSI DateTime, refactored Date
and Time classes.
      * The remaining ANSI compatibility methods.  Squeak now includes
all of the major ANSI compatibility changes.
      * A Change Notification framework from the KCP team at Berne.  This
sends consistent notification messages when code changes happen in the
system.
      * Latest updates from the SqueakLand/Etoys world.
      * An enhanced look and feel including menu icons, gradient
scrollbars and window titlebar buttons, etc.
      * Horizontal scrollbars now supported in all scrollable text/list
panes, and very large lists are now supported with LargeLists.
      * Class comments immediately visible in Browsers when a new class
is viewed.
      * Enhancement packages incorporated from SqueakMap:  NamedProcess,
ShrinkingSelection/ParenBlinking, BreakpointSupport, LargeLists.
      * Support for animated GIFs and saving PNG files.
      * Support for compressed source files.
      * New class Matrix which replaces Array2D.
      * The usual numerous small enhancements and fixes.


- Doug



------ End of Forwarded Message

#507 De: "Lic. Edgar J. De Cleene" <edgardec2001@...>
Fecha: Vie, 27 de Ago, 2004 10:15 am
Asunto: Welcome Jon
edgardec2001
Sin conexión Sin conexión
Enviar correo Enviar correo
 
Guys, another big Smalltalker are joining us.

I tell this is a beginners study group with a couple of real pros and also
not living here.

I hope Mark read this and tell you (and other possible visitor) what kind of
Asado , chat, beer can you enjoy visiting Rosario.

For instructing members , would be nice if you send a couple of lines
telling us where you live and anothers issues what wish share with us.

Promise translated to Spanish for whose not understanding Englisn.

So, WELCOME (or WILKOMMENN ) Jan

Edgar

Mensajes 507 - 536 de 3478   Más reciente  |  < Más reciente  |  Más antiguo >  |  Más antiguo
Avanzado

Copyright © 2009 Yahoo! de Argentina S.R.L. Todos los derechos reservados.
Política de privacidad - Condiciones del Servicio - Reglas de la comunidad de Yahoo! - Ayuda