Categoria: Programando

Feed desta categoria: programando

THE LESSER-KNOWN PROGRAMMING LANGUAGES #18: FIFTH

FIFTH is a precision mathematical language in which the data types refer to quantity. The data types range from CC, OUNCE, SHOT, and JIGGER to FIFTH (hence the name of the language), LITER, MAGNUM and BLOTTO. Commands refer to ingredients such as CHABLIS, CHARDONNAY, CABERNET, GIN, VERMOUTH, VODKA, SCOTCH, and WHATEVERSAROUND.

The many versions of the FIFTH language reflect the sophistication and financial status of its users. Commands in the ELITE dialect include VSOP and LAFITE, while commands in the GUTTER dialect include HOOTCH and RIPPLE. The latter is a favorite of frustrated FORTH programmers who end up using this language.

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