Jump to content

All Activity

This stream auto-updates     

  1. Today
  2. Yesterday
  3. Ahhhh... sim... outro ERRO (embora a Microsoft pareça flexível com relação a isso) é usar "Portuguese" no setlocale()... A própria documentação da MS diz que o correto é obedecer as ISO 639 e 3166. Ou seja: setlocale( LC_ALL, "pt_BR.UTF-8" ); // linux setlocale( LC_ALL, "pt_BR.1252" ); // windows (code-page: WINDOWS-1252). Referência: https://docs.microsoft.com/en-us/cpp/c-runtime-library/reference/setlocale-wsetlocale?view=vs-2019 https://docs.microsoft.com/en-us/cpp/c-runtime-library/locale-names-languages-and-country-region-strings?view=vs-2019 PS: Isso parece ser irrelevante aqui, já que o código não usa nenhuma função da libc que necessite de locale...
  4. Nope... UMA string, como há o termino com " o início é assumido como "... Eu entendi que a rotina é ad hoc... Estou sendo apenas chato aqui! hehehe... Concordo que o uso de strtok() pode ser problemático. Mas, normalmente, não gosto muito de usar fgets() porque ele exige um buffer de tamanho conhecido... Suponha que você defina um buffer de 256 characteres e sua linha tenha 512, como fica? Para isso, prefiro a função (POSIX) getline(), que permite alocação dinâmica: char *buffer, *p; size_t size; // Prepara-se para a primeira alocação na leitura... buffer = NULL; size = 0; while ( getline( &buffer, &size, fp ) >= 0 ) { // Estirpa '\n' final. if ( p = strchr( buffer, '\n' ) ) *p = '\0'; /* ... */ // Livra-se do buffer, preparando para uma nova alocação. free( buffer ); buffer = NULL; size = 0; } Existem outras "micro-otimizações" que eu faria no código como, por exemplo, livrar-se da abundância de operadores [], substituíndo-os por uso de ponteiros, mas é só chatice minha mesmo... []s Fred
  5. Obrigado pelo toque, Frederico! Meu parser está bastante ad hoc, pensei em resolver de imediato o problema do Felipe e não me ative em resolver o problema da leitura do CSV de uma maneira mais abrangente. Apenas para registro, o que vi que está errado no meu parser: Meu parser sempre vai procurar por duas aspas, ignorando tudo o que vem antes e depois delas; Não é uma boa ideia usar o strtok com "," como separador se um campo possuir uma vírgula. Meu parser não está lidando com caracteres especiais no contexto do CSV, como quebras de linha e as próprias aspas duplas. Usar fgets para ler um registro confiando que nenhum campo conterá quebras de linha pode ser problemático. Se eu errei também na minha retratação, pode me descer o cascuco, Frederico. Mas no exemplo que você deu são 2 strings e 2 números, não? "fred", " o bom"", 10 e 3.14
  6. felipe lopes

    MergeSort

    Mano só agradece a força que tu me deu, serio mesmo. O programa está funcionando da maneira que eu idealizei, ele está pegando os valores, aplicando o merge e exibindo na tela certinho. Vlww mesmo pela ajuda
  7. Sinto dizer-lhes, mas esse parser está completamente errado... Por exemplo, a linha: fred, o bom",10,3.14 Mesmo sem o " inicial, é perfeitamente válida e com apenas 3 itens (uma string e dois valores numéricos)... E ainda existem outras construções que o código não contempla... Recomendo estudar o que deve ser feito antes de tentar fazer... Referência sobre CSV: https://tools.ietf.org/html/rfc4180
  8. Ahhh, agora eu entendi o motivo do continue no código original! A primeira linha do CSV possui o descritor do campo que será preenchido. Nesse caso, basta adicionar uma linha de fgets antes do while para descartar a primeira linha. Algumas coisas ainda não estavam funcionando pois: - você não observou atentamente qual flag de formato você usa para um int: é %d ou %s? - você não modificou o loop conforme meu post anterior. Dá uma olhada no código agora. Provavelmente você verá alguns zeros depois que o merge sort for feito por inconsistência entre a quantidade de entradas no arquivo e na definição do tamanho do vetor de dataset, mas esse é um problema bem simples de resolver. main.c
  9. felipe lopes

    MergeSort

    Ahhh certo, certo, então eu realizei a troca mesmo para o DT.csv, e removi o "Remove_quotes(token_wq, token);" de dentro do while. Na função Int main, eu removi os argv e argv, deixando como void, ele até abre o arquivo e imprime os valores, mas ele imprime somente valores 0 e NULL. Coloquei em Anexo a programação modifica como você falou e o arquivo .csv que estou usando ED2.rar
  10. Last week
  11. Se o seu CSV terá todos os campos sem aspas, basta modificar algumas linhas no loop while em main: antes: remove_quotes(token_wq, token); process_field(field_count++, token_wq, i); depois: process_field(field_count++, token, i); Se vocÊ quer lidar com dados que podem ou não ter aspas, eu fiz um comentário no post original: Ah, claro, erro meu. Eu fiz uma alteração que não expliquei. Alterei a função main para que ela receba argc e argv, para que eu pudesse testar com diferentes arquivos especificados na linha de comando. Para voltar à funcionalidade original, basta alterar a linha que lê o arquivo. Em vez de ler o arquivo argv[1], leia o arquivo "DT.csv". Pode-se também retirar o argc e argv dos argumentos de main como era antes.
  12. felipe lopes

    MergeSort

    Cara vlwww mesmo, de verdade eu não percebi o quanto de erro meu programa continha, to a quase 1 mes tentando fazer ele funcionar, mas eu fiquei com uma duvida. Eu testei na minha maquina com o meu .csv, mas ele não imprime os valores na tela, e um detalhe o .csv só tem uma coluna, que contem anos, e eles não possuem aspas. Sabe me dizer onde o programa está se perdendo ou porque ele não imprime na tela esses valores ?
  13. O Twitter baniu a conta de um grupo que supostamente vazou registro de 200 departamentos policiais. Segundo o The Verge, o grupo chamado Distributed Denial of Secrets (DDoSecrets) publicou recentemente quase 270 gigabytes de dados sob o título "BlueLeaks". O Twitter também adicionou uma página de aviso que aparece caso um usuário clique em um link existente direcionando ao conjunto de dados, alertando que o conteúdo foi identificado como "potencialmente prejudicial". O vazamento ocorreu após uma brecha na Netsential, uma empresa de desenvolvimento web que trabalhava com agências governamentais. O Twitter disse ao The Verge que o DDoSecrets violou as regras contra a publicação de materiais invadidos e foi suspenso permanentemente da rede. De acordo com um relatório obtido por Brian Krebs, o conjunto de dados do BlueLeaks continha algumas "informações altamente confidenciais", e-mails e outros materiais de departamentos de polícia de vários países. Aparentemente, os dados foram fornecidos por um suposto membro do Anonymous e, antes de divulgar, o DDoSecrets alega ter removido cerca de 50 gigabytes de dados, incluindo detalhes sobre vítimas de crimes e informações sobre saúde.
  14. Eu não verifiquei a lógica do merge sort. As modificações que eu fiz foram apenas na parte de leitura dos arquivos, e minha "investigação" do seu código passou por 4 etapas: 1. A formatação do arquivo CSV Como eu não sabia se seu arquivo CSV estava com os dados dispostos em linhas ou colunas, criei um arquivo CSV com os dados dispostos em cada formato para ver o que acontecia com seu código: - Se os dados estiverem dispostos em coluna, a primeira entrada será ignorada, e o programa processará o CSV a partir da segunda linha. Aí, o programa dá erro; - Se os dados estiverem dispostos em linha, a primeira linha será ignorada, e o programa processará o CSV a partir da segunda linha (como no caso acima). Se os dados estiverem todos na mesma linha, essa linha será ignorada, o loop de leitura dos dados se encerrará, e com ele, o programa. O que estava provocando isso tudo era esse trecho bem estranho: while (fgets(buf, 1024, fp)) { row_count++; if (row_count == 1) { continue; } ... } Na leitura da primeira linha, como row_count sempre ficara igual a 1, o código entra nesse if e executa o comando continue, que encerra a iteração atual do loop e passa diretamente para a próxima. Se o CSV tiver apenas uma linha, o comando dentro do while já terá chegado no final do arquivo, o que encerra o loop, fechando o arquivo em seguida, e fechando o programa, sem fazer nada. Mas esse não era o único problema do código, tampouco o mais crítico. 2. A leitura dos dados do arquivo para o programa A lógica de leitura do arquivo parecia bastante complicada. Aparentemente, a intenção do código era encontrar onde estavam as aspas do CSV para passar o conteúdo entre aspas para uma outra função que deveria passar os dados para uma estrutura chamada "dataset". Ocorre que C possui umas ferramentas bem legais para manipulação de strings. Deixei o loop de leitura do arquivo assim: while (fgets(buf, 1024, fp)) { field_count = 0; token = strtok(buf, ","); while (token != NULL) { remove_quotes(token_wq, token); process_field(field_count++, token_wq, i); token = strtok(NULL, sep); } i++; printf("\n"); if (i > TAMANHO) break; } Primeiro, strtok (em string.h) procurará por ocorrências de "," em buf. Por exemplo, se a linha do csv for "bla","ble","bli", a primeira ocorrência de strtok gerará a string "bla". As ocorrências seguintes, onde NULL aparece como argumento, irão, em sequência, gerar "ble" e "bli". Como não há "," depois do "bli", strtok retornará NULL no token, indicando que aquela linha não possui mais tokens. Outra função que aparece é a remove_quotes. Essa função eu criei para eliminar as aspas das strings: void remove_quotes(char* dst, char* src) { char* quote; int first_quote; int last_quote; int len; quote = strchr(src, '"'); first_quote = quote - src; while (quote != NULL) { quote = strchr(quote+1, '"'); if (quote) { last_quote = quote - src; } } len = last_quote - first_quote - 1; strncpy(dst, src+first_quote+1, len); dst[len] = '\0'; } Essa função utiliza a função strchr, que localiza a primeira ocorrência de um char (que nesse caso, é um char de aspas duplas) dentro da string iniciada pelo ponteiro indicado (que aqui eu chamei de src). Essa função encontrará as primeiras aspas da string, armazena sua posição relativa na string de origem, e vai encontrando, em seguida, aspas duplas até a função strchr retornar NULL. A posição relativa das últimas aspas duplas é armazenada. Depois de encontrar a posição relativa das primeiras e últimas aspas duplas na string de origem (src), o tamanho da string entre aspas é calculada (len). No final, strncpy copia exatamente o tamanho necessário (len) a partir do primeiro caractere depois das primeiras aspas duplas da origem na string de destino (dst) Como a função strncpy não termina a string de destino com um caractere nulo, ele é adicionado. (dst[len] = '\0). Caso precise, é bem fácil modificar essa função caso a origem (src) já não possua aspas duplas. 3. Passando os dados para a estrutura dataset Essa parte lida com a função process_field. Mais coisas foram retiradas de lá do que colocadas, mas as alterações feitas nela são importantes para entender como funcionam os tipos de dados em C. A função process_field ficou bem enxuta: void process_field(int field_count, char *value, int i) { if (field_count == 0) { vet[i].ano = atoi(value); printf("Ano:\t%d", vet[i].ano); } } A função que interpreta o valor da string em value é a atoi. Ela "transforma" uma string em um número inteiro. Essa função se faz necessária pois uma string é um vetor de chars, e não são podem ser imediatamente convertidas para o número que é lido ou informado pelo usuário humano. Sem levar isso em consideração, algumas linhas do código original estavam tentando fazer essa conversão direta, como por exemplo: vet[i].ano = value; vet.ano é um número inteiro, e value é um ponteiro de char. Quando se realiza esse comando, o computador entenderá que você quer armazenar o valor de endereço de memória armazenado em value no campo ano de vet. Ainda que value aponte para uma string do tipo "1234", o valor de value, em si, nada tem a ver com o número que está sendo representado naquela string. Outro caso onde houve essa confusão foi nessa linha: printf("vetor[i] %s", vet[i].ano); Nesse comando, você especificouum formato %s para algo do tipo int, quando se espera que o tipo seja char*. Essa inconsistência pode gerar vários tipos de comportamentos indefinidos, como tentar ler vet.ano como um endereço de memória de uma sequência de chars terminadas em \0, ou outras coisas que podem travar o programa ou sua máquina, a depender do quão bem seu sistema lida com esse tipo de exceção. Outras linhas que eu removi por razões práticas, e que não fazem sentido foram essas: int tam = sizeof(vet[i].ano)/sizeof(int); merge(vet[i].ano,0,tam-1); tam sempre será igual a 1, pois vet.ano é inteiro, e sizeof(int)/sizeof(int) = 1. A linha que chama a função merge também não faz sentido, pois assim vcê estará fazendo vários merge sort de um único inteiro. Caso a intenção fosse inserir o ano na estrutura de modo a já fazer o sort e ter um vetor já arrumado logo após a inserção, até poderia ser feito durante a leitura dos dados, porém, o merge sort não funcionará eficientemente. Caso essa seja uma das necessidades da sua solução, procure por heap sort. 4. Corrigindo a tipagem dos parâmetros das funções do merge sort Por fim, alterei os tipos dos parâmetros das funções de sort. Como você está lidando com um vetor de dataset, onde cada dataset contém um int, as funções devem recever ponteiros para dataset, e não ponteiros para inteiro. //void intercala(int *x, int inicio, int fim, int meio) { void intercala(dataset* x, int inicio, int fim, int meio) { ... } //void merge(int *x, int inicio, int fim) { void merge(dataset* x, int inicio, int fim) { ... } As linhas que se referiam aos valores de x, agora fazem para x.ano. No fim, após a leitura dos dados, chamei a função merge e imprimi na tela o resultado: #define TAMANHO 103 ... int main(int argc, char** argv) { ... // executa o sort merge(vet, 0, TAMANHO-1); // print na tela for (j = 0; j < TAMANHO; ++j) { printf("%d\n", vet[j].ano); } return 0; } O código com todas as modificações estão em anexo main.c
  15. Após mais de um ano desde sua última atualização, saiu o hashcat 6.0.0 no último dia 16 de junho. A ferramenta de recuperação de senhas é de código aberto e contou com 1,8 mil commits desde o último lançamento (5.1.0). A nova versão vem com melhorias de desempenho (muito importante para uma ferramenta de quebra de hashes, né?), novos recursos e documentação detalhadas para usuários e desenvolvedores. Entre as principais funcionalidades da versão 6.0.0 estão: Nova interface para plug-ins - para modos de hash modulares Nova API para computação back-end - para adicionar APIs diferentes da OpenCL Inclusão do CUDA como uma nova API de computação back-end Guia abrangente para desenvolvedores de plug-ins Modo de emulação de GPU - para usar o código do kernel no host Melhor gerenciamento de memória de GPU e threads Tuning automático aprimorado com base nos recursos disponíveis Como se não bastasse, foi adicionado suporte a 51 novos algoritmos, incluindo os utilizados por ferramentas como Telegram e DiskCrypt. Já são 320 hashes suportados pelo hashcat! Acesse o changelog completo aqui. 😉
  16. felipe lopes

    MergeSort

    Bom dia, adicionei o arquivo em anexo, eu consigo ler os valores e salvar em um vetor, mas não descobrir como passar esse vetor pra chamada do merge e depois receber os valores de volta e imprimir na tela main.c
  17. Além do detalhe apontado por @mandelacruz, você declarou 'dados' como 'int' na estrutura TLDE, o que fará um 'float' ser convertido para 'int' (se possível)...
  18. Não entendi muito bem aonde não aparece os números, você não especificou, mas, se estiver falando do output no console, é porque o printf(" %d", p->dados); está com '%d' e não '%f' ou '%lf'.
  19. TLDE* inverte(TLDE* l) { TLDE *p = l; TLDE *aux=NULL; p=l->prox; l->prox=NULL; while(p!=NULL) { aux=p->prox; p->prox=l; l=p; p=aux; } return l; }
  20. Pq ao executar o programa não aparece os números do tipo float e aparece somente como inteiro? #include<stdio.h> #include<stdlib.h> struct TLDE { int dados; struct TLDE* prox; }; TLDE* inserir_no_fim( TLDE*p , float elem) { TLDE *raiz = p; TLDE* pTemp = (struct TLDE*)malloc(sizeof(struct TLDE*)); pTemp->dados = elem; pTemp->prox = NULL; if(!raiz) return pTemp; else { TLDE* pPar = p; while(p->prox) { p=p->prox; } p->prox =pTemp; return raiz; } } void exibir(TLDE* p) { if(!p) printf("Lista vazia"); else { do { printf(" %d", p->dados); p=p->prox; } while(p); } } TLDE * inverte( TLDE *l) { TLDE*r =NULL; // r é o ponteiro para a lista invertida TLDE*s =NULL; //s é o ponteiro para o ultimo elemento da lista invertida while(l) { s=r; r=l; l=l->prox; r->prox=s; } return r; } int main() { TLDE *inicializa =NULL; inicializa = inserir_no_fim(inicializa,1056985466); inicializa = inserir_no_fim(inicializa,9); inicializa = inserir_no_fim(inicializa,6.5); inicializa = inserir_no_fim(inicializa,4.5); printf("\nLista normal: "); exibir(inicializa); inicializa = inverte(inicializa); printf("\nLista invertida: "); exibir(inicializa); }
  21. Não... Se espera ajuda num forum, deve ser público.
  22. felipe lopes

    MergeSort

    Boa noite, eu posso te enviar por e-mail ?
  23. O Google removeu 25 aplicativos Android da Google Play Store. Segundo o ZDNet, os apps foram pegos roubando credenciais do Facebook. Antes de serem retirados a loja, os aplicativos foram baixados mais de 2,34 milhões de vezes. Os aplicativos maliciosos foram desenvolvidos pelo mesmo grupo de cibercriminosos e, apesar de oferecerem recursos diferentes, todos funcionavam da mesma maneira. De acordo com um relatório da empresa francesa de cibersegurança Evina compartilhado com o ZDNet, os apps se apresentaram como contadores de passos, editores de imagem, editores de vídeo, aplicativos de papel de parede, aplicativos de lanterna, gerenciadores de arquivos e jogos para celular. Apesar de funcionalidade legítima, eles continham um código malicioso que, segundo os pesquisadores da Evina, detecta que o usuário abriu recentemente e possuía em primeiro plano. Se o aplicativo em primeiro plano do usuário fosse o Facebook, o app malicioso colocaria uma janela do navegador da Web em cima do aplicativo oficial do Facebook e carregaria uma página de login falsa da rede social. A lista completa de 25 aplicativos, seus nomes e o ID do pacote estão listados no site do ZDNet.
  24. Sem ver o código é meio difícil...
  25. felipe lopes

    MergeSort

    Óla, eu desenvolvendo um programa que le um arquivo do tipo .CSV e aplica a técnica do Mergesort para ler os dados, porem não estou conseguindo utilizar o MergeSort dentro do programa. Podem me auxiliar por favor?
  26. Ola, alguem poderia me ajudar? Tenho que fazer um projeto onde basicamente teria que criar um arquivo em C++ para cadastro/alteração de peças, e vendas tbm. Mas estou travada na parte da venda. Basicamente era pra por o codigo da peca e a quantidade e ela dar baixa no estoque da peça que tinha cadastrado anteriormente mas não vai. Vou por a baixo ate aonde foi feito e anexar de imagem oq é pedido, se alguem puder me ajuda em ficaria muito agradecida. #include <stdio.h> #include <stdlib.h> #include <string.h> #include <conio.h> struct pecas { char nome[34]; int codigo; float valor; int e; int quantidade; } f; FILE *fptr; void cadastro(); void consulta(); void alteracao(); void vendas(); void exclusao_logica(); void exclusao_fisica(); void ordenacao(); void busca_binaria(); int main() { char opc; do { system("cls"); printf("\n 1 - Cadastro de peca"); printf("\n 2 - Consultar pecas"); printf("\n 3 - Alteracao de pecas"); printf("\n 4 - Vendas"); printf("\n 5 - Exclusao Logica"); printf("\n 6 - Exclusao Fisica"); printf("\n 7 - Ordenacao pelo nome"); printf("\n 8 - Busca Binaria"); printf("\n 9 - Sair "); printf("\n Opcao: "); opc=getche(); switch (opc) { case '1': cadastro(); break; case '2': consulta(); break; case '3': alteracao(); break; case '4': vendas(); break; case '5': exclusao_logica(); break; case '6': exclusao_fisica(); break; case '7': ordenacao(); break; case '8': busca_binaria(); break; case '9': printf("\n\nSaindo...\n"); break; default : printf("\n Opcao %c invalida", opc); getch(); break; } } while (opc!='9'); return 0; } /***********************************************************************/ void cadastro() { char op; if ((fptr=fopen("pecas.dados", "rb+"))==NULL) {if ((fptr=fopen("pecas.dados", "wb"))==NULL) { printf("\n Erro"); exit(1); } } do { printf("\n Entre com os dados para o cadastro de pecas \n"); printf("\n Nome: "); setbuf(stdin, NULL); scanf("%[^\n]",f.nome); printf("\n Codigo: "); scanf("%d",&f.codigo); printf("\n Valor: "); scanf("%f", &f.valor); printf("\n Quantidade: "); scanf("%d", &f.quantidade); f.e=0; fseek(fptr,0,2); fwrite(&f,sizeof(f),1,fptr); printf("\n Deseja cadastrar outro (S/N): "); op=getche(); } while ((op!= 'N') && (op!='n')); ((op=='S')||(op=='s')); fclose(fptr); } /**************************************************************************************/ void consulta() { if ((fptr=fopen("pecas.dados", "rb"))==NULL) { printf("\n Erro"); exit(1); } printf("\n Consulta de todos as pecas \n"); while (fread(&f,sizeof(f),1,fptr)) { if (f.e==0) {printf("\n\n Nome: %s", f.nome); printf("\n Codigo: %d", f.codigo); printf("\n Valor: %.2f",f.valor); printf("\n Quantidade: %d",f.quantidade); } } getch(); fclose(fptr); } /**************************************************************************************/ void alteracao() { char nome[40]; if ((fptr=fopen("pecas.dados", "rb+"))==NULL) { printf("\n Erro"); exit(1); } printf("\n Entre com o nome da pea a ser alterado o valor\n"); setbuf(stdin, NULL); scanf("%[^\n]",nome); while (fread(&f,sizeof(f),1,fptr)) { if (strcmp(f.nome,nome)==0) if (f.e==0) {fseek(fptr,ftell(fptr)-sizeof(f),0); // fseek(fptr,-sizeof(fptr),1); printf("\nNovo Valor "); scanf("%f",&f.valor); fwrite(&f,sizeof(f),1,fptr); fseek(fptr,0,2); } } fclose(fptr); } /******************************************************/ void vendas() { int codigovendas, quant; { if ((fptr=fopen("pecas.dados", "rb"))==NULL) { printf("\n Erro"); exit(1); } } printf("\n Vendas de pecas cadastradas \n"); printf("\n Digite o nome da peca que vai ser vendida \n"); scanf("%d", &codigovendas); printf("\n Digite a quantidade de pecas que seram vendidas"); scanf("%d", quant); if(codigovendas == f.codigo){ printf("\n venda concluida"); f.quantidade = f.quantidade-quant; } else printf("\n codigo n cadastrado"); getch(); fclose(fptr); } /**************************************************************************************/ void exclusao_logica() { char nome[40]; if ((fptr=fopen("pecas.dados", "rb+"))==NULL) { printf("\n Erro"); exit(1); } printf("\n Entre com o nome da peca a ser excluida logicamente\n"); setbuf(stdin, NULL); scanf("%[^\n]",nome); while (fread(&f,sizeof(f),1,fptr)) { if (strcmp(f.nome,nome)==0) if (f.e==0) { fseek(fptr,ftell(fptr)-sizeof(f),0); f.e=1; fwrite(&f,sizeof(f),1,fptr); fseek(fptr,0,2); } } getch(); fclose(fptr); } /**************************************************************************************/ void exclusao_fisica() { } /**************************************************************************************/ void ordenacao() { } /**************************************************************************************/ void busca_binaria() { }
  27. Linus Torvalds lançou o primeiro release candidate (uma versão pronta, com grandes chances de se tornar um lançamento) do Linux kernel 5.8 há duas semanas. Durante a janela de mesclagem de duas semanas para o próximo Linux kernel 5.8, ele recebeu um dos maiores números de contribuições, segundo o FossBytes. Com a versão 5.8-rc1, o Linux 5.8 possui 14.000 commits, 800.000 novas linhas de código e 14.000 mudanças em arquivos de código-fonte (cerca de 20% de todos os arquivos fonte na estrutura do kernel). A v5.8 inclui ainda limpezas de código, documentação e muito trabalho de desenvolvimento nos sistemas de arquivos. Além disso, há melhorias no suporte ao processador, novo suporte de hardware, aprimoramento de segurança e avanço do driver gráfico Intel/Radeon de código aberto. Veja as principais alterações feitas durante a janela de mesclagem do kernel 5.8 do Linux: Melhoria no driver gráfico AMD Radeon Otimizações do SELinux Fila geral de notificação Atualizações de gerenciamento de energia Suporte melhorado aos teclados da Apple (teclas Fn e Ctrl). Suporte para Intel Tiger Lake Thunderbolt Suporte do acelerador Habana Labs Gaudi Várias melhorias no sistema de arquivos Btrfs Limpeza e correção do sistema de arquivos EXT4 e exFAT Suporte inicial a processadores POWER10 Veja mais atualizações no blog Phoronix. Falando em Linux, já viu nossas dicas de shell? Esse vídeo é a primeira parte de uma sequência de dicas para trabalhar melhor no shell do Linux – com foco em Bash:
  28. Fernando Mercês

    MBLive v1

    Depois do sucesso da MBConf, teremos nossa primeira MBLive! hehe O objetivo é trocar uma ideia informal com nossa comunidade. Colá lá: https://www.instagram.com/mentebinaria_/ 🙂
  1. Load more activity
×
×
  • Create New...