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!
Luiz Fagner Zordan Analista de Sistemas

Graduado em Sistemas de Informação, atualmente trabalhando na Embraer pela FocusNetworks como FullStack. Sou apaixonado por tecnologia, fascinado por jogos e adoro passar o tempo assistindo séries.

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!
Luiz Fagner Zordan Analista de Sistemas

Graduado em Sistemas de Informação, atualmente trabalhando na Embraer pela FocusNetworks como FullStack. Sou apaixonado por tecnologia, fascinado por jogos e adoro passar o tempo assistindo séries.

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!

Luiz Fagner Zordan Analista de Sistemas

Graduado em Sistemas de Informação, atualmente trabalhando na Embraer pela FocusNetworks como FullStack. Sou apaixonado por tecnologia, fascinado por jogos e adoro passar o tempo assistindo séries.

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!

;)
Renan Rodrigues Ramos Desenvolvedor

Sou desenvolvedor, amo desenvolvimento de software, músico e apaixonado por filmes e seriados.

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!



Luiz Fagner Zordan Analista de Sistemas

Graduado em Sistemas de Informação, atualmente trabalhando na Embraer pela FocusNetworks como FullStack. Sou apaixonado por tecnologia, fascinado por jogos e adoro passar o tempo assistindo séries.

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!

;)
Renan Rodrigues Ramos Desenvolvedor

Sou desenvolvedor, amo desenvolvimento de software, músico e apaixonado por filmes e seriados.

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!

;)
Renan Rodrigues Ramos Desenvolvedor

Sou desenvolvedor, amo desenvolvimento de software, músico e apaixonado por filmes e seriados.

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!

;)
Renan Rodrigues Ramos Desenvolvedor

Sou desenvolvedor, amo desenvolvimento de software, músico e apaixonado por filmes e seriados.

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
Luiz Fagner Zordan Analista de Sistemas

Graduado em Sistemas de Informação, atualmente trabalhando na Embraer pela FocusNetworks como FullStack. Sou apaixonado por tecnologia, fascinado por jogos e adoro passar o tempo assistindo séries.

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


Renan Rodrigues Ramos Desenvolvedor

Sou desenvolvedor, amo desenvolvimento de software, músico e apaixonado por filmes e seriados.

[DIY] Arquivo batch com menu


Fala galera que acompanha o blog...

Pode ser que você esteja estranhando a sigla DIY (Do It Yourself) no titulo dessa postagem, mas é exatamente disso que esse post se trata. "Faça você mesmo" um arquivo batch com menu e com várias funcionalidades para agilizar seu dia a dia.


[DIY] Arquivo batch com menu


Se você não conhece o que são arquivos batch, clique nesse link onde explicamos o que são esses arquivos, como criar e executar.

Normalmente, cria-se um arquivo batch para cada tarefa. Mas, e se juntássemos todos esses arquivos e colocássemos em um único arquivo batch, criássemos apenas uma variável de ambiente para nosso arquivo e através de um menu executássemos qualquer uma das nossas tarefas... parece ser bacana não?

É exatamente isso que vamos fazer!

Vocês perceberão que em nem toda linha foi comentada, por ser um pouco repetitivo. Mas a ideia geral é:
  • Temos uma tela de login, caso erre 3 vezes a senha seu computador será desligado;
A SENHA INICIAL É 1234, ABRA O ARQUIVO BATCH E CONFIGURE A SENHA QUE ACHAR MELHOR.
  • Acessando o sistema, temos um menu com várias funcionalidades, que antes estavam cada uma em um arquivo batch e foi reunido tudo nesse arquivo;
  • Alguns comandos, por serem "críticos" precisa de uma confirmação do usuário para que serem executados;
  • Sugiro que execute esse arquivo batch no prompt de comando com permissão de administrador, pois alguns comandos precisam de tal permissão;
rem EXIBE APENAS O COMANDO SEM APRENTAR DIRETORIO
@echo off
cls
rem ALTERO A COR DO BACKGROUND E DA FONTE APENAS PARA IDENTIFICAR QUE ESTOU DENTRO DE UM ARQUIVO BATCH
color 80
rem ALTERO O TITULO DA PAGINA
Title COMANDOS DEVIC - PASSWORD
rem SETO A QUANTIDADE DE TENTATIVAS PARA LOGAR NO ARQUIVO BATCH
set /a tries=3

rem TODO ARQUIVO QUE POSSUIR ":NOME" É UM PONTO DE ACESSO (PA) REFERENCIADO POR UM COMANDO "goto"
:TOP
echo  ================================================= 
echo *        %tries% tentativa(s) restante(s).         *
echo  ================================================= 
echo Entre com sua senha:
rem SETO A SENHA NA MINHA VARIAVEL
set /p pass= 
rem VERIFICO SE A SENHA DIGITADA É A MESMA QUE FOI CONFIGURADA SE SIM ENVIO PARA O PA IDENTIFICADO COM "MENU"
if %pass% == 1234 goto MENU
rem DECREMENTO A QUANTIDADE DE TENTATIVAS
set /a tries = %tries -1
rem VERIFICO SE ACABOU AS TENTAVAS SE SIM ENVIO PARA O PA IDENTIFICADO COMO "ERROR" E CHAMO O PA "TOP" NOVAMENTE
if %tries% == 0 goto ERROR
cls
goto TOP

rem TENDO ESGOTADO AS TENTATIVAS ESSE PA É CHAMADO E INICIO O DESLIGAMENTO PROGRAMADO
:ERROR
echo Desculpe, voce errou muitas vezes a senha e seu computador será desligado.
start shutdown -s -f -t 1800 -c "DESLIGANDO EM 3 MINUTOS..."
pause
exit

rem ESSE É O MENU DO SISTEMA, ALTERO O TITULO DA PAGINA, OS NUMEROS REPRESENTAM CADA SERVIÇO QUE PODERÁ SER EXECUTADO
:MENU
cls
Title COMANDOS DEVIC - MENU
rem MOSTRO AS HORAS, NOME DO COMPUTADOR E USUARIO LOGADO
date /t
echo Computador: %computername%     Usuario: %username%
echo.
echo              MENU DEVELOPER IS COMING
echo  ================================================= 
echo * 1. Desligar                                     *
echo * 2. Programar desligamento (5 min)               *
echo * 3. Cancelar desligamento                        *
echo * 4. Alterar usuario                              *
echo * 5. Reiniciar                                    *
echo * 6. Abrir Prompt Comando                         *
echo * 7. Abrir Prompt Comando (Admin)                 *
echo * 8. Telnet                                       *
echo * 9. Mapa de caracteres                           *
echo * 10. IP Config                                   * 
echo * 11. Esvaziar a Lixeira                          *
echo * 12. Fazer Backup                                *
echo * 13. Escanear Disco Local                        *
echo * 14. Painel de Controle                          *
echo * 15. Calculadora                                 *
echo * 16. Notepad                                     *
echo * 17. Inicializar                                 *
echo * 18. Abrir Workspace                             *
echo * 19. Abrir Servidor                              *
echo * 20. Executar BATCH externo                      *
echo * 21. IP's conectados                             *
echo * 99. Star Wars Episodio IV                       *
echo * 0. Sair                                         *
echo  =================================================

rem SETO O VALOR NA MINHA CARIAVEL
set /p opcao= Escolha uma opcao:
echo  ================================================= 
rem COMANDO 1 AO 5 EU CHAMO O MEU PA "CONFIRMATION" PARA VERIFICAR SE REALMENTE É PARA EXECUTAR O COMANDO
rem POIS SÃO COMANDOS CRITICOS QUE PODEM TER SIDO DIGITADOS ERRONEAMENTE, POSSIBILIDADES DA APLICAÇÃO
if %opcao% equ 0 goto EXIT
if %opcao% equ 1 goto CONFIRMATION
if %opcao% equ 2 goto CONFIRMATION
if %opcao% equ 3 goto CONFIRMATION
if %opcao% equ 4 goto CONFIRMATION
if %opcao% equ 5 goto CONFIRMATION
if %opcao% equ 6 goto OPENCMD
if %opcao% equ 7 goto OPENCMDAMD
if %opcao% equ 8 goto OPENTELNET
if %opcao% equ 9 goto MAPCHAR
if %opcao% equ 10 goto IPCNFG
if %opcao% equ 11 goto TRASH
if %opcao% equ 12 goto BACKUP
if %opcao% equ 13 goto SCANDISK
if %opcao% equ 14 goto PNLCONTROL
if %opcao% equ 15 goto CALC
if %opcao% equ 16 goto NOTE
if %opcao% equ 17 goto INIT
if %opcao% equ 18 goto WORKSPACE
if %opcao% equ 19 goto SERVER
if %opcao% equ 20 goto BATCH
if %opcao% equ 21 goto NET
if %opcao% equ 99 goto STARWARS

rem VERIFICO SE REALMENTE É PARA EXECUTAR OS COMANDOS (NO POST EXPLICO CADA UM DOS PARAMETROS)
:CONFIRMATION
CHOICE /N /T 30 /C sn /CS /D s /M "Deseja executar a operacao? [S]im ou [N]ao"
if errorlevel = 2 goto NAO
if errorlevel = 1 goto SIM

rem SE REALMENTE FOR PARA EXECUTAR O COMANDO EU CHAMO O PA RESPONSAVEL PELA FUNCIONALIDADE
:SIM
cls
echo O usuario pressionou [S]
pause
if %opcao% equ 1 goto TURNOFFINSTA
if %opcao% equ 2 goto TURNOFFTIME
if %opcao% equ 3 goto CANCELTURNOFF
if %opcao% equ 4 goto LOGOFF
if %opcao% equ 5 goto RESTART

rem SE NÃO FOR PARA EXECUTAR O COMANDO RETORNO PARA O MENU
:NAO
cls
echo O usuario pressionou [N]
pause
goto MENU

rem OPCAO 1. Desligar
:TURNOFFINSTA
shutdown -s -t 0
goto EXIT

rem OPCAO 2. Programar desligamento (5 min)
:TURNOFFTIME
shutdown -s -f -t 300 -c "VOCE TEM 5 MINUTOS PARA SALVAR SEUS TRABALHOS..."
goto MENU

rem OPCAO 3. Cancelar desligamento
:CANCELTURNOFF
shutdown -a
goto MENU

rem OPCAO 4. Alterar usuario  
:LOGOFF
shutdown -f
goto MENU

rem OPCAO 5. Reiniciar
:RESTART
shutdown -r -t 0
goto EXIT

rem OPCAO 6. Abrir Prompt Comando
:OPENCMD
cls
"%windir%\system32\cmd.exe"
goto MENU

rem OPCAO 7. Abrir Prompt Comando (Admin)
:OPENCMDAMD
cls
runas /user:Faguinho "%windir%\system32\cmd.exe"
goto MENU

rem OPCAO 8. Telnet
rem NECESSARIO QUE O SERVICO TELNET ESTEJA HABILITADO PREVIAMENTE
:OPENTELNET
cls
telnet

rem OPCAO 9. Mapa de caracteres 
:MAPCHAR
cls
"%windir%\SYSTEM32\CHARMAP.exe"
pause
goto MENU

rem OPCAO 10. IP Config 
:IPCNFG
cls
call ipconfig
pause
goto MENU

rem OPCAO 11. Esvaziar a Lixeira  
:TRASH
cls
rd /S /Q c:\$Recycle.bin
echo  ================================================= 
echo *                  LIXEIRA ESVAZIADA!             *
echo  ================================================= 
pause
goto MENU

rem OPCAO 12. Fazer Backup
rem NECESSÁRIO DEFINIR UMA PASTA DE ORIGEM E UMA PASTA DE DESTINO
:BACKUP
cls
xcopy /T /C C:\Users\Faguinho\Documents\*.* C:\Users\Faguinho\Favorites
echo  ================================================= 
echo *                  BACKUP CONCLUIDO!              *
echo  ================================================= 
pause
goto MENU

rem OPCAO 13. Escanear Disco Local 
rem NECESSÁRIO DEFINIR QUAL UNIDADE DEVERIA SER ESCANEADA
:SCANDISK
cls
echo  ================================================= 
echo *              ESCANEAMENTO DE DISCO!             *
echo  ================================================= 
chkdsk c:
pause
goto MENU

rem OPCAO 14. Painel de Controle 
:PNLCONTROL
cls
control.exe
pause
goto MENU

rem OPCAO 15. Calculadora
:CALC
cls
calc.exe
pause
goto MENU

rem OPCAO 16. Notepad  
:NOTE
cls
notepad.exe
pause
goto MENU

rem OPCAO 17. Inicializar   
rem ADICIONE TODOS AS FERRAMENTAS QUE UTILIZA COM FREQUENCIA
:INIT
rem <ferramenta 1="" a="" dia="" no="" que="" usa="" voce="">
rem <ferramenta 2="" a="" dia="" no="" que="" usa="" voce="">
rem <ferramenta 3="" a="" dia="" no="" que="" usa="" voce="">
goto MENU

rem OPCAO 18. Abrir Workspace
:WORKSPACE
start %userprofile%\Desktop\Projetos\workspace
pause
goto MENU

rem OPCAO 19. Abrir Servidor 
:SERVER
start %userprofile%\Desktop\Ferramentas\oracle
pause
goto MENU

rem OPCAO 20. Executar BATCH externo 
rem NECESSARIO CRIAR ARQUIVO BATCH
:BATCH
call %userprofile%\Desktop\horas.bat
pause
goto MENU

rem OPCAO 21. IP's conectados
:NET
call netstat -an
pause
goto MENU

rem OPCAO 99. Star Wars Episodio IV
:STARWARS
telnet towel.blinkenlights.nl

rem OPCAO 0. Sair 
:EXIT
cls
echo  ================================================= 
echo *                  ATE MAIS!                      *
echo  ================================================= 
pause
exit


Esse é o nosso projeto! Se preferir pode fazer o download dos arquivos aqui.
Vou deixar aqui o batch externo que eu utilizo ao selecionar a opção "20. Executar BATCH externo":
@echo off
Title QUE HORAS SAO?
cls
echo                            AGORA SAO EXATAMENTE:
echo.
echo                                ~ %TIME% ~
echo.

Vamos entender agora o "choice", utilizado para recuperar a opção selecionada pelo usuário:


CHOICE /N /T 30 /C sn /CS /D s /M "Deseja executar a operacao? [S]im ou [N]ao"
/N - Oculta uma lista de opções no prompt. A mensagem antes do prompt é exibida e as opções ainda estão ativadas.
/T - É o número de segundos de pause antes que uma opção padrão seja escolhida, eu coloquei 30 segundos.
/C - Especifica uma listas de opções a ser criada. "sn = Sim ou Não"
/CS - Permite a seleção de opções de distinção entre maiúsculas e minúsculas. Por padrão, o utilitário não diferencia maiúsculas e minúsculas.
/D - Especifica a opção padrão depois de 30 segundos. "/D s"
/M - Especifica a mensagem a ser exibida antes do prompt. Se não for especificado, o utilitário exibe apenas um prompt.

Em caso de duvidas sobre oque o cada comando faz, podem utilizar esse post aqui. Possui uma lista com vários comandos e explicação de sua funcionalidade. 

E para finalizar, precisamos adicionar nosso arquivo batch nas variáveis de ambiente, para que possamos executa-lo de qualquer diretório. Para isso veja esse post, onde ensino como criar uma variavel de ambiente.
Caso ainda não tenham visto, não deixem de selecionar a opção "99. Star Wars Episodio IV". Caso não funcione verifique se o telnet esta habilitado na sua máquina.

Pessoal, é isso ai... Até a próxima!

Esse código já está disponível no github, clique aqui!
Luiz Fagner Zordan Analista de Sistemas

Graduado em Sistemas de Informação, atualmente trabalhando na Embraer pela FocusNetworks como FullStack. Sou apaixonado por tecnologia, fascinado por jogos e adoro passar o tempo assistindo séries.