Feeds:
Posts
Comentários

WolframAlpha

Tá na hora de retirar a poeira do blog né.  Dessa vez em mais um post informativo.

Recentemente conversando com um amigo o mesmo me falou da existência de tal site. WolframAlpha.  Mas o que seria este?  Diria que ele é uma mistura de Wikipédia e MatLab.  Ele faz calculos, mostra informações de acordo com a palavra que você pesquisa, etc.  Eu ainda não mexi nessa ferramenta a ponto de ver se ela plot gráfico ou coisas assim, mas irei testar dentro em breve.  De qualquer forma fica ai a informação para os curiosos mexerem nele.  E como disse para meu amigo “por que eu não tive essa ideia antes”.  A ideia do site é muito boa, é mais uma ferramenta a serviço da comunidade.

Opa, depois e meses sem postar vou tentar retomar o blog se o tempo deixar.  E para reviver  o mesmo convido a todos que puderem comparecer na II Bienal de Informática que acontece em natal apartir de hoje, hehe, é eu sei como disse um colega da lista do python br, to avisando meio em cima da hora.  Infelizmente só tive acesso a programação a pouco tempo.  Mas, vam lá.  Nesse bienal será realizado um encontro de usuários de python =] isso mesmo, então os colegas que puderem comparecer  a este encontro por favor façam-se presentes.

Para mais informações sobre a bienal veja: http://bienaldeinformatica.com.br/

Abaixo a programação incluido o louge:

Programação do lounge do software livre

Quinta-feira (16/04/2009):

Horário

Temas

Responsável

10:00h

Demonstrações diversas e esclarecimentos de dúvidas dos visitantes

PSL-RN

18:30h

Dropbox: sincronia e compartilhamento de arquivos nas nuvens

Moreno Montenegro

19:30h

Demonstrações diversas e esclarecimentos de dúvidas dos visitantes

PSL-RN

Sexta-feira (17/04/2009):

Horário

Temas

Responsável

10:00h

Demonstrações diversas e esclarecimentos de dúvidas dos visitantes

PSL-RN

14:00h

Encontro de Usuários do Ginga

Ginga-RN

16:00h

Demonstrações diversas e esclarecimentos de dúvidas dos visitantes

PSL-RN

Sábado (18/04/2009):

Horário

Temas

Responsável

10:00h

Demonstrações diversas e esclarecimentos de dúvidas dos visitantes

PSL-RN

11:00h

Encontro de Usuários do BrOffice.org

Gubro-RN

13:00h

Demonstrações diversas e esclarecimentos de dúvidas dos visitantes

PSL-RN

15:00h

Conhecendo o GNU/Windows (Palestra no auditório da Bienal)

Adorilson Bezerra

16:00h

Demonstrações diversas e esclarecimentos de dúvidas dos visitantes

PSL-RN

17:00h

Desenvolvimento Ágil para Web com Ruby On Rails (Palestra no auditório da Bienal)

Rafael Uchoa e Elomar França

18:00h

Encontro de Usuários Ruby On Rails

Rafael Uchoa e Elomar França

20:00h

Demonstrações diversas e esclarecimentos de dúvidas dos visitantes

PSL-RN

Domingo (19/04/2009):

Horário

Temas

Responsável

12:00h

Demonstrações diversas e esclarecimentos de dúvidas dos visitantes

PSL-RN

13:00h

Encontro de Usuários Python

Kirotawa

15:00h

Modelos de negócios com software livre (Palestra no auditório da Bienal)

Gustavo Ribeiro

16:00h

Demonstrações diversas e esclarecimentos de dúvidas dos visitantes

PSL-RN

20:00h

Utilização de software livre no seu desktop (Palestra no auditório da Bienal)

Ivanilson Junior

Durante as palestras no auditório da Bienal, no lounge continuam as demonstrações e esclarecimentos de dúvidas dos visitantes.

PyGame 1.9 e Camera

Opa, há tempos sem postar nada, coisas acontecendo e talz, mas vamo lá.

Há algum tempo o pessoal da lista do pygame que eu faço parte criou uma lista de implementações que seriam feitas para a nova versão do PyGame.  Essa lista foi disponibilizada para que aqueles que tivessem interesse em participar dos projetos pudessem colaborar.  Um dos projetos da lista é a implementação de um modulo para o PyGame 1.9 que dará suporte a camera, isso mesmo.  Muito interessante e divertido para quem mexe com PyGame.  Abaixo o conteudo do e-mail assim como o link do cara responsável por esse trabalho:

René Dudfield in pygame-users@seul.org

I started a basic implementation of pygame.camera.Camera using the
videocapture module for windows.
http://rene.f0o.com/~rene/stuff/camera_vidcapture.py

Of course it’s not complete, but allows people to use the same basic
camera API until we finish off the module on windows.

I’ve also started one using pyopencv… but haven’t finished that yet.

from camera_vidcapture import Camera
from camera_vidcapture import list_cameras
pygame.camera.Camera = Camera
pygame.camera.list_cameras = list_cameras
del Camera
del list_cameras

cu,”

Curiosidades em PHP

Outro dia  me perguntei se seria possível fazer algumas das coisas que eu faço em Python em  PHP.  Tal como passar na declaração de uma função um valor default.  E descobri que realmente é possível.  Além disso vi que também é possível declarar uma função e passar o nome dela à uma variável e chamar essa variável como sendo esta função.  Péra!! Confundiu tudo.  Vamos ver com calma nos códigos que seguem.

No código abaixo é demonstrado tudo isso que eu falei.  A função ‘abc’ é declarada passando como valor DEFAULT um inteiro, no caso 1.  Abaixo da função passamos o nome da função para duas variáveis.  A primeira vai ser chamada com parametro,  já a segunda não.  Note que para chamar a variável como função você deve por os parenteses ‘( )’ junto com a variável.  Exemplo $casa( ) <——–.  Pronto agora dá uma olhada no código e vê que legal.  Agora é só usar sua criatividade ou necessidade e fazer uso disso.

CODE


<?

function abc($valor= 1)//Declaração de função passando 1 como valor DEFAULT
{

    print $valor . "
" ;

}

$func = "abc"; //Passando o nome da função para uma variável.
$func2 = "abc";// idem acima.

$func("kirotawa");//Chamando a primeira variável como a função abc, passando valor como string.
$func2(); //Chamando a segunda função sem passar valor.

?>

PyGame no Symbian

Como disse o cara responsável por essa façanha.  HOUHOUHOU Feliz natal.

E realmente, pra mim, um viciado em PyGame, esse foi e é um presente e tanto.  Sempre pensei na possibilidade de ter o PyGame dentro do Symbiam com o PyS60.  Dae surgi um desses caras fodões e criam isso, maravilha né.  Como disse pra uma amiga, agora só falta comprar o nokia com symbian (hehehe).

Como o GameDude ou Jussi Toivola  (os nomes dele no grupo do google, e no forum Nokia), disse, a api ainda é recente e nem tudo que o PyGame suporta ele suporta, uma lista das coisas que ainda estão sem suporte são:

  • Sem suporte a textos/fonts
  • Sem muitas das extensões de imagens -> só .bmp são suportadas
  • Sem o mixer.music
  • Sem a appuifw, que dá suporte a parte gráfica do PyS60 do symbian
  • Built  com minas extensões

Por enquanto é pouco.  Mas agente sabe que iniciativas desse tipo, em pouco tempo se tornam grandes projetos de extensão.  Principalmente se for levado em consideração na quantidade de usuários do PyGame.  Eu particularmente estou muito animado com tudo isso, sou um entusiasta em PyS60 e PyGame, então estou nas nuvens =].  Ótimo presente de natal. Para  baixar o protótipo você pode clicar aqui.  Ou clicar nas referências->notícia no forum nokia, abaixo.

Referências

Pygame mirror on google groups

Noticia no Forum nokia

O post anterior falava em como você pode instalar o bcompiler e utilizá-lo para compilar o código de suas aplicações em PHP-GTK.   No caso do PHP-GTK é realmente interessante esconder o código.  Mas imagine que você precise fazer o mesmo com códigos PHP de algum sistema Web.  É do que trata este post.  Aqui vou mostrar, de forma absurdamente simples, como esconder o seu código .php.

Uma vez que você já tenha instalado o bcompiler tudo ficou mais fácil.  Os passos para esconder o código .php para aplicações Web são os mesmos para o PHP-GTK.  O primeiro passo é gerar o .phb, ou seja, o arquivo php bytecode (ver post anterior).  O segundo passo é ler o arquivo .phb e usá-lo de acordo com o que foi implementado no .php que deu origem a ele.  Vejamos o código abaixo:

CODE


<?

function DigaOi(){
    print "hello world!!";
}

?>

O código acima é referente ao código que será passado para bytecode.  Já o próximo código é como você deve fazer para usá-lo na sua aplicação.

CODE


<?
$fb =fopen("HelloWorld.phb","r");

bcompiler_read($fh);//ler o arquivo em bytecodes.

fclose($fh);

DigaOi();//Esta é a função que foi definida no arquivo .php que foi passado para phb (php compilado)

?>

Como eu disse antes, é absurdamente simples.  Uma vez que você instalou o bcompiler, adicionou:  echo ‘extension=bcompiler.so’ >> /etc/php5/apache2/php.ini.  Ou digitando no php.ini.  Pronto, agora é só testar.

Nesse post irei mostrar como criar uma aplicação em PHP-GTK compilada usando o bcompiler no linux (ubuntu 8.04).  A fonte para o tutorial de instalação do bcompiler é o  artigo do Patrick Mendes no site do PHP-GTK Brasil.

Instalando o bcompiler no seu ubuntu 8.04

kirotawa@xxx:~$wget -c http://pecl.php.net/get/bcompiler-0.8.tgz
kirotawa@xxx:~$tar -xzvf bcompiler-0.8.tgz
kirotawa@xxx:~$cd bcompiler-0.8
kirotawa@xxx:~$phpize
kirotawa@xxx:~$./configure
kirotawa@xxx:~$make
kirotawa@xxx:~$make install
kirotawa@xxx:~$echo ‘extension=bcompiler.so’ >> /etc/php5/cli/php.ini

Lembre-se de um detalhe o comando make install deve ser realizado como root.  Para não haver nenhum problema faça tudo como root, só pra garantir.

Agora que você instalou o bcompiler é hora de usar ele.  Antes vamos criar uma aplicação simples em PHP-GTK.

CODE

<?php

  $janela = new GtkWindow();
  $janela->set_default_size(100,50);
  $janela->set_title("Janela Compilada");
  $Label = new GtkLabel("Nome");
  $Nome = new GtkEntry();
  $Botao = new GtkButton("_OK",true);
  $box = new GtkHbox();

  $box->add($Label);
  $box->add($Nome);
  $box->add($Botao);
  $janela->add($box);

  $Botao->connect_simple('clicked','fExibeTexto',$Nome );

  $janela->show_all();
  $janela->connect_simple('destroy', array('gtk', 'main_quit'));
  function fExibeTexto($campotexto)
  {
    $texto = $campotexto-> get_text();
    $dialog = new GtkMessageDialog(null, Gtk::DIALOG_MODAL,
    gtk::MESSAGE_WARNING, Gtk::BUTTONS_OK, $texto );
    $dialog->run();
    $dialog->destroy();
  }

   Gtk::main();
?>

O código acima é só pra explicar. O que ele faz é criar uma janela com um GtkLabel, GtkButton e um GtkEntry. Quando o botão é pressionado abre-se um GtkMessageDialog com o conteudo do GtkEntry.
Agora vamos a parte que realmente interessa. Criar a tal  aplicação compilada.  Criamos um arquivo com o seguinte contéudo:

CODE

<?php
     $arq = fopen("janela.phb", "w");//Cria o arquivo que conterá  o bytecode
     bcompiler_write_header($arq); //Escreve a parte do cabeçalho do arquivo bcompiler.
     bcompiler_write_file($arq, "teste1.php"); //Essa função lê o arquivo que você quer gera o     bytecode e escreve no arquivo recem criado
     bcompiler_write_footer($arq); //Escreve o caracter \x00 para indicar o Fim dos dados compilados.
     fclose($arq); //Fecha o arquivo
?>

Agora que temos o códio para nossa aplicação, e temos o código que vai gerar a aplicação compilada. é só digitar:

kirotawa@xxx:~$php bcompilerteste.php

Ele vai gerar o arquivo janela.phb. Para executar essa janela você pode digitar:

kirotawa@xxx:~$php janela.phb

Ou fazer o que eu fiz setar que os arquivos .phb devem ser abertos com o php. Pronto agora você pode proteger as suas aplicações em PHP-GTK.  Para saber mais dá uma conferida nas referências abaixo.

Referências

Artigo do Patrick Mendes
Wbly/Emilio
XoopsCube

PyIMSL

Há alguns meses atrás a Visual Numerics anunciou o seu novo projeto, o PyIMSL Math,  uma biblioteca de funções para aplicações na matemática e estatística, que empacota o IMSL C.  Tal biblioteca pode ser usada em várias áreas, tais como: Ciência da computação, engenharia, aplicações de negócios, etc.

Mas o que é IMSL Numerical Libraries.  Trata-se de um amplo conjunto de rotinas que fornecem módulos para construção de uma aplicação de analise de dados.  Tais rotinas retiram do programador grande parte do trabalho em programar.  As rotinas são extremamente confiáveis, amplamente testadas e otimizadas, o que acelera o trabalho dos desenvolvedores e economiza tempo e dinheiro.  Já faz 30 anos que o pessoal da Visual Numerics vem trabalhando no IMSL Numerical Libraries.  Existem várias bibliotecas  IMSL, em C, C++, C#, Java e mais recentemente em Python.  Essas bibliotecas reduzem em mais de 95% o trabalho braçal de codificação e tudo isso atrelado a um grande grau de confiança haja visto os anos de aprimoramento destas bibliotecas.

O que isso tudo significa?  Isso significa que pesquisadores agora poderão fazer uso de Python em simulações ou aplicações de analise de dados, imagine agora o que você faria com tudo isso.  Utilizar PyIMSL e python na análise e processamento de imagens, em cálculos matemáticos complexos, que levariam certo tempo para que você implementasse, mas agora basta utilizar PyIMSL, simples assim.

Para dar uma idéia do seu uso, e esse é um exemplo bem simples e mediocre, vocês lembram daquela disciplina que envolvia cálculo de sistemas lineares, método de gauss, método do triangulo superior e inferior.  Não sei vocês, mas eu lembro, e lembro que meu professor pediu para implementar um método de gauss.  Naquela época fiz em C, hoje faria em python.  Vamos ver um exemplo.

x1 + 3x2 + 3x3 = 1

x1 + 3x2 + 4x3 = 4

x1 + 4x2 + 3x3 = 1

CODE

from numpy import *
from imsl.math.linSolGen import linSolGen
from imsl.math.writeMatrix import writeMatrix

 a =  array([[1.0, 3.0, 3.0],
 [1.0, 3.0, 4.0],
 [1.0, 4.0, 3.0]])

b =  [1.0, 4.0, -1.0]
#Resolve A*x = b  for  x

x = linSolGen(a, b)
writeMatrix ("Solução, x, of Ax = b",x)

Saída:
Solução, x, of Ax = b

1 2 3
-2 -2 3

Viu?! Bem interessante não é, quer saber mais? Dá uma olhada nas referências abaixo.

Referências

Documentação PyIMSL
DEonline
IMSL
Visual Numerics

PyGame é uma engine de desenvolvimento de jogos 2D sob SDL (Simple Directmedia Library) criada em Python e C++, que abstrai as tarefas mais intensivas a nível computacional da lógica do jogo.  Isso quer dizer que o desenvolvedor não vai ter que se preocupar com a programação pesada para ter acesso a mídia do hardaware.  PyGame oferece uma serie de métodos que facilitam o desenvolvimento.  Assim como Python é rápido para desenvolver, afinal um módulo  pythonico.  Atualmente a versão corrente é a 1.8.1.

Para começar a criar jogos ou aplicações que façam uso de PyGame é muito simples.

  1. Faça o donwload do Python, se não tiver.
  2. Faça o donwload do PyGame
  3. Linux user (ubuntu user): apt-get install pygame, ou se não tiver o python ainda, apt-get install python pygame
  4. Usuários win, bastam ir na pagina do PyGame e escolher sua versão.

Pronto instalou tudo?! Agora é só começar a brincar com o PyGame.  No site do PyGame existem vários projetos enviados por desenvolvedores, jogos, novos módulos para o PyGame, etc.  Assim como uma boa documentação dos métodos nativos.  Pra quem nunca programou em Python é bom antes dar uma olhada em algum tutorial.  Eu sugiro este: Documentação Python 2.6.

Nos próximos posts irei começar a destrinchar os métodos do PyGame, mostrando como usá-los e vou mostrar alguns exemplos.  Por hora vou ficando por aqui, mas antes para deixá-los empolgado veja o que o código abaixo faz, é algo extremamente simples, mas ai que tá, python e pygame são simples.  Esse exemplo é algo bem besta, porém você pode criar muita coisa legal, tudo vai depender da sua imaginação e criatividade.

CODE

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

import pygame,random 

pygame.init()

tela = pygame.display.set_mode((600,400))
pygame.display.set_caption('Exemplo')
continua = 1

x = 20
y = 5
dir = 1
cor = 255,0,0 

while continua:
	for event in pygame.event.get():
		if event.type == pygame.QUIT:
			continua = 0

	tela.fill((255,255,255))
	pygame.draw.circle(tela,cor,(x,y),10,0)
	pygame.draw.line(tela,(0,0,255),(0,0),(400,400),2)
	x = x +dir
	y = y +dir

	if y >= 400 or x <= 0:
		dir = dir * -1
		cor = random.randint(0,255), random.randint(0,255) ,random.randint(0,255)

	pygame.display.flip()

Então é isso, até o próximo post.

Em sistemas operacionais há alguns algoritmos para solucionar os problemas de competição de processos por recursos ou regiões criticas. Os mais conhecidos são a solução de peterson e o de semáforos. Geralmente, ao menos na UFRN, onde eu estudo as soluções implementadas são em Java. Como eu odeio Java, apesar de programar nessa coisa, preferi fazer as implementações em python e ficaram bons os resultados.

A principio irei falar sobre cada um dos algoritmo e apresentar a solução em python =].

Solução por Variáveis de travamento

Nesse algoritmo há apenas uma variável compartilhada (variável de travamento), cujo o valor inicial é 0. Quando algum processo deseja entrar em sua região critica, ele deve primeiro estar essa variável . Caso ela seja 0, o processo a muda para 1 e entra na região critica. Se o valor da variável de travamento já for 1, o processo vai esperar que o valor volte para 0, antes de entrar na região critica.

CODE

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

from threading import Thread
from time import sleep

lock = 0 # Variável de travamento

class Processo(Thread):

	def __init__(self, p):
		Thread.__init__(self)
		self.p = p

	def run(self):
		global lock
		while True:
			if lock == 0:
				lock = 1
				print "processo %d entrou na regiao critica" %self.p
				lock = 0
				print "processo saiu da regiao critica"
			else:
				sleep(60) # delay de 60
			sleep(3) # delay de 3 só pra deixar tudo mais emocionante =P.

p1 = Processo(0)
p2 = Processo(1)

p1.start()
p2.start()

Problemas desta solução

Pode ocorrer de um processo ler a variável de travamento com valor 0, mas antes que ele mude o valor para 1 pode ocorrer uma interrupção, e outro processo pode ser colocado para executar. Este segundo processo irá ler lock verificar que o seu valor é 0, seta-lo para 1 e entrar na região critica. Quando o primeiro processo volta vê que no seu contexto lock vale 0, seta o seu valor para 1 e entra na região critica. Ou seja os dois processos estão executando suas regiões criticas ao mesmo tempo.

(Desafio a programadores Java fazerem esse código mais limpo e bonito que em python =P).

Solução por Estrita Alternância

Nesta solução há uma variável chamada de turn que inicialmente está com valor 0. É ela quem irá determinar de quem é a vez de entrar na região crítica. A princípio um processo verifica turn se o professo for 0 e o turn for igual a 0 ele entra na sua região crítica, caso contrário ele entra em um loop até que turn seja igual a 1.

CODE

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

from threading import Thread
from time import sleep

turn = 0

class Processo(Thread):

    def __init__(self, myturn):
        Thread.__init__(self)
        self.turn = myturn

    def run(self):
        global turn
        while True:
            while turn != self.turn:
                sleep(3)
            print "Processo",self.turn
            turn = not turn

p1 = Processo(0)
p2 = Processo(1)
p1.start()
p2.start()

Problemas desta solução

Como deve pra ter notado caso um processo passe muito tempo na sua região crítica o outro irá esperar por um longo tempo até conseguir na sua. Esse teste contínuo do valor de turn, esperando que ela torne-se 1, é chamado de espera ocupada. Em resumo, a espera ocupada deve ser evitada, pois consome tempo do processador. Em casos onde se supõe que a espera será curta, então pode-se usar esta solução.

Solução de Peterson

Na solução de Peterson há duas funções uma é a Entrar na região (Enter_regiao), e a outro é Deixar região (Leave_regiao). Entrar na região possui um parâmetro que o numero do processo que está tentando entrar na região critica. Assim como Deixar região.

O algoritmo funciona da seguinte maneira. Quando Enter_regiao é chamado passando o numero do processo que deseja entrar, temos uma variável chamada outro, que nada mais é do que o outro processo. A lista de interessados é atualizada para o processo que entrou na região, com o valor true, e turn receberá o processo corrente. Enquanto turn for igual ao processo corrente, mas o processo interessado for o outro, o processo que chamou Enter_regiao irá ficar em espera ocupada.

No caso da função Leave_regiao é apenas passado o processo que irá sair da região e a lista de interessados para aquele processo é setada como False.


CODE

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

from threading import Thread
from time import sleep

turn = 0
interessados = [False,False]

class Regiao_critica:
    def __init__(self,processo):
        self.processo = processo

    def enter_regiao(self):
        global turn, interessados

        outro = 1 - self.processo
        interessados[self.processo] = True
        turn = self.processo
        if(turn == self.processo and interessados[outro] == False):
            print "processo %d entrou na regiao critica" %self.processo
        while(turn == self.processo and interessados[outro] == True): pass

    def leave_regiao(self):
        interessados[self.processo] = False
        print "processo %d deixou a regiao critica" %self.processo

class Processo(Thread):

    def __init__(self,processo):
        Thread.__init__(self)
        self.processo = processo

    def run(self):
        r = Regiao_critica(self.processo)

        while True:
            r.enter_regiao()
            r.leave_regiao()
            sleep(3)

p0 = Processo(0)
p1 = Processo(1)

p0.start()
p1.start()

Nos próximos post’s irei falar sobre semaforos, o problema dos filosos glutões, leitores e escritoes e do bardeiro dorminhoco.

continua…

« Novos Posts - Postagens Antigas »