Muito além dos boletos: Eu me divirto com PHP.
Uma aura de vergonha paira no ar quando alguém fala que programa em PHP. Alguém sempre solta um comentário como "Eu já paguei muito boleto com PHP". Meu amigo Matheus, manda sempre "O PHP me deu a minha moto". É Como se a linguagem de programação presente em mais de 70% dos websites do globo precisasse de algum endosso ou como se o programador não fosse talentoso e precisasse sacar a carta do "PHP dá dinheiro".
Eu sempre me pergunto se por ventura eu sou o último mortal que ainda se diverte programando em PHP.
Por ser uma linguagem muito fácil, sempre que eu quero testar uma ideia, vou direto pro PHP, simplesmente porque do zero à ter algo funcionando, não preciso fazer muita coisa. Acho que provavelmente este é o mesmo motivo que as pessoas usam Python.
Quando montei minha palestra para o DevPira, "Muito além dos boletos: PHP para quem quer gostar do que faz", trabalhei o conceito de 3 pilares: Propósito, Diversão e Recompensa, que chamei - na brincadeira - de "Framework Além dos Boletos".
Me divertindo com PHP
Pra ilustrar como eu me divirto com PHP, decidi implementar um Machine Learning BEM RUDIMENTAR com base em um vídeo do Matt Parker - top 3 na minha lista de youtubers favoritos - sobre o MANACE, um ML usando caixas de fósforo para jogar jogo da velha.
O conceito é bem simples: Cada caixinha guarda um estado possível e para cada estado existe um número de jogadas válidas. Cada jogada recebe uma quantidade de pedrinhas. Cada movimento da partida é registrado, e ao final do jogo, caso o jogador tenha ganho, as jogadas da partida são recompensadas adicionando mais pedrinhas ao movimento vencedor. Ou punidas removendo-se pedrinhas do movimento perdedor.
O Jogo.
Só eu ganho é um jogo de brincadeira onde, apesar das regras simples, quem sabe jogar tem uma vantagem absurda sobre quem não sabe.
O jogo começa com 3 linhas: uma com 3, outra com 4 e outra com 5 peças (sachês de condimentos, palitos de fósforo, bolinhas de papel, etc).
x x x
x x x x
x x x x x
Você só pode retirar peças de uma única linha por vêz. Quantas peças quiser, desde que seja de uma única linha.
Ganha quem deixar somente uma peça no tabuleiro.
A implementação
Criei a interface que pude pensar mais rapidamente - sou programador backend e não programo ainda em nenhum framework JS moderno.
Confesso que do lado do PHP fiz tudo muito rapido também (acho que não foram 4 horas no total, entre a ideia e a implementação que foi apresentada na palestra. Então tem muita coisa bem estranha por lá, mas tentei mantes o código mais limpo possível. Refatorou? Manda um PR =)
Base do jogo
A classe base do jogo SoEuGanho
(lib/SoEuGanho/SoEuGanho.php
) contem um único método relevante: getPossibleMoves(array $board)
, onde board é um array com o número de pedras em cada linnha. Ex: [3,4,5]
.
O aprendizado
Quem aprende mesmo é o ComputerPlayer
(lib/SoEuGanho/ComputerPlayer.php
).
O computador escolhe a jogada e salva o histórico (estado do board e jogada escolhida).
public function play(array $board): array
{
$move = $this->learnedPlay($board); // Random play considering weight
$this->addHistory($board, $move); // The game history
return $move;
}
Ao final do jogo o computador aprende e limpa o histórico.
public function end(int $winnerPlayerNumber): void
{
$win = $winnerPlayerNumber === $this->playerNumber;
**$this->learn(win: $win);**
$this->saveResult($win); // Stats
$this->clearHistory();
}
O aprendizado varre todas as jogadas da partida e incrementa ou decrementa o rating de acordo com os pontos definidos nas constantes.
public function learn(bool $win): void
{
$history = $this->getHistory() ?? [];
$rating = $win ? self::REWARD_POINTS : self::PENALTY_POINTS;
foreach($history as $move) {
$this->updateMoveRating($move['board'], $move['move'], $rating);
}
$this->saveResult($win);
}
Mais sobre tudo isso
Código-fonte: https://github.com/andreimosman/SoEuGanho/ Vídeo de Inspiração: MENACE: the pile of matchboxes which can learn
Embora tenha feito um treinador para facilitar os testes e acelerar o aprendizado, estou treinando o game só com humanos em https://soeuganho.com.br . Se alguém gerar um gráfico do aprendizado, crie um pool request, por favor. =)
Se alguém puder, jogue um pouco no meu site pro maquinão aprender.
Um pouco da minha história.
Programo desde os 14 anos. Comecei com DBase III Plus e depois Clipper. A primeira vez que alguém acreditou que eu era um programador e me contratou foi neste mesmo longíncuo 1994 (Sou de 80).
Instalei meu primeiro linux em algum momento entre o final de 1996 e o começo de 1997: Slackware. Comecei a programar em Perl e em 1999 comecei a programar no saudoso PHP3.
Assim, segui programando e me divertindo. Em várias linguagens, vários experimentos, mas sempre me divertindo.
Ah, tb sou voluntário na WebForest.
Muito top!
Aprendi PHP em 2008 e até hoje não consegui deixá-lo, simplesmente porque consigo resolver tudo que preciso. Ainda não teve nada que me gerasse a necessidade de migrar para outra linguagem.
E comigo o PHP vai muito além de boletos e diversão... A liberdade que tenho hoje é por conta da renda que tenho com o meu software (saas) feito em PHP + MYSQL, e que é minha renda principal.
Sou PHP Lovers total kkkk
Acho que voce resumiu tudo. Eu sempre digo que transformei um hobby em profissão. Tambem programei no Dbase e no Clipper. Quando eu descobri que o PHP tinha apenas 2 diferenças com o Clipper ( ponto e virgula no final da linha e "$" no começo do nome da variavel, foi amor à primeira vista.
Obrigado por compartilhar sua experiência com PHP e Machine Learning! É interessante ver como você usou PHP para criar algo divertido e ainda se inspirou em um vídeo sobre o MANACE. Fico feliz em saber que você se diverte programando em PHP e que a linguagem é fácil de usar para testar suas ideias. Continuarei acompanhando suas postagens e espero ver mais sobre suas experiências com PHP e Machine Learning no futuro!
Este comentário foi gerado por uma inteligência artificial. Para saber mais, leia esta publicação.