Arquivo do mês: maio 2012

Jazz em Rio das Ostras em 2012

Fonte: http://www.riodasostrasjazzeblues.com/joomla/index.php

Higher Order Messaging in Smalltalk – Part 5

Continuação da parte 4.

Processando coleções simultaneamente

O processamento de coleções de forma simultânea e independente não é possível em Smalltalk se apenas usarmos iteradores internos (do, select, collect, reject, etc). Usaremos então streams para o papel de iteradores externos.

O código HOM titles collect, names each é equivalente ao seguinte código:

nameStream := ReadStream on: names.
titles collect: [ :each | each, nameStream next].

Para obter o código modificado vamos fazê-lo passar no teste abaixo:

O que precisamos fazer é detectar a ocorrência de duas collections e providenciar para que haja a iteração coordenada entre elas aplicando-se simultaneamente a operação desejada. Veja o resultado que atende ao teste:

O retângulo vermelho acima realça o código introduzido.

O código abaixo calcula o produto escalar se considerarmos que cada collection representa um vetor:

Continua na parte 6.

Restaurant Week 2012

Fui no Coccinelle Bistro com colegas de trabalho na terça passada. Não voltaria.

CARDÁPIO ALMOÇO –  Coccinelle Bistrô

Entrada

Salada Tzatziki
ou
Gazpacho
ou
Sopa de legumes

Prato Principal

Parmentier de carne com batata baroa
ou
Peito de frango ao molho Chasseur acompanhado de arroz com açafrão

Sobremesa

Torta de fruta do dia
ou
Clafoutis de frutas vermelhas

No sábado fui com a família no Restô em Ipanema. Bom.

CARDÁPIO ALMOÇO

Entrada

Creme de abóbora com flocos de gorgonzola e torradinha temperada.
ou
Vitelo Tonnato
Carpaccio de de Roast Beef com molho de atum e alcaparras.

Prato Principal

Paillard de maminha de alcatra com ninho de repolho e champignons recheados e seu molho com cebolinha verde.
ou
Bacalhau sobre cama de purê de batatas, espinafre, alhos laminados, ovo caipira, fitas de cenoura marinada e molho de pimenta verde.

Sobremesa

Morangos marinados no aceto balsâmico com chantilly de hortelã e sorvete de baunilha.
ou
Cata-vento de mousse de chocolate com waffle.

No domingo, 27/5, comemos no Uno. Muito bom.

CARDÁPIO ALMOÇO

Entrada

Pastel de brie (3 und).
ou
Mini omelete de Emmenthal e folhas verdes.

Prato Principal

Galetinho com Fettuccine ao funghi.
ou
Mignhonete ao malbec servido com purê de baroa e alho poró.

Sobremesa

Delicia de chocolate com sorvete de Creme.
ou
Banana Caramelada com sorvete de creme e calda de chocolate.

Webmanario

É por essas e por outras que recomendo às pessoas: não deem entrevistas, você não sabe diante de que tipo de profissional estará. No Tocantins, um repórter açodado foi advertido severamente pelo entrevistado. “Vá estudar”. Merecido, e que sirva de reflexão antes de atrapalharmos as pessoas.

Ver o post original

Mariano Martinez Peck

Hi guys. It is going to be 4 years since I have started to develop with Squeak/Pharo. In the last months, talking with people or by reading the mailing list, I noticed that I may know some tricks and tips of Pharo that not everybody know. If you are an advanced Pharaoer, you probably won’t learn anything new but, if you are a beginner or so, this post may help you.

I have structured this post so it can be easy to follow. There are different categories and, for each of them, there are several tricks. Each trick has a detailed name so you can quickly scan them and only read those you are interested in.

UPDATE: James Robertson has started creating videos for some of the tips I mention here. So for those that there are already videos, I will paste the link. Thanks James!

Searching

“Method…

Ver o post original 2.412 mais palavras

Higher Order Messaging in Smalltalk – Part 4

Continuação da parte 3.

Processando coleções

#do

Vamos estender o código para que a iteração também percorra o argumento da mensagem. Até agora percorremos a coleção no papel de receptor da mensagem.

No paper Alice é uma gerente (manager) que possui subordinados (reports). Se quisermos adicionar Sally como um novo subordinado à lista de suboedinados de Alice executamos o código alice addReport: sally.

Numa outra situação Sally, também uma gerente, necessita transferir seus subordinados para Alice. O código para isso é o seguinte:


sally reports do: [ :each | alice addReport: each ].

Eliminando-se a sintaxe relativa à iteração e alterando-se a ordem do termos temos em HOM:

alice do addReport: sally reports each

Agora a iteração deve ocorrer na coleção passada como argumento para #addReport: (que normalmente não deveria receber uma coleção como argumento).

Vamos construir um código de teste de maneira similar às anteriores:

O teste ainda não passa:

A classe Manager está inserida na hierarquia abaixo:

Vamos fazer da mesma forma que adotamos com OrderedCollection. Criaremos a classe HOMObject que tornaremos ancestral de Employee, como abaixo:

Podemos agora colocar a intercepção em HOMObject:

Uma nova classe HOMObjectTrampoline passará a receber as mensagens “desconhecidas” enviadas a objetos descendentes de HOMObject:

A idéia no método HOMObjectTrampoline>>#doesNotUnderstand: é aplicar #addReport: a cada elemento da lista passada como argumento.

O HOMObjectTrampoline criado quando a mensagem #do foi enviada ao HOMObject guarda na variável de instância #message esta mensagem. Quando recebe a mensagem #addReport: o método HOMObjectTrampoline>>#doesNotUnderstand transforma o seletor #do em #do: e executa o iterador #do:, aplicável a uma collection, com um bloco onde #addReport: é aplicado a cada elemento da lista passada como argumento.

Executando-se novamente o teste ele ainda não passa:

Para resolver a situação devemos analisar a ordem em que as mensagens são consideradas pelo Smalltalk no runtime. Repetimos abaixo o código HOM para facilitar.

alice do addReport: sally reports each

Primeiro a mensagem #do é enviada ao objeto alice. O objeto alice não reconhece a mensagem mas retorna um HOMObjectTrampoline. A próxima mensagem #addReport: é enviada ao proxy HOMObjectTrampoline, mas só depois que seu argumento for resolvido. O objeto sally recebe a mensagem #reports e devolve uma HOMOrderedCollection. A coleção retornada recebe a mensagem #each que não reconhece e devolve um proxy HOMOrderedCollectionTrampoline que é, então, passado como parâmetro da mensagem #addReport:. Lembrando que a mensagem #addReport: não é reconhecida pelo seu receptor HOMObjectTrampoline. Ela será manipulada no método HOMObjectTrampoline>>#doesNotUnderstand: (Reproduzido abaixo).

doesNotUnderstand: aMessage
	| collection collectionSelector unaryBlock |
	collectionSelector := (message selector , ':') asSymbol.
	collection := aMessage argument.
	unaryBlock := [:each | receiver perform: aMessage selector with: each].
	^ collection perform: collectionSelector with: unaryBlock

A linha 4 do método acima atribui à variável local collection o HOMOrderedCollectionTrampoline criado pelo envio da mensagem #each. O trampoline citado carrega na sua variável de instância receiver os reports de Sally e na sua variável message a mensagem #each.

Corrigimos a situação mudando a linha 4:

doesNotUnderstand: aMessage
	| collection collectionSelector unaryBlock |
	collectionSelector := (message selector , ':') asSymbol.
	collection := aMessage argument receiver. "	unaryBlock := [:each | receiver perform: aMessage selector with: each].
	^ collection perform: collectionSelector with: unaryBlock

E finalmente introduzimos um teste usando #respondsTo: similar ao usado em HOMOrderedCollectionTrampoline:

E agora o código passa no teste.

Para acomodar um tratamento de erro ainda necessitamos de uma pequena modificação em HOMObjectTrampoline>>doesNotUnderstand: (linha 4). Veja abaixo:

doesNotUnderstand: aMessage
	| collection collectionSelector unaryBlock |

	aMessage argument message selector asSymbol = #each ifFalse: [	^ super doesNotUnderstand: aMessage argument message].

	collectionSelector := (message selector , ':') asSymbol.
	collection := aMessage argument receiver.
	(collection respondsTo: collectionSelector)
		ifTrue: [unaryBlock := [:each | receiver perform: aMessage selector with: each].
			^ collection perform: collectionSelector with: unaryBlock].
	^ super doesNotUnderstand: message

Continua na parte 5.

Instruções sobre o start up list no Squeak podem ser encontradas em http://squeak.preeminent.org/tut2007/html/209.html

Mariano Martinez Peck

Hi. Some time ago, I wrote a post about how I build images for my projects. I am downloading new images all the time and because of that I used to have 2 problems: 1) I needed to load several external packages to the standard Pharo image; 2) I needed to set my own settings and preferences. Today, Pharo 2.0 (which is in development and unstable state) includes most of the packages I always needed to install: shout, code completion, nice browser (Nautilus or OB), refactoring integration, spotlight, etc.  So nowadays I only had problem 1).

In this post, I will show you how I solve that problem using StartupLoader, a nice utility present in Pharo (since Pharo 1.4). IMPORTANT: Everything I mention in this blog is taking into account the “new version” I did of StartupLoader. Before writing this post I have improved it and therefore…

Ver o post original 1.888 mais palavras