Categoria: Programando

Feed desta categoria: programando

Ao tentar criar um projeto novo com o Flutter no Android Studio, aparece sempre o erro abaixo:

* Error running Gradle:
Exit code 1 from: /home/everton/AndroidStudioProjects/flutter_layout/android/gradlew app:properties:

FAILURE: Build failed with an exception.

* Where:
Build file '/home/everton/AndroidStudioProjects/flutter_layout/android/build.gradle' line: 24

* What went wrong:
A problem occurred evaluating root project 'android'.
> A problem occurred configuring project ':app'.
> No toolchains found in the NDK toolchains folder for ABI with prefix: mips64el-linux-android

Para corrigir:

  • Abrir o arquivo android/build.gradle e trocar gradle:3.0.1 por gradle:3.1.1;

Com isso, o erro vai mudar para algo assim:
> Failed to apply plugin [id 'com.android.application']
> Minimum supported Gradle version is 4.4. Current version is 4.1.

  • Abrir o arquivo android/gradle/wrapper/gradle-wrapper.properties e trocar gradle-4.1-all.zip por gradle-4.6-all.zip

Obs: O Android Studio avisa que a versão mais recente do gradle é a 3.2.1, mas não funciona com ela. Só consegui fazer funcionar com a 3.1.1.

 

Fonte: Uns mil sites e StackOverflow

Primeiro, criamos uma variável:
 var alguem_mexeu_no_meu_queijo = false;  

No evento change de qualquer elemento, alteramos essa variável, para sabermos que o usuário mexeu no formulário:
 $('select, input, textarea').change(function(){  
      alguem_mexeu_no_meu_queijo = true;  
 });  

Depois, no evento beforeunload da janela, precisamos ver se a variável foi alterada. 
Se sim, damos o alerta, perguntando se ele quer mesmo sair.
 window.onbeforeunload = function(){  
      if(alguem_mexeu_no_meu_queijo==true)  
      {  
           return 'Alguém mexeu no meu queijo.';  
      }  
 }  


Ah, quando o usuário envia o formulário, precisamos setar a variável como true, para que não apareça o alerta.
Se tu tiver usando o jquery validation, fica assim:
 $('#form').validate({  
     submitHandler: function(form) {  
                alguem_mexeu_no_meu_queijo = false; form.submit(); 
}
});
 

No apache:

Crie um arquivo .htaccess, com este conteúdo:

Update: Um jeito um pouco melhor de fazer isso:

RewriteEngine On
RewriteCond %{SERVER_PORT} 80
RewriteRule ^(.*)$ https://%{HTTP_HOST}/$1 [R,L]

RewriteEngine On
RewriteCond %{SERVER_PORT} 80
RewriteRule ^(.*)$ https://www.example.com/$1 [R,L]

Alguns comandos úteis (ou não) para o windows 10.

Girar a tela:

Ctrl+Alt+Seta para os lados

 

Usar vários desktops:

Win + Tab

Às vezes precisamos gerar uma pré-visualização de um bloco de HTML, mas o CSS da página atual pode (e provavelmente vai) conflitar com o da prévia.

Nesse caso, podemos jogar o conteúdo em um iframe:

$("#preview_01").contents().find('html').html($('#editor_html').val());

 

Esse é um exemplo de uso do plugin masked-input do jQuery para formatação de telefones com 8 ou 9 dígitos.

Quando o campo possui 8 ou menos dígitos, a formatação normal é aplicada, quando possui mais, a formatação é alterada (apesar de eu não concordar com essa formatação, mas enfim).

Link: http://digitalbush.com/projects/masked-input-plugin/

$('input[name="fone_cartao"]')
    .mask(
         "(99) 9999-9999?9"
        ,{
            placeholder:"xxx.xxx.xxx-xx"
        }
    )
    .change(function(){
        var valor = $(this).val().replace(/[^0-9]/g,'');
        if(valor.length > 10)
        {
            $(this).mask("(99) 99999-999?9");
        } else {
            $(this).mask("(99) 9999-9999?9");
        }
    }

);

Por causa das configurações de segurança dos navegadores (ou para os íntimos, CORS), não é possível (de um jeito simples) que um site a.com.br faça uma requisição ajax ao site b.com.br. Ao fazer isso, o seguinte erro será exibido no console, e a requisição, negada:

No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'a.com.br' is therefore not allowed access.

 

O jeito mais fácil de corrigir isso é fazer o script que recebe a requisição retornar um cabeçalho, autorizando o site a.com.br a realizar a requisição.

No htaccess:
Header Set Access-Control-Allow-Origin "*"

No PHP:

header("Access-Control-Allow-Origin: *");

 

Ao invés de liberar para qualquer domínio (e deixar o script aberto para qualquer um usar), é mais seguro ter uma lista de domínios que podem realizar a requisição ajax.

No htaccess, fica assim:

SetEnvIf Origin "http(s)?://(www\.)?(a.com.br|b.com.br|outrosite.com)$" AccessControlAllowOrigin=$0
Header add Access-Control-Allow-Origin %{AccessControlAllowOrigin}e env=AccessControlAllowOrigin

 

Fontes:

https://imasters.com.br/front-end/html/defina-cabecalhos-access-control-allow-origin-cors-no-apache-vhost-ou-htaccess/?trace=1519021197&source=single

https://enable-cors.org/server_php.html

Como 'gerar' um arquivo excel com php, todo mundo já sabe:

$arquivo = "export".date("dmY_His").".xls";
header("Content-Type: text/plain");
header("Content-Disposition: attachment; filename=\"$arquivo\";");

Mas como fazer com que as colunas fiquem com os tipos de dados certos, como por exemplo, os campos de data?

Simples: Criando o seguinte css:

.date {
  mso-number-format:"Short Date";
}

E aplicando este estilo na célula da tabela que contém o valor que deve ser formatado.

Aqui tem os formatos aceitos:

http://cosicimiento.blogspot.com.br/2008/11/styling-excel-cells-with-mso-number.html

Fonte:
http://cosicimiento.blogspot.com.br/2008/11/styling-excel-cells-with-mso-number.html
http://stackoverflow.com/questions/354476/html-to-excel-how-can-tell-excel-to-treat-columns-as-numbers

  1. Instalar o certbot:
    1. cd programas/
      mkdir certbot
      cd certbot/
      wget https://dl.eff.org/certbot-auto
      chmod a+x ./certbot-auto
  2. Baixar o script de automatização (ou automação?)
    1. Acessar https://tty1.net/blog/2015/using-letsencrypt-in-manual-mode_en.html
    2. copiar o script e salvar em um arquivo .sh (ex: auto.sh), e dar permissão de execução (chmod +x)
  3. Executar o script, informando os domínios a serem gerados:
    1. ./auto.sh teste.com www.teste.com
  4. Será exibido duas informações: uma url, e uma string com letras e números. A ideia aqui é subir no ftp um arquivo para que coincida com a url informada, e colocar no arquivo o conteúdo informado abaixo.
    1. Ex:Make sure your web server displays the following content at
      http://site.com.br/.well-known/acme-challenge/UmaStringGiganteComLetrasENumeros before continuing:

      UmaStringMaiorAindaComMaisCoisasAleatorias
      (o texto em laranja é a url, e o texto verde, o conteúdo exibido ao acessar esta url)
  5. Voltando ao terminal, pressionar ENTER.
  6. Ás vezes é necessário repetir os passos 4 e 5 algumas vezes até dar certo. Se der algum erro, precisa excluir a pasta com os certificados gerados antes de tentar de novo.
  7. Quando aparecer a mensagem de que funcionou (Congratulations!), será gerado um arquivo 000X_chain.pem. Este arquivo é dividido em duas partes. A primeira parte é referente ao arquivo .crt, e a segunda parte, ao .ca. Na pasta certs/dominio/, será gerado o arquivo privkey1.pem, que contém a chave privada.
  8. No Cpanel, procure a opção SSL. Depois, procure o lugar para carregar a chave privada. Cole a conteúdo do arquivo privkey1.pem no campo de texto, e clique em salvar.
  9. Depois, procure o lugar referente aos Certificados CRT. Cole a primeira parte do arquivo 000X_chain.pem onde pede para colocar o certificado.
  10. Procure a opção para gerenciar SSL no site.
    1. Selecione o domínio na lista, e clique em "Preenchimento automático".
    2. Clique no botão "instalar certificado".
  11. Acesse o site utilizando HTTPS no endereço.
  12. Não esqueça que o certificado dura só 3 meses, e precisa ser renovado. Para renovar todos os certificados, utilize o comando certbot
       renew.

Ao usar o autocomplete do jQuery UI em uma caixa de dialogo modal, pode acontecer de a lista gerada pelo autocomplete ficar por trás do modal, por causa do z-index.

Nesse caso, a gente força o plugin do autocomplete à ficar grudado com o elemento que está dentro da caixa de diálogo, assim ele herda o z-index da caixa de diálogo.

Ou seje:

$( ".autocomplete" ).autocomplete({
appendTo: "#idDoModal
});

 

Fonte: http://stackoverflow.com/questions/8685558/jqueryui-autocomplete-not-working-with-dialog-and-zindex

Às vezes, o Datatables fica dando este erro, mesmo quando a tabela está com o HTML correto.

Cannot read property 'mData' of undefined

No caso, o problema era que o cabeçalho da tabela tinha um colspan.

<table>
    <thead>
        <tr >
            <th>#</th>
            <th>Nome</th>
            <th>Data</th>
            <th colspan="2">Acoes</th>
        </tr>
    </thead>
    <tbody>...

O jeito foi separar as duas colunas em <th> separadas, que o erro desapareceu.

Fonte: http://stackoverflow.com/questions/25377637/datatables-cannot-read-property-mdata-of-undefined

Redirecionando de um domínio para outro, mantendo os parâmetros da url:

 

RewriteEngine on
RewriteCond %{SCRIPT_FILENAME} !-f
RewriteCond %{SCRIPT_FILENAME} !-d
RewriteRule ^(.*)$ http://novosite/$1 [QSA]

Assim:

CKEDITOR.instances.IdDoElemento.getData()

Lembrando que no lugar de IdDoElemento, vai, obviamente, o Id do elemento.

Lembrando também que é preciso ter cuidado com o óbvio, já que ele nem sempre é tão óbvio assim.

(a propósito: toda vez que vejo o nome CKDITOR, eu penso em FUCKEDITOR, principalmente quando ele não colabora comigo)


Uma das frases mais verdadeiras é aquela que diz que 'a solução do problema muda o problema'.

Quando eu troco um site de servidor, tenho que baixar todos os arquivos pro meu computador, pra depois enviar de novo pro novo lugar.
Quando o site é simples, isso é tranquilo. Nunca demora muito, porque o arquivo normalmente fica pequeno.
Mas quando o site tem um visual mais cheio de frescurinha, demora muito porque o arquivo fica muito grande.

Até que um dia eu descobri um jeito de enviar os arquivos de um servidor direto pro outro, sem precisar baixar pro meu pc. O que eu levava meia hora pra baixar, e uma hora pra enviar pro lugar novo, era feito em segundos.

Até que contrataram um novo servidor que não me deixa fazer isso. Ou seja, tenho que baixar e enviar tudo de novo...

..e enquanto isso, eles tão lá esperando eu receber e enviar, pra pegar as novas senhas pra voltar a usar o site. E provavelmente reclamando da minha demora.

Não com os dois ao mesmo tempo, obviamente.

Só pra lembrar: nunca defina o campo de data como DATETIME, a menos que tu precise contar quantos anos, dias, horas, minutos e segundos o vivente tem de existência. Se não for o caso, use apenas DATE.

 DATE_FORMAT(FROM_DAYS(TO_DAYS(CURDATE())-TO_DAYS(nascimento)), '%y') AS idade,  

Agora, com javascript:
 /*  
       * calcularIdade  
       * Calcula a idade baseada na data informada  
       * @param string string texto no formato d/m/Y  
       */  
      function calcularData(string){  
           var tmp = string.split('/');  
           var data = new Date(tmp[2], tmp[1], tmp[0]);  
           var hoje = new Date();  
           var idade = Math.floor((hoje-data) / (365.25 * 24 * 60 * 60 * 1000));  
           return idade;  
      }  
Fontes: ma.tt/2003/12/calculate-age-in-mysql/
http://stackoverflow.com/questions/5524743/jquery-age-calculation-on-date

Mexer com datas e php parece ser uma arte, algo que poucos dominam.

Eu, por exemplo, não sou um deles. Mas eu vou tentando.

Primeiro, precisamos setar o locale do servidor para nosso querido idioma:

 setlocale(LC_ALL, 'pt_BR.utf8'); 


Se o servidor for windows, só pra variar, tem que ser de um jeito diferente:
 setlocale(LC_ALL, 'ptb');  


Depois, usamos strftime pra escrever a data atual.

 echo strftime('%A, %d de %B de %Y, %H:%M');  

O resultado fica:
sexta-feira, 16 de agosto de 2013, 15:02