tag:blogger.com,1999:blog-234297702024-03-07T05:05:10.654-04:00El MicoxJavaScript, Ajax, DOM, Webstandards, dicas e outras coisas.Unknownnoreply@blogger.comBlogger156125tag:blogger.com,1999:blog-23429770.post-67790226955579815722019-03-26T22:10:00.000-04:002019-03-26T22:10:01.003-04:00Indicadores de RH e Gestão de Pessoas - parte 1 - Funções de Gestão de Pessoas e Definição de indicadoresEm 2018, concluí minha pós-graduação em Controladoria e Finanças na Universo. Como trabalho de conclusão, sob orientação de do prof. André Costa, voltei-me a área controladoria, focando em indicadores de desempenho para RH (Recurso Humanos ou Gestão de Pessoas, não foquei na diferença dos termos), por estar envolvido na área.<br />
<br />
Nesta série de postagens, condensarei de forma prática os pontos importantes do trabalho. O trabalho completo está no Google Drive: <a href="https://drive.google.com/file/d/1ENR3xKnJRCvpfGAt6yM_dvlHM0vSgc2s/view?usp=sharing" target="_blank">Indicadores de RH e Gestão de Pessoas</a><br />
<br />
<br />
<h4>
INDICADORES DE DESEMPENHO PARA A GESTÃO DE PESSOAS EM EMPRESAS DE MÉDIO E GRANDE PORTE - NAIRON 2017 - UNIP - PARTE 1</h4>
A Gestão de Pessoas possui papel crucial na busca pelos objetivos estratégicos das empresas. Um sistema de medição de desempenho baseado em indicadores numéricos estratégicos permite à Controladoria e à equipe de Gestão de Pessoas alinhar os objetivos departamentais da área de Gestão de Pessoas com o Planejamento Estratégico da empresa. No entanto, por tratar de temas aparentemente intangíveis, a Gestão de Pessoas pode encontrar dificuldades na definição de indicadores e metas. Através de pesquisa bibliográfica, este artigo apresenta um conjunto de indicadores para cada função da área de Recursos Humanos (RH) de forma a permitir que a Controladoria, Alta Direção e o próprio RH possam medir e alinhar suas ações ao Planejamento Estratégico.<br />
<br />
Palavras-chave: indicadores, kpi, controladoria, recursos humanos, gestão de pessoas, planejamento estratégico.
<br />
<br />
[...]
<br />
<b>Vai:</b><br />
<br />
Com a finalidade de efetuar a medição dos resultados, visando a qualidade, é indispensável a utilização de indicadores de desempenho. Indicadores são formas mensuráveis de representação das características de processos e produtos (TAKASHINA & FLORES, 2005 apud NUINTIN & NAKAO, 2011).
<br />
<br />
Tendo em vista a definição acima, a área de Gestão de Pessoas encontra dificuldades na definição do que seria “o produto” a ser mensurado, devido aos diversos assuntos intangíveis que a permeiam. Questões como satisfação dos empregados, interesses dos empregadores, eficácia do processo principal e redução de passivos futuros são alguns destes aspectos de difícil mensuração. Igualmente, a área de Controladoria tem seu papel preventivo e controlador prejudicado por estas indefinições.
<br />
<br />
[...]<br />
<br />
Este artigo tem o propósito de apresentar um conjunto de indicadores de desempenho voltado à gestão de pessoas, onde seja possível abordar variáveis tangíveis e intangíveis. Através destes indicadores, espera-se que os gestores da área de Recursos Humanos e Controladoria possam escolher melhor os indicadores que desejam trabalhar e alinhar o Planejamento Estratégico às funções de Gestão de Pessoas, mensurando resultados através de comparações históricas ou com outras empresas.<br />
<br />
Este artigo não tem como propósito detalhar as teorias de Gestão de Pessoas nem as metodologias de elaboração do Planejamento Estratégico, mas sim realizar uma pesquisa bibliográfica sobre os principais indicadores de desempenho da área de Gestão de Pessoas, que possam ser escolhidos e utilizados pela área de Controladoria e Recursos Humanos de várias empresas. Também consideramos inviável definir metas para tais indicadores, tendo em vista que a definição das metas está intimamente ligada à estratégia única de cada empresa.<br />
<br />
A principal questão que este trabalho buscará clarificar será qual a gama de indicadores as empresas podem utilizar para avaliar o desempenho da gestão de pessoas de forma a possibilitar melhor conexão com os objetivos estratégicos.<br />
<br />
[...]<br />
<br />
<b>Conceituação de Indicadores de desempenho </b><br />
<br />
Os sistemas informatizados têm levado à possibilidade de extração de inúmeros dados das bases de recursos humanos: quantidade de empregados, custo total, custo por área, minutos de falta, absenteísmo por categoria, segmentação por idade, por sexo etc. Vivemos a era do Big Data. A criação de infinitos números não tem relação qualquer com o bom planejamento se não estiverem ligados a um objetivo estratégico.<br />
<br />
Indicadores não são apenas números, dados, informações. Indicadores devem fazer o que o nome diz: indicar, indicar o caminho. Um número solto, sem ligação com um objetivo é apenas um número e não gera informação útil na tomada de decisão.<br />
<br />
Como exemplo, tomemos as informações “Quantidade de empregados” ou “horas de treinamento”. Imagine qualquer empresa e qualquer número: doze, quinhentos, dois mil. Estes números não dizem nada se não estiverem ligados a um objetivo ou a uma comparação. <br />
Segundo Lima (2005) apud Navarro (2005), deve-se ter definido que “as medidas, isoladamente, não são geralmente capazes de fornecer informações suficientes para tomada de decisão”.<br />
<br />
[...]<br />
<br />
Na criação de um indicador, deve ser definido um bom nome (não complexo demais ou curto demais), a forma de cálculo, a periodicidade de atualização e o responsável pela atualização. Nem sempre o responsável pela atualização será o responsável pela melhoria ou atingimento da meta ligada ao indicador. Meta é o objetivo a se alcançar transformado em número ligado ao indicador.<br />
<br />
<br />
<b>Funções e objetivos comuns à área de Gestão de Pessoas </b><br />
<br />
Conforme explicado, para termos bons indicadores precisamos de tarefas e objetivos bem definidos. Tentaremos, neste tópico, chegar às funções e objetivos mais comuns à área de Gestão de Pessoas ou Recursos Humanos (RH) em empresas de médio e grande porte, independentemente do modelo de planejamento estratégico ou política de gestão de pessoas escolhida pelas empresas. <br />
<br />
[...]<br />
<br />
(Após pesquisa bibliográfica disponível no trabalho completo:) Dessa forma, agruparemos os indicadores através das funções: (1) Planejamento de Recursos Humanos, (2) Recrutamento e Seleção, (3) Avaliação de Desempenho, (4) Administração de Cargos, Salários e Carreiras, (5) Treinamento e Desenvolvimento, (6) Saúde, Segurança e Qualidade de vida, (7) Função Legal e (8) Gestão do Clima Organizacional.<br />
<br />
<b>Finalmente: Indicadores à Gestão de Pessoas</b><br />
<br />
Geralmente, um mesmo indicador será útil para várias funções de Gestão de Pessoas e não apenas uma função. Tentaremos organizar os indicadores nas funções onde consideramos que o mesmo é mais importante.<br />
<br />
A periodicidade de apuração de cada indicador costuma variar de acordo com o fluxo de trabalho e acompanhamento de cada empresa, podendo ser mensal, anual ou por evento. Indicadores percentuais devem ser convertidos multiplicando-se o resultado por 100%.<br />
<br />
<b>3.3.1<span style="white-space: pre;"> </span>Indicadores de Planejamento de RH </b><br />
<br />
<b>a) Rotatividade (turnover)</b><br />
<br />
O índice de rotatividade ou turnover diz respeito à quantidade relativa de colaboradores que deixaram a empresa dentro de determinado período. Este indicador é importante para o planejamento de RH pois possibilita, entre outras análises, a identificação da periodicidade ideal para novas contratações.<br />
<br />
Método de apuração: Este é outro indicador com diversas formas de apuração. A que consideramos mais proveitosa por envolver também a mensuração de empregados admitidos é somar a quantidade de empregados demitidos com a quantidade de empregados admitidos, em seguida dividir pelo total de empregados ao final do período analisado.<br />
<br />
Consideramos bastante útil que o indicador seja medido a nível de departamento, de forma a identificar as áreas com menor ou maior rotatividade (possível problema de clima) e também haja estratificação de demissões a pedido ou demissões por parte da empresa.<br />
<br />
Ligado às funções: planejamento de RH (definição de periodicidade e<br />
quantitativos para as novas contratações), recrutamento e seleção (alta rotatividade pode indicar seleção de candidatos errados), administração de cargos, salários e carreiras (pode indicar que a empresa não é atrativa para os talentos), qualidade de vida (pode indicar que a empresa ou determinados departamentos são estressantes) e gestão do clima organizacional.<br />
<br />
<b>b) Média de horas extras por empregado </b><br />
<br />
Horas extras são as horas trabalhadas além do regularmente contratado com os empregados, pelas quais os mesmos recebem remuneração maior que a habitual. São fortemente regulamentadas pela CLT (Decreto-Lei N.º 5.452/1943). Como a execução de horas extras é mais cara que a execução de horas normais, há que se planejar até que ponto elas são vantajosas.<br />
<br />
A execução de horas extras constantes, concentradas em um departamento ou grupo de empregados, mesmo que em pouca quantidade, indica necessidade de pessoal ou falta de controle interno nos registros de ponto (entrada e saída do trabalho).<br />
<br />
Método de apuração: Quantidade de horas extras dividido pela quantidade de empregados.<br />
<br />
Ligado às funções: planejamento de RH, qualidade de vida (empregados<br />
submetidos a várias horas de trabalho tendem a apresentar maior stress), função legal, Administração de Cargos Salários e Carreiras.<br />
<br />
(continua amanhã)Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-23429770.post-34877125286561203592013-12-20T09:21:00.007-03:002013-12-20T09:38:07.259-03:00Aplicando efeito fade ciclicamente a um conjunto de imagens com jQuerySenhores.
<br />
<br />
Precisei aplicar um efeito de fade para fazer transição entre várias imagens de uma galeria.
Pra isso eu sempre usava o velho plugin jQuery cycle, mas dessa vez o bixo não ajudou.
<br />
<br />
Porém o jQuery Cycle dá uma modificada em propriedades como top e width das imagens que não estava me sendo útil.
Além disso, ele aplica o efeito em imagens que ainda não estão carregadas, o que fica feio pra caramba.
<br />
<br />
Como eu precisava de algo simples e não de todas as funcionalidades do jQuery Cycle preferi programar rapidinho esta transição.
<br />
<br />
Meu código, atualmente é só pra fade, mas quem entende de jQuery sabe que é só mudar o nome do efeito que está lá na definição do fadeInterval.
<br />
<br />
Outro benefício do meu código é que ele não exibe imagens ainda não carregadas.
<br />
<br />
O código está abaixo:
<br />
<br />
<textarea style="height: 500px; width: 100%;">function micoxFadeCycle($targetJqObj, imgArr, waitTime){
//by elmicox.blogspot.com
var $targetJqObj = (typeof $targetJqObj=='string') ? $($targetJqObj) : $targetJqObj;
var waitTime = waitTime ? waitTime : 3000;
var loadedcount=0, $imgAtual, $first, fadeInterval;
var putImages = function(imgArr){
var i, $img, $notLoaded;
$notLoaded = $('<div class="notLoaded" style="height:0px; overflow:hidden; opacity:0" />
').appendTo('body');
for(i=0, imLen = imgArr.length; i<imlen ; i++){
$img = $('<img src="'+ imgArr[i] +'" alt="pos-'+i+'" />').appendTo($notLoaded);
if($img[0].complete){
prepareCycle.call($img[0]);
}else{
$img.on('load',prepareCycle);
}
}
$imgAtual = $first = $targetJqObj.find('img').first();
}
var prepareCycle = function(){
$(this).prependTo($targetJqObj); //também removeu da div notLoaded
loadedcount++;
if(loadedcount==3){
fadeInterval = setInterval(function(){
$imgAtual.fadeOut('slow');
var $prev = $imgAtual.prev('img');
if($prev.length==0){ $prev = $first;}
$prev.fadeIn('slow',function(){ $imgAtual = $(this) });
},waitTime)
}
}
putImages(imgArr);
}
</textarea>
<br />
<br />
Modo de uso:
<textarea style="height: 150px; width: 100%;"><div class='painel'>
<img src='img1.jpg' alt='Foto Casamento' />
</div>
<script>
var alvo = $('.painel');
var imagens = Array('img2.jpg','img3.jpg');
micoxFadeCycle(alvo, imagens);
</script>
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js"></script>
</textarea>
<br />
<br />
Site onde apliquei: <a href="http://www.robsonlazzari.com.br/">www.robsonlazzari.com.br</a>
<br />
<br />
Dúvidas? É só comentar que eu respondo.<br />
<br />
//Esse blogger tá uma bosta pra postar códigos.Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-23429770.post-85374743233922790182013-09-11T10:20:00.000-04:002013-09-12T15:58:04.781-04:00Solução: Sandbox do Paypal não funciona no código IPN ListenerAe,<br />
<br />
Coisa rápida que me ajudou e talvez ajude outros que estão na briga da integração com o sistema de pagamentos do Paypal.<br />
<br />
Ao identificar um pagamento, o paypal chama o notify_url que você configurou em seu form.<br />
Daí, neste notify_url você faz o código de tratamento e talz .<br />
<br />
Porém, muitas vezes, este código de tratamento só funciona no paypal real e não funfa no sandbox do paypal (o local para testes).<br />
<br />
O que fazer?<br />
<br />
O código que a maioria tem (em php) para o IPN tem uma parte assim:<br />
<br />
<pre class="lang-php prettyprint prettyprinted" style="background-color: #eeeeee; border: 0px; font-family: Consolas, Menlo, Monaco, 'Lucida Console', 'Liberation Mono', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Courier New', monospace, serif; font-size: 14px; line-height: 18px; margin-bottom: 10px; max-height: 600px; overflow: auto; padding: 5px; vertical-align: baseline; width: auto;"><code style="border: 0px; font-family: Consolas, Menlo, Monaco, 'Lucida Console', 'Liberation Mono', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Courier New', monospace, serif; margin: 0px; padding: 0px; vertical-align: baseline;"><span class="com" style="background-color: transparent; border: 0px; color: grey; margin: 0px; padding: 0px; vertical-align: baseline;">// post back to PayPal system to validate //</span><span class="pln" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;">
$header </span><span class="pun" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;">.=</span><span class="pln" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;"> </span><span class="str" style="background-color: transparent; border: 0px; color: maroon; margin: 0px; padding: 0px; vertical-align: baseline;">"POST /cgi-bin/webscr HTTP/1.0\r\n"</span><span class="pun" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;">;</span><span class="pln" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;">
$header </span><span class="pun" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;">.=</span><span class="pln" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;"> </span><span class="str" style="background-color: transparent; border: 0px; color: maroon; margin: 0px; padding: 0px; vertical-align: baseline;">"Content-Type: application/x-www-form-urlencoded\r\n"</span><span class="pun" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;">;</span><span class="pln" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;">
$header </span><span class="pun" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;">.=</span><span class="pln" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;"> </span><span class="str" style="background-color: transparent; border: 0px; color: maroon; margin: 0px; padding: 0px; vertical-align: baseline;">"Content-Length: "</span><span class="pln" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;"> </span><span class="pun" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;">.</span><span class="pln" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;"> strlen</span><span class="pun" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;">(</span><span class="pln" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;">$req</span><span class="pun" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;">)</span><span class="pln" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;"> </span><span class="pun" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;">.</span><span class="pln" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;"> </span><span class="str" style="background-color: transparent; border: 0px; color: maroon; margin: 0px; padding: 0px; vertical-align: baseline;">"\r\n\r\n"</span><span class="pun" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;">;</span><span class="pln" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;">
</span><span class="com" style="background-color: transparent; border: 0px; color: grey; margin: 0px; padding: 0px; vertical-align: baseline;">//For the below line i have tried "www.sandbox.paypal" as well as "www.paypal"</span><span class="pln" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;">
$fp </span><span class="pun" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;">=</span><span class="pln" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;"> fsockopen </span><span class="pun" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;">(</span><span class="str" style="background-color: transparent; border: 0px; color: maroon; margin: 0px; padding: 0px; vertical-align: baseline;">'ssl://www.sandbox.paypal.com'</span><span class="pun" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;">,</span><span class="pln" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;"> </span><span class="lit" style="background-color: transparent; border: 0px; color: maroon; margin: 0px; padding: 0px; vertical-align: baseline;">443</span><span class="pun" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;">,</span><span class="pln" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;"> $errno</span><span class="pun" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;">,</span><span class="pln" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;"> $errstr</span><span class="pun" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;">,</span><span class="pln" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;"> </span><span class="lit" style="background-color: transparent; border: 0px; color: maroon; margin: 0px; padding: 0px; vertical-align: baseline;">30</span><span class="pun" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;">);</span></code></pre>
<br />
A solução é adicionar um parâmetro HOST no header, ficando assim:<br />
<br />
<pre class="lang-php prettyprint prettyprinted" style="background-color: #eeeeee; border: 0px; font-family: Consolas, Menlo, Monaco, 'Lucida Console', 'Liberation Mono', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Courier New', monospace, serif; font-size: 14px; line-height: 18px; margin-bottom: 10px; max-height: 600px; overflow: auto; padding: 5px; vertical-align: baseline; width: auto;"><code style="border: 0px; font-family: Consolas, Menlo, Monaco, 'Lucida Console', 'Liberation Mono', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Courier New', monospace, serif; margin: 0px; padding: 0px; vertical-align: baseline;"><span class="com" style="background-color: transparent; border: 0px; color: grey; margin: 0px; padding: 0px; vertical-align: baseline;">// post back to PayPal system to validate //</span><span class="pln" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;">
$header </span><span class="pun" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;">.=</span><span class="pln" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;"> </span><span class="str" style="background-color: transparent; border: 0px; color: maroon; margin: 0px; padding: 0px; vertical-align: baseline;">"POST /cgi-bin/webscr HTTP/1.0\r\n"</span><span class="pun" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;">;</span><span class="pln" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;">
$header </span><span class="pun" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;">.=</span><span class="pln" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;"> </span><span class="str" style="background-color: transparent; border: 0px; color: maroon; margin: 0px; padding: 0px; vertical-align: baseline;">"Host: www.sandbox.paypal.com\r\n"</span><span class="pun" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;">;</span><span class="pln" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;">
$header </span><span class="pun" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;">.=</span><span class="pln" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;"> </span><span class="str" style="background-color: transparent; border: 0px; color: maroon; margin: 0px; padding: 0px; vertical-align: baseline;">"Content-Type: application/x-www-form-urlencoded\r\n"</span><span class="pun" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;">;</span><span class="pln" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;">
$header </span><span class="pun" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;">.=</span><span class="pln" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;"> </span><span class="str" style="background-color: transparent; border: 0px; color: maroon; margin: 0px; padding: 0px; vertical-align: baseline;">"Content-Length: "</span><span class="pln" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;"> </span><span class="pun" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;">.</span><span class="pln" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;"> strlen</span><span class="pun" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;">(</span><span class="pln" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;">$req</span><span class="pun" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;">)</span><span class="pln" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;"> </span><span class="pun" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;">.</span><span class="pln" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;"> </span><span class="str" style="background-color: transparent; border: 0px; color: maroon; margin: 0px; padding: 0px; vertical-align: baseline;">"\r\n\r\n"</span><span class="pun" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;">;</span><span class="pln" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;">
$fp </span><span class="pun" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;">=</span><span class="pln" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;"> fsockopen </span><span class="pun" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;">(</span><span class="str" style="background-color: transparent; border: 0px; color: maroon; margin: 0px; padding: 0px; vertical-align: baseline;">'ssl://www.sandbox.paypal.com'</span><span class="pun" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;">,</span><span class="pln" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;"> </span><span class="lit" style="background-color: transparent; border: 0px; color: maroon; margin: 0px; padding: 0px; vertical-align: baseline;">443</span><span class="pun" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;">,</span><span class="pln" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;"> $errno</span><span class="pun" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;">,</span><span class="pln" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;"> $errstr</span><span class="pun" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;">,</span><span class="pln" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;"> </span><span class="lit" style="background-color: transparent; border: 0px; color: maroon; margin: 0px; padding: 0px; vertical-align: baseline;">30</span><span class="pun" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;">);</span></code></pre>
<br />
Claro que você fará as devidas adaptações...<br />
<br />
Tal falha da documentação do paypal me fez perder 1 hora de sono na madrugada e metade da manhã.<br />
Só achei a solução graças a este post no stackoverflow: <a href="http://stackoverflow.com/questions/17718722/paypal-ipn-sandbox-ipn-listener-no-verified-or-invalid/17721965#17721965">http://stackoverflow.com/questions/17718722/paypal-ipn-sandbox-ipn-listener-no-verified-or-invalid/17721965#17721965</a><br />
<br />
Quer trocar idéia sobre integração no paypal (não sou especialista, só um iniciante)? Comenta ae.Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-23429770.post-76943582756153536622013-08-12T16:50:00.000-04:002013-08-12T16:50:00.867-04:00Criando Calendários no MS ProjectSenhores e senhoras, continuando a série de postagens sobre o MS Project 2010.<br />
<br />
Para realizar o correto agendamento das tarefas e cálculo das datas, o MS Project deverá ser informado sobre as horas de trabalho e sobre os dias úteis e não úteis. Isto é feito através de “Calendários de Projeto”.<br />
<br />
Para visualizar os calendários disponíveis acesse a Guia Projeto > Alterar Período Trabalho (6º botão).<br />
<br />
No calendário “padrão” do Project, o turno de trabalho se inicia às 09:00, possui 01 hora para almoço, e se encerra às 18:00. Os dias não úteis são Domingo e Sábado. <br />
Como se pode perceber, este calendário “padrão” raramente irá corresponder à realidade do trabalho a ser desenvolvido. Geralmente precisarmos definir feriados, outros horários de trabalho, outros dias úteis, outros dias não úteis, etc.<br />
<br />
Para configurar um NOVO calendário, considerando outros turnos de trabalho e outros dias não úteis, devemos clicar no botão “Criar novo calendário” à direita (Não é recomendado alterar o calendário padrão do Project).<br />
Na tela “Criar novo calendário base” entre com o nome do novo Calendário e escolha se quer criar seu novo calendário tendo outro como modelo (o que facilitará seu trabalho). Clique OK para confirmar.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhRKij9RGkoVQvFGUE1L6YwhsXQICQdjaWwcspzAYvdbZdQSB-HZslLQba2MYU6pVTVEGPiAvi5vNZ8Fqrshk_UnspkkJ_vr84rCOPpX1UjCjbNtkPVysCk7Gt-A6-ZzfIwBExfqQ/s1600/calendario-project.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="317" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhRKij9RGkoVQvFGUE1L6YwhsXQICQdjaWwcspzAYvdbZdQSB-HZslLQba2MYU6pVTVEGPiAvi5vNZ8Fqrshk_UnspkkJ_vr84rCOPpX1UjCjbNtkPVysCk7Gt-A6-ZzfIwBExfqQ/s400/calendario-project.png" width="400" /></a></div>
<br />
<br />
<b>Definindo horários de trabalho e dias úteis</b><br />
<br />
Em seu novo calendário criado, primeiramente, veremos como configurar os horários de trabalho e os dias úteis. Para isto acesse a guia “Semanas de Trabalho” e clique no botão Detalhes.<br />
<br />
Na tela “Detalhes de”, selecione, ao lado esquerdo, o(s) dia(s) da semana que deseja configurar. Para selecionar mais de um dia, clique e arraste ou segure a tecla SHIFT enquanto clica.<br />
<br />
Ao lado direito, você tem 3 opções que definem que tratamento se deve dar aos dias da semana selecionados e, mais abaixo, os horários de trabalho para aquele dia selecionado.<br />
<br />
Por exemplo, clique em “Segunda-feira” e arraste até “Sexta-feira”. Veja que o Project, por padrão, definiu que o horário de trabalho é das 09:00 às 18:00. <br />
<br />
Para alterarmos isto, escolha a 3ª opção “Definir dia(s) para os períodos de trabalho específicos”. Neste momento, a opção para alterar as horas de trabalho ficou habilitada.<br />
<br />
Veja que, cada dia da semana pode ter seu horário de trabalho específico. Dessa forma, por exemplo, você pode definir, se desejar, que Sábado haverá trabalho das 08:00 às 12:00.<br />
<br />
Digite os novos horários de trabalho e clique OK para confirmar.<br />
<br />
<b>Definindo dias de exceções e feriados</b><br />
<br />
Agora voltamos à tela “Alterar período útil” e veremos como configurar feriados. No menu superior, escolha novamente seu calendário e clique na guia Exceções.<br />
<br />
Nesta guia, logo abaixo da coluna Nome, escreva o nome de seu feriado ou exceção, por exemplo, “Independência do Brasil”. Em seguida clique em Detalhes.<br />
<br />
Agora você irá escolher se esta exceção é uma folga completa ou uma alteração no período de trabalho como, por exemplo, um dia que os funcionários devem trabalhar somente pela manhã.<br />
<br />
Você poderá informar também o “Padrão de recorrência” da exceção (diário, semanal, mensal, anual) e indicar quando a exceção deve terminar em “Intervalo de recorrência”.<br />
<br />
Veja que opção “Exceções” de seu calendário não se refere somente a feriados. Com ela você pode configurar diversas exceções ao horário de trabalho normal.<br />
<br />
Agora que você já sabe criar seu(s) calendário(s) você pode retornar à tela “Informações do Projeto” e definir seu calendário como sendo o calendário padrão do seu projeto. Acesse a guia Projeto > Informações do Projeto (2º botão).<br />
<br />
Ao definir o calendário padrão do projeto, além de mudar a forma de ver a duração do projeto, você também altera o cronograma de atividades com nenhum calendário (que não tiveram calendário definido).<br />
<br />
Você pode criar quantos calendários considerar necessários ao seu projeto. Por exemplo, um calendário para “trabalho somente segunda a sexta” e outro para “dias corridos”.Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-23429770.post-79740346170291023742013-08-10T16:31:00.000-04:002013-08-10T16:31:00.154-04:00Cursos e Serviços Freelancer do MicoxNobres senhores, a situação tá braba. Sendo assim, me mande um email se você precisa de:<br />
<ol>
<li>Serviços na área de Javascript, PHP, CSS ou Wordpress.</li>
<li>
Sistemas Web, conexão com banco de dados, inserção de dados, atualização, etc.</li>
<li>
Alguma planilha bruta ou mágica no Excel.</li>
<li>
Cursos de MS Project 2010 com foco em Gerenciamento de Projetos.</li>
<li>
Cursos de funcionamento da Web, Javascript, PHP, Banco de Dados, Wordpress.</li>
<li>
Curso de Excel Avançado.</li>
</ol>
<br />
<br />
Quem me conhece sabe que é com a melhor qualidade do mercado. Sou meio louco perfeccionista.<br />
<br />
<div>
Alguns Sites desenvolvidos:</div>
<div>
<br />
<a href="http://sorteiodejogos.com.br/" target="_blank">sorteiodejogos.com.br/</a> (para terceiros - apenas programação do CMS, o visual é do <a href="http://fabiolobo.com.br/">Fábio Lobo</a>)</div>
<div>
<a href="http://tadarank.com/">Tadarank.com</a> (site próprio)</div>
<div>
<a href="http://resultadoconcursos.net/">ResultadoConcursos.net</a> (site próprio)</div>
<div>
<a href="http://mwords.valeus.net/" target="_blank">Mwords.valeus.net</a> (site próprio)</div>
<div>
<a href="http://brasads.com.br/" target="_blank">Brasads.com.br</a> (site próprio)</div>
<div>
<a href="http://elmicox.blogspot.com.br/" target="_blank">Elmicox.blogspot.com.br</a> (site próprio)</div>
<div>
<a href="http://empresaeescritorio.blogspot.com.br/" target="_blank">EmpresaeEscritorio.blogspot.<wbr></wbr>com.br</a> (site próprio)</div>
<div>
<a href="http://pctelonline.com.br/" target="_blank">Pctelonline.com.br</a> (para terceiros)</div>
<div>
<a href="http://auvo.com.br/" target="_blank">Auvo.com.br</a> (para terceiros)<br />
<br />
Thanks. </div>
Unknownnoreply@blogger.com1tag:blogger.com,1999:blog-23429770.post-17441785339110799192013-08-09T16:19:00.004-04:002013-08-09T16:21:29.036-04:00MS Project - Dicas para configuração e inserção de tarefasOlá pessoal. Tô de volta.<br />
<br />
Atualmente, estou há algum tempo (1 ano) trabalhando em um Escritório de Gerenciamento de Projetos e dando cursos de MS Project 2010 (se você se interessar, me manda um email hehe).<br />
<br />
Resolvi deixar registrado aqui algumas dicas úteis. Compartilhe suas dicas nos comentários também.<br />
<br />
Ressalto que estas dicas são, de certa forma, pessoais. Aprendidas com o calejar do dia a dia com o Project. Talvez outros autores (ou você) prefiram outras configurações.<br />
<br />
<b>Configurações básicas que uso para evitar problemas:</b><br />
<br />
<br />
0) Crie um novo arquivo em branco do project, para fazer as configurações. Não coloque nenhuma tarefa nele. Você vai utilizá-lo, através do ctrl+C ctrl+V sempre que quiser criar novos projetos.<br />
Seu Project-modelo.mpp deve se manter intacto.<br />
<br />
1) Vá no menu Arquivo > Opções > Geral > Formato de data > 28/01/09<br />
Muitas vezes, para resolver problemas, convém exibir o dia da semana e a hora também.<br />
Segunda eu faço um post explicando como resolver problemas de dias quebrados em tarefas (4,5 dias por exemplo) que costumam fritar os neurônios.<br />
<br />
2) Cronograma > Opções de calendário > Hora de início 08:00<br />
<br />
3) Cronograma > Mostrar unidades de atribuição como DECIMAL.<br />
Em geral, na empresa que trabalho, define-se recursos como unidades (decimal) e não em porcentagem como é o padrão do project. Ou seja, é mais comum usarmos 2 engenheiros do que 200% engenheiros ou 50% do tempo do engenheiro.<br />
<br />
4) Cronograma > Novas tarefas criadas > AGENDADA AUTOMATICAMENTE<br />
<br />
5) Cronograma > Opções de agendamento > Mostrar avisos | Mostrar sugestões<br />
<br />
6) Cronograma > Cálculo > Ativar.<br />
<br />
7) Avançado > Opções de exibição > Mostrar tarefa de resumo do projeto<br />
<br />
8) Avançado > Exibir > DESMARQUE "Adicionar automaticamente novos modos de exibição, tabelas, filtros ao grupo global".<br />
Assim você não irá estragar/sobrescrever as tabelas e modos de exibição padrão do project.<br />
Se quiser reutilizar, o melhor é compartilhar entre os 2 arquivos project que deseja apenas, e não alterar o organizador global.<br />
Qualquer dia, faço um post sobre o "Organizador".<br />
<br />
<br />
<br />
8) Crie seus calendários e não sobrescreva o calendário padrão do Project. Para criar seu calendário, vá em "Projeto" > Alterar período de trabalho. ocê DEVE criar um calendário (ou vários) já que o calendário padrão do
project não corresponde à realidade de sua empresa, muito provavelmente<br />
<br />
<br />
<br />
9) Sugere-se deixar visível a coluna "Calendário da tarefa" ao lado da coluna duração devido à sua grande importância para o cronograma.<br />
Evite ao máximo tarefas com calendário "Nenhum".<br />
<br />
10) É imprescindível ir em Projeto > Informações do Projeto.<br />
<br />
11) Ao preencher a duração, se usar a unidade "diasd" (dias decorridos) você terá problemas pois indica que os trabalhos ocorrerão 24 horas todos os dias e não 8 horas todos os dias.<br />
Se quiser 8 horas todos os dias, ou outra quantidade de horas que não 24, o melhor é criar um calendário chamado dias corridos.<br />
<br />
12) Evite usar unidades diferentes ao definir a duração. Use sempre "dias" para evitar confusão na sua cabeça. Lembre-se que você pode fazer picado: 0,25 dias, etc.<br />
<br />
=======================<br />
<br />
<b>Observações ao inserir tarefas</b><br />
<br />
1) Prefira nomes curtos porém descritivos para as tarefas. Detalhamentos podem ser colocados na coluna Anotações.<br />
<br />
2) Nunca preencher as colunas de DATA DE INÍCIO ou DATA DE TÉRMINO durante o planejamento.<br />
Se fizer isto, será criada erroneamente uma data de restrição.<br />
O correto para chegar à uma data é alterar as predecessões e durações. O project calcula as datas por conta própria.<br />
Para criar uma data de restrição da forma correta dê dois cliques na tarefa e vá em avançado. Assim você poderá escolher o tipo da restrição.<br />
Não coloque datas de restrição sem motivo.<br />
(um dia faço um post sobre isso também hahaha)<br />
<br />
3) Ao definir o calendário de uma atividade NÃO resumo, você estará realmente alterando o cronograma de trabalho (e consequentemente as datas)<br />
Ao definir o calendário de tarefas RESUMO, você está apenas mudando a forma de ver a data, mas não tem nenhum efeito no cronograma de trabalho.<br />
Ao definir o calendário padrão do projeto, além de mudar a forma de ver a duração do projeto, você também altera o cronograma de atividades com nenhum calendário.<br />
(um dia faço um post sobre isso também)<br />
<br />
4) Se o foco não é custo e sim prazo, prefira agrupar as tarefas resumo de forma cronológica e não através do assunto. Assim seu Gantt fica mais fácil de ser entendido.<br />
<br />
========================<br />
<br />
<b>Borós comuns (que eu lembro):</b><br />
<br />
<b>1) Tarefa não fica crítica mesmo sendo predecessora de uma crítica.</b><br />
Geralmente isto ocorre devido a tarefa A do tipo dias corridos ser predecessora de uma tarefa B dias úteis e a tarefa A acabar em uma sexta. Assim, claramente ela tem a folga do fim de semana mesmo a tarefa B não tendo folga.<br />
<br />
<b>2) Esquecer de colocar predecessora em uma tarefa.</b><br />
Do mesmo modo, esquecer de informar uma sucessora para a tarefa.<br />
Em geral, TODAS as tarefas tem predecessora e sucessora, exceto a(s) tarefa(s) iniciais e finais do projeto.<br />
<br />
<b>3) Após congelar a linha de base, infelizmente o project não bloqueia as colunas da Linha de Base. </b>Cuidado para não alterar sem querer.<br />
<br />
Compartilhe suas dicas nos comentários abaixo. Unknownnoreply@blogger.com1tag:blogger.com,1999:blog-23429770.post-77753558059918660252012-08-09T14:41:00.000-04:002012-08-09T14:41:59.948-04:00O Google não acessa seu site? Talvez haja bloqueio no Firewall (lista de IPs do google)Ae pessoas,<br />
<br />
Muitas vezes, ao olharmos o Google Webmasters Tools vemos o erro de que <strong>"o Googlebot não consegue acessar seu site"</strong><br />
<br />
Porém o site tá lá vivinho da silva e funcionando bem.<br />
<br />
Das vezes que eu passei por este perrengue, a culpa foi do Firewall que bloqueava alguns IPs do Googlebot.<br />
<br />
Como resolvi? Colocando os IPs do google na lista branca do firewall.<br />
<br />
1) Acesse seu Gerenciador de Webhost (WHM) - www.seusite.com:2086<br />
<br />
2) Vá em Em Plugins > ConfigServer Security & Firewall. <br />
<br />
3) Acesse o csf – ConfigServer Firewall.<br />
<br />
4) Procure a opção chamada FIREWALL ALLOW IPS<br />
<br />
Agora é hora de colocar os IPs do google:<br />
<br />
<pre class='code'>209.185.108
209.185.253
209.85.238
209.85.238.11
209.85.238.4
216.239.33.96
216.239.33.97
216.239.33.98
216.239.33.99
216.239.37.98
216.239.37.99
216.239.39.98
216.239.39.99
216.239.41.96
216.239.41.97
216.239.41.98
216.239.41.99
216.239.45.4
216.239.51.96
216.239.51.97
216.239.51.98
216.239.51.99
216.239.53.98
216.239.53.99
216.239.57.96
216.239.57.97
216.239.57.98
216.239.57.99
216.239.59.98
216.239.59.99
216.33.229.163
64.233.173.193
64.233.173.194
64.233.173.195
64.233.173.196
64.233.173.197
64.233.173.198
64.233.173.199
64.233.173.200
64.233.173.201
64.233.173.202
64.233.173.203
64.233.173.204
64.233.173.205
64.233.173.206
64.233.173.207
64.233.173.208
64.233.173.209
64.233.173.210
64.233.173.211
64.233.173.212
64.233.173.213
64.233.173.214
64.233.173.215
64.233.173.216
64.233.173.217
64.233.173.218
64.233.173.219
64.233.173.220
64.233.173.221
64.233.173.222
64.233.173.223
64.233.173.224
64.233.173.225
64.233.173.226
64.233.173.227
64.233.173.228
64.233.173.229
64.233.173.230
64.233.173.231
64.233.173.232
64.233.173.233
64.233.173.234
64.233.173.235
64.233.173.236
64.233.173.237
64.233.173.238
64.233.173.239
64.233.173.240
64.233.173.241
64.233.173.242
64.233.173.243
64.233.173.244
64.233.173.245
64.233.173.246
64.233.173.247
64.233.173.248
64.233.173.249
64.233.173.250
64.233.173.251
64.233.173.252
64.233.173.253
64.233.173.254
64.233.173.255
64.68.90.1
64.68.90.10
64.68.90.11
64.68.90.12
64.68.90.129
64.68.90.13
64.68.90.130
64.68.90.131
64.68.90.132
64.68.90.133
64.68.90.134
64.68.90.135
64.68.90.136
64.68.90.137
64.68.90.138
64.68.90.139
64.68.90.14
64.68.90.140
64.68.90.141
64.68.90.142
64.68.90.143
64.68.90.144
64.68.90.145
64.68.90.146
64.68.90.147
64.68.90.148
64.68.90.149
64.68.90.15
64.68.90.150
64.68.90.151
64.68.90.152
64.68.90.153
64.68.90.154
64.68.90.155
64.68.90.156
64.68.90.157
64.68.90.158
64.68.90.159
64.68.90.16
64.68.90.160
64.68.90.161
64.68.90.162
64.68.90.163
64.68.90.164
64.68.90.165
64.68.90.166
64.68.90.167
64.68.90.168
64.68.90.169
64.68.90.17
64.68.90.170
64.68.90.171
64.68.90.172
64.68.90.173
64.68.90.174
64.68.90.175
64.68.90.176
64.68.90.177
64.68.90.178
64.68.90.179
64.68.90.18
64.68.90.180
64.68.90.181
64.68.90.182
64.68.90.183
64.68.90.184
64.68.90.185
64.68.90.186
64.68.90.187
64.68.90.188
64.68.90.189
64.68.90.19
64.68.90.190
64.68.90.191
64.68.90.192
64.68.90.193
64.68.90.194
64.68.90.195
64.68.90.196
64.68.90.197
64.68.90.198
64.68.90.199
64.68.90.2
64.68.90.20
64.68.90.200
64.68.90.201
64.68.90.202
64.68.90.203
64.68.90.204
64.68.90.205
64.68.90.206
64.68.90.207
64.68.90.208
64.68.90.21
64.68.90.22
64.68.90.23
64.68.90.24
64.68.90.25
64.68.90.26
64.68.90.27
64.68.90.28
64.68.90.29
64.68.90.3
64.68.90.30
64.68.90.31
64.68.90.32
64.68.90.33
64.68.90.34
64.68.90.35
64.68.90.36
64.68.90.37
64.68.90.38
64.68.90.39
64.68.90.4
64.68.90.40
64.68.90.41
64.68.90.42
64.68.90.43
64.68.90.44
64.68.90.45
64.68.90.46
64.68.90.47
64.68.90.48
64.68.90.49
64.68.90.5
64.68.90.50
64.68.90.51
64.68.90.52
64.68.90.53
64.68.90.54
64.68.90.55
64.68.90.56
64.68.90.57
64.68.90.58
64.68.90.59
64.68.90.6
64.68.90.60
64.68.90.61
64.68.90.62
64.68.90.63
64.68.90.64
64.68.90.65
64.68.90.66
64.68.90.67
64.68.90.68
64.68.90.69
64.68.90.7
64.68.90.70
64.68.90.71
64.68.90.72
64.68.90.73
64.68.90.74
64.68.90.75
64.68.90.76
64.68.90.77
64.68.90.78
64.68.90.79
64.68.90.8
64.68.90.80
64.68.90.9
</pre><br />
5) Depois dê uma limpeza na lista de bloqueios atuais do firewal procurando a opção "FLUSH ALL BLOCKS".<br />
<br />
6) Pronto. Agora é hora de voltar no Google Webmaster tools e reenviar seu sitemap pra ver o que dá.<br />
<br />
Essa técnica já funcionou pra mim e pro Philipe do <a href="http://www.mundogump.com.br/google-bot-nao-entra-no-site-veja-como-resolver/">MundoGump</a><br />
<br />
Tem novas idéias e experiências? Escreva e comente ae.<br />
Até mais.<br />Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-23429770.post-60174660938575605592012-05-31T10:41:00.000-04:002013-02-08T13:11:40.343-03:00Substituta para a Empty do PHP pra não dar erro tosco "can't use function return value in write context"Cansado de erros <i>"Can't use function return value in write context"</i> no PHP ?<br />
<br />
Segundo uma pesquisa rápida e sem vergonha no Google a gente vê que este erro é porque <i>alquém do PHP quis</i> <strike>algumas coisas do PHP não são funções e sim construções da linguagem</strike> <i>(O carlos me explicou nos comments que empty não é language construct)</i>. Daí que as malditas só aceitam variáveis como argumento e não aceitam funções. Uma dessas coisas é a Empty().<br />
<br />
*Tem também outras coisas que geram este erro, mas tô com preguiça de sair procurando e listando tudo aqui.<br />
<br />
Expicando com exemplos:<br />
<br />
Não dá erro: empty($variavelTal)<br />
Dá erro: empty(funcaoTal())<br />
<br />
Uma frescagem né?<br />
<br />
Daí fiz uma funçãozinha gambiarra rápida pra este problema com o empty e estou guardando aqui no meu blog para caso eu precise no futuro.<br />
<br />
<br />
<b>function empti($oque){</b><br />
<b><span class="Apple-tab-span" style="white-space: pre;"> </span>//tive que fazer esta porque a empty do php é muito fresca </b><br />
<b><span class="Apple-tab-span" style="white-space: pre;"> </span>//</b><b>e só aceita variáveis </b><b>como parametro, daí não aceita </b><br />
<b><span class="Apple-tab-span" style="white-space: pre;"> </span></b><b>//coisas como empty( funcaoX() ) ou empty ( ($variavel) )</b><br />
<b><span class="Apple-tab-span" style="white-space: pre;"> </span>//também coloquei um trim aqui dentro</b><br />
<b><span class="Apple-tab-span" style="white-space: pre;"> </span>$oque = trim($oque);</b><br />
<b>$oque = empty($oque);</b><br />
<b><span class="Apple-tab-span" style="white-space: pre;"> </span>return $oque;</b><br />
<b>}</b><br />
<br />
Pronto. Agora aceita funções.Unknownnoreply@blogger.com2tag:blogger.com,1999:blog-23429770.post-31870459859596618052012-03-22T08:56:00.000-04:002012-03-22T13:18:00.592-04:00A importância do suporte bom na hospedagem de sites<h3>
Capítulo 1 - A bênção</h3>
Bom dia Nobres senhores e senhoritas.<br />
<br />
Provavelmente, você que lê o El Micox possui um site.<br />
Provavelmente este site está em uma hospedagem paga.<br />
Provavelmente você executa as mesmas tarefas periodicamente, buscando ser abençoado pelo Google:<br />
<br />
Lá está você, colocando artigos todos os dias...<br />
Lá está você, otimizando meta tags e titles todos os dias...<br />
Lá está você divulgando em redes sociais...<br />
Lá está você divulgando links pelo mundo...<br />
<br />
Quando, de repente, acontece o que você pediu tanto para o pai Google: as visitas dobram, triplicam.<br />
<br />
Se você usa Adsense - ou outro tipo de monetização - a grana começa a entrar.<br />
Já vai dar pra pagar a parcela do Fusquinha. :)<br />
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgKf-aJ-G74P5VbeCxbgz_vET3CTZB7D8ukIZ0zGlvxs0Zb46Zs2T52U6Gl3n41kb8uX9JQfjmax40iOZf4UnqJah9paHfZ4pCZpLaM5DXqUJj08jzHZngWC-EFdcyii8yqtZcoLA/s1600/fusca_rosa.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="239" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgKf-aJ-G74P5VbeCxbgz_vET3CTZB7D8ukIZ0zGlvxs0Zb46Zs2T52U6Gl3n41kb8uX9JQfjmax40iOZf4UnqJah9paHfZ4pCZpLaM5DXqUJj08jzHZngWC-EFdcyii8yqtZcoLA/s320/fusca_rosa.jpg" width="320" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Créditos: David do <a href="http://www.ondetemfesta.com.br/" target="_blank">OndeTemFesta.com.br</a></td></tr>
</tbody></table>
<br />
<br />
<h3>
Capítulo 2 - A maldição</h3>
Mas aí, devido à súbita explosão de acessos, seu site cai. Parabéns, você acabou de ser batizado!<br />
<br />
Agora vai começar o trabalho chato: entrar em contato com o suporte da sua hospedagem para descobrir a origem do problema.<br />
Este é o momento que separa os bons dos maus, os fortes dos fracos, os true dos poser (hahá).<br />
<br />
Nobres colegas, não tem nada mais chato do que ficar abrindo tickets ou fazendo ligações pra suporte - e aguardando horas pra ser atendido, enquanto preciosos visitantes chegam a uma tela de erro.<br />
<br />
Principalmente, principalmente - repito - principalmente, quando há uma corja de incompetentes do outro lado.<br />
<br />
Nobres fidalgos, não tem nada pior do que você querer saber a origem do problema e os incompetentes ficarem apenas repetindo "seu site está com muitos acessos, tem que aumentar o plano".<br />
<br />
Acho que os donos das hospedagens simplesmente contratam estagiários de "sei lá o quê" pra ficarem respondendo um FAQ padrão.<br />
<br />
Como o pai Google não perdoa, sites fora do ar voltam a cair nos rankings.<br />
<br />
<h3>
Capítulo 3 - A solução</h3>
Nobres cavalheiros, o intuito deste texto não é ser publieditorial, propaganda, post patrocinado, essas nóia.<br />
O intuito aqui é contar-lhes um boró que passei com meu <a href="http://www.resultadoconcursos.net/" target="_blank">site de concursos</a> e como resolvi.<br />
<br />
Não lembro a boa alma que me indicou a hospedagem do Jânio (sem links por enquanto pro pessoal não pensar que é só propaganda chata), só sei de uma parada: o cara é blogueiro.<br />
<br />
<br />
O cara usa e entende de Wordpress, o cara entende de plugins bons e ruins, o cara entende de sistemas de cache, o cara entende de otimização de velocidade e otimização de recursos...<br />
<br />
Enfim, quando vossa senhoria estiver passando por um boró temporário no seu site, o cara não vai simplesmente dizer "aumenta o plano".<br />
<br />
O cara primeiro te ajuda a encontrar a fonte do problema (que pode ser um plugin pesado ou uma programação PHP mal feita ou um banco de dados mal planejado, etc), depois te ajuda a resolver, se não der certo, te dará alternativas (tipo cache, nginx, cloudflare, etc) e só depois disso, caso o problema seja realmente de poucos recursos no plano atual, ele irá te indicar um novo plano.<br />
<br />
No meu caso mais recente, acreditem, ele me indicou um plano mais barato. [pausa para explicações] "Como um plano mais barato pode ser melhor?" É que, neste caso, este plano não tem frescuras de Cpanel (tem que pagar licença e consome recursos do servidor) além de ter um sistema de cache foda. [fim da pausa]<br />
<br />
Nobres nobres, como dica final digo: <b>Antes de contratar sua hospedagem, teste o sistema de suporte deles. Veja se você está falando com quem entende do assunto ou se está falando apenas com funcionários leigos ou pseudo-entendidos</b>.<br />
<br />
Aqui o link da PortoFácil, hospedagem do Jânio: <a href="http://portofacil.net/">http://portofacil.net/</a><br />
<br />
Aqui um link de um parceiro do Jânio pra quem não precisa de hospedagem muito parruda: <a href="http://www.viahospedagem.net/">http://www.viahospedagem.net/</a><br />
<br />
Aqui um artigo que explica um pouco a filosofia do Jânio: <a href="http://portaldohost.com.br/geral/como-enfrentar-os-concorrentes-gigantes#.T2sfcBFmL_M">http://portaldohost.com.br/geral/como-enfrentar-os-concorrentes-gigantes</a><br />
<br />
Nos comentários de vocês, gostaria também de ler experiências, dicas e indicações legítimas sobre hospedagens. Mas não venha com um simples jabá pois vai é sair queimado.Unknownnoreply@blogger.com1tag:blogger.com,1999:blog-23429770.post-9077699929993229012012-02-16T08:29:00.000-03:002012-06-12T13:51:45.670-04:00Comentários do Facebook no Blogger - Sem duplicar e sem complicaçãoBom dia nobres senhores que leem - reforma ortográfica moment: "As palavras paroxítonas terminadas em dois "-oo" e em "-eem" agora perdem o acento circunflexo" - este nobre blog.<br />
<br />
Explico-vos agora como inserir aquela caixa de comentários do facebook no blogger, sem duplicar, sem complicar, na maior facilidade do universo conhecido pelo homem.<br />
<br />
1) Modelo > Editar HTML > Prosseguir > Expandir modelos de Widget<br />
<br />
2) Procura o </head> , abaixo dele vai tá abrindo o body<br />
<br />
3) Cola logo abaixo do <body> antes das outras coisas:<br />
<pre class="code"><div id="fb-root"></div>
<script>(function(d, s, id) {
var js, fjs = d.getElementsByTagName(s)[0];
if (d.getElementById(id)) return;
js = d.createElement(s); js.id = id;
js.src = "//connect.facebook.net/pt_BR/all.js#xfbml=1";
fjs.parentNode.insertBefore(js, fjs);
}(document, 'script', 'facebook-jssdk'));</script>
</pre>
<br />
4) Em qualquer lugar que quiser os comentários cola<br />
<pre class="code"><div class="fb-comments" data-href="data:post.url" data-num-posts="10" data-width="470"></div>
</pre>
5) se desse jeito não deu certo, cola<br />
<pre class="code"><div class="fb-comments" expr:data-href="data:post.url" data-num-posts="10" data-width="470"></div>
</pre>
6) Se ainda assim não deu certo, desiste porque essa porcaria não funciona não.<br />
<br />
<br />
Me deparei com o problema ao ajudar o maluco do <a href="http://fantasymedieval.blogspot.com/">fantasymedieval.blogspot.com/</a> que é meu brodi de infância.<br />
<br />
Ele me disse que rodou a web inteira, brasileira e gringa, e não achou como inserir a caixa de comentários no facebook no blogger corretamente. Quando ele conseguia, sempre duplicava os mesmos comentários em todas as páginas.<br />
<br />
Dei uma navegada no google e vi que realmente todos os tutoriais que tinham por aí eram muito complexos.<br />
<br />
Como eu já tinha inserido comentários do Facebook no WordPress na maior simplicidade do mundo, imaginei que no blogger não deveria ser tão complexo quanto os tutoriais estavam ensinando, daí mandei o código acima por email para o cara sem testar nem nada (preguiça) e incrivelmente funcionou.<br />
<br />
Se deu certo pra você, ao contrário dos complicadíssimos tutoriais da net, comente abaixo e ajude a divulgar em redes sociais e talz.<br />
<br />
Atualização: Pra quem quer monitorar os comentários, terá que criar um app pra caixa de comentários: <a href="http://www.dicasparablogs.com.br/2012/06/aplicativo-facebook-comentarios-blogger.html">http://www.dicasparablogs.com.br/2012/06/aplicativo-facebook-comentarios-blogger.html</a><br />
.Unknownnoreply@blogger.com132tag:blogger.com,1999:blog-23429770.post-44128627414088378792012-01-05T07:20:00.000-03:002012-01-05T07:20:36.247-03:00Dica do Dia: CSS Gradient GeneratorBom dia nobres senhores e senhoras.<br />
<br />
Hoje, venho ao presente blog, repassar um site muito interessante e prático que estava em meus Bookmarks e eu não lembrava até precisar.<br />
<br />
Se bem que minha memória nunca lembra de nada mesmo. Aliás, meus recentes problemas de memória (não tão recentes) estavam me deixando preocupado. Eu já havia ido até em neurologista, o qual me pediu um exame de ressonância magnética, do qual eu pulei fora (espero que este meu português cheio de "o qual" e "do qual" esteja correto, afinal estudei orações subordinadas ontem haha).<br />
<br />
(Voltando ao assunto secundário do post: ) Porém minhas preocupações passaram quando vi que todos meus amigos que "mexem" com computador o dia inteiro também estavam assim e também após ler uma reportagem na <a href="http://revistaepoca.globo.com/ideias/noticia/2011/10/internet-faz-mal-ao-cerebro.html" target="_blank">Revista Época dizendo que a internet está sacaneando nossos cérebros</a>. Concordei e fiquei aliviado por, de certa forma, eu ainda ser "normal". Aliás, maldita Ed. Globo que fica renovando as assinaturas sem solicitação.<br />
<br />
Qual era o assunto inicial do post mesmo? Ah, CSS Gradient Generator. Desculpem a divagação anterior mas pelo menos serviu pra deixar o post com mais de 1 parágrafo haha.<br />
<br />
Agora, pra não tomar muito do seu tempo, serei rápido e deixarei que tire suas próprias conclusões: O Gradiente dos botões <a href="http://mwords.valeus.net/" target="_blank">deste site</a> foi feito em 30 segundos (e sem imagens de certa forma) graças a <a href="http://www.colorzilla.com/gradient-editor/" target="_blank">este site</a>.<br />
<br />
Pra você não precisar abrir link externo, deixo aqui o exemplo:<br />
<br />
<style>
#xparceria {
/* IE9 SVG, needs conditional override of 'filter' to 'none' */
background: url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiA/Pgo8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgd2lkdGg9IjEwMCUiIGhlaWdodD0iMTAwJSIgdmlld0JveD0iMCAwIDEgMSIgcHJlc2VydmVBc3BlY3RSYXRpbz0ibm9uZSI+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJncmFkLXVjZ2ctZ2VuZXJhdGVkIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeDE9IjAlIiB5MT0iMCUiIHgyPSIwJSIgeTI9IjEwMCUiPgogICAgPHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iI2FkNTAwMCIgc3RvcC1vcGFjaXR5PSIwLjMiLz4KICAgIDxzdG9wIG9mZnNldD0iNDIlIiBzdG9wLWNvbG9yPSIjYWQ1MDAwIiBzdG9wLW9wYWNpdHk9IjAuNyIvPgogICAgPHN0b3Agb2Zmc2V0PSI0NSUiIHN0b3AtY29sb3I9IiNhZDUwMDAiIHN0b3Atb3BhY2l0eT0iMSIvPgogICAgPHN0b3Agb2Zmc2V0PSIxMDAlIiBzdG9wLWNvbG9yPSIjYWQ1MDAwIiBzdG9wLW9wYWNpdHk9IjAuOCIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPHJlY3QgeD0iMCIgeT0iMCIgd2lkdGg9IjEiIGhlaWdodD0iMSIgZmlsbD0idXJsKCNncmFkLXVjZ2ctZ2VuZXJhdGVkKSIgLz4KPC9zdmc+);
background: -moz-linear-gradient(top, rgba(173,80,0,0.3) 0%, rgba(173,80,0,0.7) 42%, rgba(173,80,0,1) 45%, rgba(173,80,0,0.8) 100%); /* FF3.6+ */
background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,rgba(173,80,0,0.3)), color-stop(42%,rgba(173,80,0,0.7)), color-stop(45%,rgba(173,80,0,1)), color-stop(100%,rgba(173,80,0,0.8))); /* Chrome,Safari4+ */
background: -webkit-linear-gradient(top, rgba(173,80,0,0.3) 0%,rgba(173,80,0,0.7) 42%,rgba(173,80,0,1) 45%,rgba(173,80,0,0.8) 100%); /* Chrome10+,Safari5.1+ */
background: -o-linear-gradient(top, rgba(173,80,0,0.3) 0%,rgba(173,80,0,0.7) 42%,rgba(173,80,0,1) 45%,rgba(173,80,0,0.8) 100%); /* Opera 11.10+ */
background: -ms-linear-gradient(top, rgba(173,80,0,0.3) 0%,rgba(173,80,0,0.7) 42%,rgba(173,80,0,1) 45%,rgba(173,80,0,0.8) 100%); /* IE10+ */
background: linear-gradient(top, rgba(173,80,0,0.3) 0%,rgba(173,80,0,0.7) 42%,rgba(173,80,0,1) 45%,rgba(173,80,0,0.8) 100%); /* W3C */
filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#4dad5000', endColorstr='#ccad5000',GradientType=0 ); /* IE6-8 */
}
</style><br />
<div id="xparceria">
Sou uma div com<br />
gradiente CSS</div>
<br />
<br />
Pode me agradecer ou xingar nos comentários.Unknownnoreply@blogger.com2tag:blogger.com,1999:blog-23429770.post-13928644925444250462011-12-28T16:45:00.001-03:002012-03-05T15:43:07.106-04:00Selects Multiple NÃO! Checkboxes SIM! Uma campanha pela abolição de selects multiplesSabe, eu nunca tinha parado pra pensar sobre isso.<br />
<br />
Selects multiples são muito chatos. <br />
Chatos pro visitante - que tem que usar o shift pra escolher mais de um (que visitante sabe fazer isso?)<br />
Chatos pro desenvolvedor - na hora do html e na hora de tratar os dados no server-side (php, asp, etc).<br />
Chatos pra estilizar o visual - Alterar visual CSS de selects é quase impossível.<br />
<br />
Quantas vezes já vimos formulários assim:<br />
<br />
<div style="background: white; padding: 10px;"><label for="cidades">Escolha as cidades de destino (pressione shift ou control para escolher mais de uma):</label><br />
<select multiple="multiple" name="cidades" size="3" style="height: 60px; width: 300px;"> <option value="1">Goiânia</option> <option value="2">Palmas</option> <option value="3">Fortaleza</option> <option value="4">São Paulo</option> <option value="5">Salvador</option></select></div><br />
O povão gosta de mouse. O povão não gosta de teclado. O povão lá sabe o que é shift ou control?<br />
<br />
Se quer uma página acessível não é melhor fazer assim?<br />
<br />
<div style="background: white; padding: 10px;">Escolha as cidades de destino:<br />
<style>
.check-select-multiple {border: 2px inset #DDD; background: white; height: 60px; overflow-y: scroll; width: 300px;}
</style><br />
<div class="check-select-multiple"><label><input name="cidades" type="checkbox" value="1" />Goiânia</label><br />
<label><input name="cidades" type="checkbox" value="2" />Palmas</label><br />
<label><input name="cidades" type="checkbox" value="3" />Fortaleza</label><br />
<label><input name="cidades" type="checkbox" value="4" />São Paulo</label><br />
<label><input name="cidades" type="checkbox" value="5" />Salvador</label></div></div><br />
É mais bonito ou não é? É mais fácil pro visitante ou não é?<br />
<br />
Olha só como o código é simples:<br />
<br />
<pre class="code"><style>
/* coloque este estilo em seu arquivo css */
.check-select-multiple { display: inline-block; height: 60px; padding: 0 5px; overflow-y: scroll; width: 300px; border: 2px inset #DDD; background: white;}
.check-select-multiple label { display: inline-block; width: 95%;}</style>
<div class="check-select-multiple">
<label><input name="cidades" type="checkbox" value="1" />Goiânia</label>
<label><input name="cidades" type="checkbox" value="2" />Palmas</label>
<label><input name="cidades" type="checkbox" value="3" />Fortaleza</label>
<label><input name="cidades" type="checkbox" value="4" />São Paulo</label>
<label><input name="cidades" type="checkbox" value="5" />Salvador</label>
</div>
</pre><br />
Veja que não precisamos fazer malabarismos com javascripts nem plugins pra Jquery. É só usar a simplicidade do belo HTML+CSS.<br />
<br />
Além da facilidade pro visitante, ainda é infinitamente mais fácil estilizar uma DIV do que estilizar um Select (principalmente nos IEs da vida).<br />
<br />
Se você gostou da minha explanação, abrace esta campanha também. Diga adeus ao select-multiple.<br />
Faça um link para esta campanha, compartilhe no twitter, facebook, google-plus, faça bandeiras, passeatas, greve de fome...<br />
<br />
Amém.Unknownnoreply@blogger.com5tag:blogger.com,1999:blog-23429770.post-27359436388674998502011-12-21T13:11:00.001-03:002011-12-22T13:52:36.444-03:00QuerySelector ou CSSQuery para IE 6 e 7 (e outros navegadores antigos)Nobres colegas scripteiros, no maravilhoso mundo da programação, a cada dia a gente se surpreende.<br />
<br />
Ontem, durante a programação do <a href="http://mwords.valeus.net/" target="_blank">Mwords</a>, eu procurava um script de CSSQuery para poder permitir que os usuários do Mwords, escolhessem o elemento alvo com base em seletores CSS. Exemplo: alvo = '#content .post p'.<br />
<br />
Lindo né? Assim como no jQuery e outras libs por aí.<br />
<br />
As versões que eu achei eram gigantescas (mais de 10k) e a mais recomendada era a do <a href="http://dean.edwards.name/weblog/2005/08/cssquery2/" target="_blank">Dean Edwards</a>.<br />
Nunca que eu iria pesar o script do Mwords com 10k só pra ter uma funcionalidadezinha dessas a mais.<br />
<br />
Além disso, a maioria dos navegadores modernos já suporta a <a href="https://developer.mozilla.org/En/DOM/Document.querySelectorAll" target="_blank">document.querySelectorAll</a> que permite fazer isso.<br />
O único problemático (pra variar) é o IE (acho que do 8 pra baixo).<br />
<br />
Não desisti da minha busca, e acabei encontrando esta <a href="http://ajaxian.com/archives/creating-a-queryselector-for-ie-that-runs-at-native-speed" target="_blank">pérola da gambiarra feita pelo pessoal do Ajaxian</a>. Funciona maravilhosamente bem e é maravilhosamente pequeno. Um achado digno de glórias ao pessoal do Ajaxian.<br />
<br />
Rapidamente adaptei na minha lib, pra usar isto, caso o navegador não suporte a document.querySelectorAll.<br />
<br />
Vejam como ficou:<br />
<br />
<pre>cssQuery = function(sel){ //document.querySelector. sel é o seletor CSS
//by Micox - http://elmicox.blogspot.com
var i, res, dqs, d=document;
if (d.querySelectorAll){
return d.querySelectorAll(sel);
}else{ //o IE8 pra baixo e FF 3.5 pra baixo não tem querySelector
//baseado no fudido script de querySelector do ajaxian http://ajaxian.com/archives/creating-a-queryselector-for-ie-that-runs-at-native-speed
var head = d.documentElement.firstChild;
var styleTag = d.createElement("STYLE");
head.appendChild(styleTag);
dqs = d.__qsResult = [];
styleTag.styleSheet.cssText = sel + "{x:expression(document.__qsResult.push(this))}";
window.scrollBy(0, 0);
head.removeChild(styleTag);
res = [];
for (i in dqs){if (dqs.hasOwnProperty(i)) {
res.push(dqs[i]);
}}
return res;
}
}
//como usar
var todos_p_destaque_filhos_de_content = cssQuery('#content p.destaque');</pre>
<br />
Obs.1: Não quis mexer com o prototype do "document" porque uso isso dentro de uma lib minha e iria ficar melhor pra mim assim. Você pode adaptá-la e postar nos comentários se quiser.<br />
<br />
Obs.2: Só irá funcionar com seletores NATIVOS do navegador em que estiver. Portanto se for usar um "div>p.classetal" no IE, provavelmente não irá funcionar.<br />
<br />
Pequena explicação sobre o truque deste CSSQuery:<br />
<br />
<ol>
<li>Primeiro testo se o querySelectorAll existe no navegador atual (aquele primeiro if). Se existe, então uso ele.</li>
<li>Se não existe, irei adicionar um "style" ao documento.</li>
<li>O conteúdo deste style usa expressions - uma funcionalidade de CSS exclusiva do Internet Explorer que permite embutir scripts dentro das folhas de estilo. Você já deve conhecê-la caso já tenha usado meu velho <a href="http://elmicox.blogspot.com/2008/03/ultimate-micox-menu-drop-down-css-at-4.html" target="_blank">Ultimate menu drop-down</a>, onde uso <a href="http://elmicox.blogspot.com/2008/03/ativando-hover-e-first-child-no-ie-6-um.html" target="_blank">expressions pra simular o :hover</a> no IE.</li>
<li>O que foi escrito dentro do style embutido (cssText) é a criação de uma regra onde o seletor é o parametro "sel" passado (o caminho do elemento). </li>
<li>Dentro da regra, eu pego o próprio elemento encontrato (this) e adiciono em uma variável __qsResult.</li>
<li>Simples não? Genial.</li>
</ol>
<br />
<br />
(Pra quem quiser ver um exemplo do novo Mwords em funcionamento, olhem <a href="http://dietas-regimes.blogspot.com/">este site</a>).<br />
<br />
Até mais.<br />
<br />Unknownnoreply@blogger.com2tag:blogger.com,1999:blog-23429770.post-16676771480595924382011-10-18T14:33:00.001-03:002011-12-21T15:21:02.586-03:00Alternativa melhor ao typeOf em JavascriptOpa,<br />
<br />
Um textinho rápido que li <a href="http://javascriptweblog.wordpress.com/2011/08/08/fixing-the-javascript-typeof-operator/" rel="nofollow" target="_blank">neste link do Angus Croll</a> e que merece ser replicado: <b>Uma alternativa bem melhor ao velho typeOf em javascript.</b><br />
<br />
O typeOf, é um método nativo de Javascript pra retornar o tipo da variável. Assim temos:<br />
<br />
<br />
<pre class="code">typeof "belladonna" //"string"
typeof (2) //"number"
typeof ("a", 3) //"number"
typeof (1 + 1) //"number"
var a;
typeof a; //"undefined"
typeof b; //"undefined"
alert(a); //undefined
alert(b); //ReferenceError
typeof NaN //"number"
typeof {a: 4}; //"object"
typeof [1, 2, 3]; //"object"
typeof null //"object"
typeof new ReferenceError; //"object"
typeof new Date; //"object"
typeof /a-z/; //"object"
typeof Math; //"object"
typeof JSON; //"object"
typeof new Number(4); //"object"
typeof new String("abc"); //"object"
typeof new Boolean(true); //"object"
(function() {console.log(typeof arguments)})(); //object
</pre>
<br />
Bom, olhando os exemplos acima a gente vê que, apesar de útil e muito usado, ele não retorna detalhadamente o que a gente precisa.<br />
<br />
A solução? Eu, pessoalmente, sempre usei uma verificação envolvendo a propriedade "prototype" que toda variável tem.<br />
<br />
O Angus fez melhor e empacotou em uma função:<br />
<br />
<pre class="code">var toType = function(obj) {
return ({}).toString.call(obj).match(/\s([a-zA-Z]+)/)[1].toLowerCase()
}
</pre>
<br />
Comparando com os "object" do typeof padrão teremos as seguintes diferenças:<br />
<br />
<pre class="code">toType ("a", 3); //"string"
toType({a: 4}); //"object"
toType(null); //"null"
toType([1, 2, 3]); //"array"
(function() {console.log(toType(arguments))})(); //arguments
toType(new ReferenceError); //"error"
toType(new Date); //"date"
toType(/a-z/); //"regexp"
toType(Math); //"math"
toType(JSON); //"json"
toType(new Number(4)); //"number"
toType(new String("abc")); //"string"
toType(new Boolean(true)); //"boolean"
</pre>
<br />
O resto (string, number, undefined) é igual. Só não pode ser usado em variáveis vazias não declaradas, senão dará um "ReferenceError" assim como um alert em algo não declarado.<br />
<br />
Gostou?Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-23429770.post-29767095852320809812011-10-07T13:18:00.000-04:002011-10-07T13:18:26.908-04:00Funções javascript pra trabalhar com ScrollAe pessoal, esses dias precisei brincar com a posição da barra de rolagem (scroll) na tela e posicionamento de elementos de acordo com o scroll.<br />
<br />
Como quase tudo em javascript, nossos amigos navegadores não ajudam. Ou seja, não é só pegar a documentação, tem toda aquela velha gambiarra pra funcionar em diversos browsers (crossbrowser).<br />
<br />
Pra minha alegria, lembrei que eu já tinha brincado com isso na época do velho Mwords, daí fui lá atrás das funções e re-adaptei. Mostrar-lhes-ei agora:<br />
<br />
Pegando a posição atual do scroll e retornando em um objeto com as propriedades X e Y:<br />
<pre class="code">var w=window, d=document;
//pega a posição atual do scroll
mov.getScroll= function(){
return {
x: (w.pageXOffset ? w.pageXOffset : de.scrollLeft ? de.scrollLeft : d.body.scrollLeft) || 0,
y: (w.pageYOffset ? w.pageYOffset : de.scrollTop ? de.scrollTop : d.body.scrollTop) || 0
};
};
//exemplo de uso
alert('Posição Y do scroll: ' + mov.getScroll().y);
</pre>
<br />
Pegando a posição de determinado elemento na tela:<br />
<pre class="code">var w=window, d=document;
//pega a posição correta do elemento na tela
mov.objPos = function(obj) {
var curl =0, curt = 0;
if (obj.offsetParent) {
do {
curl += obj.offsetLeft;
curt += obj.offsetTop;
} while ((obj = obj.offsetParent));
return {x: curl, y: curt};
}else{
return {x: obj.offsetLeft, y:obj.offsetTop};
}
};
//exemplo de uso
alert('Posição real do elemento "viva" na tela: ' + mov.objPos(d.getElementById('viva') ) );
</pre>
<br />
Fazendo a barra de rolagem se movimentar gradativamente<br />
<pre class="code">//variaveis
var micox_mov_height= 50; //de quanto em quanto o scroll se moverá
var micox_mov_fps = 20; //velocidade que o scroll se moverá
//faz o slide
mov.slide = function(ini,end){
if(!mov.sliding){
mov.sliding = true;
//setando posição inicial
var atual = mov.getScroll();
w.scrollTo(atual.x , ini);
mov.inter = setInterval(function(){
var novoY, atual = mov.getScroll();
if(atual.y < end){
w.scrollTo(atual.x , atual.y + micox_mov_heigth);
}else{
mov.sliding = false;
clearInterval(mov.inter);
}
},1000/micox_mov_fps);
}
}
</pre>
<br />
Em breve vocês irão ver estas funções fazendo um efeitinho muito legal em um texto de um brodi meu. Linkarei aqui quando acontecer. Aguardem, irá valer a pena.<br />
<br />
Bom, tá documentado ae se alguém precisar. Qualquer dúvida é só comentar.Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-23429770.post-33656932263661536342011-05-10T08:32:00.000-04:002011-05-10T08:32:57.505-04:00ERR_CONTENT_DECODING_FAILED no Google ChromeEu tive um problema no navegador Google Chrome com o <a href="http://www.tadarank.com/">Tadarank.com</a> esses dias.<br />
<br />
A página não aparecia no Chrome de jeito nenhum.
Exibia um erro:<br />
<br />
<span class="Apple-style-span" style="color: #333333; font-family: Georgia, Utopia, 'Palatino Linotype', Palatino, serif; font-size: 14px; line-height: 21px;"><b>Error 330 (net::ERR_CONTENT_DECODING_FAILED)</b></span><br />
<span class="Apple-style-span" style="color: #333333; font-family: Georgia, Utopia, 'Palatino Linotype', Palatino, serif; font-size: 14px; line-height: 21px;"><br /></span><br />
<span class="Apple-style-span" style="color: #333333; font-family: Georgia, Utopia, 'Palatino Linotype', Palatino, serif; font-size: 14px; line-height: 21px;">Dando uma pesquisada na net, vi que meu caso poderia ter a ver com encoding Gzip, essas paradas...</span><br />
<span class="Apple-style-span" style="color: #333333; font-family: Georgia, Utopia, 'Palatino Linotype', Palatino, serif; font-size: 14px; line-height: 21px;"><br /></span><br />
<span class="Apple-style-span" style="color: #333333; font-family: Georgia, Utopia, 'Palatino Linotype', Palatino, serif; font-size: 14px; line-height: 21px;">Daí resolvi trocando:</span><br />
<span class="Apple-style-span" style="color: #333333; font-family: Georgia, Utopia, 'Palatino Linotype', Palatino, serif; font-size: 14px; line-height: 21px;"><b>header('Content-Encoding: gzip, deflate');</b></span><br />
<span class="Apple-style-span" style="color: #333333; font-family: Georgia, Utopia, 'Palatino Linotype', Palatino, serif; font-size: 14px; line-height: 21px;"><b><br /></b></span><br />
<span class="Apple-style-span" style="color: #333333; font-family: Georgia, Utopia, 'Palatino Linotype', Palatino, serif; font-size: 14px; line-height: 21px;">Por</span><br />
<span class="Apple-style-span" style="color: #333333; font-family: Georgia, Utopia, 'Palatino Linotype', Palatino, serif;"><span class="Apple-style-span" style="font-size: 14px; line-height: 21px;"><b><span class="Apple-style-span" style="font-weight: normal;"><b>header('Content-Encoding: zlib, deflate, gzip');</b></span></b></span></span><br />
<span class="Apple-style-span" style="color: #333333; font-family: Georgia, Utopia, 'Palatino Linotype', Palatino, serif;"><span class="Apple-style-span" style="font-size: 14px; line-height: 21px;"><b><span class="Apple-style-span" style="font-weight: normal;"><b><br /></b></span></b></span></span><br />
<span class="Apple-style-span" style="color: #333333; font-family: Georgia, Utopia, 'Palatino Linotype', Palatino, serif;"><span class="Apple-style-span" style="font-size: 14px; line-height: 21px;">Pronto. O problema sumiu.</span></span><br />
<span class="Apple-style-span" style="color: #333333; font-family: Georgia, Utopia, 'Palatino Linotype', Palatino, serif;"><span class="Apple-style-span" style="font-size: 14px; line-height: 21px;">Talvez esta postagem seja útil pra você.</span></span>Unknownnoreply@blogger.com2tag:blogger.com,1999:blog-23429770.post-23662567453545186572011-04-12T08:35:00.000-04:002012-01-09T12:56:50.529-03:00Como não ser marcado como SPAM ao enviar email pelo PHP - Ativar DomainKeys e SPF no CpanelOaa<br />
<br />
Ae malucada.<br />
Esses dias passei um perrengue com emails do <a href="http://tadarank.com/">tadarank </a>e com um produto que eu vendia e enviava email automaticamente pros meus compradores.<br />
<br />
Nas últimas semanas, um monte de clientes me ligou dizendo que não recebeu o email. Pesquisei e receberam sim, só que tinha ido parar na caixa de SPAM. Todos os emails enviados pelos meus domínios estavam indo pra caixa de SPAM. Tristeza.<br />
<br />
Pesquisei e pedi ajuda pra resolver este problema.<br />
Eu mesmo já tinha ajudado muita gente no passado, sugerindo palavras "negras" a serem eliminadas, sugerindo enviar somente se o email for do domínio (ex, se seu site é do domínio www.arroz.com você só pode enviar emails terminados em @arroz.com ), baixar bibliotecas php para email, e outras técnicas que dão uma força boa na resolução do problema, <b>mas não resolvem de vez</b>.<br />
<br />
Até que o brodi <a href="http://www.boaspromocoes.com.br/">kyonac</a> da lista de monetização me sugeriu ativar uns lanche chamado <b>SPF e DomainKeys</b>.<br />
<br />
É claro que vc irá pesquisar na web o que diabos é isso (afinal você está lendo este tutorial). Numa rápida explicação (chupinhada do Cpanel):<br />
<br />
<b>DomainKeys </b>é um sistema de autenticação de e-mail que permite que o correio recebido seja comparado com o servidor de que foi enviado para confirmar que o correio não foi modificado. Isto garante que as mensagens estão chegando realmente do remetente listado e permite que as mensagens abusivas sejam rastreadas com mais facilidade (segundo o Cpanel).<br />
<br />
<b>SPF </b>irá especificar que máquinas estão autorizadas a enviar e-mails do(s) seu(s) domínio(s). Isto significa que apenas o correio enviado através deste servidor irá aparecer como correio válido do(s) seu(s) domínio(s) quando os registros SPF são verificados (segundo o Cpanel). <br />
<br />
Bom, se quiser detalhar melhor pesquisa no google :P<br />
<br />
Em resumo: <b>Ativei estas duas paradas no Cpanel e deixei de ser taxado como Spammer. Simples assim.</b><br />
<br />
Antes de descobrir como ativar isso aí, eu e o <a href="http://portofacil.net/">Jânio</a>, quebramos a cabeça, pois achávamos que era algo complexo de ser ativado. Abrimos chamado no datacenter e talz...<br />
<br />
Felizmente, passeando pelas opções de email do Cpanel achei o menu chamado <b>Autenticação de Email dentro da aba Correio</b>. É só clicar, ativar e ser feliz. Sem complicação nenhuma.<br />
<br />
Atualização: O Vinicius indicou um wizard pra gerar o SPF <a rel='nofollow' target='_blank' href="http://www.microsoft.com/mscorp/safety/content/technologies/senderid/wizard">http://www.microsoft.com/mscorp/safety/content/technologies/senderid/wizard</a> (em inglês)<br />
<br />
Dúvidas? Comente.Unknownnoreply@blogger.com7tag:blogger.com,1999:blog-23429770.post-73215480749119047042011-03-11T10:46:00.002-04:002011-09-20T14:42:44.273-04:00Tada Rank - Avaliações de sistemas de afiliados, hospedagens, webmasters e anunciantes na webOpa malucada, beleza?<br />
<br />
O mico tava sumido pois tava trabalhando em 3 novos projetinhos.<br />
<br />
O primeiro é tipo um Framework PHP/Javascript pessoal, sem complicação, que me ajudará bastante no que eu preciso pra programar sites: Mudar de visual facilmente, facilidade pra exibir tabelas do BD, facilidade pra criar forms que se comunicam com o BD, facilidade pra cadastro/login de usuários, facilidade pra trocar de linguagem do site (pt en es) e facilidade pra validação de campos.<br />
<br />
Disso tá saindo o MicoxLib - Quem sabe um dia eu torno ele público.<br />
<br />
O segundo, que foi feito com o MicoxLib, era um sistema de compras coletivas com um brodi aqui de Goiânia. Infelizmente o mercado já tá poluído demais. Daí desistimos.<br />
<br />
O terceiro, também feito com o MicoxLib, tá online e ele é o assunto dessa postagem:<br />
<a href="http://tadarank.com/?sms_ss=blogger&at_xt=4d7a3309705af3c0%2C0">Tada Rank - Avaliações de sistemas de afiliados, hospedagens, webmasters e anunciantes na web</a><br />
<br />
O objetivo inicial é avaliar os sistemas de afiliados pra ajudar nós webmasters e também os anunciantes.<br />
<br />
Acabou que coloquei formas de contato/anúncio para ajudar os anunciantes a não gastarem rios de dinheiro com intermediários e poderem anunciar DIRETAMENTE nos sites que desejarem. Vou até gastar um pouco com Adwords nessa parte.<br />
<br />
Futuramente vou colocar pra avaliar hospedagens também.<br />
<br />
Acaba que os sistemas de afiliados e as hospedagens também sairão ganhando pois saberão seus pontos fracos.<br />
<br />
Se cadastra lá e ajuda a avaliar.<br />
<br />
Abaixo, uma lista de alguns sistemas de afiliados cadastrados e links pras suas respectivas pontuações:<br />
<br />
<ul>
<li><a href="http://tadarank.com/detail-afilia.php?id=1" target="_blank"><strong>Google AdSense</strong></a>;</li>
<li><a href="http://tadarank.com/detail-afilia.php?id=4" target="_blank"><strong>HotWords</strong></a>;</li>
<li><a href="http://tadarank.com/detail-afilia.php?id=9" target="_blank"><strong>UOL Afiliados</strong></a>;</li>
<li><a href="http://tadarank.com/detail-afilia.php?id=3" target="_blank"><strong>Submarino</strong></a>;</li>
<li><a href="http://tadarank.com/detail-afilia.php?id=2" target="_blank"><strong>Mercado Sócios</strong></a>;</li>
<li><a href="http://tadarank.com/detail-afilia.php?id=8" target="_blank"><strong>Lomadee</strong></a>;</li>
<li><a href="http://tadarank.com/detail-afilia.php?id=5" target="_blank"><strong>Afilio</strong></a>;</li>
<li><a href="http://tadarank.com/detail-afilia.php?id=14" target="_blank"><strong>ClickAfiliados</strong></a>;</li>
<li><a href="http://tadarank.com/detail-afilia.php?id=17" target="_blank"><strong>Livraria Cultura</strong></a>;</li>
<li><a href="http://tadarank.com/detail-afilia.php?id=23" target="_blank"><strong>Boo-box</strong></a>;</li>
<li><a href="http://tadarank.com/detail-afilia.php?id=6" target="_blank"><strong>Mundinhero</strong></a>;</li>
<li><a href="http://tadarank.com/detail-afilia.php?id=24" target="_blank"><strong>Egrana</strong></a>;</li>
<li><a href="http://tadarank.com/detail-afilia.php?id=13" target="_blank"><strong>Americanas.com</strong></a>;</li>
<li><a href="http://tadarank.com/detail-afilia.php?id=26" target="_blank"><strong>Clique Mídia</strong></a>;</li>
<li><a href="http://tadarank.com/detail-afilia.php?id=21" target="_blank"><strong>CPMStar</strong></a>;</li>
<li><a href="http://tadarank.com/detail-afilia.php?id=10" target="_blank"><strong>Cursos 24 Horas</strong></a>;</li>
<li><a href="http://tadarank.com/detail-afilia.php?id=15" target="_blank"><strong>Ad 4 Game</strong></a>;</li>
<li><a href="http://tadarank.com/detail-afilia.php?id=28" target="_blank"><strong>Virtual Afiliados</strong></a>;</li>
<li><a href="http://tadarank.com/detail-afilia.php?id=18" target="_blank"><strong>Zip Concursos</strong></a>;</li>
<li><a href="http://tadarank.com/detail-afilia.php?id=16" target="_blank"><strong>Smowtion</strong></a>;</li>
<li><a href="http://tadarank.com/detail-afilia.php?id=11" target="_blank"><strong>Parceria Perfeita</strong></a>;</li>
<li><a href="http://tadarank.com/detail-afilia.php?id=7" target="_blank"><strong>Mala Pronta</strong></a>;</li>
<li><a href="http://tadarank.com/detail-afilia.php?id=25" target="_blank"><strong>Pagamento Digital</strong></a>;</li>
<li><a href="http://tadarank.com/detail-afilia.php?id=27" target="_blank"><strong>JáCotei</strong></a>;</li>
<li><a href="http://tadarank.com/detail-afilia.php?id=19" target="_blank"><strong>Play-Asia Affiliate Program</strong></a>;</li>
<li><a href="http://tadarank.com/detail-afilia.php?id=22" target="_blank"><strong>Ero Advertising</strong></a>;</li>
</ul>Unknownnoreply@blogger.com1tag:blogger.com,1999:blog-23429770.post-52192713586648899932011-02-24T10:26:00.002-04:002011-10-07T13:36:09.860-04:00Pegando o endereço da URL atual em PHPVárias e várias vezes precisamos saber o <b>caminho COMPLETO da url atual</b> em PHP mas as variáveis globais não ajudam.<br />
Seja para inserir em botões do twitter, facebook, etc.<br />
<br />
As globais do PHP só informam <b>após </b>o domínio do site (www.qualquercoisa.com), o que muitas vezes não serve de nada para um botão do twitter por exemplo.<br />
<br />
Pesquisei na net pra ver se já tinha algo pronto pra eu usar e nada. Só tinha gente gambiarrando com o SCRIPT_NAME , REQUEST_URI ou PHP_SELF que não valem de nada quando você precisa do endereço COMPLETO incluindo o 'http://' (protocolo) e o 'www.qualquercoisa.com' (domínio).<br />
<br />
Eu precisava era de algo parecido com o this.location comum no javascript. <br />
<br />
Daí resolvi fazer o que sei: gambiarrar também.<br />
<br />
Saiu o código abaixo:<br />
<br />
<pre class='code'>$proto = strtolower(preg_replace('/[^a-zA-Z]/','',$_SERVER['SERVER_PROTOCOL'])); //pegando só o que for letra
$location = $proto.'://'.$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI'];
echo $location;
</pre>Prontinho, espero ter ajudado. Comenta ae.<br />
<br />
Unknownnoreply@blogger.com8tag:blogger.com,1999:blog-23429770.post-28578815632972693422011-01-18T20:12:00.006-03:002011-01-19T08:13:32.042-03:00Botão Twitta Isso Fácil como Favorito no Firefox - sem pluginAe povo. Tô de férias.<br />
<br />
Eu tava cansado de querer mandar algo pro twitter e ter que usar complicação de plugins pra firefox ou ver a boa vontade do dono da página de colocar um botão "twite isto" fácil sem burocracia.<br />
<br />
Tem alguns que chegam ao absurdo de te pedir até a senha!!! Sai fora.<br />
<br />
E o pior é que muitos NÃO REDUZEM O URL!! <br />
<br />
Daí resolvi deixar a preguiça de lado e fazer um rapidinho aqui com confirm de javascript e opção pra escrever algo e, principalmente, com<b> redução automática do URL</b> via bitly e topsy.<br />
<br />
Não pede sua senha, não fica 2 horas carregando páginas intermediárias e ainda reduz a url. <br />
<br />
<b>É só arrastar o link abaixo para seus favoritos do Firefox:</b><br />
<br />
<a href="javascript:(function(){tx=document.title;do{tx=prompt('Digite%20o%20texto%20para%20aparecer%20antes%20do%20link.\r\nMaximo%20de%20115%20caracteres.',tx);if(tx&&tx.length<119){open('http://button.topsy.com/retweet?title='+escape(tx)+'&url='+escape(location));break}}while(tx&&confirm('Seu%20texto%20tem%20mais%20de%20118%20caracteres.\r\nNao%20vai%20caber.\r\nQuer%20corrigir?'))})();">Twitta Isso</a><br />
<br />
Ou, se não der certo arrastando, você pode colocar o favorito manualmente:<br />
<ol>
<li>Copia o seguinte código (ctrl + C): <i>javascript:(function(){tx=document.title;do{tx=prompt('Digite o texto para aparecer antes do link.\r\nMáximo de 115 caracteres.',tx);if(tx&&tx.length<119){open('http://button.topsy.com/retweet?title='+escape(tx)+'&url='+escape(location));break}}while(tx&&confirm('Seu texto tem mais de 118 caracteres.\r\nNão vai caber.\r\nQuer corrigir?'))})(); </i></li>
<li>Clica com o Botão direito na barra de favoritos e escolher a opção "adicionar novo favorito"</li>
<li>No nome você coloca: Twitta Isso</li>
<li>No Endereço você cola o código que copiou antes.</li>
</ol>
Prontinho.<br />
Não testei em outros navegadores pra ver o que dá. Sou preguiçoso. Testa ae e me avisa nos comments.<br />
<br />
Se quiser dar uma curiada no código é só embelezá-lo no jsbeautifier: <a href="http://jsbeautifier.org/">http://jsbeautifier.org/ </a><br />
Se quiser, pode me agradecer ou xingar via twitter também hehe: <a href="http://twitter.com/micox">twitter.com/micox</a><br />
<br />Unknownnoreply@blogger.com3tag:blogger.com,1999:blog-23429770.post-72380289710818098112010-08-26T10:40:00.004-04:002010-09-01T08:14:02.050-04:00Pegando o 'Ontem' em PHP - 4 métodos<p>
Esta dica legal peguei do <a href="http://blog.ninedays.org/2009/07/02/get-calculate-yesterday-date-php/">Ninedays blog</a>.
</p><p>
Como calcular o dia de ontem em php. Com uma descrição de 4 formas diferentes pra você escolher a que mais te agrada.
</p><p>
Se você sabe outros métodos interessantes, contribua aí nos comentários.
</p><p>
Adaptando um pouco também dá pra trabalhar com o mês anterior, ano anterior, etc...
</p><p>
Bora:
</p><p>
<span style="font-weight: bold;">Método 1 - mktime - O mais lento (até 450%)</span>
</p><p>
echo date("Y-m-d", mktime(0, 0, 0, date("m"),date("d")-1,date("Y")));
</p><p>
<span style="font-weight: bold;">Método 2 - subtraindo os minutos - O mais rápido</span>
</p><p>
echo date("Y-m-d", time() - 86400);
</p><p>
Uma variação deste pra ficar mais "entendível" pra saber quantos minutos/horas subtraímos seria usando...
</p><p>
echo date("Y-m-d", time() - (60*60*24) );
//deve ficar um pouquinho mais lento que a forma original
</p><p>
<span style="font-weight: bold;">Método 3 - strtotime() yesterday</span>
</p><p>
echo date("Y-m-d", strtotime("yesterday"));
</p><p>
<span style="font-weight: bold;">Método 4 - strtotime() -1 day</span>
</p><p>
echo date("Y-m-d", strtotime("-1 day"));
</p><p>
Post rápido. É só isso...
Se você sabe outros métodos interessantes, contribua aí nos comentários.
</p>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-23429770.post-38012267745550701182010-07-13T08:27:00.003-04:002012-02-09T13:23:04.098-03:00Introduçãozinha sobre Cache web e no servidorUm brodi perguntou estes dias sobre esquemas de cache pra deixar a página mais rápida.
<br />
Vou tentar explicar de forma resumida e rápida sobre cache em páginas web.
<br />
O termo cache designa o ato de guardar uma cópia de algo complexo ou lento para que se possa ter acesso mais rápido a este "algo complexo" futuramente.
O <strong>cache web</strong> pode ser ativado em "várias frentes".
<br />
O cache que vou tratar aqui é o "cache web" de páginas web/http, ok? Nada a ver com cache em processador, e outras paradas.
<br />
<h3>
Cache na Frente client</h3>
Quando você pede uma página web no seu navegador, ele a exibe, porém , além de exibir, pode ser que ele guarde ela (ou partes dela) "em cache" para caso você acesse ela novamente no futuro. Assim ele exibirá a página mais rápido pois partes dela (como imagens, scripts) estavam guardadas em seu cache interno e não precisaram ser pedidas novamente na rede.
<br />
No Firefox do Windows XP, o cache geralmente fica em Documents and Settings\nome_user\Configurações locais\Dados de aplicativos\Mozilla\Firefox\Profiles
<br />
Esta foi a "frente client" do cache (conhecido como "cache web") e ela pode ser exercida não só pelo navegador, mas por servidores proxy também, por exemplo.
<br />
Como implementar este cache web?
<br />
1) Através de meta tags no HTML (meta expires, cache-control, pragma)<br />
2) OU headers enviados pelo script php/asp/jsp (também expires, cache-control, pragma)<br />
3) OU header enviados diretamente pelo servidor web http (apache/IIS/etc) (novamente expires, cache-control, pragma).
<br />
Não vou detalhar cada um aqui pois não é o objetivo do post. Usa o google :P
<br />
Veja um detalhamento maior sobre <a href="http://www.rnp.br/newsgen/0003/cache.html" rel="nofollow">cache web aqui</a>,
E <a href="http://www.mnot.net/cache_docs/" rel="nofollow">aqui também (em inglês)</a>
Cache via <a href="http://www.softblue.com.br/blog/home/postid/6/PHP+E+ARQUIVOS+EM+CACHE" rel="nofollow">header PHP</a>
<br />
<h3>
Cache na Frente server-side</h3>
Já a "frente server-side" atua no servidor web (cache server), pra ajudar o bixo a enviar a página pro navegador com maior rapidez.
<br />
Exemplo: Imagine que o navegador pede uma página que exibe uma lista de produtos e preços que está no banco de dados.
<br />
O coitado do servidor web terá que ligar o interpretador Php (ou asp ou outro), conectar com o banco de dados, fazer a consulta sql, aguardar o server sql processar a consulta, pegar os dados, formatar em html e só então devolver pro navegador.
<br />
Agora imagine que, além da lista de produtos, o server tenha que pegar também o menu do site no banco de dados, as últimas postagens, etc.
Será um monte de consultas que deixarão o site lento pra caramba.
<br />
Agora imagine que o servidor é inteligente e, além de devolver o html pro navegador, ele também crie um arquivo com este html.
<br />
Assim, da próxima vez que algum navegador pedir a mesma página ele não precise fazer aquele monte de consultas sql e talz. É só mandar o arquivo html que estava salvo pro navegador.
<br />
Hahá! Seu server ficará aliviado e seu site mais rápido. Simples né?
<br />
Nem tanto hehe. Existem sistemas de cache server onde os caras guardam na memória RAM e não em arquivos pra ficar mais rápido ainda (MEMcached). Outros guardam só as consultas sql, outros guardam os arquivos em módulos (módulo menu, módulo option_cidades), etc.
<br />
Vai da sua imaginação e do seu sistema...
<br />
"Mas, sr mico, e se o conteúdo da página mudar?" <br />
- Bem, é por isso que, nos dois casos citados acima existe o conceito de timeout. O programador HTML/PHP irá especificar um tempo em que o cache será válido.
<br />
"Mas, sr mico, no meu site/sistema o sistema de fornecedores cadastra produtos a todo minuto, um sistema de cache não ajudaria muito pois o timeout teria que ser muito pequeno" <br />
- Se seu site tem muitos acessos por minuto, mesmo um cache com validade de 30seg seria de grande ajuda. Uma consulta sql consome muito tempo e processamento.
O primeiro visitante destes 30seg iria esperar um pouco, mas o segundo e o terceiro iriam agradecer a velocidade.
<br />
Uma implementação simples de cache server em arquivos pode ser <a href="http://imasters.com.br/artigo/11191/php/caching_em_php_com_uma_tecnica_obscura_mas_muito_eficiente/" rel="nofollow" target="_blank">vista aqui</a>.
<br />
<a href="http://www.google.com.br/search?hl=pt-BR&source=hp&q=cache%20file%20asp&meta=&aq=f&oq=" rel="nofollow">Outras em ASP aqui</a>, <a href="http://www.google.com.br/search?hl=pt-BR&q=cache+php+file&aq=f&aqi=&aql=&oq=&gs_rfai=" rel="nofollow">Outras em PHP aqui</a>
<br />
<h3>
Conclusão</h3>
Pra sites com muitos acessos, sistema de cache são uma puta salvação. E você ainda pode implementar os 2 sistemas de cache em conjunto.
<br />
Eu já economizei bastante em servidor web implementando sistemas de cache. Princpalmente em blogs com o plugin super cache do wordpress (e recentemente o db cache reloaded graças ao <a href="http://janio.sarmento.org/">Janio</a>).
<br />
Na época do <a href="http://mwords.valeus.net/">Mwords</a>, o cache dava uma salvada boa nas trocentas requisições por segundo que tinha.
<br />
Devem existir outras frentes, outros modelos, outras formas...
Se você souber lembre este mico através dos comentários.Unknownnoreply@blogger.com2tag:blogger.com,1999:blog-23429770.post-6330952271086527402010-06-23T14:40:00.007-04:002010-06-24T07:14:27.764-04:00Dois ou mais domínios no mesmo Wordpress<p>Opa, depois de anos sumido volto pra deixar guardado uma gambiarrazinha que tive que fazer para poder ter 2 domínios funcionando na mesma instalação do Wordpress. (testado só em wordpress antes do 3.0 )
</p><p>
<span style="font-style:italic;">"Ué, mico, mas não seria só fazer um redirecionamento?"</span> <br />
- Não, neste caso, o cliente quer que o site funcione tanto para www.nomecliente.com.br como para www.produtotal.com SEM MUDAR O ENDEREÇO no navegador, ou seja, sem redirecionamento.
</p><p>
<span style="font-style:italic;">
"Mas por que diabos o cliente quer isso? Convence ele do contrário ué"</span><br />
- O cliente quer isso para ele ficar bem no google na busca pelo produtotal e ainda assim ter seu site com nomecliente.com.br. O cliente tá certo.
</p><p>
<span style="font-style:italic;">"Ah, então não é só fazer um Rewrite no apache pra cuidar disso?"</span><br />
- Não pois o Wordpress redireciona tudo para o domínio principal para o qual está configurado. Acessos e links. Eu quero mudar os links também.
</p><p>
Bora lá.
</p><p>
<span style="font-weight:bold;">Primeira parte:</span>
</p><p>
- Faça sua instalação normal de Wordpress e escolha um dos domínios para ser o padrão. Neste exemplo vou escolher o nomecliente.com.br . Configuro tudo normalzinho como se só existisse o domínio nomecliente.com.br
</p><p>
<span style="font-weight:bold;">Segunda parte:</span>
</p><p>
- Vou no arquivo wp-config.php e , depois da definição do DB_COLLATE e do WP_TEMP_DIR, eu coloco:
</p>
<pre class='code'>
//hack pro lance de ter 2 dominios
if(strpos($_SERVER["HTTP_HOST"],'nomecliente')===false){
define('WP_HOME','http://www.produtotal.com');
define('WP_SITEURL','http://www.produtotal.com');
}</pre>
<p>
- O que fiz acima? Testei se o visitante veio digitando nomecliente.com.br . Se veio, o wordpress vai funcionar com o domínio normal que foi configurado na instalação, SENÃO, mudo as variáveis de domínio do wordpress.
</p><p>
<span style="font-weight:bold;">Terceira parte:</span>
</p><p>
Pro senhor Google não penalizar o site por CONTEÚDO DUPLICADO eu vou lá na edição do tema do site, no arquivo header.php, e coloco uma META TAG CANONICAL dizendo qual o domínio que deve ser indexado. Neste caso, prefiro que se indexe melhor o "produtotal" do que o "nomecliente".
</p>
<pre class='code'><link rel="canonical" href="http://www.produtotal.com<?= $_SERVER["REQUEST_URI"] ?>" /></pre>
<p>
Prontinho. Fácil né? Será que tem alguma outra forma mais fácil e eu tô manezando?<br /> Se eu falei alguma besteira, corrige ae. Dúvidas?</p>Unknownnoreply@blogger.com10tag:blogger.com,1999:blog-23429770.post-27636570784531628462010-03-18T10:42:00.002-04:002010-03-18T10:55:38.074-04:00Efeito de digitação em texto com JavascriptSaca aquele efeitinho em textos que parece que se está digitando? Uma letra aparecendo após a outra.
<br /><br />
Pois é. Precisei disso no módulo <a href='http://mwords.valeus.net'>Mchat do Mwords</a> daí tive que fazer hehe.
<br /><br />
- Antes de chamar a função o elemento que vai receber a digitação deve estar vazio (sem texto).
<br />
- O "50" que tem lá dentro do setTimeout indica a velocidade da digitação. Quanto menor, mais rápido.
<br />
- Implementei um callback (parâmetro cb) pra que você possa definir alguma ação quando a digitação terminar.
<br />
<br />
Bora:
<br />
<br />
<pre class="code">
digita = function(obj,text,callback){
/* faz efeito de digitação no texto. By Micox - elmicox.blogspot.com */
obj = obj.nodeName ? obj : document.getElementById(obj);
var len=obj.innerHTML.length;
if(len<text.length){
obj.innerHTML = text.substring(0,len+1)
setTimeout(function(){digita(obj,text,callback)},50);
if(len==text.length-1 && callback){ callback();}
}
}
</pre>
<br />
<br />
Pra usar:
<br />
- obj é o objeto que vai sofrer a digitação. Pode passar a ID do elemento ou o Objeto direto mesmo.
<br />
- text é o texto que vai aparecer
<br />
- callback é uma função opcional que vai ser executada quando acabar a digitação.
<br /><br />
Exemplo:<br />
<pre class="code">
<div id='cont'></div>
<script>
digita('cont','Opa, sou um texto que está sendo digitado',function(){alert('acabou a digitação')});
</script>
</pre>Unknownnoreply@blogger.com1tag:blogger.com,1999:blog-23429770.post-80153615087400590772010-03-10T15:59:00.005-04:002010-08-26T13:32:48.004-04:00Pegar Busca digitada por visitantes em motores de busca (google, yahoo, bing, etc) via javascriptOpa, pra ficar guardado aqui no blog pra quando eu (ou alguém mais) precisar:
<br /><br />
Uma funçãozinha rápida (que com certeza já existem outras na net) para ver qual foi a pesquisa digitada por um visitante que caiu em seu site feita em motores de busca comuns no Brasil (google, yahoo, bing, uol).
<br /><br />
<strong>Pegar Busca digitada por visitantes em motores de busca (google, yahoo, bing, etc) via javascript</strong>
<br /><br />
<pre class='code'>
keyword = function(){
var dr=document.referrer,q,fq,goo='';
//se veio de uma busca google/yahoo/etc retorna qual a keyword
if(dr.match(/ogle\.c|ahoo\.c|bing.c|usca.uol/i)){
if((q=dr.indexOf('q='))>0){
fq = dr.indexOf('&',q);
goo = dr.substring(q+2,(fq>q?fq:dr.length));
}
}
return goo;
}
</pre>
<br /><br />
Pra usar é só chamar a função "keyword":
<br /><br />
<pre class='code'>
var palavrachave = keyword();
if(palavrachave){
alert("Olá visitante, bem vindo ao site tal. Você chegou até aqui procurando por " + palavrachave);
}
</pre>
<br /><br />
Ah, por hoje é só hehehe.
Voltemos às brigas com o <a href='http://mwords.valeus.net'>Mwords</a> e Mchat.Unknownnoreply@blogger.com3