0 Open position for Grails Developer

Hello,

Just returning here to announce an open position for Grails Developer, if you want, or know someone who may want, follow up:

The person must have hands on experience with GRAILS.

  • Experience with Oracle (plus)
  • Experience developing highly visited and highly scalable websites
  • Experience using the Grails Web Framework
  • Excellent communication skills

Location: Redwood City, CA
Duration: 3+ months
Start: ASAP
Rate: Open

Please send resumes to cwelch [at] bluewolf [dot] com (Charlotte)

0 Blog paused

Hey all,

This blog will be ‘paused’ for a while.
I’m running on some new apps for clients and this is taking my most time.

I’ll be back soon, thanks a lot, and keep on.

@lucastex

1 New Grails and Groovy related online board

Hello all,

A new Online Board is running up! GR8Forums.org is an online board to group questions, tips, discussions, knowlodge sharing and other stuff that are around Groovy Stuff… This means

  • Grails
  • Groovy
  • Gradle
  • Gaelyk
  • Gant
  • Any other gr8 stuff it should be there

C’mon, register online and introduce yourself here: http://gr8forums.org/viewtopic.php?f=21&t=3.
Come join and bring your groovy friends to the newest gr8 family.

[]s,

0 Viewing XML files in Safari

Oh, if you use Mac and Safari, viewing XML files is definitely one of worst things ever.
You have to open it and then use the ‘view source’ option to handle it.

This Safari Plugin called XMLView Plugin can make things easier. :) Just download it and uncompress it on your $HOME/Library/Internet Plug-Ins folder.

Close and reopen your Safari, and open any xml. You’ll se a well-formated XML with syntax highlight and expand/colapse options.

If you’re not following me on twitter, you own me a dollar for this one.

:)

0 Grails 1.2 Milestone 2 is out!

Yeah!! Graeme just announced rigth now that grails 1.2-M2 is out!
I’ve already talked about some changes and improvements in my twitter, but now is officially!

Check the release notes here: http://www.grails.org/1.2-M2+Release+Notes, the changelog, and download it to upgrade your applications!

Docs, as usual available here: http://grails.org/doc/latest

Later, I’ll write a post about the new features, probably one by one, come back!

Following me on twitter?

[]s,

3 A simple grails custom validator

While writing a simple CRUD with #grails, client asked me to validate pogo’s birth date (had to be in the last year). In this cases, we can’t just use regular validators, cause their are static. So we can solve this using our own custom validators, so simple and useful.

static constraints = {
	//...
	borned(validator: {
		return (it > new Date()-365)
	})
	//...
}

That’s it, this way every time a new instance is validated (during save or manually), a new date will be created and compared to it. (no I don’t care about leap years).

Already following me on twitter?

[]s,

0 Defining load order and dependencies to your grails plugins

Hello all,

I’m buiding a simple Grails Plugin that will use GORM dynamic finders and methods, but as we should know, the create-plugin grails command just install a fresh skeleton of your grails application, without any other dependencies.

First of all, you shoud install the hibernate plugin inside your plugin. Don’t worry, the hibernate will not be packaged with your plugin, but will be there to your plugin classes use.

grails install-plugin hibernate

So, now your plugin have the hibernate plugin installed and will be capable to use GORM facilities. But, if people wants to use your plugin, they will have to have hibernate plugin installed, correct? I know it cames by default in our grails application, but can be uninstalled. So we have to find some way to make our plugin dependent on hibernate plugin. Asking on the grails-user list and reading this topic in grails.org wiki, I remembered on two plugin configurations that can help us:

  • dependsOn
  • loadAfter

The dependsOn it’s a map inside our XptoGrailsPlugin that tells witch plugins our one depends, it takes the name of the respective plugin and its version, in my case, that’s what I did:

def dependsOn = ["hibernate":"1.1 > *"]

So, our plugin will depend on grails hibernate plugin, and at least the 1.1 version of it, none previous will be accepted and any future ones will be ok!

But sometimes this is not enougth, besides being dependent, our plugin uses dynamic finders, and runtime added method on our domain classes, so, it’ll only be successfully loaded after hibernate plugin load and adds this methods. To achieve this, we’ll use the other tag, the loadAfter to tell that our plugin will wait hibernate plugin to be loaded and the load itself.

def loadAfter = ['hibernate']

That’s it. Doing this we’ll make things work as we wanted.

PS.: just noticed, right now that Graeme Rocher pushed to github’s grails master branch, a commit that will install de default plugins into new plugin projetcs too. This sounds cool, and will avoid us the first step above, the plugin installation. Here is the commit id and link: 9cb23f5b835b633cf43079ca7e58e29c64bd3b3c

0 Problems with this blog, I’m back.

Ok.

Yesterday when I just finished posting a new blog entry, my wordpress just froze. Everything stopped working, just a blank screen all over the pages (even admin ones). I restored this backup from the day before yesteday, but I thin I lost all usage, visitors and analytics data. A shame :(

This is a fresh new installation, will configure everything again, plugins, snippets, rss, etc… Sorry guys, hope you all understand.

And the tutorials are coming, just working this last 2 months more than I planned/like.

See ya,

[]s,

0 A metaprogramação em linguagens dinâmicas

Vamos imaginar que gostaríamos de “adicionar comportamentos específicos” aos nossos objetos já escritos. Neste caso, usando a pura, tradicional, cafona e obsoleta orientação a objetos, estaríamos travados e acabaríamos por optar por uma composição de objetos, ou quem sabe uma generalização, certo? Uma das maiores vantagens (e perigos caso o programador seja na verdade um macaco de código), é o uso da metaprogramação. A metaprogramaçao nos permite exatamente isto, adicionar funções, e alterar o “esqueleto comportamental” de classes e objetos, por exemplo.

Para uma classe onde temos nosso cachorro, que anda:

class Dog {
  def walk() {
    println “walking…”
  }
}


se quisessemos definir um método para que ele latisse em runtime, faríamos da seguinte maneira:

def dog = new Dog()
dog.walk() //walking…

//Neste ponto, se fizermos a chamada dog.bark() teremos
//uma exception por estarmos chamando um método inexistente.
//Poderíamos contornar o erro com a implementação do methodMissing
//como dito no outro post, ou então da seguinta maneira

dog.metaClass.bark = {
  println “au.”
}

//Pronto, após isto, é só latir
dog.bark() //au.

Poderíamos também trabalhar com parâmetros da função

dog.metaClass.bark = { vezes ->
vezes.times {
println “au.”
}
}

dog.bark(5)
//au.
//au.
//au.
//au.
//au.

Neste caso, definimos o comportamento do método bark() em runtime, para um objeto já existente. Se quisessemos agora, unir os comportamentos de um objeto, em outro, poderíamos usar o recurso de mixin de objetos, que traz as definições de métodos e funçoes de um objeto para outro. Tendo a definição de um pato, onde:

class Duck {
  def quack() {
    println “quack!”
  }
}

Fica fácil fazer com que o pato ande como um cachorro! (absorvendo a função definida na classe Dog) :)

def duck = new Duck()
duck.quack() //quack!

//dedo de deus
duck.metaClass.mixin Dog

duck.walk() //walking

É isso aí.

[]s,

2 Interceptando métodos inexistentes em Groovy

As linguagens dinâmicas estão ganhando um espaço considerável hoje em dia. Para dar um exemplo do poder dessas linguagens, criei um exemplo simples em Groovy (linguagem Java que roda “em cima” da JVM).

Uma das características dessas linguagens, é poder aproveitar a criatividade do desenvolvedor. Daí temos como exemplo uma função que pode ser definida em nossos objetos chamada methodMissing. Essa função é chamada quando algum método não encontrado é chamado em algum objeto. Caso não seja definida, aí sim temos o comportamento padrão do Java, uma exception apontando a falta do método.

No twitter, o @cmilfont perguntou ao @fabiokung sobre um builder de HTML que ele tinha feito em ruby com o mesmo princípio. Usar o methodMissing. Quando eu vi este builder, fiquei pasmo com a simplicidade e objetividade, e tudo isso originou este post. Coloquei alguns tratamentos que não existiam, para valores de atributos das tags.

O exemplo utiliza o poder da função methodMissing para criar um “Builder”, ou então um construtor de HTML dinâmico com base em pseudo-métodos chamados pelo cliente. Imaginem a função abaixo:

def methodMissing(String name, params) {
	if (params[0] instanceof Closure) {
		println "< ${name}>"
		params[0].call()
		println "< / ${name}>"
	} else if (params[0] instanceof String) {
		println "< ${name}>${params[0]}< ${name}>"
	} else if (params[0] instanceof Map) {
		print "< ${name}"
		params[0].each() {chave, valor ->
			print " ${chave}=\"${valor}\""
		}
		if (params.length > 1) {
			if (params[1] instanceof Closure) {
				println ">"
				params[1].call()
				println ""
			}
		} else println " />"
	}
}

No primeiro if, resgatando o parâmetro do tipo closure, apenas faz a chamada a esta closure, para que o novo método seja chamado entre “TAGS” que são o nome do método criado dinâmicamente… Já no caso do parâmetro ser uma String, é encarada como conteúdo inteno da tag e renderizada desta maneira.

Se um map for passado como parâmetro, a interpretação é tida como vários atributos da tag html (método inexistente), e caso ainda tenhamos uma outra closure ali como parâmetro, o comportamento é repetido :)

Com este exemplo, poderíamos construir um simples HTML com o seguinte trecho de código (script) groovy:

html {
    head {
        title "teste de titulo"
    }
    body {
        div(id:3, class:"odd") {
            p "meu texto"
        }
        div id:5, class:"xpto"
    }
}

Prontinho, a JVM com o trecho acima cria nosso super-mega-ultra-elaborado trecho de HTML:

< html >
< head >
< title >teste de titulo< / title >
< / head >
< body >
< div id="3" class="odd" >
< p >meu texto< / p >< / div >
< div id="5" class="xpto" / >
< / body >
< / html >

Groovy é uma linguagem de script muito bacana e poderosa, e como roda em cima da JVM, não é nada mais que Java puro. Pode com certeza e MUITA eficiência substituir aqueles scripts shell que temos em algumas aplicações, trazendo para os desenvolvedores mais liberdade (de chamar um jar com funcionalidades, por exemplo), e conforto (de não depender de alguém de infra estrutura, ou de conhecimento em shell script).

Fica aí a dica e o exemplo do poder…

Valeu!

Next Page »

Web Analytics