Programa em Python que verifica números primos em um intervalo de 1 a 100.

#!/usr/bin/env python
#-*- encoding: utf-8 -*-

# Autor: Thiago Monteiro
# Data: 10/10/2012
# Local: Goiânia/Goiás/Brasil

import os, sys

def is_prime(number):
	divisions = 0
	response = False
	number = int(number)
	if number:
		for i in range(1, number + 1):
			if number % i == 0:
				divisions = divisions + 1
			if divisions == 2:
				response = True
	if divisions > 2:
		response = not response
	return response

if __name__ == '__main__':
	while(True):
		os.system('clear')
		print 'PROGRAMA QUE VERIFICA E MOSTRA QUAIS OS NÚMEROS PRIMOS DE UM INTERVALO NUMÉRICO DE 1 ATÉ 100.'
		quantidade = int( raw_input('QUANTIDADE DE NÚMEROS A SEREM VERIFICADOS: ') )

		if quantidade == 0:
			break

		for numero in range(1, quantidade + 1):
			resposta = is_prime(numero)
			if resposta:
				print '%d => É INTEIRO' % numero
			else:
				print numero
		print 'FINALIZAR => Informe 0 como sendo a quantidade de números a serem verificados.'
		print 'CONTINUAR => Pressione a tecla ENTER.'
		sys.stdin.read(1)
	print '\n\nO autor (Thiago Monteiro) fica agradecido por você utilizar esse programa.'
	print 'Para mais informações acesse meu blog http://www.bytespace.wordpress.com\n'
	print '=> Pressione ENTER para finalizar a execução do programa.'
	sys.stdin.read(1)
	os.system('clear')

Conversor de Temperaturas em Python

Olá pessoal!
Segue um simples script na maravilhosa linguagem de programação Python para converter temperaturas de graus Celsius para Fahrenheit e vice-versa.

#!/usr/bin/env python
#-*- encoding: utf-8 -*-

# Autor: Thiago Monteiro
# Data: 10/10/2012
# Local: Goiânia/Goiás/Brasil

import os, sys

def celsius_to_fahrenheit(celsius):
	'''	Função: celsius_to_fahrenheit
		Argumentos:
			1 - celsius (temperatura em graus celsius)
		Retorno:
			fahrenheit (temperatura em graus fahrenheit)
	'''
			
	fahrenheit = (9 / 5) * celsius + 32
	return fahrenheit


def fahrenheit_to_celsius(fahrenheit):
	celsius = (9 / 5) * fahrenheit - 32
	return celsius


if __name__ == '__main__':
	while(True):
		os.system('clear')
		print 'CONVERSOR DE TEMPERATURAS'
		print '''
			\rCOMO USAR:
			\rAo informar uma temperatura use por exemplo 1C para 1 grau Celsius ou 1F para 1 grau Fahrenheit.
			\rPara finalizar a execução do programa informe sair como a temperatura a ser convertida.
		'''
		print 'INFORME OS DADOS A SEGUIR:'
		temperatura_a_converter = raw_input('1 - [TEMPERATURA A SER CONVERTIDA] => ')
		temperatura_convertida = None
		funcao_de_conversao = None
		escala_temperatura = None
		if temperatura_a_converter.lower() == 'sair':
			break
		if temperatura_a_converter[:-1].isdigit():
			if temperatura_a_converter[-1].upper() == 'C':
				funcao_de_conversao = celsius_to_fahrenheit
				escala_temperatura = 'F'
			elif temperatura_a_converter[-1].upper() == 'F':
				funcao_de_conversao = fahrenheit_to_celsius
				escala_temperatura = 'C'
			else:
				print '''
					\rERRO => A escala informada para a temperatura é inválida! 
					\rComo escala informe C para graus Celsius ou F para Fahrenheit.
				'''
		else:
			print '''
				\rERRO => A temperatura informada é inválida!
				\rUma temperatura válida consiste de um número inteiro seguido de C para graus Celsius ou F para Fahrenheit.
			'''
		if funcao_de_conversao:
			temperatura_convertida = funcao_de_conversao( int(temperatura_a_converter[:-1]) )
		if temperatura_convertida:
			print '2 - [TEMPERATURA CONVERTIDA] => %s%s' % (temperatura_convertida, escala_temperatura)
		print '=> Para FINALIZAR a execução do programa digite sair como temperatura a ser convertida ou a tecla ENTER para CONTINUAR.'
		sys.stdin.read(1)

O que é uma localização (locale)?

De maneira bem simplista:
Uma localização (locale) é uma região do planeta Terra apelidada por um código.
Esse código por sua vez representa um conjunto de variáveis tais como: moeda, fuso horário e etc. Na composição do código é representado o idioma e a região.

Por exemplo:

en_US – inglês dos Estados Unidos da América

en_GB – inglês da Grã-Bretanha

en_CA – inglês do Canadá

en_AU – inglês da Austrália

Apesar do inglês ser o idioma dessas regiões, há diferenças na moeda, no fuso horário e etc.

Abraços a todos.

Como criar um banco de dados latin1(iso8859-1) no PostgreSQL?

Problema: Criar um banco de dados ISO8859-1 no PostgreSQL.

Contexto:
Meu Ubuntu 9.10 está configurado com o idioma inglês dos Estado Unidos da América e com encoding ISO8859-1/LATIN1 para suportar os caracteres acentuados do idioma português.

Solução:
A solução é composta de 3 passos.
São eles:
1 – Verificar quais as localizações (se tiver dúvidas quanto a este termo há um post neste blog sobre ele) disponíveis no Ubuntu.
2 – Criar o banco de dados.
3 – Verificar a codificação de caracteres utilizada no editor de texto.

1 – Verificando as localizações disponíveis no Ubuntu

No shell (prompt de comando) digite: locale -a
Será apresentada uma lista de locales disponíveis. No meu caso havia en_US.iso88591, isso significa suporte ao inglês dos Estados Unidos da América e caracteres do alfabeto latino. Isso me poupa a dor de cabeça de tentar criar um banco de dados pt_BR.iso88591 sem meu sistema operacional dar suporte ao mesmo.
2 – Criando o banco de dados

No shell digite:
sudo su – postgres
Crie o banco de dados com:
createdb testebd –encoding ISO88591 –tablespace pg_default –lc-collate en_US.iso88591 –lc-ctype en_US.iso88591 –template template0
ou digite no shell:
psql -h localhost -U postgres -W
para logar no cliente de linha de comando do PostgreSQL.
Crie o banco com:
CREATE DATABASE testebd ENCODING ‘ISO88591′ LC_CTYPE=’en_US.iso88591′ LC_COLLATE=’en_US.iso88591’ TEMPLATE template0;

3 – Verificando a codificação de caracteres utilizada no editor de texto

Por fim, quando criar um programa em um editor de texto verifique se a codificação utilizada está de acordo com a do banco de dados. em questão. Não adianta nada criar um banco de dados en_US.iso88591 e salvar o arquivo do script com caracteres em UTF-8.

Abraço a todos.

Como configurar LATIN1 (ISO8859-1) no Ubuntu

Se o idioma escolhido foi português do Brasil faça:
echo pt_BR.ISO-8859-1 ISO-8859-1 > /var/lib/locales/supported.d/local
echo LANG=”pt_BR.ISO-8859-1″ > /etc/default/locale
echo LANG=”pt_BR.ISO-8859-1″ >> /etc/environment
locale-gen -purge
dpkg-reconfigure locales

Senão se o idioma foi o inglês americano
basta substituir na lista de comandos anterior o pt_BR por en_US.
Senão substitua pt_BR pelo código do idioma que você escolheu.

Gerador de senhas em C

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

/*
*
* passwdgen 1.0
*
* Copyright (C) 2009 Free Software Foundation, Inc.
* License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>.
* This is free software: you are free to change and redistribute it.
* There is NO WARRANTY, to the extent permitted by law.
*
* Autor: Thiago Alexandre Martins Monteiro
* Local: Goiania/Goias/Brasil
* Data: 16/04/2011
*
* Este programa tem como objetivo gerar senhas simples. Tenho plena certeza de que este
* codigo pode e deve ser melhorado. Respeito a criatividade dos outros e mantenha a autoria.
*
* OBS: Esse programa pode ser portado para Windows com pouco esforco.
*
* Compile com: gcc passwdgen.c -o passwdgen
*/

/* Protótipo das funções */
int validarComprimentoSenha(int len);
int validarQuantidadeDeVezes(int vezes);
void mostrarAjuda(void);
void mostrarVersao(void);
void gerarSenha(int len);

int main(int argc, char *argv[])
{
	int len = 8; /* comprimento da palavra */
	int vezes;
	int register i = 0;

	system("clear"); /* no RuWindows use system(“cls”); */
	puts("\033[32m\tPASSWDGEN (Gerador de Senhas)\033[0m\n");

	/* Inicializa gerador de números randômicos com a hora atual do sistema */
	srand(time(NULL));
	
	if (argc != 2) {
		puts("\033[34mProcessando...\033[0m\n");
		sleep(2);
	}

	switch (argc) {
		case 1:
			gerarSenha(len);
			break;

		case 2:
			if ((strcmp(argv[1], "-h") == 0) || (strcmp(argv[1], "--help") == 0)) {
				mostrarAjuda();
			}

			if ( (strcmp(argv[1], "-v") == 0) || (strcmp(argv[1], "--version") == 0) ) {
				mostrarVersao();
			}
			break;

		case 3:
			/* -l de length (comprimento da senha) */
			if ( (strcmp(argv[1], "-l") == 0) || (strcmp(argv[1], "--length") == 0) ) {
				/* Converte de string para inteiro */
				len = atoi(argv[2]);
				gerarSenha(len);
			}

			/* -a de amount (quantas senhas devem ser geradas) */
			if ( (strcmp(argv[1], "-a") == 0) || (strcmp( argv[1], "--amount") == 0) ) {
				vezes = atoi(argv[2]);
				if ( validarQuantidadeDeVezes(vezes ) )
					exit(1);

				for (i = 0; i < vezes; i++) {
					gerarSenha(len);
				}
			}
			break;

		case 4:
			if (strcmp(argv[1], "-al") == 0) {
				vezes = atoi(argv[2]);
				len = atoi(argv[3]);
			}

			if (strcmp(argv[1], "-la") == 0) {
				len = atoi(argv[2]);
				vezes = atoi(argv[3]);
			}

			if ( validarQuantidadeDeVezes(vezes) ) {
				exit(1);
			}

			for (i = 0; i < vezes; i++) {
				gerarSenha(len);
			}
			break;

		case 5:
			/* -l de length (comprimento da senha) */
			if ( (strcmp(argv[1], "-l") == 0) || (strcmp(argv[1], "--length") == 0) ) {
				/* Converte de string para inteiro */
				len = atoi(argv[2]);
			} else {
				/* -a de amount (quantas senhas devem ser geradas) */
				if ( (strcmp(argv[1], "-a") == 0) || (strcmp( argv[1], "--amount") == 0) ) {
					vezes = atoi(argv[2]);
					if ( validarQuantidadeDeVezes(vezes ) )
						exit(1);
				}
			}

			/* -l de length (comprimento da senha) */
			if ( (strcmp(argv[3], "-l") == 0) || (strcmp(argv[3], "--length") == 0) ) {
				/* Converte de string para inteiro */
				len = atoi(argv[4]);
			} else {
				/* -a de amount (quantas senhas devem ser geradas) */
				if ( (strcmp(argv[3], "-a") == 0) || (strcmp( argv[3], "--amount") == 0) ) {
					vezes = atoi(argv[4]);
					if ( validarQuantidadeDeVezes(vezes ) )
						exit(1);
				}
			}

			for (i = 0; i < vezes; i++) {
				gerarSenha(len);
			}
			break;
		default:
			printf("\n\033[32m\tDigite: passwdgen --help para obter ajuda.\033[0m\n\n");
	}
	puts("");
	return 0;
}

int validarComprimentoSenha(int len)
{
	if (len < 1 || len > 50) {
		printf("\t\033[31mErro: O comprimento da senha e invalido.\n\tComprimentos validos vao de 1 ate 50 caracteres.\033[0m\n\n");
		return 1;
	} else return 0;
}

int validarQuantidadeDeVezes(int vezes) 
{
	if (vezes < 1 || vezes > 1000) {
		printf("\t\033[31mErro: A quantidade de senhas a serem geradas e invalida.\n\tA quantidade de vezes valida \
vai de 1 ate 1000.\033[0m\n\n");
		return 1;
	} else return 0;
}

void mostrarAjuda(void) 
{	
	printf("\n\t\033[34mPASSWDGEN\033[32m\n");
	printf("\n\t\033[34mNOME: passwdgen - gera senhas simples e imprime na saida padrao.\n\033[0m");
	printf("\n\t\033[34mSINOPSE: passwdgen [OPTION] … [NUMBER] …\n\033[0m");
	printf("\n\t\033[34mDESCRICAO: Gera senhas simples e imprime na saida padrao.\033[0m\n");
	printf("\n\t\033[34m -a, --amount\n\t\t Define a quantidade de senhas a serem geradas.\033[0m");
	printf("\n\n\t\033[34m -h, --help\n\t\t Apresenta a tela de ajuda do sistema.\033[0m");
	printf("\n\n\t\033[34m -l, --length\n\t\t Define o comprimento (quantidade de caracteres) da senha.\033[0m");
	printf("\n\n\t\033[34m -v, --version\n\t\t Apresenta o numero de versao do programa.\033[0m");
	printf("\n\n\t\033[34m EXEMPLOS:\033[0m");
	printf("\n\n\t\t\033[34mpasswdgen -a 5\n\t\tGera 5 senhas de 8 caracteres.\033[0m");
	printf("\n\n\t\t\033[34mpasswdgen -l 20\n\t\tGera uma senha de 20 caracteres.\033[0m");
	printf("\n\n\t\t\033[34mpasswdgen -al 3 5\n\t\tGera 3 senhas de 5 caracteres.\033[0m");
	printf("\n\n\t\t\033[34mpasswdgen -la 3 5\n\t\tGera 5 senhas de 3 caracteres.\033[0m");
	printf("\n\n\t\033[34m AUTOR: Thiago Alexandre M. Monteiro\033[0m\n");
	
	return;
}

void mostrarVersao(void) 
{
	printf("\n\t\033[34mpasswdgen 1.0\n\n\tCopyright (C) 2009 Free Software Foundation, Inc. \
		\n\tLicense GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>. \
		\n\tThis is free software: you are free to change and redistribute it. \
		\n\tThere is NO WARRANTY, to the extent permitted by law.\033[0m\n\n");

	return;
}

void gerarSenha(int len) 
{
	int register i;

	char alfabeto[] = {
		'0', '1', '2', '3', '4', '5', '6', '7',
		'8', '9', 'A', 'B', 'C', 'D', 'E', 'F',
		'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N',
		'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V',
		'W', 'X', 'Y', 'X', 'a', 'b', 'c', 'd',
		'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l',
		'm', 'n', 'o', 'p', 'q', 'r', 's', 't',
		'u', 'v', 'w', 'x', 'y', 'z', '*', '#'
	};

	char palavra[len];

	/*    srand( time( NULL ) ); Definir a semente aqui faz com que a senha se repita */

	if ( validarComprimentoSenha(len ) )
		exit(1);

	for (i = 0; i < len; i++) {
		palavra[i] = alfabeto[rand() % 64]; /* 64 é o tamanho do alfabeto */
	}

	palavra[i] = '\0'; /* terminador de string */
	printf("\t%s\n", palavra);

	return;
}

Quem bebe da água de sua própria fonte não morre de sede no deserto da solidão nem se engana na miragem da paixào.