30 de jan. de 2013

Caixa Econômica Federal, conectividade social

Vivi uma experiência complicada pra fazer funcionar os malditos softwares da CEF. O site da mesma é totalmente desorganizado, se a documentação não é inexistente é muito mal organizada. Vendo essa bagunça e depois de se estressar muito tentando resolver o problema, finalmente conseguir resolver a questão.

O maior problema é fazer o Applet da CEF, que roda em Java, funcionar ou reconhecer corretamente o seu leitor de cartão.

Todas as soluções foram testadas no Internet Explorer 7 e 9.

Vou atualizar a lista aos poucos. Última atualização: 30/01/2013

Primeiro problema: A página não pode ser exibida

Essa é fácil e você não vai achar no site da CEF (se achar preste um serviço informando o link nos comentários). Pra resolver o problema você precisa instalar a atualização do Windows, mais precisamente esta: http://support.microsoft.com/kb/2541763/pt-br

Caso não consiga atualizar pelo Windows ter problemas com o atualizador você pode baixar a atualização pelo link direto aqui: http://download.microsoft.com/download/0/D/3/0D3F62A3-9154-43E1-AF9B-1E26A800A20B/WindowsXP-KB2541763-x86-PTB.exe

Pode reparar que o link é direto da Microsoft, não tem grilo.

Instalando isso o erro deve parar. Lembre-se de reiniciar o PC.







4 de jan. de 2009

Montando um vetor/array através de um formulário

Essa é uma dica muito interessante, e garanto que muita gente, mesmo que já mexa com PHP a algum tempo talvez não conhecia ainda.

Com este tutorial vou mostrar que é possível enviar dados de um formulário em forma de um array/vetor, como preferirem.

O código é bem simples, primeiro criamos o formulário em html, e depois adicionamos o código em PHP que envolve as superglobais que eu já havia explicado em outro tutorial.

Não há mistério, a única modificação que realmente faz a "mágica" é quando definimos o campo nome "name" no formulário, para isso então segue abaixo o código.

<form name="formulario" method="post">
1.<input type="texbox" name="arr[1]" /><br>
2.<input type="texbox" name="arr[2]" /><br>
3.<input type="texbox" name="arr[3]" /><br>
4.<input type="texbox" name="arr[4]" /><br>
<input type="submit" value="Enviar" />
<br>

<?
// a variável $novo_arr recebe a variavel superglobal $_POST
$novo_arr = $_POST['arr'];

/* A página confere se o $novo_arr está vazio
no caso como usei o síbolo de negação "!" na frente de "empty",

que significa "vazio"
você deve ler da seguinte forma a sentença de comparação:
***Se NÃO estiver VAZIO então...
Se a variável estiver vazia, sem nada, então o texto de exibição

não é mostrado */
if( !empty($novo_arr) )
{
echo "A vetor/array possui informações!<BR>";
echo "1." .$novo_arr[1]. "<BR>";
echo "2." .$novo_arr[2]. "<BR>";
echo "3." .$novo_arr[3]. "<BR>";
echo "4." .$novo_arr[4]. "<BR>";
}

// como podem ver, as variáveis são passadas pelo formulário e

exibidas corretamente
?>

Viram? Não tem mistério. Se você salvar o código e testar verá que funciona,

qualquer dúvida, não deixem de comentar.

3 de dez. de 2008

Centralizando divs com CSS, parte 2, o Internet Explorer 6

Dando prosseguimento ao tutorial começado aqui, hoje veremos como centralizar as benditas div's no pior browser atualmente existente, o Internet Explorer 6.

Pior não porque é da Microsoft, mas porque ele é largamente utilizado ainda e foi uma das únicas coisas que a Microsoft não obrigou os usuários a instalar, mas enfim, ao que interessa.

Existe um defeito muito chato no IE6 onde ele não reconhece o valor "auto" para as propriedades do CSS, no IE7 esse problema foi corrigido. A maneira mais prática e simples de centralizar uma div é usar:

<div style="margin: 0 auto;" ></div>

Acontece que o no IE6 você deverá alterar o código html pra poder contornar o erro, e aí damos o nosso primeiro passo rumo aos famosos "css hacks", que servem pra contornar problemas encontrados em browsers diferentes, uma vez que cada browser tem uma especificação distinta dos outros pra renderizar o CSS.

O código pra centralizar uma div no CSS no IE6 segue:

<div style="text-align:center">
     <div style="text-align:left"></div>
</div>

Usar apenas o center no text-align não resolve o problema, por isso você precisa criar uma div dentro de outra div. A div que que fica na parte interna é tratada como texto pelo IE6, e por isso ela é centralizada, mas isso nos traz um outro problema, que todo o texto que estiver dentro da div interna será centralizado, e a não ser que você queira isso, temos de adicionar na div interna o valor left no text-align, dessa forma nossa div fica centralizada, mas o texto não.

Esse método não estraga a exibição do Firefox ou do Opera, mas você precisa usar o método que mostrei previamente (com o margin), confira:

<html>

<head>
<style type="text/css">
<!--
.div1{
            /* largura da div */
            width: 400px;
            /* altura da div */
            height: 400px;
            /* azul */
            background-color: #0066FF;
            /* centraliza no firefox, opera etc.... */
            margin: 0 auto;
}
.div2{
            /* verde */
            background-color: #CCFF00;
            /* centraliza a div3 */
            text-align: center;
}
.div3{
            /* largura da div */
            width: 100px;
            /* altura da div */
            height: 100px;
            /* roxo */
            background-color: #CC33FF;
            /* centraliza no firefox, opera etc.... */
            margin: 0 auto;
            /* descomente o código abaixo, salve e veja */
            /*text-align: left;*/
}
-->
</style>
</head>
<body>
<div class="div1">margin:0 auto; Funciona em todos menos no internet explorer 6</div>
<div class="div2">
            <div class="div3">Funciona em todos</div>
</div>
</body>
</html>

Copie o código acima, salve e teste. Você verá que o texto que fica na div3 estará centralizado, pra corrigir esse problema caso você não queira manter assim, você deve descomentar a seguinte linha do código css:

/*text-align: left*/

o código deve ficar assim

text-align: left;

Salve e teste, sua página deverá ficar assim.

 

Sugiro que você altere e faça várias alterações pra ir entendendo bem o CSS, caso já não conheça, saber posicionar as divs está ligado diretamente a entender de CSS.

Por hoje é isso, até a próxima.

29 de nov. de 2008

Árvore binária sem recursividade, pós-ordem / postorder / pós-fixada / EDR

O algorítmo era trabalho de aula, passei pelo menos duas tardes quebrando a cabeça pra tentar desvendar este mistério: como fazer uma árvore binária EDR (Esquerda-Direita-Raíz), ou seja, imprimir na tela os elementos da esquerda, depois os da direita, e então a raíz.

Uma forma "mágica" de fazer isso é modificando a estrutura da árvore, que ganha uma propriedade booleana "visitada", quando setada como false (padrão), significa que esse nodo ainda não foi visitado na busca, quando ela estiver setada como true, verdadeira, é porque já foi visitada, e por isso o iterador não necessita percorrer novamente esta ramo da árvore, isso evita redundância e loops infinitos, tornando o processo dinâmico.

Realmente recomendo você fazer o algorítmo, é um ótimo exercício pra desenvolver o raciocínio e testa suas habilidades, mas caso não consiga segue abaixo o código.

#include<stdio.h>
#include<stdlib.h>

struct arvore
{
int info;
arvore *dir;
arvore *esq;
bool visitado; // a magia do negócio, evita que um nodo seja lido redundantemente e entre em loop infinito
};

arvore *raiz = NULL;

struct pilha //estrutura da pilha
{
arvore *elto ; // ponteiro para elemento do tipo arvore
pilha *prox;
pilha *ant;
};
pilha *topo=NULL, *base=NULL;

arvore *aloca(int valor)
{
arvore *tmp;
tmp = (arvore *) malloc(sizeof(arvore));
tmp->info = valor;
tmp->esq = NULL;
tmp->dir = NULL;
tmp->visitado = false;
return tmp;
}
pilha *alocapilha(arvore *elto)
{
pilha *tmp;
tmp = (pilha *) malloc(sizeof(pilha));
tmp->elto = elto;
tmp->ant = NULL;
tmp->prox = NULL;
return tmp;
}

void insere(int valor)
{
arvore *atual = raiz, *folha = NULL;
if(raiz == NULL)
{
raiz = aloca(valor);
return;
}
/// inicio / inserir na folha
while(atual)
{
folha = atual; /// salva a raiz/nodo anterior
if(valor < atual->info)
{
atual = atual->esq;
}
else
{
atual = atual->dir;
}
}
if(valor < folha->info)
{
folha->esq = aloca(valor);
}
else
{
folha->dir = aloca(valor);
}

}

//retira o topo da pilha
void pop()
{
pilha *tmp;
tmp = topo;
if(topo->elto == raiz)
{
raiz = NULL;
}
else
{
topo = topo->ant;
topo->prox = NULL;
free(tmp);
}
}

void push(arvore *elto)
{
/// aloca na pilha um elemtno pilha q contem ponteiro do elemento da arvore
pilha *tmp = alocapilha(elto);
if (base == NULL)
{
base = topo = tmp;
}
else
{
tmp->ant = topo;
topo->prox = tmp;
topo = tmp;
}
}

void EDR()
{
printf("\nEntrou na funcao");
// r é a variável temporária, troca valores pra fazer as operações
arvore *r = raiz;
while(raiz)
{
/// empilha todos os elementos da esquerda de todas as folhas e raiz
while(r != NULL && r->visitado != true)
{
if(r != NULL)
{
push(r);
}
r = r->esq;
}
r = topo->elto;
while(r->dir == NULL)
{
printf("\n\t-[DESEMPILHOU] %d", topo->elto->info);
topo->elto->visitado = true;
pop();
r = topo->elto;
}
if(r->dir != NULL && r->dir->visitado == false)
{
topo->elto->visitado = true;
r = r->dir;
}
else
{
printf("\n\t-[DESEMPILHOU] %d", topo->elto->info);
pop();
r = topo->elto;
topo->elto->visitado = true;
}
}
}
/*############## RECURSIVA*/

void EDRr(arvore *atual)
{
if(atual != NULL)
{
EDRr(atual->esq);
EDRr(atual->dir);
printf("\n%d", atual->info);
}
}/**/

int main()
{
insere(50);
insere(2);
insere(1);
insere(23);
insere(21);
insere(54);
insere(12);
insere(53);
insere(55);
EDR();
//EDRr(raiz);
system("PAUSE");
}

28 de nov. de 2008

Utilizando a variável global $_GET e $_POST

Quando comecei a programar em PHP, sempre quis saber porque algumas páginas apresentavam uma formatação estranha nos endereços do tipo http://www.sitetal.com/index.php?pagina=4&acao=postar.

Foi difícil achar mas encontrei na época, e por isso hoje vou postar aqui como isso funciona.

Se você já utiliza o $_POST sabe que você deve usá-lo para receber os dados do seu formulário de envio de dados. Sempre se usa POST em formulários porque os dados passam de maneira "escondida" através de headers, de forma que não há como se acessar esses dados, a não ser pela página que os recebe.

O $_GET é totalmente diferente, na verdade é exatamente o inverso, ele ao invés de pegar os dados enviados pelo header da página, pega tudo aquilo que for enviado pela url do seu site. Como no exemplo mostrado no início.

Por definição, $_POST e $_GET são consideradas variáveis SUPERGLOBAIS, ou seja, acessíveis em todo o escopo da seu código.

Vou fazer o exemplo dos dois para mostrar um comparativo.

No caso do método POST:

<form name="meuform" method="post" action="recebe.php">

<input type="text" name="meutexto">
<input type="submit" value="Enviar">

</form>

Temos o nosso formulário, salve-o como "form.php". Agora vejamos como fica o nosso arquivo "recebe.php" que irá receber os dados.

<?
///A variável global recebe os dados do header
$meutexto = $_POST['meutexto'];

echo $meutexto;
?>

Depois de salva, teste sua página, acesse a página "recebe.php" no seu browser, digitando http://localhost/getpost/form.php.

No seu formulário digite qualquer coisa no campo e clique em enviar. Se você fez tudo certo, deverá estar aparecendo no seu browser aquilo que você escreveu na caixa de texto.

E agora veremos como GET funciona, pra explicar é mais simples.

Crie um novo arquivo PHP, chame ele de "get.php" e digite código abaixo:

<?
$meuget = $_GET['nome'];
/*
O cifrão é o prefixo de todas as variáveis do php
neste caso atribuímos a variável recebida através da url para a variável $meuget.
Diferente das linguagens compiladas, o PHP sendo uma linguagem interpretada, não necessita de declaração de variáveis. Ou seja, para criar uma variável basta atribuir um valor.
*/

echo "Dado recebido através da url:". $meuget;
echo "<BR>*Dado recebido através da url: $meuget";
/*
echo é o comando do php que faz com que o texto seja impresso na tela.
Tudo que for string ou caractére simples, leia-se texto simples, vai entre aspas.

O ponto que está antes do $meuget serve de concatenação, ou seja, ele faz a ligação entre os dois lados, entenda o ponto de concatenação como o "+" para unir dois textos.

Abaixo tem outra forma de imprimir o valor de uma variável, ela é inserida dentro das aspas, o PHP interpreta as 2 strings da mesma forma. O método com concatenação é uma prática melhor pois facilita a leitura do código e deixando-o mais organizado.
*/

echo "<BR>Dado recebido através da url:". $_GET['nome'];
/*
Acima está outra forma de impressão, que é pegando diretamento o valor que está na url sem passar para uma variável
*/

?>

Agora no seu browser digite o caminho da página, se você seguiu o tutorial é http://localhost/getpost/get.php. A sua página será carregada mas não irá aparecer nada.

Agora, na caixa de endereço do browser acrescente ao final o código entre aspas "?nome=ornitorrinco" e pressione enter. O endereço deve ficar assim "http://localhost/getpost/get.php?nome=ornitorrinco".

Ao carregar a página deve aparecer a palavra que você escreveu depois do "=" (igual, símbolo de atribuição).

Digite o que você quiser ali e carregue a página, que a palavra irá aparecer.

Qual a utilidade dos dois?

$_GET serve para tornar uma página mais navegável, de forma que o usuário possa guardar o endereço e retornar à página com as variáveis ou dados já carregados.
Ex: www.site.com.br/index.php?secao=eletronicos&preco=barato

$_POST serve para enviar dados onde você não quer que o visitante da página, ou mesmo intrusos, tenham acesso. Por isso geralmente se usa o POST para enviar os dados de forma segura, para que o conteúdo não possa ser interceptado.

Caso o tutorial não tenha funcionado, poste o erro que ocorreu.