Retirar o cache do navegador – todas linguagens de programação

fevereiro 15, 2018 em Html, Php

The correct minimum set of headers that works across all mentioned clients (and proxies):

Cache-Control: no-cache, no-store, must-revalidate
Pragma: no-cache
Expires: 0

The Cache-Control is per the HTTP 1.1 spec for clients and proxies (and implicitly required by some clients next to Expires). The Pragma is per the HTTP 1.0 spec for prehistoric clients. The Expires is per the HTTP 1.0 and 1.1 spec for clients and proxies. In HTTP 1.1, the Cache-Controltakes precedence over Expires, so it’s after all for HTTP 1.0 proxies only.

If you don’t care about IE6 and its broken caching when serving pages over HTTPS with only no-store, then you could omit Cache-Control: no-cache.

Cache-Control: no-store, must-revalidate
Pragma: no-cache
Expires: 0

If you don’t care about IE6 nor HTTP 1.0 clients (HTTP 1.1 was introduced 1997), then you could omit Pragma.

Cache-Control: no-store, must-revalidate
Expires: 0

If you don’t care about HTTP 1.0 proxies either, then you could omit Expires.

Cache-Control: no-store, must-revalidate

On the other hand, if the server auto-includes a valid Date header, then you could theoretically omit Cache-Control too and rely on Expires only.

Date: Wed, 24 Aug 2016 18:32:02 GMT
Expires: 0

But that may fail if e.g. the enduser manipulates the operating system date and the client software is relying on it.

Other Cache-Control parameters such as max-age are irrelevant if the abovementioned Cache-Control parameters are specified. The Last-Modified header as included in most other answers here is only interesting if you actually want to cache the request, so you don’t need to specify it at all.

How to set it?

Using PHP:

header("Cache-Control: no-cache, no-store, must-revalidate");// HTTP 1.1.
header("Pragma: no-cache");// HTTP 1.0.
header("Expires: 0");// Proxies.

Using Java Servlet, or Node.js:

response.setHeader("Cache-Control","no-cache, no-store, must-revalidate");// HTTP 1.1.
response.setHeader("Pragma","no-cache");// HTTP 1.0.
response.setHeader("Expires","0");// Proxies.

Using ASP.NET-MVC

Response.Cache.SetCacheability(HttpCacheability.NoCache);// HTTP 1.1.Response.Cache.AppendCacheExtension("no-store, must-revalidate");Response.AppendHeader("Pragma","no-cache");// HTTP 1.0.Response.AppendHeader("Expires","0");// Proxies.

Using ASP.NET:

Response.AppendHeader("Cache-Control","no-cache, no-store, must-revalidate");// HTTP 1.1.Response.AppendHeader("Pragma","no-cache");// HTTP 1.0.Response.AppendHeader("Expires","0");// Proxies.

Using ASP:

Response.addHeader "Cache-Control","no-cache, no-store, must-revalidate"' HTTP 1.1.
Response.addHeader "Pragma","no-cache"' HTTP 1.0.
Response.addHeader "Expires","0"' Proxies.

Using Ruby on Rails, or Python/Flask:

response.headers["Cache-Control"]="no-cache, no-store, must-revalidate"# HTTP 1.1.
response.headers["Pragma"]="no-cache"# HTTP 1.0.
response.headers["Expires"]="0"# Proxies.

Using Python/Django:

response["Cache-Control"]="no-cache, no-store, must-revalidate"# HTTP 1.1.
response["Pragma"]="no-cache"# HTTP 1.0.
response["Expires"]="0"# Proxies.

Using Python/Pyramid:

request.response.headerlist.extend((('Cache-Control','no-cache, no-store, must-revalidate'),('Pragma','no-cache'),('Expires','0')))

Using Google Go:

responseWriter.Header().Set("Cache-Control","no-cache, no-store, must-revalidate")// HTTP 1.1.
responseWriter.Header().Set("Pragma","no-cache")// HTTP 1.0.
responseWriter.Header().Set("Expires","0")// Proxies.

Using Apache .htaccess file:

<IfModulemod_headers.c>
    Header set Cache-Control "no-cache, no-store, must-revalidate"
    Header set Pragma "no-cache"
    Header set Expires 0
</IfModule>

Using HTML4:

<metahttp-equiv="Cache-Control"content="no-cache, no-store, must-revalidate"/><metahttp-equiv="Pragma"content="no-cache"/><metahttp-equiv="Expires"content="0"/>

HTML meta tags vs HTTP response headers

Important to know is that when a HTML page is served over a HTTP connection, and a header is present in both the HTTP response headers and the HTML <meta http-equiv> tags, then the one specified in the HTTP response header will get precedence over the HTML meta tag. The HTML meta tag will only be used when the page is viewed from local disk file system via a file:// URL. See also W3 HTML spec chapter 5.2.2. Take care with this when you don’t specify them programmatically, because the webserver can namely include some default values.

Generally, you’d better just not specify the HTML meta tags to avoid confusion by starters, and rely on hard HTTP response headers. Moreover, specifically those <meta http-equiv> tags are invalidin HTML5. Only the http-equiv values listed in HTML5 specification are allowed.

Verifying the actual HTTP response headers

To verify the one and other, you can see/debug them in HTTP traffic monitor of webbrowser’s developer toolset. You can get there by pressing F12 in Chrome/Firefox23+/IE9+, and then opening the “Network” or “Net” tab panel, and then clicking the HTTP request of interest to uncover all detail about the HTTP request and response. The below screenshot is from Chrome:

Chrome developer toolset HTTP traffic monitor showing HTTP response headers on stackoverflow.com

I want to set those headers on file downloads too

First of all, this question and answer is targeted on “web pages” (HTML pages), not “file downloads” (PDF, zip, Excel, etc). You’d better have them cached and make use of some file version identifier somewhere in URI path or querystring to force a redownload on a changed file. When applying those no-cache headers on file downloads anyway, then beware of the IE7/8 bug when serving a file download over HTTPS instead of HTTP. For detail, see IE cannot download foo.jsf. IE was not able to open this internet site. The requested site is either unavailable or cannot be found.

Reference: https://stackoverflow.com/questions/49547/how-to-control-web-page-caching-across-all-browsers

Alteração de Host e apostamento no ubuntu

janeiro 26, 2018 em Linux, Ubuntu

Mudança de Hosts no Ubuntu para configuração de acesso via HTTP

 

a2dissite <configurador>.conf
service apache2 reload

vim /etc/apache2/sites-available/<configurador>.conf
(i) para editar
(:w!) para salvar
(:wq!) para salvar e sair
(:q!) sair sem salvar

a2ensite <configurador>.conf
service apache2 reload

 

 

para acesso pode criar um virtualhost da seguinte maneira

HOSTS
C:\windows\system32\drivers\etc\hosts
xxx.xxx.xxx.xxx  <nome_site>.com www.<nome_site>.com

Limit no agrupamento em Mysql

janeiro 18, 2018 em Mysql, SQL

Limit no agrupamento em Mysql

 

Imaginamos que é necessário coletar informações agrupadas com um limite de quantidade por agrupamento, todas informações por grupo em uma única query.
Recomendo fazer a busca e gerar isso na programação ou procedure, mas o método abaixo vai fazer o que precisa, mas deixará a busca lenta dependendo do tamanho da tabela.


Exemplo: 

PRODUTO  QTD    DATA
1                    1           18/01/2018
2                    1           18/01/2018
1                    1              10/11/2017
3                    1           18/01/2018
2                    1           05/01/2018
2                    1             03/01/2018
3                    1             11/12/2017
3                    1           22/12/2017
1                    1           05/12/2017

 

Esta query somente vai fazer com que você concatene e agrupe da forma que quer um campo, mas o resultado seria para todos os registros: 

select produto , GROUP_CONCAT(data_cadastro ORDER BY data_cadastro DESC) dategroup
from teste
group by produto;

 

Agora desta forma com o SUBSTRING_INDEX, você pode definir a quantidade de informações por registro que vai querer, imaginando que você quer somente 2(dois):
select produto , SUBSTRING_INDEX(GROUP_CONCAT(data_cadastro ORDER BY data_cadastro DESC), ‘,’, 2) dategroup
from teste
group by produto;

 

 

References:
 - https://stackoverflow.com/questions/2129693/using-limit-within-group-by-to-get-n-results-per-group
 - https://stackoverflow.com/questions/43254054/php-mysql-group-concat-limit/43254096

Comentário referencial no código, como FIXME TODO BUG ISSUE TODO como usar?

janeiro 17, 2018 em CakePhp, CodeIgniter, iGrape, Java, JavaScript, JQuery, Php, Spaguetti, WordPress

Você viu isto em código. Isto pode ser chamado de code tags.

Estritamente é um comentário como outro qualquer. Ele pode ter um significado específico para alguma ferramenta. É comum IDEs ou pelo menos extensões deles terem alguma coisa que vasculham o código procurando comentários que começam com:

  • TODO: (“para fazer”) Alguém [eu] precisa arrumar isso urgente
  • FIXME: (“me conserte”) Tem um erro que precisa ser consertado aqui, mas funciona (TOFIX:)
  • HACK: (“gambi”) Não teve outro jeito de resolver pra cumprir o prazo, depois melhoro
  • XXX: (“atenção”) Alguns editores destacam comentários com isto como algo importante sem dar semântica específica
  • DONE: (“feito”) Avisar que o TODO está resolvido. Quando remover isto?
  • UNDONE: (“desfeito”) Precisei voltar ao original por alguma razão
  • ASAP: (“tão rápido quanto possível”) Precisa arrumar isso urgente
  • REMOVE: (“remova”) Esse código foi colocado só para testar algo e deve sumir
  • NOTE: (“anotação”) Só para informar que tem algo importante agora
  • BUG: (“falha”) Tem um bug conhecido aqui que precisa ser arrumado – especialização do FIXME – costuma ter um número de ticket associado
  • ISSUE: (“questão”) Há uma dúvida aqui se deve ser assim mesmo
  • ERROR: (“erro”) Tem um erro reproduzível aqui – especialização do FIXME
  • BROKEN: (“quebrado”) não vai pra frente mesmo, não adianta insistir – especialização do FIXME
  • GLITCH (“falha”) Algo estranho ocorre aqui em situação bem específica
  • REVIEW: (“revise”) Revise isso pra mim, usado onde se costuma fazer peer review
  • WTF: (“que p0rr@ é essa?”) Fizeram um besteira muito grande aqui

 

Exemplo de Utilização:

 

// TODO: alguma coisa escrita
código....

 

 

Referencehttps://pt.stackoverflow.com/questions/121245/todo-o-que-%C3%A9-qual-sua-utilidade-e-como-usar

Como utilizar método de outra controller em cakephp

janeiro 15, 2018 em CakePhp

Como utilizar método de outra controller em cakephp

 

Para carregar outra controller ou fazer a chamada dela, vocÊ pode utlizar o requestAction.

Exemplo:

echo $this->requestAction(
    array('controller' => 'articles', 'action' => 'featured'),
    array('named' => array('limit' => 3))
);

 ou

echo $this->requestAction(
    array('controller' => 'articles', 'action' => 'featured'),
    array('named' => array('limit' => 3))
);

echo $this->requestAction(
    array('controller' => 'articles', 'action' => 'view'),
    array('pass' => array(5))
);

 

 

Outra forma é:

App::import(‘Controller’, ‘Posts’);
$post = new PostsController();
$post->myFunction();

 

Diferente de quando usamos o $this->loadModel(‘Posts’) que irá efetuar execuções para o banco de dados, como o “find” ou “save”.

 

 

Referência: https://book.cakephp.org/2.0/en/controllers.html
Referência: https://stackoverflow.com/questions/7902293/how-to-use-methods-from-other-controllers-in-cakephp

Calendário no QlikSense

janeiro 11, 2018 em QlikSense

Calendário no QlikSense

Calendário encontrado que funciona bem é o: SenseDateRangePicker, e o mesmo faz é uma extensão que está no branch do qliksense.

 

Abaixo segue o Github do SenseDateRangePicker:

Download: https://github.com/NOD507/SenseDateRangePicker

 

Para que este funcione corretamente, você precisa adicionar na data que irá utilizar o seguinte comando na seu load da querie:

Date(<DATA_CADASTRO>,’YYYY.MM.DD’) as DATA_CADASTRO,

Na Dimensão do Calendário coloque o campo de data:  =DATA_CADASTRO

Reference: https://qlikcommunity.qliktech.com/thread/225616

Como referenciar código ao invés do texto no filtro do gráfico do QlikSense

janeiro 2, 2018 em QlikSense

Como referenciar código ao invés do texto no filtro do gráfico do qliksense

Quando temos um contexto de informações do tipo repetitivo como por exemplo:

Pergunta 1 (cod_pergunta 1)

  • Sim (cod_opcao 1) 10 – pessoas
  • Não (cod_opcao 2)  8 – pessoas

Pergunta 2 (cod_pergunta 2)

  • Sim ( cod_opcao 3) 21 – pessoas
  • Não (cod_opcao 4) 2 – pessoas

Imagine que pegaremos um gráfico pizza para cada questão acima, mas quando iremos clicar na questão 1 (sim) para filtrar quantas pessoas, automaticamente o QlikView ou QlikSense, ele filtra pelo texto e não pelo código da opção, e apareceria para o cliente 31 pessoas ao invés de 10 pessoas.
Caso coloque por exemplo: cod_opcao, ao invés de aparecer no gráfico o nome “SIM” aparecerá o código dele “1″, e o filtro funciona corretamente, mas fica visualmente inviável para um cliente.

 

Então para que seja possível adicionar o texto no gráfico e ao mesmo tempo filtrar pelo código,  é necessário colocar uma função chamada DUAL.

Exemplo: =dual(nome_opcao,cod_opcao)

Desta maneira o nome exibido ficará “Sim” e o código e quando clicado, fará o filtro pelo código “1″.

 

Referência: Curso Nordica

Como alterar a pasta padrão de carregamento do Qlik Sense

dezembro 28, 2017 em QlikSense

Como alterar a pasta padrão de carregamento do Qlik Sense

Para efetuar a alteração padrão você deve:

  • Fechar o seu QlikSense.
  • Depois vai até a pasta: C:\Usuários\<usuariodosistema>\Documentos\Qlik\Sense
  • Agora crie uma cópia do arquivo “settings.ini” e o nome da cópia deixe como “settings_backup.ini”.
  • Agora no arquivo “settings.ini” adicione a linha:

DocumentDirectory=\\server\share

Aviso: O arquivo settings.ini deve ficar com uma linha vazia como a imagem abaixo:

Settings-ini-default.png

Linha 3 está vazia.

  • A partir de agora quando executar seu qliksense, ele estará com caminho default como:  \\serve\share

Referencehttps://community.qlik.com/thread/237545

Dicionário de Dados

dezembro 7, 2017 em Mysql, PostgreSql, SQL

Comandos SQL

SELECT
TABLE_NAME as Tabela,
COLUMN_NAME as Coluna,
DATA_TYPE as Tipo,
CHARACTER_MAXIMUM_LENGTH,
NUMERIC_PRECISION,
NUMERIC_SCALE
FROM INFORMATION_SCHEMA.COLUMNS
WHERE  TABLE_NAME = ‘acl_action’
GROUP BY COLUMN_NAME
ORDER BY  COLUMN_KEY DESC;

Referência: http://sqlfromhell.wordpress.com/category/dicionarios-de-dados/

Valida email via jquery

dezembro 7, 2017 em Php

Validação de E-mail em Jquery

 

function IsEmail(email) {
var regex = /^([a-zA-Z0-9_.+-])+\@(([a-zA-Z0-9-])+\.)+([a-zA-Z0-9]{2,4})+$/;
return regex.test(email);
}