Em grandes projetos de software, onde múltiplas equipes trabalham em diferentes partes da ”codebase”, é comum haver interdependências entre arquivos de código. Manter o aspecto da consistência nessas interdependências é crucial para garantir a integridade do sistema no longo prazo. A falta de uma maneira eficaz para verificar essas mudanças pode levar a erros críticos (muitas vezes difíceis de detectar) e falhas no sistema.
Dado a importância do problema, a proposta do IFFT é de ser um ”linter” que ajude os desenvolvedores no processo de identificar quando uma alteração em um bloco de código exige uma modificação correspondente em outro arquivo. Os principais objetivos do trabalho são:
- (1) Desenvolver uma ferramenta que verifica as mudanças realizadas dentro de um “commit” e que alerte o desenvolvedor que determinada seção de código que ele editou tem relação com um outro código que esteja em outro local de modo que as mudanças dele possivelmente precisam ser refletidas lá também.
- (2) Integrar essa ferramenta com o ”git hooks”para permitir um conforto ainda maior para os desenvolvedores, de modo que eles sequer precisem executar o “linter”, ou seja, funcionará automaticamente de forma integrada com o Git toda vez que houver uma tentativa de commit.
- (3) Permitir que a ferramenta seja configurável para se adequar às especificidades de cada projeto.
De acordo com a B3, 2 milhões de novos investidores entraram na bolsa entre 2019 e 2020, um crescimento de mais de 200% na base de investidores cadastrados. Desses novos investidores, 73% obtêm informações sobre investimentos na internet e 60% o fazem por meio de influenciadores digitais, e 30% de todos os investidores com patrimônio abaixo de R$ 10.000 investem em mais de cinco ativos na bolsa.
Em meio a tanta informação disponível aos investidores, se torna crucial a objetividade e o acesso a ferramentas modernas e testadas para gerência de seus portfólios. Apesar disso, esses pequenos investidores raramente têm acesso a ferramentas utilizadas por grandes empresas ou casas de investimento, o que limita muito sua capacidade de tomar decisões de forma independente. Nessa área, as provisões de gerenciamento de risco costumam ser subrepresentadas online, o que faz com que investidores acabem portando mais risco do que o esperado em seus portfólios.
Markowitz (1952) introduz um método pelo qual é possível maximizar os retornos esperados de um portfólio financeiro dado uma restrição de risco. É possível abordar esse problema, como demonstrado por Krokhmal, Palmquist e Uryasev (2003) como um problema de otimização convexa, o que facilita a sua computação e traz consigo um conjunto de técnicas já existentes para sua solução, como descrito por Boyd, Vandenberghe e Faybusovich (2006).
Apesar de muito funcionais, todas essas técnicas são também de difícil acesso ao investidor individual. A proposta deste trabalho é utilizar algoritmos de programação linear para disponibilizar ferramentas que consigam otimizar, dados os parâmetros apropriados, um portfólio financeiro com pesos e unidades para o usuário final.
No contexto de engenharia de software existem algumas ferramentas como: Checker, ESLint e Prettier, que auxiliam os desenvolvedores a aumentar a qualidade dos produtos implementados. No contexto Javascript, o ESLint tem-se destacado como sendo uma das aplicações mais usadas, possuindo mais de 100 milhões de downloads mensais de acordo com a sua página. O ESLint é uma ferramenta de análise de código estática para identificar erros de programação ou na estilização do código. As regras avaliadas pelo linter podem ser definidas pelo próprio engenheiro de software. Contudo, existem vários plugins que predefinem os princípios que serão avaliados por essa ferramenta, por exemplo: Babel, React, Hooks, entre outros. Atualmente, grande parte desses linters possuem um foco maior na parte da estilização e formatação do código, mas ainda não possuem suporte para a análise de code smells, também conhecidos como bad smells. Dado este contexto, este Trabalho Final do Curso, POC I e II, propôs e desenvolveu uma ferramenta, Linter Bad Smells. Esta ferramenta é um linter para a linguagem Javascript cujos objetivos são: auxiliar desenvolvedores de software na análise do código fonte; facilitar a identificação de possíveis bad smells em aplicações desenvolvidas nessa linguagem; difundir os conceitos de code smells para a comunidade Javascript; e auxiliar os engenheiros de software a refatorar code smells identificados pelo Linter Bad Smells no código fonte analisado via a adição de um módulo de refatoração associado à documentação da ferramenta. Tais objetivos visam aumentar a qualidade do código implementado. As principais contribuições deste trabalho são: (1) documentação das métricas e code smells utilizados na ferramenta; (2) disponibilização do Linter Bad Smells como um plugin para a comunidade científica; (3) disponibilização da documentação sobre a refatoração da ferramenta Linter Bad Smells na página do plugin para a comunidade científica; (4) geração de um relatório final sobre o tema da monografia; (5) atualização do Linter Bad Smells para suportar links dentro das mensagens de erro para levar o usuário para a documentação de refatoração; (6) geração de vídeos explicando o que é a ferramenta e como utilzá-la; e, (7) descrição sobre a arquitetura e utilização do Linter Bad Smells.
O desenvolvimento da nova aplicação web SQ-Learn, site que visa substituir o antigo Praticando SQL, plataforma utilizada na disciplina de Introdução a Banco de Dados na Universidade Federal de Minas Gerais, possibilita a implementação de novas funcionalidades que podem tornar o estudo dos conceitos de bancos de dados mais fácil. A ferramenta desenvolvida neste trabalho é um Construtor Visual de Consultas SQL, que se baseia fortemente na interação com o usuário a partir de cliques, sem que haja necessidade de conhecimento prévio de SQL. O construtor de consultas, chamado de SQ-Look, será disponibilizado na plataforma SQ-Learn, após uma fase de testes, e poderá contar com atualizações para inclusão de novas funcionalidades
O grande impacto do advento da IA generativa trouxe para o mundo de engenharia de software um novo paradigma: o uso da IA como ferramenta de produção de código. Mais especificamente, as inteligências artificiais generativas de texto como o chatGPT conseguem produzir trechos de código de qualidades partir de prompts descritivos simples, o que levantou dúvidas entre múltiplas comunidades acerca de qual nível essas novas ferramentas poderiam substituir o próprio programador humano em si, mesmo com suas limitações. Nesse viés, este projeto orientado a computação, com uma atuação empírica e experimentar, visou avaliar quantitativa e qualitativamente a performance de uma promissora ferramenta de IA especializada na geração de código, a extensão de IDEs GitHub Copilot, por meio da sua aplicação extensiva na resolução de problemas de diferentes categorias e dificuldades de programação do repositório online beecrowd. O ponto chave é avaliar, de forma exploratória, a sua performance e as estratégias lógico-estruturais empregadas pela ferramenta de IA generativa para desvelar contextos de uso úteis e prejudiciais para o programador humano. Das linguagens usadas para os testes (JS e Python), os resultados mostraram uma performance acima do esperado para problemas de dificuldade mais fácil e categorias mais simples, mas com uma queda acentuada com o aumento da complexidade geral dos problemas, produzindo mais erros e soluções incompletas.
Tanto o Copilot quanto o Copilot Chat, um chatbot dedicado ao uso em codificação, conseguem produzir resultados úteis e bem estruturados em contextos triviais, mas para um contexto mais complexo e multifatorial, introduzem um alto débito técnico e bugs sutis. O trabalho futuro deste projeto consiste em explorar essa IA mais a fundo em outros contextos, mais especificamente em um contexto educacional acerca de engenharia de software e corporativo, como uma revisão da literatura acerca do uso atual da ferramenta em ambiente profissional de codificação.
A Engenharia de Software surgiu com o propósito de fornecer técnicas e métodos que auxiliem desenvolvedores na criação de software bem estruturado e com qualidade. Dentre os diversos conceitos disponibilizados, dois deles estão diretamente ligados à qualidade: padrões de projeto e bad smell. Padrão de projeto consiste em um conjunto de soluções gerais para problemas recorrentes em contextos específicos. Eles foram propostas como uma tentativa de alcançar maior organização no desenvolvimento de software. Bad smell refere-se à sintomas presentes no código fonte de um sistema que indicam possíveis problemas de projeto e necessitam de refatoração. Eles não são considerados erro, no entanto, contribuem negativamente para a qualidade e organização do código. Padrões de projeto e Bad smells são conceitos antagônicos, no entanto, alguns pesquisadores têm investigado a coocorrência dessas estruturas durante a construção de um software. Um protótipo de ferramenta, Design Pattern Smell, foi desenvolvido no Laboratório de Linguagens de Programação e disponibilizado de forma pública para uso externo. Embora tenha sido uma boa proposta, a ferramenta possui algumas limitações. (1) a mesma não se encontra disponível de forma online. Ela foi desenvolvida em Java e necessita ser baixada e instalada de forma local pelo usuário para que possa ser utilizado; (2) Design Pattern Smell não conta com gráficos e visualizações interativas que facilitem a análise do usuário; e, (3) ela necessita do uso de ferramentas externas para a geração das entradas de dados necessárias, sendo elas o conjunto de padrões de projeto existentes no código, bem como os bad smells presentes. Dado este contexto, este trabalho de conclusão de curso, POC I, propõe o aprimoramento de Design Pattern Smells visando tornar a ferramenta mais acessível e completa. Em sua versão original, ela é disponibilizada como uma aplicação desktop e espera como entrada uma especificação dos padrões de projeto e bad smells presentes no código. Pretendemos neste trabalho disponibilizar Design Pattern Smells como uma aplicação web de livre acesso, com melhores visualizações dos resultados, encapsulando as lógicas necessárias para a identificação dos padrões de projeto presentes, bem como os trechos que se enquadrem como bad smell.
Redes sociais representam interações entre indivíduos em diferentes contextos. Neste artigo, modelamos os desenvolvedores do GitHub em uma rede heterogênea, considerando fatores sociais e técnicos. Como os relacionamentos não são igualmente importantes em uma rede, propomos novas métricas para a força dos relacionamentos. Também aplicamos essas métricas em uma aplicação real de ranking e em uma análise temporal dos pares. Os resultados mostram que as novas métricas não estão correlacionadas, trazendo novas informações sobre os relacionamentos. Além disso, os resultados da aplicação de tais métricas no ranking revelam que tal estudo é um primeiro passo em direção a análises mais complexas, como determinar a influência e popularidade dos usuários, bem como para estudar a formação de equipes e a detecção da comunidade. Finalmente, na análise temporal, o filtro das redes utilizando fatores sociais reduz consideravelmente seu tamanho sem perder suas principais características, o que revela uma contribuição promissora para a área de amostragem de grafos.
Na tradição musical do ocidente, acordes e harmonia são elementos cruciais na definição do tom emocional e estrutura de qualquer canção, e, assim, compreender o escopo harmônico completo usado por um artista é essencial no estudo de sua obra. Na literatura, no entanto, trabalhos frequentemente focam apenas na identificação dos acordes tocados a cada momento, perdendo, portanto, informações valiosas sobre a função que cada acorde cumpre em um dado contexto. Neste trabalho, nós tentamos classificar acordes em uma música pela sua Função Harmônica, que melhor representa como eles interagem entre si para a criação da harmonia da peça.
A Integração Humano-Computador (HInt) é um paradigma emergente na área da Interação Humano-Computador (IHC), e surgiu em decorrência da transição da era da interação para a era da integração. Enquanto os estudos de IHC se baseiam em um modelo de estímulo-resposta, a integração propõe uma parceria entre humanos e tecnologias, onde estes possuem autonomia para cooperar entre si, sem que seja necessário fornecer estímulos explícitos [1][2]. Haja vista o paradigma emergente trazer novos desafios, este trabalho foi motivado pelo desafio em aberto do design de tecnologias parceiras [1][2], propondo o uso da prática de design fiction como uma das possíveis soluções. Assim, o objetivo deste trabalho foi desenvolver um estudo sobre a prática de design fiction no âmbito de IHC por meio de uma revisão simplificada da literatura, inspirada no método de Revisão Sistemática da Literatura [7][8], para então propor um design fiction relacionado a uma tecnologia parceira. Os resultados encontrados indicam que design fiction tem sido um tópico de crescente interesse dentro da área de IHC nos últimos anos, apesar de ainda ser necessário aprofundar nos estudos para melhor entender sua aplicação e contexto num geral. Esse trabalho contribui (1) no maior entendimento da comunidade de IHC sobre o uso de design fiction no âmbito de IHC, além de (2) estimular mais iniciativas e contribuições acerca do uso de design fiction como possível solução para o desafio de tecnologias parceiras.
Jogos de estratégia em tempo real são bastante desafiadores para o aprendizado por reforço devido aos seus grandes espaços de estados e ações. No entanto, existem varias estratégias que foram desenvolvidas com o objetivo de selecionar a melhor ação dado um estado. Neste trabalho, vamos avaliar o desempenho de um agente que realiza seu aprendizado sobre estas estratégias colocando ele para jogar contra adversários bem consolidados de microRTS.
Com o limite físico da tecnologia CMOS se aproximando, faz-se necessário a pesquisa por novas tecnologias dentro da nanocomputação para continuar avançando em termos de velocidade e consumo energético. Neste trabalho é feito um estudo bibliográfico sobre uma dessas tecnologias: a Atomic Silicon Dangling Bonds e, em seguida, é proposto uma abordagem para a confecção de circuitos com essa tecnologia utilizando um algoritmo evolutivo. Por fim, são apresentados diversos circuitos obtidos a partir do algoritmo implementado.
A relação de esportes com apostas é bastante antiga: existem evidências de apostas esportivas sendo feitas desde à Grécia antiga, contudo com a expansão da internet e a adoção de computadores pessoais pela maioria da população, jogos eletrônicos competitivos foram criados, gerando um novo segmento de esportes conhecido como esportes eletrônicos, que por sua vez desenvolveu um mercado de apostas análogo aos esportes tradicionais. Esse trabalho investiga a diferença de precificação de várias casas de apostas em torno de campeonatos de jogos eletrônicos, mais especificamente de Counter Strike, e, a partir dessa análise, averiguar se existe alguma estratégia que pode ser adotada para garantir um retorno positivo, ou então um estratégia que obtenha um retorno positivo com alta probabilidade.
O aprendizado supervisionado com redes neurais tem alcançado grande sucesso na visão computacional, frequentemente dependendo de grandes conjuntos de dados anotados, que são caros e demorados para serem gerados. Essa limitação tem incentivado o interesse por abordagens de aprendizado não supervisionado, especialmente o aprendizado auto-supervisionado, que demonstrou um forte desempenho com o uso mínimo de dados rotulados. Embora métodos contrastivos, como o SimCLR, tenham estabelecido o estado da arte no aprendizado auto-supervisionado, os dados de vídeo — ricos em informações espaciais e temporais — permanecem pouco explorados. Os Contrastively-trained Structured World Models (C-SWMs) oferecem uma abordagem interessante ao utilizar representações baseadas em objetos para modelar estados do mundo, mas sua avaliação é limitada e não incorpora os avanços recentes no aprendizado contrastivo. Neste trabalho, os autores propõem um protocolo de avaliação aprimorado para o C-SWM, introduzindo modificações que integram técnicas bem-sucedidas do aprendizado auto-supervisionado, como aumento de dados e funções de perda contrastiva atualizadas. O objetivo é oferecer insights sobre o potencial do aprendizado contrastivo em nível de objetos na compreensão de vídeos.
Este trabalho explora o papel que as aplicações de Tecnologia da Informação (TI) poderiam ter no avanço da sustentabilidade no setor de varejo, abordando a questão de pesquisa: “Como as aplicações de TI são utilizadas no varejo e em que medida elas fomentam o alcance dos objetivos de sustentabilidade?”. Através de uma revisão detalhada da literatura, este estudo delineia as aplicações atuais e futuras de TI no varejo, dando ênfase às soluções orientadas para o cliente e para os negócios. Revela-se como tecnologias emergentes, como Inteligência Artificial (IA), Internet das Coisas (IoT) e Blockchain, têm o potencial de revolucionar o varejo, direcionando-o para um futuro sustentável. No entanto, é fundamental reconhecer que, junto com essas oportunidades, vêm desafios e incertezas que podem afetar a trajetória futura da TI no varejo. Os resultados destacam o papel dual das aplicações de TI em melhorar a eficiência operacional e promover a sustentabilidade. Este estudo convoca uma abordagem matizada para a adoção de TI no varejo, equilibrando ganhos econômicos com imperativos de sustentabilidade e considerando os possíveis obstáculos e limitações.
A tarefa de busca de especialistas é problema de ranking: dado um tópico de especialidade, deseja-se construir uma lista ordenada por relevância de pesquisadores de maneira que, aqueles no topo da lista sejam os especialistas. O desafio, no contexto desse trabalho, é que os dados presentes são de uma entidade diferente: as publicações e incluem seus atributos como título, data de publicação e palavras-chaves e etc, assim a única informação disponível dos pesquisadores é a sua relação de autoria com esses documentos. Para resolver esse problema, esse trabalho utiliza modelos recentes de aprendizado profundo, em específico os transformers, que têm se mostrado melhor que as estratégias tradicionais de ranqueamento. Foi aplicado o conceito de transformers hierárquicos, no qual um modelo recebe uma sequência de publicações relacionadas a um autor de entrada a fim de gerar uma lista de representações densa a serem consumidas por um segundo modelo que deve ranqueá-las.
A pandemia da COVID-19 teve um impacto social e econômico global, inclusive no desenvolvimento de pesquisas científicas, devido às medidas de distanciamento social e à redução de recursos financeiros. Usando dados da Plataforma Lattes, este trabalho compara a produção acadêmica de pós-graduandos brasileiros antes, durante e após a pandemia, analisando a diminuição expressiva nas conclusões de mestrados e doutorados. Os resultados ressaltam a extensão do impacto nas trajetórias acadêmicas, inclusive indicando o diferencial de impacto em áreas específicas do conhecimento.
Representação de conjuntos é um problema extensivamente estudado. Porém, soluções canônicas com árvores binárias de busca não são trivialmente capazes de unir dois conjuntos eficientemente, ao mesmo tempo permitindo a separação de conjuntos por um dado valor. Estudamos uma estrutura de dados capaz de representar conjuntos de inteiros não-negativos e efetuar tais operações em tempo O(log U) amortizado, se U é o maior valor que podemos representar. Propomos também um novo tipo abstrato de dados que chamamos de Block-Sorted Array, e mostramos que com ele é possível representar arrays de inteiros não-negativos com operações de separar um array em dois em uma dada posição, concatenar, reverter e ordenar arrays, em tempo O(log n + log U) amortizado por operação, sendo n o número total de elementos representados e U o valor máximo representado. Por fim, definimos uma nova operação, chamada de Partition, que se trata de remover os k menores valores de um array, de forma ordenada. Mostramos uma implementação dessa operação usando o Block-Sorted Array, e conjecturamos que ela é efetuada em tempo sub-linear amortizado.
Redes neurais necessitam de muitos mais exemplos que humanos para aprender. No artigo “On the Binding Problem in Artificial Neural Networks” os autores teorizam que no cerne dessa diferença está o binding problem e solucioná-lo criaria modelos mais próximos da eficiência humana de aprendizado. O conjunto de dados CLEVRER permite isolar e estudar os componentes principais desse problema. Ele é composto por vídeos curtos de colisões de formas geométricas em 3D acompanhados por perguntas de raciocínio causal. Este trabalho propõe e avalia arquiteturas de redes neurais para resolver o problema de binding em tarefas de visão computacional aplicadas ao conjunto de dados CLEVRER. Inicialmente, o algoritmo base foi reimplementado, combinando MONet, para extração de objetos, e uma Transformer, para raciocínio temporal. Modificações foram propostas para otimizar a segregação de objetos utilizando informações temporais, como a adoção da arquitetura SlowFast. Além disso, redes MAC (Memory, Attention, and Composition) foram implementadas para raciocínio visual, explorando diferentes abordagens de integração temporal e espacial dos frames de vídeo. Os resultados demonstraram que, embora as modificações nas arquiteturas tenham levado a melhorias no desempenho em questões descritivas e preditivas, desafios ainda permanecem em questões contrafactuais, especialmente no que diz respeito ao aprendizado não supervisionado de representações temporais. O estudo conclui que abordagens que integram simultaneamente atenção temporal e espacial, como a combinação de redes MAC e Transformers, são promissoras para resolver o problema de binding em vídeos.