Skip to content

Instantly share code, notes, and snippets.

@gusalbukrk
Last active June 19, 2024 02:25
Show Gist options
  • Save gusalbukrk/6d6bb0b623305274300e949e0c6a88fb to your computer and use it in GitHub Desktop.
Save gusalbukrk/6d6bb0b623305274300e949e0c6a88fb to your computer and use it in GitHub Desktop.
#BOCA #MaratonaLinux #tutorial

Instalação e configuração do BOCA e Maratona Linux

BOCA (BOCA Online Contest Administrator) e Maratona Linux são dois sistemas gratuitos e de código aberto amplamente adotados para auxiliar na realização de competições de programação. Embora compartilhem extensivamente do mesmo grupo de mantedores, são dois projetos distintos que podem ser utilizados separadamente. No entanto, são comumente empregados em conjunto devido ao fato de possuírem funcionalidades complementares.fonte, 4:53 - 5:57

Essas ferramentas são utilizadas em conjunto nas competições latino-americanas que funcionam como classificatórias para a competição mundial de programação do ICPC (International Collegiate Programming Contest). Isso inclui ambas as fases da Maratona de Programação da SBC (Sociedade Brasileira de Computação).fonte, 0:00 - 3:30 É relevante ressaltar que o ICPC, por outro lado, utiliza ferramentas própriasfonte. Ademais, o BOCA e o Maratona Linux são frequentemente utilizadas em competições que não possuem filiação com a SBC. Isso ocorre pois esses são sistemas robustos que já estão sendo utilizados há anos em eventos de larga escala e também como forma de preparação para caso algum competidor eventualmente participe de uma competição oficial da SBC.

Conforme dito anteriormente, o BOCA e o Maratona Linux possuem funcionalidades distintas e complementares. O BOCA é uma sistema desenvolvido em PHP e PostgreSQL acessível através de um navegador. Em suma, os organizadores de competições utilizam o BOCA para cadastrar equipes e problemas, avaliar submissões e responder dúvidas e os competidores utilizam o BOCA para visualizar os problemas, submeter soluções e acompanhar as correções. Por outro lado, o Maratona Linux é um versão modificada do Linux Ubuntu que possui um conjunto de ferramentas (compiladores, editores de texto, etc.) pré-instaladas para auxiliar os competidores durante a maratona. Além disso, o Maratona Linux possui um conjunto de configurações que visam impedir o acesso à internet e a conexão com dispositivo de mídia física (como pendrives e partições diferente daquela que está sendo usada pelo próprio Maratona Linux).

Resumidamente, a configuração da infraestrutura necessária para conduzir uma maratona de programação com a utilização do BOCA e do Maratona Linux é dividida nas seguinte etapas: instalação do BOCA em um servidor, instalação do Maratona Linux nos computadores que serão utilizados pelas equipes competidoras e configuração da conexão entre o BOCA e o Maratona Linux. Entretanto, há diferentes formas de instalar o BOCA e o Maratona Linux e a seleção da alternativa mais adequada deve ser fundamenta nas particularidades de cada competição, tais como a quantidade de equipes participantes e o conhecimento técnico dos técnicos de laboratório. A seguir são apresentadas as instruções para os métodos mais comuns de instalação do BOCA e do Maratona Linux.

É relevante mencionar que esse tutorial foi elaborado com base nas seguintes versões:

  • Ubuntu Desktop 22.04.3;
  • Ubuntu Server 22.04.3;
  • maratona-desktop 20230227;
  • BOCA 1.5.19-1.

Instalação do BOCA

É possível instalar o BOCA em um computador local ou na nuvem. Os fatores a serem considerados para a escolha entre essas duas opções são:

  • Nível de experiência dos técnicos de laboratório com a hospedagem em nuvem: a instalação local é mais simples pois não demanda conhecimento de hospedagem em nuvem. No entanto, ressalta-se que alguns provedores de nuvem são de fácil utilização e possuem baixo custo.
  • Quantidade de equipes participantes: a instalação na nuvem é mais adequada para competições com um grande número de equipes participantes pois é possível escalar a infraestrutura de acordo com a demanda.
  • Localização dos participantes: a instalação local é adequada somente para competições centralizadas em que todos os participantes estarão presentes em um mesmo local utilizando computadores conectados a uma mesma rede.
  • Disponibilidade de internet: quando o BOCA está instalado localmente não é necessário possuir acesso à internet durante o evento. Isso é vantajoso, pois falhas na internet não irão interferir no andamento da competição.

A instalação e utilização do BOCA quando instalado na nuvem é praticamente idêntica ao BOCA instalado localmente. Para o administrador do BOCA, a principal diferença é que o SSH (Secure Shell Protocol) será utilizado para realizar o login remoto na máquina do provedor de nuvem ao invés de acessar o terminal diretamente da máquina em que o sistema está instalado tal como ocorre em uma instalação local. Enquanto que para os usuários (organizadores e competidores) a única diferença perceptível é que o BOCA hospedado na nuvem é acessado através de um endereço IP público e não através de um endereço IP local.

O provedor de nuvem escolhido para demostrar como é feito a instalação do BOCA na nuvem foi o DigitalOcean devido à sua facilidade de uso e preço acessível. No entanto, é importante ressaltar que o BOCA na sua versão atual pode ser instalado em qualquer provedor de nuvem em que é possível instalar o sistema operacional Ubuntu Server 22.04.

Outra decisão há ser tomada antes de prosseguir com a instalação está relacionada a como organizar os diferentes componentes do BOCA. O BOCA é composto por três componentes: servidor web, banco de dados e autojudge. Esses componentes podem ser instalados em uma mesma máquina ou em máquinas distintas. A instalação dos componentes em máquinas diferentes é recomendada para que o consumo de recursos por parte de um componente não interfira no desempenho de um outro componente. No entanto, a instalação de todos os componentes em uma mesma máquina é perfeitamente razoável para competições de pequeno porte. Por fim, há também a opção de utilizar o boca-docker que é um projeto que visa facilitar a instalação do BOCA através da utilização de containers Docker. Isso torna possível usufruir das vantagens proporcionadas pelo Docker, como: portabilidade (isso é, possibilita instalação do BOCA em outros sistemas operacionais além do Ubuntu), modularidade e escalabilidade. Essa é uma boa alternativa para técnicos de laboratório que já possuem experiência na utilização do Docker.

Instalação local

Utilizaremos máquinas virtuais para demostrar como é feita a instalação local do BOCA. Essa é uma alternativa mais eficiente, pois a criação, clonagem e exclusão de sistemas operacionais são procedimentos mais ágeis de serem realizados em máquinas virtuais do que em máquinas físicas. O processo de instalação em bare metal é praticamente idêntico à instalação em uma máquina virtual, com a exceção das etapas iniciais que incluem a criação de um pendrive bootável e a configuração do particionamento do disco rígido, ao invés da configuração de software de virtualização e definição de especificações da máquina virtual. Ademais, a seção Instalação do Maratona Linux contém uma discussão mais detalhada acerca das vantagens e desvantagens da instalação do Maratona Linux em máquina física em comparação com a instalação em máquina virtual que pode ser generalizada para a instalação do BOCA.

  1. Faça o download da última versão do Ubuntu Server 22.04.
  2. Faça o download e instale o VirtualBox.
  3. Abra o VirtualBox e crie uma nova máquina virtual com as seguintes especificações:
  • Nome: boca;
  • Tipo: Linux;
  • Versão: Ubuntu 22.04 LTS (Jammy Jellyfish) (64-bit);
  • Memória Base: 4096MB;
  • Processadores: 4;
  • Tamanho do disco: 15GB.
  1. Nas configurações da máquina recém-criada, performe as seguintes modificações:
    1. Na aba de Armazenamento, adicione como Dispositivo IDE Secundário 0 a image ISO baixada na etapa 1.
    2. Na aba de Rede, mude o tipo de conexão da placa de rede de Nat para Placa em modo Bridge para que a máquina virtual faça parte da mesma rede da máquina hospedeira com um IP próprio.
  2. Inicie a máquina virtual e instale o Ubuntu selecionando as seguintes opções no menu de instalação (use os valores padrões para as configurações não listadas abaixo):
  • Language: Português;
  • Keyboard layout: Portuguese (Brazil);
  • Base for the installation: Ubuntu Server; habilite Search for third-party drivers;
  • habilite Use an entire disk; desabilite Set up this disk as an LVM group;
  • deixe Install OpenSSH Server desabilitado ;
  • na tela de seleção de snaps a instalar, deixe todos desmarcados pois não faremos uso de nenhum deles.
  1. Após a instalação finalizar, selecione Reboot now para reiniciar o sistema.
  2. Execute sudo apt update && sudo apt full-upgrade -y para atualizar o sistema.
  3. Execute sudo add-apt-repository ppa:icpc-latam/maratona-linux para adicionar o repositório em que são disponibilizados os pacotes do BOCA e do Maratona Linux.

Instalação de todos os componentes em uma mesma máquina

  1. Execute sudo apt install boca -y && sudo boca-createjail para instalar todos os 3 componentes (servidor web, banco de dados e autojudge) do BOCA; alguns prompts aparecerão durante a instalação, responda-os da seguinte maneira:
  • deixe o host do banco de dados com o valor padrão (localhost);
  • insira uma senha confidencial e segura para o banco de dados;
  • responda com Y quando perguntado se você quer sobrescrever o arquivo pg_hba.conf;
  • responda com Yes quando perguntado se você quer criar um novo banco de dados para o BOCA.
  1. Ao final da instalação, o seguinte erro talvez seja exibido: W: Download is performed unsandboxed as root as file '/var/cache/apt/archives/partial/libdebuginfod-common_0.186-1build1_all.deb' couldn't be accessed by user '_apt'. - pkgAcquire::Run (13: Permission denied). Esse erro é inofensivo e pode ser ignorado.
  2. Após a instalação concluir, execute hostname -I para descobrir o endereço IP do servidor BOCA e use esse endereço (por exemplo: http://10.2.73.216/boca) para acessar o BOCA de qualquer máquina conectada na mesma rede local do servidor.

Instalação dos componentes em máquinas diferentes

  1. Execute systemctl poweroff para desligar a máquina virtual.
  2. No VirtualBox, clone a máquina boca duas vezes utilizando as seguintes opções:
  • Política de Endereço MAC: Gerar novos endereços MAC para todas as placas de rede;
  • Opções Adicionais: desabilite Manter Nomes dos Discos e Manter UUIDs do Hardware;
  • Tipo de Clone: Clone completo.
  1. Renomei as três máquinas virtuais existentes para boca-web, boca-db e boca-autojudge.
  2. Inicie a máquina boca-db, execute sudo apt install boca-db -y (use a seção anterior como referência para responder os prompts que aparecerão durante o processo de instalação) e execute hostname -I para descobrir o endereço IP interno dessa máquina.
  3. Inicie a máquina boca-web e execute sudo apt install boca-web -y (durante a instalação, insira o endereço que foi descoberto na etapa anterior quando um prompt aparecer solicitado o endereço do banco de dados). Após a instalação ser finalizada, execute hostname -I para descobrir qual endereço IP usar para acessar o BOCA.
  4. Inicie a máquina boca-autojudge, execute sudo apt install boca-autojudge -y && sudo boca-createjail (durante a instalação, insira o endereço que foi descoberto na etapa ante anterior quando um prompt aparecer solicitado o endereço do banco de dados).
  5. Ao final da instalação, o seguinte erro talvez seja exibido: W: Download is performed unsandboxed as root as file '/var/cache/apt/archives/partial/libdebuginfod-common_0.186-1build1_all.deb' couldn't be accessed by user '_apt'. - pkgAcquire::Run (13: Permission denied). Esse erro é inofensivo e pode ser ignorado.

boca-docker no Windows

  1. Em uma máquina Windows 10 ou 11, instale o WSL e a distribuição Ubuntu (informações mais detalhadas podem ser encontradas no site oficial da Microsoft).
  2. Abra as Configurações, clique em Aplicativos na barra lateral da esquerda, clique em Recursos opcionais, clique em Mais recursos do Windows, habilite Plataforma de Máquina Virtual e Subsistema do Windows para Linux e reinicie o computador.
  3. Execute wsl --update.
  4. Execute wsl --install -d Ubuntu para instalar a distribuição Ubuntu.
  5. Download e instale o Docker Desktop.
  6. Execute net localgroup docker-users $env:UserName /ADD para adicionar o usuário atual ao grupo do Docker e reinicie o computador para evitar o error O usuário atual deve estar no grupo 'docker-users' para usar o Docker Desktop. Adicione-se ao grupo 'docker-users' e, em seguida, faça logon do Windows..
  7. Faça o download dos arquivos docker-compose.yml e docker-compose.prod.yml do repositório do boca-docker.
  8. Execute docker compose -f docker-compose.yml -f docker-compose.prod.yml up -d para criar e executar os contêiners e aguarde a finalização da execução.
  9. Descubra o IP interno da máquina executando o comando ipconfig para acessar o BOCA através desse endereço (por exemplo: http://10.2.73.216:8000/boca) a partir de qualquer máquina conectada na mesma rede local do servidor.

Instalação na nuvem

  1. Crie uma conta no DigitalOcean e faça login.
  2. Crie uma droplet que utiliza o Ubuntu 22.04 como sistema operacional, selecione a opção de login através de senha ao invés de chava de SSH para que seja mais fácil acessar o servidor a partir de qualquer máquina e, por último, selecione as especificações da máquina de acordo com a quantidade de equipes que competirão na maratona. Instruções detalhadas estão disponíveis no site do DigitalOcean. Após o término do processo de criação, copie o endereço IP da máquina recém criada.
  3. Use o protocolo SSH para acessar remotamente o servidor criado na etapa anterior. No Linux utilize o comando ssh (por exemplo: ssh [email protected]) e no Windows o WSL (para ser capaz de executar esse mesmo comando) ou o emulador de terminal PuTTY.
  4. Atualize o sistema e instale o repositório que contém os pacotes do BOCA tal como descrito nas últimas duas etapas da seção Instalação local em máquina virtual.
  5. Para instalar todos os componentes do BOCA em um mesmo servidor, siga as instruções da seção Instalação de todos os componentes em uma mesma máquina. Por outro lado, caso deseje instalar os três componentes em máquinas diferentes, repita o processo de criação de droplet, acesso remoto e configuração inicial das etapas 2–4 mais duas vezes e siga as instruções da seção Instalação dos componentes em máquinas diferentes.

Instalação do Maratona Linux

O Maratona Linux pode ser instalado em máquinas físicas ou virtuais. Os fatores a serem considerados para a escolha entre essas duas opções são:

  • Tempo de instalação: é um fator crítico tendo em vista a necessidade de repetir o processo de instalação em todas as máquinas que serão utilizadas por equipes competidoras. Para instalar o Maratona Linux é necessário instalar o Ubuntu Desktop e então instalar o pacote maratona-desktop. Em uma conexão de 100Mbps, essa segunda etapa demorou quase 30 minutos para ser concluída devido à grande quantidade de pacotes que precisaram ser baixados (com um tamanho total de aproximadamente 2.2GB) e instalados. Por isso, é geralmente mais rápido instalar o Maratona Linux em uma máquina virtual, clonar essa máquina virtual e copiar a imagem do clone para as outras máquinas utilizando dispositivos de mídia física de alta velocidade ou compartilhamento de rede.
  • Risco: a instalação em máquinas físicas requer a criação de uma nova partição no disco rígido, e esse procedimento pode inadvertidamente resultar na substituição acidental do sistema operacional existente.
  • Desempenho: o uso de máquinas virtuais é menos performante devido aos recursos que são consumidos pela máquina hospedeira e pelo processo de virtualização. No entanto, máquinas modernas com especificações medianas conseguem rodar o Maratona Linux através de uma máquina virtual sem problemas de desempenho isso porque o Maratona Linux possui os mesmos requisitos do Ubuntu Desktop, os quais são relativamente modestos.

Instalação em máquina física

  1. Faça o download da última versão do Ubuntu Desktop 22.04.
  2. Crie um pendrive bootável utilizando o Rufus ou ferramenta similar.
  3. Utilize o Gerenciador de disco (diskmgmt.msc) do Windows ou ferramenta similar para redimensionar uma das partições existentes e deixar 30GB de espaço não alocado.
  • Caso você encontre o erro não é possível reduzir um volume além do ponto onde qualquer arquivo não móvel esteja localizado durante o redimensionamento, siga as instruções de um desses links 1 ou 2.
  1. Faça boot no computador em que se deseja instalar o Maratona Linux pelo pendrive. A tecla de atalho que deve ser pressionada durante o boot para entrar no BIOS (boot menu) varia de acordo com o fabricante. Para computadores Lenovo ThinkCentre, por exemplo, a tecla é a F1 fonte.
  2. Instale o Ubuntu selecionando as seguintes opções no menu de instalação (use os valores padrões para as configurações não listadas abaixo):
  • Idioma: Português do Brasil;
  • Layout do teclado: Portuguese (Brazil), Portuguese (Brazil);
  • Quais aplicações você gostaria de instalar para começar? Instalação mínima; Outras opções: habilite Baixar atualizações enquanto instala Ubuntu;
  • Tipo de instalação: Instalar Ubuntu ao lado do Windows Boot Manager;
  • Fuso horário: São Paulo;
  • Escolha o nome, nome do computador, nome de usuário e senha que julgar adequados; habilite Solicitar minha senha para entrar.
  1. Após a conclusão da instalação, clique em Reiniciar agora.
  2. Execute sudo apt update && sudo apt full-upgrade -y para atualizar o sistema.
  3. Execute sudo add-apt-repository ppa:icpc-latam/maratona-linux para adicionar o repositório em que são disponibilizados os pacotes do BOCA e do Maratona Linux.
  4. Execute sudo apt install maratona-desktop -y para instalar o Maratona Linux.
  5. Após a instalação do Maratona Linux ser concluída, reinicie o computador para que as alterações realizadas se tornem visíveis.

Instalação em máquina virtual

  1. Faça o download da última versão do Ubuntu Desktop 22.04.
  2. Faça o download e instale o VirtualBox.
  3. Abra o VirtualBox e crie uma nova máquina virtual com as seguintes especificações:
  • Nome: maratona-linux;
  • Tipo: Linux;
  • Versão: Ubuntu 22.04 LTS (Jammy Jellyfish) (64-bit);
  • Memória Base: 4096MB;
  • Processadores: 4;
  • Tamanho do disco: 30GB.
  1. Nas configurações da máquina recém-criada, performe as seguintes modificações:
    1. Na aba de Armazenamento, adicione como Dispositivo IDE Secundário 0 a image ISO baixada na etapa 1.
    2. Na aba de Rede, mude o tipo de conexão da placa de rede de Nat para Placa em modo Bridge para que a máquina virtual faça parte da mesma rede da máquina hospedeira com um IP próprio.
  2. Inicie a máquina virtual e instale o Ubuntu selecionando as mesmas opções selecionadas na etapa 5 da seção Instalação em máquina física com exceção da opção tipo de instalação que deve ser configurada para Apagar disco e reinstalar o Ubuntu pois o disco rígido virtual armazenará apenas um sistema operacional ao contrário da instalação em máquina física na qual é utilizada a técnica de inicialização múltipla.
  3. Siga as instruções 6–10 da seção Instalação em máquina física para instalar o Maratona Linux.

Permitir a conexão entre uma instância do BOCA e o Maratona Linux

fonte

  1. Execute o comando hostname -I na máquina em que o pacote boca-web está instalado. A saída desse comando é o endereço IP que será utilizado por qualquer máquina conectada à rede local (ou qualquer máquina conectada à internet, caso o BOCA tenha sido instalado na nuvem) para acessar o BOCA utilizando a seguinte URL: http://IP/boca.
  2. Na máquina em que o Maratona Linux foi instalado, faça o login utilizando a conta de administrador (isso é, a conta que foi criada durante a instalação do Ubuntu) e apague o conteúdo do arquivo /etc/maratona-firewall/hosts/boca.localdomain e adicione o endereço do servidor BOCA. Ressalta-se que esse arquivo pode conter apenas um endereço IP.
  3. Opcionalmente, crie múltiplos arquivos nesse mesmo diretório para permitir o acesso a múltiplas máquinas. Cada arquivo deve conter apenas um endereço IP e ter o nome correspondente ao FQDN (Fully Qualified Domain Name) do servidor.
  4. Execute sudo dpkg-reconfigure maratona-firewall para atualizar as configurações.
  5. Reinicie o computador. Durante a competição, as equipes devem estar logadas com o usuário que não possui privilégios de administrador — usuário: icpc e senha: icpc.

Configurações e orientações adicionais

Essa seção contém instruções sobre solução de problemas, personalização e orientações gerais para a gestão de competições.

Permitir alteração do papel de parede no Maratona Linux

A funcionalidade de mudança de papel de parede é desativada por padrão, seja por meio da interface gráfica ou utilizando ferramentas de linha de comando como gsettings e dconf. Por exemplo, ao tentar usar o gsettings para fazer a alteração, será apresentada a seguinte mensagem de erro "The key is not writable". Essa restrição é implementada através de um lock do gerenciador de configurações do sistema dconf.

  1. Execute sudo rm /etc/dconf/db/local.d/locks/90-wallpaper para remover o lock.
  2. Execute sudo dconf update para atualizar as configurações.
  3. A partir de agora é possível realizar a troca de papel de parede através da interface gráfica ou do terminal.
    • Para realizar a troca através da linha de comando, execute gsettings set org.gnome.desktop.background picture-uri file:///usr/share/backgrounds/warty-final-ubuntu.png && gsettings set org.gnome.desktop.background picture-uri-dark file:///usr/share/backgrounds/warty-final-ubuntu.png. Não se deve utilizar sudo na execução desse comando pois isso alteraria o papel de parede do root e não o do usuário atual.

Configuração otimizada do Maratona Linux em máquina virtual

Com as instruções a seguir, a máquina virtual parecerá ser o único sistema em execução na máquina do ponto de vista do usuário. Esse é o cenário ideal, uma vez que os competidores devem utilizar exclusivamente o Maratona Linux como sistema operacional durante toda a maratona.

  1. No Maratona Linux, entre na aba de Monitores em Configurações e selecione a resolução ideal para a máquina que está sendo configurada.
  2. No VirtualBox, abra a janela de Preferências e, na aba Entrada, mude o atalho que é usado como a Combinação de Teclas do Hospedeiros — ou seja, Host Key — (o padrão é Right CTRL) para uma combinação que deve ser mantida em sigilo dos estudantes.
  3. Ainda no VirtualBox, acesse a aba de Interface do Usuário das Configurações específicas da máquina virtual do Maratona Linux e faça as seguintes configurações:
  • deixe as seguintes checkboxes em branco: Habilitar Barra de Menu, Exibir nos modos Tela Cheia/Seamless (F) e Habilitar Barra de Status;
  • configure o Estado Visual para Tela Cheia.
  1. Para desabilitar as notificações que geralmente aparecem em uma painel do lado direito da tela após a inicialização da máquina virtual, execute no PowerShell cd 'C:\Program Files\Oracle\VirtualBox\'; .\VBoxManage.exe setextradata global GUI/SuppressMessages "all". Caso a máquina virtual esteja instalada no VirtualBox do administrador, o PowerShell também deve ser executado com privilégios de administrador.

Alterar layout do teclado no Ubuntu Server

A seleção do layout do teclado já foi realizada durante a instalação do sistema operacional. No entanto, é possível alterar essa configuração há qualquer momento.

  1. Execute debconf-show keyboard-configuration para checar o layout de teclado em uso atualmente.
  2. Execute o comando sudo dpkg-reconfigure keyboard-configuration para alterar as configurações de teclado.
  3. Execute systemctl reboot para reiniciar o computador.

Alterar o fuso horário no Ubuntu Server

  1. Execute timedatectl para visualizar a data, hora e fuso horário atuais do sistema.
  2. Execute timedatectl list-timezones para visualizar os fuso horários disponíveis.
  3. Execute sudo timedatectl set-timezone America/Sao_Paulo para modificar o fuso horário do sistema.

Adicionar domínio ao servidor do BOCA

  1. Escolha um registrador de domínios confiável.
  2. Compre o domínio de sua escolha.
  3. Nas configurações de DNS do domínio, adicione um novo registro com os seguintes valores:
  • Type: A Record;
  • Host: @ para hospedar o BOCA na raiz do domínio ou qualquer valor alfanumérico para hospedá-lo em um subdomínio;
  • Value: endereço IP da sua instância no DigitalOcean.

Ativar certificado SSL para o domínio

Diferentemente de um IP, é possível habilitar HTTPS em um domínio.

  1. Execute sudo apt install python3-certbot-apache -y.
  2. Execute vi /etc/apache2/sites-enabled/000-boca.conf para editar o arquivo de configuração do apache específico do servidor BOCA e adicione a seguinte linha ServerName subdominio.dominio.tld.
  3. Execute certbot.

Instalar um desktop environment (GUI) no Ubuntu Server

Caso o Ubuntu Server esteja instalado localmente (independentemente de ser em máquina física ou virtual) é possível instalar uma interface gráfica para evitar a operação exclusiva em modo de texto e, assim, facilitar a operação do servidor.

  1. Execute sudo apt install ubuntu-desktop-minimal -y.

Ocultar o menu GRUB

Quando se utiliza a técnica de inicialização dupla (dual boot), ocultar o menu do Grub é conveniente para manter a aparência do computador semelhante ao que era quando havia apenas o sistema Windows instalado. Após seguir as instruções fornecidas abaixo, o menu GRUB só irá aparecer caso a tecla Esc seja acionada logo após o computador ser ligado. Caso contrário, após cinco segundos, o Windows será iniciado automaticamente.

  1. Execute sudo vi /etc/default/grub para editar o arquivo de configuração do GRUB e certifique-se de que as seguintes opções estão configuradas corretamente:
  • GRUB_DEFAULT=2 — o valor dessa variável é um número inteiro que corresponde à enésima opção do menu GRUB contada a partir do zero, você deve encontrar o número que corresponde ao Windows e atribuí-lo para essa variável;
  • GRUB_TIMEOUT_STYLE=hidden;
  • GRUB_TIMEOUT=5.
  1. Execute sudo vi /etc/grub.d/30_os-prober e comente a linha set timeout_style=menu. Essa etapa é necessária pois a linha mencionada sobrescreve o valor da variável GRUB_TIMEOUT_STYLE.
  2. Execute sudo update-grub para atualizar as configurações.

Instalar Adminer no servidor do BOCA

O Adminer é uma ferramenta de interface gráfica para a administração de bancos de dados. A modificação direta de dados no banco de dados não é geralmente recomendável, porém, pode ser necessária em situações excepcionais.

  1. Execute mkdir /var/www/boca/adminer && cd !$ && wget https://github.com/vrana/adminer/releases/download/v4.8.1/adminer-4.8.1-en.php para fazer o download do Adminer na raiz do servidor do BOCA.
  2. Adicione a diretiva Directory abaixo como a última diretiva em ambos os arquivos /etc/apache2/sites-available/000-boca.conf e /etc/apache2/sites-available/000-boca-le-ssl.conf (esse segundo arquivo existe apenas se o certbot foi utilizado para gerar um certificado do Let's Encrypt conforme descrito na seção Ativar certificado SSL em um domínio):
<Directory "/var/www/boca/adminer">
  AllowOverride None
  Order Allow,Deny
  Allow from all
</Directory>
  1. Crie um novo usuário no banco de dados que será usado para fazer login no Adminer.
    1. Execute sudo su postgres para utilizar o terminal como o usuário de sistema postgres ao invés do usuário logado atualmente.
    2. Execute psql para entrar na interface de modo de texto do PostreSQL.
    3. Execute CREATE USER adminer WITH SUPERUSER PASSWORD 'adminer'; para criar um novo usuário de banco de dados (lembre-se de utilizar uma senha segura).
    4. Execute sudo vi /etc/postgresql/14/main/pg_hba.conf para editar o arquivo de autenticação do PostgreSQL e insira a linha local all adminer md5 logo após a linha local all postgres peer.
    5. Execute systemctl restart postgresql para que as configurações entrem em vigor.
  2. Para acessar o Adminer, abra a página http://IP/adminer no navegador e faça login com as credenciais do usuário recém-criado.

Remover o ícone do Mozilla Firefox do Maratona Linux

Até há pouco tempo atrás, o Mozilla Firefox era o navegador padrão do Maratona Linux. No entanto, esse não é mais o caso devido a migração deste para o formato snap a partir do Ubuntu 22.04. Por isso, para acessar o BOCA, os competidores devem usar o navegador GNOME Web (antigamente conhecido como Epiphany) fonte. No entanto, o ícone do Firefox ainda aparece no menu de aplicativos apesar dessa aplicação não estar funcional na versão atual do Maratona Linux.

  1. Execute sudo rm /var/lib/snapd/desktop/applications/firefox_firefox.desktop para remover o ícone do Firefox do menu de aplicativos.

Habilitar compartilhamento de rede no Windows 11

O compartilhamento de rede permite a transferência rápida de arquivos volumosos (como, por exemplo, imagens ISO e backups) entre computadores.

  1. Faça login como um usuário Administrador.
  2. Na barra de pesquisa, busque por Gerenciar configurações de compartilhamento avançadas e clique no resultado correspondente.
  3. Habilite as opções de Descoberta de rede e Compartilhamento de arquivos e impressoras na seção de Redes públicas.
  4. Habilite a opção de Compartilhamento de pasta pública e desabilite a opção de Compartilhamento protegido por senha na seção de Todas as redes.
  5. Para compartilhar um arquivo ou pasta, basta clicar com o botão esquerdo no arquivo, escolher a opção Propriedades, acessar a aba Compartilhamento, clicar no botão Compartilhar... e adicionar Todos com permissão de Leitura.

Substituir o indicador visual de problemas do BOCA

Por padrão, o BOCA usa balões como indicadores visuais para os problemas. Não há funcionalidade nativa para a substituição por outros indicadores visuais. No entanto, é possível possibilitar essa substituição através de uma modificação no código fonte do BOCA. A seguir, encontra-se as instruções para substituir os ícones de balões por balas.

  1. Abra o arquivo /var/www/boca/src/fballoon.php em um editor de texto, comente a função balloonpng e logo abaixo cole esse código:
function balloonpng($dir,$get_s,$get_color=null,$get_file=null) {
	if($get_s)
		$smile=imagecreatefrompng($dir . "/images/smallballoontransp.png");
	else
		$smile=imagecreatefrompng($dir . "/images/candy.png");
	
	imageSaveAlpha($smile, true);
	if($get_color != null) {
		$r = hexdec( substr($get_color, 0, 2) );
		$g = hexdec( substr($get_color, 2, 2) );
		$b = hexdec( substr($get_color, 4, 2) );

    $rd = $r / 3;
    $gd = $g / 3;
    $bd = $b / 3;
		
		$kek=imagecolorallocate($smile,$r,$g,$b);
		$kek_darker = imagecolorallocate($smile, $rd, $gd, $bd);

		if($get_s)
			imagefill($smile,5,5,$kek);
		else
			imagefill($smile, 36, 18, $kek_darker);
			imagefill($smile, 36, 68, $kek);
			imagefill($smile, 36, 113, $kek_darker);
	}
	if($get_file != null)
		imagepng($smile,$get_file);
	else
		imagepng($smile);
}
  1. Faça o upload da imagem de bala (candy.png) para o diretório /var/www/boca/src/images. O comando scp pode ser utilizado para esse fim — por exemplo: scp ~/Downloads/candy.png [email protected]:/var/www/boca/src/images/.

O resultado dessa substituição pode ser observado na imagem abaixo.

Vale ressaltar que é possível utilizar qualquer imagem png transparente com dimensões de 76px por 135px, contudo, é necessário customizar os argumentos da função imagefill para colorar adequadamente a imagem específica.

Aceitar submissões em JavaScript no BOCA

Por padrão, o BOCA é capaz de avaliar submissões escritas em C/C++, Java, Python e, mais recentemente, Kotlin. No entanto, é possível adicionar suporte para outras linguagens de programação através da adição de novos scripts de configuração nos pacotes que são enviados durante o cadastramento de problemas. Além disso, é necessário instalar no servidor o compilador ou interpretador que é requerido para a execução da linguagem para a qual está se adicionando suporte. Para adicionar suporte para submissões em JavaScript, use o exemplo e as instruções presentes nesse repositório.

Cadastrar usuários em batch

https://github.com/cassiopc/boca/blob/master/doc/import-user.txt

  • há 3 formatos que podem ser usados para cadastrar múltiplos usuários em lote, abaixo se encontra um exemplo de um desses formatos:
[user]
usernumber=1
usersitenumber=1
username=time1
userfullname=Fullname do time 1
userenabled=t
usermultilogin=t
userpassword=time1

usernumber=2
usersitenumber=1
username=time2
userfullname=Fullname do time 2
userenabled=t
usermultilogin=t
userpassword=time2

Manter o processo do boca-autojudge em execução no servidor BOCA

O processo do boca-autojudge deve permanecer em execução ao decorrer da competição para garantir o funcionamento da correção automática. Para que esse processo não impeça a execução de outros comandos ou encerramento da sessão, recomenda-se o uso do gerenciador de janelas tmux ou ferramentas similares (como, por exemplo, screen ou nohup). Abaixo encontra-se as instruções para uso do tmux: fonte

  1. Execute tmux para criar uma nova janela.
  2. Execute sudo boca-autojudge.
  3. Use o atalho CTRL + b e depois d para sair da janela atual. Note que o processo continuará em execução.
  4. Use o comando tmux list-sessions para visualizar as janelas abertas no background ou tmux attach para voltar para uma janela que foi fechada.

Limpar a pasta pessoal do usuário ICPC no Maratona Linux

O Maratona Linux disponibiliza ao usuário icpc o comando clean-icpc-on-reboot que performa a limpeza dos arquivos da pasta pessoal deste usuário. É recomendável executar esse comando após a finalização da maratona em todas as máquinas que foram utilizadas pelas equipes. Tenha em mente que esse comando também deleta configurações de usuário como layout de teclado e resolução de tela.

O basename dos problemas deve ter no mínimo 3 caracteres

O basename de um problema é definido no arquivo description/problem.info do pacote do problema. Esse valor deve obrigatoriamente ser utilizado como o nome da classe de submissões em Java. E, consequentemente, também como o nome do arquivo — caso contrário, resultará em um erro similar a esse class A is public, should be declared in a file named A.java.

Entretanto, a compilação do código de Java falha quando o nome da classe/arquivo tem menos que 3 caracteres com a seguinte mensagem de erro: java.lang.IllegalArgumentException: Prefix string "F" too short: length must be at least 3. Portanto, para evitar esse erro, o basename deve conter no mínimo 3 caracteres.

Como lidar com diferentes padrões de quebra de linhas em arquivos de output

É necessário se atentar ao estilo de quebra de linha utilizado nos arquivos de output (arquivos localizados no diretório output dos pacotes de problemas). Caso o arquivo use o padrão do Windows (\r\n) ao invés do padrão do Linux (\n), a comparação desse arquivo com a saída gerada pelo código submetido resultará no erro (Presentation error)Files match with differences in the amount of white spaces. Isso porque as funções de saída das linguagens de programação (std::endl do C++, System.out.println() do Java, print() do Python, console.log() do JavaScript) adicionam uma quebra de linha \n ao final do output. Em C, onde a função de saída (printf()) não insere automaticamente uma quebra de linha, o \né por convenção (e não o \r\n) usado explicitamente.

Para visualizar o tipo de quebra de linha utilizado por um arquivo, execute cat -A nome_do_arquivo. Caso o arquivo use o padrão do Windows, o caractere $ aparecerá no final de cada linha. Por outro lado, caso o arquivo use o padrão do Linux, o caractere ^M$ aparecerá no final de cada linha.

Para que a comparação entre os arquivos dentro de output/ e a saída dos programas não resulte em erro somente por conta das diferenças entre padrões de quebra de linha, é possível utilizar a opção --strip-trailing-cr do comando diff para ignorar essas diferenças. Basta acrescentar essa flag na linha 36 (diff -q "$1" "$2" >/dev/null 2>/dev/null) dos arquivos dentro de compare/ dos pacotes de problemas.

Alterar a senha do banco de dados do BOCA

  1. Execute vi /var/www/boca/src/private/conf.php para abrir o arquivo de configuração e atribua a nova senha para as variáveis $conf["dbpass"] e $conf["dbsuperpass"].
  2. Execute sudo su postgres && psql para acessar o psql e execute ALTER USER bocauser WITH PASSWORD 'Senh@123'; para alterar a senha do usuário padrão do BOCA.

Deletar uma equipe

As instruções para deletar uma equipe (e, consequentemente, removê-la do score) são: acesse a página admin/user.php, clique em cima do ID do usuário e clique no botão Delete. No entanto, tentar deletar um usuário que já submeteu uma solução resulta em um carregamento infinito da página. Para que o BOCA volte a funcionar normalmente, é necessário reiniciar o serviço do PostgreSQL através do comando systemctl restart postgresql. Para deletar uma equipe que já tenha submetido código, é necessário acessar o psql ou Adminer e deletar o usuário manualmente.

Checklists

BOCA (hospedado na nuvem)

  • Criar a droplet no DigitalOcean.
  • Certificar-se que o fuso horário está correto.
  • Configurar o domínio.
  • Instalar o BOCA e executar o boca-createjail.
  • Criar uma competição.
  • Na aba Sites, consertar o parâmetro Start date que devido a um bug sempre é setado para 10 minutos após a criação da competição e habilitar o autojudge.
  • Alterar a senha dos usuários system e admin.
  • Editar as linguagens suportadas na aba Languages e habilitar o suporte de submissões em JavaScript.
  • Substituir o indicador visual dos problemas.
  • Adicionar os problemas.
  • Adicionar os usuários.
  • Para cada usuário de tipo equipe: logar no sistema através do login da equipe e adicionar o arquivo input.mjs na aba de Backups.
  • Executar boca-autojudge.

Maratona Linux (em máquina virtual)

  • Instalar VirtualBox.
  • Criar uma máquina virtual.
  • Instalar o Ubuntu Desktop.
  • Instalar o Maratona Linux.
  • Ajustar para a resolução mais adequada.
  • Remover qualquer outro layout de teclado além de pt-br.
  • Remover o ícone do Firefox do menu de Aplicativos.
  • Alterar o papel de parede do desktop.
  • Configuração otimizada do Maratona Linux em máquina virtual.
  • Instalar o Node para possibilitar submissões em JavaScript.
  • Permitir o acesso a uma instância do BOCA.
  • Desligar a máquina virtual e exportá-la no formato de Open Virtualization Format.
  • Habilitar o compartilhamento de rede da máquina física atual e de todas as máquinas para qual se deseja copiar a imagem exportada da máquina virtual, fazer a cópia do arquivo exportado e, para cada máquina, seguir esses passos:
    • Instalar VirtualBox.
    • Importar imagem.
    • Alterar a configuração de host key (essa é uma configuração global do VirtualBox que não é exportada na imagem) e desabilitar as notificações do VirtualBox no PowerShell.
@gusalbukrk
Copy link
Author

candy-problems

@genildoburgos
Copy link

genildoburgos commented Jun 19, 2024

Needing help, is this any suport?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment