SlideShare uma empresa Scribd logo
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

Mais conteúdo relacionado

Mais procurados

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ões
Mauro Duarte
 
Arduino e python
Arduino e pythonArduino e python
Arduino e python
Victor Casé
 
Geca - Encontro 0
Geca - Encontro 0Geca - Encontro 0
Geca - Encontro 0
Eduardo Mendes
 
Função malloc
Função mallocFunçã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...
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 Arduino
DomingosRodrigues16
 
Tdc2010 web
Tdc2010 webTdc2010 web
Tdc2010 web
Ramon Oliveira
 
ARDUINO PRIMEIROS PASSOS
ARDUINO  PRIMEIROS PASSOSARDUINO  PRIMEIROS PASSOS
ARDUINO PRIMEIROS PASSOS
DomingosRodrigues16
 
Dicas para maratonas de programação
Dicas para maratonas de programaçãoDicas para maratonas de programação
Dicas para maratonas de programação
Anderson Araújo
 
19 algoritmos de enumeracao
19   algoritmos de enumeracao19   algoritmos de enumeracao
19 algoritmos de enumeracao
Ricardo Bolanho
 

Mais procurados (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
 

Destaque

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 software
Felipe
 
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
Felipe
 
Ausgewählte preußische Tugenden
Ausgewählte preußische TugendenAusgewählte preußische Tugenden
Ausgewählte preußische Tugenden
Felipe
 
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
Felipe
 
D3.js 30-minute intro
D3.js   30-minute introD3.js   30-minute intro
D3.js 30-minute intro
Felipe
 

Destaque (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
 

Semelhante a Rachinations

Arduino e Python: Do It Yourself
Arduino e Python: Do It YourselfArduino e Python: Do It Yourself
Arduino e Python: Do It Yourself
Bruno Nascimento
 
Estrutura de dados
Estrutura de dadosEstrutura de dados
Estrutura de dados
gjpbg
 
Apostila estrutura de dados 2
Apostila estrutura de dados 2Apostila estrutura de dados 2
Apostila estrutura de dados 2
Leandro 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 2
Robson Ferreira
 
Tutorial Octave Matlab
Tutorial Octave MatlabTutorial Octave Matlab
Tutorial Octave Matlab
blogmaxima
 
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
 
Algoritmos
AlgoritmosAlgoritmos
Minicurso Ruby on Rails
Minicurso Ruby on RailsMinicurso Ruby on Rails
Minicurso Ruby on Rails
Maurício Eduardo
 
Introdução a Linguagem C
Introdução a Linguagem CIntrodução a Linguagem C
Introdução a Linguagem C
apolllorj
 
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
Arthur 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 2013
Arthur 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 Rails
Julio 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 Lua
Sé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 pascal
Jocelma Rios
 
Processing e Arduino
Processing e ArduinoProcessing e Arduino
Processing e Arduino
Daniel Paz de Araújo
 
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
Adriano Gil
 
Shell Script - Aula 02
Shell Script - Aula 02Shell Script - Aula 02
Shell Script - Aula 02
Olival Paulino
 
Minicurso Java && Cl
Minicurso Java && ClMinicurso Java && Cl
Minicurso Java && Cl
Raphael Marques
 
Vim Rocks!
Vim Rocks!Vim Rocks!
Vim Rocks!
magnunleno
 

Semelhante a 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!
 

Mais 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 tagging
Felipe
 
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
Felipe
 
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
Felipe
 
Cloud Certifications - Overview
Cloud Certifications - OverviewCloud Certifications - Overview
Cloud Certifications - Overview
Felipe
 
Elasticsearch for Data Analytics
Elasticsearch for Data AnalyticsElasticsearch for Data Analytics
Elasticsearch for Data Analytics
Felipe
 
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
Felipe
 
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
Felipe
 
Online Machine Learning: introduction and examples
Online Machine Learning:  introduction and examplesOnline Machine Learning:  introduction and examples
Online Machine Learning: introduction and examples
Felipe
 
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
Felipe
 
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
Felipe
 
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
Felipe
 
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
Felipe
 
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
Felipe
 

Mais 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
 

Último

Manual-de-Credenciamento ANATER 2023.pdf
Manual-de-Credenciamento ANATER 2023.pdfManual-de-Credenciamento ANATER 2023.pdf
Manual-de-Credenciamento ANATER 2023.pdf
WELITONNOGUEIRA3
 
História da Rádio- 1936-1970 século XIX .2.pptx
História da Rádio- 1936-1970 século XIX   .2.pptxHistória da Rádio- 1936-1970 século XIX   .2.pptx
História da Rádio- 1936-1970 século XIX .2.pptx
TomasSousa7
 
TOO - TÉCNICAS DE ORIENTAÇÃO A OBJETOS aula 1.pdf
TOO - TÉCNICAS DE ORIENTAÇÃO A OBJETOS aula 1.pdfTOO - TÉCNICAS DE ORIENTAÇÃO A OBJETOS aula 1.pdf
TOO - TÉCNICAS DE ORIENTAÇÃO A OBJETOS aula 1.pdf
Momento da Informática
 
DESENVOLVIMENTO DE SOFTWARE I_aula1-2.pdf
DESENVOLVIMENTO DE SOFTWARE I_aula1-2.pdfDESENVOLVIMENTO DE SOFTWARE I_aula1-2.pdf
DESENVOLVIMENTO DE SOFTWARE I_aula1-2.pdf
Momento da Informática
 
Logica de Progamacao - Aula (1) (1).pptx
Logica de Progamacao - Aula (1) (1).pptxLogica de Progamacao - Aula (1) (1).pptx
Logica de Progamacao - Aula (1) (1).pptx
Momento da Informática
 
Certificado Jornada Python Da Hashtag.pdf
Certificado Jornada Python Da Hashtag.pdfCertificado Jornada Python Da Hashtag.pdf
Certificado Jornada Python Da Hashtag.pdf
joaovmp3
 

Último (6)

Manual-de-Credenciamento ANATER 2023.pdf
Manual-de-Credenciamento ANATER 2023.pdfManual-de-Credenciamento ANATER 2023.pdf
Manual-de-Credenciamento ANATER 2023.pdf
 
História da Rádio- 1936-1970 século XIX .2.pptx
História da Rádio- 1936-1970 século XIX   .2.pptxHistória da Rádio- 1936-1970 século XIX   .2.pptx
História da Rádio- 1936-1970 século XIX .2.pptx
 
TOO - TÉCNICAS DE ORIENTAÇÃO A OBJETOS aula 1.pdf
TOO - TÉCNICAS DE ORIENTAÇÃO A OBJETOS aula 1.pdfTOO - TÉCNICAS DE ORIENTAÇÃO A OBJETOS aula 1.pdf
TOO - TÉCNICAS DE ORIENTAÇÃO A OBJETOS aula 1.pdf
 
DESENVOLVIMENTO DE SOFTWARE I_aula1-2.pdf
DESENVOLVIMENTO DE SOFTWARE I_aula1-2.pdfDESENVOLVIMENTO DE SOFTWARE I_aula1-2.pdf
DESENVOLVIMENTO DE SOFTWARE I_aula1-2.pdf
 
Logica de Progamacao - Aula (1) (1).pptx
Logica de Progamacao - Aula (1) (1).pptxLogica de Progamacao - Aula (1) (1).pptx
Logica de Progamacao - Aula (1) (1).pptx
 
Certificado Jornada Python Da Hashtag.pdf
Certificado Jornada Python Da Hashtag.pdfCertificado Jornada Python Da Hashtag.pdf
Certificado Jornada Python Da Hashtag.pdf
 

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