Autor: valbertovc

É especialista em Qualidade e Testes de Software e possui interesse em aprender sobre desenvolvimento WEB com Java, Ruby on Rails, Python e Django, Engenharia de Software, modelagem de processos de software e demais assuntos relacionados a Tecnologia da Informação.

Instalação do Ruby no Windows

Ruby é uma linguagem fácil de aprender. As tarefas diárias são simples de codificar, manter e incrementar. Quando você se depara com problemas aparentemente difíceis, acaba por resolvê-las de forma muito mais simples do que você imaginava. Ruby segue o princípio da menor surpresa – as coisas funcionam da forma como você espera, com poucas exceções. Isso realmente faz a diferença quando está programando. (The Pragmatic Programmer’s Guide)

Para que você consiga desenvolver utilizando a linguagem de programação Ruby, é necessária a instalação dos componentes básicos para que a linguagem seja entendida pelo seu computador. Neste caso, o interpretador e o gerenciador de pacotes são suficientes.

Instalando o Interpretador

Estou considerando que você não tenha nenhuma versão do Ruby instalada no seu computador. Caso tenha, é importante você observar a versão atualmente instalada (digite o comando: ruby -v no prompt de comando). Quando escrevi este post, a mais nova versão do Ruby era a 1.9.2 (recomendo). Se você tiver problemas ao instalar ou executar seus programas, você pode desinstalar a versão anterior ou usar o Pik para gerenciar as versões do Ruby já instaladas. Agora, vamos à parte mais interessante, acesse o site, baixe e instale o interpretador do Ruby (Windows installer) observando as versões recomendadas.

Instalando o Gerenciador de Pacotes (Gem)

Em seguida baixe a mais nova versão do RubyGems. Após fazer o download do RubyGems, você deverá descompactar em qualquer pasta do seu computador. Abra o prompt de comando, navegue até a pasta onde o RubyGems foi descompactado e instale com o comando:  ruby setup.rb

  • Fiz o download do arquivo rubygems-1.8.5 na pasta C:\Downloads
  • Descompactei
  • Entrei no prompt de comando e naveguei até a pasta: C:\Downloads\rubygems-2.8.5 como na imagem

Agora é só aguardar o final da instalação e você já terá o Ruby e o RubyGems instalado e pronto pra usar. Se quiser conferir qual a versão instalada atualmente é só digitar ruby –v ou gem –v no prompt de comando. Agora você tem comandos para executar seus programas em Ruby e instalar novas bibliotecas usando o gerenciador de pacotes (gem). Se quiser fazer um teste agora:

  • Abra o bloco de notas
  • escreva: puts “Hello world Ruby!”
  • Salve no C:\ com o nome: programa.rb
  • Vá para o prompt de comando
  • Digite ruby C:\programa.rb
  • Será exibido: Hello world Ruby!

Pronto, você já escreveu e executou seu primeiro programa em Ruby.

Anúncios

Rake task personalizado

Um dia precisei criar uma rake task para automatizar a importação de arquivos CSV em uma aplicação em RubyOnRails (2.3.8), então resolvi criar este post para ajudar a pessoas com o mesmo objetivo e que procuram criar rake tasks personalizadas.

A estrutura apresentada no código abaixo apresenta um exemplo de importação de um arquivo CSV de funcionários, que contém 3 campos:

  • nome – string
  • salário – float
  • cpf – string

Antes de continuar, explicarei rapidamente sobre os arquivos CSV. Arquivos CSV (comma-separated values) são arquivos de dados que guardam valores separados por vírgula. Assim a linha abaixo é um exemplo válido de uma linha do arquivo de funcionários.

"Fulano de tal",123.45,"987.654.321-00"

Pronto, agora você já sabe o que é um arquivo CSV e qual a estrutura do arquivo que será importado pela nossa rake task personalizada. Só lembrando que o script foi feito para rodar na versão 2.3.8 do Rails, mas não está limitado a ele, você pode usar em versões mais atuais, com as devidas adaptações, caso necessite.

# DATA: 10/06/2011
# PROGRAMADOR: Valberto Carneiro
# OBJETIVO: Criar um script para atualizacao dos salarios dos funcionarios e
#           criacao de novos salarios, caso a matricula do funcionario ainda
#           nao exista na base de dados.
# CONSIDERAÇÕES:
#   1. Aplicação em Rails (>= 2.3.8)
#   2. Conexão com banco de dados configurada
#   3. Tabela "funcionarios" criada e populada
#   4. Campos da tabela: id:integer, nome:string, salario:float, cpf:string

# app/models/funcionario.rb

class Funcionario < ActiveRecord::Base
# os metodos de acesso sao criados automaticamente pelo ActiveRecord
end

# lib/tasks/minhas_tarefas.rake

require 'csv'

namespace :tarefas do

  desc "Importa arquivo CSV, Parametro: PATH=/caminho/completo/para/o/arquivo.csv"

  task :importar_funcionarios => :environment do
    csv_file = ENV["PATH"]

    puts "Verificando a existência do arquivo..."

    unless File::exists?(csv_file)
      puts "Arquivo nao encontrado, verifique se esta correto e tente novamente."
      return
    end

    puts "Arquivo encontrado!"
    puts "Executando importacao, aguarde..."

    CSV.open("#{csv_file}","r") do |linha|
      nome    = linha[0]
      salario = linha[1]
      cpf     = linha[2]

      funcionario =  Funcionario.find_by_cpf(cpf)

      if funcionario
        funcionario.salario = salario
      else
        funcionario = Pessoa.new(:nome => nome, :salario => salario)
        funcionario.save
      end
    end
    puts "Importacao concluida com sucesso!"
  end
end

Estruturas de Dados

O estudo sobre estruturas de dados é algo muito interessante para todos os que gostam de programar ou de procurar boas soluções para resolver problemas computacionais. Mas não é só no meio digital que esses estudos são aplicados. Filas de banco, organogramas, e produtos empilhados em uma prateleira de um supermercado são exemplos de estruturas que possuem regras para que você possa interagir para resolver um problema real.

Podemos fazer um comparativo bem simples entre um caixa de um banco e um processador de um computador. Vejam que, no banco não há caixas suficientes para atender prontamente a todos os que chegam para serem atendidos. Da mesma forma ocorre no computador. Internamente há muitas tarefas a serem realizadas e cada tarefa deve esperar em uma fila para que possa utilizar o processador. A diferença maior está na velocidade em elas são atendidas.

Observe o funcionamento geral de uma fila: chegue, espere no final da fila até você ser atendido. Esse mecanismo resolve o problema de poucos caixas para atender um número grande de clientes no banco. Agora veja uma pilha: coloque item por item, um sobre o outro. Quando for retirar, vá tirando item por item, mas sempre os de cima. Se puxar qualquer item que não seja o de cima, a pilha pode desabar. É com esse propósito que as estruturas de dados são usadas para resolver problemas do mundo real, no meio computacional.

“Na Ciência da computação, uma estrutura de dados é um modo particular de armazenamento e organização de dados em um computador de modo que possam ser usados eficientemente.” [1,2,3] Além disso é usado para estudar “os diversos mecanismos de organização de dados para atender aos diferentes requisitos de processamento”[4], ou seja, “são formas genéricas de se estruturar informação de modo a serem registradas e processadas pelo computador e só adquirem significado quando associadas a um conjunto de operações, que visam, de um modo geral, manipulá-las (algoritmos).” [5]

Bom, o que você deve ter entendido (eu acho) nesse paragrafo anterior é que as estruturas de dados são formas bem definidas de organizar a informação em um computador. Além disso, essas estruturas possuem formas de acesso para que você possa manipular a informação dentro da estrutura. Quando uma pessoa constrói uma estrutura, na verdade ele está definindo meios para que você possa utilizá-la, ou seja, a API da estrutura de dados.

Além desses conceitos, outros conceitos que são relativos à este são os tipos de dados e os tipos abstratos de dados, que podem, de uma maneira geral, se referir a mesma coisa, mas possuem definições e conceitos bem diferentes.

Referencias

  1. Paul E. Black (ed.), Data structure. Dictionary of Algorithms and Data Structures. U.S. National Institute of Standards and Technology, 2004. Versão online .
  2. Data structure. Encyclopædia Britannica (2009) Online
  3. http://pt.wikipedia.org/wiki/Estrutura_de_dados
  4. http://www.dca.fee.unicamp.br/cursos/EA876/apostila/HTML/node10.html
  5. http://www.univasf.edu.br/~marcelo.linder/arquivos_ed1/aulas/aula1.pdf

Lista Encadeada

Uma lista encadeada é um modelo conceitual para a representação de uma sequência de informações armazenadas de forma dinâmica na memória de um computador. Cada informação é armazenada em uma célula ou nó da lista: o primeiro elemento na primeira célula, o segundo na segunda e assim por diante. A estrutura de uma lista encadeada é geralmente representada por uma caixa divida em dois espaços, um para armazenar a informação e o outro para guardar o endereço da próxima caixa.

Existem vários tipos de listas encadeadas disponíveis na literatura, só para citar:

  • Lista encadeada
  • Lista duplamente encadeada
  • Lista circular
  • Pilha
  • Fila
  • Árvores Binárias

A principal diferença entre essas estruturas são as regras e restrições de acesso que elas possuem. Logo, o programador deve analisar as características de cada uma e ver qual se adapta melhor na resolução do problema. Eu poderia apontar aqui um conjunto vasto de vantagens e desvantagens de cada uma, mas isso seria uma discussão um pouco extensa. Vou deixar essa discussão para os próximos posts. Se desejar observar um exemplo de implementação de algumas dessas estruturas, consulte este repositório de código com implementações em C.

Programa que Identifica Palindromes

/* Data: 24/02/2011
 * Programador: Valberto Carneiro
 * Objetivo: Faça um programa que leia uma string do teclado e diga se ela é
   palíndrome. Uma string é palíndrome quando pode ser lida tanto
   de trás pra frente quanto de frente para trás e possui exatamente
   a mesma seqüência de caracteres. Ex.: ASA, SUBI NO ONIBUS.
   Desconsidere os espaços.
   Defina uma função chamada Palindrome que receba uma string como
   parâmetro e retorne um boolean no seu programa.
   Dica: Use a função do exercício 1.
 */

#include<stdio.h>
const int FALSE = 0;
const int TRUE = -1;

int is_palindrome(char *texto) {
  int palindrome = TRUE, tamanho = strlen(texto), y = 0, x = 0;

  //elimina brancos
  while(x < tamanho) {
    if(texto[x] == ' ') for(y=x; y < tamanho; y++) texto[y] = texto[y+1];
    x++;
  }

  tamanho = strlen(texto);

  //compara os caracteres
  for(x = 0; x < tamanho ; x++) {
    //printf("%c = %c\n", texto[x], texto[tamanho-1-x]);
    if (texto[x] != texto[tamanho-1-x]) {
      palindrome = FALSE;
      break;
    }
  }
  return palindrome;
}
int main(){
  char texto[100];
  printf("Escreva uma string para sabermos se ela é palindrome: ");
  gets(texto);
  printf("Resultado: %s", is_palindrome(texto) == FALSE ? "nao" : "sim");
  getch();
}

Strings em C

Introdução

A línguagem C é considerada de nível médio, ou seja, uma linguagem de programação que se aproxima da linguagem humana, mas que também utiliza explicitamente características de “linguagem de máquina”. As Strings em C não trazem abstrações e facilidades que escondem alguns detalhes como:

  • contagem de caracteres
  • tamanho da variável que armazenará a string
  • caractere de terminação entre outros.

Como é uma string em C?

“Uma string de caracteres em C é apenas uma matriz de caracteres” [1], ou seja, para se conseguir armazenar uma string em C, é preciso declarar um array de char com o tamanho máximo que a sua string pode ter.

char variavel[100];

É importante saber que na string acima, você pode armazenar até 99 caracteres. Mas por que? Em C, um dos espaços string guarda o caractere de terminação que serve também para contar o tamanho da string na matriz de caracteres. “As operações de I/O de strings de caracteres (gets, puts, etc.) são implementadas em <stdio.h> e um conjunto de funções de manipulação de strings de caracteres bastante simples é implementado em <string.h>.” [1]

Ler strings em C

Há mais de uma maneira de se ler strings em C, uma delas é utilizando o comando scanf. Veja algumas características:

  • Lê até o primeiro espaço em branco – Você pode digitar uma frase inteira, porém o que a variável armazenará será a primeira sequência de caracteres até o espaço em branco. Use o scanf quando necessitar armazenar strings sem espaços como: logins, senhas, e-mails, urls etc. Abaixo há um exemplo comum de utilização:
  • Não precisa indicar o “&” antes da variável, como se faz quando queremos ler inteiros, por exemplo,  pois o vetor de caracteres já é um endereço de memória que aponta para a primeira posição. Veja o exemplo. [4].
  • Aceita vários tipos de parâmetros para formatar, delimitar ou restringir a leitura de determinados caracteres.
scanf("%s", texto); //lê uma string
scanf("%d", &valor); //lê um inteiro
scanf("%[A-Z]s", frase); //lê apenas caracteres entre A a Z. Para no primeiro caractere fora desse intervalo
scanf("%[^\n]s", frase); //lê qualquer caractere inclusive espaços (igual ao comando gets();)
scanf("%50[^\n]s", frase);// lê apenas 50 caracteres

strcpy

é usado sempre que se deseja copiar uma string em outra. Esse comando é necessário, pois como as duas strings são arrays de caracteres, cada caractere de uma string é copiada para a outra string. Uma por uma. Trabalho árduo.

strcpy(destino, origem);

strcmp

é usado quando se deseja comparar strings. Aqui, o valor de retorno pode ser:

  • zero (0): caso as duas strings sejam iguais
  • negativo (-1): caso a primeira string seja menor que a segunda
  • positivo (1): caso a primeira string seja maior que a segunda

Esse valor usado na comparação para determinação de maior menor ou igual é o código ASCII do caractere comparado. Esse comando varre toda a string comparando caractere  por caractere.

#include
#include

int main() {
  char s1[100],s2[100];
  gets(s1);
  gets(s2);
  if (strcmp(s1,s2)==0)
    printf("igual\n");
  else if (strcmp(s1,s2)<0)
    printf("s1 menor que s2\n");
  else
    printf("s1 maior que s2\n");
  return 0;
}

strlen

esta função retorna o tamanho da sua string. Ele identifica o tamanho da sua string assim que encontra o caractere de terminação, o “contra-barra zero”.

char nome[] = "Maria da Silva";
int s = strlen (nome);
// s conterá o valor 14

strcat

concatena duas strings, adicionando o conteúdo da segunda ao final da primeira, além do terminador (). Note que a primeira string deve ter espaço suficiente para conter a segunda, para que não ocorra um “estouro de buffer” [2].

char nome[50] = "Maria";
char sobrenome[] = " da Silva";
strcat (nome, sobrenome);
// agora nome contém "Maria da Silva"

Exercícios

[3] possui uma excelente lista de exercícios.

Referências

[1] Marshall Brain. String de Caracteres. <http://informatica.hsw.uol.com.br/programacao-em-c35.htm&gt;

[2] ___. Programar em C/Strings. <http://pt.wikibooks.org/wiki/Programar_em_C/Strings&gt;

[3] Unicamp. Algoritmos e Programação de Computadores. <http://www.ic.unicamp.br/~rodolfo/Cursos/mc102/1s2003/exercicios4.html&gt;

[4] Islene Calciolari Garcia. Manipulação de Strings.  <http://www.ic.unicamp.br/~islene/mc102/aula17/aula17.pdf&gt;

Estrutura de um programa em C com loop de reexecução

Revendo alguns conceitos de C e pesquisando nuns sites por aí, encontrei um exeplo que acredito ser pático pra quem quer fazer rapidamente um programa em C.

Aqui é uma estrutura básica, copie e cole no seu arquivo.c, edite da forma como desejar e compile. Pronto, vc terá um programa que só para quando vc quer. 😀

#include<stdio.h>
#include<conio.h>

void main(void) {
  short int rodando;
  do {
    // DIGITE SEU CÓDIGO AQUI.
    printf("\nDigite 1 para manter o programa rodando. ");
    scanf("%d", &amp;rodando);
  } while(rodando==1);
}