FW: [Pharo-project] Command Line AWS S3 Upload/Download Tool using Pharo Smalltalk

Previous Topic Next Topic
 
classic Classic list List threaded Threaded
13 messages Options
Reply | Threaded
Open this post in threaded view
|

FW: [Pharo-project] Command Line AWS S3 Upload/Download Tool using Pharo Smalltalk

Edgar De Cleene
#OtroParaLaListaInterminable
Como ven sigo atentamente lo que pasa en Pharo
Alguien sigue WebClient y Zinc como para que tire opinión ?

Por ahora necesito mas que eso y algunos ya saben que mis trabajos en
progreso son con Kom + HV2 + external .js

Meterme con Celeste (va informe aparte) fue por necesidad.
Anduvo linda la minicharlita con el ruso ?
No sean timidos, a ver si la próxima nos enganchamos con alguien mas

------ Forwarded Message

> From: Sven Van Caekenberghe <[hidden email]>
> Reply-To: <[hidden email]>
> Date: Fri, 9 Dec 2011 16:58:45 +0100
> To: Pharo List <[hidden email]>
> Subject: [Pharo-project] Command Line AWS S3 Upload/Download Tool using Pharo
> Smalltalk
>
> Command Line AWS S3 Upload/Download Tool using Pharo Smalltalk
>
> This is a little story about a tool that I needed and that I finally
> implemented in Pharo Smalltalk. I think it is quite nice and elegant and might
> be useful to others too. Also, I think it is important to share little hacks
> like this to show that what you can do is almost unlimited (as many others
> have shown in all kinds of projects).
>
> This is a bit long, so if you're not interested, please ignore.
>
> Amazon S3 is a web service interface to store and retrieve any data from
> anywhere that is highly scalable, reliable, secure, fast, inexpensive. [
> http://aws.amazon.com/s3/ ] [ http://en.wikipedia.org/wiki/Amazon_S3 ]
>
> I needed a client to interface with S3 from Linux to store and retrieve
> archives and backups up to 100s of Mb large. Although I had already written a
> client for this web service in Pharo some time ago, I thought it would not be
> good enough for these amounts of data. Furthermore, it had no command line
> interface. So I Googled and found s3cmd. This installed easily and quickly in
> Ubuntu. Uploading/downloading some small test files went OK. However,
> uploading large files gave all kinds of strange errors, even though I was
> doing this from EC2 directly on the Amazon network. I don't know Python so I
> was not capable of debugging the tool.
>
> But I do know Smalltalk and had the basic code already. [ Zinc-AWS in
> http://www.squeaksource.com/ZincHTTPComponents ]
>
> What was missing was a solution to do streaming uploads and downloads so that
> these huge files would not be taken into memory all at once and a command line
> interface. Turns out both were quite easy and elegant to implement.
>
> I added the following methods to ZnAWSS3Client:
>
> downloadFile: filename fromBucket: bucket
> "Do a streaming download of the key filename from bucket,
> creating it as a file with that name in the current directory."
>
> | streaming response |
> streaming := self httpClient streaming.
> self httpClient streaming: true.
> response := self at: bucket -> filename.
> self httpClient streaming: streaming.
> response isSuccess ifFalse: [ ^ ZnHttpUnsuccessful signal ].
> FileStream
> fileNamed: filename
> do: [ :stream | response entity writeOn: stream ].
> ^ response
>
> The #streaming option of the underlying ZnClient is toggled on for this
> request and reset later to its previous value after the request. The #at: does
> the actual request, returning a ZnStreamingEntity that is then written to a
> file. When a streaming entity writes itself to another stream it will actually
> do a streaming copy (one buffer at a time in a loop) for an efficient
> download.
>
> uploadFile: filename withMd5: md5 inBucket: bucket
> "Do a streaming upload of the file filename to bucket.
> When md5 is notNil, use it to validate the ETag of the response."
>
> | entry size mimeType fileStream entity response |
> entry := FileDirectory root directoryEntryFor: filename.
> size := entry fileSize.
> mimeType := ZnMimeType forFilenameExtension: (FileDirectory extensionFor:
> filename).
> fileStream := FileDirectory root readOnlyFileNamed: filename.
> mimeType isBinary ifTrue: [ fileStream binary ].
> (entity := ZnStreamingEntity type: mimeType length: size)
> stream: fileStream.
> self at: bucket -> entry name put: entity.
> (md5 notNil and: [ (md5 sameAs: self eTag) not ])
> ifTrue: [ self error: 'Uploaded ETag does not equal supplied MD5' ].
> ^ self httpClient response
>
> Here the streaming entity is created based on an existing file, the mime type
> coming from the extension. Then, #at:put: is used to do the upload. Again,
> when the streaming entity writes itself to the socket stream it will actually
> do a streaming copy (one buffer at a time in a loop), for an efficient upload.
>
> Amazon S3 delivers MD5 hashes (ETags) that can be used to check the integrity
> of uploads/downloads. ZnAWSS3Client uses these when its #checkIntegrity option
> is true using MD5>>#hashMessage:, though not using the streaming option of
> HashFunction. Since it would be a lot of work to make that possible, I opted
> for externally supplied MD5 hashes using Linux's md5sum utility.
>
> Next, I took a clean Pharo 1.3 image and the standard Pharo built CogVM and
> loaded the following to create a server image:
>
> Gofer new
>  squeaksource: 'XMLSupport';
>  package: 'ConfigurationOfXMLSupport';
>  load.
> (Smalltalk at: #ConfigurationOfXMLSupport) perform: #loadDefault.
>
> Gofer new
>  squeaksource: 'ZincHTTPComponents';
>  package: 'Zinc-HTTP';
>  package: 'Zinc-AWS';
>  load.
>
> Gofer new
>  squeaksource: 'ADayAtTheBeach';
>  package: 'NonInteractiveTranscript';
>  load.
>
> The glue code for each tool consists of a Linux shell script and a Smalltalk
> startup script. This is a tool for personal use, error handling could be a bit
> better regarding wrong invocations.
>
> #!/bin/bash
> echo S3 Download $*
> script_home=$(dirname $0)
> script_home=$(cd $script_home && pwd)
> image=$script_home/pharo-t3.image
> script=$script_home/s3-download.st
> bucket=$1
> file=$2
> vm=$script_home/bin/CogVM
> options="-vm-display-null -vm-sound-null"
> echo $vm $options $image $script $bucket $file
> $vm $options $image $script $bucket $file
>
> NonInteractiveTranscript stdout install.
> [
>
> | args bucket filename |
> args := Smalltalk commandLine arguments.
> bucket := args first.
> filename := args second.
>
> (ZnAWSS3Client new)
>  accessKeyId: 'AAAAXXYYZZ5HGQZ77EQ';
>  secretAccessKey: 'AAAA+D9n7gabcdefghSfevY/mH6KWsvMAcsjzzzz';
>  checkIntegrity: false;
>  downloadFile: filename fromBucket: bucket;
>  close.
>
> Transcript show: 'OK'; cr; endEntry.
>
> ] on: Error do: [ :exception |
>
> Smalltalk logError: exception description inContext: exception
> signalerContext.
> Transcript show: 'FAILED'; cr; endEntry.
>
> ].
> SmalltalkImage current quitPrimitive.
>
> #!/bin/bash
> echo S3 Upload $*
> script_home=$(dirname $0)
> script_home=$(cd $script_home && pwd)
> image=$script_home/pharo-t3.image
> script=$script_home/s3-upload.st
> bucket=$1
> file=$2
> file_dir=$(dirname $file)
> file_name=$(basename $file)
> file=$(cd $file_dir && pwd)/$file_name
> vm=$script_home/bin/CogVM
> options="-vm-display-null -vm-sound-null"
> compute_md5="md5sum $file"
> md5=`$compute_md5`
> echo $vm $options $image $script $bucket $file $md5
> $vm $options $image $script $bucket $file $md5
>
> NonInteractiveTranscript stdout install.
> [
>
> | args bucket filename md5 |
> args := Smalltalk commandLine arguments.
> bucket := args first.
> filename := args second.
> md5 := args third.
>
> (ZnAWSS3Client new)
>  accessKeyId: 'AAAAXXYYZZ5HGQZ77EQ';
>  secretAccessKey: 'AAAA+D9n7gabcdefghSfevY/mH6KWsvMAcsjzzzz';
>  checkIntegrity: false;
>  uploadFile: filename withMd5: md5 inBucket: bucket;
>  close.
>
> Transcript show: 'OK'; cr; endEntry.
>
> ] on: Error do: [ :exception |
>
> Smalltalk logError: exception description inContext: exception
> signalerContext.
> Transcript show: 'FAILED'; cr; endEntry.
>
> ]
> SmalltalkImage current quitPrimitive.
>
> Both tools are very similar: the shell scripts uses the VM to start the right
> image after massaging some of the arguments.
> The Smalltalk script retrieves arguments, instanciates and invokes the tool to
> do its job. NonInteractiveTranscript is used with the #stdout option to write
> OK or FAILED. In the case of failure a PharoDebug.log is written.
> #quitPrimitive is used for a fast exit (not marking the changes file). Since
> then I learned from Igor that #quitPrimitive accepts an exit value so it would
> be possible to do away with the OK/FAILED writing to stdout and just rely on
> the exit value for an even better integration with *nix.
>
> Uploading/downloading files of 100s of Mb went flawless and was more than fast
> enough (network IO bound anyway). Repeatably starting/stopping a VM with a
> 20Mb image is totally acceptable and fast as well.
>
> A big thanks to everybody who is working on all the little details all the
> time to make things like this possible !
>
> Sven
>
>

------ End of Forwarded Message


Reply | Threaded
Open this post in threaded view
|

Re: FW: [Pharo-project] Command Line AWS S3 Upload/Download Tool using Pharo Smalltalk

garduino
Muy bueno este post, este Sven la tiene clara con la web, realmente.

No se compararlos a Zinc con WebClient, pero a primera vista la ventaja de
Zinc es que viene default en la imagen 1.3 de Pharo y parece que está
activamente mantenido.

Aunque WebClient anda muy bien también.

Yo tendría que adaptar XMLRPC para que use Zinc, como ves no sos el único
que tiene una lista interminable..... :)

Lo que mas me gusta de Rusia es el frio...........como odio las
temperaturas superiores a 22 grados!!!!!

Miro el pronóstico de los días que vienen y me amargo...Edgar, vamos a
encarar una mudanza en masa de Smalltalkers anticalor a algún lado más
piola?


2011/12/9 Edgar J. De Cleene <[hidden email]>

> **
>
>
> #OtroParaLaListaInterminable
> Como ven sigo atentamente lo que pasa en Pharo
> Alguien sigue WebClient y Zinc como para que tire opinión ?
>
> Por ahora necesito mas que eso y algunos ya saben que mis trabajos en
> progreso son con Kom + HV2 + external .js
>
> Meterme con Celeste (va informe aparte) fue por necesidad.
> Anduvo linda la minicharlita con el ruso ?
> No sean timidos, a ver si la próxima nos enganchamos con alguien mas
>
> ------ Forwarded Message
> > From: Sven Van Caekenberghe <[hidden email]>
> > Reply-To: <[hidden email]>
> > Date: Fri, 9 Dec 2011 16:58:45 +0100
> > To: Pharo List <[hidden email]>
> > Subject: [Pharo-project] Command Line AWS S3 Upload/Download Tool using
> Pharo
>
> > Smalltalk
> >
> > Command Line AWS S3 Upload/Download Tool using Pharo Smalltalk
> >
> > This is a little story about a tool that I needed and that I finally
> > implemented in Pharo Smalltalk. I think it is quite nice and elegant and
> might
> > be useful to others too. Also, I think it is important to share little
> hacks
> > like this to show that what you can do is almost unlimited (as many
> others
> > have shown in all kinds of projects).
> >
> > This is a bit long, so if you're not interested, please ignore.
> >
> > Amazon S3 is a web service interface to store and retrieve any data from
> > anywhere that is highly scalable, reliable, secure, fast, inexpensive. [
> > http://aws.amazon.com/s3/ ] [ http://en.wikipedia.org/wiki/Amazon_S3 ]
> >
> > I needed a client to interface with S3 from Linux to store and retrieve
> > archives and backups up to 100s of Mb large. Although I had already
> written a
> > client for this web service in Pharo some time ago, I thought it would
> not be
> > good enough for these amounts of data. Furthermore, it had no command
> line
> > interface. So I Googled and found s3cmd. This installed easily and
> quickly in
> > Ubuntu. Uploading/downloading some small test files went OK. However,
> > uploading large files gave all kinds of strange errors, even though I was
> > doing this from EC2 directly on the Amazon network. I don't know Python
> so I
> > was not capable of debugging the tool.
> >
> > But I do know Smalltalk and had the basic code already. [ Zinc-AWS in
> > http://www.squeaksource.com/ZincHTTPComponents ]
> >
> > What was missing was a solution to do streaming uploads and downloads so
> that
> > these huge files would not be taken into memory all at once and a
> command line
> > interface. Turns out both were quite easy and elegant to implement.
> >
> > I added the following methods to ZnAWSS3Client:
> >
> > downloadFile: filename fromBucket: bucket
> > "Do a streaming download of the key filename from bucket,
> > creating it as a file with that name in the current directory."
> >
> > | streaming response |
> > streaming := self httpClient streaming.
> > self httpClient streaming: true.
> > response := self at: bucket -> filename.
> > self httpClient streaming: streaming.
> > response isSuccess ifFalse: [ ^ ZnHttpUnsuccessful signal ].
> > FileStream
> > fileNamed: filename
> > do: [ :stream | response entity writeOn: stream ].
> > ^ response
> >
> > The #streaming option of the underlying ZnClient is toggled on for this
> > request and reset later to its previous value after the request. The
> #at: does
> > the actual request, returning a ZnStreamingEntity that is then written
> to a
> > file. When a streaming entity writes itself to another stream it will
> actually
> > do a streaming copy (one buffer at a time in a loop) for an efficient
> > download.
> >
> > uploadFile: filename withMd5: md5 inBucket: bucket
> > "Do a streaming upload of the file filename to bucket.
> > When md5 is notNil, use it to validate the ETag of the response."
> >
> > | entry size mimeType fileStream entity response |
> > entry := FileDirectory root directoryEntryFor: filename.
> > size := entry fileSize.
> > mimeType := ZnMimeType forFilenameExtension: (FileDirectory extensionFor:
> > filename).
> > fileStream := FileDirectory root readOnlyFileNamed: filename.
> > mimeType isBinary ifTrue: [ fileStream binary ].
> > (entity := ZnStreamingEntity type: mimeType length: size)
> > stream: fileStream.
> > self at: bucket -> entry name put: entity.
> > (md5 notNil and: [ (md5 sameAs: self eTag) not ])
> > ifTrue: [ self error: 'Uploaded ETag does not equal supplied MD5' ].
> > ^ self httpClient response
> >
> > Here the streaming entity is created based on an existing file, the mime
> type
> > coming from the extension. Then, #at:put: is used to do the upload.
> Again,
> > when the streaming entity writes itself to the socket stream it will
> actually
> > do a streaming copy (one buffer at a time in a loop), for an efficient
> upload.
> >
> > Amazon S3 delivers MD5 hashes (ETags) that can be used to check the
> integrity
> > of uploads/downloads. ZnAWSS3Client uses these when its #checkIntegrity
> option
> > is true using MD5>>#hashMessage:, though not using the streaming option
> of
> > HashFunction. Since it would be a lot of work to make that possible, I
> opted
> > for externally supplied MD5 hashes using Linux's md5sum utility.
> >
> > Next, I took a clean Pharo 1.3 image and the standard Pharo built CogVM
> and
> > loaded the following to create a server image:
> >
> > Gofer new
> > squeaksource: 'XMLSupport';
> > package: 'ConfigurationOfXMLSupport';
> > load.
> > (Smalltalk at: #ConfigurationOfXMLSupport) perform: #loadDefault.
> >
> > Gofer new
> > squeaksource: 'ZincHTTPComponents';
> > package: 'Zinc-HTTP';
> > package: 'Zinc-AWS';
> > load.
> >
> > Gofer new
> > squeaksource: 'ADayAtTheBeach';
> > package: 'NonInteractiveTranscript';
> > load.
> >
> > The glue code for each tool consists of a Linux shell script and a
> Smalltalk
> > startup script. This is a tool for personal use, error handling could be
> a bit
> > better regarding wrong invocations.
> >
> > #!/bin/bash
> > echo S3 Download $*
> > script_home=$(dirname $0)
> > script_home=$(cd $script_home && pwd)
> > image=$script_home/pharo-t3.image
> > script=$script_home/s3-download.st
> > bucket=$1
> > file=$2
> > vm=$script_home/bin/CogVM
> > options="-vm-display-null -vm-sound-null"
> > echo $vm $options $image $script $bucket $file
> > $vm $options $image $script $bucket $file
> >
> > NonInteractiveTranscript stdout install.
> > [
> >
> > | args bucket filename |
> > args := Smalltalk commandLine arguments.
> > bucket := args first.
> > filename := args second.
> >
> > (ZnAWSS3Client new)
> > accessKeyId: 'AAAAXXYYZZ5HGQZ77EQ';
> > secretAccessKey: 'AAAA+D9n7gabcdefghSfevY/mH6KWsvMAcsjzzzz';
> > checkIntegrity: false;
> > downloadFile: filename fromBucket: bucket;
> > close.
> >
> > Transcript show: 'OK'; cr; endEntry.
> >
> > ] on: Error do: [ :exception |
> >
> > Smalltalk logError: exception description inContext: exception
> > signalerContext.
> > Transcript show: 'FAILED'; cr; endEntry.
> >
> > ].
> > SmalltalkImage current quitPrimitive.
> >
> > #!/bin/bash
> > echo S3 Upload $*
> > script_home=$(dirname $0)
> > script_home=$(cd $script_home && pwd)
> > image=$script_home/pharo-t3.image
> > script=$script_home/s3-upload.st
> > bucket=$1
> > file=$2
> > file_dir=$(dirname $file)
> > file_name=$(basename $file)
> > file=$(cd $file_dir && pwd)/$file_name
> > vm=$script_home/bin/CogVM
> > options="-vm-display-null -vm-sound-null"
> > compute_md5="md5sum $file"
> > md5=`$compute_md5`
> > echo $vm $options $image $script $bucket $file $md5
> > $vm $options $image $script $bucket $file $md5
> >
> > NonInteractiveTranscript stdout install.
> > [
> >
> > | args bucket filename md5 |
> > args := Smalltalk commandLine arguments.
> > bucket := args first.
> > filename := args second.
> > md5 := args third.
> >
> > (ZnAWSS3Client new)
> > accessKeyId: 'AAAAXXYYZZ5HGQZ77EQ';
> > secretAccessKey: 'AAAA+D9n7gabcdefghSfevY/mH6KWsvMAcsjzzzz';
> > checkIntegrity: false;
> > uploadFile: filename withMd5: md5 inBucket: bucket;
> > close.
> >
> > Transcript show: 'OK'; cr; endEntry.
> >
> > ] on: Error do: [ :exception |
> >
> > Smalltalk logError: exception description inContext: exception
> > signalerContext.
> > Transcript show: 'FAILED'; cr; endEntry.
> >
> > ]
> > SmalltalkImage current quitPrimitive.
> >
> > Both tools are very similar: the shell scripts uses the VM to start the
> right
> > image after massaging some of the arguments.
> > The Smalltalk script retrieves arguments, instanciates and invokes the
> tool to
> > do its job. NonInteractiveTranscript is used with the #stdout option to
> write
> > OK or FAILED. In the case of failure a PharoDebug.log is written.
> > #quitPrimitive is used for a fast exit (not marking the changes file).
> Since
> > then I learned from Igor that #quitPrimitive accepts an exit value so it
> would
> > be possible to do away with the OK/FAILED writing to stdout and just
> rely on
> > the exit value for an even better integration with *nix.
> >
> > Uploading/downloading files of 100s of Mb went flawless and was more
> than fast
> > enough (network IO bound anyway). Repeatably starting/stopping a VM with
> a
> > 20Mb image is totally acceptable and fast as well.
> >
> > A big thanks to everybody who is working on all the little details all
> the
> > time to make things like this possible !
> >
> > Sven
> >
> >
>
> ------ End of Forwarded Message
>
>  
>



--
============================================
Germán S. Arduino  <gsa @ arsol.net>   Twitter: garduino
Arduino Software  http://www.arduinosoftware.com
PasswordsPro  http://www.passwordspro.com
Promoter http://www.arsol.biz
============================================
Reply | Threaded
Open this post in threaded view
|

Re: FW: [Pharo-project] Command Line AWS S3 Upload/Download Tool using Pharo Smalltalk

Gastón Dall' Oglio
Hola gente.
Recontra interesante Zinc. Yo lo vengo siguiendo en la lista de Pharo y es
impresionante como avanza. Sin dudas (y hasta donde entiendo) Zinc es mucho
mas general [1] que WebClient [2].
Otra diferencia clave creo que es que WebClient tiene implementado de
manera estable e integrado https, mientras que Zinc tiene una
implementación de externa (Zodiac [3]) pero es beta aún. Ambos usan el
plugin SqueakSSL que esta sin mantener hace tiempo y tiene algunos
problemas creo que con los certificados [4].
Otra diferencia (y ventaja creo) es que Zinc esta mucho mas diseñado para
ser extendido que WebClient (usa patrones Factory y esas cosas), lo que en
algo tan general como una librería HTTP te permite adaptar algo según tus
necesidades específicas.

[1] Our long term goals are very ambitious: we want to reach the level of
functionality, scope, architectural clarity and maturity of the Apache HTTP
Components library.
http://zn.stfx.eu/zn/
[2] WebClient and WebServer are simple, compact, and easy to use HTTP
client and server implementations for Squeak.
http://www.squeaksource.com/WebClient.html
[3] http://zdc.stfx.eu/
[4] http://forum.world.st/WebClient-SqueakSSL-https-td2301818.html

Un pequeño resumen, sin garantía de veracidad ;)

2011/12/9 Germán Arduino <[hidden email]>

>
>
> Muy bueno este post, este Sven la tiene clara con la web, realmente.
>
> No se compararlos a Zinc con WebClient, pero a primera vista la ventaja de
> Zinc es que viene default en la imagen 1.3 de Pharo y parece que está
> activamente mantenido.
>
> Aunque WebClient anda muy bien también.
>
> Yo tendría que adaptar XMLRPC para que use Zinc, como ves no sos el único
> que tiene una lista interminable..... :)
>
> Lo que mas me gusta de Rusia es el frio...........como odio las
> temperaturas superiores a 22 grados!!!!!
>
> Miro el pronóstico de los días que vienen y me amargo...Edgar, vamos a
> encarar una mudanza en masa de Smalltalkers anticalor a algún lado más
> piola?
>
>
> 2011/12/9 Edgar J. De Cleene <[hidden email]>
>
>
>>
>> #OtroParaLaListaInterminable
>> Como ven sigo atentamente lo que pasa en Pharo
>> Alguien sigue WebClient y Zinc como para que tire opinión ?
>>
>> Por ahora necesito mas que eso y algunos ya saben que mis trabajos en
>> progreso son con Kom + HV2 + external .js
>>
>> Meterme con Celeste (va informe aparte) fue por necesidad.
>> Anduvo linda la minicharlita con el ruso ?
>> No sean timidos, a ver si la próxima nos enganchamos con alguien mas
>>
>> ------ Forwarded Message
>> > From: Sven Van Caekenberghe <[hidden email]>
>> > Reply-To: <[hidden email]>
>> > Date: Fri, 9 Dec 2011 16:58:45 +0100
>> > To: Pharo List <[hidden email]>
>> > Subject: [Pharo-project] Command Line AWS S3 Upload/Download Tool using
>> Pharo
>>
>> > Smalltalk
>> >
>> > Command Line AWS S3 Upload/Download Tool using Pharo Smalltalk
>> >
>> > This is a little story about a tool that I needed and that I finally
>> > implemented in Pharo Smalltalk. I think it is quite nice and elegant
>> and might
>> > be useful to others too. Also, I think it is important to share little
>> hacks
>> > like this to show that what you can do is almost unlimited (as many
>> others
>> > have shown in all kinds of projects).
>> >
>> > This is a bit long, so if you're not interested, please ignore.
>> >
>> > Amazon S3 is a web service interface to store and retrieve any data from
>> > anywhere that is highly scalable, reliable, secure, fast, inexpensive. [
>> > http://aws.amazon.com/s3/ ] [ http://en.wikipedia.org/wiki/Amazon_S3 ]
>> >
>> > I needed a client to interface with S3 from Linux to store and retrieve
>> > archives and backups up to 100s of Mb large. Although I had already
>> written a
>> > client for this web service in Pharo some time ago, I thought it would
>> not be
>> > good enough for these amounts of data. Furthermore, it had no command
>> line
>> > interface. So I Googled and found s3cmd. This installed easily and
>> quickly in
>> > Ubuntu. Uploading/downloading some small test files went OK. However,
>> > uploading large files gave all kinds of strange errors, even though I
>> was
>> > doing this from EC2 directly on the Amazon network. I don't know Python
>> so I
>> > was not capable of debugging the tool.
>> >
>> > But I do know Smalltalk and had the basic code already. [ Zinc-AWS in
>> > http://www.squeaksource.com/ZincHTTPComponents ]
>> >
>> > What was missing was a solution to do streaming uploads and downloads
>> so that
>> > these huge files would not be taken into memory all at once and a
>> command line
>> > interface. Turns out both were quite easy and elegant to implement.
>> >
>> > I added the following methods to ZnAWSS3Client:
>> >
>> > downloadFile: filename fromBucket: bucket
>> > "Do a streaming download of the key filename from bucket,
>> > creating it as a file with that name in the current directory."
>> >
>> > | streaming response |
>> > streaming := self httpClient streaming.
>> > self httpClient streaming: true.
>> > response := self at: bucket -> filename.
>> > self httpClient streaming: streaming.
>> > response isSuccess ifFalse: [ ^ ZnHttpUnsuccessful signal ].
>> > FileStream
>> > fileNamed: filename
>> > do: [ :stream | response entity writeOn: stream ].
>> > ^ response
>> >
>> > The #streaming option of the underlying ZnClient is toggled on for this
>> > request and reset later to its previous value after the request. The
>> #at: does
>> > the actual request, returning a ZnStreamingEntity that is then written
>> to a
>> > file. When a streaming entity writes itself to another stream it will
>> actually
>> > do a streaming copy (one buffer at a time in a loop) for an efficient
>> > download.
>> >
>> > uploadFile: filename withMd5: md5 inBucket: bucket
>> > "Do a streaming upload of the file filename to bucket.
>> > When md5 is notNil, use it to validate the ETag of the response."
>> >
>> > | entry size mimeType fileStream entity response |
>> > entry := FileDirectory root directoryEntryFor: filename.
>> > size := entry fileSize.
>> > mimeType := ZnMimeType forFilenameExtension: (FileDirectory
>> extensionFor:
>> > filename).
>> > fileStream := FileDirectory root readOnlyFileNamed: filename.
>> > mimeType isBinary ifTrue: [ fileStream binary ].
>> > (entity := ZnStreamingEntity type: mimeType length: size)
>> > stream: fileStream.
>> > self at: bucket -> entry name put: entity.
>> > (md5 notNil and: [ (md5 sameAs: self eTag) not ])
>> > ifTrue: [ self error: 'Uploaded ETag does not equal supplied MD5' ].
>> > ^ self httpClient response
>> >
>> > Here the streaming entity is created based on an existing file, the
>> mime type
>> > coming from the extension. Then, #at:put: is used to do the upload.
>> Again,
>> > when the streaming entity writes itself to the socket stream it will
>> actually
>> > do a streaming copy (one buffer at a time in a loop), for an efficient
>> upload.
>> >
>> > Amazon S3 delivers MD5 hashes (ETags) that can be used to check the
>> integrity
>> > of uploads/downloads. ZnAWSS3Client uses these when its #checkIntegrity
>> option
>> > is true using MD5>>#hashMessage:, though not using the streaming option
>> of
>> > HashFunction. Since it would be a lot of work to make that possible, I
>> opted
>> > for externally supplied MD5 hashes using Linux's md5sum utility.
>> >
>> > Next, I took a clean Pharo 1.3 image and the standard Pharo built CogVM
>> and
>> > loaded the following to create a server image:
>> >
>> > Gofer new
>> > squeaksource: 'XMLSupport';
>> > package: 'ConfigurationOfXMLSupport';
>> > load.
>> > (Smalltalk at: #ConfigurationOfXMLSupport) perform: #loadDefault.
>> >
>> > Gofer new
>> > squeaksource: 'ZincHTTPComponents';
>> > package: 'Zinc-HTTP';
>> > package: 'Zinc-AWS';
>> > load.
>> >
>> > Gofer new
>> > squeaksource: 'ADayAtTheBeach';
>> > package: 'NonInteractiveTranscript';
>> > load.
>> >
>> > The glue code for each tool consists of a Linux shell script and a
>> Smalltalk
>> > startup script. This is a tool for personal use, error handling could
>> be a bit
>> > better regarding wrong invocations.
>> >
>> > #!/bin/bash
>> > echo S3 Download $*
>> > script_home=$(dirname $0)
>> > script_home=$(cd $script_home && pwd)
>> > image=$script_home/pharo-t3.image
>> > script=$script_home/s3-download.st
>> > bucket=$1
>> > file=$2
>> > vm=$script_home/bin/CogVM
>> > options="-vm-display-null -vm-sound-null"
>> > echo $vm $options $image $script $bucket $file
>> > $vm $options $image $script $bucket $file
>> >
>> > NonInteractiveTranscript stdout install.
>> > [
>> >
>> > | args bucket filename |
>> > args := Smalltalk commandLine arguments.
>> > bucket := args first.
>> > filename := args second.
>> >
>> > (ZnAWSS3Client new)
>> > accessKeyId: 'AAAAXXYYZZ5HGQZ77EQ';
>> > secretAccessKey: 'AAAA+D9n7gabcdefghSfevY/mH6KWsvMAcsjzzzz';
>> > checkIntegrity: false;
>> > downloadFile: filename fromBucket: bucket;
>> > close.
>> >
>> > Transcript show: 'OK'; cr; endEntry.
>> >
>> > ] on: Error do: [ :exception |
>> >
>> > Smalltalk logError: exception description inContext: exception
>> > signalerContext.
>> > Transcript show: 'FAILED'; cr; endEntry.
>> >
>> > ].
>> > SmalltalkImage current quitPrimitive.
>> >
>> > #!/bin/bash
>> > echo S3 Upload $*
>> > script_home=$(dirname $0)
>> > script_home=$(cd $script_home && pwd)
>> > image=$script_home/pharo-t3.image
>> > script=$script_home/s3-upload.st
>> > bucket=$1
>> > file=$2
>> > file_dir=$(dirname $file)
>> > file_name=$(basename $file)
>> > file=$(cd $file_dir && pwd)/$file_name
>> > vm=$script_home/bin/CogVM
>> > options="-vm-display-null -vm-sound-null"
>> > compute_md5="md5sum $file"
>> > md5=`$compute_md5`
>> > echo $vm $options $image $script $bucket $file $md5
>> > $vm $options $image $script $bucket $file $md5
>> >
>> > NonInteractiveTranscript stdout install.
>> > [
>> >
>> > | args bucket filename md5 |
>> > args := Smalltalk commandLine arguments.
>> > bucket := args first.
>> > filename := args second.
>> > md5 := args third.
>> >
>> > (ZnAWSS3Client new)
>> > accessKeyId: 'AAAAXXYYZZ5HGQZ77EQ';
>> > secretAccessKey: 'AAAA+D9n7gabcdefghSfevY/mH6KWsvMAcsjzzzz';
>> > checkIntegrity: false;
>> > uploadFile: filename withMd5: md5 inBucket: bucket;
>> > close.
>> >
>> > Transcript show: 'OK'; cr; endEntry.
>> >
>> > ] on: Error do: [ :exception |
>> >
>> > Smalltalk logError: exception description inContext: exception
>> > signalerContext.
>> > Transcript show: 'FAILED'; cr; endEntry.
>> >
>> > ]
>> > SmalltalkImage current quitPrimitive.
>> >
>> > Both tools are very similar: the shell scripts uses the VM to start the
>> right
>> > image after massaging some of the arguments.
>> > The Smalltalk script retrieves arguments, instanciates and invokes the
>> tool to
>> > do its job. NonInteractiveTranscript is used with the #stdout option to
>> write
>> > OK or FAILED. In the case of failure a PharoDebug.log is written.
>> > #quitPrimitive is used for a fast exit (not marking the changes file).
>> Since
>> > then I learned from Igor that #quitPrimitive accepts an exit value so
>> it would
>> > be possible to do away with the OK/FAILED writing to stdout and just
>> rely on
>> > the exit value for an even better integration with *nix.
>> >
>> > Uploading/downloading files of 100s of Mb went flawless and was more
>> than fast
>> > enough (network IO bound anyway). Repeatably starting/stopping a VM
>> with a
>> > 20Mb image is totally acceptable and fast as well.
>> >
>> > A big thanks to everybody who is working on all the little details all
>> the
>> > time to make things like this possible !
>> >
>> > Sven
>> >
>> >
>>
>> ------ End of Forwarded Message
>>
>>
>
>
> --
> ============================================
> Germán S. Arduino  <gsa @ arsol.net>   Twitter: garduino
> Arduino Software  http://www.arduinosoftware.com
> PasswordsPro  http://www.passwordspro.com
> Promoter http://www.arsol.biz
> ============================================
>
>  
>
Reply | Threaded
Open this post in threaded view
|

Vuelvo a Celeste (fue Re: [squeakRos] FW: [Pharo-project] Command Line AWS S3 Upload/Download Tool using Pharo Smalltalk)

Edgar De Cleene
> Hola gente.
> Recontra interesante Zinc. Yo lo vengo siguiendo en la lista de Pharo y es
> impresionante como avanza. Sin dudas (y hasta donde entiendo) Zinc es mucho
> mas general [1] que WebClient [2].
> Otra diferencia clave creo que es que WebClient tiene implementado de manera
> estable e integrado https, mientras que Zinc tiene una implementación de
> externa (Zodiac [3]) pero es beta aún. Ambos usan el plugin SqueakSSL que esta
> sin mantener hace tiempo y tiene algunos problemas creo que con los
> certificados [4].
> Otra diferencia (y ventaja creo) es que Zinc esta mucho mas diseñado para ser
> extendido que WebClient (usa patrones Factory y esas cosas), lo que en algo
> tan general como una librería HTTP te permite adaptar algo según tus
> necesidades específicas.
>
> [1] Our long term goals are very ambitious: we want to reach the level of
> functionality, scope, architectural clarity and maturity of the Apache HTTP
> Components library.
> http://zn.stfx.eu/zn/
> [2] WebClient and WebServer are simple, compact, and easy to use HTTP client
> and server implementations for Squeak.
> http://www.squeaksource.com/WebClient.html
> [3] http://zdc.stfx.eu/
> [4] http://forum.world.st/WebClient-SqueakSSL-https-td2301818.html
>
> Un pequeño resumen, sin garantía de veracidad ;)


Buenisimo.
Tengo como dije, Celeste andando para yahoo con un problema de dibujo.
Me tome el trabajo de cargar el ultimo de Lex Spoon en el viejo FunSqueak
que lleve al primer Smalltalks y funciono.
No contento con eso, recorde que tengo ,a mi criterio, el mejor compromiso
tamaño de imagen / funcionalidad.
Eso se llama MinimalMorphic, lo empezo Pavel alla en los tiempos de Ralph y
el 3.10, cuando la comunidad era una y no habia como ahora un Pharo que los
guie (hacia las rocas donde se estrellaran ).

MCHttpRepository
    location: 'http://squeaksource.com/Ladrillos'
    user: 'squeak'
    password: 'squeak'

Ahi,  mi ultima versión , gracias Gaston (me salio un versito)

 Network-Mail Reader-edc.25


O sea que el problema son los closures, ya que la clase que dibuja es
MulticolumnLazyListMorph y la mayoria de los métodos son de Ned Kontz (2004)

Alguien se podrá apiadar de mi y explicarme para bolus que , como, para que,
cuando son los Closures ?

Este es el método que falla en Squeak4.3gamma-11793

display: items atRow: row on: canvas
    "display the specified item, which is on the specified row; for
Multicolumn
    lists, items will be a list of strings"
    | drawBounds |
    drawBounds := self drawBoundsForRow: row.
    drawBounds := drawBounds intersect: self bounds.
    items
        with: (1 to: items size)
        do: [:item :index |
            "move the bounds to the right at each step"
            index > 1
                ifTrue: [drawBounds := drawBounds left: drawBounds left + 6
                                    + (columnWidths at: index - 1)].
            item isText
                ifTrue: [canvas
                        drawString: item
                        in: drawBounds
                        font: (font
                                emphasized: (item emphasisAt: 1))
                        color: (self colorForRow: row)]
                ifFalse: [canvas
                        drawString: item
                        in: drawBounds
                        font: font
                        color: (self colorForRow: row)]]

Y este es el debug.log

Error: Error: Instances of Character are not indexable
10 December 2011 6:22:46.583 am

VM: Mac OS - Smalltalk
Image: Squeak4.2 [latest update: #11793]

SecurityManager state:
Restricted: false
FileAccess: true
SocketAccess: true
Working Dir /Users/edgar/AtlantisSqueak/imagesZip/Squeak4.3gamma-11793
Folder
Trusted Dir /foobar/tooBar/forSqueak/bogus/
Untrusted Dir /foobar/tooBar/forSqueak/bogus/

Character(Object)>>error:
    Receiver: $#
    Arguments and temporary variables:
        aString:     'Error: Instances of Character are not indexable'
    Receiver's instance variables:
        value:     35

[] in WorldState>>displayWorldSafely:
    Receiver: a WorldState
    Arguments and temporary variables:
<<error during printing>
    Receiver's instance variables:
        hands:     {a HandMorph(3216)}
        activeHand:     a HandMorph(3216)
        viewBox:     0@0 corner: 1880@1156
        canvas:     a FormCanvas on: DisplayScreen(1880x1156x32)
        damageRecorder:     a DamageRecorder
        stepList:     a Heap(StepMessage(#stepAt: -> a
PluggableSystemWindow(92))(a Pluggab...etc...
        lastStepTime:     1737696
        lastStepMessage:     nil
        lastCycleTime:     1737717
        commandHistory:     a CommandHistory
        alarms:     a MorphicAlarmQueue()
        lastAlarmTime:     1737696
        remoteServer:     nil
        multiCanvas:     nil

BlockClosure>>cull:cull:
    Receiver: [closure] in WorldState>>displayWorldSafely:
    Arguments and temporary variables:
        firstArg:     'Error: Instances of Character are not indexable'
        secondArg:     $#
    Receiver's instance variables:
        outerContext:     WorldState>>displayWorldSafely:
        startpc:     81
        numArgs:     2

[] in BlockClosure>>ifError:
    Receiver: [closure] in WorldState>>displayWorldSafely:
    Arguments and temporary variables:
        errorHandlerBlock:     Error: Instances of Character are not
indexable
        ex:     [closure] in WorldState>>displayWorldSafely:
    Receiver's instance variables:
        outerContext:     WorldState>>displayWorldSafely:
        startpc:     74
        numArgs:     0

BlockClosure>>cull:
    Receiver: [closure] in BlockClosure>>ifError:
    Arguments and temporary variables:
        firstArg:     Error: Instances of Character are not indexable
    Receiver's instance variables:
        outerContext:     BlockClosure>>ifError:
        startpc:     40
        numArgs:     1

[] in MethodContext(ContextPart)>>handleSignal:
    Receiver: BlockClosure>>on:do:
    Arguments and temporary variables:
<<error during printing>
    Receiver's instance variables:
        sender:     BlockClosure>>ifError:
        pc:     17
        stackp:     3
        method:     (BlockClosure>>#on:do: "a CompiledMethod(2372)")
        closureOrNil:     nil
        receiver:     [closure] in WorldState>>displayWorldSafely:

BlockClosure>>ensure:
    Receiver: [closure] in MethodContext(ContextPart)>>handleSignal:
    Arguments and temporary variables:
        aBlock:     [closure] in MethodContext(ContextPart)>>handleSignal:
        complete:     nil
        returnValue:     nil
    Receiver's instance variables:
        outerContext:     MethodContext(ContextPart)>>handleSignal:
        startpc:     90
        numArgs:     0

MethodContext(ContextPart)>>handleSignal:
    Receiver: BlockClosure>>on:do:
    Arguments and temporary variables:
        exception:     Error: Instances of Character are not indexable
        val:     nil
    Receiver's instance variables:
        sender:     BlockClosure>>ifError:
        pc:     17
        stackp:     3
        method:     (BlockClosure>>#on:do: "a CompiledMethod(2372)")
        closureOrNil:     nil
        receiver:     [closure] in WorldState>>displayWorldSafely:

Error(Exception)>>signal
    Receiver: Error: Instances of Character are not indexable
    Arguments and temporary variables:

    Receiver's instance variables:
        messageText:     'Instances of Character are not indexable'
        tag:     nil
        signalContext:     Error(Exception)>>signal
        handlerContext:     BlockClosure>>on:do:
        outerContext:     nil

Error(Exception)>>signal:
    Receiver: Error: Instances of Character are not indexable
    Arguments and temporary variables:
        signalerText:     'Instances of Character are not indexable'
    Receiver's instance variables:
        messageText:     'Instances of Character are not indexable'
        tag:     nil
        signalContext:     Error(Exception)>>signal
        handlerContext:     BlockClosure>>on:do:
        outerContext:     nil

Character(Object)>>error:
    Receiver: $#
    Arguments and temporary variables:
        aString:     'Instances of Character are not indexable'
    Receiver's instance variables:
        value:     35

Character(Object)>>errorNotIndexable
    Receiver: $#
    Arguments and temporary variables:

    Receiver's instance variables:
        value:     35

Character(Object)>>size
    Receiver: $#
    Arguments and temporary variables:

    Receiver's instance variables:
        value:     35

FormCanvas(Canvas)>>drawString:in:font:color:
    Receiver: a FormCanvas on: DisplayScreen(1880x1156x32)
    Arguments and temporary variables:
        s:     $#
        boundsRect:     0@0 corner: 490@14
        fontOrNil:     a StrikeFont(Bitmap DejaVu Sans 9 14)
        c:     Color black
    Receiver's instance variables:
        target:     nil
        filterSelector:     nil
        origin:     300@60
        clipRect:     297@60 corner: 752@152
        form:     DisplayScreen(1880x1156x32)
        port:     a GrafPort
        shadowColor:     nil

[] in MulticolumnLazyListMorph>>display:atRow:on:
    Receiver: a MulticolumnLazyListMorph(307)
    Arguments and temporary variables:
<<error during printing>
    Receiver's instance variables:
        bounds:     0@0 corner: 490@336
        owner:     a TransformMorph(3376)
        submorphs:     #()
        fullBounds:     0@0 corner: 490@336
        color:     Color black
        extension:     a MorphExtension (1476) [other:  (errorOnDraw ->
true)]
        listItems:     #(#('1' ' ' '12/6/11' 'LinkedIn' '16,728' 'Edgar, 3
people looked at...etc...
        font:     a StrikeFont(Bitmap DejaVu Sans 9 14)
        selectedRow:     1
        selectedRows:     a PluggableSet()
        listSource:     a PluggableMultiColumnListMorph(3227)
        maxWidth:     nil
        columnWidths:     #(8 4 48 126 42 618)

ByteString(SequenceableCollection)>>with:do:
    Receiver: '#(''1'' '' '' ''12/6/11'' ''LinkedIn'' ''16,728'' ''Edgar, 3
people looked at your profil...etc...
    Arguments and temporary variables:
        otherCollection:     (1 to: 81)
        twoArgBlock:     [closure] in
MulticolumnLazyListMorph>>display:atRow:on:
        index:     1
        indexLimiT:     81
    Receiver's instance variables:
'#(''1'' '' '' ''12/6/11'' ''LinkedIn'' ''16,728'' ''Edgar, 3 people looked
at your profil...etc...
MulticolumnLazyListMorph>>display:atRow:on:
    Receiver: a MulticolumnLazyListMorph(307)
    Arguments and temporary variables:
<<error during printing>
    Receiver's instance variables:
        bounds:     0@0 corner: 490@336
        owner:     a TransformMorph(3376)
        submorphs:     #()
        fullBounds:     0@0 corner: 490@336
        color:     Color black
        extension:     a MorphExtension (1476) [other:  (errorOnDraw ->
true)]
        listItems:     #(#('1' ' ' '12/6/11' 'LinkedIn' '16,728' 'Edgar, 3
people looked at...etc...
        font:     a StrikeFont(Bitmap DejaVu Sans 9 14)
        selectedRow:     1
        selectedRows:     a PluggableSet()
        listSource:     a PluggableMultiColumnListMorph(3227)
        maxWidth:     nil
        columnWidths:     #(8 4 48 126 42 618)



Teorizo que espera una String y lo que recibe son Character,
Evidentemente, se pudre todo

Edgar




Reply | Threaded
Open this post in threaded view
|

Vuelvo a Celeste , avance

Edgar De Cleene
In reply to this post by Gastón Dall' Oglio
Y dome a Celeste nomas.
Con mas traste que cabeza, como suele suceder.
La repuesta obvia es siempre la ultima que se nos ocurre.
Si hay una clase que tenia sentido en el 2004, capaz que hoy o.
Eso es todo, grabo


Reply | Threaded
Open this post in threaded view
|

Re: Vuelvo a Celeste (fue Re: [squeakRos] FW: [Pharo-project] Command Line AWS S3 Upload/Download Tool using Pharo Smalltalk)

garduino
In reply to this post by Edgar De Cleene
2011/12/10 Edgar J. De Cleene <[hidden email]>

> **
>
>
> Eso se llama MinimalMorphic, lo empezo Pavel alla en los tiempos de Ralph y
> el 3.10, cuando la comunidad era una y no habia como ahora un Pharo que los
> guie (hacia las rocas donde se estrellaran ).
>
>
Me parece que no se van a estrellar, quizás no vayan para donde a cada uno
le gustaría, pero creo que van muy muy bien, con mucho viento en las velas.

En cambio (y no me alegra para nada) creo que el estancamiento de Squeak se
va profundizando día a día......salvo por el laburo monstruoso de Chris
Muller......

<modo critica on>
Hace un tiempo que pienso que por más esfuerzos que haya en squeak, pharo o
el Smalltalk que sea, evidentemente falta mucho, pero mucho, para estar al
nivel de un lenguaje (perdón los puristas) capaz de usarse en producción
para cosas para millones de usuarios, tipo SaaS.

Antes teníamos un par de naves insignia, DabbleDB y Auctomatic, las cuales
hoy ya son historia y podemos tener las mejores intenciones y creer que el
mejor mundo de herramientas, pero si no somos capaces de tener cosas grosas
en producción, simplemente no estamos a la altura de los demás. Por
supuesto no ignoro el trabajo increible de Sebastián en Airflowing y varios
otros proyectos, pero estamos muy lejos de tener "masa crítica".

Miles de startups arrancan todo el tiempo, con cada vez mayores volúmenes
de datos, millones de usuarios e ideas novedosas y no estamos siendo
capaces que consideren usar Smalltalk.

¿Qué les parece? ¿Por qué será? Usan Python, Ruby, versiones mejoradas de
PHP, guardan datos en MySQL o bases NoSQL, pero no usan Smalltalk.

Como el tema me preocupa y para saber cuáles son las ventajas del resto del
mundo me anoté en un curso online que hacen desde Stanford:
http://www.saas-class.org/, que empieza en Febrero. Vamos a ver si tengo
respuestas ahí.
</fin modo critica>
Reply | Threaded
Open this post in threaded view
|

Re: Vuelvo a Celeste (fue Re: [squeakRos] FW: [Pharo-project] Command Line AWS S3 Upload/Download Tool using Pharo Smalltalk)

Edgar De Cleene
Y cada uno tiene su opinion, para eso esto es un bar.
Pero creo que hay que tener claro los objetivos.
Si lo que uno quiere es ganar plata, mejor se pone un puesto de choripan a
la salida de la cancha.
Si los numeros mandan, entonces Smalltalk en cualquiera de sus variantes no
tiene sentido.
No salgamos nunca del mundo Windoze (no compraste una Mac bastante cara ?)
Como ya dije muchas veces, aca en la zona contratan a los alumnos que apenas
saben tipear y les pagan para hacer Cobol, DB, PL/1.
Yo pongo mi granito de arena, en este caso resucitando Celeste.
Si se van todos a Pharo, no interesa.
Hay gente grosa que esta y hay gente de Pharo que ya se empezo a dar cuenta
que tambien es un engendro (Lukas el principal)
A los que les interesa que su trabajo sea conocido, lo hacen para los dos
forks.
Lamento por Juan que nadie le de mucha bola a Cuis, pero se encerro solo en
su mundo.
A mi no me da el cuero para seguir tres forks y que cada vez que tengo que
hacer algo chiquito tenga que aprender todo de nuevo.
La razon de estar en Squeak es la compatibilidad.
Si solo te interesa el web, bárbaro, usa Pharo.
No sea que a medida que ³avance² te des cuenta que tambien tenes que re
pensar todo otra vez

Edgar




Reply | Threaded
Open this post in threaded view
|

Re: Vuelvo a Celeste (fue Re: [squeakRos] FW: [Pharo-project] Command Line AWS S3 Upload/Download Tool using Pharo Smalltalk)

garduino
mmm, quizás yo no me explico bien, en mi caso me gusta Smalltalk pero
también tengo que vivir.

Si tengo una idea piola para programar, debería hacerla mejor y más rápido
con Smalltalk y al mundo de afuera poco le interesa con qué está hecha, el
mundo compra soluciones.....usa cosas que le gustan pero ni les importa con
qué está hecha.

Digo si somos tan buenos, y creo que si, que Smalltalk es diferencial,
porque el resto de los techies del mundo no lo consideran asi (Y hablo más
que nada del entorno de las startups o grandes compañías de Internet. Si
producir en Smalltalk te permite como mínimo el doble de productividad que
en un lenguaje convencional, porque los grandes no ven eso...? POrque no
aprovechan esa ventaja que les permitiría mucho menores costos?

Ojo, son sólo pensamientos.....no estoy criticando nada :)


El 10 de diciembre de 2011 08:04, Edgar J. De Cleene <[hidden email]
> escribió:

> **
>
>
> Y cada uno tiene su opinion, para eso esto es un bar.
> Pero creo que hay que tener claro los objetivos.
> Si lo que uno quiere es ganar plata, mejor se pone un puesto de choripan a
> la salida de la cancha.
> Si los numeros mandan, entonces Smalltalk en cualquiera de sus variantes
> no tiene sentido.
> No salgamos nunca del mundo Windoze (no compraste una Mac bastante cara ?)
> Como ya dije muchas veces, aca en la zona contratan a los alumnos que
> apenas saben tipear y les pagan para hacer Cobol, DB, PL/1.
> Yo pongo mi granito de arena, en este caso resucitando Celeste.
> Si se van todos a Pharo, no interesa.
> Hay gente grosa que esta y hay gente de Pharo que ya se empezo a dar
> cuenta que tambien es un engendro (Lukas el principal)
> A los que les interesa que su trabajo sea conocido, lo hacen para los dos
> forks.
> Lamento por Juan que nadie le de mucha bola a Cuis, pero se encerro solo
> en su mundo.
> A mi no me da el cuero para seguir tres forks y que cada vez que tengo que
> hacer algo chiquito tenga que aprender todo de nuevo.
> La razon de estar en Squeak es la compatibilidad.
> Si solo te interesa el web, bárbaro, usa Pharo.
> No sea que a medida que “avance” te des cuenta que tambien tenes que re
> pensar todo otra vez
>
> Edgar
>
>
>
>  
>



--
============================================
Germán S. Arduino  <gsa @ arsol.net>   Twitter: garduino
Arduino Software  http://www.arduinosoftware.com
PasswordsPro  http://www.passwordspro.com
Promoter http://www.arsol.biz
============================================
Reply | Threaded
Open this post in threaded view
|

Re: Vuelvo a Celeste (fue Re: [squeakRos] FW: [Pharo-project] Command Line AWS S3 Upload/Download Tool using Pharo Smalltalk)

Edgar De Cleene
> Digo si somos tan buenos, y creo que si, que Smalltalk es diferencial, porque
> el resto de los techies del mundo no lo consideran asi (Y hablo más que nada
> del entorno de las startups o grandes compañías de Internet. Si producir en
> Smalltalk te permite como mínimo el doble de productividad que en un lenguaje
> convencional, porque los grandes no ven eso...? POrque no aprovechan esa
> ventaja que les permitiría mucho menores costos?

No se si somos tan buenos y repito, que nos importa si "las grandes
compañias " , lo usen o no?.

Si estamos convencidos que es mejor...

Lo que me parece es que Smalltalk no es para todos.
Apple se tomo el trabajo de re hacer Unix con Objective C, creo que por esto
y para estar de algun modo a mitad de camino.
Y poder reusar codigo.
Otra vez la compatibilidad hacia atras





Reply | Threaded
Open this post in threaded view
|

Re: Vuelvo a Celeste (fue Re: [squeakRos] FW: [Pharo-project] Command Line AWS S3 Upload/Download Tool using Pharo Smalltalk)

garduino
El 10 de diciembre de 2011 08:43, Edgar J. De Cleene <[hidden email]
> escribió:

> **
>
>
> > Digo si somos tan buenos, y creo que si, que Smalltalk es diferencial,
> porque
> > el resto de los techies del mundo no lo consideran asi (Y hablo más que
> nada
> > del entorno de las startups o grandes compañías de Internet. Si producir
> en
> > Smalltalk te permite como mínimo el doble de productividad que en un
> lenguaje
> > convencional, porque los grandes no ven eso...? POrque no aprovechan esa
> > ventaja que les permitiría mucho menores costos?
>
> No se si somos tan buenos y repito, que nos importa si "las grandes
> compañias " , lo usen o no?.
>
>
Importa porque si hay más gente usando, hay más soluciones andando. Fijate
sino, para que me sirve hacer una solución el doble de rápido en Seaside,
si luego el hosting no existe?

Y ojo, no te hablo de supuestos, hablo de proyectos que pierdo, porque el
hosting seaside es CARO comparado con cualquier otra cosa.


> Si estamos convencidos que es mejor...
>
> Lo que me parece es que Smalltalk no es para todos.
> Apple se tomo el trabajo de re hacer Unix con Objective C, creo que por
> esto
> y para estar de algun modo a mitad de camino.
> Y poder reusar codigo.
> Otra vez la compatibilidad hacia atras
>
>  
>
Reply | Threaded
Open this post in threaded view
|

Re: Vuelvo a Celeste (fue Re: [squeakRos] FW: [Pharo-project] Command Line AWS S3 Upload/Download Tool using Pharo Smalltalk)

Giuseppe
El 10/12/2011 13:50, Germán Arduino escribió:

>
>
>
> El 10 de diciembre de 2011 08:43, Edgar J. De Cleene
> <[hidden email] <mailto:[hidden email]>> escribió:
>
>     > Digo si somos tan buenos, y creo que si, que Smalltalk es
>     diferencial, porque
>     > el resto de los techies del mundo no lo consideran asi (Y hablo
>     más que nada
>     > del entorno de las startups o grandes compañías de Internet. Si
>     producir en
>     > Smalltalk te permite como mínimo el doble de productividad que
>     en un lenguaje
>     > convencional, porque los grandes no ven eso...? POrque no
>     aprovechan esa
>     > ventaja que les permitiría mucho menores costos?
>
>     No se si somos tan buenos y repito, que nos importa si "las grandes
>     compañias " , lo usen o no?.
>

Pero debería importar. Java, tendrá todas las cosas malas que queráis,
pero a día de hoy, es el lenguaje de programación más usado y extendido
en el mundo empresarial. Sabemos que no es por méritos propios, pero ahí
está. Smalltalk, se conoce poco, se conoce como algo de hace 30 años
(como si nombras Cobol o Fortran),  y que siempre tuvo un precio
prohibitivo, y a día de hoy, ninguna opción opensource es viable.
Además, Java se estudia en la universidad. Smalltalk al parecer se
estudia en Argentina, pero por ejemplo, en España, creo que Smalltalk,
como mucho, se nombra en historia de programación y ya está, lo demás,
es C/C++ y Java prácticamente (creo que en Cataluña si hay un
catedrático que dá Smalltalk, pero es una excpeción, y aparte, viven en
su mundo y en su idioma como si de otro pais se tratara). Ésto, también
repercute como dices en los costos. Para encontrar un programador
experimentado en Smalltalk, has de buscar mucho, y pagarle lo que pida,
mientras un becario en Java cobrando una miseria, sale de debajo de las
piedras.

Algunos me conocéis y sabéis que llevo tras Squeak varios años, y nunca
me puse en serio más allá de probar cosas y hacer un seguimiento del
proyecto, pero, sobre todo, porque en mi opinión, por mucho que duela
decirlo, por muy productivo que pueda ser Smalltalk, del lado
OpenSource, no está preparado para el mundo empresarial (y yo no tuve
tiempo de dedicarle, mi parte de culpa también tengo). Obviamente, VA
Smalltalk (que lo veo carísimo) o VisualWorks o Dolphin (que sólo va en
Windows), si serán entornos para producción y demostrado está (creo),
pero las implementaciones opensource no. Pharo parece que quiso cambiar
algo ésto, y para hacer alguna cosa en el mundo web puede servir, pero
para aplicaciones empresariales y aburridas (mercado que aún muchos
clientes es el que desean), a día de hoy Smalltalk está muy verde (y lo
seguirá estando), ya que, si no me equivoco, el 80% al menos de sus
"usuarios" lo usan para investigación, o como juguete, no para
"trabajar". Además, también hay que tener en cuenta, que muchos
programadores, no quieren, o no están interesados en tocar código de la
VM, o del corazón del entorno, simplemente, quieren heredar y trabajar,
cosa, que por ejemplo, no hace falta en Java, pero es casi obligatorio
en Squeak/Pharo, ya que la instalación de un simple paquete, puede
comenzar a lanzar errores que o sabes como funciona todo por dentro, o
no sabes solucionar, y como no hayas grabado antes de instalar, te deja
la imágen coja con una instalación a medias.

Luego está la fragmentación, hay gente que prefiere Squeak, mientras el
mayor número se movieron a Pharo, porque querían un Squeak un poco más
enfocado a empresas. Ambos, cada vez están más distantes el uno del otro
y es más dificil tener paquetes compatibles (por lo leido), y al final,
ni uno, ni otro.
Al programador empresarial medio, le dá igual si Squeak/Pharo tiene un
cliente IRC integrado, o un framework para músicos, porque eso no vende.

Para el mercado empresarial hace falta acceso a motores de reporting,
BBDD, estabilidad tanto en ejecución, como en diseño etc... Smalltalk
requiere un conocimiento amplio del lenguaje (perdón), y del core del
entorno para poder trabajar con él, para poder diseñarte lo que te
falte, algo que en otros entornos no es tan necesario, programas y ya
está, y muchos pensarán "para qué perder el tiempo, si luego no voy a
poder contratar a nadie". Y al cliente final, le dá igual si tu programa
lo hiciste en uno u otro lenguaje, lo que le importa es que funcione.

Hay mucha gente buena en el mundo Smalltalk, (Germán, Chris Muller,
Edgar, y un montón de nombres que me dejo en el tintero, y espero me
perdonen) y también hay mucha gente fragmentada entre Pharo y Squeak, y
de todos, la inmensa mayoría simplemente está por hobby, o educación,
por lo que todo lo que estamos tratanto, le dá igual, porque al fin y al
cabo, el uso que se le dá es de "juguete", sin uso en el mercado
empresarial. Aún así, el número de gente involucrada en Smalltak, es ínfimo.

A mi, me gustaría retomar Smalltalk. Cuando consiga sacar tiempo,
volveré a ponerme con ello, y me gustaría que llegara el momento de
decidir migrar mi proyecto actual, pero por desgracia, no sé si ese
momento llegará.

La pregunta no sería, "si smalltalk es más productivo, por qué ...", la
pregunta es: "la comunidad smalltalk quiere/puede adaptarse a lo que
pide el mercado comercial?"
Reply | Threaded
Open this post in threaded view
|

Re: Vuelvo a Celeste (fue Re: [squeakRos] FW: [Pharo-project] Command Line AWS S3 Upload/Download Tool using Pharo Smalltalk)

garduino
Hola Giuseppe:

Tus reflexiones son las que hemos tratado muchas veces y por las cuales
hemos pasado en mayor o menor medida la mayoría de los que trabajamos en
Smalltalk.

Comparto en gran medida algunas de las cosas que decís y hago algunas pocas
excepciones, la principal cuando uno trabaja (como yo) no a medida, sino
haciendo productos como el PPro para venta masiva. Ahí creo que es un hueco
donde Dolphin encaja muy bien, claro, sabiendo que para Mac o Linux hay que
correr lo que se vende vía un emulador (cosa poco probable que el usuario
"compre"). Igual, la gente de Linux no compra nada, así que no se pierde
mercado ahí. Mac es otro tema.

Ahora estoy pensando en otro producto que tengo como para aggionarlo,
pero....la verdad meterme con Pharo (ya me dijeron en la lista que el
usuario típico de Mac espera look and feel Mac puro) no se si paga el tiro
como decimos acá.

Además, hacer UIs de usuario en Pharo es caro (en tiempo) al igual que en
Squeak (aunque con la herramienta del Hasso se mejora eso) así que tengo
mis dudas.

Yo creo que la ventaja diferencial de Smalltalk es que uno trabaja con
objetos, y eso es el GRAN cambio, uno deja de pensar en datos y programas
separados y eso para mi es lo que no tiene precio ni tiene igual en
tecnologías tradicionales. Eso  y el entorno (la imagen) que permite un
trabajo continuo sin pensar en los ciclos tradicionales de
escribir-compilar-probar.

Pero bueno, también hay otras dificultades para los emprendimientos web y
es el hosting, ya se que se puede contratar servers virtuales, pero hay
ocasiones donde una app web no justifica un server para ella sola (ni la
administración del mismo).

En fin, lo de siempre..... UI, hosting jejejej, siempre con lo
mismo.......cada uno hará su balance, por ejemplo, en mi caso para el
passwordspro, me quedé con Dolphin sin dudas, ahora para otro tipo de
software, habrá que ver cada caso y los objetivos. Para desarrollos
corporativos es otro mundo y no creo que haya màs opciones (en Smalltalk)
que los productos comerciales (VW, VAST, Gemstone).

Saludos!




El 23 de diciembre de 2011 05:35, Giu <[hidden email]> escribió:

> **
>
>
> El 10/12/2011 13:50, Germán Arduino escribió:
>
>
>
>
>
>  El 10 de diciembre de 2011 08:43, Edgar J. De Cleene <
> [hidden email]> escribió:
>
>>
>>  > Digo si somos tan buenos, y creo que si, que Smalltalk es
>> diferencial, porque
>> > el resto de los techies del mundo no lo consideran asi (Y hablo más que
>> nada
>> > del entorno de las startups o grandes compañías de Internet. Si
>> producir en
>> > Smalltalk te permite como mínimo el doble de productividad que en un
>> lenguaje
>> > convencional, porque los grandes no ven eso...? POrque no aprovechan esa
>> > ventaja que les permitiría mucho menores costos?
>>
>>  No se si somos tan buenos y repito, que nos importa si "las grandes
>> compañias " , lo usen o no?.
>>
>>
> Pero debería importar. Java, tendrá todas las cosas malas que queráis,
> pero a día de hoy, es el lenguaje de programación más usado y extendido en
> el mundo empresarial. Sabemos que no es por méritos propios, pero ahí está.
> Smalltalk, se conoce poco, se conoce como algo de hace 30 años (como si
> nombras Cobol o Fortran),  y que siempre tuvo un precio prohibitivo, y a
> día de hoy, ninguna opción opensource es viable. Además, Java se estudia en
> la universidad. Smalltalk al parecer se estudia en Argentina, pero por
> ejemplo, en España, creo que Smalltalk, como mucho, se nombra en historia
> de programación y ya está, lo demás, es C/C++ y Java prácticamente (creo
> que en Cataluña si hay un catedrático que dá Smalltalk, pero es una
> excpeción, y aparte, viven en su mundo y en su idioma como si de otro pais
> se tratara). Ésto, también repercute como dices en los costos. Para
> encontrar un programador experimentado en Smalltalk, has de buscar mucho, y
> pagarle lo que pida, mientras un becario en Java cobrando una miseria, sale
> de debajo de las piedras.
>
> Algunos me conocéis y sabéis que llevo tras Squeak varios años, y nunca me
> puse en serio más allá de probar cosas y hacer un seguimiento del proyecto,
> pero, sobre todo, porque en mi opinión, por mucho que duela decirlo, por
> muy productivo que pueda ser Smalltalk, del lado OpenSource, no está
> preparado para el mundo empresarial (y yo no tuve tiempo de dedicarle, mi
> parte de culpa también tengo). Obviamente, VA Smalltalk (que lo veo
> carísimo) o VisualWorks o Dolphin (que sólo va en Windows), si serán
> entornos para producción y demostrado está (creo), pero las
> implementaciones opensource no. Pharo parece que quiso cambiar algo ésto, y
> para hacer alguna cosa en el mundo web puede servir, pero para aplicaciones
> empresariales y aburridas (mercado que aún muchos clientes es el que
> desean), a día de hoy Smalltalk está muy verde (y lo seguirá estando), ya
> que, si no me equivoco, el 80% al menos de sus "usuarios" lo usan para
> investigación, o como juguete, no para "trabajar". Además, también hay que
> tener en cuenta, que muchos programadores, no quieren, o no están
> interesados en tocar código de la VM, o del corazón del entorno,
> simplemente, quieren heredar y trabajar, cosa, que por ejemplo, no hace
> falta en Java, pero es casi obligatorio en Squeak/Pharo, ya que la
> instalación de un simple paquete, puede comenzar a lanzar errores que o
> sabes como funciona todo por dentro, o no sabes solucionar, y como no hayas
> grabado antes de instalar, te deja la imágen coja con una instalación a
> medias.
>
> Luego está la fragmentación, hay gente que prefiere Squeak, mientras el
> mayor número se movieron a Pharo, porque querían un Squeak un poco más
> enfocado a empresas. Ambos, cada vez están más distantes el uno del otro y
> es más dificil tener paquetes compatibles (por lo leido), y al final, ni
> uno, ni otro.
> Al programador empresarial medio, le dá igual si Squeak/Pharo tiene un
> cliente IRC integrado, o un framework para músicos, porque eso no vende.
>
> Para el mercado empresarial hace falta acceso a motores de reporting,
> BBDD, estabilidad tanto en ejecución, como en diseño etc... Smalltalk
> requiere un conocimiento amplio del lenguaje (perdón), y del core del
> entorno para poder trabajar con él, para poder diseñarte lo que te falte,
> algo que en otros entornos no es tan necesario, programas y ya está, y
> muchos pensarán "para qué perder el tiempo, si luego no voy a poder
> contratar a nadie". Y al cliente final, le dá igual si tu programa lo
> hiciste en uno u otro lenguaje, lo que le importa es que funcione.
>
> Hay mucha gente buena en el mundo Smalltalk, (Germán, Chris Muller, Edgar,
> y un montón de nombres que me dejo en el tintero, y espero me perdonen) y
> también hay mucha gente fragmentada entre Pharo y Squeak, y de todos, la
> inmensa mayoría simplemente está por hobby, o educación, por lo que todo lo
> que estamos tratanto, le dá igual, porque al fin y al cabo, el uso que se
> le dá es de "juguete", sin uso en el mercado empresarial. Aún así, el
> número de gente involucrada en Smalltak, es ínfimo.
>
> A mi, me gustaría retomar Smalltalk. Cuando consiga sacar tiempo, volveré
> a ponerme con ello, y me gustaría que llegara el momento de decidir migrar
> mi proyecto actual, pero por desgracia, no sé si ese momento llegará.
>
> La pregunta no sería, "si smalltalk es más productivo, por qué ...", la
> pregunta es: "la comunidad smalltalk quiere/puede adaptarse a lo que pide
> el mercado comercial?"
>
>  
>



--
============================================
Germán S. Arduino  <gsa @ arsol.net>   Twitter: garduino
Arduino Software  http://www.arduinosoftware.com
PasswordsPro  http://www.passwordspro.com
greensecure.blogspot.com germanarduino.blogpost.com
============================================
Reply | Threaded
Open this post in threaded view
|

Re: Vuelvo a Celeste (fue Re: [squeakRos] FW: [Pharo-project] Command Line AWS S3 Upload/Download Tool using Pharo Smalltalk)

Giuseppe
Para mi la multiplataformidad es un valor añadido importante. Que mi cliente sepa,que puede ejecutar la aplicación desde windows linux y mac indistintamente,y yo poder desarrollar desde todos tambien.

Puesto mi cliente potencial es más la empresa que el publico en general (aunque es una linea que me gustaria abarcar cuando el tiempo lo permita), que el look&feel sea o no nativo no es algo que me preocupe.

El trabajo de Andy Bower con Dolphin me encanta, pero eso, es solo windows.

Llegado el momento estudiare las distintas opciones,aunque estoy seguro que si cambiáramos de entorno, y fuera a smalltalk (algo que me gustaría), probablemente acabaríamos desarrollando en VW, pero tiempo al tiempo.

Respecto al hosting, no se. Esta claro que un VPS o hosting dedicado es mas caro que un hosting compartido,pero no tan desorbitado. Hay VPSs a 20$/mes que una empresa perfectamente pagaría por una solución de inventario o lo que sea.

Un saludo y, por cierto, feliz navidad.


Enviado desde mi dispositivo BlackBerry® de Orange.

-----Original Message-----
From: Germán Arduino <[hidden email]>
Sender: [hidden email]
Date: Sat, 24 Dec 2011 10:25:22
To: <[hidden email]>
Reply-To: [hidden email]
Subject: Re: Vuelvo a Celeste (fue Re: [squeakRos] FW: [Pharo-project] Command
 Line AWS S3 Upload/Download Tool using Pharo Smalltalk)

Hola Giuseppe:

Tus reflexiones son las que hemos tratado muchas veces y por las cuales
hemos pasado en mayor o menor medida la mayoría de los que trabajamos en
Smalltalk.

Comparto en gran medida algunas de las cosas que decís y hago algunas pocas
excepciones, la principal cuando uno trabaja (como yo) no a medida, sino
haciendo productos como el PPro para venta masiva. Ahí creo que es un hueco
donde Dolphin encaja muy bien, claro, sabiendo que para Mac o Linux hay que
correr lo que se vende vía un emulador (cosa poco probable que el usuario
"compre"). Igual, la gente de Linux no compra nada, así que no se pierde
mercado ahí. Mac es otro tema.

Ahora estoy pensando en otro producto que tengo como para aggionarlo,
pero....la verdad meterme con Pharo (ya me dijeron en la lista que el
usuario típico de Mac espera look and feel Mac puro) no se si paga el tiro
como decimos acá.

Además, hacer UIs de usuario en Pharo es caro (en tiempo) al igual que en
Squeak (aunque con la herramienta del Hasso se mejora eso) así que tengo
mis dudas.

Yo creo que la ventaja diferencial de Smalltalk es que uno trabaja con
objetos, y eso es el GRAN cambio, uno deja de pensar en datos y programas
separados y eso para mi es lo que no tiene precio ni tiene igual en
tecnologías tradicionales. Eso  y el entorno (la imagen) que permite un
trabajo continuo sin pensar en los ciclos tradicionales de
escribir-compilar-probar.

Pero bueno, también hay otras dificultades para los emprendimientos web y
es el hosting, ya se que se puede contratar servers virtuales, pero hay
ocasiones donde una app web no justifica un server para ella sola (ni la
administración del mismo).

En fin, lo de siempre..... UI, hosting jejejej, siempre con lo
mismo.......cada uno hará su balance, por ejemplo, en mi caso para el
passwordspro, me quedé con Dolphin sin dudas, ahora para otro tipo de
software, habrá que ver cada caso y los objetivos. Para desarrollos
corporativos es otro mundo y no creo que haya màs opciones (en Smalltalk)
que los productos comerciales (VW, VAST, Gemstone).

Saludos!




El 23 de diciembre de 2011 05:35, Giu <[hidden email]> escribió:

> **
>
>
> El 10/12/2011 13:50, Germán Arduino escribió:
>
>
>
>
>
>  El 10 de diciembre de 2011 08:43, Edgar J. De Cleene <
> [hidden email]> escribió:
>
>>
>>  > Digo si somos tan buenos, y creo que si, que Smalltalk es
>> diferencial, porque
>> > el resto de los techies del mundo no lo consideran asi (Y hablo más que
>> nada
>> > del entorno de las startups o grandes compañías de Internet. Si
>> producir en
>> > Smalltalk te permite como mínimo el doble de productividad que en un
>> lenguaje
>> > convencional, porque los grandes no ven eso...? POrque no aprovechan esa
>> > ventaja que les permitiría mucho menores costos?
>>
>>  No se si somos tan buenos y repito, que nos importa si "las grandes
>> compañias " , lo usen o no?.
>>
>>
> Pero debería importar. Java, tendrá todas las cosas malas que queráis,
> pero a día de hoy, es el lenguaje de programación más usado y extendido en
> el mundo empresarial. Sabemos que no es por méritos propios, pero ahí está.
> Smalltalk, se conoce poco, se conoce como algo de hace 30 años (como si
> nombras Cobol o Fortran),  y que siempre tuvo un precio prohibitivo, y a
> día de hoy, ninguna opción opensource es viable. Además, Java se estudia en
> la universidad. Smalltalk al parecer se estudia en Argentina, pero por
> ejemplo, en España, creo que Smalltalk, como mucho, se nombra en historia
> de programación y ya está, lo demás, es C/C++ y Java prácticamente (creo
> que en Cataluña si hay un catedrático que dá Smalltalk, pero es una
> excpeción, y aparte, viven en su mundo y en su idioma como si de otro pais
> se tratara). Ésto, también repercute como dices en los costos. Para
> encontrar un programador experimentado en Smalltalk, has de buscar mucho, y
> pagarle lo que pida, mientras un becario en Java cobrando una miseria, sale
> de debajo de las piedras.
>
> Algunos me conocéis y sabéis que llevo tras Squeak varios años, y nunca me
> puse en serio más allá de probar cosas y hacer un seguimiento del proyecto,
> pero, sobre todo, porque en mi opinión, por mucho que duela decirlo, por
> muy productivo que pueda ser Smalltalk, del lado OpenSource, no está
> preparado para el mundo empresarial (y yo no tuve tiempo de dedicarle, mi
> parte de culpa también tengo). Obviamente, VA Smalltalk (que lo veo
> carísimo) o VisualWorks o Dolphin (que sólo va en Windows), si serán
> entornos para producción y demostrado está (creo), pero las
> implementaciones opensource no. Pharo parece que quiso cambiar algo ésto, y
> para hacer alguna cosa en el mundo web puede servir, pero para aplicaciones
> empresariales y aburridas (mercado que aún muchos clientes es el que
> desean), a día de hoy Smalltalk está muy verde (y lo seguirá estando), ya
> que, si no me equivoco, el 80% al menos de sus "usuarios" lo usan para
> investigación, o como juguete, no para "trabajar". Además, también hay que
> tener en cuenta, que muchos programadores, no quieren, o no están
> interesados en tocar código de la VM, o del corazón del entorno,
> simplemente, quieren heredar y trabajar, cosa, que por ejemplo, no hace
> falta en Java, pero es casi obligatorio en Squeak/Pharo, ya que la
> instalación de un simple paquete, puede comenzar a lanzar errores que o
> sabes como funciona todo por dentro, o no sabes solucionar, y como no hayas
> grabado antes de instalar, te deja la imágen coja con una instalación a
> medias.
>
> Luego está la fragmentación, hay gente que prefiere Squeak, mientras el
> mayor número se movieron a Pharo, porque querían un Squeak un poco más
> enfocado a empresas. Ambos, cada vez están más distantes el uno del otro y
> es más dificil tener paquetes compatibles (por lo leido), y al final, ni
> uno, ni otro.
> Al programador empresarial medio, le dá igual si Squeak/Pharo tiene un
> cliente IRC integrado, o un framework para músicos, porque eso no vende.
>
> Para el mercado empresarial hace falta acceso a motores de reporting,
> BBDD, estabilidad tanto en ejecución, como en diseño etc... Smalltalk
> requiere un conocimiento amplio del lenguaje (perdón), y del core del
> entorno para poder trabajar con él, para poder diseñarte lo que te falte,
> algo que en otros entornos no es tan necesario, programas y ya está, y
> muchos pensarán "para qué perder el tiempo, si luego no voy a poder
> contratar a nadie". Y al cliente final, le dá igual si tu programa lo
> hiciste en uno u otro lenguaje, lo que le importa es que funcione.
>
> Hay mucha gente buena en el mundo Smalltalk, (Germán, Chris Muller, Edgar,
> y un montón de nombres que me dejo en el tintero, y espero me perdonen) y
> también hay mucha gente fragmentada entre Pharo y Squeak, y de todos, la
> inmensa mayoría simplemente está por hobby, o educación, por lo que todo lo
> que estamos tratanto, le dá igual, porque al fin y al cabo, el uso que se
> le dá es de "juguete", sin uso en el mercado empresarial. Aún así, el
> número de gente involucrada en Smalltak, es ínfimo.
>
> A mi, me gustaría retomar Smalltalk. Cuando consiga sacar tiempo, volveré
> a ponerme con ello, y me gustaría que llegara el momento de decidir migrar
> mi proyecto actual, pero por desgracia, no sé si ese momento llegará.
>
> La pregunta no sería, "si smalltalk es más productivo, por qué ...", la
> pregunta es: "la comunidad smalltalk quiere/puede adaptarse a lo que pide
> el mercado comercial?"
>
>  
>



--
============================================
Germán S. Arduino  <gsa @ arsol.net>   Twitter: garduino
Arduino Software  http://www.arduinosoftware.com
PasswordsPro  http://www.passwordspro.com
greensecure.blogspot.com germanarduino.blogpost.com
============================================