Há pouco tempo resolvi instalar alguma distro Linux no meu notebook. Depois de algumas pesquisas e indicações, escolhi o Gentoo Linux. Ainda estou me habituando ao novo ambiente e frequentemente me surgem dúvidas, onde nada que uma pesquisa básica na internet ou a ajuda do Dalton Matos (que me ajuda ativamente com o Gentoo) não resolva.
Como desenvolvo programas em Java, resolvi começar a usar o Gentoo também para tal fim. Após baixar o Eclipse, fui fazer emerge da JDK pelo terminal. Foi então que surgiu o problema!
Fiz o emerge normalmente: emerge virtual/jdk
A questão foi que a JDK default do emerge não é a da Oracle. Com isso, um projeto teve alguns problemas de compatibilidade. Fui então procurar como instalar a JDK adequada. Graças a esta página da documentação do Gentoo consegui instalá-la.
Instalando Pacotes Manualmente
Alguns pacotes não podem ser baixados diretamente pelo emerge, mesmo com modificações em arquivos como o package.license. Isso ocorre por questões de licenciamento, registro, etc.
Ao tentar fazer emerge de pacotes que estão nesta situação ocorrerá um erro. Será então exibido no terminal o caminho do log (algo parecido com "/var/tmp/portage/.../build.log"). Abra este arquivo com o editor de preferência. Nele você encontrará informações sobre o porque não foi possível fazer o emerge. Se o pacote tiver que ser baixado manualmente, neste arquivo estará indicado aonde fazer o download. Faça o download do arquivo e então copie este arquivo para o caminho /usr/portage/distfiles. Pronto, agora você poderá fazer o emerge deste pacote e, como ele já foi baixado, será compilado(se for o caso) e instalado em seu sistema.
No caso da JDK7 da Oracle, eu baixei o .tar e copiei-o para a pasta distfiles. Depois disso, dei emerge: emerge dev-java/oracle-jdk-bin, e o pacote foi instalado normalmente.
quarta-feira, 21 de dezembro de 2011
sexta-feira, 4 de novembro de 2011
/* Mini-Grep */
Descrição/Sobre:
Grep (global / regular expression / print) é um programa executado pela linha de comando do Linux. Esse programa consiste em buscar uma expressão (uma palavra, por exemplo) em arquivos. O Grep original imprime na saída padrão todas as linhas em que ocorreram a expressão mencionada.
Este é um código que funciona de forma parecida, mas reduzida, por isso mini-grep. O uso pela linha de comando é: [programa] [opções] [expressão] [arquivo]. Lembrando que programa é o executável do mini-grep e o arquivo deverá ser o nome com sua extensão.
Código:
#include <stdio.h> #include <stdlib.h> #include <string.h> FILE* abreArquivo(char caminho[], char modo[]){ FILE *f = fopen(caminho, modo); if(!f){ printf("ERRO: O arquivo nao existe\n<ENTER>"); getchar(); exit(0); } return f; } void fechaArquivo(FILE *f){ if(fclose(f)){ printf("ERRO: Problemas ao fechar o arquivo\n<ENTER>"); getchar(); } } char* leLinha(FILE *f, char *aux){ int cont = 0; do{ if(aux == NULL){ aux = (char*) malloc(sizeof(char)); if(!aux){ printf("ERRO: erro ao alocar memoria\n<ENTER>"); getchar(); exit(0); } } else{ aux = (char*) realloc(aux, (cont+1) * sizeof(char)); if(!aux){ printf("ERRO: erro ao realocar memoria\n<ENTER>"); getchar(); exit(0); } } fscanf(f, "%c", &aux[cont]); cont++; }while(aux[cont-1] != 10 && aux[cont-1] != 0); aux[cont-1] = 0; return aux; } void buscaPalavra(FILE *f, char *palavra, int op){ int linha = 0; if(!op) strupr(palavra); while(!feof(f)){ char *aux = NULL; aux = leLinha(f, aux); linha++; if(!op) strupr(aux); if(strstr(aux, palavra)){ printf("%d: %s\n", linha, aux); printf("\n<ENTER>"); getchar(); free(aux); aux = NULL; return ; } free(aux); aux = NULL; } printf("Palavra nao encontrada"); printf("\n\n<ENTER>"); getchar(); } int parametrosCorretos(int argc, char *argv[]){ if(argc < 3 || argc > 4){ printf("\nUso correto: [%s] [opcoes] [palavra] [nome_do_arquivo]", argv[0]); printf("\n\n\n<ENTER>"); getchar(); return 0; } if(argc == 4) if(strcmp(argv[1], "-i")){ printf("\nOpcao incorreta.\n\nLista de opcoes validas:\n\n"); printf(" [-i]\tnao diferenciar maiusculas de minusculas"); printf("\n\n\n<ENTER>"); getchar(); return 0; } return 1; } int main(int argc, char *argv[]){ FILE *f = NULL; system("cls"); if(!parametrosCorretos(argc, argv)) exit(0); if(argc == 4){ f = abreArquivo(argv[3], "r"); buscaPalavra(f, argv[2], 0); } else{ f = abreArquivo(argv[2], "r"); buscaPalavra(f, argv[1], 1); } fechaArquivo(f); return 0; }
Primeiro testamos se os parâmetros foram passados de maneira correta e para isso chamamos a função 'parametrosCorretos'. Se o programa foi chamado de forma correta, abrimos o arquivo(se ele existir) e buscamos a palavra a partir da função 'buscaPalavra'. Como não sabemos o tamanho da linha a princípio, se usássemos um array já com suas dimensões definidas poderíamos cair em uma situação em que a linha é maior que este array. Resolvemos este problema com a função 'leLinha', que vai alocando a memória caractere a caractere. Por fim retorna o endereço da linha. O programa para na primeira ocorrência da expressão, e se a mesma não for encontrada exibe uma mensagem no final. :)
---
You can do it!
domingo, 30 de outubro de 2011
/* PGC - Programa de Gerenciamento de Clientes */
Como já sabemos, sistemas que gerenciam informações sempre "quebram um galho"(quando bem feitos). É só você pensar que em uma lista com 1000 materiais escritos em papéis precise das informações de um em específico. Mesmo estando organizados em ordem alfabética, por exemplo, essa é uma tarefa bem cansativa. Com um sistema fazendo esse trabalho de armazenar as informações e gerenciá-las, uma função para pesquisar um material se sairia muito melhor.
Há alguns meses, quando eu estava mais ativo na Namelez, surgiu uma proposta de sistema para um salão de beleza. O sistema deveria guardar as informações de clientes, como nome, endereço, telefones de contato, observações, etc. Fazer esse sistema foi uma experiência única, pois além de ter um contato mais direto com o cliente, pude aprender e entender várias das funções de um analista de sistemas.
Vendo que o sistema feito para o salão (que demos o nome de NameleZ SoftHair) havia sido bem sucedido, minha mãe, que trabalha com vendas, pediu que eu fizesse algo similar para ela. Foi aí que surgiu a ideia do PGC. Um sistema simples feito em C e que roda em console do Windows. Algumas características foram decididas de forma a parear com meu conteúdo atual na faculdade, como a linguagem de programação C e o uso de arquivos para guardar as informações.
O projeto ainda está na metade de desenvolvimento. É open-source e você pode fazer *o que quiser* com o código que está no meu perfil do GitHub, bem aqui.
Aceito críticas, boas ou ruins ...
You can do it!
Há alguns meses, quando eu estava mais ativo na Namelez, surgiu uma proposta de sistema para um salão de beleza. O sistema deveria guardar as informações de clientes, como nome, endereço, telefones de contato, observações, etc. Fazer esse sistema foi uma experiência única, pois além de ter um contato mais direto com o cliente, pude aprender e entender várias das funções de um analista de sistemas.
Vendo que o sistema feito para o salão (que demos o nome de NameleZ SoftHair) havia sido bem sucedido, minha mãe, que trabalha com vendas, pediu que eu fizesse algo similar para ela. Foi aí que surgiu a ideia do PGC. Um sistema simples feito em C e que roda em console do Windows. Algumas características foram decididas de forma a parear com meu conteúdo atual na faculdade, como a linguagem de programação C e o uso de arquivos para guardar as informações.
O projeto ainda está na metade de desenvolvimento. É open-source e você pode fazer *o que quiser* com o código que está no meu perfil do GitHub, bem aqui.
Aceito críticas, boas ou ruins ...
You can do it!
quinta-feira, 20 de outubro de 2011
/* Jogo da Forca */
O jogo da forca consiste em acertar uma palavra secreta com o limite de x erros.
Para os mais iniciantes algumas funções podem parecer complexa, mas não são. A chToUpper() recebe um caractere e retorna seu equivalente em maiúsculo. A função fflush() limpa o buffer do teclado, ou seja, isso impede que o programa recolha lixo ao invés da entrada do usuário.
Nesta primeira versão, a palavra secreta já está no código-fonte. Melhorias em breve. :3
O jogo é simples e pequeno. Segue o código:
21/10/11: você pode ver a última versão com o código completo no meu repositório do GitHub: Jogo da Forca
Para os mais iniciantes algumas funções podem parecer complexa, mas não são. A chToUpper() recebe um caractere e retorna seu equivalente em maiúsculo. A função fflush() limpa o buffer do teclado, ou seja, isso impede que o programa recolha lixo ao invés da entrada do usuário.
Nesta primeira versão, a palavra secreta já está no código-fonte. Melhorias em breve. :3
O jogo é simples e pequeno. Segue o código:
21/10/11: você pode ver a última versão com o código completo no meu repositório do GitHub: Jogo da Forca
#include <stdio.h> char palavraSecreta[] = "OVERFLOW"; int letrasUsadas[256] = { 0 }; char palavraDescoberta[] = "--------"; int vida = 5; void showTelaInicial(){ printf("\t\t\t\t ------- \n"); printf("\t\t\t\t| Forca |\n"); printf("\t\t\t\t ------- \n"); printf("\n\n\n\nPressione <ENTER> para continuar..."); getchar(); } int chToUpper(char ch){ return ch & ~32; } void printLetrasUsadas(){ int i; printf("\t\t\tLetras usadas: [ "); for(i = 65; i < 91; i++) if(letrasUsadas[i]) printf("%c ", i); printf("]\n"); } void printPalavraDescoberta(){ int i; printf("\n\t\t\t=> "); for(i = 0; palavraSecreta[i]; i++) printf("%c ", palavraDescoberta[i]); printf("<=\n"); } char chutaLetra(){ char ch; printf("\t\t\tNova letra: "); fflush(stdin); scanf("%c", &ch); return chToUpper(ch); } int verificaLetraUsada(int letra){ if(letrasUsadas[letra]) return 1; return 0; } int chuteCerto(char ch){ int i; int acertou = 0; for(i = 0; palavraSecreta[i]; i++) if(palavraSecreta[i] == ch){ palavraDescoberta[i] = ch; acertou = 1; } return acertou; } int terminou(){ int i; for(i = 0; palavraSecreta[i]; i++) if(palavraDescoberta[i] == '-') return 0; return 1; } void play(){ char chute; while(vida){ system("cls"); printf("\n\n"); printLetrasUsadas(); printf("\t\t\tVidas: %d\n", vida); printPalavraDescoberta(); chute = chutaLetra(); if(!verificaLetraUsada(chute)){ letrasUsadas[chute] = 1; if(!chuteCerto(chute)) vida--; else if(terminou()) break; } else{ printf("\t\t\tLetra ja utilizada... <ENTER>"); fflush(stdin); getchar(); } } system("cls"); if(!vida) printf("\n\n\t\t\t\tVoce perdeu..."); else printf("\n\n\t\t\tParabens, voce ganhou"); fflush(stdin); getchar(); } int main(){ showTelaInicial(); play(); return 0; }
sexta-feira, 7 de outubro de 2011
/* Jogo da velha */
Trago-lhes um simples jogo da velha feito em C.
O jogo consiste em você jogar contra o computador. Na função main há um loop que, analogamente, é o "coração" do jogo.
A função init_matriz inicializa a matriz 3x3 com espaços, para que assim fique melhor sua exibição. A função disp_matriz mostra o "tabuleiro" formatado na tela do console. A função move_jogador e move_cpu são, respectivamente, para a sua jogada e a jogada do computador. A função check_vencedor verifica se alguém ganhou o jogo, pela linha, coluna ou diagonal.
Como o programa foi desenvolvido apenas de forma didática, o computador não possui nenhuma "inteligência", sendo assim, na sua vez ele simplesmente procura um espaço em branco e joga nele. Para implementar algum tipo de IA, é necessário apenas modificar a função move_cpu.
12/10/11:
Você pode ver o código do jogo completo no meu repositório no GitHub: Jogo da Velha
22/10/11:
Código no repositório adaptado para rodar tanto em Windows quanto em Linux.
Você pode ver o código do jogo completo no meu repositório no GitHub: Jogo da Velha
22/10/11:
Código no repositório adaptado para rodar tanto em Windows quanto em Linux.
-----
#include <stdio.h> char matriz[3][3]; void init_matriz(){ int i, j; for(i = 0; i < 3; i++) for(j = 0; j < 3; j++) matriz[i][j] = ' '; } void disp_matriz(){ int i, j; printf(" --- --- --- \n"); for(i = 0; i < 3; i++){ printf("|"); for(j = 0; j < 3; j++) printf(" %c |", matriz[i][j]); printf("\n|---|---|---|\n"); } } void move_jogador(){ int x, y; printf("\n\nDigite em qual pos(x, y) deseja jogar: "); scanf("%d%d", &x, &y); x--; y--; if(matriz[x][y] != ' '){ printf("Posicao invalida ou ja jogada, tente novamente...\n\n"); move_jogador(); } else matriz[x][y] = 'X'; } void move_cpu(){ int i, j; for(i = 0; i < 3; i++){ for(j = 0; j < 3; j++) if(matriz[i][j] == ' ') break; if(matriz[i][j] == ' ') break; } if(i*j == 9){ printf("\nEMPATE"); getchar(); exit(0); } else matriz[i][j] = 'O'; } char check_vencedor(){ int i; for(i = 0; i < 3; i++) if( (matriz[i][0] == matriz[i][1]) && (matriz[i][0] == matriz[i][2]) ) return matriz[i][0]; for(i = 0; i < 3; i++) if( (matriz[0][i] == matriz[1][i]) && (matriz[0][i] == matriz[2][i]) ) return matriz[0][i]; if( (matriz[0][0] == matriz[2][2]) && (matriz[1][1] == matriz[2][2]) ) return matriz[1][1]; if( (matriz[1][1] == matriz[0][2]) && (matriz[1][1] == matriz[2][0]) ) return matriz[1][1]; return ' '; } int main(){ char terminado = ' '; printf("\t\tJogo da Velha :)\n"); printf("Modo: vs cpu\n\n"); init_matriz(); do{ disp_matriz(); move_jogador(); terminado = check_vencedor(); if(terminado != ' ') break; move_cpu(); terminado = check_vencedor(); }while( terminado == ' '); if(terminado == 'X') printf("\n\nParabens, voce venceu!\n"); else printf("\n\nQue pena, voce perdeu!\n"); disp_matriz(); fflush(stdin); getchar(); return 0; }
-----
Divirtam-se, façam modificações e code it! :)
quinta-feira, 6 de outubro de 2011
Bubble Sort (Método da bolha)
Bubble sort é um algoritmo de ordenação de vetores. Ele é um dos mais simples de se entender e implementar. O algoritmo consiste em comparar um numero na posição n e n+1 e, caso n for maior, eles trocam de posição. Por isso é chamado de método da bolha, pois ele vai jogando o maior para o final do vetor, formando bolhas.
-----
#include "stdio.h"
void troca( int *a, int *b ){
int aux = *a;
*a = *b;
*b = aux;
}
void bubbleSort( int array[], int tamanho ){
int i, j;
for( i = 0; i < tamanho-1; i++ )for( j = i+1; j < tamanho; j++ )
if( array[i] > array[j] ) troca( &array[i], &array[j] );
}
int main(){
int array[] = { 2, 7, 1, 0, 20 };
bubbleSort( array, 5 );
return 0;
}
-----
Este algoritmo é bem útil, tendo em vista que constantemente precisamos fazer ordenações em nossos programas :)
Para quem não entendeu o que se está passando, este vídeo inusitado pode te ajudar:
quarta-feira, 5 de outubro de 2011
Converge()
Este é um daqueles programas aparentemente inúteis, porém divertidos.
A grande sacada deste programa é a função converge. Esta função escreve no console uma string convergindo para o meio, isto é:
- letra 0;
- letra n;
- letra 1;
- letra n-1;
...
De forma que o texto passado por parâmetro seja por fim escrito.
Let's to the code:
-----
#include "stdio.h"
#include "windows.h"
int tamanhoString(char *str){
int tamanho = 0;
while(*str){
tamanho++;
*str++;
}
return tamanho;
}
void gotoxy(int x, int y){
COORD c;
c.X = x;
c.Y = y;
SetConsoleCursorPosition (GetStdHandle(STD_OUTPUT_HANDLE), c);
}
void converge( int line, char *msg ){
int i, j;
for( i = 1, j = tamanhoString(msg); i < j; i++, j-- ){
gotoxy(i, line);
printf("%c", msg[i-1]);
gotoxy(j, line);
printf("%c", msg[j-1]);
}
}
int main(){
converge(10, "Testando a funcao converge()");
getchar();
return 0;
}
-----
Como você pôde perceber, utilizamos uma função já implementada: SetConsoleCursorPosition.
Por este motivo, incluímos a biblioteca windows.h e, obviamente, este programa só funciona em ambiente Windows. Para quem utiliza Linux, se não me engano, utilizamos a biblioteca graph.h para usar a função já implementada gotoxy();
Codificar com complemento
E o dia que você quiser codificar algum texto?
Pois bem, temos métodos simples como descolamento de x bits para direita ou esquerda, e também métodos mais bem elaborados que são utilizados no mercado, como a criptografia RSA.
Pois bem, este método que irei apresentar é super simples(e bobo), por isso não aconselho a usar-lo para situações sérias, onde necessite de um certo nível de segurança.
O operador '~' em C complementa os bits de uma variável. Por exemplo:
- Temos o caractere 'A', que vale 65 na tabela ASCII. Fazemos então o complemento a 1, ou seja, trocaremos 0 por 1 e 1 por 0 no valor de 65 em binário ( 65 = 1000001 ).
Teremos então como saída 0111110, que é um caractere desconhecido.
Para voltar ao valor original, basta complementar novamente.
Chega de explicação e vamos ao programa com a função 'encoder':
-----
#include "stdio.h"
void encoder(char *string){
while(*string){
*string = ~*string;
*string++;
}
}
int main(){
char str[] = { "Testando o encoder" };
printf("Texto original: %s\n", str);
encoder(str);
printf("Texto codificado: %s\n", str);
encoder(str);
printf("Texto decodificado: %s\n", str);
getchar();
return 0;
}
-----
O programa imprime a string original e então a codifica.
Imprime a string codifica e decodifica. E imprime novamente mostrando que a string original está de volta.
Assinar:
Postagens (Atom)