"Cogito ergo sum"
RSS icon Email icon Home icon
  • Exercícios, Programação Concorrente.

    Posted on May 28th, 2009 Matheus (X-warrior) Bratfisch No comments

    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

  • Compartilhar internet com servidor na porta WAN.

    Posted on May 26th, 2009 Matheus (X-warrior) Bratfisch No comments

    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.

  • Instalar Ubuntu pelo Pendrive.

    Posted on May 24th, 2009 Matheus (X-warrior) Bratfisch 1 comment

    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

  • Gerando segunda senha para SSH aleatória.

    Posted on May 21st, 2009 Matheus (X-warrior) Bratfisch No comments

    Olá,

    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 > .senhaDoDia

    Este 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
    done

    Este 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=$senhaGerada

    Este 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 Matheus (X-warrior) Bratfisch No comments

    Boa 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-server

    Após isso você deve fazer algumas modificações para ficar mais seguro. Acesse o arquivo /etc/ssh/sshd_config
    $ sudo vi /etc/ssh/sshd_config

    AllowUsers 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/ssh

    Você 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
    fi

    Nã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-root

    Grato,
    Matheus

    Referencias:
    Desabilitar Comando SU
    Informação MaxStartups

    Duas 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 Matheus (X-warrior) Bratfisch No comments

    Boa 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 Matheus (X-warrior) Bratfisch No comments

    Boa 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 up

    Habilitar 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 ACCEPT

    Redirecionando 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 3333

    Apó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 Bratfisch

    PS: 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 Matheus (X-warrior) Bratfisch 3 comments

    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 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

    Read the rest of this entry »

  • Instalar Windows 7 no VirtualBox.

    Posted on May 14th, 2009 Matheus (X-warrior) Bratfisch 1 comment

    Boa 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,
    Matheus

    English 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 Matheus (X-warrior) Bratfisch 2 comments

    Boa 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

    English Version: Block root access