Trabalho de I.A

0 comentários
Ano passado fui monitor de Inteligência Artificial. Elaborei um trabalho para os alunos, que está nesse link: http://www.geocities.com/caiobmartins/IAT2.pdf .

A solução não vou postar porque é possível que o professor Augusto use esse trabalho para as novas turmas.

Agora sim!!!

2 comentários
Graças a minha colega Christina Makiya, eu consegui um servidor gratuito.


Neste link: http://www.geocities.com/caiobmartins/preCaioBomfimMartins.pdf
Pus meu pré-projeto de Trabalho de Conclusão de Curso. É um documento pequeno sobre o que é o projeto, metodologias, procedimentos e referências. Foi pedido que fosse em torno de 4 páginas.

As mulheres amam um cara que sabe matemática, haha

0 comentários

Algoritmo de intercalação de arquivos por Chave ordenada

0 comentários
Oi pessoal,

Eu fiz um algoritmo em Java capaz de fazer intercalação entre dois arquivos. Intercalar é misturar de maneira ordernada por uma chave. A classe ficou muito boa! Por enquanto só tem um método. Faz de uma maneira eficiente e economiza memória. Contudo, é importante que os dois arquivos de entrada estejam ordenados pela chave.

O método que faz isso é o
public static java.io.File merge(int charsBegin, int charsEnd,
java.io.File X, java.io.File Y, String path)
throws java.io.IOException

charsBegin - é o indíce onde começa a chave no arquivo.
charsEnd - é o indíce onde termina a chave no arquivo.
java.io.File X - é o objeto do arquivo 1,
java.io.File Y - é o objeto do arquivo 2,
String path - é o caminho aonde será criado o arquivo de saída. Lembre-se que é necessário por o nome do arquivo de saída no path. Veja no código como testei.

O algoritmo com um método main de teste está neste link http://paste.la/459 .
O método "merge" resolve qualquer caso de dois arquivos ordenados. Caso uma exceção de IO ocorra (IOException), ele a trata de maneira apropriada. Essa parte ficou muito legal.

O tratamento depende da fonte da exceção.
- Fonte é em um arquivo de entrada. O respectivo buffer é fechado e a escrita continua para o outro arquivo.
- Fonte é o arquivo de saída. Todos os buffers são fechados, vejam a nota, e a exceção de IO é propagada pelo método chamador para que este a trate da maneira que quiser.

Nota: Os buffers de leitura são fechados para que a Máquina Virtual Java(JVM) não se sobrecarregue com esse serviço. O buffer de escrita é fechado para que ocorra o flush. Em um programa em Java, C++ toda escrita que o programa faz fica na memória do computador até que o ponteiro do arquivo seja fechado ou seja dado flush. Assim, o que está na memória é limpo e escrito no H.D.

Nota: Depois vou criar o método kvias. Este fará intercalação entre N arquivos.

Pré-Projeto

0 comentários
Eu já entreguei o pré-projeto para ser aprovado. Se der tudo certo quero disponibilizar aqui. Eu só estou procurando um servidor para ir deixando os arquivos.
Se alguém souber de algum que seja gratuito e puder me avisar eu agradeço.

Diferenças de desempenho entre compiladores C/C++

2 comentários
Hoje, fiquei com vontade de testar diferença entre usar ou não a palavra chave "register" na declaração de variáveis em C. No livro do Kris Jamsa está ecrito que essa palavra chave faz com que a variável não fique na memória primária do computador e sim em um registrador da CPU, o que teoricamente faz o acesso ser bem mais rápido.

Testei esse programinha, em C:
#include "stdio.h"
#include "time.h"

int main() {
long register i;
long register j;

int begin,
end;

time_t t1,
t2;

char c;

begin = time(&t1);

for(i = 0; i < 100000; i++) {
for(j = 0; j < 100000; j++) {
}
}

end = time(&t2);

printf("%d\npress any key to continue", end - begin);

gets(&c);
}

O compilador gcc gerou um executável que leva 43 segundos para executar. Retirando a palavra "register" o tempo foi o mesmo :(.

Pensei: "Será o compilador? Seria o Windows que não libera registradores para eu usar? Ou é mesmo o computador? resgiter realmente funciona?"

Fiz o que tinha condição de fazer. Mudei para o compilador Borland. E advinhem o resultado? O mesmo...contudo, levou 6 segundos para concluir a tarefa!!!!

Incrível!!!

IDE JCreator

5 comentários
Programar no Wordpad e nos seus amigos pode ser uma tarefa muito cansativa. Além, que o ambiente não é muito amigável. Começa a ficar fácil se perder pelo código.

Então, inventaram a IDEs. Editores de texto específicos para programar. Existem várias.

Não vou mencionar muitas. A primeira é o JCreator. É um cara bem modesto. Excelente, para quem está começando. As maiores (nem todas) vantagens são:

- Edição colorida de texto. Ele deixa em colorido as palavras chave.
- Botão para compilar.
- Tela que mostra os erros de compilação.
- Botão para executar.
- Telas que mostram os métodos e os atributos da classe.
- Permite manipular diversos arquivos ao mesmo tempo através de abas.
- Extremamente leve

Aqui estão três screenshots. Para ter uma visualização decente, clique nas imagens.






Programando em Java

0 comentários
Este tópico aqui é para quem nunca programou em Java antes. Se você não sabe programação, leia o tópico anterior

Esse link aqui https://sdlc4b.sun.com/ECom/EComActionServlet;jsessionid=ED951F73EC4ABE18E9823A72023E1CE2 contém o download da linguagem de programação. É o pacote do desenvolvedor, basicamente contém o compilador javac, interpratador java, gerador de documentação em HTML javadoc, criador de .jar e muitas outras coisas. Faça o download de acordo com seu sistema operacional.

Após isso faça a instalação. Lembre-se aonde é o diretório que você mandou instalar. Por padrão é o C:\Arquivos de programas\Java

O compilador e o interpretador são arquivos executáveis (programas). Assim, se você quer compilar e rodar um arquivo Java é necessário que ele esteja no diretório destes programas. Mas, isso pode mudar. É possível configurar para que esses programas rodem em qualquer diretório.

Para o Windows:

- Abra o painel de controle
- Clique em sistema
- Clique na aba avançado
- Clique em variáveis de ambiente

Nas variáveis de ambiente procure uma chamada Path.
- Se existir Path
- Selecione Path e clique em Editar
- Se no final do valor da variável não tiver um ";" acrescente.
- Após o ";" digite C:\diretório_do_java\jdk_versao_do_seu_java\bin
- Clique em Ok

- Se não existir Path
- Clique em Nova
- No campo de nome da variável digite Path
- Digite C:\diretório_do_java\jdk_versao_do_seu_java\bin

** jdk_versao_do_seu_java - não é nada mais que o sub-diretório de instalação do Java que tem o nome da versão.
Ex: jdk1.6.0_03

** bin é o diretório que contém o compilador, interpretador e todos os outros programas do desenvolvedor

** Só sei configurar variáveis de ambiente no Windows

Feito tudo isso, você já está pronto para programar.

Abra um editor de texto. Pode-ser o Notepad ou o Wordpad. Escreva o seguinte código

public class Teste {
public static void main(String[] args) {
System.out.println("Oi, tudo bem?");
}
}

Salve assim: Teste.java

Abrindo o DOS (prompt-de-comando):
Iniciar -> Todos os programas -> Acessorios -> prompt de comando

Ou
Iniciar -> executar -> digite command

Caminhe até o diretório do seu arquivo .java

Aqui, segue uma lista de comandos que podem ser digitados no DOS.
cd diretorio ---- entra nesse diretório se ele for um sub-diretório
cd .. ---- retrocede um diretório
cd\ ---- Vai para o diretório raiz, geralmente o c:
dir ---- lista todos os arquivos e sub-diretórios do diretório atual

Chegando na pasta aonde está seu .java, digite no DOS para compilar:
javac Teste.java

Se não houver falha de compilação um arquivo .class será gerado.
Após isso digite:
java Teste

A tela exibirá a seguinte mensagem:
Oi, tudo bem?

Para quem não está habituado a isso, pode ser confuso. Mas é tranquilo.

A próxima postagem será sobre IDEs para Java. Interface para ambiente de desenvolvimento. Muito melhor do que programar no Wordpad e rodar pelo terminal.

Conversar com o computador

0 comentários
Programar é simplesmente conversar com o computador. Ele é como uma pessoa que só sabe seu idioma nativo, a linguagem de máquina (código binário). Esta é extramamente difícil para humanos lidar. Nós temos facilidade de memorizar palavras e construir frases de natureza alfabética. Porque frases alfabéticas possuem poucas variedades de sentido.

O que é mais fácil para você decorar e entender?
1 - "Olá, meu nome é Caio e tenho 21 anos"

2 - "12367181822929292929292929292004004100"

Eu nem sei o que significa a frase 2. Pode ser muita coisa, depende do contexto.

A linguagagem de máquina é composta somente por 0 e 1.
103 -> linguagem de máquina -> 01100111

Porque é desse jeito? Simples, porque as unidades básicas de processamento do computador, as portas lógicas, operam em duas voltagens 0V e 5V. Respectivamente, 0 e 1. Sobre essas circunstâncias é mais fácil trabalhar com binário.

Agora, imagine nós conversamos com o computador em binário. Inferno é a palavra para descrevermos isso. E como conversa? Através de mudanças diretas nas voltagens do computador, nas placas de hardware.

Então, alguns caras inventaram modos mais simples. A pessoa escreve em texto naquela linguagem e manda para um tradutor, o qual passa o texto para linguagem de máquina. Este é chamado de compilador.

Atualmente, existem muitas linguagens de programação. Basicamente, são separadas em linguagens de baixo e alto nível.
Programar em baixo nível significa escrever programas em linguagens muito "próximas" do computador.
Ex: Assembly

Nesta linguagem a pessoa tem que dar instruções específicas para o processador. Como qual seguimento de memória acessar, com quais registradores trabalhar e muito mais.

Programar em alto nível significa ficar mais "distante" do computador.
Ex: Java, C/C++

O compilador destas linguagens são muito mais inteligentes. O processamento é bem mais intenso. Contudo, isso é transparente para quem está programando.

Exemplo:

Código de soma de matrizes.

Assembly - retirado de http://www.forumpcs.com.br/viewtopic.php?t=42554, postado por "Target"

TITLE Matriz
.MODEL SMALL
.STACK 100H
.DATA
LF EQU 0AH
CR EQU 0DH
MSG1 DB 'Digite a primeira matriz:',LF,CR,'$'
MSG2 DB 'Digite a segunda matriz:',LF,CR,'$'
MSG3 DB 'A matriz soma e:',LF,CR,'$'
MATRIZ1 Dw ?,?,?
Dw ?,?,?
Dw ?,?,?

MATRIZ2 Dw ?,?,?
Dw ?,?,?
Dw ?,?,?

.CODE
MOV AX,@DATA ;inicializando DS
MOV DS,AX

;matriz 1
LEA DX,MSG1
MOV AH,9
INT 21H
XOR BX,BX ;zerando BX e SI
XOR SI,SI
MOV CX,3

M1: MOV AH,1
INT 21H
MOV MATRIZ1[BX][SI],Ax ;pegando os dados da primeira matriz
MOV AH,2
MOV DL,' '
INT 21H
ADD SI,2
DEC CX
JNZ M1

MOV AH,2 ;pulando de linha
MOV DL,CR
INT 21H
MOV DL,LF
INT 21H

MOV CX,3
ADD BX,2
MOV AX,4
CMP BX,AX
JBE M1 ;salta para M1 se BX for menor ou igual a 4


MOV AH,2 ;pulando de linha
MOV DL,CR
INT 21H
MOV DL,LF
INT 21H

;matriz 2
LEA DX,MSG2
MOV AH,9
INT 21H
XOR BX,BX ;zerando BX e SI
XOR SI,SI
MOV CX,3

M2: MOV AH,1
INT 21H
MOV MATRIZ2[BX][SI],Ax ;pegando os dados da primeira matriz
MOV AH,2
MOV DL,' '
INT 21H
ADD SI,2
DEC CX
JNZ M2

MOV AH,2 ;pulando de linha
MOV DL,CR
INT 21H
MOV DL,LF
INT 21H

MOV CX,3
ADD BX,2
MOV AX,4
CMP BX,AX
JBE M2 ;salta para M2 se BX for menor ou igual a 4

;somando
LEA DX,MSG3
MOV AH,9
INT 21H
XOR BX,BX ;zerando BX e SI
XOR SI,SI
MOV CX,3

SOMA: XOR DX,DX
XOR AX,AX
MOV DX,MATRIZ1[BX][SI] ;somando as matrizes
MOV AX,MATRIZ2[BX][SI]
ADD AX,DX
SUB AX,30H
MOV DX,AX
MOV AH,2
INT 21H
MOV DL,' '
INT 21H
ADD SI,2
DEC CX
JNZ SOMA

MOV AH,2 ;pulando de linha
MOV DL,CR
INT 21H
MOV DL,LF
INT 21H

MOV CX,3
ADD BX,2
MOV AX,4
CMP BX,AX
JBE SOMA ;salta para SOMA se BX for menor ou igual a 4


MOV AH,4CH ;finalizando para o DOS
INT 21H

END

Em Java o mesmo código:

public class MatrizSoma {

private byte[][] matriz;

public MatrizSoma(byte[][] matriz) {
this.matriz = matriz;
}

public byte[][] somar(byte[][] mt) {
byte[][] mat = new byte[mt.length][mt[0].length];

for(int i = 0; i < matriz.length; i++) {
for(int j = 0; j < matriz[i].length; j++) {
mat[i][j] = (byte) (matriz[i][j] + mt[i][j]);
}
}

return mat;
}
}

Percebeu as diferenças?
Em linguagens de alto-nível o código é mais enxuto e mais fácil de entender. Na maioria delas a única coisa que você tem controle é sobre o que fazer e não de como fazer. Perde-se o controle do que internamente está sendo feito.

Existem linguagens de alto-nível que estão mais perto do computador do que as outras.
C/C++ é mais baixo-nível que Java

Google

0 comentários
Estou extramamente curioso a respeito do algortimo de indexação de links do google. Será que usa essa lógica? Se usa algo com o mesmo tempo de execução, os computadores que executam-o devem ser extramente potentes. Quando eu estiver com vontade criarei um algoritmo que sai pela rede caçando links.

Erros no algoritmo de baixo

0 comentários
Descobri dois erros no algoritmo debaixo. Já corrigi. Está nesse link aqui a versão corrigida: http://paste.la/376

E também otimizei na fase 1. Ele não lê mais caractéres "\n" (indicam nova linha). Essa filtragem possibilitou a correção de um importante erro.

Erro 1:
As vezes a página pode ficar nesse formato:
a
href="site"

Assim, é lida seguinte sequência: a\nhref="site". Por causa desse \n o algoritmo não achava a sequência certa.

Erro 2:

Quando uma página referencia outra da seguinte maneira:
Ex:

"site" -> "site/cadastro.html"
Na sintaxe HTML esse tipo de referencia é escrito assim:

a href = "cadastro.html"
Quando ele lia isso tentava criar um objeto URL somente com: documentacao.html, nisso uma exceção é disparada, porque não existe uma página desse jeito. Agora, ele concatena com o nome do site. Assim, um URL correto é formado.

p.s: Na fase 1, mandei ele ler e converter cada caractér para minúsculo. Assim, não corre o risco de não achar nada em páginas com comandos HTML em maiúsculo.
Testei na página do professor Rafael Rosales. Leva mais ou menos 30 segundos.
dfm.ffclrp.usp.br/~rrosales

Algoritmo de indexação de links

2 comentários
Olá a todos,

Hoje, criei um algoritmo em Java que é capaz que filtrar links de uma página HTML. Pus neste link http://paste.la/373
Deu vontade de fazer isso quando um amigo meu disse que o google tem um programa que sai filtrando links pela rede.

Piada

3 comentários
Muito nerd, porém, muito original.
Estava tendo uma festa de funções matemáticas. Estava o seno, cosseno, o logarítmo...
Era puro agito.
Nisso, o logarítmo viu a exponencial no cantinho do salão, toda triste e isolada.
O logarítmo falou:
"E ai exponencial!!!!! Vamos lá com o pessoal. Vamos integrar."
A exponencial respondeu:
"Se eu integrar...dá na mesma..."

Porque a integral da exponencial dá ela mesma.

Certificados da USP e álgebra

2 comentários
Como a USP é desorganizada para enviar certificados. Fiz três cursos no IME-USP no ano retrasado. Até agora só chegaram dois certificados e um deles levou mais de um ano.
Isso também aconteceu na semana da informática biomédica, um ano para receber o certificado.

Levei o maior susto quando vi que o curso de álgebra linear foram 120 horas. Eu tinha calculado 40. Só errei três vezes na conta XD. Mas, esse curso foi o melhor de todos, simplesmente animal!!!!!!!!!!!!!!

Eu acho matemática interessante, só que não chego a gostar e não costumo gostar de falar sobre ela. Contudo, hoje vou abrir uma exceção, pois trata-se de um assunto muito legal.

Álgebra Linear é uma ferramenta matemática muito poderosa. Ela define 8 axiomas (4 de soma e 4 de multiplicação) de consistência de um espaço vetorial. Uma vez que um espaço cumpre essas regras é possível brincar a vontade com ele. Vou dar um exemplo.

Nós estamos habituados a trabalhar com o espaço vetorial dos reais. Nele, existe a soma e a multiplicação usuais.
1 + 1 = 2
2 . 2 = 4

Sendo n1 e n2 dois números reais quaisquer, existem espaços que podem fazer a seguinte coisa:

n1 (+) n2 = n1 * n2

n1 (.) n2 = n1 + n2

O que isso quer dizer? Seja n1 = 3 e n2 = 4

n1 (+) n2 = 3 (+) 4 = 12
n1 (.) n2 = 3 (.) 4 = 7

Incrível, não?

Também é possível fazer transformações de coordenadas entre espaços, as transformações lineares. Exemplo:

Nós humanos somente temos a percepção visual de três dimensões. Contudo, existem N dimensões. Como fazemos para "ver" esses pontos? Não podemos simplesmente imaginar, o que é possível fazer é "ver" a sombra desses caras.

Seja o espaço R4 e quero obter os pontos em R3 (3 dimensões).
Definimos uma função de transformação linear que:
R4 -> R3

(x, y, z, t) => (x + y, y + t, t + x + y +z)

Então, seja no R4 as seguintes coordenadas: (4, 3, 1, 2)
Usando a transformação dada obtemos em R3:

(4 + 3, 3 + 2, 4 + 3 + 1 + 2) = (7, 5, 10)

Claro, que existem regras para criar essas funções.

Essas dimensões extras podem ser muita coisa. Cores, tempo e etc.
Álgebra Linear é muito maior que isso.
Acho que vale a pena estudar quem for da computação ou da matemática.

Só por linha de comando

1 comentários
O duro é que Java roda só por linha de comando. Está certo que existe um "migué" que é fazer um .jar que abre com a JVM através de duplo clique no arquivo. Só que isso é muito fraco e facilmente desconfigurável, é só alguém configurar algum compactador de arquivos para abrir arquivos .jar.
Talvez eu descubra algum aplicativo que gere um Java executável.
É extremamente chato pedir para um cliente que está habituado com o Windows abrir o DOS, caminhar até o diretório da aplicação e digite o comando de rodar: java arquivo.
Para a minha felicidade os usuários do ghmm já estão habituados com isso. Então, não será um choque para eles.

Erros

0 comentários
Nossa, sempre que releio o que escrevi acabo achando erros de semântica. Quem clicar no link que eu pus no post abaixo verá no log do site algumas postagens minhas com o mesmo código. Porque sempre que acho algum erro de inglês ou algum comentário de código incoerente.

O duro que é releio depois que posto. Mas daqui para frente eu vou mudar isso. Dá vergonha escrever mal.

Algoritmo de busca em H.D

0 comentários
Olá pessoal,

Neste link aqui http://phpfi.com/331382, colei uma classe Java que eu fiz para buscar arquivos e diretórios em um H.D.
Muito simples e eficiente. Contém um método main para teste.

Novo título

0 comentários
Conversei com o professor Rafael Rosales e nós entramos em consenso sobre o nome do projeto. Será "Uma interface para ghmm". Eu gostei, ficou mais apropriado.

Ratings:

Avaliação deste artigo

Copyright © Programming @ home