quarta-feira, 24 de agosto de 2016

O que são arquivos ISO?

Fala galera que acompanha o blog...


A sigla ISO vem de International Organization for Standardization (Organização Internacional para Padronização) e vem do sistema de arquivos ISO 9660, usado em CDs e DVDs, no caso do sistema Mac OS X a extensão utilizada é CDR.


ISO é um formato de arquivo que contém todas as informações sobre o conteúdo de um CD ou DVD, seja ele contendo qualquer tipo de conteúdo de qualquer formato de áudio, vídeo ou dados. A principal funcionalidade deste formato é ser simples, basta abri-lo em um programa e seu conteúdo pode ser copiado ou executado sem a necessidade da mídia física.

O que são arquivos ISO?


Antes, somente programas específicos gravavam uma imagem em DVD ou CD. Atualmente, todos os programas gravadores são capazes de ler o seu conteúdo e gravá-los.

Arquivos ISO possuem exatamente o mesmo conteúdo de uma mídia física. Todos os dados da imagem são mantidos sem nenhum tipo de compressão, evitando possíveis perdas de de informação, ou seja, um arquivo ISO possui o mesmo tamanho da sua mídia física.

Para acessar o seu conteúdo sem gravar a imagem em um disco é utilizando alguns programas especifico que realizaram a emulação do arquivo. Dessa forma o computador interpretara o seu arquivo como se fosse um mídia física inserida no leitor de CD/DVD. Os programas mais conhecidos são: Virtual CloneDrive, CD Anywhere e o MagicDisc.

Atualmente é possível baixar oficialmente e de graça imagens ISO do pacote Office e dos sistemas operacionais do Windows, aqui.

Importante: Arquivos ISO nada tem a ver com o formato ISO encontrado em câmeras fotográficas, onde o seu significado é totalmente diferente, uma breve definição:


ISO é a sensibilidade do filme (ou no caso da fotografia digital, do sensor) à luz. Quanto menor o número, menor é essa sensibilidade. Consequentemente, é preciso muito mais luz para a fotografia ficar clara. Se o ISO é aumentado, a sensibilidade do filme, ou sensor, aumenta também e com menos luz é possível captar a cena desejada.

Até a próxima pessoal!

segunda-feira, 22 de agosto de 2016

Qual a diferença entre atributo e váriavel?

Fala galera que acompanha o blog...

Já respondendo a pergunta de bate e pronto para não perder tempo lendo todo o post "Qual a diferença entre atributo e variável?"
.
.
.
.
.
NENHUMA, atributo e variavel se referem a mesma coisa.

Qual a diferença entre atributo e váriavel?


Se você já programou com alguma linguagem que não era orientada a objetos, deve achar estranho o termo atributo pois, está acostumado com o termo variável.

Atributo e variavel são a mesma coisa em questão de funcionalidade. Ambos possui tamanho definido de acordo com o tipo de dado que será armazenado, por exemplo, carácter, string, número, ponto flutuante... e ambos possuem endereço de memória.

Em linguagem orientadas a objetos costuma-se utilizar o termo atributo, que é nada além do que uma variável que esta dentro de uma classe. Dizemos que a classe X possui o atributo Y, por estar contida na classe.

Parece um post sem sentido, mas existe muitas pessoas que ainda estão migrando do paradigma estruturado para o OO e tem essa dúvida, porque convenhamos essa área tem vários nomes pra uma mesma coisa.

É isso pessoal e até a próxima pessoal!

sábado, 20 de agosto de 2016

Campanha anti IF

Fala galera que acompanha o blog...

O titulo desse post é um pouco estranho e até meio assustador, mas é exatamente isso que a campanha sugere "Evitar o uso do IF". Mas é claro que não é elimina-lo por completo dos nossos códigos, mas fazer um uso consciente visando a qualidade e arquitetura do nosso projeto.

Campanha anti IF


Confesso que achei estranho em um primeiro momento, mas a curiosidade e o interesse em como fazer um uso "correto" da estrutura da condicional if prevaleceu.
A campanha conta com poucos participantes, não é muito conhecida, mas participaria com certeza de eventos e palestras sobre o assunto.

Acessando o site na aba "Experiences" é possível encontrar o seguinte trecho (tradução livre):
Neste site você vai encontrar posts e vídeos que mostram como lidar com IFs ruins e transformar um design ruim em uma oportunidade para crescer o seu software de uma forma saudável.

Para saber mais sobre essa campanha e quem sabe até aderir, acesse o site antiifcampaign.

Enviei um email pedindo mais informações sobre onde consigo material para estudar sobre o assunto, assim que tiver um retorno vou atualizando em novos posts.

É isso pessoal, até a próxima!

sexta-feira, 19 de agosto de 2016

Android - Ciclo de vida da Activity

Fala galera!

Como alguns devem saber, este ano comecei a aprender um pouco mais sobre programação de aplicativos Android. Atualmente não trabalho nessa área, então resolvi aprender por conta própria e aplicar em um app que será disponibilizado pelo Developer is Coming. Bom, vamos lá!



Activity

É a classe responsável por gerenciar a UI - User Interface (Interface com o usuário). A Classe Activity cuida da criação da tela e representa qualquer atividade que exista na interação entre usuário e aparelho/dispositivo. Para desenvolver o clássico "hello world!" no Android, você basicamente precisará de uma Classe Activity  principal - geralmente o Android Studio gera para você ao criar um novo projeto - e um arquivo xml que é responsável por adicionar os elementos a tela como botões, tabs, textview, etc.

Ciclo de vida da Activity

Quando comecei a pesquisar mais sobre desenvolvimento para Android, encontrei muitas vezes em documentações ou sites com tutorias o termo "Ciclo de vida da Activity" e, sinceramente, não me atentava muito a isso. Então, quando percebi que o código que estava desenvolvendo estava aparentemente desorganizado, a aplicação não respondia conforme eu esperava e outros problemas foram surgindo, então resolvi parar e entender melhor o ciclo de vida.

O site oficial dos desenvolvedores android, explica o ciclo de vida de uma activity da seguinte maneira:
As atividades no sistema são gerenciadas como uma pilha de atividade. Quando uma nova atividade é iniciada, é colocada no topo da pilha e se torna a atividade em execução. A atividade anterior sempre é mantida abaixo dela na pilha, e não voltará ao plano principal novamente até que a nova atividade saia.

O ciclo de vida de uma Activity é essencial para o desenvolvimento de seu app e possui os métodos necessários para uso em qualquer situação que o dispositivo esteja.
Antes de analizarmos esses métodos, é importante que possamos conhecer os quatro estados de uma Activity:

  • uma activity está ativa (active) ou em execução (running) quando está em primeiro plano;
  • uma activity está pausada (paused) quando ela perde o foco, mas ainda está visível. Pode ser eliminada pelo sistema se estiver em uma situação de extrema de baixa memória;
  • uma activity está parada (stopped) se uma outra activity a oculta. Ainda mantém as informações de estado, mas não está visível para o usuário.
  • quando uma atividade é pausada ou parada, o sistema pode 'retirar' da memória ou simplesmente matar o processo. Quando for apresentado novamente ao usuário, deve ser totalmente reinicializada ou restaurada para o estado anterior.

A seguir podemos ver um gráfico com a representação dos estados principais (quadrados coloridos) e os métodos que podem ser implementados quando existe a mudança entre um estado e outro da Activity (retangulos):

Ciclo de vida Activity - developer.android.com


Vamos detalhar um pouco os métodos apresentados no gráfico:

  • onCreate() : chamado quando a activity é criada. É o primeiro método a ser executado e é nesse método que deve ser efetuada a configuração como criar as views, instanciar os elementos (TextView, Button, etc). Sempre seguida pelo método onStart();
  • onRestart() : chamado quando a activity foi interrompida. Sempre seguida pelo método onStart();
  • onStart() : chamada quando a activity se torna visível para o usuário. Se a activity estiver em primeiro plano é seguida pelo onResume() ou será seguido por onStop() se tornar "escondido";
  • onPause() : chamada quando o sistema está prestes a iniciar uma atividade anterior. Geralmente é utilizada para efetuar commit de persistência de dados não salvos, parar animações e outras coisas que podem estar consumindo CPU. A implementação deste método deve ser rápida, porque a próxima activity não está "pronta" enquanto esta não for totalmente concluída. Seguida por onResume(), se a activity volta para a frente (principal) ou onStop() se ficar invisível para o usuário;
  • onStop() : chamado quando a activity não está mais visível para o usuário, por causa de outra activity foi retomada e está 'escondendo-a'. É seguida por onRestart() se esta activity está voltando a interagir com o usuário ou onDestroy() se esta activity está encerrando;
  • onDestroy() : a última chamada que você recebe antes de sua activity estar destruída.
Através destes métodos você consegue gerenciar as atividades da sua activity e manter um bom desempenho e qualidade de seu app. 

Caso deseje se aprofundar mais sobre o assunto - muitíssimo recomendado - acesse o site developer.android.com, lá possui todas as informações e vários exemplos para facilitar o aprendizado do conteúdo.

Até mais!

;)

quinta-feira, 18 de agosto de 2016

O que é UX Design e UI Design?

Fala galera que acompanha o blog...

Você já ouviu falar em UX Design? Sabe a diferença entre UI Desing e UX Design?
Pois será sobre isso que vamos falar nesse post...

O mais comum deles é o UI Design, ou User Interface Design (Design de Interface do usuário), que é o meio pela qual uma pessoa interage com um aplicativo, dispositivo ou software. Essa interação pode ser feita por meio de menus, botões e/ou qualquer outro componente que funcione como um meio de interação entre dispositivos e o usuário.


O que é UX Design e UI Design?


É considerado um bom projeto de UI, quando este, antecipa as necessidades do usuário e garante que a interface tenha elementos de fácil utilização e acesso, entenda acesso, como ícones, menus e botões posicionados em forma estratégica e que facilita a operação do software/aplicativo. Esse tipo de abordagem, também é conhecido como user-friendly, ou seja, uma interação que não cause frustração no usuário que seja amigável.

Confundir UI Design com UX Design, é mais comum do que se pensa, principalmente quando consideramos a quantidade de nomenclaturas existentes hoje em dia para definir todas as áreas que envolvem o design, apesar dos nomes serem muito parecidos, suas abordagens são muito diferentes. UX Design está relacionado com a experiência do usuário e com seus sentimentos, enquanto UI Design é a forma como o usuário alcançara essa experiência.

Há uma analogia citada por Dain Miller em um artigo, do  blog Web Design Depot que define muito bem a diferença entre um e outro.
“UI is the saddle, the stirrups, and the reigns.
UX is the feeling you get being able to ride the horse, and rope your cattle.”
Um detalhe muito importante sobre User Interface é estar claro que não é apenas sobre uma aplicação se parece, as cores utilizadas ou as formas que a compõe. UI é sobre como a interação será realizada, é sobre funcionamento, o que convenhamos vai muito alem do que a aparência que esse produto possui.

Para trabalhar com UX é necessário que o design analise e avalie como os usuário se sentem sobre um sistema, considerando alguns aspectos como:
  • Percepção de valor do sistema;
  • Facilidade de uso;
  • Utilidade;
  • Eficiência na execução de tarefas.
Entre muitos outros aspectos, um bom profissional de UX precisa ter uma visão ampla sobre todas as áreas que a envolvem - e não são poucas -  como podemos ver no gráfico abaixo desenvolvimento por Dan Saffer, onde é apresentado a junção de todas as áreas que resultam na experiência final do usuário:


Bom, sabendo que UX Design trabalha com as emoções e experiências dos usuários, fica mais fácil entender que o UI é justamente a ponte responsável por fazer com que essas experiências aconteçam.

É isso ai pessoal, espero que tenha ficado claro a diferença entre esses dois termos e caso você seja um profissional de design, deixe sua mensagem sobre sua experiência, como perceber o que é melhor em um sistema, como são escolhidos os componentes...

Abraço e até a próxima!



terça-feira, 16 de agosto de 2016

[JAVA] Java Collections Framework | List - LinkedList

Fala galera!

No último post - aqui - nós falamos um pouco sobre ArrayList. Hoje vamos trocar uma ideia sobre LinkedList. Confesso que esse nome soava muito estranho e acredite, para mim, não fazia sentido algum em ser utilizado. Hoje, depois de realmente entender como funciona e o que é, digo que isso era simplesmente bobeira minha rsrsr. Bem, vamos ao que importa!


A classe LinkedList é uma implementação da interface List, assim como o ArrayList, mas além das semelhanças, estas classes possuem diferenças com relação ao seu desempenho.

Vamos dar uma olhadinha em um exemplo básico de LinkedList:

import java.util.LinkedList;

public class DevIsComingLinkedList {

 public static void main(String[] args) {
  
  /*Declaração de uma lista LinkedList*/
  LinkedList lista = new LinkedList(); 
  
  /*Adicionando elementos a nossa lista*/
  lista.add("Brasil");
  lista.add("França");
  lista.add("Estados Unidos");
  lista.add("Japão");
  lista.add("China");
  lista.add("Cuba");
  lista.add("Argentina");
  
 }
}

Para visualizar todos os elementos, você pode contar com a ajudinha da interface Iterator:

/*Apresentando os dados com o uso Iterator*/
Iterator i = lista.iterator();

while(i.hasNext()){
 System.out.println("País: "+i.next().toString());
}

A saída apresentada será:

País: Brasil
País: França
País: Estados Unidos
País: Japão
País: China
País: Cuba
País: Argentina

Existem dois métodos dessa classe que ajudam na manipulação da lista que são addFist() e o addLast(). Como o nome já diz, um você adiciona um elemento na primeira posição e o outro na última posição. Vamos dar uma olhada:

/*Para adicionar elementos na primeira posição da lista e na última posição*/
lista.addFirst("México");
lista.addLast("Colômbia");

E teremos o seguinte resultado na saída:

[México, Brasil, França, Estados Unidos, Japão, China, Cuba, Argentina, Colômbia]

Bom galera, como vocês puderam ver, a classe LinkedList é muito fácil utilizar e não é um bicho de sete cabeças, como eu imaginei.

Espero que tenham gostado!

Até a próxima!

;)

segunda-feira, 15 de agosto de 2016

[Advpl] Manipulação de Arquivos

Fala galera!

Vamos trocar uma ideia hoje sobre manipulação de arquivos utilizando a linguagem Advpl. Antes de começar a codificar, preciso apresentar o motivo que originou esse post.



Na empresa onde trabalho, havia a necessidade do usuário obter um arquivo que é salvo pelo sistema em sua pasta no servidor.  E para que isso fosse possível, o usuário utilizava de um arquivo .bat - veja mais sobre arquivos bat nesses posts - que automatizava  o processo, ou seja, buscava o arquivo no servidor, renomeava e salvava no desktop do usuário.

Então, utilizando deste cenário, poderemos aprender várias funções de manipulação de arquivo com Advpl.

Primeiramente vamos desenvolver a tela principal do nosso programa, onde teremos um combo-box com as opções de arquivos que iremos recuperar/pegar do servidor e dois botões, um para confirmar e outro para sair.

Nossa tela será exibida da seguinte forma:



Aqui está o código para que a tela seja gerada:

/*
_____________________________________________________________________________
¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦
¦¦+-----------------------------------------------------------------------+¦¦
¦¦¦Programa  ¦ BUSARQ     ¦ Autor ¦ Renan R. Ramos      ¦ Data ¦ 11.08.16 ¦¦¦
¦¦¦----------+------------------------------------------------------------¦¦¦
¦¦¦Descriçäo ¦ Rotina para recuperar arquivo do servidor para o computador¦¦¦
¦¦¦          ¦ do usuário.                                                ¦¦¦
¦¦+-----------------------------------------------------------------------+¦¦
¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦
¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
*/
user function busArq

private oWinMain                               
private oCombo
private cCombo := ""
private aOpcoes := {"1=Arquivo_1","2=Arquivo_2"}

define msDialog oWinMain title "" from 000,000 to 210,250 pixel of oWinMain

 @005,005 to 100,120 LABEL "Busca arquivo" pixel of oWinMain

 oCombo := TComboBox():New(030,014,{|u|if(PCount()>0,cCombo := u,cCombo)},aOpcoes,100,20,oWinMain,,{||},,,,.T.,,,,,,,,,'cCombo') 
 
 @075,020 button "Confirmar" size 040,010 pixel of oWinMain action getArq(val(cCombo)) 
 @075,065 button "Sair" size 040,010 pixel of oWinMain action close(oWinMain)
  
activate msDialog oWinMain centered

return

No botão "Confirmar" possuímos o método getArq(val(cCombo)) que será o principal método da nossa rotina. Ele efetuará toda a transição e manipulação dos arquivos.
A seguir vocês podem visualizar o código completo com explicações em seus comentários.

/*
_____________________________________________________________________________
¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦
¦¦+-----------------------------------------------------------------------+¦¦
¦¦¦Programa  ¦ GETARQ     ¦ Autor ¦ Renan R. Ramos      ¦ Data ¦ 11.08.16 ¦¦¦
¦¦¦----------+------------------------------------------------------------¦¦¦
¦¦¦Descriçäo ¦ Função responsável por efetuar a cópia dos arquivos.       ¦¦¦
¦¦+-----------------------------------------------------------------------+¦¦
¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦
¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
*/
static function getArq(nNumOpc)
  
local cArquivo := ""
local cNomeArq := ""
local lCompacta := .T.
local lSuccess := .T.
local nRetorno := 0
local cTemp1 := getTempPath()
local cTemp := substr(cTemp1,1,AT("\AppData",cTemp1))+"desktop\"
    
//obtém as informações do usuário logado no protheus
PswOrder(2)

if PswSeek(cUsername, .T.) 
 //array com todas as informações de configuração do usuário
 aArray := PswRet()
endIf

//verifica se existe configurado um diretório de impressão 
//do sistema para este usuário
if !empty(allTrim(aArray[2][3]))
           
 //se escolha por Arquivo_1
 if nNumOpc = 1 
    cArquivo := "Arquivo_1.txt"
    cNomeArq := "\PRIMEIRO_ARQUIVO.txt"
 else//se escolha por Arquivo_2
    cArquivo := "Arquivo_2.txt"
    cNomeArq := "\SEGUNDO_ARQUIVO.txt"
 endIf                   
 
 //se o arquivo já existe, ele é deletado
 if file(cTemp+cArquivo)
     fErase(cTemp+cArquivo)
 endIf
    
 //se a cópia foi efetuada com sucesso, o método CpyS2t() retorna .T.
 lSuccess := CpyS2T(allTrim(aArray[2][3])+cArquivo,cTemp,lCompacta)

 if lSuccess
  //se o arquivo já existe, ele é deletado
  if file(cTemp+cNomeArq)
      fErase(cTemp+cNomeArq)
  endIf
        
  //se o arquivo foi renomeado, o método fRename() retorna 0
     nRetorno := fRename(cTemp+cArquivo,upper(cTemp+cNomeArq))

  //se renomear o arquivo estiver ok retorna 0   
  if nRetorno = 0
   msgInfo("Arquivo salvo com sucesso!")
  endIf
 else
  msgInfo("Arquivo não copiado!")
 endIf
else
 msgInfo("Verificar configurações de pasta do usuário no servidor")
endIf

return

Para definirmos em qual local do computador será salvo o arquivo, utilizamos o método getTempPath(), mas como desejamos salvar no desktop do usuário, utilizamos o código abaixo para substituir a string do diretório obtido e adicionamos a string "\desktop" e assim teremos o nosso diretório final.

local cTemp1 := getTempPath() //obtém o diretório temporario do usuario logado no sistema
local cTemp := substr(cTemp1,1,AT("\AppData",cTemp1))+"desktop\" //obtemos a posição da pasta "\AppData" e adicionamos a string "\desktop\"

Explicação rápida de algumas funções utilizadas:

  • PswOrder: seleciona a ordem de pesquisa de usuário. Em nosso fonte utilizamos a ordem 2 que é feita por nome de usuário.
  • PswSeek: pesquisa e posiciona o arquivo de senhas de acordo com a ordem definida pela função PswOrder.
  • PswRet: retorna um vetor com as informações do usuário;
  • File: verifica se o arquivo existe no diretório informado;
  • FErase: apaga o arquivo no diretório informado;
  • FRename: renomeia o arquivo original do primeiro parâmetro de acordo com o outro informado no segundo parâmetro.
  • CpyS2t: faz a cópia do diretório do servidor no primeiro parâmetro para o diretório de destino que deve ser colocado no segundo parâmetro.

Para obter mais informações sobre todas essas funções, acesse o TDN Totvs.

É isso ai galera! Um fonte fácil e simples que poderá ser de grande utilidade não só para este contexto que passei, mas para qualquer outra necessidade de manipulação de arquivo.

Deixe seu comentário, crítica ou sugestão!

Até mais!

;)

quinta-feira, 4 de agosto de 2016

Download de imagens com JSOUP

Fala galera!

Vamos falar hoje de uma técnica muito legal que você pode utilizar tanto para uso em um projeto pessoal quanto para uma necessidade específica. 



Vou tentar exemplificar: em algum momento você precisou salvar várias imagens de um mesmo site - respeitando os direitos de cópia e uso - e precisou ficar baixando imagem por imagem? Pois bem, o que faremos aqui é uma forma de automatizar esses downloads deixando a tarefa mais rápida e fácil.

Logicamente, o código varia de site para site, então o que compartilharei com vocês é apenas um exemplo simples. Caso tenha interesse em aplicar em algo mais robusto, por favor, compartilhe com a gente :).

Vamos lá! Para fazer esse exemplo para vocês, vou usar um site simples, porém muito conhecido o www.pudim.com.br. Se você não conhece, vale a pena conferir rsrsrs. E também utilizaremos da técnica Web Scraping, onde já falamos em outros posts.

Bom, além de criar a classe que irá receber o código, é muito interessante que você dê uma olhada na estrutura da página, analisando onde estão - em quais tags, classes e ids - das imagens que deseja baixar. Veja como está localizada a imagem que baixaremos:



Nosso código inicial será para encontrar a imagem no site e obter a url/nome do arquivo para que possamos efetuar o download.

//url do site onde está a imagem
public static final String SITE = "http://www.pudim.com.br";
//diretório onde a imagem será salva
public static final String PATH = "E:\\imagens\\";
 
public static void main(String[] args) {   
 
 try{   
  Document doc = Jsoup.connect(SITE).timeout(0).get();
  
  String img = doc.select("div.image").select("img").attr("src");

  //envia o nome da imagem no site ao método
  downloadImage(img);
  
 }catch(Exception ex){
  ex.printStackTrace();
 }   
}

Uma atenção especial para o método timeout(), pois é responsável por definir o tempo de conexão e leitura do site. Por padrão - caso seja omitido o método - o tempo máximo é de 3000 milisegundos (3 segundos), se definir o timeout com 0, ele será tratado como timeout infinito. Quando o tempo limite for excedido, será lançada uma exceção IOException.

//definido timeout 0
Document doc = Jsoup.connect(SITE).timeout(0).get();

Temos um método chamado downloadImage(String img) que será responsável por baixar a imagem e salvar no diretório de destino.

private static void downloadImage(String img) throws IOException{
  
 //nome do arquivo que será salvo no pc
 //nesse caso, adiciona a extensão
 String nome = "imagem.jpg";

 // url = http://www.pudim.com.br/pudim.jpg
 URL url = new URL(SITE+"/"+img);
 InputStream input = url.openStream();
 
 OutputStream output = new BufferedOutputStream(new FileOutputStream(PATH + nome));
 
 for(int i; (i = input.read()) != -1;){
  output.write(i);
 }
 //encerra as conexões
 output.close();
 input.close();
}

Após o download, a imagem estará disponível no diretório informado.

Essa foi a dica de hoje, espero que tenham gostado. Se tiver alguma informação a acrescentar ou alguma curiosidade para compartilhar, fale para nós nos comentários.

Até mais!

;)

terça-feira, 2 de agosto de 2016

Father.IO


Enquanto aguardamos Pokémon GO, porque não aproveitar um bom FPS.

Fique ligado, o inimigo pode estar em qualquer lugar! rs

segunda-feira, 1 de agosto de 2016

Java Collections Framework | List - ArrayList

Fala galera!

Hoje vamos falar um pouco sobre Collections Framework e seus componentes. Mas antes de começar com os códigos, vamos ver algumas definições.


O que é Collections?

Conforme descrito na documentação do Java no site da Oracle:
Uma coleção (collection) - algumas vezes nomeada como recipiente - é simplesmente um objeto que agrupa múltiplos elementos dentro de uma única unidade. Collections são usados para armazenar, recuperar, manipular, e comunicar dados.
O Java Collections Framework é uma coleção de interfaces e classes na qual auxilia no armazenamento e processamento de dados de forma eficiente. Este framework tem várias classes úteis que posssuem muitas funções na qual torna a tarefa do programador muito fácil.

List

Uma lista é uma coleção oredenada (algumas vezes chamada de sequencia). Listas podem conter elementos duplicados. Elementos podem ser inseridos ou acessados por sua posição na lista, usando um index.

Arraylist

É uma implementação de array redimensionável da interface List. Esta classe fornece métodos para manipular o tamanho do array que é usado internamente para armazenar a lista.

Veja alguns métodos simples:
import java.util.ArrayList;

public class DevIsComingArrayList {

 public static void main(String[] args) {
  /*
   * Exemplo de uso de alguns métodos da classe ArrayList
   */
  
  String fruta = "";
  List array = new ArrayList();
  
  /*Adicionando elementos ao array*/
  array.add("Maçã");
  array.add("Melancia");
  array.add("Pera");
  array.add("Abacaxi");
  array.add("Banana");
  
  System.out.println("Conteúdo do array: " + array);
  
  /*Removendo o item 0 do array*/
  array.remove(0); 
  System.out.println("Array atualizado: " + array);
  
  /*obtem o conteúdo do índice 3*/
  fruta = array.get(3);  
  System.out.println("A fruta do índice 3 é " + fruta);
  
 }
}
Uma forma diferente para inicializar seu array, seria usando da seguinte forma:

 List array = new ArrayList(
     Arrays.asList("Maçã","Melancia","Pera","Abacaxi","Banana");
 ); 


Caso seja necessário ordenar os itens, basta utilizar o método Collections.sort(arrayList), assim, a sua lista ficará ordenada. Veja:

   //Ordenação dos itens
   Collections.sort(array);


No console você terá a seguinte lista:
Lista ordenada: [Abacaxi, Banana, Melancia, Pera]
Bom galera, este foi um post inicial de uma sequência que deixaremos para vocês a respeito do Java Collections Framework. Caso queiram se aprofundar, sujiro que acessem a documentação oficial e os links que utilizamos para pesquisa na seção de fontes.
Espero que tenham gostado!

Fontes: 
             Beginners Book

             http://beginnersbook.com/java-collections-tutorials/



             Oracle 

             http://docs.oracle.com/javase/tutorial/collections/intro/index.html