sábado, 24 de março de 2007

Gerador de PINS (Python)

Olá irmãos,

Hoje vou postar aqui sobre este script que fiz na altura para me gerar um PIN do cartão de multibanco, esta foi uma das aplicações em que pensei enquanto ia dormir, e aí levantei-me da cama e vim programar.

Tive apenas duas dificuldades: - Gerar valores aleatórios e fazer com que os números tivessem zeros antes (ex: 0001, 0199, 0012).

Primeiro comecei por ir ao Google e o Python já tem uma biblioteca que o faz (chamada random), bastou fazer um

Import random

para a poder utilizar.

A ideia geral para o script funcionar foi ele primeiro gerar os números de 0000 ate 9999, escrever num ficheiro. Após escrito ele irá abrir novamente o ficheiro para apenas leitura e aí com a biblioteca random pegar num valor aleatório, por exemplo: 6273.

Acima falei de um problema que tive, que foi nos zeros. Andei em vários sítios à procura de como o fazer (pois 000 como inteiro ficava apenas 0). É aí que me vem a ideia: Bem, se não preciso de inteiros, porque não utilizar estes valores como string? Aí já não haveria problemas, e assim o fiz.

Mas agora levanta-se outra questão: - Quando é que o script vai saber em que altura será 000 ou 0 ou 00? É aí que atribuo a três variáveis vários zeros como string:

val1 = '000'

val2 = '00'

val3 = '0'

Após esta atribuição é altura de indicar ao script quando usar o val1, val2 e val3. Para isto recorri ao while, visto enquanto x (variável contador que irá de 0 até 9999) for menor que 10 terá o val1 (três zeros), menor que 100 terá val2, e menor que 1000 terá val3.

while x < 10:

    ficheiro = open('gerado.txt','a')

    ficheiro.write(str(val1) + str(x) + " ")

    ficheiro.close()

    x = x + 1

    

while x < 100:

    ficheiro = open('gerado.txt','a')

    ficheiro.write(str(val2) + str(x) + " ")

    ficheiro.close()

    x = x + 1


 

while x < 1000:

    ficheiro = open('gerado.txt','a')

    ficheiro.write(str(val3) + str(x) + " ")

    ficheiro.close()

    x = x + 1

    

while x < 10000:

    ficheiro = open('gerado.txt','a')

    ficheiro.write(str(x) + " ")

    ficheiro.close()

    x = x + 1

Se repararem na altura de escrever no ficheiro existe um str(val1) + str(x), e isto porquê? Bem, segundo se aprende no início da programação apenas se pode fazer operações com dados do mesmo tipo (inteiro com inteiro, string com string), e como x é um dado do tipo inteiro, tenho de na altura o "converter" para string para o poder utilizar com a respectiva string (val1, val2, val3).

Temos os dados escritos no ficheiro gerado.txt, agora teremos de o abrir novamente como leitura. Após abrirmos como leitura teremos de separar os seus dados numa lista, para isto recorri ao split()

gerado = ficheiro.read().split()

Agora já temos uma variável (gerado) com os valores gerados (0000 ate 9999) todos separados como lista.

Falta escolher um valor aleatório para aparecer no ecrã, para resolver isto usei o random.sample(), passando como argumento a string com o conteúdo (gerado) e quantos valores queria (1). Após escolher o valor aleatório é armazenado numa variável (gerados) e é mostrado no ecrã o valor:

gerados = random.sample(gerado, 1)

print "PIN: " + str(gerados).strip("[' ']")

Recorri ao strip() para remover o [' '] que iria aparecer nos números gerados, visto estar a trabalhar com uma lista.

Aqui se segue o código completo:

#!/usr/bin/env python


 

# Mon Oct 23 22:46:00 2006 AZOST

# Gerador de PINS

# (c) 2006 - Alexandre Garcia <alexmgarcia@tux-linux.net>


 

import random

ficheiro = open('gerado.txt','w')

ficheiro.close()

val1 = '000'

val2 = '00'

val3 = '0'

x = 0


 

while x < 10:

    ficheiro = open('gerado.txt','a')

    ficheiro.write(str(val1) + str(x) + " ")

    ficheiro.close()

    x = x + 1

    

while x < 100:

    ficheiro = open('gerado.txt','a')

    ficheiro.write(str(val2) + str(x) + " ")

    ficheiro.close()

    x = x + 1


 

while x < 1000:

    ficheiro = open('gerado.txt','a')

    ficheiro.write(str(val3) + str(x) + " ")

    ficheiro.close()

    x = x + 1

    

while x < 10000:

    ficheiro = open('gerado.txt','a')

    ficheiro.write(str(x) + " ")

    ficheiro.close()

    x = x + 1


 

ficheiro = open('gerado.txt','r')

gerado = ficheiro.read().split()

gerados = random.sample(gerado, 1)

print "PIN: " + str(gerados).strip("[' ']")

ficheiro.close()

sexta-feira, 23 de março de 2007

Conversor de Binário para Decimal (Pascal)

Sim, Pascal! Há gente que se questiona: Ainda dão isso?

Pois é, esta linguagem do século passado e ultrapassada a nível de "novidades" ainda é utilizada no ensino para apresentar programação aos novos alunos e ambientá-los com bases de programação.

Eu, felizmente (ou infelizmente?) estou a dar Pascal em Bases de Programação e acho-o simples e bom para aprender a programar.

Este foi um trabalho de casa que foi pedido, mas penso que era para utilizar operações com strings, só que faço as coisas sempre por outro método e utilizei foi o método tradicional de converter de binário para decimal: 010 = 0 * 2 ^ 0 + 1 * 2 ^ 1 + 0 * 2 ^ 2 = 2

O código é estranho, até usei uns ifs que não sei porquê, mas resolveram os problemas que tinha (caso o ultimo numero fosse 0 acrescentava um valor: 010 ficava 3, 0100 ficava 5, mas já 011 ficava 3 e 0101 ficava 5):

Program bin_dec;

function expoente(x,y:longint):longint;

var

z,n:longint;

begin

n := x;

for z := 2 to y do

n := n * x;

expoente := n;

end;

var

num, aux, multi, digito, valor, soma:longint;

exp:integer;

begin

write('Num (bin): ');

readln(num);

multi := 10;

aux := num;

exp := 0;

soma := 0;

while (aux <> 0) do

begin

digito := aux mod 10;

aux := aux div 10;

multi := multi * 10;

if (exp = 0) and (digito = 1) then

begin

soma := 1;

exp := 1;

end

else

begin

valor := expoente(2,exp);

exp := exp + 1;

soma := soma + digito * valor;

end;

end;

writeln(num,'(bin) = ',soma,'(dec)');

readln;

end.

Gerador de Galeria em HTML (Python)

Este vai ser o meu primeiro post sobre aplicações escritas por mim.

O que é que então isto faz?

É um script que na altura em que usava Linux fiz em Python para gerar uma galeria de fotos em html a partir de um directório com fotos, pois precisava de o fazer porque tinha um directório com várias fotos e "colocar" uma foto de cada vez em código html é trabalhoso, por isso aproveitei uma biblioteca de Python e pus mãos à obra.

A minha primeira dificuldade foi certamente criar uma thumbnail da imagem em questão, por isso dei uma visita ao Google (http://www.google.pt) e rapidamente encontrei o que queria: Python Imaging Library (http://www.pythonware.com/products/pil/). É óbvio que não sabia como trabalhar com este, então disse a mim mesmo: RTFM, fi-lo e em questão de minutos já sabia minimamente o que queria.

Primeiro de tudo tive que indicar que imagem abrir, para isto atribuí a uma variável o resultado de

Image.open(imagem)


 

Em que imagem será uma variável com o caminho da foto/ficheiro.

Também declarei outra variável: THUMBSIZE, em que atribuí a esta a largura e altura da thumbnail (230x153), mais propriamente o valor 230,153. Após isto utilizei a função

Thumbnail

da biblioteca PIL (Python Imaging Library) para a criar, que tem a seguinte sintaxe:

Img (esta foi uma variável criada por mim em que terá como valor o resultado de image.open(imagem) – img.thumbnail(THUMBSIZE)


 

OK. Já tenho a thumbnail da imagem, agora tenho que a salvar… mas há um problema: Imaginemos que o utilizador do script já o correu anteriormente, mas agora acrescentou mais imagens, só que as thumbnails das imagens já existentes encontram-se no directório… como fazer para não criar uma thumbnail de uma thumbnail?

É simples, basta utilizar um if para verificar se as primeiras 5 letras da variável imagem são constituídas pela palavra thumb

If imagem[0:5] != "thumb":

Após esta verificação, caso o resultado seja Verdadeiro e não Falso, o script vai executar o que vem a seguir a esta condição:

Img.save('thumb.' + str(imagem), "JPEG")

Ou seja, o ficheiro ficará: thumb.Foto1.JPG note-se aqui o uso da função str() para converter o valor de imagem para uma string (cadeia de caracteres alfanuméricos). Basicamente a função save do PIL é para salvar num ficheiro as alterações feitas à imagem.

E pronto, temos o problema de criar as thumbnails resolvido.

Aqui abaixo segue-se o código completo do script.

#!/usr/bin/env python


 

# Alto Circuito Galeria

# Por Alexandre Garcia (c) 2006

# Wed, 06 Dec 2006


 

import os, time, string, Image, glob


 

THUMBSIZE = 230, 153

PATH = "/home/amg/AC_fotos/" # Alterar para o directorio das fotos

HTML = PATH + "index.html"

TITLE = "Alto Circuito Lan Party I - Fotos" # Alterar para o titulo do site

ficheiro = open(HTML,"w")


 

def converter():

    os.chdir(PATH)

for imagem in glob.glob("*.JPG"):

img = Image.open(imagem)

img.thumbnail(THUMBSIZE)

        if imagem[0:5] != "thumb":

    img.save('thumb.' + str(imagem), "JPEG")


 

def gerar():

    os.chdir(PATH)

    imgthumb = glob.glob("thumb.*")

    ficheiro.write("<html><head><title>" + TITLE + "</title></head><body><font size=\"4\"><b><center>" + TITLE + "</b></font><br><br>")

    for thumb in imgthumb:

        thumb = '<a href=\"' + str(thumb).strip('thumb.') + '\">' + '<img src=\"' + thumb + '\">' + '</img>' + '</a>' + ' '

        ficheiro.write(thumb)

    ficheiro.write("<br><br><font size=\"2\">Actualizado em " + time.strftime("%d-%m-%Y %H:%M:%S") + "<br>Galeria Alto Circuito - Script feito por <a href=\"mailto:alexmgarcia@tux-linux.net\" style=\"text-decoration:none\"><b>Alexandre Garcia</b></a> (c) 2006</font></center></body></html>")

    ficheiro.close()


 

converter()

gerar()


 

Haja saúde para todos!

quinta-feira, 22 de março de 2007

Breve apresentação

Bem, decidi criar este espaço para expor as minhas ideias sobre Informática, mais propriamente sobre Programação, claro que não falarei apenas de Programação, farei também algumas reviews de software e colocarei tutoriais da minha autoria.

Eu não tenho jeito para escrever textos longos, apenas o faço em Filosofia, e há quem me chame "cromo" por o fazer.

Whatever… que posso dizer de mim?

Sou um estudante de Informática, tenho 15 anos, frequento a Escola Secundária das Laranjeiras (São Miguel, Açores), e os objectivos que tenho de vida é entrar na Universidade e tirar Engenharia de Redes e Sistemas Informáticos, visto ter uma "paixão" por administração de redes informáticas e segurança informática. Para além disso ando a começar a ficar viciado em LOST.

Tenho alguma (pouca) experiência com redes, a que configurei até agora foi a minha de casa, Servidor com FreeBSD + Clientes com Windows (mas também já houve com GNU/Linux), e configurei também a rede da casa do Uchiha.

E é isso, poderei não postar com muita frequência por causa da escola e porque nas férias vou ter muito código para escrever e neurónios para queimar/desenvolver.