08/02/2005
Novos problemas lógicos da OBI99 resolvidos!
Baixei a prova da OBI99. Ao invés de ficar demorando nos difíceis, resolvi procurar os mais fáceis mas tentar fazer mais para não ter que pensar muito pois estava meio cansado. A prova de 1999 é muito boa. Os códigos que é preciso fazer pra maioria dos problemas são bastante simples, mas exigem bastante lógica. Precisa parar pra pensar mesmo...
Bom... Resolvi os três que achei mais fácil lendo o enunciado (depois farei o resto):
- Trem ou Caminhão? (caracola.c)
- Restaurante (restaurante.c)
- Sequências (sequencias.c)
Não usei a entrada e a saída em arquivos como foi usado naquele ano, pois é uma coisa que não vale a pena perder tempo fazendo (não que seja complexo, mas só é ruim e mais demorado ficar escrevendo fscanf ao invés de scanf). Já coloquei a solução dos três na área de scripts e depois colocarei os outros três.
Já fiz a prova das OBIs de 2000 a 2004, e acho que não teve antes de 1999, então essa seria a última prova. Acho que ela tá bem difícil em relação as novas (o que é estranho, pois a partir de 2002 o nível foi aumentando).
O problema Palavras Cruzadas é muito interessante. Eu cheguei a começar a fazer mas ficou um código muito complicado e desisti (depois eu faço).
Fiquei com saudade da simplicidade do meu Slackware e formatei novamente minha partição Linux! Tirei o Debian e já estou configurando o Slackware. Dessa vez não vou compilar o Kernel 2.6 nem atualizar algumas coisas como KDE, Gnome, etc. pois da outra vez meu sistema acabou ficando "instável". O Slackware 10.1 saiu e já estou pegando download (via bittorrent) para depois instalar. Parece estar bem bom... Várias coisas atualizadas! Só espero que seja estável...
Minhas aulas começam segunda-feira e minha banda (Zibian) vai fazer um show no meio da aula. Hoje ensaiamos e tá ficando legal (embora ainda não esteja bom pra tocar segunda). Já fiz um layout básico no TeX para meus cadernos, configurei Vim, Bash, Firefox, aMSN, etc. no Slack além de trocar splash do KDE, wallpaper, screensaver, configurar o X, LiLo, etc. Já tô ficando acostumado em configurar Linux de forma rápida por causa de tanta formatação...
OBS.: Acabei de constatar que meu site é o segundo resultado no Google quando se procura por "tableless" em português.
Está atrás apenas de www.tableless.com.br.
Compare Preços de: notebooks, acer aspire, hp pavilion, computadores, pentium 4, nintendo wii, ps3, celulares, câmeras digitais
01/02/2005
Estatísticas de Visita com Shortstat
Comecei a usar o Shortstat para acompanhar as estatísticas do site. Porém, tive alguns problemas com ele (não exatamente problemas, mas coisas que eu acho melhor mudar). Exemplos:
- As estatísticas de browser e sistema são contadas por hit... Eu acho muito mais sensato contar por visita (única), pois algumas pessoas contam vários hits (exemplo: eu) e daí as minhas estatísticas estavam dizendo que 80% dos visitantes usavam Linux!
- Os webcrawlers e alguns browsers são registrados como sistema operacional desconhecido
Já que o sistema é feito em PHP, achei legal consertar estes problemas e até traduzir e colocar uma bandeira do lado dos países. emoticon Vou postar aqui um passo-a-passo de instalação e esas configuração do Shortstat para quem precisar. Achei ele um ótimo sistema de estatísticas (código super simples e bem direto) e tem tudo que eu preciso.
Introdução
O Shortstat é um programa de estatísticas da ShaunInman escrito em PHP que usa um banco de dados MySql para incluir os registros. O funcionamento é bastante simples. Em cada página, eu uso um include para um arquivo que conta visita e existe um arquivo que conta as estatísticas. Estou partindo do princípio que você já tem PHP e MySql configurados num servidor web.
Download
O download do programa .zip pode ser feito aqui:
http://www.shauninman.com/downloads/shortstat_v036b.zip
No Linux, use o comando unzip shortstat_v036b.zip para descompactar.
No Windows, use um programa como WinZip ou WinRar (ou o descompactador do Windows XP).
Arquivos Descompactados
- configuration.php - Configuração do banco de dados
- functions.php - Funções do programa (toda a parte de PHP)
- inc.stats.php - Arquivo que deve ser incluído em cada página do site pra contar visita
- index.php - Página onde se vê as estatísticas
- styles.css - Estilos (css) da página index.php
E ainda tem os arquivos de instalação (que poderão ser deletados logo que acabar a instalação).
IP dos Países
O Shortstat vem com um arquivo de 2mb (_ip-to-country.txt) que tem um banco de dados com ip de vários países e outro php (_ip-to-country.php) que serve para instalar o suporte ao "ip-to-country". Depois de instalar o Shortstat normal, nós vamos instalar também para saber de onde são os visitanets do site.
Instalação
Para instalar o Shortstat, edite o arquivo configuration.php colocando nas variáveis:
<?php $SI_db['server']="servidor_do_mysql"; $SI_db['username']="username_do_mysql"; $SI_db['password']="senha_do_mysql"; $SI_db['database']="nome_do_banco_de_dados"; $tz_offset=seu_fuso_horario; $shortstat=true; ?>
E rode o script de instalação (_install.php) no seu browser. Ele irá criar as tabelas no seu banco de dados. Daí basta acrescentar:
<?php @include_once("diretorio_do_shortstat/inc.stats.php"); ?>
... no início de cada arquivo que você quer que sejam contadas as estatísticas.
Antes de instalar o ip-to-country, eu criei uma coluna chamada codigopais no banco de dados MySql e modifiquei o arquivo functions.php criando uma função chamada verCodigoPais:
<?php function verCodigoPais($ip) { if (!SI_isIPtoCountryInstalled()) return ''; global $SI_tables; $ip = sprintf("%u",ip2long($ip)); $query="SELECT country_code2 AS codigo FROM $SI_tables[countries] WHERE ip_from <= $ip AND ip_to >= $ip"; if ($result=mysql_query($query)) { if ($r = mysql_fetch_array($result)) { return $r['codigo']; } } } ?>
No arquivo inc.stats.php, depois de atribuir um valor para a variável $ip, coloquei:
<?php $cd = verCodigoPais($ip); ?>
... e depois de colocar valor em todas as variáveis alterei a $query para:
<?php $query = "INSERT INTO $SI_tables[stats] (remote_ip, country, codigopais, domain, referer, resource, user_agent, platform, browser, version, dt) VALUES ('$ip', '$cntry', '$cd', '$domain', '$ref', '$res', '$ua', '$br[platform]', '$br[browser]', '$br[version]', $dt)"; ?>
(a única mudança foi a adição da variável cd - que contém o código do país - no campo codigopais do banco de dados)
Agora basta imprimir a bandeira do país... Para isso, no arquivo functions.php alterei a função SI_getCountries:
<?php function SI_getCountries() { global $SI_tables,$_SERVER; $query = "SELECT country, codigopais, COUNT(distinct(remote_ip)) AS 'total' FROM $SI_tables[stats] WHERE country!='' GROUP BY country ORDER BY total DESC"; if ($result = mysql_query($query)) { $ul = "<table cellpadding=\"0\" cellspacing=\"0\" border=\"0\">\n"; $ul .= "\t<tr><th>Country</th><th class=\"last\">Visits</th></tr>\n"; $i=0; while ($r = mysql_fetch_array($result)) { if ($i < 36) { $url = parse_url($r[referer]); $ul .= "\t<tr><td><img src=\"http://ip-to-country.webhosting.info/flag/?type=3&cc2=$r[codigopais]\" alt=\"$r[codigopais]\" /> $r[country]</td><td class=\"last\">$r[total]</td></tr>\n"; $i++; } } $ul .= "</table>"; } return $ul; } ?>
(note que a imagem é buscada direto do servidor do ip-to-country)
Então, agora é só instalar o ip-to-country, mas o arquivo de instalação só está servindo para colocar o nome do país no banco de dados (não o código). Basta modificar o arquivo _ip-to-country.php, alterando:
<?php echo "<p>Mapping existing IPs to countries.</p>"; // Match existing ips to countries $query = "SELECT id,remote_ip FROM $SI_tables[stats] WHERE country=''"; if ($result = mysql_query($query)) { while ($r = mysql_fetch_array($result)) { $country = SI_determineCountry($r[remote_ip]); $query = "UPDATE $SI_tables[stats] SET country='$country' WHERE id=$r[id]"; mysql_query($query); } } ?>
... para...
<?php echo "<p>Mapping existing IPs to countries.</p>"; // Match existing ips to countries $query = "SELECT id,remote_ip FROM $SI_tables[stats] WHERE country=''"; if ($result = mysql_query($query)) { while ($r = mysql_fetch_array($result)) { $country = SI_determineCountry($r[remote_ip]); $cd = verCodigoPais($r[remote_ip]); $query = "UPDATE $SI_tables[stats] SET country='$country' AND codigopais='$cd' WHERE id=$r[id]"; mysql_query($query); } } ?>
Daí é só rodar o arquivo _ip-to-country.php e o ip-to-country estará funcionando junto com o shortstat com bandeira do lado do país!
Estatísticas por visitas, não por hits
Eu alterei a função SI_getPlatforms por:
<?php function SI_getPlatforms() { global $SI_tables; $th = SI_getUniqueHits(); $query = "SELECT platform, COUNT(distinct(remote_ip)) AS 'total' FROM $SI_tables[stats] GROUP BY platform ORDER BY total DESC"; if ($result = mysql_query($query)) { $ul = "<table cellpadding=\"0\" cellspacing=\"0\" border=\"0\">\n"; $ul .= "\t<tr><th>Platform</th><th class=\"last\">%</th></tr>\n"; while ($r = mysql_fetch_array($result)) { $ul .= "\t<tr><td>$r[platform]</td><td class=\"last\">".number_format(($r[total]/$th)*100)."%</td></tr>\n"; } $ul .= "</table>"; } return $ul; } ?>
A mudança foi o count usar distinct(remote_ip) e o $th ter o valor dos hits únicos (daí a porcentagem é contada a partir deles). A mudança na função SI_getBrowsers é semelhante:
<?php function SI_getBrowsers() { global $SI_tables; $th = SI_getUniqueHits(); $query = "SELECT browser, version, COUNT(distinct(remote_ip)) AS 'total' FROM $SI_tables[stats] WHERE browser != 'Indeterminable' GROUP BY browser, version ORDER BY total DESC"; if ($result = mysql_query($query)) { $ul = "<table cellpadding=\"0\" cellspacing=\"0\" border=\"0\">\n"; $ul .= "\t<tr><th>Browser</th><th>Version</th><th class=\"last\">%</th></tr>\n"; while ($r = mysql_fetch_array($result)) { $p = number_format(($r[total]/$th)*100); // $p = ($p==0)?"<1":$p; if ($p>=1) { $ul .= "\t<tr><td>$r[browser]</td><td>$r[version]</td><td class=\"last\">$p%</td></tr>\n"; } } $ul .= "</table>"; } return $ul; } ?>
Conclusão
Assim temos um Shortstat configurado para as minhas necessidades. Eu gosto assim, mas por ser um sistema de código bastante simples em PHP você pode configurar mais o que quiser. Eu traduzi (é só modificar as coisas no index.php) também (não tem uma grande utilidade, mas não custa...)
Espero que tenham gostado do "artigo" e qualquer dúvida ou crítica, postem um comentário ou enviem um e-mail.
Compare Preços de: iPod, home theater, plasma, lcd, câmeras digitais, games, ps3
Assine via RSS
Assine gratuitamente o meu blog e receba todas as atualizações na hora, em seu agregador de feeds favorito.
Busca no blog
Escreva palavras-chave para buscar e clique em Pesquisar.
Veja também...
Blogs de minha autoria
- 1001 Gatos de Schrödinger (discordianismo e mindfuck)
- Algoritmos computacionais (estudo para olimpíadas e aprendizagem sobre lógica de programação)
Artigos por mês
- July 2008
- June 2008
- May 2008
- April 2008
- February 2008
- December 2007
- November 2007
- August 2007
- July 2007
- June 2007
- May 2007
- April 2007
- March 2007
- February 2007
- January 2007
- December 2006
- October 2006
- September 2006
- August 2006
- June 2006
- May 2006
- April 2006
- March 2006
- February 2006
- January 2006
- December 2005
- November 2005
- October 2005
- September 2005
- August 2005
- July 2005
- June 2005
- May 2005
- April 2005
- March 2005
- February 2005
- January 2005

