Bloquear alteração do proxy no Firefox

Bloquear alteração do proxy no Firefox
Para impedir que usuários alterem a configuração do proxy vamos ao passo a passo:

Acesse a pasta “C:\Program Files\Mozilla Firefox”

Crie o arquivo “mozilla.txt”

Dentro do arquivo insira as seguintes linhas
lockPref(“network.proxy.backup.ftp”,”192.168.0.1″);
lockPref(“network.proxy.backup.ftp_port”,3128);
lockPref(“network.proxy.backup.socks”,”192.168.0.1″);
lockPref(“network.proxy.backup.socks_port”,3128);
lockPref(“network.proxy.backup.ssl”,”192.168.0.1″);
lockPref(“network.proxy.backup.ssl_port”,3128);
lockPref(“network.proxy.ftp”,”192.168.0.1″);
lockPref(“network.proxy.ftp_port”,3128);
lockPref(“network.proxy.http”,”192.168.0.1″);
lockPref(“network.proxy.http_port”,3128);
lockPref(“network.proxy.no_proxies_on”,”localhost, 127.0.0.1″);
lockPref(“network.proxy.share_proxy_settings”,true);
lockPref(“network.proxy.socks”,”192.168.0.1″);
lockPref(“network.proxy.socks_port”,3128);
lockPref(“network.proxy.ssl”,”192.168.0.1″);
lockPref(“network.proxy.ssl_port”,3128);
lockPref(“browser.startup.homepage”,”http://www.google.com.br/”);
lockPref(“network.proxy.type”,1);

Altere “192.168.0.1” para o endereço de seu proxy, mas mantenha as “”.
Altere “http://www.google.com.br/” para uma página padrão de sua preferencia mas mantenha as “”.

Agora que temos o .txt precisamos transforma-lo em .cfg, nas versões mais antigas do firefox era somente renomear as extensões e pronto, nos mais novos precisamos passa-lo por um conversor.

Para isso acesse http://www.alain.knaff.lu/howto/MozillaCustomization/cgi/byteshf.cgi, na segunda opção onde aparece “Upload mozilla.txt to get mozilla.cfg (byteshift 13)” clique em “Selecionar arquivo” e selecione o mozilla.txt que criamos e clique em “Convert mozilla.txt to mozilla.cfg”

Pronto agora temos o mozilla.cfg configurado.

Para finalizar temos que “obrigar” o navegador a usar essa configuração para todos os usúarios.

Abra a pasta “C:\Program Files\Mozilla Firefox\defaults\pref”, crie um arquivo chamado all.js edite ele e insira as seguintes informações:
pref(“general.config.filename”, “mozilla.cfg”);
pref(“general.config.obscure_value”, 13);

Em alguns casos precisei reiniciar a máquina para funcionar.

Pronto abra o navegador e você verá que o proxy esta configurado e não tem como alterar as configurações.

Automatic Proxy Configuration via DHCP

Para evitar a configuração manual demorado de um servidor proxy em todos os computadores, telefones e tablets, a configuração do proxy pode ser fornecido automaticamente via DHCP usando WPAD .

Para esta configuração, são necessários os seguintes componentes:

Um servidor DHCP que anuncia a opção de DHCP 252 com a URL do PAC arquivo (wpad.dat).
Um servidor web que serve o arquivo wpad.dat
Um arquivo PAC wpad.dat onde o IP Proxy é definida

Em um sistema MikroTik, a configuração do servidor DHCP se parece com isso:

/ Opção dhcp-server ip
adicionar código = 252 name = locais-pac-servidor value = ” ‘http: //192.168.0.2:80/wpad.dat’ ”
/ Network dhcp-server ip
adicionar o endereço = 192.168.0.0 / 24 dhcp-option =-pac-servidor local dns-server = 192.168.0.1 do gateway 192.168.0.1 = máscara de rede = 24

Por favor, note que o questionmark à direita na URL para o arquivo PAC. Esta é uma solução para mais uma ocorrência de RFC picuinhas onde algumas implementações podem interpretar mal a opção DHCP e adicione um caractere NULL-byte codificado para o final da URL ao solicitar o arquivo PAC do servidor web.
Com o questinmark no final da URL, qualquer personagem adicional NULL-byte será ignorado pelo servidor eo arquivo PAC será carregado apenas multa.

Seguindo o exemplo acima, no 192.168.0.2 máquina, servimos o seguinte arquivo wpad.dat:

FindProxyForURL função (url, host) {
retornar “PROXY 1.2.3.4:8080; DIRECT”;
}

Com esta configuração, todos os sistemas vai usar o proxy no 1.2.3.4 e se o proxy não está disponível tentar se conectar diretamente à Internet.
Enquanto isso é bom para uma rede doméstica, onde o proxy é usado principalmente para AdBlocking, você provavelmente vai querer remover a parte direta em uma configuração empresarial.

Usando o Thinstation como cliente do Terminal Server

O Thinstation é uma distribuição GNU/Linux, desenvolvida para thin client ou equipamentos antigos. Ele pode se conectar a um servidor remoto ou que utilizar recursos locais, para conexões remotas. O Thinstation permite a utilização do NoMachine NX, VNC, Microsoft Windows Terminal Services (RDP), VMWare View Open client, X, telnet, SSH, entre outros.
Para utiliza-lo como cliente do Terminal Server do Windows, é necessário configurar o Windows Terminal Server. (Como configurar um servidor de terminal).
Para configurar o Windows para boot pela rede será necessário usar um programas de terceiros, já que o Windows não fornece servidor TFTP. Recomendo o TFTPd32. Para saber como configurar o TFTPd32 acesse meu outro post.
Em seguida deve-se baixar o thinstation, para isso acesse o site http://tsomatic.agarwal-associates.com

O TS-O-Matic é um site onde você pode criar uma versão personalizada do thintation. Como ele, pode-se selecionar apenas os aplicativos que se deseja utilizar. Utilizaremos a configuração padrão, pois ela já inclui o cliente do terminal server.
Clique no icone Build
Aguarade até que ele construa a imagem. ao concluir você terá a opção de editar o arquivo de configuração.

Esse arquivo de configuração ficará armazenado dentro da imagem e será usado quando não encontrar outros arquivos de configuração. Você acrescentar as linhas a seguir no final do arquivo:

SESSION_0_TITLE=Icewm
SESSION_0_TYPE=icewm
SESSION_0_AUTOSTART=ON

Clique no icone Write Image para continuar e aguarde até que o processo de construção da imagem concluir.
Primeiro, você deve baixar o arquivo de configuração. Clique em Build e baixe o thinstation.conf.example, renomei-o para thinstation.conf.network e colque na pasta do servidor TFTP. Este é o arquivo de configuração do Thinstation, qualquer alteração da configuração deve ser feita nele.
Para baixar a imagem gerada, clique em PXE e baixe os arquivos initrd, vmlinuz, pxelinux.0 e default e colocá-los dentro da pasta do servidor TFTP. Em seguida, crie uma pasta chamada pxelinux.cfg e coloque o arquivo default dentro dela.
Configure no servidor DHCP o arquivo de inicialização para pxelinux.0.
Pronto! Seu servidor já está configurado para inicializar o Thinstation pela rede. Quando ele estiver executando basta clicar no icone MSWindows para acessar o Windows Terminal Server (ou o MS Windows [fs] para abrir em tela cheia).

Dica: Para iniciar automaticamente já abrindo a conexão remota você pode mudar o valor de SESSION_0_TYPE para rdesktop e usar o parametro SESSION_0_RDESKTOP_SERVER para definir o ip do servidor.

Servidor Linux: Configurando Zonas de DNS e VirtualHosts no Apache 2

Iremos configurar as zonas de domínios e sub-domínios, e fazer com que o Apache 2 responda por esses domínios no ambiente WEB. Em suma, o que vou demonstrar é como configurar o domínio nossoserver.com, o sub-domínio guarani.campeaobrasileiro.com.br e fazer com que através do navegador consigamos acessá-los pelos endereços http://www.nossoserver.com e http://guarani.campeaobrasileiro.com.br.

O processo aqui descrito é basicamente o mesmo apresentado na documentação oficial do Ubuntu Intrepid Ibex (Ubuntu 8.10), na seção de configuração do BIND. Porém gosto de entender cada linha e cada parâmetro configurado, então tentei deixar o mais detalhado possível, explicando em detalhes a configuração do arquivo de zona e os principais tipos de registro DNS. Finalizarei com as configurações para o Apache 2, que por sinal, são bem simples.

Adicionando uma zona Primary Master

Vamos editar o arquivo /etc/bind/named.conf.local para inserirmos as informações da zona de DNS.

# vi /etc/bind/named.conf.local

Basta inserir as linhas abaixo lembrando de substituir o domínio nossoserver.com pelo domínio de sua escolha.

zone "nossoserver.com" {
type master;
file "/etc/bind/zonas/db.nossoserver.com";
};

Entendendo cada linha:

  • zone – onde deverá ser inserido o nome do domínio, no nosso caso nossoserver.com;
  • type – o tipo de configuração da zona, em nosso caso é master, pois o responderá de forma autoritária por todas as consultas feitas ao domínio. Outros tipos são: forward, hint, slave (utilizado para configuração em servidores secundários de DNS), stub e delegation-only. No final deste post, na seção fontes, é possível acessar um link que detalha cada um dos tipos;
  • file – caminho do arquivo de configuração da zona de de DNS.

Após inserir as linhas, salve o arquivo (:wq!).

A melhor forma de configurarmos o arquivo de zona é utilizando o modelo fornecido pelo próprio BIND no arquivo /etc/bind/db.local. Então vamos criar o diretório onde ficarão as zonas (por questão de organização eu coloco em um diretório em separado, no caso o diretório se chama zonas) e copiar o modelo:

# mkdir /etc/bind/zonas
# cp /etc/bind/db.local /etc/bind/zonas/db.nossoserver.com

Agora vamos editar o arquivo db.nossoserver.com:

# vi /etc/bind/zonas/db.nossoserver.com

Você deverá alterá-lo deixando-o como abaixo:
;
;BIND data file for local loopback interface
;
$TTL 86400
@ IN SOA zenon.nossoserver.com. root.nossoserver.com. (
2009041701 ;Serial
43200 ;Refresh
900 ;Retry
2419200 ;Expire
3600) ; Negative Cache TTL
;
@ IN NS zenon.nossoserver.com.
@ IN A 192.168.0.2
zenon IN A 192.168.0.2
careca IN A 192.168.0.4
www IN CNAME careca.nossoserver.com
bozo IN A 192.168.0.1

 

Faça as alterações conforme suas configurações locais.

Antes de entendermos cada linha, vale avisar que o ponto-e-virgula deve preceder comentários.

Entendendo cada linha:

  • $TTL – (time-to-live) é o tempo, em segundos, que a informação da zona DNS deverá ser armazenada em cache, ou seja, os servidores que armazenaram as informações da zona, deverão considerar a informação válida apenas dentro do período TTL e caso seja necessária uma nova consulta e o TTL já tenha expirado, então o servidor DNS deve ser consultado novamente. O tempo recomendado pela RFC 1912 é de um dia. Se o TTL for zero, então a informação não será armazenada em cache;
  • SOA – é a linha de definição da autoridade do domínio. Define o nome da zona, servidor de DNS e e-mail do responsável. Possui cinco colunas:
Nome Classe RR Nome do Servidor E-mail do responsável
@ IN SOA zenon.nossoserver.com. root.nossoserver.com.
  • Nome – normalmente utiliza-se @, pois é a referência ao nome original da zona definido (em nosso caso) no arquivo /etc/bind/named.conf.local;
  • Classe – historicamente existem mais duas opções HS e CH, porém são padrões do MIT e não são mais utilizados, portanto deve se utilizar IN como referência a Internet;
  • Nome do servidor – parâmetro MNAME referente ao nome do servidor DNS e deve ser finalizado por ponto “.”;
  • E-mail do responsável – parâmetro RNAME que indica o e-mail do responsável pela zona.
  • Serial – deve ser incrementado a cada alteração no arquivo de zona, por isso que deixei como 1. Porém alguns administradores de rede preferem deixar a data da última alteração, por exemplo 2009041701, ou seja 17/14/2009 e 01 por ser a primeira configuração. Servidores secundários fazem a atualização da sua configuração caso o valor seja aumentado;
  • Refresh – informa ao servidor secundário de DNS quando deverá ser atualizada a informação da zona. Também é configurado em segundos e o recomendado é doze horas, ou seja 43200 segundos;
  • Retry – define o tempo entre cada tentativa (sem sucesso) de contato entre o servidor de DNS secundário e o primário. Também definido em segundos e o tempo recomendado é de três a quinze minutos;
  • Expire – usado apenas por servidores de DNS secundário. Tem como função indicar quando o servidor secundário parará de responder pela zona e contatará o servidor principal;
  • Negative Cache TTL – tempo que um erro de DNS fica em cache. (Sinceramente não consegui concluir o objetivo deste parâmetro).

Os tempos definidos na configuração de SOA não precisam ser escritos diretamente em segundos, o que reflete em menos uso de calculadora. Você pode utilizar letras como atalhos da configuração. Explicando melhor: No TTL quando definimos 86400 segundos, ou seja, 1 dia, então poderíamos ter configurado como 24H ou 1D, para o Refresh que definimos como 43200 segundos, ou seja, 12 horas, poderíamos ter colocado 12H.

Registros do DNS

Além da configuração básica da zona, também é necessário configurar os demais registros do DNS. É importante destacar que a estrutura aplicada aos demais RRs (resource records) é o mesmo da definição do SOA.

Em nosso caso, a linha registro zenon IN A 192.168.0.2 faz com que todos as máquinas que utilizem este servidor DNS possam acessar a máquina zenon.nossoserver.com apenas com um a palavra zenon, pois foi mapeada com o RR A para o IP 192.168.0.2. Já o registro www é necessário para que configuremos o domínio http://www.nossoserver.com para que responda no servidor careca.nossoserver.com. Então foi mapeado para o servidor 192.168.0.4.

Repare que as últimas duas linhas de registro são referência aos demais servidores, ou seja, o servidor WEB chamado de careca.nossoserver.com e o gateway que foi chamado de bozo.nossoserver.com. Cada um deles foi mapeado para seu IP.

Principais tipos de registros DNS

Existem outros tipos de registros, porém os mais comuns são A, MX, CNAME e NS:

  • A – faz o mapeamento de um nome à um IP em formato IPv4. Exemplo:
    www IN A 192.168.0.2
  • CNAME – faz o mapeamento de nome (apenas de nomes) para o nome do servidor. Exemplo:
    web IN CNAME www.nossoserver.com.
  • MX – especifica o nome e a preferencia do servidor de e-mail. Exemplo:
    IN MX 10 mail.nossoserver.com.
    mail IN A 192.168.0.100
  • NS – aponta qual é o servidor que responde pelo domínio. Exemplo:
    @ IN NS zenon.nossoserver.com.
  • PTR – utilizado na configuração do dns reverso (veremos mais abaixo) mapeia um IP a um nome, ou seja, faz o papel inverso do tipo A. Exemplo:
    2 IN PTR www.nossoserver.com
  • SRV – tentando ser bem sucinto, a função deste registro é mapear serviços e é utilizado por serviços de diretórios como o LDAP. Voltaremos ao assunto no próximo post quando trataremos da integração entre o Active Directory e o Bind. Por hora, acesse o link com maiores detalhes: http://www.zytrax.com/books/dns/ch8/srv.html.

Configurando a zona reversa

Primeiro vamos entender o que é e pra que serve a zona reversa de DNS. Zona reversa tem como objetivo revelar o nome de um host a partir de um IP. Ou seja, é baseado no tipo de registro PTR.

A criação da zona reversa segue o mesmo procedimento da criação do arquivo de zona, onde o registro SOA tem a mesma configuração de uma zona “normal”. A única diferença é relativo aos registros PTR, onde devemos mapear um IP para um nome (host name). Então vamos utilizar o próprio arquivo de zona como modelo.

Vamos copiá-lo e editá-lo:

# cp /etc/bind/zonas/db.nossoserver.com /etc/bind/zonas/db.192
# vi /etc/bind/zonas/db.192

O código deverá ficar como abaixo, porém é necessário que você faça as alterações conforme suas configurações:

;
;BIND data file for local loopback interface
;
$TTL 86400
@ IN SOA zenon.nossoserver.com. root.nossoserver.com. (
2009041701 ;Serial
43200 ;Refresh
900 ;Retry
2419200 ;Expire
3600) ; Negative Cache TTL
;
@ IN NS zenon.
2 IN PTR zenon.nossoserver.com.
4 IN PTR careca.nossoserver.com.
1 IN PTR bozo.nossoserver.com.

Agora basta salvar o arquivo e reinicializar o serviço BIND:

# /etc/init.d/bind9 restart

Verifique qualquer ocorrência no log com o comando:

# cat /var/log/syslog | grep named

Testando as configurações

Para testar se as configurações estão corretas, antes mesmo de reinicializar o serviço BIND, basta utilizar os comandos abaixo:

# named-checkzone nossoserver.com /etc/bind/zonas/db.nossoserver.com
# named-checkzone nossoserver.com /etc/bind/db.192

Os resultados devem aparecer como estes:

zone nossoserver.com/IN: loaded serial 2
OK

zone nossoserver.com/IN: loaded serial 1
OK

A ferramenta named-checkzone é muito útil para validarmos e verificarmos se nossos arquivos de zona estão configurados corretamente com o domínio definido.

Depois de reinicializado o serviço BIND, você poderá testar suas configurações de DNS com os comandos:

# ping nossoserver.com
# dig axfr nossoserver.com

Configurando um sub-domínio

Agora vamos adicionar o sub-domínio guarani.campeaobrasileiro.com.br. O processo é bem simples e caso você tenha lido com atenção as informações acima, você não precisará dedicar muito tempo a esta parte do tutorial.

Primeiramente vamos editar o arquivo /etc/bind/named.conf.local e adicionar as linhas abaixo:

# vi /etc/bind/named.conf.local
zone "guarani.campeaobrasileiro.com.br"{
type master;
file "/etc/bind/zonas/db.guarani.campeaobrasileiro.com.br";
};

Após salvar o arquivo, então vamos criá-lo no diretório zonas e deixá-lo como o exemplo abaixo:

# vi /etc/bind/zonas/db.guarani.campeaobrasileiro.com.br

;
;BIND data file for local loopback interface
;
$TTL 86400
@ IN SOA zenon.nossoserver.com. root.nossoserver.com. (
2009041701 ;Serial
43200 ;Refresh
900 ;Retry
2419200 ;Expire
3600) ; Negative Cache TTL
;
@ IN NS zenon.nossoserver.com.
@ IN A 192.168.0.4

Pronto, salve o arquivo, reinicialize o serviço BIND e o sub-domínio estará configurado. Porém, é necessário configurarmos o Apache 2 para que o sub-domínio seja acessível via navegador.

Configurando o Apache 2 para responder pelo domínio

Agora, depois de explicar e detalhar a configuração da zona dns e criarmos nosso domínio e sub-domínio, vamos fazer com que eles sejam acessíveis via navegador, sendo assim, será possível acessá-los digitando no navegador: http://www.nossoserver.com e http://guarani.campeaobrasileiro.com.br.

Supondo que você tenha o Apache 2 instalado e configurado. Vamos acessar o servidor careca.nossoserver.com e editar o arquivo /etc/apache2/sites-available/default inserindo as informações do domínio e do sub-domínio.

# vi /etc/apache2/sites-available/default

Insira as linhas abaixo:

<VirtualHost *:80>
ServerName www.nossoserver.com
DocumentRoot /var/www/www.nossoserver.com
</VirtualHost>
<VirtualHost *:80>
ServerName guarani.campeaobrasileiro.com.br
DocumentRoot /var/www/guarani.campeaobrasileiro.com.br
</VirtualHost>

Entendendo as linhas inseridas:

  • VirtualHost – deixei para que qualquer entrada na porta 80 seja entendido pela configuração;
  • ServerName – o nome do servidor, um pouco óbvio, porém é o endereço do domínio ou sub-domínio que será digitado no navegador;
  • DocumentRoot – caminho onde estão localizados os arquivos que deverão ser exibidos no site, por exemplo, arquivos html, php, png, etc.

Vale lembrar que é necessário existir os diretórios configurados na tag DocumentRoot. E para que você possa ter um resultado mais consistente, eu sugiro que seja criada uma página chamada index.html dentro de cada um dos diretórios.

Agora basta reinicializar o serviço Apache 2 e testar em seu navegador.

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

Recursivamente procurar e substituir uma palavra em vários arquivos

O sistema operacional Linux oferece várias ferramentas para gerenciamento e edição de arquivos, neste artigo mostram como usar alguns comandos para substituir uma ou mais palavras em um arquivo de texto. Um comando bastante útil quando você precisa substituir uma ou mais palavras em alguns arquivos é este:

sed -i 's/parola1/parola2/g' *.txt

desta forma será substituído por word1 word2em todos os arquivos de texto no diretório atual.

Mas se tivéssemos que fazer isso também substituir os arquivos em algumas pastas, então sob o comando torna-se:

find ./ -type f -exec sed -i 's/parola1/parola2/g' '{}' \;

neste caso, eu fiz sem o filtro do tipo de arquivo .txt e depois serão levados em conta todos os arquivos no diretório atual e seus subdiretórios.

Com o comando find que foi utilizado o “-exec” que permite executar um comando de cada vez que um arquivo é encontrado, que respeite as regras estabelecidas para a pesquisa. No caso anterior, a pesquisa inclui todos os elementos de “file” tipo e excluir os diretórios.
Tudo está coberto por “-exec” é o comando a ser executado e seus parâmetros, para o caractere “;” indicando o final da cadeia de comando.
Outro elemento-chave é o símbolo “{}“Indica que o nome real do arquivo e descobriu que, desta forma ser usado como um parâmetro do comando que deseja executar. No comando anterior chaves” {} “foram listadas e no final de comando é precedido de uma barra “\” para proteger esses símbolos de ‘expansão shell.
O comando é executado no diretório de partida, então se o comando digitado necessita de uma saída deve ser levado em conta.

Conselho a buscar em primeiro lugar a palavra, só para ver o que será encontrado e substituído:

find ./ -type f -exec grep -r "parola1" '{}' \;

Ou você pode usar o comando:

find ./ -type f -print0 | xargs -0 grep "parola1"

desta forma irá exibir todas as linhas que contêm a string.

Em particular, a directiva tem sido usado “-print0” que permite a saída do nome completo terminada por um caractere nulo. Desta forma, o string produzida pode ser interpretado corretamente pelo programa a seguir.
Na verdade, a saída do findestá conectada com um tubo para xargs comando cujo parâmetro “-0” indica que os nomes dos arquivos recebidos como um fim de entrada com um caractere nulo.

O comando “xargs” é responsável por receber os nomes dos arquivos e executar o comando ” grep “, que por sua vez usa os parâmetros passados ​​para xargs.

Se você só quer ver exibido o nome do arquivo que a contém, o comando é:

find ./ -type f -print0 | xargs -0 grep -l "parola1"

O parâmetro “-l” indica que temos como saída uma lista de nomes de arquivos, mas não as linhas, foram encontrados nos jogos.

Faço notar que em todos os comandos listados tem sido sugerido que a pesquisa para acontecer no diretório atual e todos os seus sub-diretórios, mas se quisermos olhar para qualquer diretório que você deve inserir o caminho (relativo ou absoluto):

find /home/user/ -type f | xargs grep -l "parola1"

Finalmente, se não fosse necessário o uso de parâmetros complexos para a busca de arquivos e deseja apenas pesquisa recursivamente uma palavra ou frase dentro dos arquivos em subdiretórios múltiplas, muito mais simples basta usar o comando grep com o “-r

grep “this text” *.php -rDesta forma ele vai olhar para a string “este texto” em todos os arquivos. “Php” no diretório atual e todos os seus subdiretórios.

Webservice – Consulta de CEP diretamente ao site dos correios

Até pouco tempo, tinhamos um site onde podiamos fazer consultas via get, ou até baixar a base de dados utilizada de forma gratuita. Mas seu maior problema para todos que já utilizaram tal base era o fato desta ser muito antiga. Com isso surgia o problema de ruas e bairros com nomes errados ou até mesmo não existentes. O tempo passou, a base ficou ainda mais velha e o site passou a cobrar pelos serviços. Mas não tem problema, os correios que antes tinham um sistema que não permitia se aproveitar dos dados (gerava as respostas em imagens), hoje nos disponibiliza uma versão mobile que facilmente nos permite tratar as respostas.

Para criarmos nosso próprio webservice em PHP vamos simular o comportamento realizado pelo site através de requisições cURL.

Aqui incluimos biblioteca phpQuery (http://code.google.com/p/phpquery/) que permite manipular conteúdo html atrvés de seleções tipo jquery/css:

include('phpQuery-onefile.php');

Após criamos uma função para fazermos requisições via cURL, para depois tratarmos com o phpQuery.

function simple_curl($url,$post=array(),$get=array()){
$url = explode('?',$url,2);
if(count($url)===2){
$temp_get = array();
parse_str($url[1],$temp_get);
$get = array_merge($get,$temp_get);
}

$ch = curl_init($url[0].”?”.http_build_query($get));
curl_setopt ($ch, CURLOPT_POST, 1);
curl_setopt ($ch, CURLOPT_POSTFIELDS, http_build_query($post));
curl_setopt ($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
return curl_exec ($ch);
}

Depois de ambiente preparado, mãos as teclas. Aqui esta o cep a ser consultado:

$cep = $_GET['cep'];

Fazemos uma chamada POST direta aos correios http://m.correios.com.br/movel/buscaCepConfirma.do. Para entender, acesse a url pelo navegador e faça uma consulta, nosso webservice fará o mesmo, mas atráves do servidor.

Aqui é onde capturamos o HTML através da chamada cURL, enviando os parametros necessários.

$html = simple_curl('http://m.correios.com.br/movel/buscaCepConfirma.do',array(
'cepEntrada'=>$cep,
'tipoCep'=>'',
'cepTemp'=>'',
'metodo'=>'buscarCep'
));

Fazemos o phpQuery ler o HTML capturado:

phpQuery::newDocumentHTML($html, $charset = 'utf-8');

Aqui tratamos os dados com o phpQuery a função pq(), é equivalente ao $() do jQuery $(#id elemento.classe).html() em jQuery, e em PHP pq(#id elemento.classe)->html(). Então temos nosso logradouro, bairro, cidade/uf e cep:

$dados =
array(
'logradouro'=> trim(pq('.caixacampobranco .resposta:contains("Logradouro: ") + .respostadestaque:eq(0)')->html()),
'bairro'=> trim(pq('.caixacampobranco .resposta:contains("Bairro: ") + .respostadestaque:eq(0)')->html()),
'cidade/uf'=> trim(pq('.caixacampobranco .resposta:contains("Localidade / UF: ") + .respostadestaque:eq(0)')->html()),
'cep'=> trim(pq('.caixacampobranco .resposta:contains("CEP: ") + .respostadestaque:eq(0)')->html())
);

Como nem tudo é perfeito, temos que tratar as informações de cidade/uf que vem ‘grudadas’:

$dados['cidade/uf'] = explode('/',$dados['cidade/uf']);
$dados['cidade'] = trim($dados['cidade/uf'][0]);
$dados['uf'] = trim($dados['cidade/uf'][1]);
unset($dados['cidade/uf']);

Pronto, basta agora imprimir no formato json e começar a fazer as requisições via ajax:

die(json_encode($dados));

Ao invés do phpQuery, podiamos ter usado o YQL, porém teriamos dobrado o numero de requições, pois chamariamos o servidor do yahoo que por sua vez chamaria o servidor dos correios.

Em caso de erro de CEP não encontrado:

newDocumentHTML(self::$html, $charset = ‘utf-8′);
$errCEP= array(‘erro’=> trim(pq(‘.erro:eq(0)’)->html()));

if(empty($errCEP[“erro”])){

$dados =
array(
‘logradouro’=> trim(pq(‘.caixacampobranco .resposta:contains(“Logradouro: “) + .respostadestaque:eq(0)’)->html()),
‘bairro’=> trim(pq(‘.caixacampobranco .resposta:contains(“Bairro: “) + .respostadestaque:eq(0)’)->html()),
‘cidade/uf’=> trim(pq(‘.caixacampobranco .resposta:contains(“Localidade / UF: “) + .respostadestaque:eq(0)’)->html()),
‘cep’=> trim(pq(‘.caixacampobranco .resposta:contains(“CEP: “) + .respostadestaque:eq(0)’)->html())
);

}else{

echo “CEP não localizado!!!”;

}

Façaa aqui o download dos arquivos de exemplo.

 

Fonte: http://www.pinceladasdaweb.com.br

Como devo tratar a bateria do meu notebook?

Pensando na crescente popularização dos notebooks, e conseqüente demanda por informações a respeito dos cuidados com a bateria, resolvi criar esse pequeno FAQ para ajudar os novatos na área.

O tutorial é fruto de muita pesquisa e saudável troca de informações com os colegas do fórum. Por favor, sintam-se a vontade para fazer alguma observação, caso julguem necessária.

Tentei fazê-lo o menos entediante possível, por isso abordo os assuntos de maneira um tanto superficial, de forma que não canse a leitura, caso alguém queira se aprofundar basta uma pesquisa mais detalhada pela internet. Recomendo para iniciar o link: http://www.batteryuniversity.com/

1 – Meu note acabou de chegar. Devo dar uma carga de quantas horas antes de usá-lo?
R – Não é necessário dar carga inicial nos notes atuais, já que a maioria esmagadora possui baterias de íons de lítio, que não possui efeito memória. A famosa carga inicial era um requisito das antigas baterias a níquel-metal-hidreto.

2 – Por que a bateria não vem completamente carregada de fábrica?
R – Apesar de não possuir efeito memória as baterias de íons de lítio não devem ser guardadas totalmente carregadas ou totalmente vazias por longos períodos de tempo. Isto se deve ao processo interno de armazenamento de energia das células.

3 – Como funciona esse processo?
R – Os íons de lítio “liberam” energia quando passam do estado sólido para o líquido, sendo que normalmente eles ficam alternando de estado entre eles, mesmo com o note desligado. Quando guardamos a bateria completamente carregada ou vazia, a grande maioria dos íons ficam em um estado estático (sólido ou líquido), pois não tem “espaço energético” suficiente para mudar de estado, sendo assim eles acabam “congelando” naquele estado e perdem a capacidade de reter e/ou liberar corrente.

4 – Isso não seria o efeito memória?
R – Não, nas baterias de níquel-metal-hidreto o processo de recarga da bateria deveria ser efetuado praticamente no final da carga, para que ela “aprendesse” que poderia armazenar carga até aquele nível. Nas de íons de lítio isso não ocorre, na verdade é recomendável nunca deixá-las esgotar a carga por completo, recomenda-se carregá-la antes de se esgotar a carga.

5 – Então devo usá-la apenas até a metade?
R – Não precisa exagerar, vez ou outra não há problema em deixar a carga terminar. O problema é quando isso se torna o padrão de uso.

6 – Isso é muito complicado. Não seria então melhor usar o note o tempo todo na tomada?
R – Esse é um erro comum. Muitos deixam o note por meses na tomada e quando vão usá-lo apenas com a bateria, ela dura somente alguns minutos. A bateria tem de ser “ensinada” de tempos em tempos, não deve ficar 100% do tempo na tomada. Ela foi feita para ser usada.

7 – Então não seria melhor retirar a bateria do note e usá-lo apenas na tomada?
R – Apensar de uma corrente de pensamento defender que a bateria deve estar sempre no note para servir como descarga de corrente excedente, os notes atuais possuem fontes inteligentes associadas com circuitos que detectam as variações e as corrigem sem necessidade de mandá-las para a bateria. Mas pense bem, se um dos equipamentos mais desejados pelos usuários de computadores é um nobreak, por que retirar o nobreak natural do note, a bateria? Você não a estará poupando ao retirá-la.

8 – E seu eu for viajar por muito tempo sem o note? Como devo guardar a bateria?
R – Nesse caso retire a bateria e guarde-a entre 40 e 50% de carga, para que os íons possam se movimentar livremente entre os diferentes estados energéticos. Mas se realmente passar muito tempo sem o note, peça para alguém utilizá-lo vez ou outra.

9 – Posso dar várias cargas seguidas? Por exemplo. Usá-la no sofá, depois ligá-la na tomada, retirar da tomada e tornar a ligar?
R – Não, evite retirar e colocar na tomada em curtos intervalos de tempo.

10 – Qual o indicativo que a bateria está terminando sua vida útil? E de quanto tempo é essa vida útil?
R – Apesar de totalmente carregada ela passa a durar cada vez menos. A vida útil é de, em média, 2 anos, apesar de alguns usuários conseguirem mantê-la funcionando satisfatoriamente por até 4 anos, isso em raríssimos casos. É normal a bateria perder alguma capacidade de carga com o tempo, ou seja, uma bateria que segurava um note por 2 horas, pode segurá-lo por 1 hora e 40 minutos após alguns meses de uso.

11 – Quando for rodar softs pesados, devo usar a bateria ou o carregador? (sugestão do Matheusos)
R – Quanto mais rápido for o consumo da bateria, menor sua vida útil, por isso se puder evitar de rodar softs que exijam muito da máquina através da bateria você estará aumentando a vida útil dela.

12 – Resumindo: Devo sempre manter a bateria no note e utilizá-la de vez em quando, mas qual seria o prazo de tempo para usar o note na bateria ou tomada?
R – Como tudo na vida use o bom censo. Quando estiver em casa e tiver uma tomada por perto, use-o na tomada. Caso queira utilizá-lo na varanda, sofá ou cama, ou ainda em locais externos, use a bateria, sem stress. Chega uma hora que sua bateria vai acabar mesmo, por isso não adianta “poupa-la” em demasia.

13 – Existe alguma forma de manter a bateria sempre perto de sua carga nominal?
R – Sim, de tempos em tempos é necessário educar a bateria fazendo ciclos de calibragem.

14 – Como faço a calibragem da bateria?
R – Faça o procedimento abaixo a cada 60 a 90 dias.

a – Ligue o carregador e após a luz de carga indicar que a carga foi concluída deixe o carregador conectado por pelo menos mais duas horas, você pode usar o micro normalmente durante esse tempo.
b – Com o micro ainda ligado, desconecte o carregador e use o note até ele desligar sozinho, evite FORÇAR o descarregamento rápido rodando programas com esse intuito, faça o uso normal do note.
c – Após o desligamento, deixe o note “descansar” por pelo menos 5 horas com a bateria descarregada.
d – Carregue normalmente até a luz indicar que a carga foi concluída. Pronto, bateria calibrada.

Depois de tentar fazer minha esposa decorar esses procedimentos, ela, leiga no assunto, me veio com uma tirada sensacional: – Não vou ficar neurótica com isso. Vou usar do jeito que achar mais conveniente e se acabar, compro outra!
Ou seja, tente seguir esses passos, mas não se desespere por vez ou outra não conseguir.

Abraços

OBSERVAÇÃO: Os procedimentos acima valem para toda e qualquer bateria de íons de lítio, porém caso o fabricante de sua bateria/notebook recomende um procedimento diferente, utilize-o.

EDIT: A título de curiosidade, ou para aqueles que tem coragem e sabem das consequências que tal ato pode causar, estou adicionando um pequeno vídeo ensinando a “recondicionar” baterias de notebooks.

Quero deixar BEM claro que não me responsabilizo por nada.

Vídeo: http://www.youtube.com/watch?v=BtqRv…eature=channel

Vale lembrar que se o procedimento for feito de forma errada pode causar queimaduras, explosões ou danificar o notebook.

Rede Máscaras / Netmasks para modelos

As máscaras de rede é uma notação para o grupo de endereços IP. Let’s take a familiar analogy. Vamos fazer uma analogia familiar. My phone in US was 510-595-3830. Meu telefone na E.U. foi 510-595-3830. 510 was the area code which included a large group of phone numbers in San Francisco-Oakland-Emeryville area. 510 foi o código de área, que incluiu um grande grupo de números de telefone em San Francisco-Oakland-Emeryville área. Similarly IP addresses are also grouped by their network prefix. Do mesmo modo os endereços IP também estão agrupados pela sua rede de prefixo.

Netmasks are important for allocating sub-networks to individuals or organizations. Netmasks são importantes para a atribuição de sub-redes de indivíduos ou organizações. They are also used to identify networks for routing purposes. Eles também são utilizados para identificar redes de roteamento fins.

Each (IPv4) IP address contains a 4 8-bit integers in the form abcd So an IPv4 IP address contains 32 bits. Cada (IPv4) contém um endereço IP 4 8-bit inteiros, sob a forma ABCD Portanto, um endereço IP IPv4 contém 32 bits. A netmask indicates the number of bits which are fixed for all IP addresses within the network. Uma máscara indica o número de bits que são fixas para todos os endereços IP dentro da rede.

Let’s take a network which contains IP addresses between 72.31.32.0 – 72.31.32.255. Vamos ter uma rede que contém os endereços IP entre 72.31.32.0 – 72.31.32.255. In this network the first 24 bits (first 3 8-bit integers) are constant for all IP addresses. Nesta rede os primeiros 24 bits (3 primeiras 8-bit inteiros) são constantes para todos os endereços IP. So the network mask for this network will be denoted as /24 . Portanto, a máscara de rede para esta rede será denominado / 24.

There is a longer notation to describe network masks which is used in Windows and also Linux to specify the netmask of your own computer. Existe já uma notação para descrever a rede de máscaras que é usado no Windows e Linux também especificar a máscara de seu próprio computador. Here instead of writing the number of constant bits in the IP address in decimal format you need to specify it in the IP address format. Aqui, em vez de escrever o número de bits constante no endereço IP no formato decimal é necessário especificar que o endereço IP no formato. So /24 becomes 255.255.255.0. Então / 24 passa a 255.255.255.0. The first three 255 represents the 24 bits of the address. Os três primeiros 255 representa os 24 bits do endereço.

Each network specified by the netmask can contain a maximum number of computers or IP address bearing devices (like routers) as limited by the netmask. Cada rede especificado pela máscara pode conter um número máximo de computadores ou dispositivos que ostentem o endereço IP (como roteadores) como limitada pela máscara. For example a /24 network can contain a maximum of 2 8 -1 (255) computers. Por exemplo, um / 24 de rede pode conter um máximo de 2 8 -1 (255) computadores. One of the address (highest one) is reserved for broadcast address of the network. Um dos endereços (uma mais alta) é reservado para broadcast da rede. The number 8 is derived by subtracting 24 from 32. O número 8 é derivado, subtraindo 24 de 32.

Refer to the table below for network masks in both forms and maximum number of machines for quick reference: Consulte a tabela abaixo para ver as máscaras de rede em ambas as formas eo número máximo de máquinas para referência rápida:
Short Form Short Form Full Form Formulário Completo Maximum number of machines O número máximo de máquinas Comment Comentário
/8 / 8 /255.0.0.0 / 255.0.0.0 16, 777, 215 16, 777, 215 Class A address Classe A morada
/16 / 16 /255.255.0.0 / 255.255.0.0 65, 535 65, 535 Class B address Classe B endereço
/17 / 17 /255.255.128.0 / 255.255.128.0 32, 767 32, 767
/18 / 18 /255.255.192.0 / 255.255.192.0 16, 383 16, 383
/19 / 19 /255.255.224.0 / 255.255.224.0 8, 191 8, 191
/20 / 20 /255.255.240.0 / 255.255.240.0 4, 095 4, 095
/21 / 21 /255.255.248.0 / 255.255.248.0 2, 047 2, 047
/22 / 22 /255.255.252.0 / 255.255.252.0 1, 023 1, 023
/23 / 23 /255.255.254.0 / 255.255.254.0 511
/24 / 24 /255.255.255.0 / 255.255.255.0 255 Class C address Classe C endereço
/25 / 25 /255.255.255.128 / 255.255.255.128 127
/26 / 26 /255.255.255.192 / 255.255.255.192 63
/27 / 27 /255.255.255.224 / 255.255.255.224 31
/28 / 28 /255.255.255.240 / 255.255.255.240 15
/29 / 29 /255.255.255.248 / 255.255.255.248 7
/30 / 30 /255.255.255.252 / 255.255.255.252 3
Fonte: http://blog.taragana.com/index.php/archive/network-masks-netmasks-for-dummies/pt/

O essencial para programar a porta paralela (C/C++) 1






Tabela de conteúdos

O essencial para programar a porta paralela (C/C++) 1

ALERTA!

Mecher na porta paralela causa dependência (vício). E também é perigoso. A porta paralela está ligada diretamente à placa mãe. Qualquer curto ou uso indevido pode comprometer todo o computador. Não nos responsabilizamos por qualquer dano que você possa vir a causar ao seu computador. Seguindo a risca as orientações do tutorial, você minimizará as chances de qualquer defeito.

Boa diversão!

Entendendo a Porta Paralela

A porta paralela foi inventada pela IBM originalmente com o intuito de controlar impressoras. Por esse motivo, a porta paralela ficou conhecida como a porta de conexão de impressoras. Porém, existem uma infinidade de dispositivos que podem ser controlados por essa interface de comunicação, como exemplo: Scanners, máquinas fotográficas digitais, dispositivos de armazenamento, e até mesmo outros computadores. Por ser uma porta de entrada e saída de dados, podemos controlar e receber informações por meio da porta paralela, desde que sigamos algumas regras. Tendo uma noção de eletrônica básica, poderemos então controlar (ligar, desligar, receber informações) qualquer dispositivo, tornando a porta paralela em um meio de exportar o seu programa do mundo virtual, para o mundo real. E é a este propósito que se destina este tutorial.

A porta paralela, encontrada no padrão PC IBM, tem um conector padrão chamado DB25. Como podemos ver nas figuras 1.1 e 1.2.

Fig. 1.1: Conector fêmea encontrado na parte traseira do pc.

Fig. 1.2: Conector macho

Como tudo, a porta paralela sofreu algumas modificações ao passar do tempo, visando sempre a melhoria do seu sistema. Por conta disso, surgiram novos padrões de porta paralela. Hoje existem 3 padrões diferentes de porta paralela estão no mercado. São eles: SPP, EPP e ECP. Existem também variações dentro destes padrões. Eles diferem em comportamento. Na maioria dos computadores atuais, podemos ter os 3 modos, que podem ser escolhidos no “Setup” do computador. Para acessarmos o setup temos que reiniciar o computador e teclar alguma tecla na inicialização. Normalmente F2, F8 ou Delete (depende da placa mãe).

O Setup é Programa onde o operador, pode fazer algumas personalizações sobre como vai funcionar o seu computador. Está residente, juntamente com o BIOS, numa memória ROM, que fica na placa mãe, suas determinações ficam guardadas numa outra memória a CMOS (Complementary Metal/Oxide Semiconductor), memória volátil de baixo consumo que guarda as informações relevantes ao processo de boot do sistema.

Vamos uma rápida explicação sobre os 3 padrões.

  • SPP – Standard Parallel Port: É um padrão de comunicação UNIDIRECIONAL, ou seja existe apenas um sentido de comunicação na sessão de dados, cuja a capacidade máxima de trafego de dados é a 150 KB/s. Você pode receber alguns sinais de periféricos nesse modo, porem não tem uma seção própria para trafego de dados, por isso é dito unidirecional.
  • EPP (Enhaced Parallel Port): É um padrão bidirecional, onde a sessão de dados tem trafego bidirecional (em ambos os sentidos)a mesma pode atingir até a velocidade de 2MB/s. Enquanto que o modo SPP foi feito com alvo em impressoras, esse modo, criado pela Intel, Xircom & Zenith Data Systems, para prover uma comunicação mais rápida entre os dispositivos. Com alvo em geral em dispositivos de armazenamento.
  • ECP (Extended Capabilities Port): Trata-se de um padrão perfeitamente idêntico ao EPP, com a vantagem de possuir DMA (Direct Memory Access)- Acesso direto a memória. Ou seja, ele não precisa passar pelo processador para acessar o dado residente na memória.

Vejamos então uma diagrama com a pinagem do conector DB25 no padrão SPP na figura 2.

fig2

Tabela 1

Tabela de endereços das portas paralelas.

Tabela 2

Esses endereços serão de suma importância para o que vem mais a frente neste tutorial. Sendo que o endereço de controle deve ser usado com muita cautela, pois os bits mais significativos, quando operados de forma indevida, podem causar danos ao computador, sugiro que para início de estudo, não use o endereço de controle.

Aplicando nossos conhecimentos Manipulando a porta paralela

Cada linguagem de programação terá suas funções para a manipulação da porta paralela. A linguagem que estudaremos será a linguagem C em ambiente windows, usando o compilador Dev-C++.

Por motivo de segurança, as versões mais novas do windows não permitem que um programa acesse recursos de hardware de forma direta. Mais precisamente, todos os sistemas baseados na tecnologia NT (New Tecnology). Exemplo os windows 2000 e XP. Os demais não tem qualquer entrave nesse quesito, ex: windows 95, 98, ME. Para que o nosso programa possa, então, acessar a porta paralela, que é um recurso de hardware, teremos de fazer uma “ponte” com uma dll. A dll inpout32.dll .

Ela será responsável por resolver este nosso “problema”.

Muito bem, vamos a explicação. Usaremos a função outportB(). Esta função recebe dois atributos. O primeiro é o endereço da porta que você vai utilizar. O segundo é o dado que você vai enviar. Se eu quiser ligar um led que está conectado ao pino 2 (Bit0 de dados) da porta LPT1 eu devo escrever a linha ? outportB(0×378,1);
No caso, eu estou dizendo para a minha função outportB que mande para o endereço de dados (0×378) o byte que representa o numero decimal 1 (0000 0001 em binário). Se eu quiser ligar o led do bit1 a mesma coisa. outportB(endereço,dado); ? outportB(0×378,2). Na linguagem C, quando entramos um dado Hexadecimal, colocamos o prefixo “0x”. Quando entramos um dado decimal, não precisamos colocar prefixos.

Uma breve explicação sobre BIT. A palavra Bit significa Bibary Digit, ou seja, Digito que representa apenas dois estados. No caso: Nível alto (Ou ligado) e Nível Baixo(Ou desligado). Pois bem, na nossa porta paralela nós temos, na saída de dados, 8 Bits que podem ser definidos no nosso programa como (Ligados ou desligados). Convencionou-se a leitura de um dado binário da direita para a esquerda, como se faz a leitura de um número decimal! Na esquerda estão os números mais significativos, e na direita os menos significativos. Então, quando mandamos um dado à saída de dados, estamos dizendo: Ligue tal bit, desligue tal bit, ligue aquele outro… Vamos a uma tabela bem intuitiva, onde temos o dado e o bit que ele vai ligar dentro do endereço de dados de LPT1 (0×378).

tabela 3

Exemplo de código em C no Dev-C++ que usa a porta paralela para ligar e desligar leds e que usa a inpout32.dll.

/*
 BBBB  RRRR  W   W N   N  OOO
 B   B R   R W   W NN  N O   O
 BBBB  RRR   W W W N N N O   O    Tutorial Porta Paralela
 B   B R  R  W W W N  NN O   O          Dev-C++
 BBBB  R   R  W W  N   N  OOO      brunofgc@gmail.com
*/
#include <stdio.h>   // Biblioteca Standard Input/Output
#include <conio.h>   // Biblioteca necessária para o uso da função getch();
#include <windows.h> // Biblioteca necessária para o carregamento da inpout32.dll

/*Inpout32*/
//Declaração dos ponteiros para função.
typedef short _stdcall (*PtrInp)(short EndPorta);
typedef void _stdcall (*PtrOut)(short EndPorta, short datum);
HINSTANCE hLib; //Instância para a DLL inpout32.dll.
PtrInp inportB;     //Instância para a função Imp32().
PtrOut outportB;  //Instância para a função Out32().
/*Inpout32*/


int main()
{
/*Inpout32*/
   //Carrega a DLL na memória.
   hLib = LoadLibrary("inpout32.dll");
   if(hLib == NULL)
   {
      printf("\n\aErro. O arquivo inpout32.DLL nao foi encontrado.\nO programa vai terminar apos digitar qualquer tecla.");
      getch();
   }
else {//Todo o programa só será executado apenas se a dll for carregada.
   //Obtém o endereço da função Inp32 contida na DLL.
   inportB = (PtrInp) GetProcAddress(hLib, "Inp32");
   if(inportB == NULL)
   {
      printf("\n\aErro. Erro ao endereçar a função Inp32.");
   }
   //Obtém o endereço da função Out32 contida na DLL.
   outportB = (PtrOut) GetProcAddress(hLib, "Out32");
   if(outportB == NULL)
   {
      printf("\n\aErro. Erro ao endereçar a função Out32.");

   }
/*Inpout32*/    

char teclado=' ';
puts("Vamos ao teste da porta paralela.");
puts("Para ligar cada um dos bits da porta paralela\naperte as teclas referentes aos bits\n0,1,2,3,4,5,6,7. Quando quiser terminar o programa\ndigite p para parar.");
teclado=getch();
while(teclado!='p')
    {
     switch(teclado)
          { 
           case '0':
           outportB(0x378,1);  /* A função que manda um byte para a porta paralela no caso o número 1 ou 0000 0001 em binário*/
              break;
           case '1':
           outportB(0x378,2); /* Novamente a função que manda um dado a porta paralela*/
              break;
           case '2':
           outportB(0x378,4);
              break;              
           case '3':
           outportB(0x378,8);
              break;              
           case '4':
           outportB(0x378,16);
              break;              
           case '5':
           outportB(0x378,32);
              break;              
           case '6':
           outportB(0x378,64);
              break;              
           case '7':
           outportB(0x378,128);
              break;            
          }
          teclado=getch();
    }
   
outportB(0x378,0);
}//fim do else pertencente ao if que testa se carregou a dll
    
}//fim da função main e do programa


Para que o programa funcione, temos que colocar a inpout32.dll dentro da mesma pasta que o arquivo executável. Caso tentemos rodar o programa sem a dll na pasta, o programa irá informar o erro e irá finalizar.

Compilando e executando o programa veremos que os leds acendem de acordo com a entrada no teclado de 0 a 7. Vamos então ao esboço eletrônico para ligar os leds na porta paralela.

Receitinha de bolo: 8 Leds, 8 resistores 470 ohm (amarelo, violeta e marrom), 1 cabo paralelo, 1 ferro de soldar, solda à gosto, fios à gosto, uma pitada de conhecimento em eletrônica básica e um pouco de paciência.
Modo de preparo: Misture tudo e leve ao computador, por algumas horas de estudo.

fig3

Como visto na figura 3, basta ligarmos os leds em série com um resistor ao terra e ao pino referente para que possamos fazer nossos testes, sempre respeitando a polaridade dos leds. Para identificar a polaridade do led em Anodo e Katodo (Positivo e negativo respectivamente) utiliza-se um código. No invólucro do led temos um pequeno chanfro identificando o lado negativo, ou a perna mais curta é também do lado negativo. Como visto também os pinos 19-25 são terra, então temos que unir todos eles. Uma forma simples á utilizar um cabo paralelo e desmontar a ponta do lado que vamos fazer nossa montagem, deixando o lado que vamos conectar ao computador intacto. Dentro do cabo teremos uma barra de metal condutor unindo os pinos 19-25. Então basta pegar qualquer um dos pinos, neste caso.

Temos ainda a possibilidade de entrada de dados para o nosso programa pela porta paralela através do endereço de status. Mais, por hora, vamos deixar isso de lado. Pois será necessário um pouco mais de conhecimento em eletrônica para não causar danos ao computador. (Devemos sempre lembrar que, a porta paralela está conectada diretamente à placa mãe do computador. E qualquer deslize pode ser fatal.)

Fonte: TemaDigital.com.br