Pequeno experimento em Forth

# deve chegar até *

Recentemente comecei a brincar um pouco com Forth, uma linguagem de programação onde todo o estado — até onde eu aprendi — é armazenado numa pilha. Para isso estou utilizando o livro Starting Forth.

Fiz um pequeno programa para ver como eu conseguiria armazenar o estado de um jogo simples utilizando apenas uma pilha (duas, tecnicamente). Você pode encontrar o código completo no github, mas aqui vai o núcleo dele:


: INSTRUCTIONS
    ." UTILIZE J (BAIXO) K (CIMA) L (DIREITA) H (ESQUERDA) PARA SE MOVER "
    CR ;

: RENDER-COORDINATE ( fx fy px py cx cy )
    4DUP MATCH-COORDINATES IF 35 EMIT DROP DROP ELSE
         >R >R 2OVER R> R> MATCH-COORDINATES IF 42 EMIT ELSE
	 32 EMIT
    THEN THEN ;
: RENDER-LINE ( fx fy px py ly )
    >R MAX-X MIN-X DO I J RENDER-COORDINATE LOOP R> DROP CR ;
: RENDER ( fx fy px py )
    PAGE MAX-Y MIN-Y DO I RENDER-LINE LOOP ;
: CHECK-WIN ( fx fy px py )
    4DUP MATCH-COORDINATES ;
: GAME-LOGIC ( fx fy px py )
    RENDER CHECK-WIN IF ." VOCÊ VENCEU!! " 2DROP 2DROP QUIT ELSE INSTRUCTIONS THEN ;

Na pilha ficam os valores que representam as coordenadas do jogador e da comida: (FoodX FoodY PlayerX PlayerY), e eventualmente as coordenadas sendo renderizadas. O jogador é exibido como “#” (35 EMIT), enquanto a comida é exibida como “*” (42 EMIT). Se as coordenadas do jogador baterem com as coordenadas da comida, o jogo acaba.

O que o Dr. Pronovost pode nos ensinar

Inspirado por uma aula do Dr. Italo Marsili, resolvi compartilhar a forma como o sistema de checklists do Dr. Pronovost me ajudou na área de administração de sistemas.

Resumindo a ópera, o Dr. Pronovost descobriu que, com uma checklist simples, podia reduzir drasticamente o número de infecções em hospitais. A checklist envolve coisas óbvias, que podem parecer desnecessárias para equipes médicas, como lavar as mãos com sabão e usar luvas, mas que a experiência mostrou ser uma ferramenta importante.

No meu caso, eu precisava fazer uma migração de cerca de vinte websites de um servidor para o outro. As etapas para migrar cada website eram bem simples, mas também muito repetitivas e, depois de algum tempo, tediosas, e um erro poderia me custar um trabalho chato de recuperar backups ou desfazer alterações. Lembrei da aula do Dr. Italo e tive a ideia de criar uma checklist envolvendo todos os passos do processo de migração de um website. Coisas como:

  • Verificar se eu tenho o controle do DNS do website
  • Colocar o website em manutenção
  • Verificar se estou no terminal do servidor certo
  • Usar o comando “use” no mysql

Principalmente quando começava a ficar muito entediado, eu seguia a checklist item por item. Não me atrasou em nada, tendo talvez até o efeito contrário, e mais de uma vez ela me salvou de rodar algum comando no servidor errado ou começar uma migração sem ter o controle do DNS, por exemplo.

Auditorium: Sistema de Agendamento de Auditórios

O Auditorium é um sistema de agendamento de auditórios feito sob demanda para o CEULJI/Ulbra por mim e pelo Valdeir Cesconeto, nas matérias de Tópicos Especiais III e Desenvolvimento WEB. Conta com um sistema de permissões em três níveis (administrador, secretária, coordenador), notificações em tempo real, além de um chat.

O sistema começou a ser utilizado semana passada, ainda em fase de testes. As imagens abaixo são da versão 1.0, que é o estado em que ele foi apresentado como trabalho final nas disciplinas mencionadas no parágrafo anterior; muitas mudanças foram feitas desde então.

Você pode encontrar o código e mais detalhes no repositório no Github.

Criei um servidor de emails

Semana passada eu criei um servidor de emails utilizando o iRedMail, e agora posso receber emails em contato@evandromurilo.com, por exemplo. O servidor é uma instância EC2 na Amazon AWS rodando Ubuntu 16.04.

Ainda não personalizei o visual, mas já configurei o certificado TLS, além de todos os registros DNS necessários (MX, SPF, DKIM, DMARC). O RoundCube me surpreendeu bastante, acho até que prefiro acessar o email por meio dele do que por IMAP através do Outlook, por exemplo.

MPanel (componente para Java Swing)

MPanel é uma subclasse do JPanel, que age como um gerenciador de layout. A ideia é ter um visual parecido com o que você conseguiria utilizando uma série de BoxLayouts, mas com a facilidade de um GridLayout. É no fundo um JPanel com um BoxLayout na vertical e uma série de JPanels com BoxLayouts na horizontal.

Exemplo:

cm

MPanel panel = new MPanel();
panel.setMargin(15, 15);
panel.defaultVGap = 5;
panel.defaultHGap = 15;
panel.lblSize = new Dimension(170, 30);

panel.add(0, lblNome, txtNome);
panel.add(1, 0, 15, 15, lblTotalV, txtTotalV);
panel.add(2, lblC);
panel.add(3, 0, 15, 15, rb1, rb2, rb3, rb4);
panel.add(4, lblValorC, txtValorC);
panel.add(5, lblS, txtS);
panel.add(6, 0, 15, 15, lblSC, txtSC);
panel.add(7, btnCalc);

panel.render();
add(panel);

Para obter mais detalhes, acesse o repositório no Github.

Exemplo de GridLayout (Java Swing)

Um exemplo bem simples de utilização do GridLayout, fiz para minha monitoria de programação no IFRO. É a resolução de uma atividade proposta pelo professor Jones.

Preview:
GridLayout

Código:

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

/**
 * Created by Evandro Murilo on 8/30/17.
 */
public class SwingGrid extends JFrame implements ActionListener {
    JLabel lblNome = new JLabel("Nome do funcionário: "),
           lblTotalV = new JLabel("Total de vendas: "),
           lblC = new JLabel("Comissão: "),
           lblValorC = new JLabel("Valor da comissão: "),
           lblS = new JLabel("Salário: "),
           lblSC = new JLabel("Salário + Comissão: "),
           lblEmpty = new JLabel("");
    TextField txtNome = new TextField(),
              txtTotalV = new TextField(),
              txtValorC = new TextField(),
              txtS = new TextField(),
              txtSC = new TextField();
    JRadioButton rb1 = new JRadioButton("1%"),
                 rb2 = new JRadioButton("2%"),
                 rb3 = new JRadioButton("3%"),
                 rb4 = new JRadioButton("4%");
    JButton btnCalc = new JButton("Calcular");
    ButtonGroup btnGroup = new ButtonGroup();
    GridLayout gridLayout = new GridLayout(0, 2);

    public SwingGrid() {
        setTitle("Swing test");
        setBounds(0, 0, 400, 400);
        setLayout(gridLayout);
        setResizable(false);

        gridLayout.setVgap(10);
        gridLayout.setHgap(20);

        txtSC.setEditable(false);
        txtValorC.setEditable(false);

        add(lblNome);
        add(txtNome);
        add(lblTotalV);
        add(txtTotalV);
        add(lblC);
        add(lblEmpty);
        add(rb1);
        add(rb2);
        add(rb3);
        add(rb4);
        add(lblValorC);
        add(txtValorC);
        add(lblS);
        add(txtS);
        add(lblSC);
        add(txtSC);
        add(btnCalc);

        btnGroup.add(rb1);
        btnGroup.add(rb2);
        btnGroup.add(rb3);
        btnGroup.add(rb4);

        btnCalc.addActionListener(this);
    }

    public static void main(String args[]) {
        new SwingGrid().setVisible(true);
    }

    @Override
    public void actionPerformed(ActionEvent actionEvent) {
        double totalV, c, s, sc, p;

        try {
            totalV = Double.parseDouble(txtTotalV.getText());
            s = Double.parseDouble(txtS.getText());

            if (rb1.isSelected()) p = 0.01;
            else if (rb2.isSelected()) p = 0.02;
            else if (rb3.isSelected()) p = 0.03;
            else p = 0.04;

            c = totalV * p;
            sc = s + c;

            txtValorC.setText(c + "");
            txtSC.setText(sc + "");
        } catch (Exception e) {
            txtValorC.setText("Error");
            txtSC.setText("Error");
        }
    }
}

Alguns exemplos em Java

Voltei a programar um pouco em Java e criei dois repositórios no Github. O primeiro é um exemplo de como utilizar a bandeja do sistema (system tray) no Java Swing, fiz para um aluno que atendi na minha monitoria de programação no IFRO.

O segundo é um exemplo simples de concorrência, tirei a ideia de um exercício do livro Thinking in Java (4th Edition). Pretendo adicionar mais exemplos futuramente.

Watson Conversation

Eu e o Valdeir Cesconeto estamos criando um chatbot sobre o CEULJI/Ulbra utilizando o Watson Conversation, um serviço da IBM, para o trabalho final da disciplina de Inteligência Artificial, que é ministrada pelo professor Jones. Estamos ficando bastante satisfeitos com o resultado, ainda mais por ser nossa primeira tentativa de fazer algo do tipo.

Watson Conversation