# Escoha de tecnologias
# UI
## Web app
#### pros:
- Fácil acesso a partir de qualquer dispositivo com ligação à internet
- Não requer instalação ou atualizações nos dispositivos para poder ser usado
- É possível implementar atualizações e correções instantaneamente
- Permite o uso de recursos de nuvem para armazenamento e processamento de dados
#### contras:
- Requer uma ligação constante à internet
- Pode ter um desempenho mais lento e menor capacidade de processamento
- Depende da compatibilidade dos navegadores web para o seu funcionamento correto
- Desenvolvimento de Web-only features. ex: login, protecao contra xss, sqli ...
## Desktop app
#### pros:
- Maior desempenho e capacidade de processamento, possibilitando maior complexidade de funcionalidades
- Não depende de ligação constante com a internet, funcionando mesmo em ambientes offline
- Possibilidade de desenvolvimento independente de navegadores web
#### contras:
- Requer instalação e atualizações no dispositivo
- Pode ter dificuldades de compatibilidade entre diferentes sistemas operacionais e dispositivos
- Não permite acesso remoto tão fácil quanto as web applications
- Não permite o uso de recursos de nuvem para armazenamento e processamento de dados
- Menor alcance em comparação com web applications, que podem ser acessados a partir de qualquer dispositivo com ligação à Internet.
## Frameworks for WebApp
### [Django](https://www.djangoproject.com/)
#### pros:
- Estrutura abrangente: fornece tudo o que um desenvolvedor precisa para criar uma web application completa
- Segurança: tem uma forte ênfase na segurança, incluindo recursos como prevenção de ataques CSRF (Cross-Site Request Forgery) e sanitização de entrada de dados
- Escalabilidade: é escalável e pode lidar com aplicações de grande escala
- Administração: tem um sistema de administração integrado que permite que os desenvolvedores criem interfaces de administração de usuário sem escrever nenhum código
- Comunidade: é a mais famosa framework baseada em Python, tem uma grande comunidade de desenvolvedores ativos, o que pode tornar mais fácil encontrar ajuda e recursos.
- Alta produtividade: O Django oferece uma configuração fácil e recursos de desenvolvimento rápido, o que torna o processo de desenvolvimento de aplicativos da web mais rápido e produtivo.
- Batteries included: solucões pre-feitas para autenticacao, admin, sessões e [outros](https://djangopackages.org/)
- Arquitetura MVT(Model-View-Template)
- Templates, ex: table template, facilitam e aceleram o desenvolvimento
- Django’s Models: camada ORM (Object Relation Mapping) que simplifica a interacão com a base de dados
#### contras:
- Curva de aprendizagem: tem uma curva de aprendizagem íngreme, especialmente para iniciantes
- Flexibilidade: pode ser menos flexível do que outros frameworks, especialmente quando se trata de personalização
- Performance: pode ser menos eficiente do que outros frameworks em termos de desempenho, especialmente quando se trata de aplicações com grande volume de tráfego
- Complexidade: pode ser complexo e pode levar mais tempo para configurar e implantar do que outros frameworks
- Dependência de bibliotecas: depende fortemente de bibliotecas externas para adicionar funcionalidades, o que pode tornar a manutenção da aplicação mais complexa
- Tamanho do aplicativo: Os aplicativos Django tendem a ser maiores em tamanho em comparação com outros frameworks web, o que pode afetar o tempo de carregamento do aplicativo.
### [Laravel](https://laravel.com/)
#### pros:
- Facilidade de uso: é conhecido pela sua facilidade de uso e simplicidade, o que pode acelerar o processo de desenvolvimento.
- Grande comunidade: tem uma grande comunidade de desenvolvedores que podem ajudar com problemas e fornecer soluções
- Segurança: tem recursos de segurança embutidos, como proteção contra SQL injection e proteção contra ataques de CSRF
- Arquitetura MVC: segue a arquitetura Model-View-Controller (MVC), que ajuda a manter o código organizado e escalável
- Ferramentas integradas: tem muitas ferramentas integradas, como um sistema de autenticação, que pode ajudar a acelerar o desenvolvimento
#### contras:
- Velocidade: pode ser um pouco mais lento do que outros frameworks em termos de velocidade de execução, o que pode ser um problema para aplicações com alto volume de tráfego
- Limitações: pode ter algumas limitações em comparação com outros frameworks, especialmente para aplicações com requisitos mais avançados
- Atualizações: Como qualquer framework, precisa de ser atualizado regularmente para garantir que esteja sempre atualizado com as mais recentes correções de segurança e recursos
- Requisitos do servidor: pode ter requisitos específicos do servidor, como uma versão específica do PHP, o que pode ser um desafio em alguns casos
- Requisitos de hospedagem: pode ter requisitos específicos de hospedagem, como suporte a bancos de dados MySQL ou PostgreSQL. Isso pode limitar as opções de hospedagem disponíveis para o desenvolvedor
- Focado em server-side development, menos favorável ao nosso caso de uso.
### [Ruby on Rails](https://rubyonrails.org/)
#### pros:
- Produtividade: é conhecido pela sua produtividade, oferecendo uma ampla gama de recursos e ferramentas para agilizar o desenvolvimento
- Convenções: tem uma série de convenções que ajudam os desenvolvedores a escrever código mais limpo e organizado, reduzindo a necessidade de tomadas de decisão
- MVC: segue o padrão MVC (Model-View-Controller), o que pode facilitar a divisão e organização do código
- Escalabilidade: é escalável e pode lidar com aplicações de grande escala
- Comunidade: tem uma grande comunidade de desenvolvedores ativos, o que pode tornar mais fácil encontrar ajuda e recursos
#### contras:
- Curva de aprendizagem: tem uma curva de aprendizagem íngreme, especialmente para iniciantes
- Performance: pode ser menos eficiente do que outros frameworks, especialmente quando se trata de aplicações com grande volume de tráfego
- Dificuldade para personalização: pode ter limitações em termos de personalização, o que pode ser um problema para aplicações que precisam de recursos específicos
- Dependência de gems: o Ruby on Rails depende fortemente de gems (bibliotecas de código aberto) para adicionar funcionalidades, o que pode tornar a manutenção da aplicação mais complexa
- Concorrência: pode ter problemas de concorrência, especialmente se a aplicação precisa lidar com muitos usuários simultâneos
### [Flutter for Web](https://flutter.dev/multi-platform/web)
#### pros:
- Desenvolvimento multiplataforma: O Flutter for Web permite criar aplicativos web usando a mesma base de código do Flutter para aplicativos móveis, economizando tempo e esforço no desenvolvimento.
- Ótimo desempenho: O Flutter for Web é projetado para fornecer desempenho rápido e suave em navegadores modernos.
- Widgets: O Flutter for Web possui widgets e ferramentas para criar interfaces de usuário atraentes e personalizadas para a web.
- Comunidade em crescimento: A comunidade de desenvolvedores do Flutter for Web está crescendo rapidamente, o que significa que há cada vez mais recursos e suporte disponíveis.
#### contras:
- Suporte a navegadores limitado: Embora o Flutter for Web suporte a maioria dos navegadores modernos, alguns recursos podem não estar disponíveis em todos os navegadores.
- Tamanho do pacote maior: O pacote do Flutter for Web pode ser maior do que outros frameworks da web, o que pode afetar o tempo de carregamento do aplicativo da web.
- Curva de aprendizado: Embora o Flutter seja relativamente fácil de aprender, o desenvolvimento da web com o Flutter for Web pode ter uma curva de aprendizado para desenvolvedores que não estão familiarizados com o Flutter.
- Biblioteca limitada: Embora o Flutter for Web tenha uma biblioteca crescente de plugins e pacotes, ele ainda tem menos recursos em comparação com outras estruturas de desenvolvimento da web.
- Não adequado para todos os tipos de aplicativos da web: Embora o Flutter for Web seja adequado para a maioria dos aplicativos da web, pode haver casos de uso específicos em que outras estruturas da web são mais adequadas.
- A otimização de motores de pesquisa é mais difícil com flutter
- Podem não ser tão rápidas ou responsivas como web apps tradicionais
## Frameworks for Desktop app
### [Kivy](https://kivy.org/)
#### pros:
- Desenvolvimento multiplataforma: O Kivy permite que os desenvolvedores criem aplicativos para várias plataformas, incluindo Android, iOS, Windows, macOS e Linux, usando a mesma base de código.
- Linguagem Python: O Kivy é baseado em Python, uma linguagem de programação popular e fácil de aprender, o que facilita para o desenvolvimento da aplicação.
- Widgets personalizados: O Kivy oferece recursos para criar widgets personalizados, que permitem aos desenvolvedores criar interfaces de usuário personalizadas e atraentes.
- Open source: O Kivy é uma estrutura de código aberto, o que significa que é gratuito e os desenvolvedores podem contribuir para o seu desenvolvimento.
- Grande comunidade de desenvolvedores: O Kivy tem uma comunidade de desenvolvedores grande e ativa, o que significa que há muitos recursos e suporte disponíveis.
#### contras:
- Curva de aprendizado: O Kivy tem uma curva de aprendizado íngreme, especialmente para desenvolvedores iniciantes que não estão familiarizados com programação de interface do usuário.
- Poucos recursos: Embora o Kivy tenha recursos para criar aplicativos básicos, a estrutura pode ser limitada para projetos mais complexos.
- Documentação insuficiente: A documentação do Kivy é considerada insuficiente por alguns desenvolvedores, o que pode tornar o processo de aprendizado mais difícil.
- Desempenho: O Kivy pode ser menos eficiente em termos de desempenho em comparação com outras estruturas de programação de interface do usuário.
- Dificuldade em integração com outras bibliotecas: Integrar outras bibliotecas externas com o Kivy pode ser um desafio, especialmente para desenvolvedores menos experientes.
### [Tkinter](https://pythonbasics.org/tkinter/)
#### pros:
- Fácil de aprender: Tkinter tem uma API simples e intuitiva que é fácil de aprender, especialmente para iniciantes que estão a começar com programação GUI.
- Cross-platform: Tkinter está incluído com Python e está disponível em todas as principais plataformas, incluindo Windows, macOS, e Linux, o que torna fácil a criação de aplicações multi-plataforma.
- Documentação extensiva e apoio à comunidade: Tkinter tem uma extensa documentação e uma grande comunidade de programadores, o que facilita a procura de recursos, tutoriais e apoio.
- Built-in widgets: Tkinter fornece uma vasta gama de widgets built-in, tais como botões, etiquetas, caixas de texto, e scrollbars, que podem ser facilmente personalizados para criar uma variedade de componentes GUI.
- Open source: É livre de usar e pode ser modificado para se adaptar a requisitos específicos do projeto.
#### contras:
- Opções de estilo limitadas: Tkinter tem opções limitadas de estilo e personalizações, tornando difícil criar aplicações GUI modernas e visualmente atractivas.
- Suporte fraco para gráficos: Tkinter tem um suporte limitado para gráficos e animações avançadas, o que pode tornar difícil a criação de aplicações sofisticadas com visualizações complexas.
- Funcionalidade limitada: Tkinter é limitado em termos de funcionalidade em comparação com outras bibliotecas e estruturas GUI, o que pode tornar difícil a criação de aplicações grandes e complexas.
- Não tão "performant" como as aplicações nativas: Embora Tkinter seja geralmente rápido e eficiente, pode não ser tão "performant" como as aplicações nativas ou outras bibliotecas GUI, especialmente para aplicações complexas e de recursos intensivos.
- Problemas de compatibilidade: Tkinter pode ter problemas de compatibilidade com versões mais recentes do Python, o que pode causar problemas no uso de versões mais antigas da biblioteca.
### [PyQT](https://pypi.org/project/PyQt5/)
#### pros:
- Cross-plataform, permite desenvolvimento para vários sistemas operativos
- Baseado em python, simplicidade de sintax e mais rápido desenvolvimento
- Pode ser incorporado em aplicacõs baseadas em c++. Flexibilidade futura.
- Baseado na framework QT, grande ecosystemas de UI components, widgets e APIs, flexivel e robusta, com quality-management-tools, boas para manter a aplicacão.
- Extensa documentacão.
- Inclui sistema SQL database support, solucão out-of-the-box para interacão com a base de dados
- Bom track-record. Usada em aplicacões de larga escala
#### contras:
- Curva de aprendizagem íngreme. Tem de se saber python e aprender a usar a QT framework
- Licenca comercial necessária para distribuicão não open-source. Licenca GPL para open-source
- Documentacão principalmente para QT (versão de C++)
### [Flutter](https://flutter.dev/)
#### pros:
- Desenvolvimento multiplataforma: O Flutter permite criar aplicativos móveis para iOS e Android usando um único código-base, economizando tempo e esforço no desenvolvimento.
- Desenvolvimento rápido: O recurso de recarga rápida do Flutter permite que os desenvolvedores vejam as mudanças no aplicativo em tempo real, tornando o desenvolvimento mais rápido e eficiente.
- Designs bonitos: O Flutter possui widgets e ferramentas embutidos que tornam fácil criar interfaces de usuário (UIs) bonitas e visualmente atraentes.
- Ótimo desempenho: A arquitetura e os widgets embutidos do Flutter fornecem desempenho rápido e suave.
- Grande comunidade de desenvolvedores: O Flutter tem uma comunidade de desenvolvedores grande e ativa, o que significa que há muitos recursos e suporte disponíveis.
#### contras:
- Bibliotecas limitadas: Embora o Flutter tenha uma biblioteca crescente de plugins e pacotes, ele ainda tem menos recursos em comparação com outras plataformas estabelecidas de desenvolvimento de aplicativos móveis.
- Curva de aprendizado: Embora o Flutter seja relativamente fácil de aprender, ele tem uma curva de aprendizado, especialmente se você é novo no desenvolvimento de aplicativos móveis ou na linguagem de programação Dart.
- Pool de talentos menor: Como o Flutter é uma estrutura mais recente, pode haver menos desenvolvedores disponíveis com experiência em Flutter, em comparação com estruturas mais estabelecidas como React Native ou Java.
- Tamanho do aplicativo maior: Os aplicativos do Flutter tendem a ser maiores em tamanho em comparação com aplicativos desenvolvidos usando linguagens de programação nativas, o que pode afetar o tempo de download e instalação do aplicativo.
- Não adequado para todos os aplicativos: Embora o Flutter seja adequado para a maioria dos projetos de desenvolvimento de aplicativos móveis, pode haver casos de uso específicos em que o Flutter não é a melhor escolha.
# DADOS
[páginas do horário](https://paginas.fe.up.pt/~sigarra/horarios22_23-2S/)
base de dados em sqlite
[Diagrama UML](https://app.diagrams.net/#G1_KTNCZ2xhpdl1hKZ4w8ru0uTjQPRfPZy)
- python: import [sqlite3](https://www.geeksforgeeks.org/python-sqlite-connecting-to-database/)
- flutter: [sqlite plugin](https://docs.flutter.dev/cookbook/persistence/sqlite)
# HTML
- python: import [requests and BeautifulSoup](https://www.geeksforgeeks.org/python-web-scraping-tutorial/)
- flutter: [http and html parser](https://www.geeksforgeeks.org/web-scraping-in-flutter/)