Autores:
- Enzo Daniel Marinho
- Ryan Ribeiro Rodrigues
- Ian Azevedo de Carvalho
Resumo: Este projeto propõe a criação de um gerenciador multiplataforma de histórico de clipboard. Ele captura automaticamente o conteúdo copiado pelo usuário e o organiza em um histórico acessível e gerenciável. Utiliza sockets para comunicação cliente-servidor e implementa algoritmos otimizados para busca e armazenamento dinâmico dos itens.
Palavras-chave: Clipboard, sockets, sistemas operacionais, armazenamento dinâmico, Python, C
Usuários frequentemente enfrentam dificuldades para gerenciar o histórico de itens copiados. O problema é mais evidente em tarefas que demandam múltiplas referências ao clipboard, como pesquisas, edição de documentos e programação. Esse projeto busca solucionar essa limitação, fornecendo um sistema que captura, organiza e facilita o acesso ao histórico de textos copiados.
-
Vídeo: Sockets and Pipes Look Like Files (Unix/fdopen)
- Explica como sockets e pipes podem ser manipulados como arquivos em sistemas Unix, destacando o uso de
fdopen
.
- Explica como sockets e pipes podem ser manipulados como arquivos em sistemas Unix, destacando o uso de
-
Vídeo: Unix Domain Socket in 100 seconds
- Uma introdução rápida e prática ao uso de Unix Domain Sockets.
-
Vídeo: [Linguagem C] Sockets no Windows e no Linux
- Demonstra como implementar sockets em C, abordando tanto sistemas Windows quanto Linux.
-
Documentação: socket
- Documentação oficial do módulo
socket
em Python, cobrindo o uso deSOCK_STREAM
para comunicação TCP.
- Documentação oficial do módulo
-
How-to Guide: Programação de Soquetes
- Guia introdutório à programação de sockets, com exemplos em Python.
-
Discussão: Can anyone explain to me how init == 'main' is used properly?
- Discussão em fórum sobre o uso correto da estrutura
if __name__ == '__main__'
em Python, relevante para a execução do cliente.
- Discussão em fórum sobre o uso correto da estrutura
-
Artigo: Introdução a Sockets em Python
- Um artigo introdutório sobre programação com sockets em Python, incluindo exemplos práticos.
-
Artigo: Manipulação de arquivos em C — como abrir e fechar arquivos e escrever algo neles
- Um artigo que trata de abrir, escrever, ler e fechar arquivos .txt em C
-
Artigo: How much memory does a call to ‘malloc’ allocate?
- Artigo que discute o funcionamento da função malloc com mais detalhes
-
Artigo: Como armazenar uma string com tamanho qualquer (desconhecido antecipadamente) em C?
- Uma solução de como ler uma string de tamanho desconhecido, porém ainda possui a limitação de não suportar o caractere de quebra de linha
- Artigo que trata da leitura de string de tamanho desconhecido, dando ênfase ao uso adequado de buffers e a função strlen(), ideal para o entendimento do código, que implementa na função realloc().
- Artigo que trata da macro nativa EOF, uma macro que é a solução implementada para a leitura indefinida de caracteres, teoricamente, além de uma segunda solução implementada no código.
Neste projeto, o "dataset" é composto pelos itens copiados pelo usuário em tempo real, armazenados inicialmente em uma lista ligada e, futuramente, em arquivos persistentes.
Os métodos principais incluem:
- Captura automática de eventos de
CTRL+C
. - Comunicação cliente-servidor via sockets.
- Armazenamento dinâmico em listas ligadas com nó descritor.
- Planejamento para integração de árvores de busca para otimização.
Os resultados serão medidos por:
- Latência das operações (
COPY
,DELETE
,SELECT
,SHOW_LIST
). - Consumo de memória durante a execução.
- Eficiência da busca no histórico (quando implementada a árvore de busca).
A comunicação cliente-servidor é realizada por meio de sockets UNIX (Linux) e TCP/IP (Windows). Essa abordagem permite troca de dados rápida e confiável entre os componentes do sistema, independentemente do sistema operacional.
- Lista Ligada: Utilizada para armazenamento temporário dos itens copiados. Sua implementação permite inserções e remoções dinâmicas.
- Árvore de Busca Binária (Planejada): Visa melhorar a eficiência na busca de itens ao longo do histórico.
O projeto combina a versatilidade do Python com a performance do C. Enquanto o cliente utiliza Python para lidar com eventos de sistema e interação com o usuário, o servidor em C é responsável por processar e armazenar os dados de forma eficiente.
-
Arquitetura Inicial:
- Configuração de um socket servidor em C e cliente em Python.
- Desenvolvimento da função
handle_signal
para capturarCTRL+C
e enviar mensagens ao servidor.
-
Estruturação do Histórico:
- Implementação de uma lista ligada para gerenciamento dinâmico do histórico.
- Definição dos comandos básicos:
COPY <texto>
: Armazena o texto copiado.DELETE <id>
: Remove um item específico.SELECT <id>
: Recupera um item.SHOW_LIST
: Exibe todos os itens armazenados.
-
Otimização e Planejamento:
- Planejamento para integração de uma árvore de busca para consultas mais rápidas.
- Proposta de armazenamento permanente para persistência dos dados.
-
Funcionalidades Implementadas:
- Comunicação cliente-servidor bem-sucedida.
-
Desempenho:
TODO
-
Lições Aprendidas:
TODO -
Perspectivas Futuras:
- Implementar armazenamento permanente para histórico.
- Otimizar buscas com árvores de busca.
- Expandir a funcionalidade para múltiplos formatos de dados (imagens, arquivos, etc.).
- Sockets and Pipes Look Like Files (Unix/fdopen)
- Unix Domain Socket in 100 seconds
- [Linguagem C] Sockets no Windows e no Linux
- socket
- Programação de Soquetes
- Can anyone explain to me how init == ‘main’ is used properly? I’ve watched multiple videos but it just hard for me to understand.
- Introdução a Sockets em Python
- Manipulação de arquivos em C — como abrir e fechar arquivos e escrever algo neles
- How much memory does a call to ‘malloc’ allocate?
- Como armazenar uma string com tamanho qualquer (desconhecido antecipadamente) em C?
- Como faço para guardar uma string com tamanho indefinido sem utilizar memória extra
- How does the EOF macro work with getchar?