terça-feira, 29 de dezembro de 2009

E a Presidência da Câmara de Vereadores de Carazinho goes to...

A mais de um ano atrás eu postei aqui o "grande empenho e esforço" de um vereador aqui da cidade, na aprovação de "medidas úteis e de extrema importância" ao bem estar social.
Qual não foi a surpresa pela manhã ao ver estampado na capa do jornal que ele é o novo Presidente da Câmara de Vereadore aqui da cidade.

Parabéns a ele e a quem botou ele lá pois somente o merecimento nos faz subir na vida.

</ironia>

sexta-feira, 17 de julho de 2009

EPIC FAIL 2: Mais H4x0r Ainda

Lembra do nosso "amigo mestre em hackeamento de localhost" ? No novo capitulo da nossa minisérie apresentamos alguém a altura, disposto a tudo para vencer o duelo:


Será que alguém sai vivo desse duelo mortal entre duas mentes "geniais" ?

segunda-feira, 6 de julho de 2009

Notas sobre o OpenDNS

Estou usando o serviço OpenDNS para resolução de nomes devido aos bons comentários espalhados pela internet. Para começar a usar simplesmente mandei eles para o meu resolv.conf, reiniciei o serviço de rede e tudo tranquilo. Ignorei aquela conta gratuita que eles sugerem que você crie.
Ontem a noite estava brincando com algumas ferramentas do samba (nmblookupt, smbclient e smbtree) e ao rodar o smbtree percebi que ele, além de listar corretamente a máquina windows na minha rede também tentava consultar/listar um IP externo totalmente estranho e chovia erro no terminal. Utilizando o nautilus ele nem sempre conseguia listar o grupo de trabalho e quando chegava nesse ponto não ia adiante para mostrar os compartilhamentos do windows.
Pesquisando na internet descobri que o problema era.... o OpenDNS (ou não, como diria Caetano :P ). O que acontece é que o smbtree e o nautilus consultam o OpenDNS e como ele não é capaz de resolver nomes internos ferra tudo.
Para solucionar o problema basta seguir esses passos (sabe aquela conta gratuita que eu ignorei ? pois é ...). Se você tem IP dinâmico será necessária usar uma ferramenta que mantenha o ip do seu cadastro atualizado. Eles sugerem o ddclient, como eu já uso ele para manter o Dyndns atualizado ta tranquilo. Depois disso o smbtree parou de tentar passear onde não deve e o nautilus voltou a funcionar.

sexta-feira, 12 de junho de 2009

Livro de redes

Conheci o blog do Gustavo através de um anúncio no br-linux sobre um livro que ele esta escrevendo. O livro esta licensiado sob a Creative Commons e se encontra em uma versão beta porém, apesar disso, o conteúdo é bom, detalhado e agradável de ler. Segundo ele mesmo, a versão final sairá no inicio de julho e, como agora, estará disponível para download gratuitamente (se ele colocar link para doações eu pretendo fazer isso com certeza). Nada mais justo do que divulgar o trabalho dele e recomendar essa ótima iniciativa àqueles que estão querendo um pouco mais de conhecimento em redes. Além do livro, vale a pena passear pelo blog dele, o qual eu já assinei os feeds.

terça-feira, 5 de maio de 2009

Filme 2012: Doomsday

Se vocês estiverem em um dia de puro masoquismo mental, peguem esse filme para assistir.
Há muito tempo que eu não via algo tão ruim. Filme classe B consegue ser melhor.
A cronologia é uma catástrofe, as interpretações horríveis, sendo a pior a ex-esposa do estudioso de vulcões-abalos-sismicos-tremores-de-terra-em-geral que só consegue se sobressair quando interpreta a personagem morta, ou seja, não fala não anda e só precisa controlar a respiração para que a bagaça pareça verdade. Sem contar os "defeitos" especiais "a lá" chaves (e esse ainda é capaz de fazer melhor heheheheh). Em dado momento, durante uma chuva de granizos gigantes, o galão-bonitão-que-não-pegou-nem-a-feia-no-filme começa a fazer zigue-zague na pista, como coisa que fosse possível desviar das pedras e você telespectador percebe que nenhuma delas pega no carro (o mano dos efeitos era ruim viu) até que UMA acerta, atravessa o vidro e o motorista. Lindo. :/

Mas por que peguei esse filme ? Bom, o titulo né. O assunto 2012 desperta minha curiosidade, não que eu realmente acredite no fim do mundo, mas a questão do calendário maia, alinhamento de planetas e "etecetaras" são interessantes.

Ainda bem que para salvar a história esta para sair um em julho desse ano com um elenco e direção melhores.

Só me resta esperar.

quarta-feira, 18 de março de 2009

Exemplo de CRUD com Django

O django não tem um comando que gere automagicamente um CRUD para você. Porém com poucas linhas de código e generic views é possivel fazer isso rapidamente. No exemplo que segue eu vou utilizar o meu módulo de localidade que corresponde aos models Cidade e Estado. O código é simples e depois é só adaptar à sua necessidade. Então vamos por partes:

No urls.py do projeto eu verifico o modulo selecionado e dou um include do urls.py da app:
from django.conf.urls.defaults import *
from django.conf import settings

urlpatterns = patterns('',
(r'^localidade/', include('localidade.urls')),
)
No urls.py da app foram criadas 4 regras para listagem, inserção, edição e exclusão e registros. O model que será trabalhado é passado via parâmetro e para edição e exclusão é informada a chave (id):
from django.conf.urls.defaults import patterns

urlpatterns = patterns('localidade.views',
(r'^lista/(?P<model>\w+)/$', 'lista'),
(r'^adiciona/(?P<model>\w+)/$', 'adiciona_ou_atualiza'),
(r'^atualiza/(?P<model>\w+)/(?P<key>\d+)/$', 'adiciona_ou_atualiza'),
(r'^remove/(?P<model>\w+)/(?P<key>\d+)/$', 'remove'),
)
O views.py implementa os 4 métodos utilizando generic views:
from django.http import Http404
from django.views.generic.list_detail import object_list
from django.views.generic.create_update \
import create_object, update_object, delete_object
from django.db.models import get_model

def lista(request, model):
model_object = get_model('localidade', model)
if model_object:
model_list = model_object.objects.all()
else:
raise Http404()

return object_list(request, queryset=model_list)

def adiciona_ou_atualiza(request, model, key=None):
model_object = get_model('localidade', model)
if model_object:
if key:
return update_object(
request,
model=model_object,
object_id=key,
post_save_redirect='/localidade/lista/%s/' % model,
)
else:
return create_object(
request,
model=model_object,
post_save_redirect='/localidade/adiciona/%s/' % model,
)
else:
raise Http404()

def remove(request, model, key):
model_object = get_model('localidade', model)
if model_object:
return delete_object(
request,
model=model_object,
object_id=key,
post_delete_redirect='/localidade/lista/%s/' % model,
template_name='object_confirm_delete.html',
)
else:
raise Http404()
Algumas observações no caso das views. O get_model procura pelo model passado na url baseado na app que você informa (é uma mão na roda esse método). O object_list procura um template com o nome model_list.html (cidade_list.html ou estado_list.html) e disponibiliza um object_list para você percorrer e exibir os valores. O create_object e o update_object procuram por um model_form.html (cidade_form.html ou estado_form.html) e disponibiliza uma variável form para que você possa exibir o formulário sem trabalho. Todos os métodos fazem a busca do template na pasta de templates da app. Os templates ficam assim:

_list.html
<html>
{% if object_list %}
<table>
<thead>
<tr>
<th>Id</th>
<th>Nome</th>
</tr>
</thead>
<tbody>
{% for object in object_list %}
<tr>
<td>{{ object.id }}</td>
<td>{{ object.nome }}</td>
<td>
<a href="{% url localidade.views.remove "object" object.id %}">
Excluir
</a>
</td>
<td>
<a href="{% url localidade.views.adiciona_ou_atualiza "object" object.id %}">
Alterar
</a>
</td>
</tr>
{% endfor %}
</tbody>
</table>
{% else %}
<p>Sem registros para listar</p>
{% endif %}
</html>
_form.html:
<html>
<form action="" method="POST">
{{ form.as_p }}
<input type="submit" value="Gravar" />
</form>
</html>
O delete_object, quando via GET, procura por um model_confirm_delete.html. Como em todos os casos eu tenho efetuado a exclusão via GET e ficaria repetitivo ter em cada pasta de template de cada aplicação um template idêntico, criei apenas um na pasta de templates do projeto com o nome object_confirm_delete.html com o seguinte conteúdo:
<html>
<form method='post' action=''>
<p>Confirma a exclusão do registro ? </p>
<input type="submit" />
</form>
</html>
E esta feito. Você tem o seu CRUD pronto. Com base nisso, é possível criar generic views e fazer com que seu crud fique ainda mais compacto sem perder funcionalidade, legibilidade e facilidade na manutenção.