twitterfacebookgoogle pluslinkedinrss feedemail

sábado, 9 de junho de 2018

Hospedaria Restaurante

Definem a comida como sendo comida de Imigrante Italiano. Receitas simples, tendo como aliado um forno a lenha para finalização dos pratos.
Destaque para o ambiente e decoração que é um galpão fabril, como muitos na Mooca.
Preço justo para pratos que são de imigrantes: simples, rústicos e economia de ingredientes caros.
Cardápio com poucas opções e sobremesas que não empolgam.
Contudo, comida saborosa e vale uma visita para conhecer o restaurante.



Serviço:
Hospedaria Restaurante

Endereço: R. Borges de Figueiredo, 82 - Mooca, São Paulo - SP, 03110-010, Brasil

* Valores confirmados na data de postagem.
** Reflete uma opinão pessoal, não sou especialista.

sexta-feira, 16 de fevereiro de 2018

Selenium WebDriver: Tempo de Espera Explícito e Implícito




Podemos utilizar um tempo de espera para mitigar erros ao tentar acessar elementos utilizando o Selenium WebDriver.
Como exemplo usamos a linguagem Java e levarei em consideração que já utiliza o WebDriver, apresentando este recurso avançado.

Imaginamos que você tenha um teste automatizado que acessa os elementos da página de login e no botão de "OK" é enviado a ação de clicar.
Depois é redirecionado para outra página do sistema, onde tenho que clicar em outro botão confirmando o meu login.
Por infelicidade do destino, apresenta um erro ao tentar acessar o elemento do botão da segunda página.
Para ilustrar, repare no código abaixo:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
public class LoginPage {

 WebDriver driver;
 
 //Mapeamento dos Elementos da Página de Login
 @FindBy(id="Login")
 WebElement usuario;
 
 @FindBy(how=How.NAME,using="Senha")
 WebElement password;
 
 @FindBy(how=How.ID, using="BtnOK")
 WebElement botaoOK;
 
 @FindBy(how=How.ID, using="BtnConfirmaOK")
 WebElement confirmacaoBotaoSucess;
 
 
 public LoginPage(WebDriver driver) {
  super();
  this.driver = driver;
 }

 public void fazerLogin(String uid, String pass){
  
  // Define os valores de Login e Senha.
  usuario.sendKeys(uid);
  password.sendKeys(pass);
  
  // Envia ação de clicar no botão OK e redireciona para outra página.
  botaoOK.click();

  // Erro ocorre ao tentar acessar o elemento do botão que está em outra página.  
  confirmacaoBotaoSucess.click();
 } 
}

O erro é o bendito abaixo:

org.openqa.selenium.NoSuchElementException: no such element: Unable to locate element

O erro é claro que não conseguiu localizar o elemento.
Acontece que quando redireciona de uma página para a outra, não temos um tempo de espera entre os passos (steps).
Este tempo seria o de renderizar a página, podendo neste tempo ocorrer lentidão na rede, servidores, etc.

Uma grande parcela de automatizadores utilizam o método Thread.sleep(), esta abordagem é errada, não sendo eficiente.
O sleep espera o tempo definido, assim podendo aumentar muito o tempo do seu teste e não evitando se tivermos uma demora maior na renderização da página.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
 public void fazerLogin(String uid, String pass){
  
  // Define os valores de Login e Senha.
  usuario.sendKeys(uid);
  password.sendKeys(pass);
  
  // Envia ação de clicar no botão OK e redireciona para outra página.
  botaoOK.click();
  
  //Abordagem errada é definir um tempo de espera fixo, utilizando o método abaixo.
  Thread.sleep(3000);
   
  // Erro ocorre ao tentar acessar o elemento do botão que está em outra página.  
  confirmacaoBotaoSucess.click();
 } 
}

A documentação do WebDriver recomenda duas formas de definir um tempo de espera.
O "Explicit and Implicit Waits" tem duas abordagens distintas.
Primeiramente, vamos definir o que é Implícito e Explícito.
Nosso velho amigo dicionário diz:

Implícito
O adjetivo implícito indica algo que não está claramente expresso, que está subentendido.
É sinônimo de subentendido, subjacente, latente, tácito e velado.

Explícito
O adjetivo explícito indica algo que está expresso de forma clara e precisa, sem ambiguidades ou restrições. É sinônimo de claro, manifesto, patente, preciso, categórico, terminante, declarado e compreensível.

O implícito é o mais usual e simples.
Defininos um tempo de timeout para todo o escopo de nossos testes.
Conforme o código abaixo, definimos o tempo de 60 segundos de timeout.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
 public void fazerLogin(String uid, String pass){
  
  //define um TimeOut para em caso de não encontrar elementos na página.
  driver.manage().timeouts().implicitlyWait(60, TimeUnit.SECONDS);  

 
  // Define os valores de Login e Senha.
  usuario.sendKeys(uid);
  password.sendKeys(pass);
  
  // Envia ação de clicar no botão OK e redireciona para outra página.
  botaoOK.click();
   
  // Não irá occorer erro ao tentar acessar o elemento do botão que está em outra página.  
  confirmacaoBotaoSucess.click();
 } 

Definindo o driver.manage().timeouts().implicitlyWait(), o WebDriver irá demorar o tempo definido para gerar a exceção de erro.
Ele verifica a cada 500 milissegundo se o elemento referenciado foi criado.
Assim evitando o erro de NoSuchElementException e sendo uma forma eficiente, evitando de utilizar o Thread.sleep().
O valor do método implicitlyWait() pode ser definido logo após a criação do objeto driver, não sendo necessário definir esse valor toda hora.

A forma explícita é definida pelo tempo de espera para cada elemento.
No código abaixo, identificamos a criação do objeto WebDriverWait.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
 public void fazerLogin(String uid, String pass){
  
  // Define os valores de Login e Senha.
  usuario.sendKeys(uid);
  password.sendKeys(pass);
  
  // Envia ação de clicar no botão OK e redireciona para outra página.
  botaoOK.click();
   
  //Segunda Tela onde é redirecionado depois do login.
  //===> Usando recurso de Wait, para evitar exception de encontrar elemento na tela.
  WebDriverWait wait = new WebDriverWait(driver, 10);
  WebElement btnConfirmarOK = wait.until(ExpectedConditions.visibilityOf(confirmacaoBotaoSucess));
  btnConfirmarOK.click();
 }

Utilizando o objeto WebDriverWait definimos o tempo de timeout e através do método until dizemos a condição que esperamos.
Em casos que a aplicação fica processando um lote por tempo indefinido, onde irá cair por timeout implícito, a utilização do tempo de espera explícito é necessário.

ATENÇÃO:
Não misture os tempos de espera implícito e explícito.
O tempo de espera fica imprevisível, assim não sendo possível dizer quanto tempo irá demorar.
Quando for necessário utilizar o tempo de espera explícito, defina como:
driver.manage().timeouts().implicitlyWait(0, TimeUnit.SECONDS);

quarta-feira, 4 de outubro de 2017

A Odisseia do SSD


Querendo melhorar a performance do meu laptop, encontro uma série de técnicas que envolve o Hardware e Software.
O aumento de performance utilizando o SSD é perceptível já na inicialização do sistema operacional.
Em Software, utilizo o sistema operacional Linux Mint e as dicas descritas envolve na maioria das vezes em diminuir a escrita em disco, assim aumentando a vida útil do SSD.
Abaixo segue os diversos posts nesta odisseia do SSD.

Começando com a instalação do SSD no Laptop.

As dicas de configuração que podem ser aplicadas no Mint, Ubuntu e Debian.
Verifique as dicas abaixo:
- SSD - Outras dicas para aumentar a vida útil

SSD - Limitar o uso de Memória SWAP (Swappiness)


Este Post faz parte de uma série de dicas para melhorar a performance e vida útil do drive SSD. Vide o post "A Odisseia do SSD".

Esta dica é extremamente interessante.
Podendo otimizar a performance de servidores.
Vamos limitar o uso de memória virtual, alterando o valor para diminuir a utilização de memória swap e assim, diminuindo o acesso de escrita em disco.

O primeiro passo é verificar o valor que está limitado a utilização de memória swap.
Utilizando o seguinte comando:
cat /proc/sys/vm/swappiness
Swapp1.png
No meu caso, retornou o valor default que é 60.
A lógica é que quanto menor esse valor, na escala de 0-100, menor a utilização de memória swap.

Vamos editar o arquivo /etc/sysctl.conf.
sudo vi /etc/sysctl.conf

No final do arquivo, incluir as seguintes linhas:

# Limitar o SWAP
vm.swappiness=10

Swap2.png

Depois é só reiniciar o computador que a nova configuração estará produtiva.
Esta configuração é extremamente importante.
Imagine uma aplicação java, onde temos uma memória pré-alocada do servidor em 80%. Com a configuração default, sempre iremos fazer utilização de memória swap, onde irá degradar a performance do servidor e aplicação.
Limitando esse valor para 10, o Linux irá utilizar a memória swap quando o consumo de memória atingir 91%.

Depois de reiniciar, verificamos se a configuração teve efeito.
Swap3.png

SSD - Executar o TRIM

Este Post faz parte de uma série de dicas para melhorar a performance e vida útil do drive SSD. Vide o post "A Odisseia do SSD".

O TRIM é um recurso de drive SSD mais recente, onde marca como inválido os blocos que foram apagados. Assim o SSD sabe que pode gravar novamente nestes blocos.
Sem o TRIM, o SSD teria que apagar o bloco para depois gravar a informação novamente, assim gerando ciclos de apagamento desnecessário e diminuindo a vida útil do seu SSD.

O primeiro passo para otimizar o TRIM é identificar se o seu SSD tem este recurso, para isso entramos com o seguinte comando em nosso terminal.
TRIM1.png

Pelo retorno acima, o meu SSD tem o recurso de TRIM.
“Data Set Management TRIM supported”

O comando para executar o TRIM é o fstrim e em distros Debian vem configurado uma execução semanal no crontab. (http://man7.org/linux/man-pages/man8/fstrim.8.html)
Dependendo da sua utilização do sistema, uma execução semanal de TRIM não é o suficiente. É recomendado alterar para uma execução diária.
Vamos verificar se tem a execução semanal do fstrim em nosso diretório do cron.
TRIM2.png

O parâmetro --all do fstrim executa o trim em todos file system que suportam o recurso.
Agora vamos mover o arquivo para o diretório de execução diária.
TRIM3.png

Agora é só reiniciar o seu computador que o recurso irá ser executado automaticamente.

Também podemos executar o recurso manualmente, utilizando o seguinte comando.

$ sudo fstrim -v /

Se você tiver mais de uma partição montada, adaptar o comando para executar em outras partições. Por exemplo na home:
$ fstrim -v /home

SSD - Noatime

Este Post faz parte de uma série de dicas para melhorar a performance e vida útil do drive SSD. Vide o post "A Odisseia do SSD".
 
A maioria das dicas de performance no SSD estão relacionadas com evitar gravação no disco. Esta dica é bem interessante e pode ser utilizada para melhorar a performance de sistemas que fazem muito acesso de leitura de arquivos em disco. Não é aplicável somente para drives SSD, podendo ser utilizado em todos os discos.

O noatime é um parâmetro para definir que o sistema operacional não grave o "access time stamp", que é a data na qual o arquivo foi acessado.
Esta informação é gravada na estrutura de “inode” dos arquivos.
Inodes são estruturas responsáveis por conter informações básicas sobre arquivos e pastas, tais como: permissões de acesso; identificação de donos dos arquivos; data e hora do último acesso e alterações; tamanho e o mais importante, os famosos ponteiros para o arquivo em si. Podemos dizer, que por conter informações únicas, o inode é a identidade de um arquivo ou diretório.

Vamos ilustrar como o OS altera a data de acesso no inode.
Vamos pegar como exemplo o arquivo wodim.conf.
Através do comando  ls -lhi wodim.conf, conseguimos o id do inode, que no caso é 2883827.
Utilizando o utilitário debugfs, passando o id do inode, conseguimos as informações.
Abaixo a imagem de como utilizar os comandos.

notime1.png

Podemos visualizar o “atime” do arquivo wodim.conf como sendo 09/01/2007.
Faz um bom tempo que este arquivo não é acessado.
Quando o sistema operacional, usuário, processo faz algum acesso a este arquivo, esta data é gravada com a data atual. Assim, gerando um evento de gravação em nosso sistema de arquivos.

noteim2.png

Agora vamos acessar o arquivo wodim.conf com o comando cat.
Retornando o conteúdo do arquivo o inode de atime será alterado para a data atual.

atime3.png

Executamos o comando debugfs novamente no arquivo wodim.conf e identificamos que a data “atime” foi atualizada com a data atual.
notime5.png

Com o exemplo acima, identificamos como o OS altera a informação do inode para cada acesso ao arquivo.
Imagina o quanto podemos “economizar” em escrita em disco desativando este recurso do Linux.

Para desativar o recurso de gravar a data de atime, editamos o arquivo /etc/fstab.
Na linha de comando digitamos o comando “sudo vi /etc/fstab”.
Eu utilizo o vi como editor de texto, podendo o freguês escolher o editor que tem familiaridade.
noATIMEULTIMO.png

Preste bastante atenção nos procedimentos abaixo!
Agora colocamos a palavra noatime na linha da sua partição primária, antes das palavras “errors=remount-ro”. Não adicione este comando na sua partição swap.
Exemplo:
UUID=xxxxxxx / ext4 noatime,errors=remount-ro 0 1
=> Não existe espaço entre a “,” e a palavra noatime, ficando “noatime,errors”. Preste bastante atenção, se digitar de forma diferente, irá ocorrer erros no boot do sistema operacional.

Depois de alterar o arquivo, reinicialize o sistema operacional e faça o teste que apresentamos acima, para verificar se está atualizando o campo atime no inode do arquivo.

SSD - Espaço reservado para overprovisioning do SSD

Este Post faz parte de uma série de dicas para melhorar a performance e vida útil do drive SSD. Vide o post "A Odisseia do SSD".
O firmware do fabricante pode reservar uma quantidade de espaço do disco SSD para fazer o overprovisioning (OP).
O OP melhora a performance e frequentemente aumenta a resistência do SSD, ajudando o aumento da vida útil.
É comum deixar um espaço de 7% do seu drive SSD para overprovisioning, assim definimos um espaço “unallocated” para evitar que todo espaço de disco seja ocupado.
Abaixo o cálculo conforme o tamanho de seu drive SSD.

5.png

Na minha formatação do Linux Mint padrão, não tinha definido o espaço deslocado para o overprovisioning. Eu tive um trabalho em liberar o espaço da minha partição primária.
Para desmontar a partição e liberar espaço do meu drive “sda1”, tive que gravar um pendrive “bootável” utilizando o software YUMI para rodar o Ubuntu.

Yumi por coincidência é o nome do segundo gato de estimação que eu tenho. Como sou o terceiro dono dele (ou ele é meu dono?!), nunca soube exatamente a origem do nome dele. Acredito que como é normal no mundo dos felinos, a mulher que adotou o Yumi, primeiramente, não conseguiu identificar se o bicho era macho ou fêmea. Assim, dando o nome feminino japonês de Yumi.
Assim até hoje o Yumi é um felino macho com nome feminino.  
Não teve como não lembrar do gato quando tive que utilizar este software, agora posso mudar esta lenda do nome dele para que seja uma homenagem a esta ferramenta interessante que faz um pendrive “bootável”. Aliás, nem sei o motivo de comentar isto, mas como é um blog pessoal, vamos relaxar… Segue uma foto do Yumi felino para os curiosos.

Yumi.jpg

Link para fazer o download do Yumi, somente para Windows :(

Depois de fazer boot com o Ubuntu pelo pendrive, utilizamos a ferramenta “Gparted” para liberar espaço da partição primária.
Caso esteja lendo este artigo antes de ter instalado o sistema operacional, sua vida será mais fácil no momento realizar o particionamento, deixando o espaço para overprovisioning desalocado.
Utilizando o Gparted, desmontamos a partição principal e utilizamos a função “resize” para liberar espaço para o OP.
Segue abaixo o print do espaço “unallocated” reservado para overprovisioning.
6.png

Se fizer falta depois de um tempo este espaço reservado para o OP, podemos fazer um outro resize voltando espaço para a partição primária.
 

Sobre o Blog

Neste blog irei compartilhar as minhas experiências e observações. Os temas serão variados, mas com ênfase em tecnologia. Inscreva-se nos nossos canais para receber atualizações.