-
Exercícios, Programação Concorrente.
Posted on May 28th, 2009 No commentsBoa 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 -
Compartilhar internet com servidor na porta WAN.
Posted on May 26th, 2009 No commentsBoa 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.255Logo 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 ACCEPTTeoricamente 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,
MatheusAgradecimentos ao Ubuntu Forum que me deu uma ajuda.
Aprendendo, Linux compartilhar, internet, lan, Linux, modem, roteador, servidor, wan -
Instalar Ubuntu pelo Pendrive.
Posted on May 24th, 2009 1 commentBoa 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
-
Gerando segunda senha para SSH aleatória.
Posted on May 21st, 2009 No commentsOlá,
Ontem mostrei para você como deixar seu SSH mais seguro e até mesmo como pedir outra senha no mesmo. Mas me deu uma idéia na cabeça que está senha poderia ser gerada aleatoriamente todos os dias. Então pensei e cheguei a seguinte idéia. Todos os dias, em tal hora, será gerada uma segunda senha nova. Está será enviada para mim por e-mail. Ou seja ao acessar o SSH precisarei colocar a senha do meu usuário, logo em seguida a senha que foi gerada e está em meu e-mail.
Shell-script para gerar senha Aleatoria (.gerarSenha):
caracteres=(a b c d e f g h i j k l m n o p q r s t u v w y x z 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 X W Y Z)
total=(${#caracteres[*]})
for ((i=1; i<=10; i++)); {
Valor=$((RANDOM%$total))
String=”$String${caracteres[$Valor]}”
}
echo $String > .senhaDoDiaEste arquivo criara uma seqüência aleatória de caracteres e salvara ela no arquivo “.senhaDoDia”
Script para pegar a senha do .senhaDoDia (.leitorLinha):
while read linha
do
senhaGerada=$linha
doneEste arquivo lê o conteúdo do arquivo que for passado como “parâmetro”
Arquivo PHP que envia a senha para meu e-mail (sendMail.php):
<?
$s = $_GET['s'];
mail(”E-MAIL”, “ASSUNTO”, “Sua senha de hoje é $s”);
?>Script para enviar senha (.enviarSenha):
source .secure/.leitorLinha < .secure/.senhaDoDia
wget http://www.suapagina.com/sendMail.php?s=$senhaGerada -q
rm -rf sendMail.php?s=$senhaGeradaEste arquivo utiliza o .leitorDeLinha para colocar a .senhaDoDia em $senhaGerada e faz uma requisição ao endereço que tem a função de enviar e-mail. O mais correto era configurar o próprio servidor para enviar o e-mail não dependendo assim de duas máquinas. Eu simplesmente fiz assim, pois não estou com vontade de configurar um servidor de e-mail no momento e para testes resolvi utilizar minha hospedagem.
As mudanças no seu .profile devem ser as seguintes (.profile):
source .secure/.leitorLinha < .secure/.senhaDoDia
echo Digite sua senha de segurança:
read senha
if [ $senha == $senhaGerada ]Pronto, agora você tem um script que gera uma senha aleatoria, envia para seu e-mail e pede a mesma quando você se logar no seu SSH. Lembrando que você deve colocar o .gerarSenha para ser executado sempre tal dia em tal horário ou uma condição que você preferir. Lembro também que caso está máquina seja a sua caseira, que você utiliza o X e coisas do tipo, talvez possam ocorrer problemas se você se logar em uma tela já do ambiente gráfico pois acredito que ele pedira a senha de segurança. Não testei em um computador com o X, então enquanto isso recomendo está prática apenas para “servidores” ou computadores que terão seu SSH acessado remotamente (não esqueça você vai precisar de internet para pegar a senha em seu e-mail)
Matheus Bratfisch
Arquivos para gerar, enviar, ler segunda senha do ssh.
PS: Desculpe-me se ficou algo confuso, sabe como são essas idéias malucas né? Mas qualquer dúvida entre em contato comigo.
-
Instalar e deixar seu servidor SSH mais seguro.
Posted on May 20th, 2009 No commentsBoa noite,
Estou com umas idéias de coisas que planejo “desenvolver” para navegar de maneira mais segura. Como precisarei do SSH, acesso a portas das máquinas virtuais e coisas assim estou fazendo posts relacionados a estes assuntos já que precisarei dos mesmos para “desenvolver” tal segurança. E assim, o futuro post não ficará tão extenso.
Para você instalar o ssh-server no Ubuntu é muito simples:
$ sudo apt-get install openssh-serverApós isso você deve fazer algumas modificações para ficar mais seguro. Acesse o arquivo /etc/ssh/sshd_config
$ sudo vi /etc/ssh/sshd_configAllowUsers USUARIO #habilita somente este usuario
AllowGroups GRUPO_DO_USUARIO # habilita somente este grupo
PasswordAuthentication yes
MaxStartups 2:100:2
Port XXX # Alguma porta aleatoria de sua vontade que não esteja em uso.O que o MaxStartups faz? Especifica o número máximo de conexões não autenticadas ao servidor. Sua sintaxe é a seguinte inicio:porcentagem:maximo. Vamos supor, inicio = 10, porcentagem = 50, maximo = 20. Quando for atingidas 10 conexões ele irá iniciar com a porcentagem, ou seja, uma conexão terá chance de ser fechada de cara ou não, a mesma aumenta linearmente até o número máximo de conexões, e apartir dessa todas são negadas. Eu particularmente pensei um pouco e decidi adotar o inicio com 2, porcentagem com 100 e máximo como 2 então qualquer nova conexão apartir de 2 será automaticamente recusada. (Isso pode ser um problema caso existam pessoas tentando invadir seu servidor e provavelmente estarão utilizando todas as sessões). Talvez o recomendavel seja mais correto 10:30:60 porém prefiro deixar o meu mais restrito.
/etc/init.d/sshVocê ainda pode adicionar o seguinte código ao /home/usuario/.profile:
echo Digite sua senha de segurança:
read senha
if [ $senha == "SUA_SENHA" ]
then
# CÓDIGOS QUE JÁ ESTÃO NO PROFILE!
else
exit
fiNão se esqueça de bloquear acesso do root
Na minha máquina também desabilitei o comando “su” da seguinte maneira:
$ chmod 700 /usr/bin/su-to-rootGrato,
MatheusReferencias:
Desabilitar Comando SU
Informação MaxStartupsDuas dicas que não são relacionadas com segurança, você pode descomentar a linha
Banner /etc/arquivo # Default /etc/issue.net
A mensagem que está dentro do /etc/arquivo irá ser exibida quando se conectar no SSH.
Para editar a mensagem que apareça assim que o usuario se loga você deve editar o /etc/motd.
-
Executar script ao iniciar computador.
Posted on May 19th, 2009 No commentsBoa noite,
Hoje vou passar uma simples dica, porém util de como executar um script (como o de redirecionamento de portas que falei sobre no post anterior) quando o sistema iniciar.
Foi assim que fiz no Ubuntu, porém acredito que o mesmo deve funcionar com outros sistemas operacionais. Inicialmente você deve mover o arquivo que você deseja para /etc/init.d/ você pode usar o comando “mv arquivo /destino/aqui”
Após isso deve acessar o arquivo /etc/rc.local (como root) e adicionar o script que você deseja executar. Você deve utilizar o caminho completo: /etc/init.d/firewall.sh por exemplo. Você também deve setar privilegios de execução ao mesmo. Você pode fazer isso utilizando o comando “chmod +x /etc/init.d/arquivo”.
PS: Você deve adicionar antes do exit 0 no arquivo rc.loca.
Arquivo para liberação de portas em firewall.
Atenciosamente,
Matheus -
Redirecionando portas para VirtualBox.
Posted on May 18th, 2009 No commentsBoa tarde,
Alguns dias atrás estava pensando em rodar serviços dentro de máquinas virtuais. O que me deixava com a pulga atrás da orelha era como eu iria fazer o redirecionamento de portas. Então utilizei o Grande Oraculo e pesquisei durante bastante tempo para conseguir que funcionasse. Utilizei o “VBoxManage setextradata”, mas não tive sucesso. Caso você queira tentar, veja como configurar redirecionamento de portas para virtualbox usando VBoxManage.
Inicialmente você deve criar uma interface “tap”
#sudo tunctl -u $USER
Definir o IP da interface tap
#sudo ip addr add 192.168.0.20/32 dev tap0
# sudo ip link set tap0 upHabilitar ip forward
# sudo sysctl net.ipv4.ip_forward=1
Adicionar Rota
#sudo route add -host 192.168.0.150 dev tap0
NAT:
# sudo iptables –flush
#sudo iptables -t nat –flush
#sudo iptables -t nat -A POSTROUTING –out-interface eth1 -j MASQUERADE
#sudo iptables -A FORWARD –in-interface eth1 -j ACCEPTRedirecionando a porta 3333 para 3389:
#iptables -t nat -A PREROUTING -i eth1 -p tcp -d 192.168.0.100 –dport 3333 -j DNAT –to 192.168.0.150:3389
eth1 – Minha placa de rede conectada ao meu roteador.
192.168.0.150 – IP da Máquina Virtual (configurada manualmente)
192.168.0.20 – IP da tap
192.168.0.100 – IP da minha máquina real que recebera conexões na porta 3333Após este processo, está “tudo” pronto para você rodar um serviço na porta 3389 da sua máquina virtual. Você deve mudar as suas configurações do VirtualBox. Acesse “Settings – Network – Attached to – Selecione Bridged Adpater”, logo em seguida selecione o “Name” para tap0. Inicie sua máquina virtual e configure o ip da mesma manualmente da seguinte maneira:
IP: 192.168.0.150
Subnet Mask: 255.255.255.0 (verifique se a sua é essa na sua maquina real)
Default Gateway: 192.168.0.100 (ip da maquina real)Agora sua Maquina virtual está com acesso normal a internet e também com a sua porta 3389 aberta, sendo que a mesma será acessada externamente por 3333.
Já que tive problemas com o ‘–’ estou disponibilizando um link para download do mesmo. Arquivo para liberação de portas em firewall.
Espero que seja útil,
Matheus BratfischPS: Não sei porque diabos em vez de ficar –flush por exemplo está ficando -flush. Então caso você tenha problemas com os comandos, tente adicionar o — na frente do FLUSH, do out-interface, do in-interface, do dport e do “to”. Foram nesses que eu encontrei problema, caso você tenha algum outro, avise-me.
Referencias:
IPtables Tutorial
IPTables Port Redirect
VirtualBox, com nat
VBoxManage Port Forward -
Cliente e Servidor, Java XML-RPC
Posted on May 16th, 2009 3 commentsBoa 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 mecher 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 -
Instalar Windows 7 no VirtualBox.
Posted on May 14th, 2009 1 commentBoa noite,
Hoje em uma das minhas aulas, um dos professores estava usando o Windows 7 como seu sistema operacional “principal”, achei um tanto quanto estranho. Além do que o mesmo afirmou que desde que ele instalou, o Windows 7 não deu nenhum problema e não travou nenhuma vez. Eu decidi testar o mesmo também, mas com mais cautela no VirtualBox. Então, aqui vamos nós!
Primeiro você deve acessar a página da microsoft windows 7. Na mesma, você deve baixar a versão que você deseja, 32bit, 64bits, versão TI… não sei direito ao certo o que é essa versão, mas vi que tem está opção. Você também vai ter que preencher um formulário, receberá um e-mail com um link para confirmação de e-mail. Após confirmado, você poderá acessar uma página com o Link para download e com CD-KEY.
Após baixado, abra seu virtualbox, vá na opção “New”, coloque um nome de sua preferencia. Altere para Windows, versão Windows 7 (32/64) dependendo qual você vai instalar. (Não sei direito se o VirtualBox suporta 64bits.). Crie, escolha a memoria que você deseja dedicar. Eu particularmente criei um novo “HD virtual” com 15GB. (acho que é o suficiente). Mandei iniciar, o VirtualBox por si só, já perguntou qual imagem/cd eu gostaria de usar no boot. Coloquei o ISO para ser “emulado” como se fosse o cd e pronto.
Agora escolhi as opções de instalação e o mesmo está sendo instalado. (As opções de instalação são simples e intuitivas. Não vou descrever as mesmas.)
Bom, estou esperando a instalação acabar. Quando eu acabar de instalar a mesma e testar algumas de suas opções, eu posto novamente no blog (ou edito este post), falando sobre minha experiencia com o Windows 7 e alguns truques (caso eu descubra algo interessante ou como fazer funcionar uma coisa ou outra).
Abraços,
MatheusEnglish Version: Windows 7 with VirtualBox
PS: Primeira coisa que vou fazer quando o mesmo estiver instalado é testar se o VirtualBox Guest Additions funciona no mesmo. Ai eu edito este post, dando novas informações
-
Bloquear acesso root no ssh.
Posted on May 13th, 2009 2 commentsBoa noite,
Este post será breve, só quero lembrar você de desabilitar o acesso do root no seu servidor ssh. Edite o arquivo “/etc/ssh/sshd_config”
$ sudo vi /etc/ssh/sshd_config
Procure a linha “#PermitRootLogin no” e descomente-a.
Salve o arquivo.
Reinicie seu servidor$ sudo /etc/init.d/sshd restart
Logo (assim que eu tiver tempo) pretendo formar o servidor aqui em casa e pretendo colocar os passos que eu fiz para instalar o mesmo e algumas configurações importantes para tornar o mesmo mais seguro.
Abraços,
Matheus








