diff --git a/labs/2021/01-data-flow/solucoes/isadora-oliveira/README.md b/labs/2021/01-data-flow/solucoes/isadora-oliveira/README.md new file mode 100644 index 000000000..b03d8f761 --- /dev/null +++ b/labs/2021/01-data-flow/solucoes/isadora-oliveira/README.md @@ -0,0 +1,38 @@ +# Modelo para Apresentação do Lab01 - Data Flow + +Estrutura de pastas: + +~~~ +├── README.md <- arquivo apresentando a tarefa +│ +├── images <- arquivos de imagens usadas no documento +│ +└── orange <- arquivos do Orange +~~~ + +#Aluna + +* Isadora Mendonça de Oliveira +# Tarefa 1 - Workflow para Recomendação de Zombie Meals +## Imagem do Projeto +Atividade 1![image](https://user-images.githubusercontent.com/50779822/130332786-6abd911d-1d3c-423a-a242-beb40f063a25.png) + + +## Arquivo do Projeto +# Tarefa 2 - Projeto de Composição para Venda e Recomendação +## Diagrama de Componentes +Atividade 2![image](https://user-images.githubusercontent.com/50779822/130332901-58e66b85-79ea-4ee5-bf82-9ac647de6d0e.png) + + +## Texto Explicativo +Foi desenvolvido um diagrama de componentes com um fluxo de pedido de uma refeição. + +O zumbi acessa a plataforma e realiza uma bisca para obter as refeições disponíveis no cardápio. + +O primeiro componente "Montar pedido" é o responsável por mandar uma recomendacao de refeição para o componente "Solicita recomendação de refeição", sendo o zumbi responsável, ou não, por aceitar a recomendação. + +O componente de recomendação utiliza um modelo de predição utilizando os próprios dados obtidos das vendas fornecidos pelo componente "Consulta venda" e suas respectivas notas por outro componente, o "Consulta rating". + +Após a escolha da refeição pelo zumbi, a mesma é enviada para o componente "Solicita refeição", responsável por efetuar o pagamento e criar o pedido. Após confirmar o pagamento , o componente "Prepara Pedido" entra em cena. + +Após o preparo, ele é enviado para o próximo componente, o "Despacha Pedido", que realiza o envio da refeição para o zumbi cliente. diff --git a/labs/2021/01-data-flow/solucoes/isadora-oliveira/images/Atividade 1.png b/labs/2021/01-data-flow/solucoes/isadora-oliveira/images/Atividade 1.png new file mode 100644 index 000000000..b20788f3f Binary files /dev/null and b/labs/2021/01-data-flow/solucoes/isadora-oliveira/images/Atividade 1.png differ diff --git a/labs/2021/01-data-flow/solucoes/isadora-oliveira/images/Atividade 2.png b/labs/2021/01-data-flow/solucoes/isadora-oliveira/images/Atividade 2.png new file mode 100644 index 000000000..de6de18e9 Binary files /dev/null and b/labs/2021/01-data-flow/solucoes/isadora-oliveira/images/Atividade 2.png differ diff --git a/labs/2021/01-data-flow/solucoes/isadora-oliveira/orange/zombie-meals-prediction.ows b/labs/2021/01-data-flow/solucoes/isadora-oliveira/orange/zombie-meals-prediction.ows new file mode 100644 index 000000000..b4ef918f5 --- /dev/null +++ b/labs/2021/01-data-flow/solucoes/isadora-oliveira/orange/zombie-meals-prediction.ows @@ -0,0 +1,102 @@ + + + + + + + + + + + + + + + + + + + + + + + + + F1 = 0.94, Precision = 0.950 e Recall = 0.938 + F1 = 0.75, Precision = 0.75 e Recall = 0.75 + + + + {'_session_items': [], '_session_items_v2': [({'type': 'AbsPath', 'path': '/home/zepenna/Desktop/inf331/component2learn/labs/2021/01-data-flow/solucoes/zepenna/orange/zombie-meals.csv'}, {'encoding': 'utf-8', 'delimiter': ',', 'quotechar': '"', 'doublequote': True, 'skipinitialspace': True, 'quoting': 0, 'columntypes': [{'start': 0, 'stop': 16, 'value': 'Auto'}], 'rowspec': [{'start': 0, 'stop': 1, 'value': 'Header'}], 'decimal_separator': '.', 'group_separator': ''}), ({'type': 'AbsPath', 'path': '/home/zepenna/Desktop/inf331/component2learn/labs/2021/01-data-flow/zombie-meals.csv'}, {'encoding': 'utf-8', 'delimiter': ',', 'quotechar': '"', 'doublequote': True, 'skipinitialspace': True, 'quoting': 0, 'columntypes': [{'start': 0, 'stop': 16, 'value': 'Auto'}], 'rowspec': [{'start': 0, 'stop': 1, 'value': 'Header'}], 'decimal_separator': '.', 'group_separator': ''}), ({'type': 'VarPath', 'name': 'basedir', 'relpath': 'zombie-meals-recommend.csv'}, {'encoding': 'utf-8', 'delimiter': ',', 'quotechar': '"', 'doublequote': True, 'skipinitialspace': True, 'quoting': 0, 'columntypes': [{'start': 0, 'stop': 1, 'value': 'Text'}, {'start': 1, 'stop': 3, 'value': 'Categorical'}, {'start': 3, 'stop': 16, 'value': 'Numeric'}, {'start': 16, 'stop': 17, 'value': 'Categorical'}], 'rowspec': [{'start': 0, 'stop': 1, 'value': 'Header'}], 'decimal_separator': '.', 'group_separator': ''})], 'compatibility_mode': False, 'controlAreaVisible': True, 'dialog_state': {'directory': '/home/zepenna/Desktop/inf331/component2learn/labs/2021/01-data-flow/solucoes/zepenna/orange', 'filter': 'Text - comma separated (*.csv, *)'}, 'savedWidgetGeometry': b'\x01\xd9\xd0\xcb\x00\x03\x00\x00\x00\x00\x00H\x00\x00\x00\x00\x00\x00\x01\x93\x00\x00\x01h\x00\x00\x00H\x00\x00\x00%\x00\x00\x01\x93\x00\x00\x01h\x00\x00\x00\x01\x00\x00\x00\x00\n\x00\x00\x00\x00H\x00\x00\x00%\x00\x00\x01\x93\x00\x00\x01h', '__version__': 3} + gASVbgcAAAAAAAB9lCiMC2F1dG9fY29tbWl0lIiMEmNvbnRyb2xBcmVhVmlzaWJsZZSIjBNpZ25v +cmVfbmV3X2ZlYXR1cmVzlImME3NhdmVkV2lkZ2V0R2VvbWV0cnmUQ0IB2dDLAAMAAAAACK8AAABy +AAAOGAAAA4YAAAivAAAAlwAADhgAAAOGAAAAAAAAAAAHgAAACK8AAACXAAAOGAAAA4aUjBJ1c2Vf +aW5wdXRfZmVhdHVyZXOUiYwLX192ZXJzaW9uX1+USwGMEGNvbnRleHRfc2V0dGluZ3OUXZQojBVv +cmFuZ2V3aWRnZXQuc2V0dGluZ3OUjAdDb250ZXh0lJOUKYGUfZQojAZ2YWx1ZXOUfZQojBFkb21h +aW5fcm9sZV9oaW50c5R9lCiMBG5hbWWUSwOGlIwJYXZhaWxhYmxllEsAhpSMBnJhdGluZ5RLAoaU +aBVLAYaUjANtZnKUSwGGlIwJYXR0cmlidXRllEsAhpSMBndlaWdodJRLAoaUaBxLAYaUjAhjYWxv +cmllc5RLAoaUaBxLAoaUjAdwcm90ZWlulEsChpRoHEsDhpSMA2ZhdJRLAoaUaBxLBIaUjAZzb2Rp +dW2USwKGlGgcSwWGlIwFZmliZXKUSwKGlGgcSwaGlIwFY2FyYm+USwKGlGgcSweGlIwGc3VnYXJz +lEsChpRoHEsIhpSMBnBvdGFzc5RLAoaUaBxLCYaUjAh2aXRhbWluc5RLAoaUaBxLCoaUjAVzaGVs +ZpRLAoaUaBxLC4aUjARjdXRzlEsChpRoHEsMhpSMBHR5cGWUSwGGlGgcSw2GlIwOcmVjb21tZW5k +YXRpb26USwGGlIwFY2xhc3OUSwCGlHVK/v///4aUaAdLAXWMCmF0dHJpYnV0ZXOUfZQoaBpLAWhC +SwFoIUsCaCRLAmgnSwJoKksCaC1LAmgwSwJoM0sCaDZLAmg5SwJoPEsCaB5LAmg/SwJoF0sCaEVL +AXWMBW1ldGFzlH2UaBNLA3N1YmgMKYGUfZQoaA99lChoEX2UKGgTSwOGlGgVSwCGlGgaSwGGlGgc +SwCGlGgeSwKGlGgcSwGGlGghSwKGlGgcSwKGlGgkSwKGlGgcSwOGlGgnSwKGlGgcSwSGlGgqSwKG +lGgcSwWGlGgtSwKGlGgcSwaGlGgwSwKGlGgcSweGlGgzSwKGlGgcSwiGlGg2SwKGlGgcSwmGlGg5 +SwKGlGgcSwqGlGg8SwKGlGgcSwuGlGg/SwKGlGgcSwyGlGhCSwGGlGgcSw2GlGgXSwKGlGhHSwCG +lHVK/v///4aUaAdLAXVoSn2UKIwDbWZylEsBjAR0eXBllEsBjAhjYWxvcmllc5RLAowHcHJvdGVp +bpRLAowDZmF0lEsCjAZzb2RpdW2USwKMBWZpYmVylEsCjAVjYXJib5RLAowGc3VnYXJzlEsCjAZw +b3Rhc3OUSwKMCHZpdGFtaW5zlEsCjAVzaGVsZpRLAowGd2VpZ2h0lEsCjARjdXRzlEsCjAZyYXRp +bmeUSwJ1aEx9lIwEbmFtZZRLA3N1YmgMKYGUfZQoaA99lChoEX2UKGgTSwOGlGgVSwCGlGgaSwGG +lGgcSwCGlGgeSwKGlGgcSwGGlGghSwKGlGgcSwKGlGgkSwKGlGgcSwOGlGgnSwKGlGgcSwSGlGgq +SwKGlGgcSwWGlGgtSwKGlGgcSwaGlGgwSwKGlGgcSweGlGgzSwKGlGgcSwiGlGg2SwKGlGgcSwmG +lGg5SwKGlGgcSwqGlGg8SwKGlGgcSwuGlGg/SwKGlGgcSwyGlGhCSwGGlGgcSw2GlIwDcmVjlEsB +hpRoHEsOhpRoF0sChpRoR0sAhpR1Sv7///+GlGgHSwF1aEp9lChoGksBaEJLAWghSwJoJEsCaCdL +AmgqSwJoLUsCaDBLAmgzSwJoNksCaDlLAmg8SwJoHksCaD9LAmgXSwJop0sBdWhMfZRoE0sDc3Vi +aAwpgZR9lChoD32UKGgRfZQojARuYW1llEsDhpRoFUsAhpSMBnJhdGluZ5RLAoaUaBVLAYaUjANt +ZnKUSwGGlGgcSwCGlIwGd2VpZ2h0lEsChpRoHEsBhpSMCGNhbG9yaWVzlEsChpRoHEsChpSMB3By +b3RlaW6USwKGlGgcSwOGlIwDZmF0lEsChpRoHEsEhpSMBnNvZGl1bZRLAoaUaBxLBYaUjAVmaWJl +cpRLAoaUaBxLBoaUjAVjYXJib5RLAoaUaBxLB4aUjAZzdWdhcnOUSwKGlGgcSwiGlIwGcG90YXNz +lEsChpRoHEsJhpSMCHZpdGFtaW5zlEsChpRoHEsKhpSMBXNoZWxmlEsChpRoHEsLhpSMBGN1dHOU +SwKGlGgcSwyGlIwEdHlwZZRLAYaUaBxLDYaUjAlyZWNvbW1lbmSUSwGGlGhHSwCGlHVK/v///4aU +aAdLAXVoSn2UKGi5SwFo4EsBaL9LAmjCSwJoxUsCaMhLAmjLSwJozksCaNFLAmjUSwJo10sCaNpL +Ami8SwJo3UsCaLZLAmjjSwF1aEx9lGizSwNzdWJldS4= + + {'compatibility_mode': False, 'controlAreaVisible': True, 'number_of_folds': 5, 'replacement': False, 'sampleSizeNumber': 1, 'sampleSizePercentage': 80, 'sampleSizeSqlPercentage': 0.1, 'sampleSizeSqlTime': 1, 'sampling_type': 2, 'savedWidgetGeometry': b'\x01\xd9\xd0\xcb\x00\x03\x00\x00\x00\x00\x06y\x00\x00\x01\xae\x00\x00\x07\x7f\x00\x00\x03\x81\x00\x00\x06y\x00\x00\x01\xd3\x00\x00\x07\x7f\x00\x00\x03\x81\x00\x00\x00\x01\x00\x00\x00\x00\x07\x80\x00\x00\x06y\x00\x00\x01\xd3\x00\x00\x07\x7f\x00\x00\x03\x81', 'selectedFold': 1, 'sql_dl': False, 'stratify': False, 'use_seed': True, '__version__': 2} + gASVCgEAAAAAAAB9lCiMEmNvbnRyb2xBcmVhVmlzaWJsZZSIjBNzYXZlZFdpZGdldEdlb21ldHJ5 +lENCAdnQywADAAAAAAClAAAArwAAB04AAAOUAAAApQAAANQAAAdOAAADlAAAAAEAAAAACgAAAACl +AAAA1AAAB04AAAOUlIwJc2VsZWN0aW9ulF2UjAtzY29yZV90YWJsZZR9lIwMc2hvd25fc2NvcmVz +lI+UKIwDQVVDlIwDTUFFlIwDTVNFlIwCQ0GUjAJGMZSMAlIylIwGUmVjYWxslIwEUk1TRZSMCVBy +ZWNpc2lvbpSQc4wLX192ZXJzaW9uX1+USwGMEGNvbnRleHRfc2V0dGluZ3OUXZR1Lg== + + gASVTwMAAAAAAAB9lCiMEmNvbnRyb2xBcmVhVmlzaWJsZZSIjBNzYXZlZFdpZGdldEdlb21ldHJ5 +lENCAdnQywADAAAAAAmKAAABrwAADc8AAANfAAAJigAAAdQAAA3PAAADXwAAAAAAAAAAB4AAAAmK +AAAB1AAADc8AAANflIwLX192ZXJzaW9uX1+USwGMEGNvbnRleHRfc2V0dGluZ3OUXZQojBVvcmFu +Z2V3aWRnZXQuc2V0dGluZ3OUjAdDb250ZXh0lJOUKYGUfZQojAZ2YWx1ZXOUfZQojAxjdXJyZW50 +SW5kZXiUSwBK/v///4aUjAtkZXNjcmlwdG9yc5RdlIwoT3JhbmdlLndpZGdldHMuZGF0YS5vd2Zl +YXR1cmVjb25zdHJ1Y3RvcpSMEkRpc2NyZXRlRGVzY3JpcHRvcpSTlCiMDnJlY29tbWVuZGF0aW9u +lIwcInkiIGlmIHJhdGluZyA+PSA1MCBlbHNlICJuIpQpiXSUgZRhaARLAXWMCmF0dHJpYnV0ZXOU +fZQojANtZnKUSwGMBHR5cGWUSwGMCGNhbG9yaWVzlEsCjAdwcm90ZWlulEsCjANmYXSUSwKMBnNv +ZGl1bZRLAowFZmliZXKUSwKMBWNhcmJvlEsCjAZzdWdhcnOUSwKMBnBvdGFzc5RLAowIdml0YW1p +bnOUSwKMBXNoZWxmlEsCjAZ3ZWlnaHSUSwKMBGN1dHOUSwKMBnJhdGluZ5RLAnWMBW1ldGFzlH2U +jARuYW1llEsDc3ViaAkpgZR9lChoDH2UKGgOSwBK/v///4aUaBBdlGgUKIwDcmVjlIwcIlkiIGlm +IHJhdGluZyA+PSA1MCBlbHNlICJOIpQpiXSUgZRhaARLAXVoGX2UKIwDbWZylEsBjAR0eXBllEsB +jAhjYWxvcmllc5RLAowHcHJvdGVpbpRLAowDZmF0lEsCjAZzb2RpdW2USwKMBWZpYmVylEsCjAVj +YXJib5RLAowGc3VnYXJzlEsCjAZwb3Rhc3OUSwKMCHZpdGFtaW5zlEsCjAVzaGVsZpRLAowGd2Vp +Z2h0lEsCjARjdXRzlEsCjAZyYXRpbmeUSwKMCXJlY29tbWVuZJRLAXVoKn2UjARuYW1llEsDc3Vi +ZXUu + + {'C_index': 61, 'auto_apply': True, 'class_weight': False, 'controlAreaVisible': True, 'learner_name': '', 'penalty_type': 1, 'savedWidgetGeometry': b'\x01\xd9\xd0\xcb\x00\x03\x00\x00\x00\x00\x04p\x00\x00\x01\\\x00\x00\x05{\x00\x00\x02\x8c\x00\x00\x04p\x00\x00\x01\\\x00\x00\x05{\x00\x00\x02\x8c\x00\x00\x00\x01\x00\x00\x00\x00\n\x00\x00\x00\x04p\x00\x00\x01\\\x00\x00\x05{\x00\x00\x02\x8c', '__version__': 1} + {'auto_apply': True, 'binary_trees': True, 'controlAreaVisible': True, 'learner_name': '', 'limit_depth': True, 'limit_majority': True, 'limit_min_internal': True, 'limit_min_leaf': True, 'max_depth': 100, 'min_internal': 5, 'min_leaf': 2, 'savedWidgetGeometry': b'\x01\xd9\xd0\xcb\x00\x03\x00\x00\x00\x00\x0c\xfa\x00\x00\x01\x1b\x00\x00\x0er\x00\x00\x02\xa8\x00\x00\x0c\xfa\x00\x00\x01@\x00\x00\x0er\x00\x00\x02\xa8\x00\x00\x00\x00\x00\x00\x00\x00\x07\x80\x00\x00\x0c\xfa\x00\x00\x01@\x00\x00\x0er\x00\x00\x02\xa8', 'sufficient_majority': 95, '__version__': 1} + gASVCgEAAAAAAAB9lCiMEmNvbnRyb2xBcmVhVmlzaWJsZZSIjBNzYXZlZFdpZGdldEdlb21ldHJ5 +lENCAdnQywADAAAAAABrAAAAlgAABxQAAAN7AAAAawAAALsAAAcUAAADewAAAAEAAAAACgAAAABr +AAAAuwAABxQAAAN7lIwJc2VsZWN0aW9ulF2UjAtzY29yZV90YWJsZZR9lIwMc2hvd25fc2NvcmVz +lI+UKIwDTUFFlIwDQVVDlIwDTVNFlIwCRjGUjAJDQZSMAlIylIwGUmVjYWxslIwEUk1TRZSMCVBy +ZWNpc2lvbpSQc4wLX192ZXJzaW9uX1+USwGMEGNvbnRleHRfc2V0dGluZ3OUXZR1Lg== + + + + + + diff --git a/labs/2021/02-dataflow_mvc/solucoes/isadora-oliveira/README.md b/labs/2021/02-dataflow_mvc/solucoes/isadora-oliveira/README.md new file mode 100644 index 000000000..0be3d9a86 --- /dev/null +++ b/labs/2021/02-dataflow_mvc/solucoes/isadora-oliveira/README.md @@ -0,0 +1,9 @@ +## Aluna + +### Isadora Mendonça de Oliveira + +### Tarefas da parte 1 sobre criação de componentes +* [Notebook - 1](notebook/components-1.ipynb/) + +### Tarefas da parte 2 sobre composição de componentes do catálogo +* [Notebook - 2](notebook/components-4-copy.ipynb) diff --git a/labs/2021/02-dataflow_mvc/solucoes/isadora-oliveira/notebook/components-1.ipynb b/labs/2021/02-dataflow_mvc/solucoes/isadora-oliveira/notebook/components-1.ipynb new file mode 100644 index 000000000..90b923286 --- /dev/null +++ b/labs/2021/02-dataflow_mvc/solucoes/isadora-oliveira/notebook/components-1.ipynb @@ -0,0 +1 @@ +{"cells":[{"metadata":{},"cell_type":"markdown","source":"# Componentes em Java"},{"metadata":{},"cell_type":"markdown","source":"# Componente `GeometricProgression`\n\nGera uma progressão geométrica a partir de um valor `inicial` e de uma `razão`."},{"metadata":{},"cell_type":"markdown","source":"## Interface `ISequence`\n\nPercorre os elementos da razão em sequência. Métodos:\n* `first` - se desloca para (ou calcula) o primeiro elemento da sequência e o retorna\n* `next` - se desloca para (ou calcula) o pŕoximo elemento da sequência e o retorna"},{"metadata":{"trusted":true},"cell_type":"code","source":"public interface ISequence {\n public int first();\n public int next();\n}","execution_count":1,"outputs":[{"output_type":"execute_result","execution_count":1,"data":{"text/plain":"com.twosigma.beaker.javash.bkr3d76c9b9.ISequence"},"metadata":{}}]},{"metadata":{},"cell_type":"markdown","source":"## Interface `IGeometricProgressionProperties`\n\nPropriedades de uma progressão geométrica.\n\nMétodos `get` e `set` para as propriedades:\n* `initial` - valor inicial da progressão\n* `ratio` - razão da progressão"},{"metadata":{"trusted":true},"cell_type":"code","source":"public interface IGeometricProgressionProperties {\n public int getInitial();\n public void setInitial(int initial);\n \n public int getRatio();\n public void setRatio(int ratio);\n}","execution_count":2,"outputs":[{"output_type":"execute_result","execution_count":2,"data":{"text/plain":"com.twosigma.beaker.javash.bkr3d76c9b9.IGeometricProgressionProperties"},"metadata":{}}]},{"metadata":{},"cell_type":"markdown","source":"## Interface `IGeometricProgression`\n\nUnifica as duas interfaces anteriores."},{"metadata":{"trusted":true},"cell_type":"code","source":"public interface IGeometricProgression\n extends ISequence, IGeometricProgressionProperties {\n}","execution_count":3,"outputs":[{"output_type":"execute_result","execution_count":3,"data":{"text/plain":"com.twosigma.beaker.javash.bkr3d76c9b9.IGeometricProgression"},"metadata":{}}]},{"metadata":{},"cell_type":"markdown","source":"## Classe `GeometricProgression`\n\nGera uma **Progressão Geométrica** a partir de um valor inicial (`initial`) e de uma razão (`ratio`)."},{"metadata":{"trusted":true},"cell_type":"code","source":"public class GeometricProgression implements IGeometricProgression {\n private int initial,\n ratio;\n private int current;\n \n public GeometricProgression() {\n initial = 1;\n ratio = 2;\n current = initial;\n }\n \n public int getInitial() {\n return initial;\n }\n \n public void setInitial(int initial) {\n this.initial = initial;\n }\n \n public int getRatio() {\n return ratio;\n }\n \n public void setRatio(int ratio) {\n this.ratio = ratio;\n }\n \n public int first() {\n current = initial;\n return current;\n }\n \n public int next() {\n current *= ratio;\n return current;\n }\n}","execution_count":4,"outputs":[{"output_type":"execute_result","execution_count":4,"data":{"text/plain":"com.twosigma.beaker.javash.bkr3d76c9b9.GeometricProgression"},"metadata":{}}]},{"metadata":{},"cell_type":"markdown","source":"## Exemplo de uso do Componente"},{"metadata":{"trusted":true},"cell_type":"code","source":"IGeometricProgression gp = new GeometricProgression();\ngp.setInitial(1);\ngp.setRatio(2);\nSystem.out.print(\"Progressão Geométrica: \");\nint value = gp.first();\nfor (int g = 1; g <= 5; g++) {\n System.out.print(value + \", \");\n value = gp.next();\n}","execution_count":5,"outputs":[{"output_type":"stream","text":"Progressão Geométrica: 1, 2, 4, 8, 16, ","name":"stdout"},{"output_type":"execute_result","execution_count":5,"data":{"text/plain":"null"},"metadata":{}}]},{"metadata":{},"cell_type":"markdown","source":"# Componente `BarChart`\n\nApresenta um diagrama de barras no console a partir de uma sequência de números. A sequência é produzida por um componente a ele conectado."},{"metadata":{},"cell_type":"markdown","source":"## Interface `IChart`\n\nDispara a apresentação do diagrama a partir do método `plot()`."},{"metadata":{"trusted":true},"cell_type":"code","source":"public interface IChart {\n public void plot();\n}","execution_count":6,"outputs":[{"output_type":"execute_result","execution_count":6,"data":{"text/plain":"com.twosigma.beaker.javash.bkr3d76c9b9.IChart"},"metadata":{}}]},{"metadata":{},"cell_type":"markdown","source":"## Interface `IBarChartProperties`\n\nPropriedades para configurar um gráfico de barras.\n\nMétodos `get` e `set` para as propriedades:\n* `filled` - define se o gráfico será preenchido\n* `character` - caractere que será usado para plotar o gráfico\n* `n` - número de barras que serão apresentadas"},{"metadata":{"trusted":true},"cell_type":"code","source":"public interface IBarChartProperties {\n public boolean isFilled();\n public void setFilled(boolean filled);\n\n public char getCharacter();\n public void setCharacter(char character);\n\n public int getN();\n public void setN(int n);\n}","execution_count":7,"outputs":[{"output_type":"execute_result","execution_count":7,"data":{"text/plain":"com.twosigma.beaker.javash.bkr3d76c9b9.IBarChartProperties"},"metadata":{}}]},{"metadata":{},"cell_type":"markdown","source":"## Interface Requerida `IRSequence`\n\nInterface que requer outra interface `ISequence`. Método:\n* `connect` - realiza a conexão com um componente que tem a interface ISequence"},{"metadata":{"trusted":true},"cell_type":"code","source":"public interface IRSequence {\n public void connect(ISequence sequence);\n}","execution_count":8,"outputs":[{"output_type":"execute_result","execution_count":8,"data":{"text/plain":"com.twosigma.beaker.javash.bkr3d76c9b9.IRSequence"},"metadata":{}}]},{"metadata":{},"cell_type":"markdown","source":"## Interface `IBarChart`\n\nUnifica as três interfaces anteriores."},{"metadata":{"trusted":true},"cell_type":"code","source":"public interface IBarChart\n extends IChart, IBarChartProperties, IRSequence {\n}","execution_count":9,"outputs":[{"output_type":"execute_result","execution_count":9,"data":{"text/plain":"com.twosigma.beaker.javash.bkr3d76c9b9.IBarChart"},"metadata":{}}]},{"metadata":{},"cell_type":"markdown","source":"## Classe `BarChart`\n\nImplementa a apresentação de um gráfico de barras."},{"metadata":{"trusted":true},"cell_type":"code","source":"public class BarChart implements IBarChart {\n private boolean filled;\n private char character;\n private int n;\n \n private ISequence sequence;\n \n public BarChart() {\n filled = true;\n character = '*';\n n = 3;\n }\n\n public boolean isFilled() {\n return filled;\n }\n\n public void setFilled(boolean filled) {\n this.filled = filled;\n }\n\n public char getCharacter() {\n return character;\n }\n\n public void setCharacter(char character) {\n this.character = character;\n }\n\n public int getN() {\n return n;\n }\n\n public void setN(int n) {\n this.n = n;\n }\n\n public void connect(ISequence sequence) {\n this.sequence = sequence;\n }\n \n public void plot() {\n if (sequence != null) {\n int value = sequence.first();\n for (int s = 1; s <= n; s++) {\n for (int v = 1; v < value; v++)\n System.out.print((filled) ? character : ' ');\n System.out.println(character);\n value = sequence.next();\n }\n }\n }\n}","execution_count":10,"outputs":[{"output_type":"execute_result","execution_count":10,"data":{"text/plain":"com.twosigma.beaker.javash.bkr3d76c9b9.BarChart"},"metadata":{}}]},{"metadata":{},"cell_type":"markdown","source":"# Aplicação Exemplo\nInstancia os dois componentes (progressão geométrica e gráfico de barras), os conecta e dispara o processo de plotagem no componente do gráfico de barras."},{"metadata":{"trusted":true},"cell_type":"code","source":"IGeometricProgression gp = new GeometricProgression();\ngp.setInitial(1);\ngp.setRatio(2);\n\nIBarChart bc = new BarChart();\nbc.setFilled(true);\nbc.setCharacter('#');\nbc.setN(5);\n\nbc.connect(gp);\nbc.plot();","execution_count":11,"outputs":[{"output_type":"stream","text":"#\n##\n####\n########\n################\n","name":"stdout"},{"output_type":"execute_result","execution_count":11,"data":{"text/plain":"null"},"metadata":{}}]},{"metadata":{},"cell_type":"markdown","source":"# Laboratório 2a"},{"metadata":{},"cell_type":"markdown","source":"## Tarefa 1\n\nEscreva um componente em Java chamado `Media` que receba um lote contendo uma sequência de `n` números e gere a média desses números. O componente deve seguir o estilo arquitetural Data Flow, respeitando a interface pivô `ISequence`, tanto para receber o lote de números, quanto para gerar média. O componente é customizado pela seguinte propriedade:\n\n* `n` - indica quantos números ele considerará para cada lote de cálculo de média; por exemplo, se o `n` for `5`, o componente solicita 5 números, calcula a média e passa adiante, depois solicita mais 5, calcula a média e passa adiante.\n\nÉ importante que você separe cada classe e interface em uma célula diferente do Jupyter."},{"metadata":{"trusted":true},"cell_type":"code","source":"public interface IMediaProperties {\n public void setN(int n);\n public int getN();\n}","execution_count":12,"outputs":[{"output_type":"execute_result","execution_count":12,"data":{"text/plain":"com.twosigma.beaker.javash.bkr3d76c9b9.IMediaProperties"},"metadata":{}}]},{"metadata":{"trusted":true},"cell_type":"code","source":"public interface IMedia extends ISequence, IRSequence, IMediaProperties { }","execution_count":13,"outputs":[{"output_type":"execute_result","execution_count":13,"data":{"text/plain":"com.twosigma.beaker.javash.bkr3d76c9b9.IMedia"},"metadata":{}}]},{"metadata":{"trusted":true},"cell_type":"code","source":"public class Media implements IMedia {\n private int number;\n private ISequence sequence;\n\n public void setN(int n) {\n this.number = n;\n }\n\n public int getN() {\n return this.number;\n }\n\n public int first() {\n return getMedia();\n }\n\n public int next() {\n return getMedia();\n }\n\n public void connect(ISequence sequence) {\n this.sequence = sequence;\n }\n\n public Media() {\n number = 9;\n }\n\n private int getMedia() {\n int current;\n int total;\n current = sequence.first();\n total = current;\n\n int media;\n\n for(int i = 0; i < number-1; i++) {\n current = sequence.next();\n total += current;\n }\n\n media = total/number;\n return media;\n }\n\n}","execution_count":20,"outputs":[{"output_type":"execute_result","execution_count":20,"data":{"text/plain":"com.twosigma.beaker.javash.bkr3d76c9b9.Media"},"metadata":{}}]},{"metadata":{},"cell_type":"markdown","source":"## Tarefa 2\n\nEscreva um programa em Java que conecte um componente `GeometricProgression` a um `Media` que por sua vez é conectado a um componente `BarChart`. O componente `Media` deve calcular as médias de 4 lotes de 3 números da progressão geométrica. Essas médias serão apresentadas no `BarChart`."},{"metadata":{"trusted":true},"cell_type":"code","source":"IGeometricProgression gp = new GeometricProgression();\ngp.setInitial(1);\ngp.setRatio(6);\n\nIMedia media = new Media();\nmedia.setN(5);\nmedia.connect(gp);\n\nIBarChart bc = new BarChart();\nbc.setFilled(true);\nbc.setCharacter('$');\nbc.setN(4);\n\nbc.connect(media);\nbc.plot();","execution_count":22,"outputs":[{"output_type":"stream","text":"$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$\n$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$\n$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$\n$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$\n","name":"stdout"},{"output_type":"execute_result","execution_count":22,"data":{"text/plain":"null"},"metadata":{}}]},{"metadata":{"trusted":true},"cell_type":"code","source":"","execution_count":null,"outputs":[]}],"metadata":{"kernelspec":{"name":"java","display_name":"Java","language":"java"},"language_info":{"nbconverter_exporter":"","codemirror_mode":"text/x-java","name":"Java","mimetype":"","file_extension":".java","version":"1.8.0_121"},"toc":{"nav_menu":{},"number_sections":false,"sideBar":false,"skip_h1_title":false,"base_numbering":1,"title_cell":"Table of Contents","title_sidebar":"Contents","toc_cell":false,"toc_position":{},"toc_section_display":false,"toc_window_display":false}},"nbformat":4,"nbformat_minor":4} \ No newline at end of file diff --git a/labs/2021/02-dataflow_mvc/solucoes/isadora-oliveira/notebook/components-4-copy.ipynb b/labs/2021/02-dataflow_mvc/solucoes/isadora-oliveira/notebook/components-4-copy.ipynb new file mode 100644 index 000000000..9006eccb6 --- /dev/null +++ b/labs/2021/02-dataflow_mvc/solucoes/isadora-oliveira/notebook/components-4-copy.ipynb @@ -0,0 +1,952 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Componentes de Software\n", + "\n", + "A seguir são reunidos alguns conceitos importantes para se entender o princípio de **Componentes de Software**.\n", + "\n", + "Em linhas gerais, um componente é um módulo de software reusável, que se liga aos seus parceiros exclusivamente através de interfaces. Apresentaremos aqui uma abordagem típica de ligação de componentes baseada em interfaces e conexões:\n", + "* **Interfaces** - expressam os serviços providos pelos componentes, declarados através de `interfaces` Java;\n", + "* **Conexões** - é a forma como componentes são ligados entre si; a partir delas um componente toma conhecimento do outro para que se comuniquem.\n", + "\n", + "## Interfaces\n", + "\n", + "Idealmente, todas as funcionalidades de um componente deveriam ser acessadas exclusivamente através de interfaces.\n", + "\n", + "Vamos analisar o processo de definição do `DataSetComponent` como um componente de software. Considerando que o código a seguir é uma versão inicial do componente, uma representação visual para o mesmo pode ser feita em UML, conforme segue:\n", + "\n", + "![Componente](images/console-dataset-a.png)\n", + "\n", + "Veja a seguir a representação em Java:\n", + "\n", + "~~~java\n", + "public interface IDataSetProperties {\n", + " public String getDataSource();\n", + " public void setDataSource(String dataSource);\n", + "}\n", + "\n", + "public interface ITableProducer {\n", + " String[] requestAttributes();\n", + " String[][] requestInstances();\n", + "}\n", + "~~~\n", + "\n", + "Note que cada interface que ele disponibiliza é apresentada na forma de uma haste com um círculo na ponta.\n", + "\n", + "Como a interface `IDataSetProperties` tem métodos `get` e `set` para definir a propriedade `DataSource`, em vez de representar essa interface da forma tradicional, podemos representá-la na forma de uma propriedade associada ao componente como segue:\n", + "\n", + "![Componente](images/console-dataset-b.png)\n", + "\n", + "A representação de propriedades não é padrão UML, mas é usada por algumas extensões. Isso introduz um terceiro elemento usual em algumas implementações de componentes:\n", + "\n", + "* **Propriedades** - podem ser usadas como mecanismos de configuração externa do componente; por exemplo, através da propriedade `dataSource` é possível externamente se configurar a fonte de dados do componente.\n", + "\n", + "A partir de agora, criaremos uma interface específica para a modificação de propriedades e usaremos a representação na forma de propriedade.\n", + "\n", + "Para englobar todas as interfaces em uma única, foi usada a estratégia de criar uma interface para o componente (`IDataSet`) unificando as demais na forma de herança:\n", + "\n", + "~~~java\n", + "public interface IDataSet extends IDataSetProperties, ITableProducer {\n", + "}\n", + "~~~\n", + "\n", + "Essa estratégia será adotada em todos os componentes." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Conexões\n", + "\n", + "Uma das formas mais comuns de comunicação entre componentes é a criação de uma conexão entre eles. Em linguagens orientadas a objetos uma estratégia consiste em um objeto (componente) guardar a referência de outro objeto (componente).\n", + "\n", + "Utilizaremos um método padrão chamado `connect` que conecta dois componentes. Para isso um dos objetos recebe a referência de outro:\n", + "~~~java\n", + "public void connect(ITableProducer producer)\n", + "~~~\n", + "\n", + "Esse método recebe a referência para qualquer objeto que implementa a interface `ITableProducer` e a guarda. A referência é posteriormente usada para a comunicação entre os dois objetos.\n", + "\n", + "# Interface Requerida\n", + "\n", + "O ideal é que tudo seja explícito e que haja uma interface para realizar essa conexão. Desse modo, criaremos uma interface chamada `ITableReceptacle`. Ela define o método para se estabelecer a conexão com objetos que têm a interface `ITableProducer`.\n", + "\n", + "~~~java\n", + "public interface ITableReceptacle {\n", + " public void connect(ITableProducer producer);\n", + "}\n", + "~~~\n", + "\n", + "A interface requerida é representada visualmente por um meio círculo e indica o nome da interface que ela requer:\n", + "\n", + "![Componente](images/console-dataset-d.svg)\n", + "\n", + "Outra maneira bastante usual de representar os dois componentes conectados é ligando diretamente a interface provida com a requerida:\n", + "\n", + "![Componente](images/console-dataset-e.svg)\n", + "\n", + "Para tornar o componente `ConsoleComponent` completamente acessível por interfaces, acrescentamos outra interface para o seu método `update()`.\n", + "\n", + "~~~java\n", + "public interface IConsoleUpdate {\n", + " public void update();\n", + "}\n", + "~~~\n", + "\n", + "O Diagrama completo fica:\n", + "\n", + "![Componente](images/console-dataset-f.svg)\n", + "\n", + "Como foi feito antes, usamos a interface `IConsole` para juntar as duas outras interfaces através da herança:\n", + "\n", + "~~~java\n", + "public interface IConsole extends ITableReceptacle, IConsoleUpdate {\n", + "}\n", + "~~~" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Composição de Componentes\n", + "\n", + "Vamos ilustrar agora como criar uma composição de componentes.\n", + "\n", + "Conectamos um componente que acessa um arquivo CSV contendo zumbis doentes com as seguintes colunas:\n", + "\n", + "* `name` - nome do zumbi\n", + "* `age` - idade do zumbi\n", + "* `diagnostic` - doença diagnosticada no zumbi\n", + "* `days_recovery` - número de dias que o zumbi levou para se recuperar da doença" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Importando uma Biblioteca\n", + "\n", + "Neste laboratório vamos trabalhar na modalidade **caixa preta**. Por essa razão, os componentes serão importados de uma biblioteca e você não verá a sua implementação. \n", + "\n", + "Inicialmente, vamos importar a biblioteca onde estão implementados:" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [ + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "2307d6c6-b614-4480-b28e-5e404d59dc51", + "version_major": 2, + "version_minor": 0 + }, + "method": "display_data" + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "%classpath add jar ../lib/component-catalog-2020-08-04.jar" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Instanciando e Conectando Componentes\n", + "\n", + "No código a seguir um componente de leitura de CSV (`DataSet`) e um componente `Console` são instanciados e conectados. O processo inicia quando o método `update()` é chamado no componente `Console`. O resultado é a apresentação do conteúdo do arquivo.\n", + "\n", + "Note que ambos os componentes passam a ser tratados completamente a partir de suas interfaces." + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "=== Attributes ===\n", + "name, age, diagnostic, days_recovery\n", + "\n", + "=== Instances ===\n", + "Rot Donnadd, 43, bacterial_infection, 9\n", + "Pid Mught, 38, bacterial_infection, 7\n", + "Thulk Lebbimp, 63, bite_deficit, 10\n", + "Bouvossam Damme, 71, bite_deficit, 13\n", + "Pirg Zall, 48, viral_infection, 4\n", + "Nullon Rackindock, 23, fights, 8\n", + "Shor Splitturch, 35, nothing, 0\n", + "Ger Ackeng, 66, bite_deficit, 11\n", + "Gleldo Shruck, 45, bacterial_infection, 8\n", + "Nadross Pilch, 60, viral_infection, 8\n", + "Sadrent Pemmir, 73, bite_deficit, 14\n", + "Read Rait, 55, bacterial_infection, 9\n", + "Dallun Whadder, 15, viral_infection, 2\n", + "Eapplar Thorg, 25, fights, 5\n", + "Blottork Patter, 68, bite_deficit, 12\n", + "Darrutt Bottall, 75, bite_deficit, 16\n", + "Gallir Shauch, 20, fights, 12\n", + "Dirpe Polnay, 39, bacterial_infection, 7\n", + "Harrimp Fottiem, 65, bite_deficit, 9\n" + ] + }, + { + "data": { + "text/plain": [ + "null" + ] + }, + "execution_count": 2, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "import pt.c08componentes.s20catalog.s10ds.*;\n", + "import pt.c08componentes.s20catalog.s20console.*;\n", + "\n", + "IDataSet dataset = new DataSetComponent();\n", + "dataset.setDataSource(\"../db/zombie-health-diseases.csv\");\n", + "\n", + "IConsole console = new ConsoleComponent();\n", + "console.connect(dataset);\n", + "\n", + "console.update();" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Projection Component\n", + "\n", + "Componente que realiza o recorte (projeção) de colunas em uma tabela.\n", + "\n", + "![Projection Component](images/projection-component.png)\n", + "\n", + "~~~java\n", + "public interface IProjectionProperties {\n", + " String[] getAttributes();\n", + " void setAttributes(String attribute[]);\n", + "}\n", + "\n", + "public interface IProjection extends IProjectionProperties, ITableProducer, ITableReceptacle {\n", + "}\n", + "~~~\n", + "\n", + "Recebe uma tabela de entrada (através da interface requerida `ITableProducer`) e gera uma tabela com as colunas recortadas (através da interface provida `ITableProducer`). A propriedade `attributes` contém um vetor com o nome das colunas a serem filtradas." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Tarefa 1\n", + "\n", + "Conecte o componente `DataSet` aos componentes de projeção e console para mostrar na tela as seguintes colunas: `name` e `age`.\n", + "\n", + "Observe que neste campo de resposta já estão preenchidos os `imports` necessários para essa questão, basta você completar no mesmo campo com o código Java. A mesma estratégia é usada nas tarefas subsequentes." + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "=== Attributes ===\n", + "name, age\n", + "\n", + "=== Instances ===\n", + "Rot Donnadd, 43\n", + "Pid Mught, 38\n", + "Thulk Lebbimp, 63\n", + "Bouvossam Damme, 71\n", + "Pirg Zall, 48\n", + "Nullon Rackindock, 23\n", + "Shor Splitturch, 35\n", + "Ger Ackeng, 66\n", + "Gleldo Shruck, 45\n", + "Nadross Pilch, 60\n", + "Sadrent Pemmir, 73\n", + "Read Rait, 55\n", + "Dallun Whadder, 15\n", + "Eapplar Thorg, 25\n", + "Blottork Patter, 68\n", + "Darrutt Bottall, 75\n", + "Gallir Shauch, 20\n", + "Dirpe Polnay, 39\n", + "Harrimp Fottiem, 65\n" + ] + }, + { + "data": { + "text/plain": [ + "null" + ] + }, + "execution_count": 3, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "import pt.c08componentes.s20catalog.s10ds.*;\n", + "import pt.c08componentes.s20catalog.s20console.*;\n", + "import pt.c08componentes.s20catalog.s30projection.*;\n", + "\n", + "IDataSet dataset = new DataSetComponent();\n", + "dataset.setDataSource(\"../db/zombie-health-diseases.csv\");\n", + "\n", + "IProjection projection = new ProjectionComponent();\n", + "String[] attributes = {\"name\", \"age\"};\n", + "projection.setAttributes(attributes);\n", + "projection.connect(dataset);\n", + "\n", + "IConsole console = new ConsoleComponent();\n", + "console.connect(projection);\n", + "console.update();" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Selection Component\n", + "\n", + "Componente que seleciona linhas da tabela que atendem a uma certa condição.\n", + "\n", + "![Selection Component](images/selection-component.png)\n", + "\n", + "~~~java\n", + "public interface ISelectionProperties {\n", + " String getAttribute();\n", + " void setAttribute(String attributeA);\n", + " public String getOperator();\n", + " public void setOperator(String operator);\n", + " public String getValue();\n", + " public void setValue(String value);\n", + " boolean isNominalComparison();\n", + " void setNominalComparison(boolean nominalComparison);\n", + "}\n", + "~~~\n", + "\n", + "Os três propriedades `attribute`, `operator` e `value` definem a expressão de seleção. Por exemplo, a seguinte seleção `name = Rot Donnadd` seria:\n", + "* **attribute:** `name`\n", + "* **operator:** `=`\n", + "* **value:** ` Rot Donnadd`\n", + "\n", + "A propriedade `nominalComparison` indica se a comparação será entre strings (`true`) ou números (`false`). O padrão é `true`.\n", + "\n", + "A interface unificada do componente é:\n", + "~~~java\n", + "public interface ISelection extends ISelectionProperties, ITableProducer, ITableReceptacle {\n", + "}\n", + "~~~" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Tarefa 2\n", + "\n", + "Conecte o componente `DataSet` aos componentes de seleção e console para mostrar na tela aquelas instâncias cujo diagnóstico seja `bacterial_infection`." + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "=== Attributes ===\n", + "name, age, diagnostic, days_recovery\n", + "\n", + "=== Instances ===\n", + "Rot Donnadd, 43, bacterial_infection, 9\n", + "Pid Mught, 38, bacterial_infection, 7\n", + "Gleldo Shruck, 45, bacterial_infection, 8\n", + "Read Rait, 55, bacterial_infection, 9\n", + "Dirpe Polnay, 39, bacterial_infection, 7\n" + ] + }, + { + "data": { + "text/plain": [ + "null" + ] + }, + "execution_count": 7, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "import pt.c08componentes.s20catalog.s10ds.*;\n", + "import pt.c08componentes.s20catalog.s20console.*;\n", + "import pt.c08componentes.s20catalog.s40selection.*;\n", + "\n", + "IDataSet dataset = new DataSetComponent();\n", + "dataset.setDataSource(\"../db/zombie-health-diseases.csv\");\n", + "\n", + "ISelection selection = new SelectionComponent();\n", + "selection.connect(dataset);\n", + "selection.setAttribute(\"diagnostic\");\n", + "selection.setOperator(\"=\");\n", + "selection.setValue(\"bacterial_infection\");\n", + "\n", + "IConsole console = new ConsoleComponent();\n", + "console.connect(selection);\n", + "console.update();" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Tarefa 3\n", + "\n", + "Conecte os componentes que você achar necessários para mostrar no console as colunas `name` e `age` de zumbis com `bacterial_infection`." + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "=== Attributes ===\n", + "name, age\n", + "\n", + "=== Instances ===\n", + "Rot Donnadd, 43\n", + "Pid Mught, 38\n", + "Gleldo Shruck, 45\n", + "Read Rait, 55\n", + "Dirpe Polnay, 39\n" + ] + }, + { + "data": { + "text/plain": [ + "null" + ] + }, + "execution_count": 8, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "import pt.c08componentes.s20catalog.s10ds.*;\n", + "import pt.c08componentes.s20catalog.s20console.*;\n", + "import pt.c08componentes.s20catalog.s40selection.*;\n", + "import pt.c08componentes.s20catalog.s30projection.*;\n", + "\n", + "IDataSet dataset = new DataSetComponent();\n", + "dataset.setDataSource(\"../db/zombie-health-diseases.csv\");\n", + "\n", + "ISelection selection = new SelectionComponent();\n", + "selection.connect(dataset);\n", + "selection.setAttribute(\"diagnostic\");\n", + "selection.setOperator(\"=\");\n", + "selection.setValue(\"bacterial_infection\");\n", + "\n", + "IProjection projection = new ProjectionComponent();\n", + "String[] attributes = {\"name\", \"age\"};\n", + "projection.setAttributes(attributes);\n", + "projection.connect(selection);\n", + "\n", + "IConsole console = new ConsoleComponent();\n", + "console.connect(projection);\n", + "\n", + "console.update();" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Bubble Chart Component\n", + "\n", + "Componente que plota um gráfico de dispersão de uma tabela recebida como entrada. Para isso a tabela deve ter recortadas apenas as duas colunas que serão apresentadas usando um componente de projeção.\n", + "\n", + "![Bubble Chart Component](images/chartbubble-component.png)\n", + "\n", + "As propriedades `Title`, `XTitle` e `YTitle` são os títulos do gráfico, do eixo X e Y respectivamente. Essas propriedades são acessadas a partir da interface `IChartProperties`:\n", + "\n", + "~~~java\n", + "public interface IChartProperties {\n", + " String getTitle();\n", + " void setTitle(String title);\n", + " String getXTitle();\n", + " void setXTitle(String title);\n", + " String getYTitle();\n", + " void setYTitle(String title);\n", + "}\n", + "~~~\n", + "\n", + "A interface `IRun` dispõe de métodos para ativar e desativar a plotagem do gráfico (métodos `start` e `stop` respectivamente):\n", + "\n", + "~~~java\n", + "public interface IRun {\n", + " public boolean start();\n", + " public boolean stop();\n", + "}\n", + "~~~\n", + "\n", + "A interface unificada é:\n", + "\n", + "~~~java\n", + "public interface IChart extends ITableReceptacle, IRun, IChartProperties {\n", + " /* Component Interfaces Set */\n", + "}\n", + "~~~\n", + "\n", + "O comando a seguir importa uma biblioteca gráfica necessária para o componente:" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [ + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "6fe8a087-0b35-4bfd-be80-55a567f8b99b", + "version_major": 2, + "version_minor": 0 + }, + "method": "display_data" + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "%classpath add jar ../lib/xchart-3.5.2.jar" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Código do `ChartBubbleComponent`\n", + "\n", + "Por questões de implementação no Jupyter, o código do componente BarChart precisou ficar dentro do Notebook. Entretanto, a ideia é que você use o componente apenas conhecendo as interfaces, sem precisar analisar o código. Então você pode pular o código a seguir." + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": { + "jupyter": { + "source_hidden": true + } + }, + "outputs": [ + { + "data": { + "text/plain": [ + "com.twosigma.beaker.javash.bkr81be5889.ChartBubbleComponent" + ] + }, + "execution_count": 12, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "import java.util.ArrayList;\n", + "import java.util.Hashtable;\n", + "import java.util.List;\n", + "\n", + "import java.io.IOException;\n", + "\n", + "import org.knowm.xchart.BubbleChart;\n", + "import org.knowm.xchart.BubbleChartBuilder;\n", + "import org.knowm.xchart.SwingWrapper;\n", + "import org.knowm.xchart.BitmapEncoder;\n", + "import org.knowm.xchart.BitmapEncoder.BitmapFormat;\n", + "\n", + "import com.twosigma.beakerx.mimetype.MIMEContainer;\n", + "import java.io.File;\n", + "import java.nio.file.Files;\n", + "\n", + "import pt.c08componentes.s20catalog.s00shared.*;\n", + "import pt.c08componentes.s20catalog.s50chart.IChart;\n", + "\n", + "public class ChartBubbleComponent implements IChart {\n", + " private BubbleChart chart = null;\n", + "\n", + " private String title = \"Chart\";\n", + " private String xTitle = \"X\",\n", + " yTitle = \"Y\";\n", + "\n", + " private ITableProducer producer = null;\n", + " \n", + " public void connect(ITableProducer producer) {\n", + " this.producer = producer;\n", + " }\n", + " \n", + " public ChartBubbleComponent() {\n", + " }\n", + " \n", + " public String getTitle() {\n", + " return title;\n", + " }\n", + " \n", + " public void setTitle(String title) {\n", + " this.title = title;\n", + " }\n", + "\n", + " public String getXTitle() {\n", + " return xTitle;\n", + " }\n", + " \n", + " public void setXTitle(String title) {\n", + " xTitle = title;\n", + " }\n", + "\n", + " public String getYTitle() {\n", + " return title;\n", + " }\n", + " \n", + " public void setYTitle(String title) {\n", + " yTitle = title;\n", + " }\n", + "\n", + " public boolean start() {\n", + " boolean status = true;\n", + " \n", + " chart = new BubbleChartBuilder().width(600).height(400).title(title).xAxisTitle(xTitle).yAxisTitle(yTitle).build();\n", + " try{\n", + " \n", + " buildChart(); \n", + " BitmapEncoder.saveBitmap(chart, \"./chart\", BitmapFormat.PNG);\n", + " \n", + " File file = new File(\"chart.png\");\n", + " byte[] data = Files.readAllBytes(file.toPath());\n", + " \n", + " MIMEContainer image = new MIMEContainer(MIMEContainer.MIME.IMAGE_PNG, data);\n", + " display(image);\n", + " }catch(IOException ex){\n", + " status = false;\n", + " System.out.println (ex.toString()); \n", + " }\n", + " \n", + " return status;\n", + " }\n", + " \n", + " public boolean stop() {\n", + " return true;\n", + " }\n", + " \n", + " public double[] toDouble(String[][] instances, int column ) {\n", + " double[] numbers = new double[instances.length];\n", + " for (int i = 0; i < instances.length; i++)\n", + " numbers[i] = Double.parseDouble(instances[i][column]);\n", + " return numbers;\n", + " }\n", + "\n", + " private void buildChart() {\n", + " if (chart != null && producer != null) {\n", + " String[][] instances = producer.requestInstances();\n", + "\n", + " if (instances != null) {\n", + " double[] xData = toDouble(instances, 0),\n", + " yData = toDouble(instances, 1);\n", + " \n", + " String[] categoryData = null;\n", + " if (instances[0].length > 2) {\n", + " categoryData = new String[instances.length];\n", + " for (int c = 0; c < instances.length; c++)\n", + " categoryData[c] = instances[c][2];\n", + " }\n", + " \n", + " double[] bubbleData = null;\n", + " if (instances[0].length > 3)\n", + " bubbleData = toDouble(producer.requestInstances(), 3);\n", + " else {\n", + " bubbleData = new double[instances.length];\n", + " for (int i = 0; i < xData.length; i++)\n", + " bubbleData[i] = 10;\n", + " }\n", + " \n", + " \n", + " if (categoryData == null ||\n", + " xData.length != yData.length || yData.length != bubbleData.length ||\n", + " bubbleData.length != categoryData.length) {\n", + " chart.addSeries(\" \", xData, yData, bubbleData);\n", + " } else {\n", + " Hashtable hash = new Hashtable();\n", + " int outer = 0;\n", + " int size = categoryData.length;\n", + " while (outer < size) {\n", + " if (hash.containsKey(categoryData[outer]))\n", + " outer++;\n", + " else {\n", + " hash.put(categoryData[outer],categoryData[outer]);\n", + " List xSub = new ArrayList(),\n", + " ySub = new ArrayList(),\n", + " bubbleSub = new ArrayList();\n", + " for (int inner = outer; inner < size; inner++)\n", + " if (categoryData[inner].equalsIgnoreCase(categoryData[outer])) {\n", + " xSub.add(xData[inner]);\n", + " ySub.add(yData[inner]);\n", + " bubbleSub.add(bubbleData[inner]);\n", + " }\n", + " chart.addSeries(categoryData[outer], xSub, ySub, bubbleSub);\n", + " outer++;\n", + " }\n", + " }\n", + " }\n", + " }\n", + " \n", + " }\n", + " \n", + " }\n", + " \n", + "}" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Tarefa 4\n", + "\n", + "Conecte os componentes que você achar necessários para apresentar um gráfico comparativo entre idade e tempo de recuperação dos zumbis, conforme exemplo abaixo.\n", + "\n", + "![Graph](images/example1.png)" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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" + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + "null" + ] + }, + "execution_count": 13, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "import pt.c08componentes.s20catalog.s10ds.*;\n", + "import pt.c08componentes.s20catalog.s30projection.*;\n", + "import pt.c08componentes.s20catalog.s50chart.IChart;\n", + "\n", + "IDataSet dataset = new DataSetComponent();\n", + "dataset.setDataSource(\"../db/zombie-health-diseases.csv\");\n", + "\n", + "IProjection projection = new ProjectionComponent();\n", + "String[] attributes = {\"days_recovery\", \"age\"};\n", + "projection.setAttributes(attributes);\n", + "projection.connect(dataset);\n", + "\n", + "IChart chart = new ChartBubbleComponent();\n", + "chart.setTitle(\"Zombie Health\");\n", + "chart.setXTitle(\"Days Recovery\");\n", + "chart.setYTitle(\"Age\");\n", + "\n", + "chart.connect(projection);\n", + "chart.start();\n", + "chart.stop();" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Tarefa 5\n", + "\n", + "Conecte os componentes que você achar necessários para apresentar um gráfico comparativo entre idade e tempo de recuperação dos zumbis, colorindo os pontos por diagnóstico, conforme exemplo abaixo.\n", + "\n", + "**Recomendação:** Se você recortar uma terceira coluna com o diagnóstico, o gráfico resultante irá colorir os pontos por diagnóstico.\n", + "\n", + "![Graph](images/example2.png)" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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" + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + "null" + ] + }, + "execution_count": 14, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "import pt.c08componentes.s20catalog.s10ds.*;\n", + "import pt.c08componentes.s20catalog.s30projection.*;\n", + "import pt.c08componentes.s20catalog.s50chart.IChart;\n", + "\n", + "IDataSet dataset = new DataSetComponent();\n", + "dataset.setDataSource(\"../db/zombie-health-diseases.csv\");\n", + "\n", + "IProjection projection = new ProjectionComponent();\n", + "String[] attributes = {\"days_recovery\", \"age\", \"diagnostic\"};\n", + "projection.setAttributes(attributes);\n", + "projection.connect(dataset);\n", + "\n", + "IChart chart = new ChartBubbleComponent();\n", + "chart.setTitle(\"Zombie Health\");\n", + "chart.setXTitle(\"Days Recovery\");\n", + "chart.setYTitle(\"Age\");\n", + "chart.connect(projection);\n", + "chart.start();\n", + "\n", + "chart.stop();" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Tarefa 6\n", + "\n", + "Conecte os componentes que você achar necessários para apresentar um gráfico comparativo entre idade e tempo de recuperação, filtrando apenas a doença “bacterial_infection”." + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAlgAAAGQCAIAAAD9V4nPAAAsoUlEQVR42u2dYUwk55nnkTpSRyhI/aG1OFzSNgmxcbBZt+JOSPAaH3bL2Gbds6yNjY3t3mCPzdnIbZM7IuQ5sVZfxkIRMQmxiUYtmT0UcsRGRsuH3sPBElkUZD60hGTlQxRnpUTyRdadd+KR5kbJqe7f/czU1HRDD2aAgarfTy1U/XZ1dT0vL/XjeeuprppNAACAAFNDFwAAACIEAABAhAAAAIgQAAAAEQIAACBCAAAARAgAAIAIAQAAECEAAAAiBAAAQIQAAACIEAAAABECAAAgQgAAAEQIAWB9fT27DfPz83v7WZlMJpFI9Pf37+LV6szMzNg+Kxy30Vr00r7u9pXvPAAgQria5PP5mm0YHBzc289KpVLarISxi1d3smWhcC7+GZTQS3u72+oW2/Je7TwAIEK4mqyurqYupba2Vsf0UCg0PT19kCJcXFzM5XK7S0MRIQAgQtgbMpmMHeWHhobcxsnJyXg8XldXF4lEdKw/deqU+1JXV1dDQ4N+njx5srGxsb6+3vJI/VR7NBr1ppWuLSYmJpqbm2Xczs7OlZUVezWdTtum3PVlYn1upER7e3sVR+5QhFU2eOLECe2S2vUWRaFXZ2dnKyWnnVQ/2JYbSoyMjHjXmZqastDa2tqWl5cZUQCIEI4SOogrEdQBvbu7220cHR21434sFtNx35ZlMntVh3491XFfb3QN0draGg6HLbMU8qjXKLUlZE37rKampkKhUJlUZbNZe3tLS4vWsSR1YWGhugj7+/sHL1Amwuob1GoKsKOjQ7FbmApH6fKnEqH1gzxqK0jzDCoARAhHBinB1CWNbWxsuO123JchtCxjKaOynMkrQqG3613mAMlgcXFxbW1NOtRTyaNMV6afsbExrynLRGif62pM9qqiFnfLlbhbqL5BN3tbX19XymvvVZq7+WmmRoXNJ9tTfSLjCgARwtFAqY/yIR27o9GoO1e5WTpvZ8d3pVPWogTIWixbMhEqvfN6UbK0p5Zaue4xPbgrS5y2qUwmU+Yb93MjkYglXiZp7d7uMsLLbnB2dlYfbeYuKxfauQhd8225DgAgQjikKM9zZzjn5ua8L1WK0J0p9YrQlUTZ0ysXYVtbW1ktT3URbneOsPoGlQWaF5uammR6N1X9tCKsvg4AIEI4pPT09LgFMnkPpjozRDKZNGW2t7dbXrWl+XYiQvfM3Pj4eJWpUftcr/m0P7lcbncirL7B+fl5W1m7tFmqqakiwhMnTtir3loYRAiACOGoMjs7W/3smpsCNjc3K5krSxB3IUIrlmltbbVimVgstmWxjPu5+lC9pEwuHA7vOiOsvsG1tTXTZH19vVrcmqAtRej2mPZfa1pxKSIEQIRwhEXYsA1ukYvypKampnCJlpYWtwp003P5xJZP4/G4dzvuBRLyqPwnkcgcrroqL5+YmJjQx7kn8zo6Ora7tNHeK7xZWlkU1Tc4NTVl/pPvZ2ZmvBWhlTumpFB7buuYCMvW0RvtVQYYACIEAABAhAAAAIgQAAAAEQIAACDCzc2XX37ZXR4fH38ZAGBPefXVVzEBIjwyItSys2O0vhNsAt4DDAAGwA7X9B5kABEiQo6DhE8PIEJAhH4R4R//+MeAHwcD3gMMAAYAIoSgixAAABECIgQAQISACAEAECEgQgAIAqfPOO+97yyuFn9qGRECxTKBhloJBkCg4j17znn9Lee+F4uPe19wks+d04Ja1I4IIaAi3KR6nup5BkCQLPj0K0UF3nbc+eaAE3/c+dKxs1950Ln9mWJ7dRciQkCEHAcJnx448lgu2P6Uc+ez55PC25/6k5avTRWlqFcRITA1yswY4dMDvuX0mfO5oGtBPWxqVC2fv8/pGKx2vhARAsUyAHC0ee/9ovm+OXDRgt7H9Q86Nz5cXAcRAiIEAH+yuFqsjok/vrUIb37UufZYcR1ECIgQAPycEX714W0zwuuOkRECIgQA/2LnCL/y4CXnCO2hlmvudVr6OEcIFMsEEoplGADBCfb1t4pXSlybuujC5HPnrGpUIvzeG9XeiwiByyd8yyaXTzAAAoNdRxh/vFgjev2DpfOC9/9fKVCP+/8z1xECIuQ4SPj0QDBcqLywY7BYI3rtMafhvnMtfcVckG+WAaZGmRkjfHogQLjfNfov//p/+K5RoFgGAAARAiIEAECEgAgBABAhIEIAAEQIFMsECYplGACEjwgh0CLcpHqeyycYAISPCOEwiHBlZSXvYXl5uWwFa19bW0OEHAcJnx5AhOBDESYSiRoPDQ0N3lcnJiasfXBwkKlRZsYInx5gahR8K8JkMpkqkU6n3ZdWV1cjkUgoFNoPEQIAIEI4RCKcnp5eWFjY2NjwvtTR0aEEUY5EhACACCEQU6O1tbUjIyPWns1m1ZLL5ZQmVorwZQ+VUiyb9NBT2mmnnfbdtSNC2HcRptPp4eHhsbGxrq4u0+Hs7Ozy8nJdXV1fX59W2FKEZIQAQEYIPhGhS6FQaGhokPPkxaGhIffEYSwW03Jzc3Mmk6FYZg+hVoIBQPiIEK6+CNfW1k6dOmXLKysr4XBYzlN2qPyvpoJEIrGHItykep7qeQYA4SNCuOoizOfzMlx9fX08HjcLKilcK+FeWWjFMv39/TIlIuQ4SPj0ACIEX4lwY2NjdHS0o6OjpaVFCd/AwECl7ZQgplKpycnJvT1HyMwYM2MMAMJHhHC4zhHuDoplAGBfQYSACAEAEQIiRIQAgAgBESJCAECEgAj9I0JqJaiVYAAQPiKEQItwk+p5qucZAISPCAERciAgfHqA8BEhMDXK1BDh0wOEjwiBYhkAAEQIiBAAABECIgQAQISACAEAECFQLONvqJVgABA+IoRAi3CT6nmq5xkAhI8IARFyICB8eoDwESEwNcrUEOHTA4SPCIFiGQAARAiIEAAAEQIiBABAhIAIAQAQIVAs42+olWAAED4ihECLcJPqearnGQCEjwgBEXIgIHx6gPARITA1ytQQ4dMDhI8IgWIZAABECFdFhP39/QkPXV1dbntzc3M0Gq2vr08mk4uLi4gQABAh+FCEkl9NTY1s11AiHo+f/+CamtbWVnkxEonYChsbG4gQABAh+FOE+Xy+rH1+ft4W5ubmakq4LYgQABAh+E2Elg52dnZW2m5hYUErhMPh9fV1r/NcKqVYdhpcTyvb/1hi5+v7r919NeD9ENj2Dz74gPG/k/URIey7CNva2uLxuDsFWldX580OV1ZWGhsb1T40NLS35wg3qZ6nep4BQPhkhHAYROie+VtbW6utrZXzRkdHrWVxcTEWi6klk8nsedUox0GOgwwAwkeEcPVFuFHClguFQjQalfZGRkb0dGZmRjliKBTKZrNVtsB1hLuGy8gYAISPCOHqizCfz9fV1fX29irns5OF4XDYrpSw7FAudK+soFgGAA4eRAj7K8K1tbX29nbJz+pCGxsbp6amzn9wBblcDhECACIEv50jdItitrxM8LIgQgBAhOAHEe4aRAgAiBAQIcUyu4FaCQYA4SNCCLQIN6mep3qeAUD4iBAQIQcCwqcHCB8RAlOjTA0RPj1A+IgQKJYBAECEgAgBABAhIEIAAEQIiBAAABECxTL+hloJBgDhI0IItAg3qZ6nep4BQPiIEBAhBwLCpwcIHxECU6NMDRE+PUD4iBAolgEAQISACAEAECEgQgAARAiIEAAAEQLFMv6GWgkGAOEjQgi0CDepnqd6ngFA+IgQECEHAsKnBwgfEQJTo0wNET49QPiIECiWAQBAhIAIAQAQISBCAABECAcowmw2O+hhZGTEfWl2djadTvf29o6NjRUKBUQIAIgQfCjCRCJR46GhocHaT5w4EQqF1FJbW6uf7e3tFMvsLdRKMAAIHxHCIRLhzMxMvsTy8rIaNzY2IpGI2nO53Pr6eiwW0/Lk5OQeinCT6nmq5xkAhI8I4fCIsLu7u7e3d3R0VApUo/ynRrnQ1unv79fTnp6ey4rQFsr+19PTynZ7uvP1/dfuHggC3g+BbXf/cBj/1ddHhHBAIqyrq7Op0aamJrkwm816p0kHBwf1tK2tzes8F6ZGmRkjfHqAqVE4wiKcmZlZX1/XwqlTp8yF4yUqRdjR0UGxDAAcMIgQDvTyCTsXmMlkZmdnrUzGikVTqZSe9vX1IUIAQITgKxHm8/nOzs6pqamFhYWhoSHLCJUaulIcHh5WymiFM/Pz84gQABAh+EqEy8vL4XDYvXYiFAql02l3yjQajbovSZNbbgERAgAihKM9NbqxsZHL5bLZ7MTEhBJE70vr6+tKFsfHx5eWlrZ7O8Uyu4ZaCQYA4SNCOHTnCHcB1xHumk0uI2MAED4iBETIgYDw6QHCR4QQUBEyM8bMGAOA8BEhBFqEAACIEBAhAAAiBEQIAIAIARECACBCoFgmWFArwQAgfEQIgRbhJtXzVM8zAAgfEQIi5EBA+PQA4SNCYGqUqSHCpwcIHxECxTIAAIgQECEAACIERAgAgAgBEQIAIEKgWMbfUCvBACB8RAiBFuEm1fNUzzMACB8RAiLkQED49ADhI0JgapSpIcKnBwgfEQLFMgAAiBAQIQAAIgRECACACAERAgAgQqBYxt9QK8EAIHxECIdLhLkS+XzebdHy1NTU+Pj43Nzcnotwk+p5qucZAISPCOHwiHB0dLSmxODgoLVoIRQK1VwgHo+vr68jQo6DhE8PIELwoQgXFxdra2vD4bArwkKhYE/Hxsb0aiQS0fLExARTo8yMET49wNQo+E2Ecl5ra2tzc3N3d7c3I6yvr9dTmxSNxWJanpmZoVgGAA4YRAj7LsLh4eFQKDQ/P59KpbwilPYaGhqUF0ajUf3UamX+c6mUYtn/enpKO+200767dkQI+yvCxcVFSc7kVybCoaEhvaRcsK2tTaZsb29fXV0lIwQAMkLwlQilPSuESSQSyvy0rCywv79fztOyRGgFMp2dnXo6MjKCCAEAEYIPRViGpDg/P68FJYKWBSop1NOBgQGKZfYQaiUYAISPCOGwVI0a3qnRQqHQ0tKip5FIpLGx0bJD2XEPRbhJ9TzV8wwAwkeEcKhEODk5KQvmcjl7ura2Njo6Kjsmk8l0Or24uLjluxAhx0HCpwcQIfhEhLuDqVFmxgifHjgkU6Ovvfbay3D0+cEPfhAUEQIA7K0IOQT59TeOCAGAwyIiRISIEAA4LCJCRIgIAYDDIiJEhBTL+AdqJRgAhI8IIdAipHqe6nkGAOEjQth7ERYKhYmJiYGBgcXFxVwut93Ff4iQ4yDh0wOIEHwowo2NDfs6GCELdnR06ClToz6YGiJ8eiDI4SNCRPgpRDg8PGzfoG0izGazWtjytvIUywDA0T0s7q0IT59x3nvfWVwt/tQyHG0RJpPJxsbG4ntKIjx16pQW8vk8IgQARFjGb//gfO8Np3/M+Zunna894dzQ69z4sHNr2kn9F+flXPFVOJIi7Onpqa+v39jYMBEODAxoYW1tDRECACJ0+cv/c37+C6f7ReemR5y/usdp6Hauf9C5+dHiTy2rpf4e55Z+Z+5/FteEIyZCmwu12wrGYjH9bGpq4jpCAECELv/rfzvDk07HM07sfqf1USc55Nz34iUPtahdLoylnCf/W3F9OEoiLBQKdgddIxKJzM7OUixzaKFWggFA+AcsQmV4suC3nnSuO+Z0DJYr0PvQqxKhdPjEP5IXHikRGrlcbmRkZHx83O6py+UThxaq5xkAhH/AIvz5L5y7n3ea/t65J1PNgvbQOnLhF+93fvovuOmoiZAL6jkOEj49gAgr+e0fnPu/49z40GVywbK8UEnhzY9QO3N0RDg2Npa6lHQ6rdSwUCgwNcrMGOHTA0c0/L0S4ffeKJ4abH10pxa0h9b/q3uc7/wQPR0REcp8NVvR1tZGsQwA+OawuDsRPvGyE398i+qY6g+tLxHe+dzl91OJx4H1SfXPqvJq9Tf+/ve//+53v7vrQPaqB65IhJOTk9FoNBaL9fb2JhKJUCjU09PT2NgoF05PTyNCAAisCE+fOZ/efSoL2qOh22npu/y19jrS7jrGT/ve6sqpsrXqbzx27JhE+O677+5uzw+FCE+ePFlXV+deONje3p5MJvW0trZ2aGgIEQJAYEX43vtFpd3y2G5EeP2DxSpTbeGySvjoo4/efPPNfD7vNv7mN7+ZLfG73/3Ou/KvfvWrN954Y2lp6ezZs4VCQe99t4T31Y2NDXd9vfTxxx+//fbbWtmeVtl+FRG6b9TCJ598or3VNv/85z+rRVv+whe+oE3ZR2y5G9X33GvQd955R6v9+te/9n502Sfuiwi7u7vD4fDy8rI9bW5ulgK1oKSwr68PEQJAYEW4uFpUWvzx3Yjw5ked/9Bd3MJlRaiM6vvf/35XV5ebG2n5lVdeUZolx0gh1vjMM8/ccccdr776aiaTkVEkDL13rIS92tbWpuVbbrklm826G9emXnrpJbOsq7ott19FhO5LWnj44Ye1/VtvvVWfqBbtRiQS0S5pYbvdqL7n7sYfeOAB+UhdIQ3JrNt94r6I0L5KJhQKtba2KjXUcktLi4ytZe00xTKHDWolGACEf8AZ4TcHdpkR6rGTjNAspVTps5/9rDcZ+vDDD+UwO/rrmHzdddeVpUSuQvTqNddcoy1oWfnl5z73OVtTKyjH2i7n825/5yL85S9/qQXtZzQatUbtmGWWW+5G9T13l5VBurutDpGhq3zi3otwfX3dvfuEe0H9wsJCKpWan5/n8onDBtXzDADCPzAR2jnCRHqX5whveWxH5wg/+eQTW77ttttsAlByUlakLEp51V133WWJlxKj7fykVyXR6y7wmc98xsykFUxL3vW33P7ORVjZ6Ipwy92ovufuslZTZmwt6hA1fvzxx9t94t6L0Jienj5x4sTExMTa2toBXFOPCDkOEj49cPhF6JSqRr8xsMuq0XtfvPx+6uDuZoGSh7If5UPyk7Vks1npSgsSpDS5nU706k033VRFYN6nW25/T0S45W5U33N3WavJzdaiDpFEq3zifonQvmttcnIymUyGw+ErV131yxCZGmVmjPDpgcM/NeqUriO8+3nnG9/+1NcRfuFvnbFTOxJhJpNRliY/2byiFpqamj766KMPP/xQxjJRKUmymhStqXYTj9Z/9913tWyvKqnSq0qk3Lqb7URYuf09EeGWu1F9z93taP1oNPrOO++oB5SwuknkwYlwfn6+v78/Eom4E6Q7/2K2hhIjIyPe6zHUy6FQSNtpbGxcWVmhWAYADpi9/WaZ245/6m+WuWNwR98sIw/97Gc/u/XWW7XgFl5+5zvfUXrU3d2tl6RJN086duyYjq5a02oyZZoHHnjATCapSB56lzb10ksvuRsv+6wq2y9becs3etdxl/W5Mpwtb7kb1ffc3Y7C7+rq0nslQpsX3e4T91KEUtTw8LA+1XsdfWdn59zc3A5PLkqB9q7BwUFrnJiYsBONx48f18a1NbceFRECwJEToVP6rlHp7evf/hTfNXrTI8V3wdX9je9IhIlEwi2Q6enpGRoa0nI2m93h6Onr66urq2tra/OK0G7kNDMzw+UTAOAPEdrdJ+5+vngn3p3cfeKGXuf5iSN59wnlYWOX8vbbbwdChMoIc7mczXPuXITuyvYNbSZCpZhaDofDSgTr6+u1ZfVj2YBzqZRi2ey/ntJOO+207659P+5HKNV949tFHW53P8KG7mJljdY8ovcj/OSTT964FLt0wc8i7O7udmdE5a2Ojo4ditAmRWU796tKTYRKBG1relXtMqKWJycnKZbZQ6iVYAAQ/gFnhG5e+PNfFM8X3lVy3o0POV99+Pwd6pUFNj3g/HW/0/V8cR3uRHiURCgWFhYGBgZkQdeIctjx48erv2t4eFhr6qesGY/H7czi9PT00tKSbcS+pLSnp0fL0i2XT+whVM8zAAj/qojQ+O0finWkT7x8PhHsfNa567niglrUzn2XjqQI3UsdTp06Zd+1tpOqUeV/lXerSCQS9n00rgh7e3u1vOX3tCFCjoOETw8cRRG6nD5T/NaYxdXiz8teNQ9HQITeOc+xsTEprfpq+Xw+d4H29nbZzv0aGnNkU1NTOp2WFEOh0JaFM0yNMjNG+PTAvoa/3yIE34pwF0h4ZdcRZjIZibC2tralpWXLE4RUjQLAwR8WESEiPFwgQgBAhIAIGYUAgAgBETIKAQARAiLceajUSlArwQAgfEQIgRYh1fNUzzMACB8RAiLkOEj49ADhI0IIqgiZGQtsD9j1y//0z/8e8OuXmRrdcxGOj4+/DEef1157jWIZ8C1nzzk/ftNpP+7c8ljxOx6/9WTxTjevv1VsB7hyEYJfQYTgHws+NuZ8qce55t7itxvbdxxfe8y5/Rnn6VdwISBCQITgd340X/xq/2tTzp3PXrzljZa/3FO8CYDyQgBECIgQfMvpM0788WIu6LWg68KWvuIC33cMiBCCJUKKZQLVA++9X7zN2/UPem5/+tw5d/nmR4o/tQ4DgPARIQRIhFTPB6oHFledL95fPC/oyu/2p/50UYSPOve8UFyHAUD4iBAQIQcC32aENzx4SUboFeHXHg9iRogIESEwNcrUaIB64PQZp23gknOE7tSoWuKPB/EcIVOjiBAoloFg8fpbpeslKqpGb3zo/NWEAIgQECH4mbPnnKe+V7yO/vP3XbyOsKXPuft5riMERAiIEALjQmV+Xc87f/N08ftlpEAlhXyzDCBCQIQQLOy7RhdXnYB/1yggQqBYhmIZaiUYAISPCCHAItzk8gmq5xkAhI8IARFyICB8eoDwESEwNcrUEOHTA4SPCIFiGQAARAhXV4T5EmtraztsR4QAgAjBPyLMZrM1JQYHB3fSjggBABGCf0S4vLxcV1cXCoXKhLddOyIEAEQIvhJhR0dHLBZLJpNlwtuunWKZPYFaCQYA4SNCOBQizGazyvlmZ2dTqZRXeNu1VxehLZQNcT2tbLenO1/ff+2bF8rHA94PgW13/3AY/9XXR4SwvyLM5/N1dXXpdFrLXuFt1+51nsvuMsJNLiPjMjIGAOGTEcJVF6H0Jsl1dXXJdrFYTMvNzc2ZTGa7dqZGmRkjfHqAqVHwoQjLSCQS27VTLAMABwwihIO7jnC7c4Gf6hwhf7QAgAjhqIpwbGxMzpucnNxhOyIEAEQIvhLh7kCEAIAIARFSLLMbqJVgABA+IoRAi3CT6nmq5xkAhI8IARFyICB8eoDwESEwNcrUEOHTA4SPCIFiGQAARAiIEAD8zekzznvvO4urxZ9aRoSACAEgKJw957z+lnPfi849Gef2Z5w7Bp17Xii2qB0RAiIEAP9b8OlXnK7nnZsfda5/8PzPz9/n3PKYc/zkZVyICIFiGd9CrQQDIDjBKvNT/ndTn3Pns8WkUI/kc+e0fG2qaES9igghiCLcpHqe6nkGQDA4faZovq89cdGCetz+1J/0Uy3X3Ou0DVQ7X4gIARFyHCR8euBo8977RfN9/R8uWtAVoR7KCG94sLgOIgSmRpkZI3x6wJ8srjr3vlA8L+gVYfK5c7ag9i/eX1wHEQLFMgDg54zw5kcuEaH7UEb4pR4yQkCEAOBf7BxhS98l5wjtYecI/7qfc4SACAHA17z+lnPXkPPlnktcaFWjX7zf+eH/qPZeRAiIEACOPHYd4W1PO7HUxesIlQted8x55L9yHSFQLBNUKJZhAATNhcoLu553vv5t56ZHnK8+9OdvPen8+E2+WQYCLMJNque5fIIBEDzc7xr96eJv+K5RQIQcBxEhA4DwESEwNcrMGOHTA4SPCIFiGQAARAiIEAAAEQIiBABAhIAIAQAQIRy0COfn5xtKjIyMWEsqlWpsbAyHw3V1dW1tbXNzcxTL7C3USjAACB8RwmER4cbGhpxXU2JwcPD8B9fUJBIJ6bC+vl7L0Wh0fX19D0W4SfU81fMMAMJHhHBIRJhOp2tra6U9rwiVI7oL5sgtk0JEyHGQ8OkBRAhHW4Szs7OhUGh0dFTJn1eE3hXUHg6HlTheVoS2UDbpoaeV7X8ssfP1/dfuvhrwfghs+wcffMD438n6iBD2V4Q2Kapc0E4KVopweXnZZk1lyjL/uVAsAwD7ByKE/RXhyMiIyS+bzcbjcS13dnZOT0/bqwsLC9FoVI1uBQ1VowCACMFXIpQCayqwBDGXy9XW1obD4YmJiSpbQIQAgAjhCIswn8/nLtDe3i4LplIpK5MJhUJ6Wl9fn7iAWz6DCAEAEYKvqkbd2lHvdYQNFczOzu6hCLmMjMvIGACEjwjhcIlwd3D5xK7ZpHqeAUD4iBAQIQcCwqcHCB8RQkBFyMwYM2MMAMJHhBBoEQIAIEJAhAAAiBAQIQAAIgRECACACIFimWBBrQQDgPARIQRahJtUz1M9zwAgfEQIiJADAeHTA4SPCIGpUaaGCJ8eIHxECBTLAAAgQkCEAACIEBAhAAAiBEQIAIAIgWIZf0OtBAOA8BEhBFqEm1TPUz3PACB8RAiIkAMB4dMDhI8IgalRpoYInx4gfEQIFMsAACBCQIQAAIgQECEAACIERAgAgAiBYhl/Q60EA4DwESEEWoSbVM9TPc8AIHxECIdfhKurq4uLi4iQ4yDh0wOIEHwuwomJiZoSg4OD1rK8vByPx62xrq5uamqKqVFmxgifHmBqFPwpQqV9kUikTISJREJPu7u7h4eHQyWWlpYolgGAAwYRwkGIMJlM1tfXd3Z2uiKcn5/Xcjgc3tjY0NOuri49TafTiBAAECH4TYQ2KTo1NZVKpVwRWmNDQ4Oto0Y9lSm9znOplGLZpIee0k477bTvrh0Rwv6K0CZF+/r6tOwVYTabrRRhIpEgIwQAMkLwlQiHhoZszlOqa25uNtvJgtPT01qur6+31QYGBux8IcUyewi1EgwAwkeEcPVFaKleGXLhyspKOBzWcj6f12qtra1aHh0d3UMRblI9T/U8A4DwESFcdRGura3lL5BMJmW7/v5+WdDNApUUmgVjsZgVziBCjoOETw8gQvBb1aiRyWRsXtRtUQrY1tbW3Nzc29u7urq65buYGmVmjPDpAaZGwSci3B0UywDAvoIIARECACIERIgIAQARAiJEhACACAER+keE1EpQK8EAIHxECIEW4SbV81TPMwAIHxFCMEV4+ozz3vvOD//7v+mnljkQED49QPiIEIIiwrPnnB+/6XxjwGnpc77c85dbHnM6n3Vef6vYztQQ4dMDhI8IwecilO0e/0en8e+ca+51rn/QufnR4s/P3+fEH3eefiWgLgQARAgBEqFywS/1ONemnDufde578fxDy2r51pPFvBAAABGCb0V4+ozTNlDMBb0WdF0YSxUXgny+EAAQIfhchO+979z0SHEutMyC9lB7cqi4DgAAIgR/inBx1bmhdF7QlV/yuXPustrvGCyuEyiolQj48Z0BgAghcBlh/PFLMsLbn/qTu3xDr3PPC4HLCDepng82DABECIE7R3jnc05D98VzhK4I1XLTI0E8R8hxEBESPiKEYFWNvv6Wc2v6YtWoTY1qWWni3c8HsWqUmTGmRgkfEUKwRHj2XPF6wfbjznXHzl9HeONDxVxQFuQ6QgBAhOB/EZoLlfkpEZT8/uN/cu59obgc2G+WAQBECIEToWHfNbq46gT8u0YBABFCQEUIAIAIARFSK0GtBAOAAYAIIdgi3KR6nup5BgDhI0JAhBwICJ8eIHxECAEtlvmnf/73gBfLMDPG1CjhI0IInAjt8omOZ5yvPVG8jrBt4Pyl9Fw+AQCIEK6aCNPpdFNTU0OJZDI5Nzdn7UtLS11dXbFYTO2JRGJ8fPwKRSjb/UO2+LWi3hvzfuH+4s0IuaAeABAhXDURNjY2trW1SYGRSKSmpqa2tnZjY0Pt8p+etra29vT01JSYn5+/EhEq85P5Km/Me90x5/ZnuDEvACBCuEoiNO2J2dlZE97KykqhUAiHw1peWFjQS83NzVqemJjYtQhPn3Han9r2xryNf8eNeQEAEcLVO0eoVG9yclJJoWzX2dlpjX19fXra1dWVyWRCoZASxLW1Na/zXCqlWHYaXE9/uvibr/z92S/3/MV7P0I9bn/qT3qo/e7nL96GSetvtx0/tbuvBiRe2svaP/jggyD3w87HPyKEgxBhIpGwXDAajbrnCJeXl5uamqxdIpyamrqSc4SVN+b13o9Q7R3BuzHvJtXzwYYBQEYIhysjnJ6e7u/vN+etrq4WCgU7ZZjNZqXGxsZGLedyuV2LUNneLY9te2Netd+T4ca8hE8PED4ihKskQvdkYW1trZ0LlPy0UFdXZy9ZvUw6nb6Sc4TK+bznCO1+hHaOsPmhIJ4j5DKygIuQAYAI4VCIUEleIpEYGhoaGRlpb2+3jHBpaUlJoRXLKE0cGxtzs8MrrBq9+dEtqka/3OPcNUTVKAAgQrgaIpyfn6+vr6+5QGNj4+TkpL2kvNB9SVLs6+srFApXIsKz55zjJ4uX0jd0X7yO8CsPOHc+x3WEAIAI4apOjSr/y+fz6+vr271U5b27+GaZezLFL5f51pPOXc9xY14AQIRwaM4R7g5uzAsAiBAQ4acToUGtBLUSDADCR4QQaBFuUj1P9TwDgPARISBCDgSETw8QPiIEpkaZGiJ8eoDwESEET4QAAIgQ/CbCn/zkJy8DAOwpP/rRjzABIgQAAECEAAAAiBAAAAARAgAAIMJDCWf1AWA/wASI0J8EfHDzt80AYABwfAdEyHGQ4yDh0wMAiJCjAD1A+PQAQDBFCAAAgAgBAAAQIQAAQKBEmK9gbW3Nl788xZWrYGVlpXLN+fl57zqzs7P+HtaKN1tibm7O93/DitGCVdTbraPfuHcALC4u+rtPFK86ZGZmZmNjg6M8BFGENRUMDg768penI1plsPr7r1wzkUh412loaPDxmO7q6vIG29HRUSgUfBmp4mpvb/cGq9i3XFO/ce9qqVTKr799mc872pubm/WvMAd6CJwIBz2Ew+Ht3OADlPxlLzAyMmJ/+QsLC9uJcHh42FaemJjw64BW+NYPygm0HAqFtFwlVTrqia+iU4yKVPFWGQASYSQScUeLUiW/DoBMJqNOiMfj8l9vb6+WOzs7OdBD4ERYljBFo9EgTI8MDQ1Z9rPlqybC0dHR8fFxv1rBWF9f138/coP+S1hdXbVlLfgyWMWl6BSjFhSvLasHthSh/hBOnjyp/4H8nSHpT8CdBDp16pT9c8AEKQRXhPYnIUP4/reov3Md5hSs3F9FhC49PT0+7o3p6Wn1RriE0qDJyUkfB6voFKMFq6gV+5areadG5Uv9S+TXDrEsUANefxQDAwMWsu/PiQIi3BqbNdLRwa+VMl7GxsbsdEiVFaamptQn+k/ZDg166suuKBQKdo5Qh8K2tjY7bebXc4Q61ieTScWoSO1/ne7u7i2DHRkZ0T9Jc3NzqVTKXLi8vOzLPlG+W1dXV3biHBFCQEVof/D9/f1B+C3GYjEFOz4+vvOV/Zoo22yYYrSnTU1NeqpGv+a+3n+A7Ddb/fyf/i80N2w3eeADVldXlfLqfz7rH+HX/4QAEVbDzpeIpaUl3/8KJycnrRDU+9eu/wCUIthEmXpDCYFlxjpKWv3IyZMnfdkbExMTiq6+vr5QQgs+DlZxub96EYlE9NQqoRIl7Foa5UNaU+mj1jlx4oS/kySFacmugtVfgb9LZAERViOdTusPIJlMBuFXGI/HFaxU5220iTIrl83n83bsswOlaG1t9ev/yMoG7HxYpIRJ0cfFMmZ6N1jFbv/x2C/a6mLcy2zcOUMfu8FGu/rBgm1qavLrJDAgwsug/wT1p75lHbnP0FHPLhQpqxWUAtVoBaJyng6Feqo+6evrU3Lg75ki9Yn+Legp4abCfkUu3DJYGxX2VEnS1NTUwMCABoD+R/R39ZD+EDKZjA11pb/Ui0JwRQgAAIAIAQAAECEAAAAiBAAAQIQAAACIEAAAABECAAAgQgAAAEQIAACIkC6APWFpaclu+jo+Pp7L5fb7qyzdjxN2Yw1+BQCACOFqIiGV3fsmHo/v37fcVX6c3YKOXwQAIEK4miKMRCJayGQyjY2N9i3P7lceK0fMlXDtKG/l83nvdyLnS9hXoa6srNj6yvYqvxzVPi4ajZ46dWpoaMhc6P0WTW3HPqvsve5mvd9Baivrg0yl1Xdsy41ra2pcXV3Ve2dnZ239KlsAAEQI/hRhQ0ODKzlzYV9fX2UC19LSInNIG3Zrdbs7hN1Lub6+frN0J2G7XdR2d0so+zi71YDdbXh9fb2zs9P7WXYTBrXbPXsNe2/ZyrFYbG5uTvvm3TEp3KQrjW23cbvjcXt7u0U9PDy8XWgAgAghECLcvHAzrNbWVi3LLkrX5AwpwW4cL3Oovaenx72H1PHjx912vUvL09PTeot+Vt5z2D5O/tP6prfm5mbL5+wudB0dHcrYbB/kJ7ddqtOeKI9U2uo2ymfK8ORs9/Z+dmPnEydOuDs2MDBQZeMmQqGdkcUV73ahAQAihKCIUOZwRajESDKQAhOJhOVMluRZqtTU1LR54QbrlmAlk0mTVnd39+joaOWtlMpSzNraWvfO7LZ9fZY+wrI3JZdym7WX3bjRGk14KysrtjVJTluz05xqtxsc2o5tt3EToTfn2y40AECEEAgRyg1ygFp6e3v11JwhKUoYSqG8s512Y2G7c7oEY40SpzyqRC0cDpsRt/w4iWdpacmM656PjEajliAmPEhy1l52t3prtIxzfX3dRKh8znWefZC7Y9tt3ESodNC78S1DAwBECH4WoVWv6NAvh1miZmmQ3UhdL21sbJgeXBFOTk7qqQnPnQKVimye007X6aWyu8x7vSvpykx62tPT42aTErBbdDMxMeG2y1t2E+NcLuc26qeW5UjbZ1theHjYvau7u2PbbdxEWHYuc8vQAAARgp9F6EVycqcr7TSelCCvmCNdZ8goNveol9zrH6Qrrax285CeVk9AXeXITFKv5W1SmgnY3q52e2pr2nvdla02Rz/HxsbcrNQcFolE3B3bbuNbinDL0AAAEYI/8V7hrtRKKZ33UgFpQGni8ePHp6enbU3Xka5FrL7UmJ+fHxkZ0foDAwMyU6VFbCOWjRn6ULXYhfxK6bSs92rLWpAd3d1w27Un1qikUx+hRqWAZRc+Tk1NaX3LHV223Lh2uCyo7UIDAEQIcBFZZHR01GpJ5DZCAwBECMFCyZY80djY6E5IEhoAIEIAAABECAAAgAgBAAAQIQAAACIEAABAhAAAAIgQAAAAEQIAACBCAAAARAgAAHBF/H9Y9tu2RkD9FgAAAABJRU5ErkJggg==" + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + "null" + ] + }, + "execution_count": 15, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "import pt.c08componentes.s20catalog.s10ds.*;\n", + "import pt.c08componentes.s20catalog.s30projection.*;\n", + "import pt.c08componentes.s20catalog.s40selection.*;\n", + "import pt.c08componentes.s20catalog.s50chart.IChart;\n", + "\n", + "IDataSet dataset = new DataSetComponent();\n", + "dataset.setDataSource(\"../db/zombie-health-diseases.csv\");\n", + "\n", + "IProjection projection = new ProjectionComponent();\n", + "String[] attributes = {\"days_recovery\", \"age\", \"diagnostic\"};\n", + "projection.setAttributes(attributes);\n", + "projection.connect(dataset);\n", + "\n", + "ISelection selection = new SelectionComponent();\n", + "selection.connect(projection);\n", + "selection.setAttribute(\"diagnostic\");\n", + "selection.setOperator(\"=\");\n", + "selection.setValue(\"bacterial_infection\");\n", + "\n", + "IChart chart = new ChartBubbleComponent();\n", + "chart.setTitle(\"Zombie Health\");\n", + "chart.setXTitle(\"Days Recovery\");\n", + "chart.setYTitle(\"Age\");\n", + "\n", + "chart.connect(selection);\n", + "chart.start();" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Java", + "language": "java", + "name": "java" + }, + "language_info": { + "codemirror_mode": "text/x-java", + "file_extension": ".java", + "mimetype": "", + "name": "Java", + "nbconverter_exporter": "", + "version": "1.8.0_121" + }, + "toc": { + "base_numbering": 1, + "nav_menu": {}, + "number_sections": false, + "sideBar": false, + "skip_h1_title": false, + "title_cell": "Table of Contents", + "title_sidebar": "Contents", + "toc_cell": false, + "toc_position": {}, + "toc_section_display": false, + "toc_window_display": false + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/labs/2021/03-mvc/solucoes/isadora-oliveira/README.md b/labs/2021/03-mvc/solucoes/isadora-oliveira/README.md new file mode 100644 index 000000000..11c0a2a77 --- /dev/null +++ b/labs/2021/03-mvc/solucoes/isadora-oliveira/README.md @@ -0,0 +1,19 @@ +# Aluno +* Isadora Mendonça de Oliveira ex150703 + +### Imagens Interface e Telas +![](./images/Interface.png) +![](./images/Interface_semProduto.png) +![](./images/Interface_umProduto.png) +![](./images/Interface_doisProdutos.jpg) + +### Imagens Diagramas +![](./images/DiagramaItem1.png) +![](./images/DiagramaItem2.png) +![](./images/DiagramaComprar.png) +![](./images/BlocksMvc.png) + +### Arquivo 'aia' +> Link para o arquivo *.aia do projeto MIT App Inventor: +>[MIT APP Inventor](./app/Trabalho_3.aia) + diff --git a/labs/2021/03-mvc/solucoes/isadora-oliveira/app/Trabalho_3.aia b/labs/2021/03-mvc/solucoes/isadora-oliveira/app/Trabalho_3.aia new file mode 100644 index 000000000..2a5eebaa9 Binary files /dev/null and b/labs/2021/03-mvc/solucoes/isadora-oliveira/app/Trabalho_3.aia differ diff --git a/labs/2021/03-mvc/solucoes/isadora-oliveira/images/BlocksMvc.png b/labs/2021/03-mvc/solucoes/isadora-oliveira/images/BlocksMvc.png new file mode 100644 index 000000000..c93a31858 Binary files /dev/null and b/labs/2021/03-mvc/solucoes/isadora-oliveira/images/BlocksMvc.png differ diff --git a/labs/2021/03-mvc/solucoes/isadora-oliveira/images/DiagramaComprar.png b/labs/2021/03-mvc/solucoes/isadora-oliveira/images/DiagramaComprar.png new file mode 100644 index 000000000..f8290a1ab Binary files /dev/null and b/labs/2021/03-mvc/solucoes/isadora-oliveira/images/DiagramaComprar.png differ diff --git a/labs/2021/03-mvc/solucoes/isadora-oliveira/images/DiagramaItem1.png b/labs/2021/03-mvc/solucoes/isadora-oliveira/images/DiagramaItem1.png new file mode 100644 index 000000000..5c3435388 Binary files /dev/null and b/labs/2021/03-mvc/solucoes/isadora-oliveira/images/DiagramaItem1.png differ diff --git a/labs/2021/03-mvc/solucoes/isadora-oliveira/images/DiagramaItem2.png b/labs/2021/03-mvc/solucoes/isadora-oliveira/images/DiagramaItem2.png new file mode 100644 index 000000000..5baf2c2d6 Binary files /dev/null and b/labs/2021/03-mvc/solucoes/isadora-oliveira/images/DiagramaItem2.png differ diff --git a/labs/2021/03-mvc/solucoes/isadora-oliveira/images/Interface.png b/labs/2021/03-mvc/solucoes/isadora-oliveira/images/Interface.png new file mode 100644 index 000000000..13af722de Binary files /dev/null and b/labs/2021/03-mvc/solucoes/isadora-oliveira/images/Interface.png differ diff --git a/labs/2021/03-mvc/solucoes/isadora-oliveira/images/Interface_doisProdutos.jpg b/labs/2021/03-mvc/solucoes/isadora-oliveira/images/Interface_doisProdutos.jpg new file mode 100644 index 000000000..10024f175 Binary files /dev/null and b/labs/2021/03-mvc/solucoes/isadora-oliveira/images/Interface_doisProdutos.jpg differ diff --git a/labs/2021/03-mvc/solucoes/isadora-oliveira/images/Interface_semProduto.png b/labs/2021/03-mvc/solucoes/isadora-oliveira/images/Interface_semProduto.png new file mode 100644 index 000000000..170e42e32 Binary files /dev/null and b/labs/2021/03-mvc/solucoes/isadora-oliveira/images/Interface_semProduto.png differ diff --git a/labs/2021/03-mvc/solucoes/isadora-oliveira/images/Interface_umProduto.png b/labs/2021/03-mvc/solucoes/isadora-oliveira/images/Interface_umProduto.png new file mode 100644 index 000000000..42a44dd01 Binary files /dev/null and b/labs/2021/03-mvc/solucoes/isadora-oliveira/images/Interface_umProduto.png differ diff --git a/labs/2021/03-mvc/solucoes/isadora-oliveira/images/images b/labs/2021/03-mvc/solucoes/isadora-oliveira/images/images new file mode 100644 index 000000000..8b1378917 --- /dev/null +++ b/labs/2021/03-mvc/solucoes/isadora-oliveira/images/images @@ -0,0 +1 @@ +