Montar volumes no Docker (No Windows)

Cá estou eu, mil anos depois, mantendo toda aquela aleatoriedade na vida e estudando pra variar!rs

No momento estudando Docker. Estudo vai, estudo vem, cheguei na parte de fazer uma montagem por vinculação. Que é quando a gente vai montar um volume no docker deixando ele vinculado no nosso host para que a gente mantenha os arquivos gravados na nossa máquina e não os perca quando o container for removido.

Como faz?


docker run -v "D:\meu\diretorio:/app" identidock

Qual o problema? Eu não uso o Docker for Windows porque eu sou pobre e uso o Windows 10 Home Single no momento. E para instalar o Docker for Windows é necessário o Windows 10 Professional ou Enterprise 64-bit. Sendo assim utilizo o Docker Toolbox e se tento montar o volume igual todo mundo (Linux, Docker for Windows, Mac [acho]) recebo o erro abaixo:

“Error response from daemon: invalid mode: …”

docker_error_mount_volume

Se tu está limitado tanto quanto eu, veja bem… É simples resolver! \o/

Quando você instalou o Docker Toolbox veio o Oracle VM VirtualBox não veio? Então você vai lá nele e veja que deve ter uma máquina “default” rodando por lá.

vm_virtualbox

Daí você clica em “Configurações” , vai na abinha “Pastas Compartilhadas” e adiciona uma pasta compartilhada colocando o endereço que você quer montar no volume do seu container e dê um nome para ele também.

vm_virtualbox_pastacompartilhada

Aí agora você substitui no seu comando docker run, o caminho do seu host pelo nome da pasta compartilhada que você criou no VirtualBox. 🙂


docker run -v "/identidock_app:/app" identidock

docker_mount_volume

Sucesso né? ❤

Anúncios

Android – Erro de keytool x Fingerprint Google Maps

Pois bem, se você chegou até este post é sinal de que você já deve saber que para trabalhar com mapas do google em aplicativos Android é necessário gerar uma chave que vai identificar a sua solicitação de mapa pelo seu aplicativo.

Para gerar esta chave, é necessário realizar o seguinte comando. No windows, talvez seja necessário que você esteja dentro da pasta bin da sua instalação do Java.

keytool -list -alias androiddebugkey -keystore "" -storepass android -keypass android

No lugar de “<pasta_do_debug.keystore>”, coloque o endereço da pasta que possui o arquivo debug.keystore. Para localizar este arquivo, se você usa o eclipse, acesse o menu ‘Window’ > ‘Preferences’. Expanda o item ‘Android’ e em ‘Build’ copie o caminho especificado em ‘Default debug keystore’.

O que eu realmente quero falar, é que se você estiver usando o Windows em Português, você pode receber a seguinte mensagem de erro após tentar executar o comando acima:

erro de keytool: java.lang.IllegalArgumentException: unknown format type at

Este erro aconteceu aqui comigo, e no caso eu resolvi isto trocando ‘Formato’ e ‘Local’ em ‘Região e Idioma’ para Inglês (Estados Unidos).

PHP (Erro: Allowed memory size)

Olá queridinhos,

Estava eu, linda e pomposa, gerando meus relatórios em PDF utilizando a biblioteca mPDF. O caso não é o PDF, mas se quiserem conhecer melhor esta biblioteca clique aqui #indico.

O caso é que em um determinado momento eu gerei uma listagem grande (18 páginas em PDF), mas ao invés de visualizar o PDF lindo eu recebi o erro abaixo:

Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 261904 bytes) in caminhoTal on line numeroTal

E aí? O que houve?

Aconteceu que o script que está sendo processado estourou o limite de memória indicado na configuração do PHP (php.ini). Sim, existe uma diretiva no php.ini chamada memory_limit que vai definir o máximo de memória que os seus scripts podem gastar. Até o PHP 5.2.0 o padrão desta variável era “8M” e a partir do PHP 5.2.0 ela recebe “16M” como padrão.

No momento eu estou com a versão 5.3.5 do PHP, mas mesmo assim a minha rotina extravazou o limite de memória.

Qual a solução?

Existe uma função do PHP que se chama ini_set e ela nos permite definir um novo valor para uma opção de configuração. Ela recebe dois parâmetros (string $varname, string $newvalue), no primeiro informamos a opção de configuração que queremos alterar e no segundo passamos o novo valor dessa configuração. Mais detalhes sobre a função ini_set aqui.

Claro que vale lembrar que alguns servidores não permitem que você altere as configurações do PHP e também bloqueiam a alteração de algumas configurações pela função ini_set, então vale verificar!

Então, antes do meu script eu inseri a seguinte linha:

<?
ini_set('memory_limit', '-1');
?>

Percebam que o meu $varname é igual a ‘memory_limit‘ e o meu $newvalue é igual a ‘-1’.

No lugar de ‘-1’ eu poderia ter informado um valor em megabytes, por exemplo “32M”, “64M” ou até “1024M”.

Acontece que neste caso eu estou gerando um relatório (listagem de dados), e essa listagem pode variar e muito no seu tamanho. Neste momento se trata de uma listagem de 18 páginas, mas futuramente ela pode ser 20, 30 ou mais páginas.

Então o $newvalue igual a ‘-1’ informa à minha configuração que eu NÃO quero impor um limite de memória neste momento.

 

Bom.. o que eu queria mostrar é isso. Espero poder ajudar alguém com isso.

Para conhecer mais algumas diretivas do php.ini leia isso.

😉

jQuery UI (Buttonset)

Não é de hoje que o JQueryUI vem ajudando a nossa vida né?? \o/

Pois bem, venho falar hoje sobre um item muito interessante que eu trabalhei recentemente que é o “ButtonSet”. Ele nada mais é que um grupo de checkboxes com o visual de botão, isso aí… aqueles grupos de ‘botões’ que você aperta e ele permanece pressionado!

Primeiramente, faz o favor de baixar o JQueryUI lá no site oficial. Descompacta na sua pastinha de trabalho e vamos lá.
Hoje o JqueryUI está na sua versão 1.8.20 e já trás junto o JQuery versão 1.7.2.

Eu criei uma pastinha de trabalho chamada ‘ExemploBuuttonSet’ e descompactei os arquivos do JQueryUI dentro de uma outra pasta chamada ‘jquery-ui’.

Depois criei um arquivo html ‘buttonSet.html’ para importar os arquivos necessários para o JQueryUI funcionar, da seguinte forma:


<link type="text/css" href="jquery-ui/css/ui-darkness/jquery-ui-1.8.20.custom.css" rel="stylesheet" />
<script type="text/javascript" src="jquery-ui/js/jquery-1.7.2.min.js"></script>
<script type="text/javascript" src="jquery-ui/js/jquery-ui-1.8.20.custom.min.js"></script>

Após importar os arquivos do JQueryUI vamos criar uma div que conterá todos os checkboxes do nosso exemplo:

<div id="format">
  <input type="checkbox" id="check1" value="check1" />
    <label for="check1">Elaine</label>
  <input type="checkbox" id="check2" value="check2"/>
    <label for="check2">Cristina</label>
  <input type="checkbox" id="check3" value="check3" />
    <label for="check3">Rocha</label>
  <input type="checkbox" id="check4" value="check4" />
    <label for="check4">Oliveira</label>
</div>

Para ativar o buttonSet nos meus checkboxes que estão dentro da div ‘format’, eu faço o seguinte código. Este código pode ser inserido logo abaixo do código de importação dos arquivos do jQueryUI:

<script>
  $(function(){
    $("#format").buttonset();
  });
</script>

Pronto! Com esse código nós já temos o seguinte resultado.

Exemplo ButtonSet JQueryUI
Exemplo ButtonSet JQueryUI

Neste caso eu baixei o JQueryUI com o tema ‘ui-darkness’. Então a cor cinza representa os botões não clicados, o azul aparece quando colocamos o mouse sobre o botão e o laranja representa o botão clicado/marcado.

Para o sistema que estou desenvolvendo, eu utilizei esta série de botões para que o meu usuário pudesse selecionar as colunas que ele quer que um relatório exiba. Então ao marcar ou desmarcar um botão, eu tenho que atualizar uma tabela temporária e para isso eu chamo uma função javascript que vai disparar todo o processo.

Enfim… no fim das contas eu precisava que ao clicar em qualquer um destes botões, uma função fosse chamada para que eu pudesse pegar o id do checkbox clicado para disparar minha função.

Para fazer isso eu fiz o seguinte código:

<script>
  $(function() {
    $("format input:checkbox").click(function() {
      alert(this.id);
    });
  });
</script>

E olha só que legal! Ao clicar em cada um dos meus botões, eu consigo pegar o id dele por exemplo. Com isso e mais um pouco de trabalho já dá pra fazer muita coisa legal no seu sistema.

Para quem quiser… Baixe o exemplo aqui!

É isso aí! Espero ter ajudado…
😉

Variáveis (JavaScript x PHP)

Pois é, pode parecer até gambi né mas às vezes nós precisamos pegar o valor de uma variável PHP e jogar para uma variável JavaScript e vice-versa.

Até que é simples, veja o primeiro exemplo de pegar uma variável PHP e jogar para JavaScript:


 


//pegando a variável php e jogando numa variável javascript
var variavelJS = '';
alert(variavelJS);

Agora vamos fazer o contrário e escrever uma variável JavaScript através do nosso código PHP:


//criando variável JS
var variavelParaPHP= 'Elaine Cristina';

 

<?
//escrevendo a variável JS pelo PHP
echo "document.write(variavelParaPHP);"
?>

É uma bobeirinha, mas que muitos demoram a entender. Eu mesma quando estava começando a programar demorei um bocado para saber usar isso.

Confesso que utilizo mais a primeira opção, de passar uma variável PHP numa chamada JavaScript. Então fica aí disponível pra qualquer pessoa que estiver precisando de uma luzinha.

Espero que sirva pra alguém…rsrs

😉

Html5 e Geolocalização

Recentemente eu me deparei com a necessidade, de saber a localização de um usuário no momento em que ele está preenchendo uma tela de cadastro. E graças ao HTML5, hoje nós podemos fazer esse tipo de monitoramento.

Primeiro, vamos entender que existem três maneiras do agente de usuário descobrir a nossa posição:

  • Geolocalização IP – essa forma é usada pela maioria dos navegadores nos nossos computadores. Utilizam-se de consultas whois e serviços de localização de IP que permitem determinar a cidade ou a região em que você está.
  • Triangulação GPRS – basicamente para celulares sem GPS ou com GPS desligado. Para estes casos, é possível determinar a sua posição através da triangulação das antenas GPRS mais próximas. Mais preciso do que a Geolocalização IP, consegue mostrar em qual parte do bairro você está.
  • GPS – é a forma de localização mais precisa, com margem de erro de apenas uns 5 metros. Pode ser usada por celulares ou tablets com o GPS ligado.

Pois bem, conhecendo melhor internamente as várias formas de se localizar o nosso usuário. Vamos ao que interessa…. como saber onde ele está enquanto está navegando ou fazendo um cadastro no meu sistema web?

Basicamente, em primeiro lugar precisamos saber se o agente do usuário tem suporte à geolocalização do Html5 e se possuir, eu chamarei o script que busca a geolocalização.

if (navigator.geolocation){
  navigator.geolocation.getCurrentPosition(getPosicao, displayError);
}

Percebam que eu chamei a função ‘getCurrentPosition’ e que ela recebe dois parâmetros (getPosicao e displayError). Esses dois parâmetros, são funções callback.

  • A primeira função recebe um objeto de posicionamento, e é através dele que conseguimos pegar a latitude e longitude da minha localização.
function getPosicao(position){
  lat = position.coords.latitude;
  lon = position.coords.longitude;
  alert('Sua posicao: '+ lat + ' - ' + lon);
 }
  • A segunda função serve para fazer o tratamento de erro. O nosso usuário pode escolher por não compartilhar sua posição, ou qualquer outra coisa pode dar errado na hora de pegar a geolocalização. Cada erro possui um código que vai de 0 a 3. É possível ver os significados dos erros na função abaixo.
function displayError(error) {
  var errors = {
    0: 'Erro Desconhecido',
    1: 'Permissão negada',
    2: 'Posição indisponível',
    3: 'Timeout'
  };
  alert('Ocorreu um erro: ' + errors[error.code]);
}
  • Ainda é possível enviar para a função ‘getCurrentPosition’, um terceiro parâmetro que é um objeto de configuração. Esse objeto não será utilizado neste exemplo, mas ele pode ter três propriedades: enableHighAccuracy (true/false para o modo de alta precisão), timeout (tempo máximo em milissegundos para esperar pela posição), maximumAge (tempo máximo em milissegundos que o navegador pode cachear a posição).

Pronto! Com isso você já consegue pegar a localização do seu usuário. A partir daí você pode exibir essas informações na tela, usar a api do google maps e exibir um mapa, mandar essa informação para algum campo hidden no seu formulário e salvar essa informação no seu banco de dados. Enfim, com essas informações você já pode desenvolver a situação que for necessária.

😉

SEO – Otimização Externa

Dando continuidade ao post anterior, onde tratamos de identificar o que é SEO e os principais fatores de otimização interna, vamos falar agora sobre os fatores de Otimização Externa, ou OffPage SEO.

Trata-se  de todos os fatores que estão fora do site mas que ao serem bem trabalhados podem ser o que vai realmente alavancar o seu site para as principais posições nos resultados de pesquisa.

 

Vamos listar então os principais fatores de Otimização Externa:

  • Apontamento de sites – refere-se à quantidade e qualidade dos sites que apontam para o site que está sendo otimizado. Quanto mais links externos, melhor será para o seu posicionamento nos resultados.
  • Textos dos links externos – tem a ver com o texto que está descrevendo o site apontado. O mais indicado é que  os links externos citem a sua palavra-chave.
  • Page Rank – quanto maior o page rank do site externo que está apontando para o seu, melhor.
  • Quantidade de links
  • Popularidade dos links
  • Endereços IP – quanto mais endereços IPs diferentes estiverem apontando para o site, melhor será para a sua otimização.
Além de observar a boa utilização desses fatores, é interessante fazer um levantamento dos fatores mais trabalhados pelos sites concorrentes ao seu. Pois assim será possível saber em que ponto você terá que focar mais para ultrapassar o seu concorrente nos resultados de pesquisa.
#ficadica