MSN: como adicionar link do MSN em página da internet?

Standard

Estes dias estava percorrendo a procura de incrementar um site, corri atrás e não achei nada… até que um amigo meu foi, acessou um site e percebeu o que estávamos procurando… adicionar MSN no site, de maneira que quando alguém clicar no link ele adiciona o contato a sua lista de contatos. Segue abaixo:

<a href=”msnim:add?contact=fulano@hotmail.com”>Add para contato</a>

Feito isso, aonde você colocou vai aparecer estilo link mesmo, ao clicar (pelo I.E funfa) será adicionado em sua lista de contatos.

Instalando SSL em domínio (apache2 SSL)

Standard

Seguindo esse tutorial você irá habilitar o uso de conexão segura (https) no seu servidor Apache2 usando o módulo SSL, criando chaves pública e privada e configurando o apache para usá-las.

Esse tutorial está assumindo que você instalou o Ubuntu Feisty Fawn (7.04) versão Server, escolhendo a opção ‘Instalar Servidor LAMP”, apesar que pode ser útil em qualquer caso.

Instalando pacotes adicionais

Você já tem Servidor Linux+Apache+MySQL+PHP com pouco esforço com o Ubuntu e ele resolve a maior parte das demandas. Vamos adicionar ao pacote a possibilidade que seja possível navegar pelo seu site com uma conexão segura, o ‘https’. Para tanto, instale os pacotes adicionais para criar as chaves criptografadas.

sudo aptitude install openssl ssl-cert

Criando chaves pública e privada

Vamos criar uma pasta para guardar as chaves e usar um script para, respondendo algumas perguntas, criar chaves pública e privada que serão usadas pelo Apache2.

sudo mkdir /etc/apache2/ssl
sudo make-ssl-cert /usr/share/ssl-cert/ssleay.cnf /etc/apache2/ssl/apache.pem

Configurando o módulo SSL do Apache2

Vamos agora configurar o Apache2 para que além de usar a porta 80 ele use a porta 443, que é a porta padrão do https.

sudo su  -c 'echo Listen 443 >> /etc/apache2/ports.conf'

Depois disso, iremos habilitar o módulo ssl do Apache2.

sudo a2enmod ssl

Configurando o site com https

Você pode ter vários sites hospedados pelo mesmo Apache, nós iremos criar um segundo site no seu servidor, que na verdade é o site padrão usando https

sudo cp /etc/apache2/sites-available/default /etc/apache2/sites-available/ssl
sudo nano /etc/apache2/sites-available/ssl

Modifique o arquivo para usar a porta 443 e habilite a função SSL usando o certificado que criamos:

NameVirtualHost *:443
<VirtualHost *:443 >
        ServerAdmin webmaster@localhost

        SSLEngine On
        SSLCertificateFile /etc/apache2/ssl/apache.pem

        DocumentRoot /var/www/

Depois de editar o arquivo, habilite o site

sudo a2ensite ssl

E force o Apache2 a recarregar as configurações

sudo /etc/init.d/apache2 force-reload

Testando

Se não houve nenhuma mensagem de erro quando você forçou a reconfiguração do Apache2 é quase certo que quando você acessar “https://’ip-do-seu-servidor‘” verá seu site, mas a comunicação entre seu navegador e o servidor é criptografada.

————————–

Agradecimentos a http://wiki.ubuntubrasil.org/GleidsonLacerda

——————————————–

Este trecho é meu:

Se por um “acaso”, você receber a mensagem de que a porta SSL não pode ser ativada (0.0.0.0:443), você pode acessar o arquivo

/etc/apache2/ports.conf'

e eliminar a linha (deve ser a última) que indica acesso pela porta 443 (caso a default 80 esteja informada).

————————————————-

Instalando SSL em domínio (apache2 SSL)

Standard

Seguindo esse tutorial você irá habilitar o uso de conexão segura (https) no seu servidor Apache2 usando o módulo SSL, criando chaves pública e privada e configurando o apache para usá-las.

Esse tutorial está assumindo que você instalou o Ubuntu Feisty Fawn (7.04) versão Server, escolhendo a opção ‘Instalar Servidor LAMP”, apesar que pode ser útil em qualquer caso.

Instalando pacotes adicionais

Você já tem Servidor Linux+Apache+MySQL+PHP com pouco esforço com o Ubuntu e ele resolve a maior parte das demandas. Vamos adicionar ao pacote a possibilidade que seja possível navegar pelo seu site com uma conexão segura, o ‘https’. Para tanto, instale os pacotes adicionais para criar as chaves criptografadas.

sudo aptitude install openssl ssl-cert

Criando chaves pública e privada

Vamos criar uma pasta para guardar as chaves e usar um script para, respondendo algumas perguntas, criar chaves pública e privada que serão usadas pelo Apache2.

sudo mkdir /etc/apache2/ssl
sudo make-ssl-cert /usr/share/ssl-cert/ssleay.cnf /etc/apache2/ssl/apache.pem

Configurando o módulo SSL do Apache2

Vamos agora configurar o Apache2 para que além de usar a porta 80 ele use a porta 443, que é a porta padrão do https.

sudo su  -c 'echo Listen 443 >> /etc/apache2/ports.conf'

Depois disso, iremos habilitar o módulo ssl do Apache2.

sudo a2enmod ssl

Configurando o site com https

Você pode ter vários sites hospedados pelo mesmo Apache, nós iremos criar um segundo site no seu servidor, que na verdade é o site padrão usando https

sudo cp /etc/apache2/sites-available/default /etc/apache2/sites-available/ssl
sudo nano /etc/apache2/sites-available/ssl

Modifique o arquivo para usar a porta 443 e habilite a função SSL usando o certificado que criamos:

NameVirtualHost *:443
<VirtualHost *:443 >
        ServerAdmin webmaster@localhost

        SSLEngine On
        SSLCertificateFile /etc/apache2/ssl/apache.pem

        DocumentRoot /var/www/

Depois de editar o arquivo, habilite o site

sudo a2ensite ssl

E force o Apache2 a recarregar as configurações

sudo /etc/init.d/apache2 force-reload

Testando

Se não houve nenhuma mensagem de erro quando você forçou a reconfiguração do Apache2 é quase certo que quando você acessar “https://’ip-do-seu-servidor‘” verá seu site, mas a comunicação entre seu navegador e o servidor é criptografada.

————————–

Agradecimentos a http://wiki.ubuntubrasil.org/GleidsonLacerda

——————————————–

Este trecho é meu:

Se por um “acaso”, você receber a mensagem de que a porta SSL não pode ser ativada (0.0.0.0:443), você pode acessar o arquivo

/etc/apache2/ports.conf'

e eliminar a linha (deve ser a última) que indica acesso pela porta 443 (caso a default 80 esteja informada).

Instalando o Skype no Linux Ubuntu 7.10

Standard

Ola pessoal,

Depois de alguns dias, volto para postar uma dica muito legal. Como instalar o Skype no Linux Ubuntu 7.10

O primeiro passo é fazer o download do skype. Você pode fazer isso através do site do skype ou então digitando o seguinte comando na shell do Linux.

wget -c http://download.skype.com/linux/skype-debian_1.4.0.118-1_i386.deb

Feito o download, o próximo passo é instalar a lib qt4 no seu Linux. Felizmente esse processo também é muito simples. Digite o seguinte comando na shell:

sudo apt-get install qt4-qtconfig

Finalmente vamos instalar o Skype em sí. Digitando o seguinte comando na shell vai fazer com que o Skype seja instalado e um ícone irá aparecer dentro do menu: Applications -> Internet -> Skype.

sudo dpkg -i skype-debian_1.4.0.118-1_i386.deb

Agora é só acessar o Skype através do menu e usufruir desse excelente programa de VoIP.

skype.png

Espero que essa dica seja útil para alguém.

OBS: ESTE TEXTO FOI TIRADO DE UM USUÁRIO BEM LEGAL DO LINUX -> http://jrjuniorsp.wordpress.com/2008/01/23/instalando-o-skype-no-linux-ubuntu-710/


PHP – XML error: not well-formed (invalid token)

Standard
Esta dica foi retirada de um gênio em XML -> http://republicavirtual.com.br/blog/2007/10/26/php-xml-error-not-well-formed-invalid-token/Se você está recebendo a mensagem de erro acima, tente trocar
xml_parser_create();
para:
xml_parser_create('ISO-8859-1');

deve bombar! =)

PHP: Itaú Shopline em PHP

Standard

Primeiro quero AFIRMAR que esse script não fui eu quem fez, e sim, um grande programador chamado Caio Ariede

Segue abaixo o códio principal:

< ?php

    $cripto = new Itaucripto;

    $codEmp = "";
    $pedido = "";
    $valor = "";
    $observacao = "";
    $chave = "";
    $nomeSacado = "";
    $codigoInscricao = "";
    $numeroInscricao = "";
    $enderecoSacado = "";
    $bairroSacado = "";
    $cepSacado = "";
    $cidadeSacado = "";
    $estadoSacado = "";
    $dataVencimento = date('dmY');
    $urlRetorna = "";
    $obsAd1 = "";
    $obsAd2 = "";
    $obsAd3 = "";

    $dados = $cripto->geraDados($codEmp,$pedido,
$valor,$observacao,$chave,
$nomeSacado,$codigoInscricao,
$numeroInscricao,$enderecoSacado,
$bairroSacado,$cepSacado,$cidadeSacado,
$estadoSacado,$dataVencimento,$urlRetorna,
$obsAd1,$obsAd2,$obsAd3);

    echo $dados;

?>

E segue o CORE do Script (classe):

<?php

    /**

        - Classe para integração com o Itaú Shopline -

        Descrição: Gera os dados necessários, criptografados, para a transação.
        Autor: Caio Cesar Ariede - http://caioariede.smartis.com.br/
        Data: 18/9/2007
        Última Atualização: 7/11/2007

        1. No final deste arquivo tem um exemplo de utilização.
        2. Antes de iniciar o desenvolvimento, pegue os dados necessários junto
           ao Itaú Shopline, e consulte o manual do mesmo.

        SmartIS - Soluções Inteligentes

    **/

    error_reporting(E_ALL);

	class Itaucripto
    {

        function Itaucripto()
        {
            $this->CHAVE_ITAU = "SEGUNDA12345ITAU";
            $this->TAM_COD_EMP = 26;
            $this->TAM_CHAVE = 16;
            $this->numbers = "0123456789";
            $this->sbox = null;
            $this->key = null;
            $this->numPed = "";
            $this->tipPag = "";
            $this->codEmp = "";
        }

        function rnd()
        {
            $n = 'ABCDEFGHIJKLMNOPQRSTUVXWYZ';
            return $n[rand(0,strlen($n)-1)];
        }

        function Algoritmo($s, $s1)
        {

            $k = 0;
            $l = 0;
            $s2 = "";

            $this->Inicializa($s1);

            for($j = 1; $j <= strlen($s); $j++)
            {
                $k = ($k + 1) % 256;
                $l = ($l + $this->sbox[$k]) % 256;
                $i = $this->sbox[$k];
                $this->sbox[$k] = $this->sbox[$l];
                $this->sbox[$l] = $i;
                $i1 = intval($this->sbox[($this->sbox[$k] + $this->sbox[$l]) % 256]);
                $j1 = (int)(ord(substr($s, $j - 1, 1)) ^ $i1);
                $s2 = $s2 . chr($j1);
            }

            return $s2;
        }

        function Inicializa($s)
        {

            $i1 = strlen($s);
            for($j = 0; $j <= 255; $j++)
            {
                $this->key[$j] = ord(substr($s, $j % $i1, 1));
                $this->sbox[$j] = $j;
            }

            $l = 0;
            for($k = 0; $k <= 255; $k++)
            {

                $l = ($l + $this->sbox[$k] + $this->key[$k]) % 256;

                $i = $this->sbox[$k];
                $this->sbox[$k] = $this->sbox[$l];
                $this->sbox[$l] = $i;

            }

        }

        function Converte($s)
        {
            $c2 = $this->rnd();
            $s1 = strval($c2);
            for($i = 0; $i < strlen($s); $i++)
            {
                $c1 = substr($s, $i, 1);
                $c = $c1;
                $s1 = $s1 . ord(strval($c));
                $c3 = $this->rnd();
                $s1 = $s1 . $c3;
            }

            return $s1;
        }

        function Desconverte($s)
        {
            $s1 = "";
            for($i = 0; $i < strlen($s); $i++)
            {
                $s2 = "";
                for($c = substr($s, $i, 1); is_numeric($c); $c = substr($s, $i, 1))
                {
                    $s2 = $s2 . substr($s, $i, 1);
                    $i++;
                }

                if($s2 == "")
                {
                    $j = intval($s2);
                    $s1 = $s1 . $j[0];
                }
            }

            return $s1;
        }

        function geraDados($s, $s1, $s2, $s3, $s4, $s5, $s6,
                $s7, $s8, $s9, $s10, $s11, $s12, $s13,
                $s14, $s15, $s16, $s17)
        {

            $s = strtoupper($s);
            $s4 = strtoupper($s4);

            if(strlen($s) != $this->TAM_COD_EMP)
                return "Erro: tamanho do codigo da empresa diferente de 26 posi\347\365es.";

            if(strlen($s4) != $this->TAM_CHAVE)
                return "Erro: tamanho da chave da chave diferente de 16 posi\347\365es.";

            if(strlen($s1) < 1 || strlen($s1) > 8 )
                return "Erro: n\372mero do pedido inv\341lido.";

            if(is_numeric($s1))
                $s1 = str_pad($s1, 8, '0', STR_PAD_LEFT);
            else
                return "Erro: numero do pedido n\343o \351 num\351rico.";

            if(strlen($s2) < 1 || strlen($s2) > 11)
                return "Erro: valor da compra inv\341lido.";

            if(strstr($s2, ','))
            {

                $s20 = substr($s2, -2);

                if(!is_numeric($s20))
                    return "Erro: valor decimal n\343o \351 num\351rico.";

                if(strlen($s20) != 2)
                    return "Erro: valor decimal da compra deve possuir 2 posi\347\365es ap\363s a virgula.";

                $s2 = substr($s2, 0, strlen($s2) - 3) . $s20;

            } else
            {

                if(!is_numeric($s2))
                    return "Erro: valor da compra n\343o \351 num\351rico.";

                if(strlen($s2) > 8 )
                    return "Erro: valor da compra deve possuir no m\341ximo 8 posi\347\365es antes da virgula.";

                $s2 = $s2 . "00";

            }

            $s2 = str_pad($s2, 10, '0', STR_PAD_LEFT);
            $s6 = trim($s6);

            if($s6 == "02" && $s6 == "01" && $s6 == "")
                return "Erro: c\363digo de inscri\347\343o inv\341lido.";

            if($s7 == "" && !is_numeric($s7) && strlen($s7) > 14)
                return "Erro: n\372mero de inscri\347\343o inv\341lido.";

            if($s10 == "" && (!is_numeric($s10) || strlen($s10) != 8 ))
                return "Erro: cep inv\341lido.";

            if($s13 == "" && (!is_numeric($s13) || strlen($s13) != 8 ))
                return "Erro: data de vencimento inv\341lida.";

            if(strlen($s15) > 60)
                return "Erro: observa\347\343o adicional 1 inv\341lida.";

            if(strlen($s16) > 60)
                return "Erro: observa\347\343o adicional 2 inv\341lida.";

            if(strlen($s17) > 60)
            {
                return "Erro: observa\347\343o adicional 3 inv\341lida.";
            } else
            {

                function corta($str, $n)
                {
                    return str_pad(substr($str, 0, $n), $n, ' ', STR_PAD_RIGHT);
                }

                $s3 = corta($s3, 40);
                $s5 = corta($s5, 30);
                $s6 = corta($s6, 2);
                $s7 = corta($s7, 14);
                $s8 = corta($s8, 40);
                $s9 = corta($s9, 15);
                $s10 = corta($s10, 8 );
                $s11 = corta($s11, 15);
                $s12 = corta($s12, 2);
                $s13 = corta($s13, 29);
                $s14 = corta($s14, 60);
                $s15 = corta($s15, 60);
                $s16 = corta($s16, 60);
                $s17 = corta($s17, 60);

                $s18 = $this->Algoritmo($s1 . $s2 . $s3 . $s5 . $s6 . $s7 . $s8 . $s9 . $s10 . $s11 . $s12 . $s13 . $s14 . $s15 . $s16 . $s17, $s4);
                $s19 = $this->Algoritmo($s . $s18, $this->CHAVE_ITAU);
                $s19 = $this->Converte($s19);
                return $s19;
            }

        }

        function geraConsulta($s, $s1, $s2, $s3)
        {
            if(strlen($s) != $this->TAM_COD_EMP)
                return "Erro: tamanho do codigo da empresa diferente de 26 posi\347\365es.";
            if(strlen($s3) != $this->TAM_CHAVE)
                return "Erro: tamanho da chave da chave diferente de 16 posi\347\365es.";
            if(strlen($s1) < 1 || strlen($s1) > 8 )
                return "Erro: n\372mero do pedido inv\341lido.";
            if(is_numeric($s1))
                $s1 = str_pad($s1, 8, '0', STR_PAD_LEFT);
            else
                return "Erro: numero do pedido n\343o \351 num\351rico.";
            if($s2 == "0" && $s2 == "1")
            {
                return "Erro: formato inv\341lido.";
            } else
            {
                $s4 = $this->Algoritmo($s1 . $s2, $s3);
                $s5 = $this->Algoritmo($s . $s4, $this->CHAVE_ITAU);
                return $this->Converte($s5);
            }
        }

        function decripto($s, $s1)
        {
            $s = $this->Desconverte($s);
            $s2 = $this->Algoritmo($s, $s1);
            $this->codEmp = substr($s2, 0, 26);
            $this->numPed = substr($s2, 26, 34);
            $this->tipPag = substr($s2, 34, 36);
            return $s2;
        }

    }

?>

<?php

    $cripto = new Itaucripto;

    $codEmp = "";
    $pedido = "";
    $valor = "";
    $observacao = "";
    $chave = "";
    $nomeSacado = "";
    $codigoInscricao = "";
    $numeroInscricao = "";
    $enderecoSacado = "";
    $bairroSacado = "";
    $cepSacado = "";
    $cidadeSacado = "";
    $estadoSacado = "";
    $dataVencimento = date('dmY', strtotime('+5 days'));
    $urlRetorna = "";
    $obsAd1 = "";
    $obsAd2 = "";
    $obsAd3 = "";

    $dados = $cripto->geraDados($codEmp,$pedido,$valor,$observacao,$chave,$nomeSacado,$codigoInscricao,$numeroInscricao,$enderecoSacado,$bairroSacado,$cepSacado,$cidadeSacado,$estadoSacado,$dataVencimento,$urlRetorna,$obsAd1,$obsAd2,$obsAd3);

?>

<HTML>
  <BODY>
      <form method="post" action="https://shopline.itau.com.br/shopline/shopline.asp">
          <INPUT type="hidden" name="DC" value="<? echo $dados; ?>">
          <INPUT type="submit" name="Shopline" value="Itaú Shopline">
      </FORM>
    <BODY>   </HTML>

A WEB AGRADECE por desenvolvedores assim!

Parabéns Caio, pelo excelente trabalho.

este script roda na:


Fedora 8: Apache 2 + PHP5 + Mysql 5 + PHPMYadmin

Standard

Hoje eu rodei igual um bicho atrás de informações sobre Apache 2 + PHP5 + Mysql 5 + PHPMyadmin para o meu Fedora 8, e agora, às 00:00 que consegui fazer tudo o que eu queria. Como sempre, é nosso prazer ajudar-lhe com o que há de mais simples em artigos e informações.

Terreno

Necessidade de instalação do LAMP2 em meu PC. Ter uma internet bacana, ou “bacaninha”.

Partindo para cima

Primeiros passos (creio que você já atulizou seu fedora 8) sempre devem ser checagens simples. Rode os comandos abaixo como root:

yum -y install httpd php mysql mysql-server php-mysql

Esse comando aí instala o apache 2.2.6, php 5.2.4 e mysql 5.0.45 e já integra os serviços entre si.

Para fazer com que os serviços rodem automaticamente, usemos os comandos abaixo:

/sbin/chkconfig httpd on
/sbin/chkconfig –add mysqld
/sbin/chkconfig mysqld on
Para startar os serviços use os comandos:

/sbin/service httpd start
/sbin/service mysqld start

Para ajustar o password do mysql use o comando:

mysqladmin -u root password ‘new-password’
Para “adicionar” alguma segurança ao mysql, use:

mysql -u root -p
mysql> DROP DATABASE test;
mysql> DELETE FROM mysql.user WHERE user = ”;
mysql> FLUSH PRIVILEGES;

Para ver se rodou legal, vá em /var/www/html/ e crie um arquivo index.php e coloque o conteúdo abaixo dentro dele:

<?php
phpinfo();
?>

Para testar, abra o firefox e coloque o endereço –> http://localhost/
Se for exibida a diretiva completa do php.ini, MARAVILHA, se não, volte para o início deste tutorial.
Agora o mr PHPMYAdmin, para ajusta-lo use o comando abaixo:

yum install phpmyadmin
Feito isso, copie o diretório da forma que eu farei:

cp -r /usr/share/phpMyAdmin/ /var/www/html/

Pronto, o phpmyadmin pode ser acessado da seguinte forma em seu Firefox (eu espero que seja ele):

http://localhost/phpMyAdmin/

Espero ter ajudado e algo, talvez possa ser útil.


Problema /sbin/loader no Fedora 8

Standard

Problema /sbin/loader no Fedora 8

Estava tentando instalar o Fedora 8 em meu notebook (ontem), e o pau quebrou… na realidade o “pc travou”.
Muito irritado com isso decidi pesquisar e encontrei a saída, e mais uma vez “lá vai MASTIGADINHO”.

Terreno
Observe o notebook, lindo, possante e observe também o seu cd do fedora 8, que te deixa curioso… e no ato da instalação observe que o miserável fica “durinho” no console, na parte /sbin/loader, e você, como uma estátua (isso mesmo, versão nova sem funcionar… ninguém merece) fica olhando, aquela janela que NÃO dá sinal de vida.

Ao combate
Coloque o dvd e dê o boot em seu fedora, no momento em que ele abrir o menu, pressione a tecla desejada para “colocar informações de boot”. Feito isto, coloque EXATAMENTE a linha abaixo (observe que NÃO é necessário apagar nada que tem antes, só acrescente…):

acpi=off apm=off pci=noacpi

Feito isso, seu Fedora continuará instalando NORMALMENTE (acredite)…

Agradecimentos a joaopaulo.

Fedora: BroadCom 43xx sem muitas dores de cabeça!

Standard

Gente, hoje quebrei o pau para instalar essa peste desta broadcom no meu Fedora 8, e agora (mais uma vez, só para variar) vou entregar MASTIGADINHO:

Terreno
O que você precisa é ter  instalado o F8 (funciona no F7), ter uma imagem i386 (pode tentar x86_64, mas EU não tive o privilégio de instalar e NEM RECOMENDO pois Fedora “é a cobaia da Rhel”), ter paciência (ver trecho em aspas duplas) e uma internet para tal feito.

Ao combate
Faça tudo como root

yum update

depois
yum install bcm43xx-fwcutter b43-fwcutter

depois
faça download do arquivo a seguir (versão 4 do b43)-> http://downloads.openwrt.org/sources/broadcom-wl-4.80.53.0.tar.bz2

depois
faça download do arquivo a seguir (versão 3 do  bcm43xx) ->
http://downloads.openwrt.org/sources/wl_apsta-3.130.20.0.o

depois (sobre o b43)
b43-fwcutter -w /lib/firmware /path/to/kmod/wl_apsta.o

depois (sobre b43legacy)
b43-fwcutter -w /lib/firmware /path/to/wl_apsta-3.130.20.0.o

depois (sobre bcm43xx)
bcm43xx-fwcutter -w /lib/firmware /path/to/wl_apsta-3.130.20.0.o

depois
echo “alias wlan0 b43” >> /etc/modprobe.conf

depois
echo “alias wlan0 b43legacy” >> /etc/modprobe.conf

recarregando drivers
rmmod b43 && modprobe b43

depois
rmmod b43legacy && modprobe b43legacy

(lembre-se que no LINDO F8 (citei e repito, “cobaia do rhel”) as coisas “nem sempre funcionam”, mesmo como root, talvez o modprobe e o rmmod não preste, eles não estão no $PATH, para isso, dentro do /sbin use, por exemplo ./modprobe …)

Links adicionais:

http://bcm43xx.berlios.de/
http://linuxwireless.org/en/users/Drivers/b43
https://bugzilla.redhat.com/bugzilla/show_bug.cgi?id=186329


tell_not_null: Corrigindo PagSeguro

Standard
Este é o script que espero que consigam entender e mudar o que for necessário.. no final onde você vai mudar o domínio, lembre também de mudar o nome da pasta do WHMCS.. no nosso exemplo utilizamos ‘billing’
<?
function tep_not_null($value) {
if (is_array($value)) {
if (sizeof($value) > 0) {
return true;
} else {
return false;
}
} else {
if (($value != ”) && ($value != ‘NULL’) && (strlen(trim($value)) > 0)) {
return true;
} else {
return false;
}
}
}
function whmcs_query($query){
$host = “localhost”;
$dbname = “SEU BANCO DE DADOS DO WHMCS“;
$user = “USUARIO DO BANCO“;
$pass = “SENHA DO BANCO“;
$conn = mysql_connect($host, $user, $pass) or die(‘Error connecting to database, reason: ‘ . mysql_error());
$db = mysql_select_db($dbname, $conn);
// Perform Query to Database
$sql_result = mysql_query($query, $conn) or die(‘Error performing database query: ‘. mysql_error());
// Close Database Connection
mysql_close($conn);
return $sql_result;
}
//DEFINE O LOGIN E SENHA PARA CONEXÃO COM O BANCO DE DADOS
$ConnLocal = “localhost”;
$ConnLogin = “USUARIO DO BANCO DE DADOS PARA OUTROS REGISTROS“;
$ConnSenha = “SENHA DO BANCO DE DADOS PARA OUTROS REGISTROS“;
$ConnDatabase = “BANCO DE DADOS PARA OUTROS REGISTROS“;
// CONECTA-SE COM O BANCO DE DADOS MySQL
$Conn = mysql_connect($ConnLocal, $ConnLogin, $ConnSenha) or print (‘Não foi possível conectar<br />’ . mysql_error());
$db2 = mysql_select_db($ConnDatabase, $Conn) or print(mysql_error());
// RECEBE O POST ENVIADO PELA PagSeguro E ADICIONA OS VALORES PARA VALIDAÇÃO DOS DADOS
$PagSeguro = ‘Comando=validar’;
$PagSeguro .= ‘&Token=SEU TOKEN AQUI‘;
$Cabecalho = “”;
foreach ($_POST as $key => $value)
{
$value = urlencode(stripslashes($value));
$PagSeguro .= “&$key=$value”;
}
if (function_exists(‘curl_exec’))
{
//Prefira utilizar a função CURL do PHP
//Leia mais sobre CURL em: http://us3.php.net/curl

$curl = true;
}
elseif ( (PHP_VERSION >= 4.3) && ($fp = @fsockopen (‘ssl://pagseguro.uol.com.br’, 443, $errno, $errstr, 30)) )
{
$fsocket = true;
}
elseif ($fp = @fsockopen(‘pagseguro.uol.com.br’, 80, $errno, $errstr, 30))
{
$fsocket = true;
}
// ENVIA DE VOLTA PARA A PagSeguro OS DADOS PARA VALIDAÇÃO
if ($curl == true)
{
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, ‘https://pagseguro.uol.com.br/Security/NPI/Default.aspx’);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $PagSeguro);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HEADER, false);
curl_setopt($ch, CURLOPT_TIMEOUT, 30);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
$resp = curl_exec($ch);
if (!tep_not_null($resp))
{
curl_setopt($ch, CURLOPT_URL, ‘https://pagseguro.uol.com.br/Security/NPI/Default.aspx’);
$resp = curl_exec($ch);
}
curl_close($ch);
$confirma = (strcmp ($resp, “VERIFICADO”) == 0);
}
elseif ($fsocket == true)
{
$Cabecalho = “POST /Security/NPI/Default.aspx HTTP/1.0\r\n”;
$Cabecalho .= “Content-Type: application/x-www-form-urlencoded\r\n”;
$Cabecalho .= “Content-Length: ” . strlen($PagSeguro) . “\r\n\r\n”;
if ($fp || $errno>0)
{
fputs ($fp, $Cabecalho . $PagSeguro);
$confirma = false;
$resp = ”;
while (!feof($fp))
{
$res = @fgets ($fp, 1024);
$resp .= $res;
// Verifica se o status da transação está VERIFICADO
if (strcmp ($res, “VERIFICADO”) == 0)
{
$confirma=true;
break;
}
}
fclose ($fp);
}
else
{
echo “$errstr ($errno)<br />\n”;
// ERRO HTTP
}
}
if ($confirma)
{
// RECEBE OS DADOS ENVIADOS PELA PagSeguro E ARMAZENA EM VARIÁVEIS
//Selecione aqui todos os parâmetros enviados pela PagSeguro
$TransacaoID = $_POST[‘TransacaoID’];
$Referencia = $_POST[‘Referencia’];
$StatusTransacao = $_POST[‘StatusTransacao’];
$CliNome = $_POST[‘CliNome’];
$NumItens = $_POST[‘NumItens’];
$ProdValor = $_POST[‘ProdValor_1’];
$idcliente = whmcs_query(“select userid from tblinvoices where id=’$Referencia'”);
$row = mysql_fetch_row($idcliente);
$ic = $row[0];
$hora = date(‘Y-m-d H:i:s’);
$resultjh = whmcs_query(“select transid from tblaccounts where transid=’$TransacaoID'”);
whmcs_query(“insert into tblaccounts (userid,gateway,date,description,amountin,fees,amountout,transid,invoiceid) values (‘$ic’,’brpay’,’$hora’,’Registro de transação’,’0.00′,’0.00′,’0.00′,’$TransacaoID’,’$Referencia’)”);
if ($StatusTransacao==”Completo” || $StatusTransacao==”Aprovado” ) {
$ProdValor_MB = str_replace(“.”, “”, $ProdValor);
$ProdValor_MB = str_replace(“,”, “.”, $ProdValor_MB);
$ProdValor_MB = number_format($ProdValor_MB, 2, ‘.’, ”);
$r45 = whmcs_query(“select status from tblinvoices where id=’$Referencia'”);
$row=mysql_fetch_row($r45);
if($row[0]!=”Paid”){
$strcurl = “username=LOGIN DE ADMIN DO WHMCS AQUI&password=SENHA DO LOGIN DE ADMIN DO WHMCS EM MD5 AQUI&action=addinvoicepayment&invoiceid=$Referencia&transid=$TransacaoID&amount=$ProdValor_MB&fees=0.00&gateway=brpay”;
$sessions = curl_init();
curl_setopt($sessions,CURLOPT_URL,’http://www.SEU DOMINIO.COM/billing/includes/api.php’);
curl_setopt($sessions, CURLOPT_POST, 1);
curl_setopt($sessions,CURLOPT_POSTFIELDS,”$strcurl”);
curl_exec($sessions);
curl_close($sessions);
if (curl_errno($sessions)) {
$men = curl_error($sessions);
}
}
$SQL = “INSERT INTO TransacoesPagSeguro (” .
“TransacaoID, ” .
“Referencia, ” .
“StatusTransacao, ” .
“CliNome, ” .
“NumItens” .
“) VALUES (” .
“” .
“‘” . $TransacaoID . “‘, ” .
“‘” . $Referencia . “‘, ” .
“‘” . $StatusTransacao . “‘, ” .
“‘” . $CliNome . “‘, ” .
“‘” . $NumItens . “‘” .
“)”;
$Executa = mysql_query($SQL) or print(mysql_error());
}
else
{
if (strcmp ($res, “FALSO”) == 0)
{
// LOG para investigação manual
}
}
}
// FECHA A CONEXÃO
mysql_close($Conn);
?>

phplive: charset no phplive

Standard

Passamos 3 dias procurando o bendito do charset no phplive e graças ao bom Deus, um de nossos membros da equipe de suporte achou este abençoado.

Para ajustar o charset no phplive, o bendito do arquivo que contém o charset é o chat_session.php

PHP: Abrir arquivo, localizar termo, sobrescrever e sair.

Standard

As dicas aqui, EXIGEM que você tenha lido o post anterior de inserir texto ao rodapé de página, POIS todos os parâmetros de “preparo do terreno são o mesmo”.

Hoje estava queimando as pestanas para localizar um termo dentro de 6166 arquivos, substituir este termo por outro e sair do arquivo de forma “insana”. Segue script MASTIGADINHO:

<?
$contador = 6166;
$i = 0;
$linha = file(‘ver.txt’);
while( $i <= $contador )
{
if(file_exists($linha[$i]))
{
echo “existe”;
}
else
{
echo “nao existe”;
}

if(is_writable($linha[$i]))
{
echo ‘ permite escrita’;
echo ‘</br>’;
}
echo “$linha[$i]”;
//file_put_contents($linha[$i], $conteudo, FILE_APPEND);
$linha[$i] = trim($linha[$i]);

$open = fopen(trim($linha[$i]), ‘r+’);
$file = fread($open, filesize(trim($linha[$i])));
$open = fopen($linha[$i], ‘w+’);

$arquivo_alt = str_replace(‘UTF-8’, ‘ISO-8859-1’, $file);
fwrite($open, $arquivo_alt);

if(!$open)
{
echo “o arquivo $linha[$i] nao abre”;
exit();
}

fclose($open);
$i++;
}

?>

#################

A única coisa interessante está aqui:

$open = fopen(trim($linha[$i]), ‘r+’);
$file = fread($open, filesize(trim($linha[$i])));
$open = fopen($linha[$i], ‘w+’);

$arquivo_alt = str_replace(‘UTF-8’, ‘ISO-8859-1’, $file);
fwrite($open, $arquivo_alt);

Observe o seguinte -> linha 1 deste exemplo: abre o arquivo (trim remove espaços em branco) com poder de leitura e escrita e coloca o ponteiro no início do arquivo.

linha 2: usa fread para ler o arquivo que tem permissão de escrita e leitura com ponteiro no início e pega o tamanho do arquivo.

$arquivo_alt = str_replace(‘UTF-8’, ‘ISO-8859-1’, $file);
fwrite($open, $arquivo_alt);

linha 3: abre o arquivo com poder de escrita e coloca o ponteiro no início do arquivo.

Abre o arquivo ($file), procura por UTF-8, substitui por ISO… e confirma a escrita com a função fwrite. Os demais passos estão contidos no post anterior.

PHP: Adicionar Linha em arquivos de texto com php (6166 arquivos)

Standard
Há 2 semanas estive em um “calça justa” , pois estava necessitando colocar o rodapé de uma empresa (link) , para que, ao ser acessada uma documentação de 6166 páginas o link da empresa fosse exibido no rodapé. Consegui solucionar o caso, mas ralei pra caramba (2 dias), visto que não é minha praia usar funções para edição de arquivos. Mas segue a dica.
Terreno
Estava em uma plataforma linux, aonde pude fazer os testes.
Os arquivos para serem editas, tinham extensão .HTML (documentação online)
Partindo pra CIMA
1-> esteja certo de que é o root da máquina.
2-> espero que esteja no diretório aonde todos os arquivos estão (6166, para ser mais preciso)
3-> use o comando:
ls >> ver.txt
A saída acima lista os arquivos e os coloca em cadeia ajustada dentro do arquivo ver.txt, a saída ficaria (listando conteúdo de ver.txt) mais ou menos assim:
arquivo1.html
arquivo2.html
assim sucessivamente…
Feito isso, devemos assegurar que TODOS os arquivos tem permissão de escrita total, principalmente quando estamos tratando de um servidor local, o qual, se o php não for em CGI estará utilizando a permissão nobody (default do apache como módulo).
Vamos para o arquivo PHP que fará a edição dos 6166 arquivos, colocando um link no rodapé de todos.
Arquivo da Benção
<?
$conteudo = ‘<a href=”http://www.linkdorodape.com.br”>Hospedado por EMPRESA X</a>’;
$contador = 6166;
$i = 0;
$linha = file(‘ver.txt’);
while( $i <= $contador )
{
if(file_exists($linha[$i]))
{
echo “existe”;
}
else
{
echo “nao existe”;
}if(is_writable($linha[$i]))
{
echo ‘ permite escrita’;
echo ‘</br>’;
}
echo “$linha[$i]”;
//file_put_contents($linha[$i], $conteudo, FILE_APPEND);
$linha[$i] = trim($linha[$i]);
$abrir = fopen($linha[$i], ‘a+’);
if(!$abrir)
{
echo “o arquivo $linha[$i] nao abre”;
exit();
}
$writer = fwrite($abrir, $conteudo);
fclose($abrir);
$i++;
}

?>

Salve este arquivo como replacer.php

Basta executar que ele vai editar TODOS os arquivos que estão listados em ver.txt e que estão na mesma pasta que ELE.

Explicando o Script

Vou comentar cada linha para que vocês entendam minha “coisa prima”.

linha 1: <?

Essa é a tag de abertura do PHP.

linha 2: $conteudo = ‘<a href=”http://www.linkdorodape.com.br”>Hospedado por EMPRESA X</a>’;

Esta variável de Strings contém a informação exata de nosso rodapé, que na realidade é um link de uma empresa, mas pode ser qualquer texto ou tag que desejar.

linha 3: $contador = 6166;

Esta variável contém o número de arquivos total para que delimite um loop mais a frente.

linha 4: $i = 0;

Esta variável define o valor inicial para o loop.

linha 5: $linha = file(‘ver.txt’);

Esta linha é interessante. Diferente de algumas funções para abertura de arquivos, o File abre um arquivo e converte cada linha dele em um array, podendo ser acessado o valor como no exemplo a seguir: echo “$linha[0]”; que nos mostraria o primeiro valor da lista.

linha 6: while( $i <= $contador )

Como todos sabem, é o loop que tem o valor de “enquanto $i for menor que o $contador, continue fazendo”.

linha 7: {

Abre o corpo do loop while.

linha 8: if(file_exists($linha[$i]))

A função File_Exists verifica se aquela string com o nome de arquivos é real, ou seja, se o nome do arquivo passado REALMENTE nos leva a um arquivo real (realmente existe). Neste código, perceba que passei o valor $linha[$i] pois linha contém 6166 nomes de arquivos, mas o valor dachave de array $i nos leva ao valor inicial de $i, que é 0 (o que nos faz acessar o primeiro valor da lista, ou seja, o primeiro arquivo) e mais a frente recebe o operador de incremento para acrescentar 1 a variável i. o IF vale como: “Se o string de arquivo for realmente UM ARQUIVO, faça…”

linha 9: {

Este aí é o corpo do IF de verificação de existência do arquivo.

linha 10: echo “existe”;

Se o arquivo existir, exibir EXISTE.

linha 11: }

Fecha o corpo da condição real que exibe “existe”.

linha 12: else

Se não existir o arquivo, faça…

linha 13: {

Corpo de else.

linha 14: echo “nao existe”;

Exibir “não exite”;

linha 15: }

Fecha o corpo do “Não haver arquivo” em ELSE.

linha 16: em branco

linha 17: if(is_writable($linha[$i]))

Isso vale como “se o arquivo permitir escrita, o arquivo que você está me passando através de $linha[$i], eu farei algo…”.

linha 18: {

Abre o corpo do IF acima.

linha 19 e 20:  echo ‘ permite escrita’;
echo ‘</br>’;

Exibem as mensagens dentro das aspas simples.

linha 21: }

Fecha o corpo do if.

linha 22: echo “$linha[$i]”;

Exibe o nome do arquivo.

linha 23: //file_put_contents($linha[$i], $conteudo, FILE_APPEND);

Tem a mesma equivalência de abrir, colocar o conteúdo no fim e BOA!    ?:)

linha 24: $linha[$i] = trim($linha[$i]);

Esta linha é o trunfo, ela arranca os espaços (caso tenham) “acoplados” em seus arquivos (nos nomes deles) citados dentro de ver.txt. A função trim é que faz esta maravilha.

linha 25: $abrir = fopen($linha[$i], ‘a+’);

Esta variável contém a função que abre o arquivo e coloca o ponteiro no final.

linha 26: if(!$abrir)

Se der problema na função de abrir o arquivo (observe o caractere “!”) faça algo.

linhas do if:  {
echo “o arquivo $linha[$i] nao abre”;
exit();
}

Exiba que o arquivo não abra e PARE!

linhas finais: $writer = fwrite($abrir, $conteudo);

Abre o arquivo ($abrir) e ESCREVE o conteúdo de $conteudo dentro dele.

Final: fclose($abrir);
$i++;
}

?>

Fecha o arquivo que foi escrito,  acrescenta 1 ao valor de $i (que era zero), para que, ao prosseguir o loop vá editando os arquivos representados pelo array $linhas[$i]  que por sua vez NUNCA terão o mesmo valor pois $i sempre recebe 1 a cada inserção de RODAPÉ, até que chegue no valor 6166 do $contador. Por fim a tag de finalização do PHP.

Espero que seja útil para vocês.

Boleto: Como adicionar prazo (phpBoleto)

Standard

Antes de mais nada, quero agradecer a equipe do phpBoleto, pois além de serem excelentes programadores, disponibilizaram seu tempo acirrado  para desenvolver algo free e em favorecimento da comunidade.

Requerimentos

Antes de mais nada o que você vai precisar é ter o phpboleto rodando e a NECESSIDADE de colocar um prazo para vencimento do boleto que NÃO seja o dia atual da impressão do boleto.

Ajuste

Você pode utilizar o código abaixo para inserir o prazo:

$prazo = date(“d/m/Y”, time() + (5 * 86400))

Aonde  a função date vai carregar dias, mês e ano, chamar em forma de tempo e multiplicar UM dia em SEGUNDOS por 5 (ou seja, 5 dias de prazo), bastando somente para aumentar ou diminuir o prazo, fazer a substituição do número 5 pelo número de dias que você deseja como prazo.

Espero ter ajudado.

ERRO: Cannot redeclare (Solução)

Standard

Bom dia gente,

Hoje estava ajustando um script bacana de um amigo meu, e recebi a mensagem Cannot redeclare nomedafuncao(), ajustei o problema, segue abaixo a solução:

* Provavelmente a função nomedafuncao() tá sendo incluída 2 vezes.
* Tente usar o include_once ao invés do include. (isto em todos seus scripts)

Ou melhor, use require_once!

Ubuntu 7.10: Instalando Apache2 + PHP5 + Mysql5 + PHPMyAdmin

Standard

Bom gente, era para eu ter postado essa dica ontem, mas é que estava tão cansado que acabei desistindo (3 a.m.), mas estou aqui agora, e vamos ao que interessa.

Situação e Preparação do Terreno

Se você está precisando de um ambiente Web voltado ao desenvolvimento de aplicações PHP, se estiver utilizando Ubuntu 6.06, Ubuntu 7.04, Ubuntu 7.10 (SERVER ou DESKTOP), pode observar este artigo e utilizá-lo para ajustar sua plataforma da melhor maneira para este fim.

Os requisitos são lógicos, ter Ubuntu 6.06, Ubuntu 7.04 ou Ubuntu 7.10 (SERVER ou DESKTOP) , desejar programar em PHP, ter uma internet “boa” para atualizar os pacotes.

Mãos a Obra

Bem, sem mais enrolação, vamos ao que interessa!

Faça TODOs os passos como ROOT.

1-> Abra o terminal (Aplicativos > Acessórios > Terminal)

2-> Use o comando abaixo:

sudo apt-get install apache2

Para testar se o apache está gerenciando às páginas, abra o seu navegador (creio que seja FireFox), e digite no campo de endereço->  http://localhost

Certamente estará funcionando.

Vamos instalar o PHP5, para isto use o comando abaixo:

sudo apt-get install php5 libapache2-mod-php5

Feito isto, reinicie o apache para que ele consiga “reler” seu arquivo de configuração já padronizado para PHP5 (mod) com o comando abaixo:

sudo /etc/init.d/apache2 restart

Para verificar se o apache está lendo direitinho arquivos PHP, acesse a página dos arquivos do apache (htdocs), que pode ser acessada assim:

sudo cd /var/www/apache-defaults/

Depois, delete o arquivo index.html com o comando:

sudo rm -rf index.html

Depois crie um arquivo PHP:

sudo vi index.php

Assim que o VI abrir, digite “i” para habilitar inserção de dados, e coloque exatamente os caracteres abaixo:

<?php phpinfo(); ?>

Para salvar e sair use as teclas “ESC”, “:”, “wq!” e pressione “ENTER”

Feito isto, acesse novamente pelo seu firefox o endereço http://localhost/arquivo.php

Se funcionar (mostrar as diretivas do php, perfeito), prossiga nos passos abaixo, do contrário, repita os procedimentos acima.

Você pode utilizar outros editores, a questão é que gosto do VI.

Seguindo mais adiante nós vamos verificar a  Instalação do Bendito Mysql5, utilize o comando abaixo:

sudo apt-get install mysql-server

Feito isso o sistema vai instalar o mysql para você e vai pedir a senha de admin do mysql, coloque uma senha e confirme com ENTER.

Agora é a parte de integração com o bendito php e INSTALAÇÃO do PhpMyAdmin, utilize o comando abaixo para “unir” as instalações:

sudo apt-get install libapache2-mod-auth-mysql php5-mysql phpmyadmin

Feito isso, só necessitará reiniciar o apache2 para que ele leia novamente os arquivos de configuração, para isso use o comando abaixo:

sudo /etc/init.d/apache2 restart

Pronto, agora você tem um “webserverZINHO” rodando em sua casa e prontinho para topar qualquer parada.

Recomendações:

Conexão Banda Larga acima de 64 kb

Máquina Simples, ou seja, SEM MUITOS RECURSOS (Linux, SEMPRE LINUX)

Invadiram o Milw0rm

Standard

 

Bem, uma das coisas mais comuns é a invasão de Sites, e por incrível que pareça, HOJE em dia é mais difícil crackear “as coisas”, mas, para hackers só Deus pode os impedir.

Acreditem se quiser, mas desta vez um “pilantrinha” entrou no servidor (Revenda Compartilhada), acessou um CMS desatualizado neste vhost, acessou os arquivos do MilW0rm e detonou um arquivo shadow aonde o portal de cracking se encontra.

O que me espanta é:”aonde estes caras vão parar?”
Nada os impede (como citei, só Deus para parar).

Bem, para tudo há uma saída, sabemos que o Underworld de TI está aí para amedrontar grandes corporações.

AINDA BEM QUE FOI SÓ O MILW0RM…

Sem comentários.

Problema com Fantástico no Red Hat 5, CentOs 5 ou Fedora Core 7

Standard

Problema:

CentOs 5, Fedora Core 7 e Red Hat Enterprise 5 -> Versões red hat e derivadas, que por sua vez, apresentam o WGET (utilitário de download de arquivos) incompatível com a ferramenta de autoinstall do Fantastico De Luxe 2.10.4 r10 (LATEST and STABLE releases), sendo uma das saídas atualizar o Wget ou fazer DownGrade de Versão, e lembrando que não baixe uma versão muito antiga pois pode tornar-se ineficiente para futuras operações de Administração do Servidor.

You have a buggy version of wget (wget-1.10.2-7.el5). Before proceeding with installation/upgrade, please see the following page for instructions on how to fix: http://www.netenberg.com/forum/index.php?topic=5430.0

Solução:

Antes de mais nada baixe o Wget com os passos abaixo.

Eu, no ajuste feito Hoje em Um servidor Dedicado Opteron 1200 series apliquei a seguinte versão do Wget -> ftp://ftp.gnu.org/gnu/wget/wget-1.10.1.tar.gz

REMOVA O WGET “BUGGADO”, com o comando abaixo:

yum remove wget (quando ele pedir confirmação confirme com “Y”)

Esta versão (que citei acima), apesar de ser “obsoleta” é bastante estável.

Para instalar use os seguintes comandos (Após baixar):

tar -zxvf wget-1.10.2.tar.gz

cd wget (ou use o comando a direita para entrar na pasta -> cd pastaqueOtargzGEROU)

em seguida use os comandos:

./configure –prefix=/usr/local/

depois:

make && make all && make install

Por último, localize o wget com o comando abaixo:

find / -name wget

Acesse a pasta aonde ele se encontra.

Ao Acessar copie o arquivo para o diretório /usr/bin com o comando abaixo:

cp wget /usr/bin/

Feito isto, basta tentar Reinstalar o Fantastico De Luxe 2.10.4 r10

______________________________________________________________________

POG: O que é?

Standard

A Programação Orientada a Gambiarras (POG ou WOP – Workaround-oriented programming) é um paradigma de programação de sistemas de software que integra-se perfeitamente a qualquer grande Paradigma de Programação atual.

Por definição, Gambiarra é aquilo que é de difícil concepção, de inesperada execução para tornar fácil o uso de algo que sequer deveria existir.

A Programação Orientada a Gambiarras foi uma evolução natural do uso do Programa Bacalhau, também conhecido como ATND – Artifício Técnico Não Documentado, dos anos 1.960–80, e vem de uma antiga expressão sileira, “Para quem é, bacalhau basta” (época em que o peixe seco ainda era barato). Programadores e analistas mais preocupados em usar buzzwords costumam utilizar o termo workaround para impor respeito.

Para que um programador possa exercer a Programação Orientada a Gambiarras, são necessários alguns fatores específicos, facilmente encontrados em ambientes de desenvolvimento:

  • Sistemas originalmente mal projetados;
  • Clientes chatos;
  • Usuários chatos;
  • Falta de vontade;
  • Falta de tempo;
  • Criatividade;
  • Gente que pensa que é DBA (normalmente são pessoas chatas, gordas, feias, sem certificação nenhuma e no que fizeram um curso de SQL Básico);
  • Arquiteto de software achando que é o máximo(normalmente pessoas, altas, loiras, chatas, arrogantes e metidos a sabe tudo);
  • Término do estoque de café/chá;
  • Aproximação do final da tarde;
  • Véspera de feriado/fim-de-semana;
  • Ter o Jackie Chan como chefe;
  • Ter o MacGyver como coordenador de projeto (ver Método MacGyver);
  • Governo defecando regras ou MP’s que entrem em vigor imediatamente sem dar tempo de atualizar sistemas;
  • Requisitos dinâmicos e/ou instáveis;
  • Área comercial vendendo ou pré-vendendo produtos imaginários ou inacabados com “entrega garantida em 30 minutos ou seu dinheiro de volta!”.

Reunidos, todos estes fatores transformam o programador em um gambiarrizador, espécie mais evoluída de programador, que possui curva de aprendizado e produtividade muito mais altas. Os códigos dos gambiarrizdores podem ser chamados de CACA (Código Avançado Complexo e Adaptável).

Lembre-se que a Microsoft – idealizade direitos, por isso, cuidado para você não precisar pagar royalties á Microsoft. Na próxima versão do Visual Studio, todas as POGs documentadas terão wizards personalizados. Por ser dotado de Inteligência Artificial (já que os programadores VB não possuem inteligência alguma) ele irá tornar o uso transparente ao POGramador.

Estudos realizados neste segmento, mostram que os programadores que evoluem para gambiarrizadores vivem melhor, saem as 18:00h, tem cabelos mais bonitos e esvoaçantes. Tudo pelo fato de que, em gambiarrizadores, eles entram em um estado alfa, onde tudo na vida funciona. Tudo que é impossível torna-se possível, de maneira totalmente obscura, mas possível.

Há correntes de programadores que discriminam a Programação Orientada a Gambiarras, alegando ser uma má técnica, que faz com que os sistemas fiquem lentos e ganhem bugs. Também ficou claro nas pesquisas que estes programadores só dizem isto por nunca terem evoluído para gambiarrizadores (e por isso nunca pegam mulher nenhuma). Com apenas uma evolução (ao contrário de ‘ como o Charmander, que necessitam de duas para atingir o ápice de seu desenvolvimento), 100% dos programadores admitem que a Programação Orientada a Gambiarras, definitivamente, é o melhor paradigma de todos.

Além disso, a Programação Orientada a Gambiarras, assim como outros paradigmas, deu origem a outros movimentos de pesquisa científica como Modelagem Orientada a Gambiarras (MOG ou WOM – Workaround-oriented modeling), Desenvolvimento de Sistemas Orientado a Gambiarras (DSOG ou WOSD – Workaround-oriented software development).

PPOG (Princípios da programação orientada a gambiarras) comentados:

  • Se funciona, então tá certo – Acoplado ou não, txt ou sql, mil funções ou 10, design patterns… Nada disso tem valor para o usuário, que só precisa de um software funcional. O termo “escalável” é falacioso;
  • My Way – Programador esperto, se é esperto mesmo é adepto do My Way. Se você está com dúvidas, faça do seu jeito pois se der merda é você quem vai se foder (e como);
  • Murphy ou Lei de Murphy ou Lady Murphy – Para lidar com Murphy e seu exército só com POG. Murphy é sagaz e ligeiro, tá só esperando você dar mole. Nada mais rápido do que uma gambiarrazinha pra acertar o que Murphy destrói;
  • Deixe o amanhã para amanhã – Muitos programadores atrasam projetos alegando que a demora de uma implementação para seguirem regras de design patterns ou comentários que ajudarão a outros entender melhor o código. Deixe o amanhã para o otário programador seguinte;
  • Comentários são para amadores – Um desenvolvedor deve ser treinado para ser fluente na linguagem de programação usada sem precisar de comentários, independente da consequente ruína de sua vida social. Isso também é conhecido como sétimo sentido;
  • Eficiência primeiro – Evite escrever em várias linhas o que pode ser feito em uma;
  • Fé em Deus – A informática é levianamente definida como ciência exata, quando esta é na verdade uma ciência holística. Vários casos reais de divina Providência foram testemunhados em ambiente fiéis aos princípios ruins foram exorcizados, e a paz instalou-se graças a fé dos gambiarrizadores;
  • 1337 h4x0r5 dud3 lol – Quanto mais ilegível, mais respeitado o código é. Consequentemente menos alterado ele é, e mais estável o sistema fica, garantindo a empregabilidade do gambiarrizador;
  • A ocasião faz o ladrão – Em determinados momentos não conseguimos escapar dela;
  • Capacidade de Abstração – Este conceito se baseia em focar-se no problema e desconsiderar conceitos e dados deios para atingir o objetivo, ou seja, o Programador deve abstrair tudo que lhe faça perder tempo como regras de negócio desnecessárias ou tratamentos de erros;
  • Conclusão Hipotética Universal Técnica Explicativa – Quando nenhum dos outros conceitos se aplica, utiliza-se este até funcionar ou desistir (C.H.U.T.E);
  • Criatividade acima de tudo – Uma pessoa criativa não é aquela que consegue chegar a diversos lugares, mas sim, aquela que chega no mesmo lugar por diversas maneiras.. Portanto, o POGer não é nada mais do que um programador criativo, que faz a mesma coisa que outros, adotando técnicas não convencionais…

Chavões POG:

“A principio isso nao tem nada a ver com o erro, mas pode ser que tenha…. algo a ver” Programador POG, sobre o erro no programa que nao sabe da onde veio.

“Deu certo? Deixa! Funcionou? Não mexa!” Bill Gates, durante o desenvolvimento do Windows ME.

“Sem comentários…” Monkey Coder sobre POG.

“Ninguém mandou pagar pouco…” Estagiário sobre POG.

“Muito cuidado ao mexer em um POG, siga o velho ditado: Bosta seca não se mexe!” Careca sobre POG.

“O que importa são os resultados” Programadores do Google Adwords.

“Os fins justificam os meios!” Nicolau Maquiavel sobre POG.

“Travou? Tenta dar Ctrl+Alt+Del. Se não funcionar, desliga e liga de novo a máquina…” Resposta de um POG a outro sobre a execução de um LOOP do manual da POG.

“Abre no Internet Explorer que funciona” Resposta padrão do suporte sobre POG.

“Na minha máquina funcionou” Programador sobre POG.

“O importante é fazer funcionar” Programador 100% pragmático sobre POG.

“O ótimo é inimigo do bom” Gerente POG Master sobre POG.

“Ontem tava funcionando!” MPOG sobre POG.

“Assim fica mais eficiente” Satanás sobre POG.

“É só colocar um DIV ali!” WebDesigner sobre POG.

“/* só testei até aki! */” Comentário de um programador Mancebo em um arquivo.

“Não se preocupe… quando você for implementar vai descobrir a melhor maneira!” Gerente sem-noção.

“Não me interessa se é restrição da ferramenta, dá um jeito e coloca isso funcionando até amanhã!” Gerente de Projeto falando ao programador.

“Simplesmente comentei e funcionou!” MPOG.

“É facil, não vejo dificuldade em fazer isso!” Gerente sem-noção definindo prazo junto com o programador.

“Tive que arrumar direto no banco – daí funcionou! Se o problema “voltar”, nos ligue novamente” POGger sobre O Poder da Fé.

“Como não faz?! Tem que implementar, acabamos de vender o produto com isto” Gerente de vendas de uma empresa qualquer.

“O código tá certo, deve ser problema na massa de dados” Programador Experiente, com várias certificações em POG.

“Terminei, só falta testar” Programador POG as 18h00 com a mochila nas costas falando pro chefe.

“É só reiniciar que funciona!” Programador POG logo de manhã com copo de café na mão.

“Dá um Build All que funciona!” Programador VB desesperado por não saber a procedência do erro.

“Bom, deixa estourar a bomba lá, aí quando vierem me pentelhar aqui eu vejo o que faço…” Programador para outro programador só esperando o problema voltar.

“A função ficou com 3000 linhas porque é impossível deixar ela menor” Programador POG tentando se passar por expert.

“Como não funciona? Eu compilei e não deu nenhum erro!!!” Estagiário, ainda falta muito para ser um programador POG.

“Se compila, funciona!” Programador POG, usando a técnica No_Exception.

“Eu fiz somente o que foi especificado!” Analista, usando a técnica In-Diana.

“Dear Aunt, let’s set so double the killer delete select all” Software de Reconhecimento de Voz, implementado em POG.

“Hum… Que estranho… Não era para acontecer isso…” Programador iniciante na empresa.

“Que lixo que fizeram!!! Olha isso!!!” Programador POG falando sobre outro Programador POG.

“Quando eu cheguei já tava assim!!!” Gambizeiro querendo tirar o seu da reta.

“… É que 1GB de RAM é pouco! Tem que colocar mais memória!!!” POGramador sobre estouro de pilha.

“… Ah!!! Isto é um erro comum do Windows!” POGramador tentando ganhar tempo para corrigir seu código.

“Reza e cruza os dedos que vai funcionar!” POG Pai de Santo falando para um POGramador menos experimente…

“Quando eu testei, funcionou!” POGramador demonstrando as gambiarras para seu Gerente Sem Noçao.

“Se funcionou contra os aliens no Independency Day, vai funcionar com você!” Will Smith sobre POG.

“Eu modelei em POG o vírus para o PC dos Aliens em Independency Day!” Chuck Norris sobre POG.

“Meu Precioso…” Gollum sobre POG.

“O ótimo é inimigo do bom” Sauron – Master PWNER SUPREMUS sobre POG.

“POG é POG e vice-versa…” Jardel – Ex-jogador de futebol sobre POG.

“O importante são os três pontos conquistados independente de como se joga” Antônio Lopes – Treinador de Futebol sobre POG.

“Existem 3 jeitos de se fazer as coisas: o jeito certo, o errado e o jeito Maximo Poder” Homer Simpson sobre POG.

“Se não funcionar leva um Roundhouse Kick! Olha só, funcionou!” Chuck Norris, conversando com o sistema quando o mesmo travou durante apresentação ao cliente.

“O Titanic afundou por que o código do GPS dele não era POG” Leornardo Di Caprio sobre POG.

“O Transponder dos aviões não funcionou pelo mesmo motivo” Piloto sobre POG.

“Service Pack – POG compilado” Anônimo sobre POG.

“Deu certo? Deixa! Funcionou? Não mexa!” Bill Gates.

“O sistema só dá problema quando tem gente usando” Programador POG, às 18h00, indo embora, já fechando a porta e falando pro chefe.

“Porra! Quem foi o filho da puta que fez este programa?” Dercy Gonçalves ao ler um programa POG.

“Fechei todos os bugs. Estão abertos apenas os que não foram resolvidos” Programador POG, vangloriando-se por ser eficiente.

“A Informática é uma ciência exata que nunca é exata né, genti” Chefinha nada gostosa de um CPD em reunião com os programadores POG, Justificando o uso de POG e relembrando a todos que ela é a Gerente de Sistemas Internos do Interior do CPD.

“Claro que conheço POG! Acabei com toda a “lentideza” dos sistemas usando POG puro com Access” Chefinha nada gostosa do CPD antes de ser chefe, na entrevista de emprego para começar como programdora de POG no CPD.

“É hora da pamonha!” Freakzoid sobre POG.

Agradecimentos a:

Sandro J. S. Souza


Cannot send session cookie – headers already sent by (SOLUÇÃO)

Standard

Boa noite gente, este pode ser um dos artigos mais simples que você possa conhecer, mas vai uma dica para que está sofrendo com o session_start(); (PHP), esta dica vai para quem está USANDO o session_start() e não sabe o por que de não estar funcionando o código. Lá vai a solução que REALMENTE FUNCIONA:

erro->

Cannot send session cookie – headers already sent by

Warning: session_start() [function.session-start]: Cannot send session cookie – headers already sent by

Essa mensagem significa que a função session_start() não pode enviar o cookie da sessão porque os cabeçalhos (HTTP headers) já foram enviados.

Normalmente o interpretador envia a saída assim que o comando é processado, por isso você não pode ter um echo, print ou qualquer outra coisa que produza uma saída antes da função session_start() (ou outras funções que precisão modificar os headers).

Você pode usar session_start() antes de qualquer saída ou usar session_start em qualquer lugar com output buffering.

Pode obter mais informações visitando os detalhes da função session_start()

+{+++++}+

VERIFIQUE SE O SEU EDITOR PHP ESTÁ GERANDO CARACTERES ESTRANHOS ANTES DO CÓDIGO, POR EXEMPLO:

<?php

session_start();

AS VEZES INICIAMOS NOSSO CÓDIGO ASSIM E A MENSAGEM DE ERRO ACONTECE

Cannot send session cookie – headers already sent by

VERIFIQUE SE O SEU EDITOR PHP ANTECIPOU OS CARACTERES, COMIGO JÁ ACONTECEU DELE COLOCAR ALGO DO TIPO “r%e#$@” ANTES DA TAG DE INICIAÇÃO DO CÓDIGO PHP (<?php…), PARA VER ISTO USE DIVERSOS EDITORES (o vi do unix não consegue visualizar e nem o dreamweaver).