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.

quarta-feira, 9 de setembro de 2009

Instalando Scala

Para instalar Scala no Mac OS X, baixe o instalador do seguinte link:

http://www.scala-lang.org/downloads/distrib/files/scala-2.7.5.final-installer.jar

Esse link é pra versão 2.7.5 da linguagem.

Execute o instalador, entrando no terminal, vá até o diretório onde se encontra o instalador e digite:

sudo java -jar scala-2.7.5.final-installer.jar

Escolha a linguagem de sua preferência e o local de instalação. No meu caso eu vou aceitar as opções Inglês e /usr/local/

Depois de terminada a instalação, adicione o path de instalação as variáveis de ambiente, edite o arquivo .profile no seu diretório HOME, e adicionar a seguinte linha:

export PATH=/usr/local/scala-2.7.5.final/bin:$PATH

Onde /usr/local/scala-2.7.5.final é o local onde o compilador foi instalado.

Para testar a instalação, feche o terminal e o abra novamente, digite scala -version e você deve ver a mensagem:

Scala code runner version 2.7.5.final -- Copyright 2002-2009, LAMP/EPFL

É isso ai, até a próxima.

sexta-feira, 4 de setembro de 2009

Truques em Scala - Structural Typing

As linguagens dinâmicas como Ruby e Python tem algumas capacidades bem interessantes, entre elas esta a possibilidade de passar um objeto para um método e desde que o objeto implemente os métodos necessários (ex: name, height), o método executará corretamente.

Já as linguagens estáticas normalmente não tem essa capacidade, algumas, como por exemplo Boo implementam essa possibilidade através de dispatch in runtime para os métodos que necessitam dessa caracteristica, já Scala tem uma solução bem elegante.

Por exemplo, digamos que você queira definir um método que espere um objeto que tenha as propriedades name e age, uma forma comumente usada em linguagens estáticas seria a seguinte:

Definir uma interface com os métodos que interessam:

trait BasicProperties {
  def name: String
  def age: Int
}

Escrever as classes implementando BasicProperties e o método recebendo como parametro um objeto do tipo BasicProperties:

class Pet(val name: String, val age: Int) extends BasicProperties
class Person(val name: String, val age: Int) extends BasicProperties

def printProp(in: BasicProperties) =
  println(in.name+" is "+in.age+" years old")

E então você poderia chamar o método assim:

printProp(new Pet("Galfildo", 8))
printProp(new Person("Maria", 18))

Se você tivesse uma classe tipo:

class Antique(val name: String, val Age: int, val cost: int)

Você não poderia usar um objeto desse tipo como parametro para printProp, já que a classe não herda BasicProperties.

A solução está na capacidade que Scala tem de definir algo que poderia ser chamado de anonymous interfaces, no caso, o método printProp seria escrito assim:

def printProp(in: {def name: String; def age: Int}) =
  println(in.name+" is "+in.age+" years old")

Como se você estivesse definindo como parametro um tipo anonimo, que tem um método name do tipo String e um método age do tipo Int

E então poderia executar:

printProp(new Pet("Galfildo", 8))
printProp(new Person("Maria", 18))
printProp(new Antique("Monalisa", 450, 1000))

Como se ve, um código muito parecido com o escrito em Ruby e Python, mais ainda com uma caracteristica de documentação, já que o método é explicito sobre o que ele necessita.

terça-feira, 1 de setembro de 2009

Como programar para Android no Mac OS X

Para desenvolver para Android você necessita ter instalado o Java, algum IDE e o Android SDK.

Java

Você necessita de uma versão do java instalado, o JDK 5 ou 6 por exemplo. A instalação apenas do runtime, conhecido como JRE não é suficiente, você precisa do development kit completo, eu recomendo a instalação do JDK 6.

IDE

Você precisa ter instalado também um IDE para desenvolvimento Java. Eclipse, Netbeans, Idea, todos eles tem suporte pare desenvolvimento Android. Nos meus testes tenho usado o Netbeans (versão 6.7 ou maior) e o Eclipse (versão 3.3.1 ou maior), os dois tem prós e contras, acho o Netbeans mais estavel, mas o Eclipse tem algumas features a mais.

Android SDK

Depois, faça o download do Android SDK, a versão para download na página do projeto atualmente é a 1.5 r3. Faça o download e instale o SDK, esse será o seu SDK install directory, anote em algum lugar o path completo para esse diretório, pois o mesmo será usado no futuro.

Plugin de desenvolvimento

Para poder trabalhar com o desenvolvimento para android com o IDE que você escolheu será necessario a instalação de um plugin. Abaixo descrevo como instalar os plugin para Eclipse e para Netbeans.

Para instalar o plugin no Eclipse:

1 - Inicie o Eclipse, e selecione a opção de menu Help > Software Updates...
2 - Clique a aba Avaiable Software
3 - Clique o botão Add Site...
4 - Entre o endereço do site de update do Android: https://dl-ssl.google.com/android/eclipse/

Clique o Ok

5 - O site de update do Android deve aparecer na lista de Avaiable Software. Selecione o checkbox ao lado do mesmo e então clique Install...
6 - Clique Finish para iniciar o processo de download e instalação.
7 - Assim que a instalação terminar, reinicie o Eclipse.
8 - Quando o Eclipse abrir novamente, será necessário configurar onde o Android SDK está instalado. Selecione o menu Eclipse > Preferences > Android, e entre o diretório de instalação que você anotou no começo. Clique Ok.

Bem, se tudo deu sorte e os Deuses do java permirtirem, você poderá começar a criação do seu tão sonhado software para Android.

Para instalar o plugin do Netbeans

1 - Inicie o Netbeans e selecione a opção de menu Tools > Plugins
2 - Clique na aba Settings
3 - Clique no botão Add
4 - Entre um nome, por exemplo nbandroid e o endereço do update center do plugin http://kenai.com/downloads/nbandroid/updates.xml

Clique o Ok

5 - Na aba Available plugins entre nbandroid, ou o nome que vc escolheu no campo de busca, selecione o checkbox ao lado do ite encontrado e clique Install...
6 - Clique Next, aceite a licença, clique em continue (ignore os avisos sobre 'unsigned plugins') e voilá.

Você agora pode usar todos seus Skills de Netbeans no desenvolvimento para Android.

segunda-feira, 31 de agosto de 2009

O mundo de Android

Começei a brincar nos ultimos dias com a plataforma Android. E gostei da forma como certas coisas são feitas no sistema, como a idéia de Activities e Intents, o fato de você poder executar o programa direto no aparelho, sem a necessidade de certificados, provisioning profiles e todas esses detalhes comuns no IPhone.

Espero escrever logo algumas impressoes sobre a programação para Android versus a programação IPhone.