Revisão de código: você faz?

No livro “97 things every programmer should know” Mattias Karlsson diz que “Você deve fazer revisão de códigos. Porquê? Porque elas tendem a aumentar a qualidade do código e reduzir o índice de erros”. Pode parecer óbvio, mas você lembra da última vez que revisou seu código?

Melhorando o código.

Revisar seu código é uma excelente forma de melhorar trechos que foram escritos há muito ou até mesmo pouco tempo atrás, há sempre pequenos detalhes que passam desperbecidos no momento em que você estava programando.

Porém o objetivo da revisão não é apenas melhorar ou corrigir o código programado e sim compartilhar ideias e definir um “guia” comum de como programar. Vale ressaltar que a revisão de código não deve ser vista como uma mesa julgadora, é apenas um processo que visa melhorar o sistema como um todo. Seja gentil, os comentários devem ser construtivos.

Vá com calma, fera.

Vá com calma, fera.

Evitando erros

Outra vantagem da revisão de código é detectar trechos que possam vir a causar futuros problemas, um delete sem where, um loop infinito, um objeto não inicializado etc. Uma revisão de código bem feita pode reduzir drasticamente o número de erros além de facilitar o trabalho do tester.

Jesus Cristo, o que é isso?

Jesus Cristo, o que é isso?

Dicas para uma boa revisão de código

No livro, Mattias descreve várias dicas para se fazer uma boa revisão de código:

  • Gaste um dia da semana para fazer uma revisão de código;
  • Escolha pessoas para se especializar em determinado tipo de revisão. Por exemplo, escolha uma pessoa que irá verificar as consultas, outra para exceções, uma terceira para as funcionalidades e assim por diante;
  • Envolva os estagiários ou recém contratados. Pessoas que estão há pouco tempo tendem a ter visões diferentes sobre determinado assunto, trazê-los para revisão pode resultar em novas perspectivas e novas ideias;
  • Revisões podem ser mais rápidas se o time possuir uma ferramenta que faça checagem automática de determinadas convenções de código. Desta forma, a indentação nunca será um assunto a ser discutido durante uma revisão.
Indenta com tab Não, é com espaço

Indenta com tab
Não, é com espaço

Conclusão

A revisão de código pode parecer chata e improdutiva, porém uma ou duas horas gastas por semana pode resultar numa melhora significativa no código escrito e reduzindo o número de possíveis bugs e falhas.

Programar é praticar.

Muitos me perguntam como eu me tornei “fera” (não que eu seja, longe disso) em programação e sempre respondo: praticando.

É muito comum eu ver na faculdade pessoas que acham que ao entrar no curso já se tornarão programadores de verdade, algumas que logo irão se sentir frustradas e trocarão de curso no fim do semestre. É bem verdade que pode haver outras causas, professores que não motivam os alunos ou uma grade curricular fraca (particularmente na faculdade onde estudo eu a considero, sorte que já sabia programar quando ingressei).

frustration-600x450_1-100521350-orig
Pois bem, além de fazer os exercícios e tarefas propostos pelo professor é sempre bom procurar desafios que não são vistos em sala. Você pode procurar por listas de exercícios, procurar sistemas ou algoritmos prontos e analisar seu código fonte (há milhares no github).

gato_guitar

Programar é como tocar violão, praticar muito é essencial.

Na medida em que você vai adquirindo prática e confiança parta para desafios mais complexos. Aprendeu a trabalhar com matrizes? Desenvolva um sudoku ou jogo da velha. Programar jogos (mesmo que seja no console) é uma ótima maneira de utilizar tudo o que você aprendeu.

Por fim, se você está começando agora não desista! Lembre-se que os erros fazem parte do processo e ajudam na sua formação.

Se você quer aprender a programar on-line de forma interativa, existem vários sites que podem te auxiliar:

http://www.codecademy.com/

http://www.codeschool.com/

http://www.khanacademy.org/cs
Abraço e até a próxima.

Capturando imagens da webcam com Python

Rapaz, há quanto tempo não posto aqui. 😛

Me surgiu a ideia de capturar pela webcam do notebook a imagem de quem logou no meu computador (futuramente tentarei implementar caso tente logar sem sucesso). Fuçando no google achei este exemplo usando PyGame.

#! /usr/bin/python

import pygame, sys
import pygame.camera
import time

WEBCAM_DIR = "/home/simasware/Imagens/Webcam"

pygame.init()
pygame.camera.init()
cam = pygame.camera.Camera("/dev/video0", (640,480))

# pegando foto da webcam

cam.start()
image = cam.get_image()
cam.stop

timestamp = time.strftime("%d-%m-%Y_%H-%M-%S", time.localtime())
filename = "%s/%s.jpg" % (WEBCAM_DIR, timestamp)

# salvando a imagem
pygame.image.save(image, filename)

print "Salvo"

Pensei em colocar no topo da imagem capturada a data e hora. Pesquisando achei a função blit:


# imprime a data/hora na imagem

font = pygame.font.SysFont("monospace",15) #carrega fonte
label = font.render(timestamp, 1, (255,255,255)) #renderiza
image.blit(label, (16,16)) #imprime o texto na imagem capturada pela webcam

Pra instalar o PyGame no Ubuntu basta rodar no bash:


sudo apt-get install python-pygame

Resultado:

18-10-2014_00-29-04

Resolvendo problema de “variant or safe array is locked” no Delphi

Boa noite!

Pode acontecer em alguns casos ao carregar um arquivo XML pelo Delphi o erro de variant or safe array is locked. O problema ocorre devido o arquivo MIDAS.DLL estar desatualizado.

Caso você atualize o arquivo e mesmo assim o problema persiste, na unit onde você faz uso do Client Data Set com xml basta adicionar a uses midaslib.

Fácil de resolver, porém me levou um certo tempo para descobrir. 😉

Abraços e até a próxima.

Pluralização em PT-BR – Rails

Ao criar-se um model/controller/view no Rails é comum o framework efetuar a pluralização do nome escolhido. Porém como a pluralização padrão segue as regras da língua inglesa, algumas palavras podem sairem erradas.

Para contornar o problema basta adicionar as regras do nosso idioma no arquivo inflections.rb presente nas pasta config/initializers.
Abaixo segue um modelo de inflections que encontrei na web

# Be sure to restart your server when you modify this file.

# Add new inflection rules using the following format
# (all these examples are active by default):
# ActiveSupport::Inflector.inflections do |inflect|
#   inflect.plural /^(ox)$/i, '\1en'
#   inflect.singular /^(ox)en/i, '\1'
#   inflect.irregular 'person', 'people'
#   inflect.uncountable %w( fish sheep )
# end
#
# These inflection rules are supported but not enabled by default:
# ActiveSupport::Inflector.inflections do |inflect|
#   inflect.acronym 'RESTful'
# end
ActiveSupport::Inflector.inflections do |inflect|
inflect.clear

#general rule: add "s" to the end of the word
#casa - casas
inflect.plural /^([a-zA-z]*)a$/i, '\1as'
#pe - pes
inflect.plural /^([a-zA-z]*)e$/i, '\1es'
#no example
inflect.plural /^([a-zA-z]*)i$/i, '\1is'
#carro - carros
inflect.plural /^([a-zA-z]*)o$/i, '\1os'
#pneu - pneus
inflect.plural /^([a-zA-z]*)u$/i, '\1us'

#if word ends in "r" or "z", add "es"
#luz - luzes
#flor - flores
#arroz - arrozes
inflect.plural /^([a-zA-z]*)r$/i, '\1res'
inflect.plural /^([a-zA-z]*)z$/i, '\1zes'

#if word ends in "al", "el", "ol", "ul": trade "l" with "is"
#farol - farois
#hospital - hospitais
#telemovel - telemoveis
#pincel - pinceis
#anzol - anzois
inflect.plural /^([a-zA-z]*)al$/i, '\1ais'
inflect.plural /^([a-zA-z]*)el$/i, '\1eis'
inflect.plural /^([a-zA-z]*)ol$/i, '\1ois'
inflect.plural /^([a-zA-z]*)ul$/i, '\1uis'

#if word ends in "il" and has tónic accent in last syllable, trade "il" with "is"
#cantil - cantis
inflect.plural /^([a-zA-z]*)il$/i, '\1is'

#TODO
#if word ends in "il" and has tónic accent in penultimate syllable, trade "il" with "eis"
#no example

#if word ends in "m", trade "m" with "ns"
#armazem - armazens
#portagem - portagens
inflect.plural /^([a-zA-z]*)m$/i, '\1ns'

#TODO
#if word ends in "s" and has one silable, trade "s" with "es"
#no example
#inflect.plural /^([a-zA-z]*)e$/i, '\1es'

#TODO
#if word ends in "x" stays the same
#no example... professor X, maybe?
#inflect.plural /^([a-zA-z]*)x$/i, '\1x'

#if word ends in "ão", there are three ways of plural: ãos, ães, ões
#NOTE: hard to detect, so I'll use the most common case
#and then use irregular cases for the others. if someone knows of
#more cases please add to the list & mail me. thanks!
#
#cão - cães
#colchão - colchões
#portão - portões
#pão - pães
#alemão - alemães
#chão - ?
#pilhão - pilhões
#canhão - canhões
#bidão - bidões
#mão - mãos
inflect.plural /^([a-zA-z]*)ao$/i, '\1oes'
inflect.irregular 'cao', 'caes'
inflect.irregular 'pao', 'paes'
inflect.irregular 'mao', 'maos'
inflect.irregular 'alemao', 'alemaes'
inflect.irregular 'perfil_permissao', 'perfil_permissoes'

############################
#singularize rules #
############################

#pes - pe
#carros - carro
#pneus - pneu
inflect.singular /^([a-zA-z]*)as$/i, '\1a'
inflect.singular /^([a-zA-z]*)es$/i, '\1e'
inflect.singular /^([a-zA-z]*)is$/i, '\1i'
inflect.singular /^([a-zA-z]*)os$/i, '\1o'
inflect.singular /^([a-zA-z]*)us$/i, '\1u'

#luzes - luz
#flores - flor
#arrozes - arroz
inflect.singular /^([a-zA-z]*)res$/i, '\1r'
inflect.singular /^([a-zA-z]*)zes$/i, '\1z'

#cantis - cantil
inflect.singular /^([a-zA-z]*)is$/i, '\1il'

#farois - farol
#hospitais - hospital
#telemoveis - telemovel
#pinceis - pincel
#anzois - anzol
inflect.singular /^([a-zA-z]*)ais$/i, '\1al'
inflect.singular /^([a-zA-z]*)eis$/i, '\1el'
inflect.singular /^([a-zA-z]*)ois$/i, '\1ol'
inflect.singular /^([a-zA-z]*)uis$/i, '\1ul'

#armazens - armazem
#portagens - portagem
inflect.singular /^([a-zA-z]*)ns$/i, '\1m'

#cães - cão
#colchões - colchão
#portões - portão
#pães - pão
#alemães - alemão
inflect.singular /^([a-zA-z]*)oes$/i, '\1ao'
inflect.singular /^([a-zA-z]*)aes$/i, '\1ao'
inflect.singular /^([a-zA-z]*)aos$/i, '\1ao'

# inflect.plural /^(ox)$/i, '\1en'
# inflect.singular /^(ox)en/i, '\1'
# inflect.irregular 'person', 'people'
# inflect.uncountable %w( fish sheep )
end

Espero que lhe seja útil 😀

Abraço e até a próxima.

Criando threads com Delphi

Fala galera! Irei iniciar 2014 com um post sobre threads. Mas o que são threads?

Segundo a Wikipedia, threads são “uma forma de um processo dividir a si mesmo em duas ou mais tarefas que podem ser executadas concorrentemente”. Legal, mas no que uma thread pode me ajudar?

Usos

Threads geralmente são utilizadas para executar uma tarefa que possa demandar muito tempo, podemos utilizar como exemplo o backup de uma base de dados.

A vantagem de se utilizar uma thread é que ela executa enquanto você pode utilizar outras funções da sua aplicação, diferente das vias normais onde você teria de esperar o seu programa executar toda a ação.
Continuar lendo

Informações do tempo com o Open Weather [Exemplo em Python]

Há algum tempo atrás, postei aqui no blog um artigo de como usar a Google Weather API, só que infelizmente esse projeto foi descontinuado. Na busca de uma nova forma de obter essas informações facilmente acabei encontrando o Open Weather.

Open Weather

O Open Weather é um projeto que visa disponibilizar informações do clima de praticamente todas as cidades do planeta, com ele é possível obter informações da temperatura atual, nebulosidade, umidade relativa do ar e até mesmo a hora do nascer e pôr do sol!

Utilizando na minha aplicação

Você pode obter as informações de duas formas: JSON e XML. Para obter os dados basta você efetuar uma requisição conforme abaixo:

Retornando em JSON:

http://api.openweathermap.org/data/2.5/weather?q=Itajai,BR

Retornando em XML:

http://api.openweathermap.org/data/2.5/weather?q=Itajai,BR&mode=xml

Os exemplos acima são por nome e país, mas existem também a possibilidade de se fazer a requisição utilizando a latitude e longitude:

http://api.openweathermap.org/data/2.5/weather?lat=35&lon=139

O Open Weather também possui suporte multi-línguas, para retornar os dados em português basta adicionar na URL a query string &lang=pt

http://api.openweathermap.org/data/2.5/forecast/daily?id=524901&lang=pt

Por padrão, o Open Weather retorna as informações de temperatura em Kelvin, para obter em Celsius basta adicionar na URL a query string units:

http://api.openweathermap.org/data/2.5/forecast/daily?id=524901&units=metric&

Exemplo em Python

Para exemplificar melhor o uso do Open Weather, aqui vai um pequeno script em Python onde leio os dados no formato JSON.


import urllib2 #para efetuar a requisicao
import json #para ler o JSON

data = urllib2.urlopen('http://api.openweathermap.org/data/2.5/weather?q=Itajai,BR&units=metric&lang=pt')
html = data.read()
weather = json.loads(html)
temperatura = str(weather['main']['temp']) + ' graus'
nebulosidade = str(weather['clouds']['all']) + ' %'
umidade = str(weather['main']['humidity']) + ' %'
print "Em Itajai %s. Nebulosidade: %s. Umidade relativa do ar: %s." % (temperatura, nebulosidade, umidade)

Por hoje é só!
Abraço