\documentclass[11pt]{article}
\usepackage[latin1]{inputenc}
\usepackage[brazil]{babel}

%\usepackage{pstricks}
\usepackage{graphicx}

%\setlength{\textheight}{8.5in}

%\setlength{\textwidth}{6.4in}
%\setlength{\evensidemargin}{0pt}
%\setlength{\oddsidemargin}{0pt}

%\setlength{\topmargin}{-0.5cm}
%\setlength{\textheight}{20cm}

\newcommand{\MM}{\emph{Mau-Mau}}
\newcommand{\SMMD}{\emph{SMMD}}
\newcommand{\Java}{\emph{Java}}
\newcommand{\JavaD}{\emph{Java 2}}
\newcommand{\Perl}{\emph{Perl}}
\newcommand{\CPP}{\emph{C++}}
\newcommand{\CORBA}{\emph{CORBA}}

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

\title{MAC 322/5755 -- Sistemas Operacionais Distribuídos\\
       \vspace{5pt}
       \large {IME-USP -- Segundo Semestre de 2001 -- Prof. Fabio Kon} \\
       \vspace{17pt}
       \Large Projeto de Implementação de Software:\\
       SMMD - Sistema de Mau-Mau Distribuído\\
       \bf Relatório
      }
\author{Andrei Goldchleger
        $\ $--$\ $ \texttt{andgold@linux.ime.usp.br}
        \and Leo Kazuhiro Ueda
        $\ $--$\ $ \texttt{lku@linux.ime.usp.br}
        \and Nelson Guedes Paulo Junior
        $\ $--$\ $ \texttt{npaulo@linux.ime.usp.br}
        \and Wagner César Bruna
        $\ $--$\ $ \texttt{wbruna@linux.ime.usp.br}
       }
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

\begin{document}

\maketitle

%=============================================================================

\section{Introdução}

Este documento descreve sucintamente o
\emph{Sistema de Mau-Mau Distribuído}  (\SMMD{}), um projeto
de implementação de um serviço de partidas do jogo de cartas
\MM{}.


%=============================================================================
\section{O Software}

O Sistema é composto por pacotes implementados em diversas linguagens.
Os pacotes que de fato fornecem os serviços do \SMMD{}
foram escritos em \Java{}.
Os pacotes que se utilizam dos serviços (os clientes)
foram implementados em \JavaD{}, \CPP{} e \Perl{}.


\subsection{Arquitetura}

A implementação está organizada no
modelo cliente-servidor.

O servidor controla toda a partida, talvez a característica mais relevante
seja o uso de \CORBA{} para a comunicação.
Isso permitiu a implementação de clientes multi-plataforma e
multi-linguagem.

O protocolo de comunicação entre o cliente e o servidor
foi definido de forma a facilitar a implementação de clientes
completamente diferentes.
Ele é flexível o suficiente para implementar
desde simples clientes em modo texto (interativos
ou automáticos) até sofisticados clientes gráficos.

\subsubsection{O Servidor}

O servidor é composto pelos pacotes:

\begin{description}
  \item[smmd.jogo] Fornece classes e interfaces para executar partidas concorrentes
de Mau-Mau. Cada partida é representada por uma instância da
classe \texttt{Mesa}, e é possível configurar regras e inserir jogadores
com a partida em andamento.
A implementação das regras procurou trazer a flexibilidade das regras
do \MM{} real para o sistema.
  \item[smmd.serv] Fornece classes e programas para a execução de partidas, usando
as classes do pacote \texttt{smmd.jogo}.
É o pacote que fornece o serviço \SMMD{} em si.
  \item[smmd.corba] Fornece as implementações das interfaces definidas pela IDL.
As duas classes principais são \texttt{smmd.corba.CMMCorba}, que representa
um jogador, e \texttt{smmd.corba.GPCorba}, que representa um localizador de
partidas implementado em \texttt{smmd.serv}.

\end{description}

Para o pacote \texttt{smmd.jogo}, um cliente$\ $ é representado pela interface
\texttt{smmd.jogo.CerebroMM}.
O pacote \texttt{smmd.corba} fornece uma implementação dessa interface,
a classe \texttt{smmd.corba.CMMCorba}, que
é justamente a implementação do objeto remoto.


\subsubsection{Os Clientes \CORBA{}}

Para o cliente, o servidor responsável por uma partida específica é representado
por um objeto \texttt{smmd.corba.CMMCorba}.
Esse objeto atende a pedidos de informações sobre a partida, e fornece
os comandos de jogo (como descartes e compras).

Há uma outra classe, \texttt{smmd.corba.GPCorba}, que representa um registro
de partidas no servidor. Esse registro (gerenciador de partidas) fornece
informações das partidas sendo executadas no servidor e permite a entrada
nessas partidas (fornecendo iors de instâncias de \texttt{smmd.corba.CMMCorba}).

Os clientes podem escolher obter diretamente uma referência a um objeto
\texttt{smmd.corba.CMMCorba}, sem que tenha que pedir para um objeto
\texttt{smmd.corba.GPCorba}.
Entretanto, nesse projeto não utilizamos nenhum serviço de nomes
(não suprido pelo pacote EngineRoom), as IOR's
foram disponibilizadas através do sistema de arquivos da rede.

Desse modo, o programa \texttt{smmd.serv.Servidor} cria apenas uma partida e
grava IOR's em arquivos.
O programa \texttt{smmd.serv.ServidorInterativo} fornece um serviço de gerenciamento
de partidas. Ele também instancia um objeto \texttt{smmd.corba.GPCorba}, o que
possibilita que clientes \CORBA{} entrem nas partidas.


\subsubsection{Protocolo de Comunicação}

No caso de uma partida, há um protocolo de comunicação entre o servidor
e um objeto \texttt{smmd.jogo.CerebroMM}.
Os requisitos para que uma implementação
\texttt{smmd.jogo.CerebroMM} seja aceitável, isto é, para que possa participar
de um jogo, são bem poucos.
Além desses requisitos, há diversos serviços opcionais dos quais um cliente
pode usufruir.

Um objeto
\texttt{smmd.corba.CMMCorba}
traduz esse protocolo, mantendo baixa a quantidade de requisitos obrigatórios.

Com isso implementamos clientes com características muito diferentes.

\section{Observações}


\subsection{Dificuldades}

\begin{description}
  \item[ORB] Após pesquisar diversas implementações de ORBs, e descobrirmos
que interoperabilidade não é uma realidade,
localizamos apenas uma que
possui compilação para as três linguagens do sistema: a ORB EngineRoom. Tivemos
problemas para compilar as bibliotecas e executar os testes, precisamos inclusive
criar um patch. Ainda assim, o sistema apresenta defeitos interessantes: dependendo
da máquina que executa o servidor, os clientes não são capazes de instanciar os
objetos CORBA.

  \item[Desenvolvimento concorrente] Conforme o sistema crescia, começamos a ter
problemas com seu desenvolvimento, pois normalmente trabalhamos em separado. Assim,
instalamos em nossa rede Linux um repositório do sistema CVS, e passamos a utilizá-lo.

\end{description}

\subsection{Documentação}

O sistema é relativamente grande, possuindo aproximadamente 15000 linhas de código.
Devido a tal fato, não conseguimos implementar toda a funcionalidade que desejávamos.
Boa parte do código do servidor possui comentários \emph{javadoc}, mas apesar disso,
os módulos não foram documentados apropriadamente (provavelmente serão no
futuro). Nossa lista de discussão registrou mais de 500 emails em menos de três meses,
e acabou por constituir uma documentação informal do sistema.



\section{Referências}

O Mau Mau é um jogo conhecido pela facilidade de inclusão
de regras inventadas.
Definiremos como padrão o conjunto regras que se encontra em
\texttt{http://www.linux.ime.usp.br/$\sim$wbruna/textos/maumau.htm}.

Estamos construindo também
uma página com informações mais detalhadas
sobre este projeto, ela está disponível em\\
\texttt{http://www.linux.ime.usp.br/$\sim$npaulo/maumau}.


\end{document}
