Trabalho de Conclusão de Curso

0 comentários
Olá a todos,

Neste link está a minha monografia de final de curso. Deixei bem enxuta, não enrolei. Depois, conto sobre as situações inusitadas que passei. O software só vou disponibilizar quando tirar a patente.

Até mais

p.s: Estou usando o servidor da faculdade e as vezes ele cai.

Desligar computador a Distância no Windows usando Java

0 comentários
Hoje, pensei em uma idéia para desligar meu computador a distância. Consegui e a técnica é bem simples.

Primeiro, no computador que será desligado é necessário que algum código que estabeleça uma conexão em uma porta qualquer (acima da porta 1024) a fim de aguardar a ordem de desligamento.

O desligamento é feito pelo comando "shutdown.exe" do Windows (está na pasta c:\WINDOWS\system32\)

Então, criei uma classe que estabelece uma conexão por TCP na porta 10001. E ela espera somente duas "frases".

Frase 1 - Senha para o desligamento
Frase 2 - argumentos para o desligamento

A senha é importante para que nenhum outro código (além do seu) desligue a máquina.
Os argumentos para o desligamento são os mesmos do comando "shutdown.exe".

A classe que dá a ordem para desligar deve enviar a senha e os argumentos para a porta do computador a ser desligado. E pronto.

A classe ShutListener é o ouviente para ordem. Deixa-a rodando na máquina que vc pretende desligar.

A classe ShutLauncher é o disparador.

p.s: Uso de ShutLauncher

Abra o terminal e vá aonde o .class está e execute
java ShutLauncher 111.111.111.111 -r

O primeiro argumento é o ip da máquina a ser desligado e -r fará com que seja aberta uma janela dizendo o Windows será encerrado dentro 30 segundos.

Argumentos que podem ser passados:
-Abra o terminal e digite: shutdown /?
-Este artigo pode ajudar: link

Comentários:
- Você pode facilmente adaptar para o Linux.
- TCP é usado para garantir que as mensagens enviadas sejam recebidas, pois, TCP implementa transporte confiável. Eu poderia ter usado UDP e implementar o transporte confiável, mas, não estava com disposição para isso.

Arquivo .class

2 comentários
O arquivo com extensão .class é resultado da compilação correta (pelo javac) de um .java.

Hoje, abri um .class em um editor de texto padrão e vi que ele contém texto contendo nome de atributos, herança, parte do código dentro dos métodos e dentre outros.

Então, é possível juntar os dois no modo binário (não o contrário).

Isso justifica o fato de ser possível transformar um .class no seu respectivo .java.

Para comprovar o que digo, o código cria um arquivo em modo binário e insere informação em ascii e binário. Abra o arquivo gerado e veja o resultado

Volto a postar depois do meio de Dezembro

0 comentários
Olá pessoal,

Volto a postar só depois do meio de Dezembro. Atualmente, estou terminando o meu trabalho de conclusão de curso, que vem roubando o meu tempo demasiadamente.

Aguardem que em breve um novo post virá

0 comentários
Olá a todos,

Novamente, o blog encontra-se parado. Tenho muitas idéias para postar, contudo, estou com outras coisas que estão que me deixam com preguiça para organizar um post decente.

Mas, aguardem que em breve escrevo um novo post.

O Algoritmo de Dijkstra (Caminho mais Curto) em Java

7 comentários

English version at the following link:


enprogramminghome.blogspot.com

Olá pessoal,

Em link está um uma classe que programei que possui um único método search(type::TypeSearchEnum, v:int, cost:Graph<Double,Double>):SearchInfo

Vamos discutir a O.O deste método:
Esse método foi projetado para que diferentes tipos de buscas pudessem ser realizadas. A enumeração TypeSearchEnum tem somente o tipo "DIJKSTRA", pois somente programei
esse tipo de busca. Posteriormente, podemos inserir "BFS", "DFS","KRUSKAL",...

Se "TypeSearchEnum" é "DIJKSTRA" é chamado o método privado
-dijkstra(v:int, cost:Graph<Double,Double>):SearchInfo

Obviamente, este último método faz busca de Dijkstra em um grafo definido pela interface Graph&lK,V> (K = V = Double). Porque um objeto Graph<K,V>?
Eu poderia ter criado uma assinatura para cada tipo de grafo ex: "double[][] custos",
"LinkedList<LinkedList<Double>> custos", "ArrayList<ArrayList<Double>> custos", "ArrayList<LinkedList<Double>> custos"...

É possível pensar em uma quantidade enorme de assinaturas, o que implica em multiplicação de código. Agora, imagine que todos esses exemplos de grafos acima implementem uma interface "Graph<K,V>" que contém métodos de acesso apropriados a estrutura de dados. Assim, criando uma única assinatura podemos lidar com esse problema!!! (Polimorfismo pela interface)

Com essa aplicação percebe-se que nós saímos daquela idéia simplista de que uma interface é apenas um contrato. O que vimos acima é a vantagem das interfaces, um
polimorfismo inigualável.

O método acima retorna um objeto SearchInfo (explicarei esse objeto daqui a pouco) que contém os resultados da busca. Quais são esses resultados?
Evidentemente, cada vértice é representado por um inteiro. O resultado de uma busca a partir de um vertice "v" são os menores caminhos dele para TODOS os demais vértices. Um menor caminho não é baseado no número de vértices e sim na menor distância, então, é interessante que também sejam as menores distâncias. E são essas informações que SearchInfo armazena. Esta classe disponibiliza dois métodos públicos para consulta.

getPathFrom(vertex:int):LinkedList{Integer}

Este método retorna o menor caminho do vértice "v" para um vértice "vertex" do grafo. Uma linkedlist é usada devido as diferenças que podem existir no número de elementos em um caminho e também porque os elementos são inseridos por addFirst(e:E) (esse método executa em O(1)).

getPathFrom(vertex:int):double

Este método retorna a menor distância do vértice "v" para um vértice "vertex" do grafo.

A classe SearchInfo é interna a SearchGraphAlgorithms, pública e com construtor privado. Isso foi pensado da seguinte maneira:
Essa classe deveria conter um método que contruisse os caminhos a partir de um vetor de vértices anteriores gerado pelo método de dijkstra. Mas as pessoas não devem acessar esse método externamente, então, ele deveria ser privado. Contudo, a classe SearchGraphAlgorithms deve ser capaz de usar esse método de construção de caminhos, assim, a classe SearchInfo deve ser interna a SearchGraphAlgorithms.
SearchInfo deve ser pública para que código externo seja capaz de acessar os resultados da busca, contudo, o contrutor é criado a partir de uma vetor de menores distâncias gerado pelo método "dijkstra", então, o construtor deve ser privado a código externo e vísivel a SearchGraphAlgorithms, o que é possível pois SearchInfo é interno.

A interface Graph contém somente dois métodos:
+ get(i:int, j:int):V
+ size():int

Como aplicação, criei uma classe MatGraph que monta uma matriz de adjacência a partir de um arquivo formatado:
Ex:
8
0 * * * * * * *
30 0 * * * * * *
100 80 0 * * * * *
* * 120 0 * * * *
* * * 150 0 25 * *
* * * 100 * 0 90 140
* * * * * * 0 100
170 * * * * * * 0

A primeira linha deve conter o número de vértices. As demais linhas contêm as distâncias das adjacências. Quando não existir conexão o símbolo "*" deve ser inserido.

Na Classe Main está a aplicação desses códigos.

A numeração dos vértices começam a partir do zero.

Espero que tenham gostado!

Considerações finais:
Seja correto, caso você copie esse código no seu trabalho/projeto não deixe de indicar a minha autoria. Lembre-se que esse post é muito fácil de achar na internet e possui uma Orientação a Objetos um tanto peculiar, não seja uma pessoa tola.

Algumas Interfaces de java.util, parte 1

0 comentários
Na biblioteca java.util estão definidas importantes classes e interfaces de estruturas de dados para o desenvolvimento de aplicações, além de outros utilitários.

Assim, proponho neste post tratar de algumas interfaces e suas respectivas implementações. Decidi, dividir em várias partes, para que não ficasse cansativo para mim e nem para quem está lendo.

Iterable é uma interface que está em java.lang e define um único método: iterator(void)::Iterator. Primeiramente, vamos discutir porque essa interface está em java.lang. A resposta para essa pergunta é simples, pois, classes de diversas bibliotecas a implementam. Um objeto que implementa Iterator possui a capacidade de iterar sobre a estrutura de dados corrente, posteriormente, explicarei as vantagens de objeto em determinados tipos de coleções e também ListIterator.

A interface Collection herda Iterable, definindo mais métodos para operar a estrutura.
A partir desta última interface existem dois subtipos, Set e List.
Set é uma coleção onde não é permitido elementos duplicados e nem garante a ordem de inserção dos mesmos. Suas implementações mais conhecidas são: TreeSet, HashSet, LinkedHashSet e EnumSet.
List
é uma coleção que permite elementos duplicados e garante a ordem de inserção dos mesmos. Suas implementações mais conhecidas são: Vector (legado), Stack (legado), ArrayList e LinkedList.

Abaixo, segue uma diagrama contendo esses tipos básicos de interface.



Continua...

Programa que abre uma página no I.E

0 comentários
Olá a todos,

Este código em Java, é capaz de abrir uma página no Internet Explorer.
Consiste em abrir o processo do Handler do I.E através de Runtime.getRuntime().

Novo URL

0 comentários
Oi pessoal,

Mudei o URL. Queria que fosse proghome.blogspot.com, mas o endereço estava indisponível. Estava muito esquisito o meu nome completo como URL, faz tempo que já achava isso estranho, só não mudei antes porque o google já tinha armazenado o endereço.

E é complicado falar para alguém que o endereço é "caioboMfimMartins...",pois, gramaticalmente o correto é Bonfim, mas minha família sofre dessa maldição gramatical, hehehe

Acho que está melhor agora.

Abraço a todos!

Só para constar

6 comentários
Quando algum comentário aparece como "excluído pelo autor" é porque a própria pessoa deletou e não eu. Acontece, que já me perguntaram se fui eu que excluí.

Arquivo .bat

1 comentários

English version at the following link:


enprogramminghome.blogspot.com

Um .bat é arquivo texto que podem ser inseridos comandos para serem rodados pelo interpretador do DOS (No Unix/Linux nunca testei um .bat). Quais comandos podemos inserir? Comandos padrões do DOS, nomes de arquivos (incluindo o caminho para diretórios diferentes) e conteúdo da variável path.

Exemplo:
Suponha que no diretório que você está trabalhando contém o arquivo Registro.java, que imprime na tela um registro qualquer, e queremos compila-lo, executá-lo, redericionarmos a saída para "sai.txt" e abrir este último arquivo. Ao invés de fazermos isso manualmente podemos criar o arquivo test.bat com o seguinte conteúdo:

javac Registro.java
java Registro > sai.txt
sai.txt

---FIM---Não incluir essa linha no arquivo

Quando clicarmos em test.bat ou roda-lo por linha de comando tudo será feito automaticamente!!
Isso implica em aumento de produtividade.
Podemos fazer isso para simular um executável de Java. Basta inserirmos no arquivo:
java NomeDaClasse

Não é uma solução que um .exe proporciona, mas é melhor do que ir no prompt e digitar o comando do interpretador.

Driblando a variável path do Windows

1 comentários
Uma técnica muito utilizada por programadores Windows para ganhar produtividade em programação é adicionar comandos de compilação e outros na variável path, para que seja possível executa-los em qualquer diretório.
Contudo, descobri um jeito mais fácil de fazer isso. No diretório c:\Windows\system32
estão todos os programas que rodam no prompt. Se você colar um arquivo executável neste diretório ele passa a ser reconhecido como comando do DOS!!!!
Entretanto, existe uma desvantagem, não é possível colar uma pasta inteira e pedir para que o DOS chame os executáveis desta pasta diretamente.
Isso responde algo que me perguntava antes. Os comandos do DOS estão organizados em lista ou árvore?
Resp: Lista

James Gosling

0 comentários
Esse é o cara da computação, um grande nome.
Sem dúvida nenhuma um artista.

O vídeo já fala por si só.
http://www.youtube.com/watch?v=XiOgCSi1jlg

Códigos atualizados

2 comentários
Bem pessoal,

Como prometi, atualizei nas postagens os códigos que estão no blog.

Abaixo, segue a lista de todos os códigos atualizados.

Grafo de Lista de Adjacência

Interface Graph

Métodos Utilitários de Busca em H.D

Algoritmo caçador de Links em páginas HTML

Teste para Jconsole

Worm consumidor de memória

Teste para Imutabilidade de Strings

Teste para comparação de Strings

Exemplo de operador de canalização em Java

Exemplo de operador de canalização em C++

Só faltou o de intercalação por chave ordenada, pois, eu acho que ele pode ser melhorado.

Se faltou algum código me avisem.

Obrigado a todos e desculpe aqueles que quiseram acessar algum código mas não conseguiram.

O que vocês acham de um material sobre Grafos?

4 comentários
Oi pessoal,

Estou pensando em montar um material contendo um estudo sobre Grafos. Acho que seria legal fazer isso devido a enorme aplicabilidade dessa estrutura em diversos problemas, além de muitos terem dificuldade nos algoritmos.

Além dos conceitos e estruturas computacionais de Grafos os algoritmos que pretendo colocar são:
- Busca em Largura (Bredth First Search)
- Busca em Profundidade (Depth First Search)
- Algoritmo de Árvore Mínima de Espalhamento (Spanning Tree)
- Algoritmo de Kruskal
- Algoritmo de Dijkstra (Esse é o de menor caminho, não do problema dos filósofos)
- Algoritmo de Vetor de Distâncias

Para cada um deles vou por análise e implementação em Java.

Se alguém tiver alguma crítica ou sugestão me avise por aqui ou no e-mail
caiobmar at gmail dot com (Escrevo e-mail em textos html nesse formato para que ele não seja detectado por programas maliciosos, at = "@" e dot = ".")

Não sejam tímidos, opinem!!!

Até mais!

Modelo de Software

3 comentários

Servidor de códigos

0 comentários
Olá a todos,

Para postar código-fonte eu estava usando o servidor http://paste.la/. Mas, descobri que ele apaga postagens antigas, assim, vários dos meus códigos já sumiram.

Então, estarei usando esse servidor http://phpfi.com/ e vamos ver se não acontece o mesmo problema.

Em breve, atualizarei todos os códigos. Só não faço isso agora por que estou com sono(exagerei hoje no almoço).

Quando bater uma vontade atualizo tudo.

Até mais!

USACO

0 comentários
A USACO (USA Computing Olympiad) possui um site de treinamento gratuito para quem deseja participar das olimpíadas de computação americanas.

http://ace.delos.com/usacogate

A idéia do site é show!!!
Inicialmente, é liberado um exercício de programação. Se você resolver, outros três são liberados e assim por diante. É como se passasse de fase.

Agora, vem a pergunta?? Como eles corrigem seus exercícios?
A entrada e a saída de cada programa é por arquivo e cada problema tem sua formatação específica para ambos. Quando acreditar na sua resolução você envia seu código e este será compilado e executado no servidor deles. São realizados 10 testes sobre seu algoritmo. Se algum teste falhar é mostrado na sua tela a falha e o exercício não é considerado correto.

Se tudo der certo eles liberam a solução deles, tipicamente em C.
As linguagens de programação permitadas são: Java, C/C++ e Pascal.

Abaixo, segue um screenshot da minha página. Como vocês podem ver eu não entro a um tempo e fiz poucos problemas, hehehehe.
Os exercícios são difíceis e podem tomar algumas horas.
Agora, decidi retoma-los.



Veja o que eles mesmo dizem sobre os problemas que apresentam para resolver:

"Hal Burch conducted an analysis over spring break of 1999 and made an amazing discovery: there are only 16 types of programming contest problems! Furthermore, the top several comprise almost 80% of the problems seen at the IOI. Here they are:

Dynamic Programming
Greedy
Complete Search
Flood Fill
Shortest Path
Recursive Search Techniques
Minimum Spanning Tree
Knapsack
Computational Geometry
Network Flow
Eulerian Path
Two-Dimensional Convex Hull
BigNums
Heuristic Search
Approximate Search
Ad Hoc Problems
The most challenging problems are Combination Problems which involve a loop (combinations, subsets, etc.) around one of the above algorithms - or even a loop of one algorithm with another inside it. These seem extraordinarily tricky to get right, even though conceptually they are ``obvious''.

If you can master solving just 40% of these problem types, you can almost guarantee a silver medal at the IOI. Mastering 80% moves you into the gold range almost for sure. Of course, `mastery' is a tough nut to crack! We'll be supplying a plethora of problems so that you can hone your skills in the quest for international fame."

O interessante é que desses 16 tipos problemas, especificamente 5 são de grafos:
- Shortest path (Caminho mais curto)
- Mininum Spanning Tree (Árvore Mínima de Espalhamento),
- Network Flow (Fluxo de rede de trabalho)
- Eulerian Path (Caminho Euleriano)

jconsole

0 comentários
Jconsole é um programa que vem no pacote jdk SE o qual permite a monitoração em tempo real de um programa .class que esteja rodando na sua máquina. É muito legal!!!

Faz a Monitoração de:
-Threads
-Heap
-Classes carregadas
-Uso de CPU

Descobri sem querer. Hoje mesmo me perguntava se havia um jeito de monitorar o número de classes que são carregadas por um programa.

Para um teste execute o programa gerado por o código em http://phpfi.com/331385. Em seguida, abra seu terminal e digite jconsole (se estiver na variável path), senão vá até a pasta "bin" do jdk.

Saída do jconsole, em homenagem daqueles que disseram que Java não faz gráfico em tempo real.

Lista de livros

6 comentários
Oi,

Dificilmente, compro um livro técnico para consulta, uso mais como literatura. Leio desde a primeira até a última página, como se fosse uma história.
Desde que entrei na faculdade comprei livros bons e ruins.
Um livro bom me faz sentir várias emoções: Alegria, ecstasy, satisfação e frustação.

Já um livro ruim apenas me leva a raiva. Como uma pessoa é capaz de escrever uma joça e publicar?!?!?!?!!?

Hoje, inseri duas listas de livros favoritos (programação e matemática) que estão embaixo de "Quem sou eu".
Depois irei postar sobre cada um deles.

Os três de matemática estou no começo, mas sei que bons por isso que indiquei. Serão os que mais vou demorar para ler. São mais difíceis, exigem mais reflexão e tenho que fazer os exercícios para quem sabe um dia poder ler coisa mais complicada. Mas, também não estou com pressa.

Vou aproveitar para fazer um protesto contra as pessoas que não gostam de gente que aprecia esse tipo de leitura. Isso é um absurdo!!

Posteriormente, farei crítica aos livros ruins! Não percam!

Até mais.

Eduardo e Mônica

2 comentários
Muito original!!!


Layout novo

6 comentários
Gostei do layout novo. Apesar de azul ser a minha cor favorita o anterior era demasiadamente azul.
Acho que ficou mais legível e visualmente mais agradável.
O Yuri disse que dessa vez eu acertei, então, ele deve ter detestado os demais, hehehe

Como Java cria Objetos

5 comentários
Enfim!!!
O texto está neste link:

http://dfm.ffclrp.usp.br/infobio/ibm_dir/javacriaobj.pdf

O servidor do dfm as vezes cai.

Se tiver algum erro de português ou técnico me avisem.

Em homenagem ao Fábio eu fiz em Latex!! Uma super linguagem de edição de textos. Depois eu vou postar um tópico sobre ela!

Abraço a todos.

Agradecimentos a Hugo César Pessoti por ter posto o arquivo no servidor do mal, hehehehe.

Eu sei que está parado

0 comentários
Olá pessoal,

Eu sei que o blog está meio parado, acontece que ando com provas, trabalhos e T.C.C para fazer. Mas, já estou trabalhando em um texto novo.

Quando eu estiver de férias eu irei postar mais coisas. E espero que tenham gostado do novo layout!!!

Obrigado a todos.

Execução de programas

0 comentários
O link abaixo contém um resumo muito interessante sobre como um código executável é criado. Leiam!! Vale a pena!!

http://wwwusers.rdc.puc-rio.br/rmano/processo.html

Esse documento foi elaborado pelo curso tecnólogo de Processamento de Dados da PUC do Rio de Janeiro.

Worm consumidor de memória

3 comentários
Disse que postaria um tópico sobre a criação de objetos pela JVM. Entretanto, é um tópico que vou levar mais tempo para escrever e como já faz tempo que escrevo nada, resolvi colocar um post sobre worms.
Em
http://phpfi.com/331386

Este é um worm escrito em C que consome em poucos segundos a memória do computador e sobrecarrega o processador com 100% da capacidade. Nunca o deixei executando por mais que 20 segundos. Em um ponto o Windows alerta sobre a baixa quantidade de memória. Assim, memória virtual começa ser alocada. Mesmo após a morte do processo, o computador demora muito mais para realizar tarefas. A solução é reiniciar.

O processo é simples. Apenas um while(true) e dentro em um comando de alocação de memória. É possível inserir um comando de sleep(time::int)::void para alocar aos poucos sem que ocorra sobrecarga da CPU.

Em Java, não é possível a criação deste algoritmo, pois a Máquina Virtual desaloca memória automaticamente e sem contar que existe um limite de memória que a JVM usa.

Imutabilidade de String

0 comentários
Desde a versão 1.5 do Java SE, a classe tornou-se imutável. Cada vez que um valor é atribuido a um objeto String a máquina virtual cria um objeto novo, contudo a referência é mantida. Em situações de concatenação de Strings ou de atribuição, a Máquina Virtual cria um objeto novo, o que é muito custoso. Inicialmente, fiquei triste por ser assim. Entretando, duas novas foram criadas para armazenar Strings de uma maneira mutável.

A StringBuilder e StringBuffer. Este é similar ao primeiro, contudo é Thread-Safe e obviamente mais lento devido ao controle de sincronização.

O código em http://phpfi.com/331387, foi feito para comparar desempenho entre StringBuilder e String.

Abaixo, a saída do programa em ms:
Tempo para atribuicao em String: 16
Tempo para concatenaco em String: 660531
Tempo para atribuicao em StringBuilder: 31
Tempo para concatenao em StringBuilder: 32

Incrível!!
Atribuição em String é mais veloz. Mas a concatenação é extremamente lenta.

Porque?
Seja String str += new String("aaa");

Ele cria uma objeto com "aaa" e cria mais com o valor antigo de str. Para fazer uma concatenação foram criados dois objetos.

Gostaria muito de ver a implementação destas classes.

Espero que tenham gostado e aguardem o próximo tópico. Como Java cria objetos.

Oops...intern não é tão bom assim

4 comentários
A um tempo atrás Fábio Marcon Pallini, vulgo dolly da IBm, se propôs a fazer um código que testasse a eficiência de comparação de Strings entre três métodos do Java.
- java.lang.String.intern(void)::String
- java.lang.Object.equals(Object)::boolean
- java.lang.Object.compareTo(Object)::int

O código encontra-se neste link:
http://phpfi.com/331388

Foi usado como arquivo de entrada a bíblia que está em http://www.gutenberg.org/ebooks/10
1.34 Mb .zip

O resultado foi surpreendente:
Texto lido. 392429 palavras carregadas.
Fazendo comparacao com a palavra: God.
Inicio das comparacoes:

.intern() == : 329 milissegundos.

.equals(String) : 15 milissegundos.

.compareTo(String) == 0 : 0 milissegundos

Incrível e triste ao mesmo tempo.
O intern() foi o pior resultado. O James Gosling disse o contrário.
Contudo, eu vejo que esse método joga a String para o pool, e realmente é mais barato comparar referência de memória do que byte a byte da String, contudo, a comparação que ocorre no pool é que deve deixar lento. Talvez, seja isto que ele quis dizer.

Agradecimentos a Fábio Marcon Pallini.

Chip de Elite

0 comentários

Pool de Strings e um mito desmitificado

4 comentários
public class Ex {
String str1 = new String("musica");
String str2 = "musica";

...
}

Por incrível que pareça, essas duas formas de instanciação de String são completamente diferentes.
A variável str1 tem seu valor armazenado no heap de memória reservado para o objeto que a cria. A segunda como não é criada com o operador new, tem seu valor armazenado em uma região especial da memória de JVM chamada de pool de Strings. E você diz, e daí?

O pool de String foi criada para economizar memória. Como?
String str1 = "musica";
String str2 = "musica";
String str3 = "musica";
String str4 = "musica";

Bytes usados somente para conteúdo: 6 bytes.
Todos estão em posicão diferentes no heap. Contudo, eles apontam para o mesmo valor de memória. Assim, temos economia.

String str1 = new String("musica");
String str2 = new String("musica");
String str3 = new String("musica");
String str4 = new String("musica");

Bytes usados somente para conteúdo: 24 bytes.

Agora, porque ter a opção de gastar memória para aparentemente fazer a mesma coisa? Quando Strings são instânciadas sem new, é necessário procurar o valor recebido no pool, assim, é mais custo por ter comparação.

Agora, vou desmitificar um mito do java, a comparação de Strings. Quem disse que só dá para comparar por equals(String)::boolean?

O método intern()::String da classe String permite comparação por != e ==.
A descrição do método diz que ele retorna a forma canônica da String, como se fosse um tipo primitivo. Contudo, www.paste.la/861 dá a entender que ele cria o conteúdo da String no pool.

James Gosling (criador do Java), afirma em seu livro, A linguagem de programação Java, que comparar por intern()::String é mais eficiente.

Exemplo operador de canalização

2 comentários
A pedidos do Yuri e do Dolly eu fiz um exemplo com dois programas.

Em http://phpfi.com/331389, contém um programa em Java que Lê palavras que uma pessoa digitou até que essa palavra seja "parar". Após isso ele exibe na tela o que foi digitado.

Em http://phpfi.com/331392, contém um programa em C++ que faz tb a mesma coisa.

Executando:

C:\caminho> java Ex
carro
casa
parar

carro
casa

Agora, rodando assim:
C:\caminho> java Ex > saida.txt
carro
casa
parar

As palavras foram armazenadas em saida.txt.

Executando o programa em C++, que tem o nome de rec.cpp:
C:\caminho> rec.exe
Recebendo entrada
pipa
pirulito
parar

pipa
pirulito

Agora, executando assim:
C:\caminho> rec.exe < saida.txt
carro
casa

Acho que ficou legal esse exemplo. Espero que tenham gostado. Muito legal essa interação.
Se seu código será utilizado com canalização apenas tome cuidado para que mensagens de impressão erradas não ocorram, para que não afete a saída canalizada.

Exemplo de código possívelmente errado:

#include "stdio.h"

void main(void) {
int i = 0;

while(i < 10) {
printf("%d\n", i);
i++;
}
printf("Total: %d", i); //possivel problema aqui
}

Suponha que é desejado redirecionar a saída para um arquivo. TUDO que for impresso na tela será canalizado.

0
1
2
3
4
5
6
7
8
9
Total: 10

Vêem o problema? As vezes, mensagens que ficam "legais" na impressão na tela (Total 10), quando canalizados desformatam os dados. Se outro programa for ler o arquivo, Total: 10, pode causar um exceção ou um erro lógico.

E aguardem o próximo tópico de Java: Pool de String.

Grafo de lista de adjacências

0 comentários
Neste link:


Em http://phpfi.com/351140 está um grafo de lista de adjacências que eu fiz. Cresce dinamicamente na memória através de linkedlist. A classe implementa uma interface chamada Graph, em http://phpfi.com/331380. Esta foi pensada em que métodos básicos todo grafo deve ter. Métodos como número de arestas incidentes em um vértice e blá blá blá, podem ser inferidos através dos métodos de get. A única coisa necessária para tal inferência é ter suficiência cerebral.

As assinaturas dos métodos foram criadas de modo que os usuários e leitores da classe os entendem-se de modo intuitivo.

Métodos de acesso aos dados do grafo são sincronizados, já que uma estrutura de dados é comumente acessada por Threads.

Implementa Cloneable, para que seja possível clonar o grafo sem que haja referências comuns de memória. E é serializável.

A estrutura pode ser usada como tabela hash!!

Falta chão para terminar a documentação.

Operadores de canalização

3 comentários
Os operadores de canalização são ferramentas dos Sistemas Operacionais extremamente simples, contudo, poderosas.

Tanto para o Windows como para o Unix\Linux existem esses dois operadores "<" ">".
Eles são capazes de redirecionar a saída de um processo para qualquer coisa que possa servir de entrada ou saída.

Exemplo com esse programinha em C++.

#include "iostream"

using namespace std;

int main() {
cout << "Oi";
return 1;
}

Vamos chama-lo de oi.cpp -> compilando -> oi.exe
Quando é executado a seguinte mensagem aparece na tela:
Oi

Se executarmos dessa forma: oi.exe > teste.txt
A saída do programa, que é a tela, é redirecionada para o arquivo teste.txt!!
Assim, é possível criar um programa que tenha saídas completamente diferentes!!!!


oi.exe > prn faz a saída sair na impressora, nunca testei com prn, li isso em um livro.

Não sei se você captou a importância disto. Espero que sim.

O operador "<" faz o contrário, muda a entrada. Assim, ao invés da entrada ser um arquivo é possível redirecionar para a tela.

O legal é que funciona independentemente da linguagem que o programa foi escrito.

Perdeu playboy

0 comentários

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