Posts de February, 2011

[Emerson Macedo] Node.JS Versão 0.4.0 – O que mudou ?

Monday, February 14th, 2011

No último dia 10/02/2011, foi lançada a versão 0.4.0 do Node.JS (confira o anúncio na lista oficial). Esta é a primeira versão stable depois dos releases 0.2.x. Sempre foi claro que os releases 0.3.x eram totalmente unstable e que estavam servindo de base para os releases 0.4.x. Portanto, todos deveriam conseguir atualizar suas aplicações para essa versão sem muitos problemas.

Dentre as principais mudanças, destaco as melhorias no suporte a SSL, que é uma das coisas que precisava melhorar no Node.JS.

Outro ponto importante foi a mudança no sistema de módulos. Agora o require usa paths completos, ou seja, agora consegue funcionar com links simbólicos. Além disso, o require também entende o package.json, que é o arquivo que define um pacote node. E por último, mas talvez o mais importante é que agora você pode ter um diretório node_modules no seu projeto e o require vai procurar pelos módulos primeiro nele, antes de ir buscar em outros locais, facilitando muito “vendorizar” suas bibliotecas dependentes.

O Node também atualizou a versão do V8 para 3.1.2 e agora temos uma API um pouco menos burocrática de HTTP Client.

Existe também um novo módulo chamado OS, que trás algumas operações para pegar informações sobre o gerênciamento do sistema, como número de CPUs, quantidade de memória total/livre e informações gerais do sistema operacional.

Confira a documentação da API 0.4.0.

Post Footer automatically generated by Add Post Footer Plugin for wordpress.

[Emerson Macedo] Usando o novo built-in debugger do Node.js

Saturday, February 12th, 2011

Para debugar aplicações Node.js, eu estava usando até o momento o Node Debugger (a.k.a ndb), uma biblioteca que deve ser instalada a parte (geralmente via npm) e que apesar de não ser nada de outro mundo, tem me ajudando bastante. Existem também outras boas opcões, como o Node Inspector, Node Eclipse Debugger, entre outros. Todas elas como pacotes em separado.

Desde a versão 0.3.4 do Node.js, existe um built-in debugger, que provavelmente se tornará a opção default, e provavelmente o plugins de IDEs como o do Eclipse passará a usa-lo para debugar aplicacões Node.js (suposição minha).

Sua forma de utilização básica é praticamente a mesma que já estamos acostumados com ferramentas de debug command-line. Basta inserir uma linha no meio do código com a keyword debugger e o programa vai parar naquela linha para você verificar o que está acontecendo. Um breve exemplo:

function fazNada(msg) {
  debugger;
  console.log(msg);
}
fazNada("teste");

Agora basta rodar o node com a opção debug:

$ node debug qualquercoisa.js

Digite run (acho que esse passo não precisaria existir, mas):

debug> run

O segunte output deveria aparecer:

// informações sobre o programa e o primeiro break point
debugger;
^

Dê um list para vermos onde estamos no programa:

debug> list
 1 function fazNada(msg) {
=>   debugger;
 3   console.log(msg);
 4 }
 5 fazNada("teste");
 6

Imprima o valor de msg:

debug> print msg
teste

Passe para próxima linha:

debug> next
break in fazNada(msg=teste), /Users/emerson.leite/lixo/xptoDebug.js:3
  console.log(msg);
  ^

Continue o script para ele executar o restante e encerrar:

debug> continue
debug> teste

program terminated

Se você quiser repetir o ciclo basta executar run novamente.

Para ver os demais comandos, basta digitar help no console do debug:

debug> help
Commands: backtrace, continue, help, info breakpoints, kill,
list, next, print, quit, run, scripts, step, version

Por enquanto pretendo vou continuar usando em conjunto com o ndb, principalmente porque esse debug built-in ainda não tem um eval, ou seja, não consigo alterar nada durante o debug, o que me limita muito na hora de resolver problemas.

Fiquemos atentos as novidades.

Post Footer automatically generated by Add Post Footer Plugin for wordpress.

[Igor Sobreira] Change object after saving all inlines in Django Admin

Saturday, February 12th, 2011

UPDATE Aug, 2011: This patch added a new hook to ModelAdmin called save_related(). You don’t need the hack described bellow anymore :).


Admin is an awesome Django builtin app to create nice CRUDs for your models, and offers a lot of customizations hooks. You can personalize the templates, perform custom filters, modify newly created objects and if that’s not enough, you can always create your own view to do something it doesn’t by default.

The admin docs are great, I’m not going to explain how it works. The intention here is to show a way to modify an object, after it’s saved, and other objects related to it using inlines are saved too.

Once you’ve configured your admin interface with inlines, you end up with something similar to:

from django.contrib import admin
from fooapp.models import Foo, Related

class RelatedInline(admin.TabularInline):
    model = Related

class FooAdmin(admin.ModelAdmin):
    inlines = [RelatedInline]

admin.site.register(Foo, FooAdmin)

this mean whens you’re adding a Foo, since Related has a foreign key to it, django will display a few forms to add Relateds in the same page.

Imagine you need to do something with the new foo instance that needs to now how many related objects it has. Admin already has methods you can override to do something after Foo is saved, like ModelAdmin.save_model(). See how it works:

class FooAdmin(admin.ModelAdmin):
    inlines = [RelatedInline]

    def save_model(self, request, obj, form, change):
        obj.save()
        # do something with obj.related_set.all()
        # OPS! it's empty!

admin.site.register(Foo, FooAdmin)

the problem here is that save_model() is called before the inlines are saved.

Let’s find out how it works. Open django source code, specifically in django.contrib.admin.options.py go to add_view(), it’s the view called when you are creating an object. As you can see, when the request method is “POST” it goes through all validation, for the main form and all related formsets (your inlines). And if all of then are valid it calls save_model(), then save_formset() for each formset. The interesting piece is shown below:

class ModelAdmin(BaseModelAdmin):

    # ...

    def add_view(self, request, form_url='', extra_context=None):

        # ... all validation here ...

        if all_valid(formsets) and form_validated:
            self.save_model(request, new_object, form, change=False)
            form.save_m2m()
            for formset in formsets:
                self.save_formset(request, form, formset, change=False)

            self.log_addition(request, new_object)
            return self.response_add(request, new_object)

Notice here that the last method it calls is response_add(), and it passes the created object, that’s all we need! If you see the change_view() method (witch it the view called when you’re editing an object) it calls a similar method: response_change().

Now we can solve our problem doing something like this:

class FooAdmin(admin.ModelAdmin):
    inlines = [RelatedInline]

    def response_add(self, request, new_object):
        obj = self.after_saving_model_and_related_inlines(new_object)
        return super(FooAdmin, self).response_add(request, obj)

    def response_change(self, request, obj):
        obj = self.after_saving_model_and_related_inlines(obj)
        return super(FooAdmin, self).response_change(request, obj)

    def after_saving_model_and_related_inlines(self, obj):
        print obj.related_set.all()
        # now we have what we need here... :) 
        return obj

There are two things to keep in mind when using these methods:

  • They are not documented. So probably it’s not part of the API admin expects you to override. Thankfully django publishes excellent release notes including backwards incompatible changes. And I hope you have good test coverage to know if it will break when you update django :)
  • Their intention is to handle the response of the view, as it docstring says: “Determines the HttpResponse for the add_view stage”. So if you do something there not related to it, it works, wont make much sense if you look at the overall architecture.

Maybe django will add a more specific hook to solve this issue later, but I hope it helps you for now.

[Andrews Medina] classes “new-style”

Thursday, February 10th, 2011

Estava conversando com um amigo sobre classes “new-style” e percebi que alguns desenvolvedores não sabem a diferença em herdar ou não a classe object ao criar uma classe em Python.

Até a versão 2.1 do Python, o tipo de todas as classes em Python era classobj. E qualquer instancia de uma classe era do tipo instance. Ou seja, todas as instâncias eram independentes de suas classes:



>>> class Foo: pass

>>> type(Foo)
<type ‘classobj’>
>>> foo = Foo()
>>> foo.__class__
<class __main__.Foo at 0×1e4570>
>>> type(foo)
<type ‘instance’>

Na versão 2.2 do Python, foi criado as classes ‘new-style’ que unificam classes e tipos. Onde uma classe não é nada mais que um tipo definido pelo programador:



>>> class Bar(object): pass

>>> type(Bar)
<type ‘type’>
>>> Bar.__class__
<type ‘type’>
>>> bar = Bar()
>>> bar.__class__
<class ‘__main__.Bar’>
>>> type(bar)
<class ‘__main__.Bar’>

Outra característica é que uma classe new-style é do tipo ‘type’ assim como as os tipos primitivos, permitindo a criação de tipos baseados nos tipos primitivos:



>>> type(list)
<type ‘type’>
>>> type(Bar)
<type ‘type’>
>>> class MinhaLista(list): pass

>>> type(MinhaLista)
<type ‘type’>

Para manter questões de compatibilidade, na versão 2 do Python as classes são old-style por padrão, para que uma classe seja new-style ela tem que ser uma classe filha de uma classe new-style, onde object é a base das classes new-style. No Python 3 as classes são new-style por padrão e as classes old-style não existem mais (amém).

As classes new-style tem várias características diferentes das old-style, como é facilmente visto no exemplo abaixo:



>>> dir(Foo)
['__doc__', '__module__']
>>> dir(Bar)
['__class__', '__delattr__', '__dict__', '__doc__', '__format__', '__getattribute__', '__hash__', '__init__', '__module__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__']

Algumas diferenças são: descriptors, method resolution order e chamada de métodos especiais.

Mais informações sobre classes new-style:

[Igor Sobreira] Adding methods dynamically in Python

Sunday, February 6th, 2011

Given the dynamic nature of Python you can do many things in runtime, like add methods dynamically to an object or class. This is particularly useful when writing unit tests.

Here is the simplest way, adding a method to and object:

class Person(object):
    pass

def play():
    print "i'm playing!"

p = Person()
p.play = play
p.play()

note that play is just a function, it doesn’t receive self. There is no way to p knows that it’s a method. If you need self, you must create a method and then bind to the object:

from types import MethodType

class Person(object):
    def __init__(self, name):
        self.name = name

def play(self):
    print "%s is playing!" % self.name

p = Person("igor")
p.play = MethodType(play, p)
p.play()

In these examples, only the p instance will have play method, other instances of Person won’t. To accomplish this we need to add the method to the class:

class Person(object):
    def __init__(self, name):
        self.name = name

def play(self):
    print "%s is playing!" % self.name

Person.play = play

p1 = Person("igor")
p1.play()

p2 = Person("joh")
p2.play()

note that we don’t need to create a method with types.MethodType here, because all functions in the body of a class will become methods and receive self, unless you explicit say it’s a classmethod or staticmethod.

Adding methods to builtin types

Python doesn’t allow to add methods to built-in types, actually to any type defined in C. The unique way around this is to subclass the type, here is an example:

class UpperList(list):
    pass

def to_upper(self):
    for index, item in enumerate(self):
        self[index] = item.upper()

UpperList.to_upper = to_upper

l = UpperList(['i','g','o','r'])
l.to_upper()
print l

Here is a nice comparison on dynamically adding methods in Python and Ruby.

[Rafael Biriba] Aniversário de 2 anos do blog tem direito à comemoração

Saturday, February 5th, 2011

Hoje dia 05/fevereiro, meu blog comemora seus 2 anos de existência…

Como eu já havia avisado, esse ano tivemos mais uma festa do blog e neste post você poderá conferir alguns vídeos e fotos de como foi… :)   Se você ainda não viu, veja aqui a festa de 1 ano do blog.

Antes de mostrar os vídeos e fotos, gostaria de deixar alguns agradecimentos:

  • A você visitante e leitor que vem acompanhando já há algum tempo as coisas que escrevo aqui…
  • A você que comenta que contribui ainda mais nos meus posts, comentando e respondendo comentários.
  • Aos amigos, principalmente os da Globo.com que me motivam ( e muito ) a continuar escrevendo no blog… (Apesar de eu não ter ainda 3000 visitar ao dia. Mas @peleteiro, um dia vou conseguir !!! ;) )
  • Agradecer a todos que clicam nos anúncios do meu blog. Vocês não fazem idéia de como alguns trocados podem ajudar a pagar o servidor e outros custos do blog ;) (Inclusive ajudou a pagar a festa :) )

Aproveito a oportunidade também para compartilhar mais uma excelente notícia. Desde o finalzinho de Janeiro o blog é pagerank 3 !!! :)

E para quem não sabe, pagerank é usado pelo Google para ajudar a determinar a relevância de uma página.

Com isso, teoricamente se eu postar sobre um determinado assunto, e algum outro blog com pagerank menor postar sobre o mesmo assunto, o meu blog deveria aparecer primeiro nos resultados de busca. Logicamente que muitos outros fatores são levados em consideração e o pagerank é um deles. Por isso é algo importante. Leia mais sobre isso no wiki.

Agora, vamos recordar um pouco mais da festa de 2 anos do blog:

Album de Fotos:

Confusão para pegar os últimos pedaços de bolo
O bolo ;)
Parte da galera que já não aguentava mais comer...
Parte da galera que já não aguentava mais comer...
2 anos de blog :)
2 anos de blog :)
Mais de 20 pessoas passaram pela sala :)
Foto tradicional - EU !
Foto tradicional - EU !
O Blog agora é pagerank 3 !
Banner comemorativo lateral

Alguns Vídeos:

Links: http://www.youtube.com/watch?v=hcswZ-GTeho e http://www.youtube.com/watch?v=EKwjLvaqmdc

Um abraço a todos os meus amigos e leitores do blog ;)

Google Bookmarks Twitter Yahoo Messenger Orkut Hotmail Google Gmail Delicious Share

Leia também:


[Rafael Biriba] Aniversário de 2 anos do blog tem direito à comemoração

Saturday, February 5th, 2011

Hoje dia 05/fevereiro, meu blog comemora seus 2 anos de existência…

Como eu já havia avisado, esse ano tivemos mais uma festa do blog e neste post você poderá conferir alguns vídeos e fotos de como foi… :)   Se você ainda não viu, veja aqui a festa de 1 ano do blog.

Antes de mostrar os vídeos e fotos, gostaria de deixar alguns agradecimentos:

  • A você visitante e leitor que vem acompanhando já há algum tempo as coisas que escrevo aqui…
  • A você que comenta que contribui ainda mais nos meus posts, comentando e respondendo comentários.
  • Aos amigos, principalmente os da Globo.com que me motivam ( e muito ) a continuar escrevendo no blog… (Apesar de eu não ter ainda 3000 visitar ao dia. Mas @peleteiro, um dia vou conseguir !!! ;) )
  • Agradecer a todos que clicam nos anúncios do meu blog. Vocês não fazem idéia de como alguns trocados podem ajudar a pagar o servidor e outros custos do blog ;) (Inclusive ajudou a pagar a festa :) )

Aproveito a oportunidade também para compartilhar mais uma excelente notícia. Desde o finalzinho de Janeiro o blog é pagerank 3 !!! :)

E para quem não sabe, pagerank é usado pelo Google para ajudar a determinar a relevância de uma página.

Com isso, teoricamente se eu postar sobre um determinado assunto, e algum outro blog com pagerank menor postar sobre o mesmo assunto, o meu blog deveria aparecer primeiro nos resultados de busca. Logicamente que muitos outros fatores são levados em consideração e o pagerank é um deles. Por isso é algo importante. Leia mais sobre isso no wiki.

Agora, vamos recordar um pouco mais da festa de 2 anos do blog:

Album de Fotos:

Confusão para pegar os últimos pedaços de bolo
O bolo ;)
Parte da galera que já não aguentava mais comer...
Parte da galera que já não aguentava mais comer...
2 anos de blog :)
2 anos de blog :)
Mais de 20 pessoas passaram pela sala :)
Foto tradicional - EU !
Foto tradicional - EU !
O Blog agora é pagerank 3 !
Banner comemorativo lateral

Alguns Vídeos:

Links: http://www.youtube.com/watch?v=hcswZ-GTeho e http://www.youtube.com/watch?v=EKwjLvaqmdc

Um abraço a todos os meus amigos e leitores do blog ;)

Google Bookmarks Twitter Yahoo Messenger Orkut Hotmail Google Gmail Delicious Share

Leia também:


[Rafael Biriba] Google tenta provar que o Bing utiliza mesmo seu mecanismo de busca

Wednesday, February 2nd, 2011

www.bing.com X www.google.com

No dia 2 de fevereiro/2011 o Google postou em seu blog oficial um artigo que prova que os resultados do Bing são os mesmo que os do Google.

A suspeita vem desde outubro de 2010, quando os primeiros resultados das buscas pelo google, começaram a aparecer no topo das buscas do bing.

Sugestões de palavras erradas:

Como podemos ver nas imagens acima, o google logo mostra uma possível correção da palavra (“tarsorrhaphy”) e aponta alguns links como wikipedia por exemplo. Já o Bing mostra direto o resultado da sugestão feita pelo google… Como ele conseguiu isso, se a palavra digitada não foi essa ?

Adicionando novas buscas ao google:

Para garantir e fundamentar a teoria, o google fez um experimento com 100 buscas que os usuários jamais fariam, como uma sequência de caracteres aleatórios (“hiybbprqag”).

A partir disso, eles cadastraram manualmente alguns links únicos para cada sequência de caracteres… E adivinha só o que aconteceu ? Veja pelas imagens abaixo:

Como você pode ver, as buscas inseridas manualmente pelos técnicos do google apareceram nos resultados do bing.

O teste feito com 20 engenheiros utilizando laptops com windows, internet explorer 8 e barra de tarefas do bing confirmou a suspeita de que o navegador e a barra de tarefas poderiam estar enviando informações das buscas para a Microsoft.

Fonte: http://googleblog.blogspot.com/2011/02/microsofts-bing-uses-google-search.html

Mas a batalha não acaba por aí…

De acordo com a matéria do G1 tecnologia, o vice-presidente da microsoft Harry Shum negou que o bing estivesse imitando as buscas do google. “Esses (os casos de plágio assinalados pelo Google) foram alguns poucos exemplos elaborados de forma muito criativa”, disse Shum.

Shum disse também que gostaria que o Google tivesse entrado em contato com a Microsoft antes de fazer essas acusações publicamente. Se o google estiver errado, certamente vai ter que pagar alguma indenização por prejudicar a imagem do produto Bing. Por isso a batalha ainda não terminou…

E agora ?

Na minha opnião, acho que o experimento do google foi muito convincente, mas também não acredito que a Microsoft faria algo tão baixo nível. O jeito agora é ficar mesmo esperando pelo final dessa história, que pelo nível de como as coisas estão acontecendo (acusações públicas e etc..) vai ser jurídica e um pouco cara ($$) para o lado perdedor… =s

Google Bookmarks Twitter Yahoo Messenger Orkut Hotmail Google Gmail Delicious Share

Leia também:


[Rafael Biriba] Google tenta provar que o Bing utiliza mesmo seu mecanismo de busca

Wednesday, February 2nd, 2011

www.bing.com X www.google.com

No dia 2 de fevereiro/2011 o Google postou em seu blog oficial um artigo que prova que os resultados do Bing são os mesmo que os do Google.

A suspeita vem desde outubro de 2010, quando os primeiros resultados das buscas pelo google, começaram a aparecer no topo das buscas do bing.

Sugestões de palavras erradas:

Como podemos ver nas imagens acima, o google logo mostra uma possível correção da palavra (“tarsorrhaphy”) e aponta alguns links como wikipedia por exemplo. Já o Bing mostra direto o resultado da sugestão feita pelo google… Como ele conseguiu isso, se a palavra digitada não foi essa ?

Adicionando novas buscas ao google:

Para garantir e fundamentar a teoria, o google fez um experimento com 100 buscas que os usuários jamais fariam, como uma sequência de caracteres aleatórios (“hiybbprqag”).

A partir disso, eles cadastraram manualmente alguns links únicos para cada sequência de caracteres… E adivinha só o que aconteceu ? Veja pelas imagens abaixo:

Como você pode ver, as buscas inseridas manualmente pelos técnicos do google apareceram nos resultados do bing.

O teste feito com 20 engenheiros utilizando laptops com windows, internet explorer 8 e barra de tarefas do bing confirmou a suspeita de que o navegador e a barra de tarefas poderiam estar enviando informações das buscas para a Microsoft.

Fonte: http://googleblog.blogspot.com/2011/02/microsofts-bing-uses-google-search.html

Mas a batalha não acaba por aí…

De acordo com a matéria do G1 tecnologia, o vice-presidente da microsoft Harry Shum negou que o bing estivesse imitando as buscas do google. “Esses (os casos de plágio assinalados pelo Google) foram alguns poucos exemplos elaborados de forma muito criativa”, disse Shum.

Shum disse também que gostaria que o Google tivesse entrado em contato com a Microsoft antes de fazer essas acusações publicamente. Se o google estiver errado, certamente vai ter que pagar alguma indenização por prejudicar a imagem do produto Bing. Por isso a batalha ainda não terminou…

E agora ?

Na minha opnião, acho que o experimento do google foi muito convincente, mas também não acredito que a Microsoft faria algo tão baixo nível. O jeito agora é ficar mesmo esperando pelo final dessa história, que pelo nível de como as coisas estão acontecendo (acusações públicas e etc..) vai ser jurídica e um pouco cara ($$) para o lado perdedor… =s

Google Bookmarks Twitter Yahoo Messenger Orkut Hotmail Google Gmail Delicious Share

Leia também: