Category: Aprendendo

Mai 28 2009

Exercícios, Programação Concorrente.

Boa noite,

Amanhã tenho uma prova de Programação com o conteúdo, "monitores" e "redes de petri". O professor passou uns exercícios para que fossem resolvidos e entregues, dos 5 resolvi apenas 3 até o momento. A linguagem utilizada para implementação dos mesmos foi Pascal FC (uma linguagem para ensinar "programação concorrente"). Bom, vamos a resolução e enunciados dos mesmos.

1) Pombos correio foram treinados para transportar cartas da cidade
A para a cidade B. Na cidade A existe uma Caixa Postal onde as
pessoas depositam suas cartas para que sejam entregues na cidade
B. Os pombos consultam a Cxpostal e retiram sempre 5 cartas para
transportar na sua viagem. Caso não existam ainda 5 cartas na
caixa, o pombo espera até que esse número seja atingido. Na cidade
B existe uma gaiola onde os pombos depositam suas cartas e ficam
presos até que um processo tratador libere-os. O tratador verifica a
gaiola a cada 20 clocks e libera todos os pombos somente se o
número de pombos for maior ou igual a 2. Os pombos somente
transportam cartas de A para B, na sua volta eles voam vazios.
Construa um monitor para controlar a utilização da Caixa Postal
pelas pessoas (13), pombos (6) e o tratador (1).

Resolução do exercício sobre pombos.

2) Implemente o problema dos fumantes utilizando monitor. Três
fumantes e um agente sentados em uma mesa. Cada fumante
possui dois dos três ingredientes para se fazer um cigarro: fósforo,
fumo e palha. O agente possui os três e aleatoriamente sorteia um
dos ingredientes. O fumante contemplado faz o seu cigarro, fuma e
libera o agente para fazer novo sorteio.

Resolução do exercício sobre mesa de fumantes.

3) Processos produtores e consumidores se sincronizam através de
um buffer circular com 5 posições (um array de 5 posições). Um
produtor gera um número aleatório e coloca no buffer caso exista
uma vaga. Um consumidor retira um número do buffer se houver.
Implemente utilizando monitor.

Resolução do exercício sobre sincronização através de array circular.

4) Suponha um ambiente em que processos compartilham
impressoras. Existem dois tipos de impressora: tipo A e Tipo B.
Existem 3 classes de processos: classe PA que somente utilizam
impressoras do tipo A, classe PB que somente utilizam impressoras
do tipo B e classe PAB que utilizam impressoras de qualquer tipo.
Esses processos, do tipo PAB, têm prioridade sobre os demais
quando não houver impressoras disponíveis. Implemente utilizando
monitor.

Resolução do exercício sobre impressoras.

5) Implemente o problema da ponte utilizando monitor. Uma ponte,
que separa duas cidades A e B, somente permite tráfego em um
sentido de A para B ou de B para A. Se a ponte estiver vazia pode
ser utilizada por carros de A ou de B. Se um carro de A acessou a
ponte, ela é trancada para os carros de B e todos os carros de A que
desejarem podem também acessar. Quando o último carro que sai
de A para B deixar a ponte, ela deve ser liberada.

Resolução do exercício sobre Ponte.

Lista dos 5 exercícios e sua resolução.

UPDATE 1: Exercícios que não estavam resolvidos foram resolvidos e adicionados. Lembro que o professor ainda não entrou uma correção do mesmo, mas testei eles e parece-me tudo ok.Lembrando também que estes exercícios foram disponibilizados aos alunos pelo Professor José Mazzucco Júnior.

Espero que isso seja util a todos,
Matheus

Mai 26 2009

Compartilhar internet com servidor na porta WAN.

Boa tarde,

Os ultimos dias passei instalando o servidor e com uns problemas para configurar o mesmo. Eu sabia como configurar a rede para funcionar da seguinte maneira:

MODEM -> (eth0) Servidor (eth1) -> (Porta lan) Router (Portas lan) -> Computadores

Porém não era essa topologia que eu desejava, pois com está eu perdia a porta WAN do meu roteador. Então decidi fazer a seguinte:

MODEM -> (eth0) Servidor (eth1) -> (Porta WAN) Router (Portas LAN) -> Computadores

Inicialmente, deixei meu servidor ligado somente ao modem e testei se o mesmo conseguia pingar a internet. Até o momento tudo ok.

Acessei o arquivo "/etc/network/interfaces" e configurei a eth1 manualmente da seguinte maneira:

auto eth1
iface eth1 inet static
address 192.168.100.254
netmask 255.255.255.0
network 192.168.100.0
broadcast 192.168.100.255

Logo em seguida adicionei as regras de iptables:

sysctl net.ipv4.ip_forward=1
iptables -t nat -A POSTROUTING --out-interface eth0 -j MASQUERADE
iptables -A FORWARD --in-interface eth0 -j ACCEPT

Teoricamente o compartilhamento de internet já devia estar funcionando. Mas não foi isso que aconteceu. Resolvi acessar o meu Roteador pela Lan e configura-lo manualmente da seguinte maneira:

IP Address : 192.168.100.1
Subnet Mask : 255.255.255.0
ISP Gateway Address : 192.168.100.254
Primary DNS Address : 200.247.141.11 (DNS VIRTUA SC)
Secondary DNS Address : 200.247.141.12 (DNS VIRTUA SC)

Salvei as modificações, esperei o mesmo ser reiniciado e pronto. Conexão funcionando.

Eu sei que isso não ficou como um tutorial, ficou um "relato" mas este relato pode lhe ajudar a configurar se você seguir os mesmos passos que eu. Lembre-se também que as regras de iptables devem ser executadas sempre na inicialização do servidor. Saiba mais sobre Executar scripts ao iniciar computador.

Demorei bastante tempo e testei várias configurações para que conseguisse tudo funcionando mas acredito que o meu maior problema foi ter usado a mesma Classe de IPS para a rede interna (atrás do roteador) e a "externa" (comunicação entre o roteador e servidor).

Qualquer problema com Compartilhamento ou coisas do tipo, não hesite em perguntar.

Espero que este artigo seja de grande ajuda,
Matheus

Agradecimentos ao Ubuntu Forum que me deu uma ajuda.

Mai 24 2009

Instalar Ubuntu pelo Pendrive.

Boa noite,

Neste post só gostaria de recomendar a você o post do Juliano Martins sobre como "Instalar o ubuntu pelo pendrive". E também de pedir desculpas por não ter publicado nada durante o fim de semana, é que perdi bastante tempo tentando conseguir deixar o pendrive pronto para realizar a instalação apartir do mesmo e quando consegui, descobrir que meu computador velho não tem opção de boot por usb. Gravar o ubuntu server umas 3x com erros. Felizmente hoje consegui um cd-r e consegui gravar o mesmo corretamente. O Ubuntu server já está instalado e logo irei começar a configurar o mesmo. Mantenho você informado sobre o que eu estou fazendo no mesmo.

Update: Gostaria de acrescentar que no ultimos mes fui testar a ferramenta do próprio Ubuntu, a USB Startup Disk Creator e ela funcionou muito bem. Você pode usar uma versão velha para criar o USB Startup Up disk. Quando eu realizei esse processo, utilizei um live cd do Ubuntu 9.04 e criei apartir do mesmo um pendrive bootavel do Ubuntu 9.10 Alpha 4.

Matheus Bratfisch

Mai 16 2009

Cliente e Servidor, Java XML-RPC

Boa noite,

Como havia comentado a algum tempo atrás, estava trabalhando com um cliente XML-RPC em Java, durante a fase de desenvolvimento do mesmo tive que criar um servidor XML-RPC hipotetico para testar as funcionalidades do cliente, enquanto o servidor certo ainda não estava disponivel para minha pessoa.

Resumidamente para você que não conhece XML-RPC ele é um "formato" , um "jeito", não sei ao certo a palavra certa para definir agora, onde você cria um servidor e o mesmo quando requisitado faz as operações necessarias e retorna um resultado. Um exemplo seria, você tem um código de criptografia que funciona MUITO bem em C, mas seu sistema é todo em Java, você poderia criar um Cliente JAVA e um Servidor C onde o Java faria requisição para Criptografar as coisas. Talvez utilizar XML-RPC de Java para Java possa ser meio estranho, mas quando os serviços estão distantes, pode ser algo util.

Para começar a mexer com o XML-RPC no Java eu utilizei o apache xml-rpc. Após isso apenas desenvolvi.

Baixe os exemplos cliente e servidor xml-rpc em java.

Servidor:

package xmlrpc;

import org.apache.xmlrpc.server.PropertyHandlerMapping;
import org.apache.xmlrpc.server.XmlRpcServer;
import org.apache.xmlrpc.webserver.WebServer;

public class ServidorXMLRPCParaTestes {

private static ServidorXMLRPCParaTestes euMesmo = null;

private ServidorXMLRPCParaTestes() {
try {
WebServer server = new WebServer(8185); // Cria um servidor na porta 8185
XmlRpcServer servidor = server.getXmlRpcServer(); // Pega o servidor XmlRpc
PropertyHandlerMapping phm = new PropertyHandlerMapping();
phm.addHandler("Calc", Calculadora.class); // Adiciona um novo "handler" ao PHM
servidor.setHandlerMapping(phm); // Define o handler no servidor
server.start(); // inicia o servidor.
} catch (Exception exception) {
System.err.println("JavaServer: " + exception);
}
}

public static ServidorXMLRPCParaTestes obterInstância() {
if (euMesmo == null)
euMesmo = new ServidorXMLRPCParaTestes();
return euMesmo;
}
}

- Eu utilizeo o obterInstancia para não poder existir mais de um ServidorXMLRPC ;)
- O handler faz o seguinte, quando for chamado Calc.METODO no servidor ele irá buscar dentro do Calculadora.class

Read more »

Mai 09 2009

Criando seu Proprio Tiny-URL.

Boa noite a todos,

Ontem pela madrugada estava pensando no Twitter e que ele reduz urls grandes automaticamente para um sistema escolhidos por eles. Então, estava a pensar em como fazer o meu próprio sistema criação de urls pequenas (tiny url) e pesquisei um pouco no Google. Achei várias referências que utilizei como base para elaboração do meu e os links das mesmas você poderá encontrar no final deste post.

Primeiramente você deve criar uma tabela em seu banco de dados com as seguintes características:

# CREATE TABLE IF NOT EXISTS `urls` (
# `uid` int(11) NOT NULL auto_increment,
# `url` text default NULL,
# `unique_chars` varchar(25) BINARY NOT NULL,
# PRIMARY KEY (`uid`),
# UNIQUE KEY `unique_chars` (`unique_chars`)
# );

Este código foi pego do Abhise no seu post "Create your own tinyurl with php and mySQL" que foi minha maior referência, da mesma peguei várias funções mas realizei algumas alterações para melhor eficiência e também tradução para você. Como no código acima foi adicionado o 'BINARY' para o unique reconhecer diferença entre AAAA e aaaa, por exemplo.

O Abhise diz para criarmos tais e tais arquivos, eu particularmente, criei um arquivo de funções onde adicionei as diversas funções utilizadas e simplesmente chamei as mesmas nos seus respectivos arquivos.

---- Para ler o artigo inteiro acesse o link abaixo.
Read more »

Mai 06 2009

Lista encadeada, Estrutura de dados.

Saudações,

Para não perder o costume, irei postar outro exercicio resolvido em uma aula. Dessa vez o exercicio é o seguinte:
- Implemenetar o sistema de contabilidade de um mafioso. (outros detalhes continue lendo o post)

O enunciado do mesmo se encontra no "read the rest of this entry" para não deixar o post muito extenso devido ao longo enunciado.

A resolução do mesmo você pode baixar aqui.

Read more »

Abr 29 2009

Lista com ponteiros, Estrutura de Dados.

Boa noite a todos,

Como ainda não produzi nada muito bom hoje em casa (no lab produzi algo relaciona a xml-rpc que pretendo postar em breve), resolvi postar mais um dos 198578951 exercicios que estou tendo que fazer para estrutura de dados. O Exercicio de hoje é nada mais nada menos que uma implementação de uma Lista com Ponteiros, ou seja, ela não tem limite de elementos (é claro, se a memoria for infinita).

Como no exercicio anterior, o enunciado fica para a pagina inteira pois é muito grande.

O exercicio resolvido você encontra aqui.

Read more »

Abr 28 2009

Pilha, com ponteiros, Estrutura de Dados.

Então, hoje vou demonstrar um dos outros exercicios que fizemos na aula de estrutura de dados, lembrando mais uma vez que estes são exercicios que eu faço rapidamente e não me importo muito com várias coisas pela falta de tempo. O que irei mostrar hoje é uma Pilha com vetores porém em vez de ele ter um inteiro indicando o ultimo elemento, o ultimo será um ponteiro para o ultimo elemento da pilha.

Para ver o enunciado inteiro continue lendo (enunciado grande).

Para baixar o arquivo, clique aqui!

Read more »

Abr 27 2009

Netbeans 6.5.1, Espaçamento..

Opa,

Como disse no post anterior instalei o NetBeans agora a pouco. Ao executar o mesmo, criar um novo projeto e arquivo percebo que o espaçamento (line-spacing) do mesmo está muito grande. Para alterar o mesmo você deve fazer o seguinte:

Editar o arquivo: org-netbeans-modules-editor-settings-CustomPreferences.xml

$ pico org-netbeans-modules-editor-settings-CustomPreferences.xml

Este arquivo está encontrado no seguinte diretorio:

/home//.netbeans/6.5/config/Editors/Preferences

Caso o arquivo e o diretorio existam simplesmente adicione as seguintes linhas:

<entry javaType="java.lang.Float" name="line-height-correction"
xml:space="preserve">
<value><![CDATA[0.75]]></value>
</entry>

Se o mesmo não exista, provavelmente você terá que criar o diretorio Preferences:

$ mkdir Preferences
(se você estiver no /home//.netbeans/6.5/config/Editors)

$ cd Preferences

E crie o arquivo:

$ pico org-netbeans-modules-editor-settings-CustomPreferences.xml

Adicione o seguinte conteudo:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE editor-preferences PUBLIC "-//NetBeans//DTD Editor Preferences 1.0//EN" "http://www.netbeans.org/dtds/EditorPreferences-1_0.dtd">
<editor-preferences>
<entry javaType="java.lang.String" name="code-template-expand-key" xml:space="preserve">
<value><![CDATA[TAB]]></value>
</entry>
<entry javaType="java.lang.Float" name="line-height-correction" xml:space="preserve">
<value><![CDATA[0.75]]></value>
</entry>
</editor-preferences>

Salve, reinicie o netbeans e pronto.

Uma otima noite a todos,
Matheus

English Version

Fontes:
http://my.opera.com/Nobita2708/blog/show.dml/2914020
http://www.linux4all.net/how_to_change_line_height_in_netbeans_editor
http://www.cs.wcupa.edu/rkline/netbeans-lin.html
http://www.google.com.br/search?hl=pt-BR&q=line+spacing+ubuntu+netbeans&btnG=Pesquisar&meta=

PS: Isso não é simplesmente uma tradução, a idéia basica está postada, mas aqui foram adicionadas algumas informações.

Abr 27 2009

Ubuntu com Netbeans Java e C

Boa noite,

Hoje pretendia instalar o netbeans 6.5.1 no Ubuntu 64 bits, baixei a versão que eu queria (C/C++) no site do netbeans. Tentava instalar o netbeans com o comando:

$ ./netbeans-6.5.1-ml-cpp-linux.sh

(PS: Tornei o mesmo executavel antes, com o comando $ chmod +x netbeans-6.5.1-ml-cpp-linux.sh)

Recebia a seguinte resposta:

x-warrior@x-warrior-desktop:~/Desktop$ ./netbeans-6.5.1-ml-cpp-linux.sh
Configuring the installer...
Searching for JVM on the system...
Extracting installation data...
Running the installer wizard...
x-warrior@x-warrior-desktop:~/Desktop$

Porém a parte grafíca não acontecia. Fui olhar o log da seguinte maneira:

$ sh netbeans-6.5.1-ml-cpp-linux.sh --verbose --output out.txt

Analisando o arquivo out.txt pude ver o seguinte erro:

[2009-04-27 20:56:18.173]: at org.netbeans.installer.Installer.main(Installer.java:78)
[2009-04-27 20:56:18.174]: ... show message dialog
[2009-04-27 20:56:18.174]: title: Critical Error
[2009-04-27 20:56:18.174]: message: An unexpected exception happened in thread main
[2009-04-27 20:56:18.174]:
[2009-04-27 20:56:18.174]: Exception:
[2009-04-27 20:56:18.174]: java.lang.NoClassDefFoundError:
[2009-04-27 20:56:18.175]: Could not initialize class java.awt.Toolkit

Infelizmente não sabia como corrigi-lo. Pesquisei um pouco e não achei nada que funcionasse. Então tive a brilhante idéia de instalar pelo synaptic. Instalei o netbeans que estava lá, tudo ocorreu normalmente. Executei o mesmo e fui criar um novo projeto, me deparo que a versão instalada era a para Java. Me decepcionei, afinal precisava mesmo da versão para C/C++. Quando fiz a instalação pelo synaptic percebi que existiam muitas dependencias, tentei instalar novamente a versão para C e vua-la. Consegui instalar a mesma. (Meio na gambiarra eu sei, afinal fiquei com 2 versões de netbeans uma para C e outra para Java, mas sem problemas já que eu utilizo as duas.)

Então caso você queira instalar a versão para C/C++, instale a versão de Java, ou suas dependencias somente e em seguida instale o para C/C++ que tudo vai ocorrer bem.

Ah, para um melhor entendimento editei o menu (Botao direito sobre Applications - edit menu), ele é muito intuitivo então não vou entrar em mais detalhes. Mas no mesmo editei os Netbeans 6.5 e 6.5.1 para Netbeans 6.5 (Java) e Netbeans 6.5.1 (C/C++). Assim não corro o problema de esquecer e abrir a versão errada perdendo tempo.

Espero que essa gambiarra dica ajude vocês.

Abraços,
Matheus

PS: Se alguem tiver a solução decente para conseguir instalar o Netbeans me avise que eu posto aqui. Ou caso eu descubra, postarei também.