SlideShare une entreprise Scribd logo
1  sur  20
Télécharger pour lire hors ligne
Rachinations
github.com/queirozfcom/rachinations
Apresentação de Trabalho de Conclusão de Curso
Bacharelado em Ciência da Computação
Complexidade
● Atenção da ciência em geral
○ Muito grande ou muito pequeno (muita atenção)
○ Tamanho médio (menos atenção)
● Ciência tinha foco em reducionismo (até meados do séc 20)
○ Depois, estudos multidisciplinares foram surgindo
● Sistemas complexos
○ Emergência, auto-organização, ordem espontânea
Dinâmica de sistemas
● Uma forma de modelar sistemas complexos
● Introduzida por J. Forrester, década de 50
● O sistema é modelado em termos de estoques e fluxos
Jogos
● São sistemas complexos
● São regidos por uma mecânica interna
● Não é simples prever como um jogo irá se comportar
○ Muitas variáveis
○ Vários níveis na análise (tática, estratégia, etc)
○ Relacionamentos nem sempre fáceis de identificar
○ Jogabilidade (gameplay)
■ Quão divertido um jogo é
■ Como definir e medir?
Modelando jogos
● Máquinas de estado finito
● Redes de Petri
● Diagramas de jogos
○ Ralph Koster (2005)
○ Stéphane Bura (2006)
○ Diagramas UML (vários autores)
○ Machinations (2008)
Machinations
● Busca modelar a economia interna de um jogo
○ Ou seja, o fluxo de recursos que se movem durante um jogo
Ex.: Banco imobiliário
Machinations é legal mas
● É baseado em linguagem visual
○ Difícil de escalar
● Difícil de criar abstrações para subir o nível
● Implementação em Flash
○ Dificulta extensão
Ruby
● Linguagem de programação dinâmica.
● Foco no usuário, não na máquina.
● Liberal, dinamicamente tipada, boa para metaprogramação, totalmente
orientada a objetos (até tipos primitivos), grande comunidade.
● Exemplos:
"ice is nice" .length # => 11
"Nice Day Isn't It?" .downcase.split("").uniq.sort.join # => " '?acdeinsty"
[1, 'hi', 3.14].each {|item| puts item } # imprime: 1 'hi' 3.14
[1,3,5].reduce(10) {|sum, element | sum + element} # => 19
Rachinations = Ruby+Machinations
● A ideia foi implementar o Machinations em uma linguagem de
programação textual (não visual).
● O usuário poderia “escrever” um diagrama em formato texto e “executá-
lo”, debugar, obter métricas, testar hipóteses e usar todo o ferrramental já
disponível para código.
● Seria mais fácil construir abstrações de mais alto nível sobre as primitivas
originais do Machinations (nós, arestas, etc), bem como patterns.
● Criar uma DSL para interfacear com o usuário leigo (não-programador).
Rachinations v1: Exemplo
d = Diagram.new 'simples'
d.add_node! Source, {
:name => 'fonte',
:activation => :automatic
}
d.add_node! Pool, {
:name => 'depósito',
:initial_value => 0
}
d.add_edge! Edge, {
:name => 'conector',
:from => 'fonte',
:to => 'depósito'
}
d.run! 10 # executar por 10 turnos
Diagrama Machinations equivalente
Rachinations v1: Exemplo 2
d = Diagram.new 'ainda simples'
d.add_node! Source, {
:name => 's1',
:activation => :automatic
}
d.add_node! Pool, {
:name => 'p1',
:initial_value => 0
}
d.add_node! Pool, {
:name => 'p2',
:initial_value => 0,
:activation => :automatic
}
d.add_edge! Edge, {
:name => 'e1',
:from => 's1',
:to => 'p1'
}
d.add_edge! Edge, {
:name => 'e2',
:from => 'p1',
:to => 'p2'
}
d.run! 10
Diagrama Machinations equivalente
(continuação)
Rachinations v1: Esquema geral
● Usuário chama o método run!
● Este método, por sua vez, chama o método run_round! até que se
esgotem os turnos ou alguma condição de parada seja satisfeita
● O método run_round! executa os seguintes passos:
● Para cada nó no diagrama, fazer:
○ Este nó está habilitado? (enabled?)
○ Este nó deve ser gatilhado? (é automático ou inicial?)
○ Se sim, chame o método trigger! neste nó
■ O método trigger! fará todo o trabalho
Rachinations v1: limitações
● Rachinations é muito verboso.
● Muita escrita para descrever um diagrama Machinations relativamente
simples.
● Difícil para não programadores.
● Dificilmente seria adotado por muitos usuários.
Rachinations: DSL
● Mais enxuta e fácil de usar
● Só foi possível fazer isso por causa da flexibilidade da linguagem Ruby
● Muita metaprogramação
● Tentar fazer algo que “just works”
○ Funcione logo “de cara”
○ Sem surpresas
○ Defaults razoáveis
Rachinations: Internas da DSL
● Crio um método diagram que recebe um bloco de código como
parâmetro
○ Este método instancia um diagrama e executa o bloco de código
recebido no escopo do diagrama criado.
● Usando metaprogramação, reabro a classe Diagram em tempo de
execução e adiciono métodos mais curtos, mais livres e mais espertos.
○ Ex.: se o parâmetro :push_all foi passado ao método pool, eu
posso deduzir que isto é um modo de execução do nó, não preciso
exigir que o usuário passe mode: :push_all explicitamente.
Rachinations v2: Exemplo lado a lado
Usando a DSL Sem DSL (equivalente) Diagrama Machinations
equivalente
d = Diagram.new 'ainda simples'
d.add_node! Source, {
:name => 's1',
:activation => :automatic
}
d.add_node! Pool, {
:name => 'p1',
:initial_value => 0
}
d.add_node! Pool, {
:name => 'p2',
:initial_value => 0,
:activation => :automatic
}
d.add_edge! Edge, {
:name => 'e1',
:from => 's1',
:to => 'p1'
}
d.add_edge! Edge, {
:name => 'e2',
:from => 'p1',
:to => 'p2'
}
diagram 'ainda simples' do
source 's1'
pool 'p1'
pool 'p2', :automatic
edge from: 's1', to: 'p1'
edge from: 'p1', to: 'p2'
end
Rachinations v2: Exemplos completos
require 'rachinations'
d=diagram 'exemplo_2' do
source 's1'
pool 'p1'
converter 'c1', :automatic
pool 'p2'
pool 'p3'
edge from: 's1', to: 'p1'
edge from: 'p1', to: 'c1'
edge from: 'c1', to: 'p2'
edge from: 'c1', to: 'p3'
end
d.run 10
Diagrama Machinations
equivalente
Rachinations v2: Exemplos completos
require 'rachinations'
d=diagram 'exemplo_3' do
source 's1'
pool 'p1'
edge from: 's1', to: 'p1'
stop expr{ p1.resource_count > 5 }
end
d.run
Diagrama Machinations
equivalente
uma expressão que, quando
é satisfeita, para a execução
do diagrama
Trabalhos futuros
● Usabilidade da DSL
○ Sem quebrar BC, de preferência
● Meios de compartilhar diagramas
○ Talvez um site onde você escreve um diagrama e o executa de forma
online, sem precisar baixar e instalar o Rachinations na sua máquina
■ Diminuir a barreira de entrada de usuários
● Meios de criar abstrações customizadas e usá-las como se fossem primitivas
● Quer ajudar?
Lições aprendidas
● Testar de mais é tão ruim quanto testar de menos
○ Código “quebradiço” (brittle)
● Design top-down e bottom-up
○ Escrever seu código como se as partes já estivessem prontas
○ Top-down facilita pensar sobre e escrever algoritmos complexos
● Diagramas de sequência para ajudar a pensar uma estratégia

Contenu connexe

Tendances

Curso de OO com C# - Parte 02 - Introdução ao C#
Curso de OO com C# - Parte 02 - Introdução ao C#Curso de OO com C# - Parte 02 - Introdução ao C#
Curso de OO com C# - Parte 02 - Introdução ao C#Leonardo Melo Santos
 
Lp1 C# conversões
Lp1 C# conversõesLp1 C# conversões
Lp1 C# conversõesMauro Duarte
 
[JS EXPERIENCE 2018] Uma visão geral sobre recursão e trampolines - Ana Basto...
[JS EXPERIENCE 2018] Uma visão geral sobre recursão e trampolines - Ana Basto...[JS EXPERIENCE 2018] Uma visão geral sobre recursão e trampolines - Ana Basto...
[JS EXPERIENCE 2018] Uma visão geral sobre recursão e trampolines - Ana Basto...iMasters
 
Robótica e Sistemas interativos utilizando Arduino
Robótica e Sistemas interativos utilizando ArduinoRobótica e Sistemas interativos utilizando Arduino
Robótica e Sistemas interativos utilizando ArduinoDomingosRodrigues16
 
Dicas para maratonas de programação
Dicas para maratonas de programaçãoDicas para maratonas de programação
Dicas para maratonas de programaçãoAnderson Araújo
 
19 algoritmos de enumeracao
19   algoritmos de enumeracao19   algoritmos de enumeracao
19 algoritmos de enumeracaoRicardo Bolanho
 

Tendances (11)

Curso de OO com C# - Parte 02 - Introdução ao C#
Curso de OO com C# - Parte 02 - Introdução ao C#Curso de OO com C# - Parte 02 - Introdução ao C#
Curso de OO com C# - Parte 02 - Introdução ao C#
 
Lp1 C# conversões
Lp1 C# conversõesLp1 C# conversões
Lp1 C# conversões
 
Arduino e python
Arduino e pythonArduino e python
Arduino e python
 
Geca - Encontro 0
Geca - Encontro 0Geca - Encontro 0
Geca - Encontro 0
 
Função malloc
Função mallocFunção malloc
Função malloc
 
[JS EXPERIENCE 2018] Uma visão geral sobre recursão e trampolines - Ana Basto...
[JS EXPERIENCE 2018] Uma visão geral sobre recursão e trampolines - Ana Basto...[JS EXPERIENCE 2018] Uma visão geral sobre recursão e trampolines - Ana Basto...
[JS EXPERIENCE 2018] Uma visão geral sobre recursão e trampolines - Ana Basto...
 
Robótica e Sistemas interativos utilizando Arduino
Robótica e Sistemas interativos utilizando ArduinoRobótica e Sistemas interativos utilizando Arduino
Robótica e Sistemas interativos utilizando Arduino
 
Tdc2010 web
Tdc2010 webTdc2010 web
Tdc2010 web
 
ARDUINO PRIMEIROS PASSOS
ARDUINO  PRIMEIROS PASSOSARDUINO  PRIMEIROS PASSOS
ARDUINO PRIMEIROS PASSOS
 
Dicas para maratonas de programação
Dicas para maratonas de programaçãoDicas para maratonas de programação
Dicas para maratonas de programação
 
19 algoritmos de enumeracao
19   algoritmos de enumeracao19   algoritmos de enumeracao
19 algoritmos de enumeracao
 

En vedette

Hadoop MapReduce and Apache Spark on EMR: comparing performance for distribut...
Hadoop MapReduce and Apache Spark on EMR: comparing performance for distribut...Hadoop MapReduce and Apache Spark on EMR: comparing performance for distribut...
Hadoop MapReduce and Apache Spark on EMR: comparing performance for distribut...Felipe
 
Boas práticas no desenvolvimento de software
Boas práticas no desenvolvimento de softwareBoas práticas no desenvolvimento de software
Boas práticas no desenvolvimento de softwareFelipe
 
Pré processamento de grandes dados com Apache Spark
Pré processamento de grandes dados com Apache SparkPré processamento de grandes dados com Apache Spark
Pré processamento de grandes dados com Apache SparkFelipe
 
Ausgewählte preußische Tugenden
Ausgewählte preußische TugendenAusgewählte preußische Tugenden
Ausgewählte preußische TugendenFelipe
 
DevOps Series: Defining and Sharing Testable Machine Configurations with vagrant
DevOps Series: Defining and Sharing Testable Machine Configurations with vagrantDevOps Series: Defining and Sharing Testable Machine Configurations with vagrant
DevOps Series: Defining and Sharing Testable Machine Configurations with vagrantFelipe
 
D3.js 30-minute intro
D3.js   30-minute introD3.js   30-minute intro
D3.js 30-minute introFelipe
 

En vedette (6)

Hadoop MapReduce and Apache Spark on EMR: comparing performance for distribut...
Hadoop MapReduce and Apache Spark on EMR: comparing performance for distribut...Hadoop MapReduce and Apache Spark on EMR: comparing performance for distribut...
Hadoop MapReduce and Apache Spark on EMR: comparing performance for distribut...
 
Boas práticas no desenvolvimento de software
Boas práticas no desenvolvimento de softwareBoas práticas no desenvolvimento de software
Boas práticas no desenvolvimento de software
 
Pré processamento de grandes dados com Apache Spark
Pré processamento de grandes dados com Apache SparkPré processamento de grandes dados com Apache Spark
Pré processamento de grandes dados com Apache Spark
 
Ausgewählte preußische Tugenden
Ausgewählte preußische TugendenAusgewählte preußische Tugenden
Ausgewählte preußische Tugenden
 
DevOps Series: Defining and Sharing Testable Machine Configurations with vagrant
DevOps Series: Defining and Sharing Testable Machine Configurations with vagrantDevOps Series: Defining and Sharing Testable Machine Configurations with vagrant
DevOps Series: Defining and Sharing Testable Machine Configurations with vagrant
 
D3.js 30-minute intro
D3.js   30-minute introD3.js   30-minute intro
D3.js 30-minute intro
 

Similaire à Rachinations

Arduino e Python: Do It Yourself
Arduino e Python: Do It YourselfArduino e Python: Do It Yourself
Arduino e Python: Do It YourselfBruno Nascimento
 
Estrutura de dados
Estrutura de dadosEstrutura de dados
Estrutura de dadosgjpbg
 
Apostila estrutura de dados 2
Apostila estrutura de dados 2Apostila estrutura de dados 2
Apostila estrutura de dados 2Leandro Lopes
 
Conceitos e técnicas de programação aula 2
Conceitos e técnicas de programação aula 2Conceitos e técnicas de programação aula 2
Conceitos e técnicas de programação aula 2Robson Ferreira
 
Tutorial Octave Matlab
Tutorial Octave MatlabTutorial Octave Matlab
Tutorial Octave Matlabblogmaxima
 
Ruby on Rails (VERSAO COM LAYOUT CONSERTADO)
Ruby on Rails (VERSAO COM LAYOUT CONSERTADO)Ruby on Rails (VERSAO COM LAYOUT CONSERTADO)
Ruby on Rails (VERSAO COM LAYOUT CONSERTADO)Julio Betta
 
Introdução a Linguagem C
Introdução a Linguagem CIntrodução a Linguagem C
Introdução a Linguagem Capolllorj
 
Mini Curso Programação Paralela utilizando OpenMP - SACTA 2013
Mini Curso Programação Paralela utilizando OpenMP - SACTA 2013Mini Curso Programação Paralela utilizando OpenMP - SACTA 2013
Mini Curso Programação Paralela utilizando OpenMP - SACTA 2013Arthur Francisco Lorenzon
 
MiniCurso Programação Paralela com OpenMP - SACTA 2013
MiniCurso Programação Paralela com OpenMP - SACTA 2013MiniCurso Programação Paralela com OpenMP - SACTA 2013
MiniCurso Programação Paralela com OpenMP - SACTA 2013Arthur Francisco Lorenzon
 
Introdução ao Desenvolvimento WEB com Ruby on Rails
Introdução ao Desenvolvimento WEB com Ruby on RailsIntrodução ao Desenvolvimento WEB com Ruby on Rails
Introdução ao Desenvolvimento WEB com Ruby on RailsJulio Betta
 
Introdução a linguagem Python: simples e produtiva
Introdução a linguagem Python: simples e produtivaIntrodução a linguagem Python: simples e produtiva
Introdução a linguagem Python: simples e produtivaÁlvaro Justen
 
Linguagens de Script: Caso de Estudo Lua
Linguagens de Script: Caso de Estudo LuaLinguagens de Script: Caso de Estudo Lua
Linguagens de Script: Caso de Estudo LuaSérgio Souza Costa
 
Lógica de programação pascal
Lógica de programação   pascalLógica de programação   pascal
Lógica de programação pascalJocelma Rios
 
Matemática em Gráficos: A Mágica da Geração Procedural
Matemática em Gráficos: A Mágica da Geração ProceduralMatemática em Gráficos: A Mágica da Geração Procedural
Matemática em Gráficos: A Mágica da Geração ProceduralAdriano Gil
 
Shell Script - Aula 02
Shell Script - Aula 02Shell Script - Aula 02
Shell Script - Aula 02Olival Paulino
 

Similaire à Rachinations (20)

Arduino e Python: Do It Yourself
Arduino e Python: Do It YourselfArduino e Python: Do It Yourself
Arduino e Python: Do It Yourself
 
Estrutura de dados
Estrutura de dadosEstrutura de dados
Estrutura de dados
 
Apostila estrutura de dados 2
Apostila estrutura de dados 2Apostila estrutura de dados 2
Apostila estrutura de dados 2
 
Conceitos e técnicas de programação aula 2
Conceitos e técnicas de programação aula 2Conceitos e técnicas de programação aula 2
Conceitos e técnicas de programação aula 2
 
Tutorial Octave Matlab
Tutorial Octave MatlabTutorial Octave Matlab
Tutorial Octave Matlab
 
Ruby on Rails (VERSAO COM LAYOUT CONSERTADO)
Ruby on Rails (VERSAO COM LAYOUT CONSERTADO)Ruby on Rails (VERSAO COM LAYOUT CONSERTADO)
Ruby on Rails (VERSAO COM LAYOUT CONSERTADO)
 
Algoritmos
AlgoritmosAlgoritmos
Algoritmos
 
Minicurso Ruby on Rails
Minicurso Ruby on RailsMinicurso Ruby on Rails
Minicurso Ruby on Rails
 
Introdução a Linguagem C
Introdução a Linguagem CIntrodução a Linguagem C
Introdução a Linguagem C
 
Mini Curso Programação Paralela utilizando OpenMP - SACTA 2013
Mini Curso Programação Paralela utilizando OpenMP - SACTA 2013Mini Curso Programação Paralela utilizando OpenMP - SACTA 2013
Mini Curso Programação Paralela utilizando OpenMP - SACTA 2013
 
MiniCurso Programação Paralela com OpenMP - SACTA 2013
MiniCurso Programação Paralela com OpenMP - SACTA 2013MiniCurso Programação Paralela com OpenMP - SACTA 2013
MiniCurso Programação Paralela com OpenMP - SACTA 2013
 
Introdução ao Desenvolvimento WEB com Ruby on Rails
Introdução ao Desenvolvimento WEB com Ruby on RailsIntrodução ao Desenvolvimento WEB com Ruby on Rails
Introdução ao Desenvolvimento WEB com Ruby on Rails
 
Introdução a linguagem Python: simples e produtiva
Introdução a linguagem Python: simples e produtivaIntrodução a linguagem Python: simples e produtiva
Introdução a linguagem Python: simples e produtiva
 
Linguagens de Script: Caso de Estudo Lua
Linguagens de Script: Caso de Estudo LuaLinguagens de Script: Caso de Estudo Lua
Linguagens de Script: Caso de Estudo Lua
 
Lógica de programação pascal
Lógica de programação   pascalLógica de programação   pascal
Lógica de programação pascal
 
Processing e Arduino
Processing e ArduinoProcessing e Arduino
Processing e Arduino
 
Matemática em Gráficos: A Mágica da Geração Procedural
Matemática em Gráficos: A Mágica da Geração ProceduralMatemática em Gráficos: A Mágica da Geração Procedural
Matemática em Gráficos: A Mágica da Geração Procedural
 
Shell Script - Aula 02
Shell Script - Aula 02Shell Script - Aula 02
Shell Script - Aula 02
 
Minicurso Java && Cl
Minicurso Java && ClMinicurso Java && Cl
Minicurso Java && Cl
 
Vim Rocks!
Vim Rocks!Vim Rocks!
Vim Rocks!
 

Plus de Felipe

Aula rotulação automática - Automatic tagging
Aula rotulação automática - Automatic taggingAula rotulação automática - Automatic tagging
Aula rotulação automática - Automatic taggingFelipe
 
First steps with Keras 2: A tutorial with Examples
First steps with Keras 2: A tutorial with ExamplesFirst steps with Keras 2: A tutorial with Examples
First steps with Keras 2: A tutorial with ExamplesFelipe
 
Word embeddings introdução, motivação e exemplos
Word embeddings  introdução, motivação e exemplosWord embeddings  introdução, motivação e exemplos
Word embeddings introdução, motivação e exemplosFelipe
 
Cloud Certifications - Overview
Cloud Certifications - OverviewCloud Certifications - Overview
Cloud Certifications - OverviewFelipe
 
Elasticsearch for Data Analytics
Elasticsearch for Data AnalyticsElasticsearch for Data Analytics
Elasticsearch for Data AnalyticsFelipe
 
Cloudwatch: Monitoring your Services with Metrics and Alarms
Cloudwatch: Monitoring your Services with Metrics and AlarmsCloudwatch: Monitoring your Services with Metrics and Alarms
Cloudwatch: Monitoring your Services with Metrics and AlarmsFelipe
 
Cloudwatch: Monitoring your AWS services with Metrics and Alarms
Cloudwatch: Monitoring your AWS services with Metrics and AlarmsCloudwatch: Monitoring your AWS services with Metrics and Alarms
Cloudwatch: Monitoring your AWS services with Metrics and AlarmsFelipe
 
Online Machine Learning: introduction and examples
Online Machine Learning:  introduction and examplesOnline Machine Learning:  introduction and examples
Online Machine Learning: introduction and examplesFelipe
 
Aws cost optimization: lessons learned, strategies, tips and tools
Aws cost optimization: lessons learned, strategies, tips and toolsAws cost optimization: lessons learned, strategies, tips and tools
Aws cost optimization: lessons learned, strategies, tips and toolsFelipe
 
Exemplos de uso de apache spark usando aws elastic map reduce
Exemplos de uso de apache spark usando aws elastic map reduceExemplos de uso de apache spark usando aws elastic map reduce
Exemplos de uso de apache spark usando aws elastic map reduceFelipe
 
Short intro to scala and the play framework
Short intro to scala and the play frameworkShort intro to scala and the play framework
Short intro to scala and the play frameworkFelipe
 
Conceitos e exemplos em versionamento de código
Conceitos e exemplos em versionamento de códigoConceitos e exemplos em versionamento de código
Conceitos e exemplos em versionamento de códigoFelipe
 
DevOps Series: Extending vagrant with Puppet for configuration management
DevOps Series: Extending vagrant with Puppet for configuration managementDevOps Series: Extending vagrant with Puppet for configuration management
DevOps Series: Extending vagrant with Puppet for configuration managementFelipe
 

Plus de Felipe (13)

Aula rotulação automática - Automatic tagging
Aula rotulação automática - Automatic taggingAula rotulação automática - Automatic tagging
Aula rotulação automática - Automatic tagging
 
First steps with Keras 2: A tutorial with Examples
First steps with Keras 2: A tutorial with ExamplesFirst steps with Keras 2: A tutorial with Examples
First steps with Keras 2: A tutorial with Examples
 
Word embeddings introdução, motivação e exemplos
Word embeddings  introdução, motivação e exemplosWord embeddings  introdução, motivação e exemplos
Word embeddings introdução, motivação e exemplos
 
Cloud Certifications - Overview
Cloud Certifications - OverviewCloud Certifications - Overview
Cloud Certifications - Overview
 
Elasticsearch for Data Analytics
Elasticsearch for Data AnalyticsElasticsearch for Data Analytics
Elasticsearch for Data Analytics
 
Cloudwatch: Monitoring your Services with Metrics and Alarms
Cloudwatch: Monitoring your Services with Metrics and AlarmsCloudwatch: Monitoring your Services with Metrics and Alarms
Cloudwatch: Monitoring your Services with Metrics and Alarms
 
Cloudwatch: Monitoring your AWS services with Metrics and Alarms
Cloudwatch: Monitoring your AWS services with Metrics and AlarmsCloudwatch: Monitoring your AWS services with Metrics and Alarms
Cloudwatch: Monitoring your AWS services with Metrics and Alarms
 
Online Machine Learning: introduction and examples
Online Machine Learning:  introduction and examplesOnline Machine Learning:  introduction and examples
Online Machine Learning: introduction and examples
 
Aws cost optimization: lessons learned, strategies, tips and tools
Aws cost optimization: lessons learned, strategies, tips and toolsAws cost optimization: lessons learned, strategies, tips and tools
Aws cost optimization: lessons learned, strategies, tips and tools
 
Exemplos de uso de apache spark usando aws elastic map reduce
Exemplos de uso de apache spark usando aws elastic map reduceExemplos de uso de apache spark usando aws elastic map reduce
Exemplos de uso de apache spark usando aws elastic map reduce
 
Short intro to scala and the play framework
Short intro to scala and the play frameworkShort intro to scala and the play framework
Short intro to scala and the play framework
 
Conceitos e exemplos em versionamento de código
Conceitos e exemplos em versionamento de códigoConceitos e exemplos em versionamento de código
Conceitos e exemplos em versionamento de código
 
DevOps Series: Extending vagrant with Puppet for configuration management
DevOps Series: Extending vagrant with Puppet for configuration managementDevOps Series: Extending vagrant with Puppet for configuration management
DevOps Series: Extending vagrant with Puppet for configuration management
 

Rachinations

  • 1. Rachinations github.com/queirozfcom/rachinations Apresentação de Trabalho de Conclusão de Curso Bacharelado em Ciência da Computação
  • 2. Complexidade ● Atenção da ciência em geral ○ Muito grande ou muito pequeno (muita atenção) ○ Tamanho médio (menos atenção) ● Ciência tinha foco em reducionismo (até meados do séc 20) ○ Depois, estudos multidisciplinares foram surgindo ● Sistemas complexos ○ Emergência, auto-organização, ordem espontânea
  • 3. Dinâmica de sistemas ● Uma forma de modelar sistemas complexos ● Introduzida por J. Forrester, década de 50 ● O sistema é modelado em termos de estoques e fluxos
  • 4. Jogos ● São sistemas complexos ● São regidos por uma mecânica interna ● Não é simples prever como um jogo irá se comportar ○ Muitas variáveis ○ Vários níveis na análise (tática, estratégia, etc) ○ Relacionamentos nem sempre fáceis de identificar ○ Jogabilidade (gameplay) ■ Quão divertido um jogo é ■ Como definir e medir?
  • 5. Modelando jogos ● Máquinas de estado finito ● Redes de Petri ● Diagramas de jogos ○ Ralph Koster (2005) ○ Stéphane Bura (2006) ○ Diagramas UML (vários autores) ○ Machinations (2008)
  • 6. Machinations ● Busca modelar a economia interna de um jogo ○ Ou seja, o fluxo de recursos que se movem durante um jogo Ex.: Banco imobiliário
  • 7. Machinations é legal mas ● É baseado em linguagem visual ○ Difícil de escalar ● Difícil de criar abstrações para subir o nível ● Implementação em Flash ○ Dificulta extensão
  • 8. Ruby ● Linguagem de programação dinâmica. ● Foco no usuário, não na máquina. ● Liberal, dinamicamente tipada, boa para metaprogramação, totalmente orientada a objetos (até tipos primitivos), grande comunidade. ● Exemplos: "ice is nice" .length # => 11 "Nice Day Isn't It?" .downcase.split("").uniq.sort.join # => " '?acdeinsty" [1, 'hi', 3.14].each {|item| puts item } # imprime: 1 'hi' 3.14 [1,3,5].reduce(10) {|sum, element | sum + element} # => 19
  • 9. Rachinations = Ruby+Machinations ● A ideia foi implementar o Machinations em uma linguagem de programação textual (não visual). ● O usuário poderia “escrever” um diagrama em formato texto e “executá- lo”, debugar, obter métricas, testar hipóteses e usar todo o ferrramental já disponível para código. ● Seria mais fácil construir abstrações de mais alto nível sobre as primitivas originais do Machinations (nós, arestas, etc), bem como patterns. ● Criar uma DSL para interfacear com o usuário leigo (não-programador).
  • 10. Rachinations v1: Exemplo d = Diagram.new 'simples' d.add_node! Source, { :name => 'fonte', :activation => :automatic } d.add_node! Pool, { :name => 'depósito', :initial_value => 0 } d.add_edge! Edge, { :name => 'conector', :from => 'fonte', :to => 'depósito' } d.run! 10 # executar por 10 turnos Diagrama Machinations equivalente
  • 11. Rachinations v1: Exemplo 2 d = Diagram.new 'ainda simples' d.add_node! Source, { :name => 's1', :activation => :automatic } d.add_node! Pool, { :name => 'p1', :initial_value => 0 } d.add_node! Pool, { :name => 'p2', :initial_value => 0, :activation => :automatic } d.add_edge! Edge, { :name => 'e1', :from => 's1', :to => 'p1' } d.add_edge! Edge, { :name => 'e2', :from => 'p1', :to => 'p2' } d.run! 10 Diagrama Machinations equivalente (continuação)
  • 12. Rachinations v1: Esquema geral ● Usuário chama o método run! ● Este método, por sua vez, chama o método run_round! até que se esgotem os turnos ou alguma condição de parada seja satisfeita ● O método run_round! executa os seguintes passos: ● Para cada nó no diagrama, fazer: ○ Este nó está habilitado? (enabled?) ○ Este nó deve ser gatilhado? (é automático ou inicial?) ○ Se sim, chame o método trigger! neste nó ■ O método trigger! fará todo o trabalho
  • 13. Rachinations v1: limitações ● Rachinations é muito verboso. ● Muita escrita para descrever um diagrama Machinations relativamente simples. ● Difícil para não programadores. ● Dificilmente seria adotado por muitos usuários.
  • 14. Rachinations: DSL ● Mais enxuta e fácil de usar ● Só foi possível fazer isso por causa da flexibilidade da linguagem Ruby ● Muita metaprogramação ● Tentar fazer algo que “just works” ○ Funcione logo “de cara” ○ Sem surpresas ○ Defaults razoáveis
  • 15. Rachinations: Internas da DSL ● Crio um método diagram que recebe um bloco de código como parâmetro ○ Este método instancia um diagrama e executa o bloco de código recebido no escopo do diagrama criado. ● Usando metaprogramação, reabro a classe Diagram em tempo de execução e adiciono métodos mais curtos, mais livres e mais espertos. ○ Ex.: se o parâmetro :push_all foi passado ao método pool, eu posso deduzir que isto é um modo de execução do nó, não preciso exigir que o usuário passe mode: :push_all explicitamente.
  • 16. Rachinations v2: Exemplo lado a lado Usando a DSL Sem DSL (equivalente) Diagrama Machinations equivalente d = Diagram.new 'ainda simples' d.add_node! Source, { :name => 's1', :activation => :automatic } d.add_node! Pool, { :name => 'p1', :initial_value => 0 } d.add_node! Pool, { :name => 'p2', :initial_value => 0, :activation => :automatic } d.add_edge! Edge, { :name => 'e1', :from => 's1', :to => 'p1' } d.add_edge! Edge, { :name => 'e2', :from => 'p1', :to => 'p2' } diagram 'ainda simples' do source 's1' pool 'p1' pool 'p2', :automatic edge from: 's1', to: 'p1' edge from: 'p1', to: 'p2' end
  • 17. Rachinations v2: Exemplos completos require 'rachinations' d=diagram 'exemplo_2' do source 's1' pool 'p1' converter 'c1', :automatic pool 'p2' pool 'p3' edge from: 's1', to: 'p1' edge from: 'p1', to: 'c1' edge from: 'c1', to: 'p2' edge from: 'c1', to: 'p3' end d.run 10 Diagrama Machinations equivalente
  • 18. Rachinations v2: Exemplos completos require 'rachinations' d=diagram 'exemplo_3' do source 's1' pool 'p1' edge from: 's1', to: 'p1' stop expr{ p1.resource_count > 5 } end d.run Diagrama Machinations equivalente uma expressão que, quando é satisfeita, para a execução do diagrama
  • 19. Trabalhos futuros ● Usabilidade da DSL ○ Sem quebrar BC, de preferência ● Meios de compartilhar diagramas ○ Talvez um site onde você escreve um diagrama e o executa de forma online, sem precisar baixar e instalar o Rachinations na sua máquina ■ Diminuir a barreira de entrada de usuários ● Meios de criar abstrações customizadas e usá-las como se fossem primitivas ● Quer ajudar?
  • 20. Lições aprendidas ● Testar de mais é tão ruim quanto testar de menos ○ Código “quebradiço” (brittle) ● Design top-down e bottom-up ○ Escrever seu código como se as partes já estivessem prontas ○ Top-down facilita pensar sobre e escrever algoritmos complexos ● Diagramas de sequência para ajudar a pensar uma estratégia