segunda-feira, 25 de janeiro de 2010

Guia - Sites em UTF-8 e PHP

Vou explicar aqui como tornar seu site compativel com UTF-8...
Você precisa entender que há várias camadas em que a codificação é utilizada, logo para usar corretamente o UTF-8 é recomendado usar UTF-8 em tudo...
Veja onde podemos informar a codificação de um texto:
  • Cabeçalho HTTP Header - Content-Type: text/html; charset=utf-8;
  • Cabeçalho XML - <?xml version="1.0" encoding="utf-8" ?>
  • Cabeçalho HTML - <meta http-equiv="Content-Type" content="text/html;charset=utf-8" >
  • Cabeçalho XHTML - <meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
Lembrando que em regra o que vale mesmo é tudo menos o cabeçalho HTTP, mas é complicado, porque depende do browser...

O cabeçalho HTTP, pode ser informado pelo próprio PHP ou pelo Apache através da seguinte linha no .htaccess: AddDefaultCharset UTF-8

Agora onde que um servidor PHP com MySQL trata de codificações:
  • O próprio código do PHP;
  • A conexão PHP MySQL;
  • O armazenamento dos dados no MySQL;
Para deixar o próprio código do PHP em UTF-8 basta usar um editor de texto que suporte UTF-8, o Bloco de Notas do Windows serve, mas ele usa o BOM, e isso atrapalha... Por isso use um editor que edite em UTF-8 mas tenha opção de não gerar o BOM, como o Notepad2 ou o Dreamweaver...
Para deixar a conexão do mysql basta usar: mysql_set_charset('utf8',$link);
O uso de SET NAMES não é recomendado nas versões novas do PHP e MySQL...
Já o armazenamento do MySQL a mudança é feita na hora de criar o banco de dados ou a tabela com o CHARACTER SET utf8;

Lembrando que o armazenamento MySQL não precisa ser obrigatoriamente em UTF-8, uma vez que podemos definir na conexão qual charset desejamos, é possível que a conexão seja UTF-8, mas o MySQL armazene em Latin1, não sendo do tipo BLOB o campo, o MySQL faz a conversão do charset...

Um dos problemas de usar UTF-8 no PHP é que algumas funções falham ao executar comandos com o strtoupper e o strtolower, que em palavras acentuadas, deixa as letras acentuados sem alteração.

Outro problema que pode ocorrer é quando o usuário usa um editor ISO-8859-1 para um site UTF-8, o código gerado precisa do utf8_encode...

Outro problema é quando o arquivo php é Latin1 e a conexão do banco de dados é UTF-8, e o usuário tenta substituir um texto no php, palavras acentuadas não são substituidas, porque a função procura por um caracter Latin1, enquanto a string do banco de dados venho com caracteres UTF-8....

Outro problema é quando o usuário exagera e usa vários utf8_encode....

Outro problema é usar htmlentities em uma string UTF-8... Deve se usar htmlspecialchars...

Outro problema, mas esse eu preciso confirmar é que no Javascript ao postar uma string, deve-se usar encodeURIComponent e não escape ou encodeURI...

Tomando esses cuidados, metade dos problemas dos programadores PHP desaparecem, e 80% dos problemas de usuários reclamando de letras estranhas também...

Nota: Latin1 é o ISO-8859-1 no MySQL por isso as vezes falo ele...

Sites:
http://www.w3.org/TR/2007/NOTE-i18n-html-tech-lang-20070412/
http://www.w3.org/International/tests/#lang-decl

sábado, 23 de janeiro de 2010

Site Yahoo Fail Css

Solução no final...
Alguém pode me explicar porque o site do Yahoo aqui abre assim:


Pior que fica assim em qualquer browser: Firefox, Chrome, Internet Explorer, Opera...

Aparentemente o problema é o domínio l.yimg.com que resolve o IP 216.115.98.240, mas não conecta de jeito nenhum, e isso não é recente....

Atualização:
O problema afeta o site Flickr.com, pois ele é do Yahoo...
Achei um cara reclamando do problema, mas sem solução, aqui.

Segue o Tracert do endereço l.yimg.com:

Tracing route to fo-anyycs-l.ay1.b.yahoodns.net [216.115.98.240]
over a maximum of 30 hops:

  1    <1 ms     2 ms    <1 ms  IP Meu
  2    99 ms    99 ms    98 ms  IP Meu
  3     *        *        *     Request timed out.
  4    50 ms    73 ms    50 ms  201-0-96-145.dsl.telesp.net.br [201.0.96.145]
  5    96 ms    60 ms    53 ms  201-0-5-157.dsl.telesp.net.br [201.0.5.157]
  6    88 ms    56 ms    84 ms  200-100-98-185.dial-up.telesp.net.br [200.100.98.185]
  7    76 ms   208 ms   116 ms  TE-Brasil-5-3-0-0-grtsanem2.red.telefonica-wholesale.net [213.140.51.233]
  8   159 ms   174 ms   179 ms  Xe6-0-1-0-grtmiabr1.red.telefonica-wholesale.net [84.16.15.42]
  9   250 ms   199 ms   193 ms  Xe9-2-0-0-grtdaleq1.red.telefonica-wholesale.net [213.140.49.189]
 10   253 ms   300 ms   203 ms  yahoo-9-0-1-grtdaleq2.red.telefonica-wholesale.net [213.140.53.14]
 11   321 ms   198 ms   196 ms  ge-1-1-0-d180.pat1.da3.yahoo.com [216.115.104.117]
 12   249 ms   241 ms   322 ms  so-1-0-0.pat1.mia.yahoo.com [216.115.101.1]
 13     *        *        *     Request timed out.
 14     *        *        *     Request timed out.
 15     *        *        *     Request timed out.
 16     *        *        *     Request timed out.
 17     *        *        *     Request timed out.
 18     *        *        *     Request timed out.
 19     *        *        *     Request timed out.
 20     *        *        *     Request timed out.
 21     *        *        *     Request timed out.
 22     *        *        *     Request timed out.
 23     *        *        *     Request timed out.
 24     *        *        *     Request timed out.
 25     *        *        *     Request timed out.
 26     *        *        *     Request timed out.
 27     *        *        *     Request timed out.
 28     *        *        *     Request timed out.
 29     *        *        *     Request timed out.
 30     *        *        *     Request timed out.

Trace complete.
Solução:
O problema é causado pelo Ip que é fornecido para nós, se usarmos um que é dado para outros países o negócio volta a funcionar...
Coloque a seguinte linha no arquivo hosts do seu windows (C:\WINDOWS\system32\drivers\etc\ - Abra o Notepad como Administrador)
200.204.102.154   l.yimg.com

E pronto, os sites voltam a abrir normalmente...
O IP deste domínio pode variar conforme a região, escolha um de alguém que esteja na mesma rede que você e que funcione...

Planetas - Imaginando o Futuro

Filosofando sobre como será o futuro, se o troço de terraformação funcionar...

É bem provável que mandemos populações separatistas para outro planeta... E se nenhum dos lados aceitar se mudar, mudamos ambos, e explodimos com uma bomba nuclear o local antigo, ou o planeta antigo inteiro....

Teremos planetas agrários, pecuaristas, industriais, residenciais, festivos, todo tipo de coisa que temos entre cidades ou países, não terão fronteiras....

Imagine um planeta só para religiosos, um para cada religião....

Um planeta para guerras...

Um planeta só para assassinos...

Um planeta para pedófilos, considerando que são todos homens, eles morreriam de velhos, a não ser que conseguissem se reproduzir...

Um planeta para cada maluquisse....


Haja planeta nesse universo para tantas diferenças....

Guia Programação para quem não sabe inglês

Segue uma referência simples de comandos em inglês traduzidos:
  • Echo - Faz com que algo seja impresso na tela, ou no buffer;
  • Print - Em algumas linguagens é similar ao Echo, só que retorna um valor se deu erro ou não;
  • Printf - Mesma função do Print, mas com muito mais recursos;
  • If - Se;
  • Else - Senão;
  • Elseif - Senão se;
  • For - Para;
  • Foreach - Para cada;
  • While - Enquanto;
  • Parentheses - Parenteses;
  • Brackets - [ ], ( ), { }, ⟨ ⟩;
  • Braces - {};
  • Box brackets ou square brackets - [ ];
  • Greater Than - Maior que (>);
  • Lower Than - Menor que (<);
  • Add - Adicionar;
  • Remove - Remover;
  • Increase - Aumentar;
  • Decrease - Diminuir;
  • Variable - Local em que ficam armazenadas alguma informação;
  • String - Frase (sequencia de caracteres)  - um texto;
  • Number - Número;
  • Value - Valor - o valor de outra coisa;
  • Array - Uma coleção de elementos - imagine um prédio em que cada andar seria uma variavel diferente, os números dos andares seriam o índice do Array e cada andar seria um valor...;
  • Dot - Ponto (.)
  • Comma - Vírgula (,)
  • Semicolon - Ponto e Vírgula (;)
  • Colon - Dois Pontos (:)
  • Dash - Traço (-)
  • Slash - Barra (/)
  • Apostrophes - Esse traço de Harry's (')
  • Quote - Aspas (')
  • Double Quotes - Aspas Duplas (")
De qualquer forma inglês não é dificil, só que você não vai aprender lendo palavras apenas, tem de ler textos inteiros, onde você acaba descobrindo o que está escrito sem ler...
Este é um guia feito de cabeça, milhões de palavras faltam, algumas podem estar totalmente erradas....

sábado, 16 de janeiro de 2010

Gmail for Apps Autologin with Greasemonkey

Segue script do Greasemonkey para auto-login no Gmail for Apps...

Baseado neste código aqui...





Lembre-se se substituir a palavra YOURDOMAIN para o seu domínio, exemplo "otavio.info"...

Não fiz genérico por preguiça...

Link do Código: http://pastebin.com/f1a6ec854

Criando função Mysql

Vou ensinar agora como criar uma função no MySQL para decodificar algo que use uma criptogração de "um disco criptográfico", não sei o nome correto, é aquela em que cada letra ou grupo de letras tem apenas um significado... Criptografia por Substituição talvez seja, não achei o nome ainda...
Neste exemplo a criptografia é apenas de números para letras, cada letra vale sua posição no alfabeto, ou seja, A=1, B=2, C=3, D=4, E=5, e assim por diante
CREATE FUNCTION Funcao01 (s CHAR(1))
RETURNS TINYINT
RETURN IF(s="A",0,IF(s="B",1,IF(s="C",2,
IF(s="D",3,IF(s="E",4,IF(s="F",5,IF(s="G",6,
IF(s="H",7,IF(s="I",8,IF(s="J",9,0))))))))));
Uma funcão simples e ridícula....
Para rodar basta chamar como uma função qualquer...
SELECT Funcao01("G");
Agora explicando, você tem de definir o tipo de cada variável que for entrar, no caso s é do tipo CHAR(1) com tamanho 1, e a saída - o retorno da função vai ser do tipo TINYINT...
A função IF é simples, IF(condição,true,false)...

Uma informação importante, eu testei aqui o código e estava dando erro no MySQL ao criar a função:
ERROR 1307 (HY000): Failed to CREATE FUNCTION Funcao01
A solução foi rodar o mysql_upgrade.exe para atualizar os bancos de dados que eram de uma versão anterior do MySQL... (Se bobear era do MySQL 4.0, :P)
mysql_upgrade.exe -u root -p
Digite a senha do root, e espere ele terminar...

Bug no Apache/PHP e Expressões Regulares

Encontrei outro bug, mas descobri que já postaram no PHP Bugs: http://bugs.php.net/bug.php?id=47689
O problema que esse bug é um bug do Apache, conforme os comentários no site a correção é aumentar o Stack Size do Apache, editando o httpd.exe...
Como eu estou com preguiça de fazer isso, corrigi meu código de outro jeito...

Estou tentando fazer uma expressão regular pra capturar partes de um html gigante com vários ...
Segue um exemplo do código
$b= "" . str_repeat("a", 686)."";
$a = '/((.|\r|\n|\t)*?)<\/td>/i';
preg_match_all($a,$b,$c);
print_r($c);
O problema é que se o Match tiver mais de 685 caracteres o Apache trava, sem mensagem de erro, apenas falha na conexão...
Ou seja se tivermos 685 a's o script roda normal, mas 686 a's ele trava...
Rodando em linha de comando não tem o problema...
A solução foi simples, no lugar da expressão regular usei essa: /(.*?)<\/td>/si
Foi simples assim, o modificador s faz com que o ponto . também capture newline \n, é que no exemplo não tem \n, mas no texto tinha...
Segue o site onde aprendi sobre o *? e s: Extreme regex foo: what you need to know to become a regular expression pro
Isso não corrige o problema do Apache, mas se o seu caso for igual ao meu, vale a dica!!!

domingo, 10 de janeiro de 2010

Novo Modelo

Estou tentando mudar o modelo de negócio do meu domínio http://otavio.info/, inclui uns exemplos de aplicações que fiz...
Ainda é uma mudança simples, futuramente espero incluir o editor do Carnê-Leão, só não sei se libero ele como opensource, ou simplesmente como aplicação web gratuita com edição por upload do xml e download...
E também vender o serviço, ou vender o código fonte integral da aplicação para controle de processos de escritório de advocacia...

Só preciso otimizar o código e reduzir o javascript load....