sexta-feira, 3 de dezembro de 2010

Municípios criados ao longo do tempo

De vez em quando aparece alguém com dúvida sobre quais municípios foram criados em 2005 e quando foi criado o município de Nazária/PI.
A navegação no site do IBGE não é fácil.
Felizmente encontrei uma página no site do DataSUS que explica tudo isso:
http://www2.datasus.gov.br/DATASUS/index.php?area=040206&item=7

terça-feira, 26 de outubro de 2010

Reiniciando uma sequência no PostgreSQL (inclusive para campos do tipo serial):
alter sequence schema.nome-da-sequencia restart with 1

Se eu tentar
select setval('schema.nome-da-sequencia', 0)
não vai funcionar.

Se eu tentar
select setval('schema.nome-da-sequencia', 1)
não funciona também, pois o próximo insert (mesmo com campo serial) vai chamar a função nextval e colocar o valor 2 para o campo.

sexta-feira, 24 de setembro de 2010

Problemas usando o Google Maps

Usamos o googlemaps no Censo SUAS 2010. Ele funciona bem na maioria dos casos, mas observamos os seguintes problemas:

Se eu buscar por "Rua nada a ver, 180 - Três Marias, MG, Brasil", caio em um local dentro de Três Marias, mesmo o não havendo mapeamento das ruas desse município.
Se eu buscar por "Rua das orquideas, 180 - Três Marias, MG, Brasil", caio em Santa Tereza/SE na Rua das orquideas.

Se eu buscar por "Barro, CE, Brasil", caio em uma área no Ceará, mas distante de Barro.

sábado, 21 de agosto de 2010

XML em PHP

function obterArrResposta($pergunta)
{
$arrOpcoes = $pergunta->opcoes->opcao;
$arrResposta = array();
if($arrOpcoes)
{
foreach($arrOpcoes as $opcao)
{
$arrResposta[] = strip_tags($opcao[0]->asXML());
}
}
else
{
$faixa_opcoes = $pergunta->opcoes->faixa_opcoes;
if($faixa_opcoes)
{
$faixa_opcoes = strip_tags($faixa_opcoes[0]->asXML());
$arrFaixas = explode("-", $faixa_opcoes);
for($i = $arrFaixas[0] ; $i <= $arrFaixas[1] ; $i++)
{
$arrResposta[] = $i;
}
}
}

return $arrResposta;
}

sexta-feira, 13 de agosto de 2010

doAjaxStuff

Pra eu não ter mais que ficar procurando essa função:

function doAjaxStuff
(postQueryString, onreadystatechange, action)
{
try
{
// Firefox, Opera 8.0+, Safari
xmlHttp=new XMLHttpRequest();
}
catch (e)
{
// Internet Explorer
try
{
xmlHttp=new ActiveXObject("Msxml2.XMLHTTP");
}
catch (e)
{
try
{
xmlHttp=new ActiveXObject
("Microsoft.XMLHTTP");
}
catch (e)
{
alert("Seu navegador não suporta AJAX!");
return false;
}
}
}
xmlHttp.onreadystatechange=onreadystatechange;
xmlHttp.open("POST", action, true);
xmlHttp.setRequestHeader
("Content-type", "application/x-www-form-urlencoded");
xmlHttp.setRequestHeader
("Content-length", postQueryString.length);
xmlHttp.setRequestHeader("Connection", "close");
xmlHttp.send(postQueryString);
}

Erro de proxy usando ajax

Chamava uma página usando http://localhost/dir/prog.php

O IP da minha máquina era 10.68.10.68

A página realizava algumas chamadas ajax para http://10.68.10.68/dir/prog2.php

A requisição ajax não saía. Dava erro 407, pedindo autorização do proxy da rede em que eu, cliente, estava.

Soluçao simples: passei a chamar a página trocando o localhost pelo IP da máquina :D .

sexta-feira, 6 de agosto de 2010

Precisei garantir que uma página html teria dois arquivos ".js" carregados. Para isso fiz o código que está abaixo. Não tenho certeza ainda se vale a pena fazer isso. Acredito que a vantagem seja que o usuário desse js não precise lembrar também de carregar o segundo arquivo.

function inc(filename)
{
var body = document.getElementsByTagName('body').item(0);
script = document.createElement('script');
script.src = filename;
script.type = 'text/javascript';
body.appendChild(script)
}

inc("nome-do-arquivo-no-formato-do-campo-src-da-tag-script");
copiado de http://bytes.com/topic/javascript/answers/149165-import-include-js-file-into-js-file

Poderia ter feito também como abaixo, é menos elegante, mas é menor e deve funcionar quase sempre:

document.write("<script type='text/javascript' src='b.js'></script>");

http://www.jguru.com/faq/view.jsp?EID=1339630

sexta-feira, 30 de julho de 2010

nome de variável javascript no Internet Explorer

O seguinte código javascript quebra no Internet Explorer, mas funciona no Firefox:

trCras = document.getElementById("trCras");

A solução é simples:

vtrCras = document.getElementById("trCras");

sexta-feira, 16 de julho de 2010

Perdi algum tempo por que não sabia a diferença entre "empty()" e "isset()".

<?
$a = "";
$b = 0;
if(empty($a))
print "true";
if(isset($a))
print "true";
if(empty($b))
print "true";
if(isset($b))
print "true";
?>

Esse código imprime "truetruetruetrue".

quarta-feira, 14 de julho de 2010

include ou require em PHP

Até onde eu sei a diferença entre um "include" ou um "require" é que o "require" gera um erro fatal quando não encontra o arquivo.

Mas eu quero falar outra coisa que acontece de vez em quando: uma página "a.php" faz um require_once("dir1/b.php"). E "b.php" precisa fazer require_once de um arquivo que está em "dir2/c.php". E "b.php" pode ser chamada sozinha ou pelo require feito por "a.php".

Como fazer,
require_once("../dir2/c.php") ou require_once("dir2/c.php") ?

Resposta:
require_once(dirname(dirname(__FILE__)) . "/dir2/c.php");

terça-feira, 25 de maio de 2010

usando dblink

Com o dblink, posso acessar um banco 'b' estando conectado em um banco 'a'. Pra usar o comando abaixo, é necessário que o dblink esteja instalado na máquina onde está o banco de dados 'a'.

CREATE OR REPLACE VIEW cras.cras_tao2009 AS
SELECT t1.qtd_cras, t1.nome_campo, t1.ibge
FROM dblink('dbname=tao hostaddr=10.68.12.245 user=dbuser password=password port=5432'::text, 'select valor_inteiro, nome_campo, ibge from pbt.opcoes_municipios_valores where (nome_campo = ''cras_aceitos'' and valor_inteiro > 0) order by ibge'::text) t1(qtd_cras numeric, nome_campo character varying, ibge numeric);

terça-feira, 27 de abril de 2010

Sobre desenvolvimento de software

The unique characteristics of the open-source approach distinguish it from existing
commercial software development practices. Participants in open source are globally and virtually distributed, and usually never meet face-to-face. These geographically
distributed participants successfully coordinate software development without traditional mechanisms, such as design processes, schedules, etc.

Yukika Awazu & Kevin C. Desouza - Open Knowledge Management: Lessons From the Open Source Revolution

sexta-feira, 23 de abril de 2010

Obtendo uma página com file_get_contents e stream context

Com o código abaixo eu consigo fazer uma requisição GET passando por um proxy. Com stream context fica bem mais simples que montar a string no formato do HTTP.


$authProxy = base64_encode($this->proxyUser . ":" . $this->proxyPasswd);
// Création des options de la requête
$opts = array(
'http' => array (
'method'=>'GET',
'proxy'=>'tcp://10.68.15.240:3128',
'request_fulluri' => true,
'header'=>"Proxy-Authorization: Basic $authProxy"
)
);
// Création du contexte de transaction
$ctx = stream_context_create($opts);
// Récupération des données
$content = file_get_contents($this->url . "?" . $queryString, false, $ctx);

quinta-feira, 22 de abril de 2010

Exemplo de uso do simplexml_load_string


$objXml = simplexml_load_string($xml);

$perfis = $objXml->xpath("/methodResponse/params/param/value/struct/member[name='roles']/value/array/data/value[starts-with(string, 'MU_') || starts-with(string, 'Estado ')]/string");

foreach($perfis as $perfil)
{
$nms_perfis[] = strip_tags($perfil[0]->asXML());
}

Transformar um XML em um objeto PHP

O PHP possui funções para fazer parse de um XML, 'xml_parse' etc. Entretanto uma maneira mais rápida de carregar um XML é usando 'simplexml_load_file' (link pro php.net).

Ou melhor ainda, 'simplexml_load_string'. Ambas retornam um SimpleXMLElement.