sexta-feira, 30 de outubro de 2009

Casa Nova

Ola Galera,

Gostei tanto dessa idéia de Blog que decidi fazer algo mais permanente.

Então, desde hoje Escalare está de casa nova em http://gbenatti.net

Atualizem seus feed readers

Abraços

GB

quinta-feira, 29 de outubro de 2009

Boo Friday - Parte I

Já que Boo é uma linguagem nova, decidi que uma boa forma de usar o Blog seria com uma série de pequenos posts falando da linguagem.

Começando simples. Porque Boo ? O que Boo traz de novidade que você não conseguiria com outras linguagens ?

Os seguintes objetivos, retirados do Boo Manifesto devem dar uma idéia:

A clean and wrist-friendly syntax:
- Syntactic sugar for common programming patterns
- Automatic Variable Declaration
- Automatic type inference
- Automatic type casting
- Classes are not needed

Expressiveness:
- First class functions
- First class generators
- Duck Typing

Extensibility:
- Syntactic Attributes
- Syntactic Macros
- Extensible Compilation Pipeline

De todas essas features acho que o que mais diferença Boo, é a combinação de uma linguagem estaticamente tipada com uma capacidade muito grande de se extender a mesma, através de atributos, macros e a inserção de modificações na compilação.

Em um próximo post vou explicar brevemente o que são esses termos. Caso estejam com muita pressa, leiam o manifesto, ja que provavelmente vou copiar de lá mesmo a maioria dos exemplos ;)

Cheers, até a próxima.

terça-feira, 27 de outubro de 2009

Truques em Scala - Como fazer parsing de um xml

Ontem eu precisei extrair alguns dados de um xml, e acho que as lições aprendidas merecem ficar registradas, vai que mais alguem nesse mundão precisa fazer algo assim.

<request service="Service 1">
  <extra>
    <entry key="key1">value1
    <entry key="key2">value2
  </extra>
</request>

O objetivo era extrair o nome do service como uma string e as entries como um map de key values.

O servico como string é bem facil, considerando que o xml esta em uma variavel serviceXml, teriamos:

val serviceName = (serviceXml\"@service").text

O que isso faz é basicamente pegar o attributo service do nó em questão e com esse dado pegar o nó como text.

A segunda parte é um pouco mais complexa então vamos por parte, primeiro pegamos as entries:

val entries = serviceXml\"extra"\\"entry"

Esse codigo executa basicamente um XPath extraindo do xml o nó "extra" e deste a lista de nós "entry"

Então, para cada entry extraimos uma tupla com o valor da key e o value:

val entriesTuple = for (entry <- entries) yield ((entry\"@key").text, entry.text)

Aqui usamos um for expression para percorrer a lista entries e retornar (usando yield) uma tupla que contem o valor da key e o inner text da entry

E por fim criar um Map com esses dados:

val mapResult = Map(entriesTuple: _*)

Por fim, como construir um Map apartir de uma lista, ou nesse caso de um generator ?

Maps podem ser contruidos usando de um numero variavel de tuplas usando algo como Map(tupla1, tupla2, tuplaN).

Se tentarmos usar Map(entriesTuple) o compilador vai reclamar falando que esse metodo nao pode ser executado com uma Seq[(String, String)], ou seja, uma sequencia de tuplas contendo duas Strings.

Temos que dar um jeito de passar essa Seq como um numero variavel de argumentos, e os desenvolvedores de Scala nos deram uma forma de fazer isso, quando temos que passar uma lista para um método que espera um número variavel de argumentos podemos fazer assim:

Map(entriesTuples: _*)

Essa anotação diz ao compilador para expandir os parametros

Juntando tudo temos:

val mapResult = Map((for (entry <- serviceXml\"extra"\\"entry") yield ((entry\"@key").text, entry.text)): _*)

Muita explicação pra pouco código, assim é Scala

Cheers

quarta-feira, 14 de outubro de 2009

Monotouch Redux

Interessante como as vezes os mais diversos interesses se encontram.

Desde que eu comecei a programar, em uma época distante, onde orientação a objeto não era tão falada e era importante saber que um JUMP causava um cache-miss que degradava a performance do seu 386, minha maior diversão tem sido as engines de jogos.

Nos ultimos anos também tenho tido grande interesse em linguagens de programação, tendo estado lá, na concepção de Boo e nos ultimos anos/meses tendo estudado e programado em Scala, Erlang e ObjectiveC.

E por último, como um aficcionado da Apple, sou dono de várias bugigangas da mesma e claro de um iPhone, e como todo bom desenvolvedor entrei na onda de programar para essa plataforma.

E aqui chegamos, a um ponto em que esses interesses (Jogos, Boo e iPhone) se encontraram na forma do monotouch, do monodevelop e do xnatouch. Com essas três ferramentas é possivel fazer jogos para XNA, usando Boo, que rodarão tanto no iPhone, quanto no Zune e no XBOX360.

Agora é só parar de escrever e começar a trabalhar no próximo grande jogo.

ps. Pra ser sincero, o suporte a Boo no Monodevelop deve levar mais alguns dias para estar ok.

segunda-feira, 5 de outubro de 2009

Boo e Mac OS X

Aqui estamos com mais um, como instalar uma linguagem no Mac OS X, hoje será a vez de Boo.

Boo (http://boo.codehaus.org), é uma linguagem baseada em .Net que necessita do .Net runtime para rodar, como no Mac não existe um .Net runtime que já venha instalado, nós vamos usar o Mono, que deve ser baixado da página do projeto http://www.go-mono.com/mono-downloads/download.html, no momento a ultima versão é a 2.4.2.3

Quando você instalar o Mono, ja será instalado com ele a versão do Boo 0.9.1.3287, que não é a ultima versão disponivel, então vamos atualizar o nosso sistema, você faz isso rodando os seguintes comandos:

wget http://dist.codehaus.org/boo/distributions/boo-0.9.2.3383.tar.gz
tar xzvf boo-*
cd boo-*
./configure --prefix=/Library/Frameworks/Mono.framework/Home --libdir=/Library/Frameworks/Mono.framework/Home/lib
make
sudo make install

Se tudo for executado sem problemas, você pode rodar o comando:

booish

E verá a seguinte mensagem:

Welcome to booish, an interactive interpreter for the boo programming language.
Running boo 0.9.2.3383 on Mono 2.4.2.3.

Enter boo code in the prompt below (or type /help).
>>>

Para sair do interpretador digite /q e de enter

Pronto, você tem seu sistema atualizado para a ultima versão de Boo.

Em um próximo Post descreverei como instalar a versão cutting-edge, direto do repositório.

quinta-feira, 24 de setembro de 2009

Desenvolvimento para iPhone com Mono

Uns dias atrás ao instalar o Mono, achei uma referencia a um produto da Novell chamado Monotouch.

Um produto que permite se desenvolver pra iPhone usando C#, agora, vocês podem questionar pq C# e não ObjC ?

Bem, me considero um programador que não tem muitos problemas em aprender e usar várias linguagens, no ultimo ano, aprendi objC, Erlang e Scala, e entendo que cada linguagem tem suas vantagens e desvantagens. Objective C é interessante, e sinceramente tem features bem poderosas se pensarmos que é uma linguagem compilada que foi criada para ser usada como um C em esteroides, sendo deste um superset, um competidor de C++, muito mais simples.

Mas, sempre há um mas...

Depois de C#, Boo, Ruby, Python voltar a ter que gerenciar memória na mão, ter arquivos de header e de implementação, para definir uma propriedade ter que adicionar informações em 4 lugares diferentes não me parece "cutting edge^ em termos de programação.

Sendo assim, vejo com bons olhos iniciativas como o Monotouch, claro que esse também tem seus problemas, o pior, ser pago, e caro para meus pobres bolsos. Mas alem disso, com certeza a biblioteca sempre estará atrás das da Apple, feitas em Objective C, em termos de acesso de features do iPhone.

Abaixo o link de um tutorial de uso do monotouch:

http://www.codesnack.com/storage/screencasts/gettingstarted/index.html

sábado, 19 de setembro de 2009

Como ver seus video no PS3, XBOX 360

Essa é uma dica pros maniacos por filmes e seriados em divx.

A um bom tempo venho convertendo meus videos de avi pra divx pra rodar no ps3. Mas no Mac esse proceso é meio chato, então resolvi novamente procurar um server uPNP pra rodar no Mac e achei o ps3 media server.

Quando vc roda o software aparece um media server na lista de videos do PS3, vc precisa apenas selecionar o media server e voilá.

Fiz alguns testes e ele funciona muito bem, agora vou poder manter todos os meus videos em um HD externo e assisti-los no PS3 sem precisar copiar os arquivos pra lá.

Apesar do nome, também funciona no XBOX 360.