sexta-feira, 30 de agosto de 2013

Algoritmo produtor / consumidor - Python

Olá pessoal, na aula de SOP (Sistemas Operacionais) da minha faculdade meu professor pediu para que escrevêssemos um algoritmo para simular dois processos (A e B), onde o processo A era um produtor de valores e o processo B era um consumidor de valores.

Também era desejado que os dois processos pudessem operar de forma igual mesmo se os dois possuíssem velocidades diferentes. Exemplo:

[1 caso] Se o processo A (produtor) for mais veloz que o processo B (consumidor) ele deve produzir um número máximo N e logo em seguida dormir. O processo A será ativado novamente quando a lista estiver sem nenhum valor para ser consumido.

[2 caso] Se o processor B (consumidor) for mais veloz que o processo A (produtor) ele deve consumir todo o vetor de valores len(N) e logo em seguida dormir. O processo B (consumidor) será ativado novamente quando a lista estiver preenchida com valores para serem consumidos.

Para fazer esse tarefa usei a linguagem Python, e segue abaixo a minha implementação:
#! /usr/bin/python
# coding:utf-8

from random import randint
from time import sleep
import sys
import os

lista = [] #cria uma lista de valores com nenhum valor inserido
dormir_c = False #flag para desativar/ativar processo B (consumidor)
dormir_p = False #flag para desativar/ativar processo A (produtor)
length_max = int(sys.argv[1]) #tamanho max do vetor

#Processo A (produtor), produz valores para a lista
def produtor():
 global lista, length_max, dormir_c, dormir_p

 if not dormir_p: #verifica se processo está ativo
  while len(lista) < length_max: #verifica se a lista não atingiu seu tamanho máximo
   lista.append(randint(0, 1000)) #adiciona um valor inteiro entre 0 e 1000 à lista
   print 'Olá Sr. Programador eu sou o produtor, olha como está a lista de valores ' + str(lista)
  else:
   print 'Fiz o meu serviço olha como eu deixei a lista cheinha >>> ' + str(lista)
   print 'Agora eu vou tirar uma soneca. [Produtor está tirando uma soneca acorde ele quando a lista estiver vazia] \n'
   dormir_p = True #desativa o processo A
   dormir_c = False #ativa o processo B
   consumidor() #chama o consumidor

#Processo B (consumidor), consome valores da lista      
def consumidor():
 global lista, length_max, dormir_c, dormir_p

 if not dormir_c: #verifica se processo está ativo
  if lista: #verifica se a lista contem valores
   del lista[0] #remove o valor que se encontra no inicio da lista
   print 'Olá Sr. Programador eu sou o consumidor, olha como está a lista de valores' + str(lista)
  else:
   print 'Fiz o meu serviço olha como eu deixei a lista limpinha >>> ' + str(lista)
   print 'Agora eu vou tirar uma soneca. [Consumidor está tirando uma soneca, acorde ele quando a lista possuir valores] \n'
   dormir_c = True #desativa o processo B
   dormir_p = False #ativa o processo A
   produtor() #chama o produtor

while True: #loop infinito
 #inicia a brincadeira
 produtor() 
 consumidor()
 sleep(5) #trava a tela a cada iteração para podermos ver os processos em execução
 print '-----------------------------------------------------------------------------------------------------------------------------------'

Para executar o script, você deve informar o número máximo de itens que a lista pode conter. Esse parâmetro deve ser informado por linha de comando. Desse modo para executarmos nosso script temos que fazer:

user@server$ python algoritmo.py  N

Onde N é um número inteiro aleatório. Quando quiser encerrar a execução basta pressionar Ctrl+C. Espero que gostem do material e até a próxima!

sexta-feira, 23 de agosto de 2013

Atualizando o Firefox no Slackware - Slackware [14]

Olá pessoal, cansado do Firefox 15 que a instalação do Slackware 14 traz por padrão? Hoje vou mostrar como atualizar o seu Firefox para a versão mais atual (no momento em que escrevi esse post estava na versão 23). Vamos laá então.

Atualizando o Firefox

Bom primeiramente você deve baixar a versão do Firefox que deseja instalar em sua máquina diretamente pelo site do fornecedor https://www.mozilla.org/pt-BR/firefox/fx/.

Página de download do navegador mozilla firefox.

Após o termino do download vá até o diretório e descompacte o pacote baixado. Abaixo fiz uma pequena demonstração de como utilizar a linha de comando nesse caso. Veja:

root@user:# su -
root@user:# wget http://https://www.mozilla.org/pt-BR/firefox/fx/ firefox-23.0.1.tar.bz2
root@user:# tar -jxvf firefox-23.0.1.tar.bz2
root@user:# mv firefox firefox-23
root@user:# mv firefox /usr/lib/
root@user:# rm /usr/bin/firefox
root@user:# cd /usr/bin
root@user:# ln -s /usr/lib/firefox-23/firefox firefox
root@user:# rm -r /usr/lib/firefox-15.0.1/

Pronto pessoal, lembrando que tudo isso pode ser feito utilizando a interface gráfica. Basta que você abra o navegador de arquivos pela linha de comando logado como root. Se tudo deu certo a tela de entrada do firefox deve ser esta:
Agora você já sabe como fazer para ter sempre o firefox mais atual em seu sistema operacional :). Até a próxima pessoal o/

sexta-feira, 16 de agosto de 2013

Liberar som para usuário sem privilégios de root [Slackware 14]

Fala pessoal, hoje vou mostrar como liberar o som para usuário comum no Slackware 14. Eu resolvi mudar de SO e apostei minhas fichas no SO do Patrick (criador da distro), como sei que essa distro tem fama por ser leve e muito prática adotei ela como sistema padrão. Nessa transição de SO (Xubuntu p/ Slackware) tive muitas percas e ganhos. Abaixo fiz uma pequena lista delas:

Percas 
  • Central de programas
  • Facilidade para instalação de pacotes via terminal
  • Não ter que compilar pacotes em todas as instalações
Ganhos
  • Velocidade e desempenho
  • Pacotes default completos
  • Estabilidade de SO
Mas como nem tudo são rosas eu tive/tenho vira e mexe um problema aqui e outro acolá. 
Bom chega de conversa vamos fazer o seu som responder ai para que você possa escutar suas músicas e assistir aos seus vídeos. Abra o seu terminal e entre como root:

>> su -
>> [informe sua senha...]

Agora vamos adicionar o seu usuário ao grupo audio, assim ele terá acesso a todos os dispositivos de áudio:

>> usermod -G audio $seu_usuario

Pronto, faça um logoff ou reboot e tudo estará funfando jovem!
Até a próxima pessoal <o/

quarta-feira, 7 de agosto de 2013

Estrutura de dados usando C - Pilha

Olá pessoal, como disse no post biblioteca de estrutura de dados estou criando uma biblioteca para facilitar a vida de programadores que desejam utilizar linguagem C para trabalhar com estrutura de dados, assim como de professores e alunos em sala de aula.

Nesse post irei mostrar como usar a stack.h. Essa biblioteca serve para manipular estrutura de dados do tipo pilha, vamos lá?!

Adicionando a biblioteca em seu arquivo C

Meu objetivo não é dizer o que é uma pilha e nem como ela funciona na memória de seu computador (já estou trabalhando em um post para isso). Hoje vamos aprender como facilitar a sua vida na criação e manipulação de uma pilha.

Primeiramente é necessário que você tenha o código fonte da biblioteca que pode ser obtido no no meu repósitorio de código, feito isso salve em um local de seu HD para que possamos utilizá-lo.

Agora crie um arquivo C para que possamos trabalhar =). Importante: crie o arquivo C no mesmo local onde você salvou o código da biblioteca.

Para adicionar a biblioteca a seu arquivo C use o include passando o caminho em que a mesma se encontra. No nosso caso o arquivo C e o código fonte da biblioteca estão no mesmo local. Veja:
#include "stdio.h" #include "stdlib.h" #include "stack.h"

Declarando uma variável do tipo Pilha e criando uma Pilha

Para declarar uma variável do tipo pilha devemos declarar um ponteiro do tipo Stack, e posteriormente para criar uma pilha na memória devemos chamar a função new( ) que retorna a pilha criada. Veja:

/* Declarando variável do tipo Stack */ Stack* pilha; /* Criando uma Pilha */ pilha = new();
Fácil não é? Pronto com isso temos uma pilha alocada em nossa memória, porém, ela ainda está vazia. Vamos ver como fazemos para inserir valores nessa pilha.

Inserindo e removendo valores da pilha

Até a versão atual da biblioteca (1.0 beta) as estruturas de dados trabalham unicamente com o tipo de dado float. Para inserir valores na pilha temos a função push(Stack*, float), e para remover valores temos a função pop(Stack*). Veja:

/* Adicionando valores a pilha */ push(pilha, 10); push(pilha, 20); push(pilha, 30); /* Removendo valores da pilha */ float item_removido = pop(pilha); printf("%f, foi o item removido \n\n", item_removido);
E ai pessoal está fácil? Nem parece linguagem C? kkkk. Ainda temos mais duas funções que devemos saber trabalhar, digamos que você tenha que listar os valores contidos na pilha ... e agora? Calma pequeno gafanhoto eu também fiz essa função ... ufaa ^_^. E a ultima função é talvez uma das mais importantes, ela será a responsável por liberar o espaço de memória ocupado por sua pilha. Vamos ver como utilizá-las!

Listando valores contidos na pilha, e destruindo a pilha

Algo muito importante quando estamos trabalhando com pilhas é listar os valores que estão contidos na pilha, para fazer isso podemos usar a função show(Satck*), antes de encerrar a nossa aplicação devemos limpar a memória para evitarmos que a mesma fica ocupada com os dados que foram utilizados durante a execução de nosso código. Para destruir a pilha temos a função clean(Stack*). Veja:

/* Exibindo os valores presentes na pilha */ printf("Itens da pilha:\n"); show(pilha); /* Limpando a memória */ clean(pilha);
Pronto pessoal, agora podemos fazer qualquer aplicação C utilizando Pilhas =). Em breve está chegando a versão 2.0, fique ligado no blog. Segue o código completo:

#include "stdio.h" #include "stdlib.h" #include "stack.h" /* Sabemos que para usar a ED de Pilha devemos usar o tipo Stack. * Uma vez que haja uma variável do tipo Stack podemos usar os recursos da stack.h =) */ int main() { /* Declarando variável do tipo Stack */ Stack* pilha; /* Criando uma Pilha */ pilha = new(); /* Adicionando valores a pilha */ push(pilha, 10); push(pilha, 20); push(pilha, 30); /* Removendo valores da pilha */ float item_removido = pop(pilha); printf("%f, foi o item removido \n\n", item_removido); /* Exibindo os valores presentes na pilha */ printf("Itens da pilha:\n"); show(pilha); /* Limpando a memória */ clean(pilha); return 0; }
Bom pessoal e aqui termina mais um post! Se você gostou recomende e assine o nosso feed de noticias para ficar a par das novidades =). Até a próxima!

domingo, 4 de agosto de 2013

Biblioteca de estrutura de dados - Linguagem C

Olá pessoal, no meu tempo livre venho trabalhando em algo que pode ajudar muitos estudantes de programação a entenderem alguns conceitos de estruturas de dados sem quebrarem tanto a cabeça (como eu quebrei kkk).

Eu resolvi criar uma biblioteca (escrita em linguagem ANSI C), para facilitar o uso DA linguagem no ensino aprendizagem da disciplina de estruturas de dados. Como estou programando a biblioteca em meu tempo livre (que não é muito) ela está em sua versão BETA e ainda incompleta.

Na versão atual (versão 1.0) temos incluídos os arquivos headers para trabalharmos com as estruturas de: Pilha, Lista Encadeada, Lista Circular, Lista Duplamente Encadeada, Árvores Binárias e Gráfos (BETA).

Nessa primeira versão cada estrutura pode trabalhar com tipos de dados de pontos flutuantes, porém, já estou trabalhando para que as mesmas trabalhem com qualquer tipo de dados (int, float e char).

O código fonte estará disponível no Github para quem quiser usá-lo =). Abaixo colocarei os links com o How-To para usar a biblioteca com cada uma das estruturas de dados.

Isso é tudo pessoal, e até a próxima. =)

OBS: OS LINKS ESTÃO CEGOS POR ENQUANTO.

Pilhas 
Listas encadeadas 
Listas circulares 
Listas duplamente encadeadas 
Árvores binárias 
Grafos (BETA) 
Link do projeto (Github) 

Novidade!!! Agora vamos ter canal no Youtube =D

Fala pessoal tudo beleza, estou sumido a correria está forte por aqui. Estou querendo dar um start em um projeto antigo que vem desde o temp...