quinta-feira, 26 de janeiro de 2012

PHP: Upload de vários arquivos com um único INPUT

Antes de existir o HTML5, as únicas possibilidades de fazer upload de vários arquivos sem usar vários inputs era fazendo gambiarras com o Flash. Com o tempo vieram várias (ótimas) soluções, desenvolvidas em JavaScript. Mas, nada tão fácil de se implementar como colocar uma propriedade "multiplo" no campo input.
Hoje já é possível criar um sistema de upload, com a possibilidade de selecionar vários arquivos utilizando apenas um input (HTML) e a regra de upload básica, usando PHP. Vamos produzir.

Implementando o input

<!-- Input file, com o multiple do lado,
para indentificar que o usuário vai poder adicionar
mais de um arquivo de uma vez só. -->
<input name="uploads[]" type=file multiple />


Para controlar o upload no PHP, é bem simples. Os arquivos serão enviados como um array, neste caso, você terá que fazer um foreach e um upload individual para cada arquivo. Observem o código abaixo.

# Declarar a variável "i", que será nosso controle, para que não haja
# loop infinito.
$i = 0;

# Faz um loop conforme o número de arquivos
foreach ($_FILES["uploads"]["error"] as $key => $error) {

# Definir a pasta que os arquivos serão "upados".
$pasta = "fotos/_" . $_FILES["uploads"]["name"][$i];

# Aqui, você faz o upload do arquivo, utilizando a classe que você
# tem aí.
$ftp->upload($_FILES["uploads"]["tmp_name"][$i], $pasta);

# Agora o arquivo já foi upado, pode fazer alguns scripts adicionais, como por exemplo
# adicionar o nome dele no banco de dados, ou talvez alertar o nome de cada arquivo.

# Incrementar algum um valor a mais na variável "i" para que não ocorra loop infinito.
++$i;
}


Esta implementação tem apenas um detalhe: Não funciona no Internet Explorer.

É isto aí, qualquer dúvida deixem um comentário aqui.

Dicas-L

domingo, 22 de janeiro de 2012

Praga digital rouba mais de 45 mil senhas do Facebook

A praga digital Ramint, que pode interceptar operações bancárias, roubou mais de 45 mil de logins e senhas do Facebook, a maioria de contas do Reino Unido e França, de acordo com a empresa especialista em segurança digital Seculert.

A empresa acredita que hackers invadem perfis de usuários do Facebook para mandar links com vírus a amigos da rede social, espalhando a praga -- o amigo recebe uma mensagem da pessoa com o computador infectado com um link malicioso e, se clicar, o malware ataca a máquina.

A praga também se aproveitaria do uso de senhas iguais para múltiplos programas, como Facebook, Gmail, Outlook e Corporate SSL VPN, para invadir redes corporativas.

O Ramnit infecta arquivos com extensão .exe (executáveis), .dll (de sistema) e .html (páginas da internet). Ele nasceu de uma união entre o Ramnit original, que se propaga com facilidade, e o ZeuS, vírus voltado ao roubo de dados bancários.

Apple pode anunciar ferramenta de criação de e-books, afirma site

A Apple opera a loja de livros eletrônicos iBook (Foto: Divulgação)A Apple realizará um evento em Nova York, nos Estados Unidos, na quinta-feira (19), voltado para a área de educação em que poderá anunciar uma ferramenta que permitirá a criação fácil e rápida de livros digitais (e-books). Segundo reportagem do site "Ars Technica", os livros poderiam ser criados com diversos elementos interativos como vídeos e animações.

A publicação descreve a novidade como um "GarageBand para e-books", citando o programa para Macs, iPad e iPhone que permite ao usuário criar músicas. Com a nova plataforma, seria possível distribuir os livros digitalmente por meio da loja virtual iTunes Store.

O sistema de criação e distribuição digital de livros seria anunciado junto com o iPhone 4S em outubro de 2011, mas, por conta da saúde frágil de Steve Jobs, a Apple decidiu adiar o lançacamento. Walter Isaacson, autor da biografia do cofundador da empresa, disse no livro que Jobs estava trabalhando muito próximo de um sistema de livros digitais e que teria dito que a indústria de livros de papel seria destruída pelo formato digital.

A Apple não comentou a notícia sobre o anúncio desta quinta-feira, cujo evento será realizado no museu Guggenheim em Nova York.

Nova falha coloca em risco linguagens de programação da Microsoft e Google

Hackers armados com uma única máquina e uma conexão de banda larga mínima podem atacar servidores web, colocando, assim, um grande número de sites e web apps em risco por causa de ataques de negação de serviço. A descoberta foi divulgada pelos pesquisadores alemães Alexander Klink e Julian Walde.

Em um aviso de segurança publicado no mesmo dia, a Microsoft, cuja linguagem de programação ASP .Net é uma das várias afetadas pela falha, prometeu solucionar a vulnerabilidade e ofereceu aos clientes maneiras de proteger seus servidores até que uma atualização de segurança seja lançada.

Depois, em uma nova mensagem, a fabricante anunciou que estaria lançando hoje, 29, um update de emergência. Chamada de MS 11-100, a atualização conserta três bugs na ASP .Net, sendo que um deles é classificado como “crítico”. Nenhum dos três havia sido revelado publicamente até hoje.

O problema que causou um alvoroço na comunidade de segurança existe em muitos das mais populares linguagem de programação de sites e aplicativos na web, incluindo a ASP .Net, as opções de código aberto PHP e Ruby, o Java, da Oracle e o V8 JavaScript, da Google, explicam os pesquisadores citados acima Klink e Walde.

A dupla, que apresentou suas descobertas durante a conferência Chaos Communication Congress (CCC), em Berlim, nesta semana, ligou a falha ao manejo de hash tables por essas linguagens – e outras, uma estrutura de programação usada para obter e armazenar dados.

Ao menos que uma linguagem randomize funções hash ou leve em conta “colisões hash” - quando múltiplos dados geram o mesmo hash – os invasores podem calcular os dados que acionarão grandes números ou colisões, então enviar esses dados como um simples pedido HTTP. Como cada colisão “mastiga” ciclos de processamento no servidor direcionado, um hacker usando pacotes de ataque relativamente pequenos poderia consumir todo poder processamento até mesmo de servidores bem equipados, efetivamentos deixando-os offline.

A Microsoft confirmou que um único pedido HTTP de 100K especialmente criado e enviado para um servidor rodando a ASP. Net poderia consumir 100% do núcleo de uma CPU por algo entre 90 e 110 segundos.

“Um invasor poderia potencialmente enviar tais pedidos de forma repetida, fazendo com que o desempenho diminuísse significativamente o bastante para causar uma condição de negação de serviço até mesmo para servidores de vários núcleos ou clusters de servidores”, afirmaram os engenheiros da companhia, Suha Can e Jonathan Ness, em um post publicado nesta semana no blog Security Research & Defense.

Klink e Walde estimaram que os pacotes de até 6K poderiam manter um processador de um único núcleo ocupado em um servidor Java.

As implicações são significativas para web apps e sites que rodam nesses servidores.

“Um invasor com poucos recursos pode efetivamente tirar um site do ar de maneira relativamente fácil”, afirmou o diretor de operações de segurança da nCircle Security, Andrew Storms. “Não é preciso nenhuma botnet para causar uma destruição aqui.”

A pressa da Microsoft em solucionar a falha na ASP .Net deu uma dica quanto a seriedade do bug.

“A Microsoft será uma a ficar de olho e ver se eles saem da banda e se fizerem, quando acontecerá”, disse Storms nesta quarta-feira, antes de a Microsoft anunciar o pacote de soluções de hoje. “Se fizerem isso, penso que será em breve.”

Can e Ness, da Microsoft, afirmaram que a companhia “antecipou o iminente lançamento público do código de exploração”, e pediu para que os clientes da ASP .Net apliquem o patch ou as soluções descritas no aviso da companhia.

Outros desenvolvedores de linguagem, como o Ruby, já oferecem soluções para seus softwares.

A Microsoft entregou a MS11-100 por meio dos seus conhecidos canais Windows Update e Windows Server Update Service (WSUS).

Mais informações sobre a falha de colisão hash podem ser encontradas no aviso que Klink publicou no site da sua empresa, e nas anotações da sua apresentação (download de arquivo PDF) – vídeos da apresentação de Klink e Walde na CCC foram retirados do YouTube nas últimas horas.

Nasa lança portal para projetos de código aberto

A Nasa (Agência Espacial dos EUA) anunciou nesta semana, por meio de seu blog, o lançamento de um site para o desenvolvimento de softwares de código aberto.

Atualmente, a página code.nasa.gov abriga um diretório dos projetos open source da organização e ainda fornece acesso aos documentos dos seus processos de programas de código aberto.

O objetivo da agência é que no futuro o portal funcione como uma central (hub) de desenvolvimento de código aberto. Para isso, é planejada a adição de um fórum e ferramentas de colaboração para facilitar a vida dos desenvolvedores que quiserem levar os projetos da Nasa para o mundo código aberto.

Os projetos inicialmente listados no novo site da Nasa incluem um mapeador lunar e um kit de ferramentas para determinação de órbita. No entanto, apenas alguns deles já possuem seu código aberto na página, enquanto a agência que os outros códigos chegarão “em breve”.

Como informa o Ars Technica, a Nasa possui um histórico antigo em produzir de maneira colaborativa com a comunidade de código aberto. Os projetos anteriores variavam de ornamenta rastreadores de erros (bug trackers) até criar soluções open source mais escaláveis para computação na nuvem.

Recentemente, a agência lançou outra novidade no mundo digital, uma rádio online que mistura rock e tecnologia chamada Third Rock.

quinta-feira, 19 de janeiro de 2012

O desktop morreu, viva os All-in-Ones!



Eles estão há muito tempo de estrada, e vinham vencendo todos os tipos de adversários – laptops, consoles de games, netbooks e incontáveis especialistas proclamando seu fim. Entretanto, dessa vez é para valer: acabou. E, ironicamente, o desktop foi derrubado por um PC que fica na parte de cima da escrivaninha.

Em 2011, computadores “all-in-one” (também conhecidos como “tudo em um”) deixaram de ser uma novidade para se tornarem uma categoria de produto interessante que combina praticidade e ótima performance, tudo em um chassi compacto. Minha previsão para 2012 e para os próximos anos: all-in-ones estarão em todos os lugares.

Você ainda poderá encontrar alguns gabinetes escondidos em algumas prateleiras – e muitos parecem um bom negócio, por causa do preço atrativo. Junte com um monitor, mouse e teclado quaisquer e você terá um ótimo computador – além de uma relíquia digital de uma era distante.

Alguns de nós precisam de máquinas um pouco mais turbinadas: jogadores necessitam de espaço para chips gráficos e CPUs refrigeradas a líquido, enquanto que certos profissionais precisam de estações de trabalho poderosas e empresas dependem de equipamentos que possam ser modificados ou consertados em massa. Esses “caixotes pretos” ainda continuarão presentes no ambiente corporativo por algum tempo.

Espaço e beleza

Mas os all-in-ones são o futuro. O consumidor médio quer apenas uma coisa que funcione, e funcione bem – e que também não seja feio e ocupe o mínimo de espaço possível. E esse tipo de equipamento preenche todos esses requisitos. A Intel e a AMD ajudaram a encurtar o caminho até os all-in-ones ao produzir processadores mais rápidos e menores, que ainda diminuem o consumo de energia ao mesmo tempo que aumentam o desempenho.

Este ano não será diferente, com o Ivy Bridge da Intel e o Piledrive da AMD abrindo caminho para componentes ainda mais finos, sem que percam o poder de processamento. E então há o touch; com o Windows 7, o usuário pode evitar as telas sensíveis ao toque completamente e viver muito bem sem elas. Até o Windows 8 permite que você navegue a partir do desktop tradicional do Windows .

Entretanto cada vez aplicações estão sendo desenvolvidas com o touch em mente, e o Windows 8 será um sistema operacional híbrido – desenvolvedores de apps que não disponibilizarem versões amigáveis aos dedos irão sofrer. Porém, mesmo que você odeie pensar em ficar tocando na tela do seu computador, qual a sensação de um display bonito e enorme, a oportunidade de se livrar da quantidade absurda de cabos embaixo da mesa ou de ter um PC que realmente valha a pena mostrar? Que tenha um preço justo e que seja um prazer ligar e aproveitar um pouco o gosto do “futuro”?

Fora da categoria de desktops de performance, fica cada vez mais distante a ideia do consumidor ser tentado por um fabricante a comprar uma caixa preta deselegante em um mundo de belos smartphones e tables sensíveis ao toque. A maioria dos usuários precisa de uma máquina apenas para armazenar suas fotos, assistir a vídeos, e jogar alguns games de vez em quando. Os All-in-Ones cumprem a tarefa, e ainda fazem isso com estilo; eles vieram para ficar.

Sites saem do ar em protesto contra projeto de lei anti-pirataria

Como prometido, vários sites realizam hoje (18/1) uma série de protestos contra projetos de lei dos Estados Unidos (que pretendem combater a pirataria na Internet). Conhecidas como Stop Online Piracy Act (SOPA) e Protect IP Act (PIPA), as propostas têm sido muito criticadas por defensores da liberdade na rede mundial de computadores.

A Wikipedia em inglês ficará o dia todo fora do ar, com a exibição de uma página em preto e a mensagem “imagine um mundo sem a liberdade de conhecimento”. A popular enciclopédia online afirma que a nova legislação poderia seria um sério golpe na Internet livre e aberta. Seu serviço ficará indisponível por 24 horas.

Já a Google traz em sua página de busca a frase “Diga aos congressistas: por favor, não censurem a Web!”. A mensagem traz um link para uma petição que combate os projetos polêmicos nos Estados Unidos.

O serviço Craigslist bloqueou seu conteúdo nos Estados Unidos. Sua página traz o texto “imagine um mundo sem Craiglist, Wikipedia, Google, seu site favorito”. E acusa companhias como Sony e News Corp de quererem tornar isso uma realidade.

A iniciativa tem reunido correntes completamente opostas, indo do grupo hacker Anonymous, que publicou mensagens de apoio ao protesto de hoje, a representantes do governo Obama.

Em um documento, membros da Casa Branca disseram que a pirataria é um sério problema, que merece uma resposta dura, mas que o governo não pode apoiar leis que limitam a liberdade de expressão e que colocam a segurança online em risco.

IDG News Service

Enquete: Animação no resultado

Na primeira parte do tutorial sobre a criação de uma enquete você viu como arquitetar o código PHP: Criar Enquete / Votação Com PHP. Neste, veremos como adicionar efeitos na apresentação do resultado da enquete. Será um efeito em que a barra parte da largura zero e desliza para a direita.
Utilizaremos também um pequeno plugin jQuery para trabalhar com cookies e com isso verificar se o visitante já votou na enquete anteriormente.

Importação Dos Arquivos

No cabeçalho da página da enquete, importe os seguintes arquivos.
<link rel="stylesheet" type="text/css" href="estilo.css" />
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.1/jquery.min.js"></script>
<script type="text/javascript" src="jcookie.js"></script>
<script type="text/javascript" src="javascript.js"></script>



Pelo nome você já deve ter entendido o propósito de cada um. Quanto ao “jcookie.js” você encontra o arquivo para download neste endereço (http://plugins.jquery.com/project/jCookie). Ou ao final do tutorial juntamente com todos os arquivos.

A Estrutura

Todos os elementos usados para apresentar o resultado da enquete serão inseridos via javascript. Isso significa que você não verá nenhum deles clicando em Exibir – Código Fonte.

Para facilitar o entendimento e evitar um exercício de imaginação quando chegarmos na parte da estilização, veja a estrutura definida:
<div class=”resultado-enquete”>
  <h2>Resultado parcial da enquete</h2>

  <div><p>100%</p></div>
  <div><p>100%</p></div>
  <div><p>100%</p></div>
  
  <p>Total de votos: 100</p>
</div>


Uma estrutura sem dúvida simples, sendo que os valores são apenas demonstrativos. Veja que o resultado de cada opção será mostrado dentro da barra.

Estilização

Vamos definir a aparência e posicionamento dos elementos responsáveis pela apresentação do resultado.
.resultado-enquete{
width:300px;
height:auto;
background:#eaeaea;
display:none;
position:absolute;
float:none;
left:50%;
margin-left:-150px; }

.resultado-enquete div{
height:auto;
width:0;
background:#333;
margin:10px;
color:#fff;
font-weight:bold;}

.resultado-enquete div p, h1{text-shadow:1px 1px 3px #333;}

A div que engloba todos os elementos do resultado é a primeira estilizada. Ela possue uma largura definida, mas ajusta a altura conforme o conteúdo. As últimas quatro propriedades servem para centralizar a div.

Em seguida definimos a aparência das divs que conterão os valores em porcentagem. O detalhe fica por conta da largura (width) zero. É preciso para que o efeito de aumento da largura parta da esquerda em direção á direita.

Por último é aplicada uma sombra no texto para melhorar o contraste.

As Primeiras Verificações

No arquivo javascript definimos que o código será iniciado quando o formulário for submetido.
$(function(){
  $('#form_enquete').submit(function(){
    var cookie = $.cookie("enquete_php");
    if (cookie==null)
    {
      //código
    } else {
      alert("Você já votou nesta enquete hoje.");
    }
  return false;    
})

})


O plugin que nós importamos para trabalhar com cookies é referenciado chamando “$.cookie()”. Então criamos uma variável de nome sugestivo e populamos com o conteúdo do cookie chamado “enquete_php”.

Você há de me perguntar onde diabos foi criado este cookie para estarmos trabalhando com ele. Ele é criado no arquivo PHP e populado com o ip do usuário. Como os cookies não são variáveis, mas arquivos, ele pode ser acessado por qualquer linguagem.

No arquivo PHP ele é definido para durar 24 horas. Sabendo disso, a única verificação que precisamos realizar é saber se ele contém algum valor. Pois se for desta maneira, ele ainda existe. Se este for o caso, é lançado na tela um alerta informando sobre a tentativa de votação e o código acaba.

Por outro lado, se o arquivo não possue conteúdo, então não existe, o código prossegue para que o voto seja computado.
Um Vai, Outro Vem

Mais uma verificação e iniciamos as animações.

var opcao = $("input[name='opcao']:checked").length;
if (opcao>0)
{
$('#enquete').fadeOut().before('<div class="resultado-enquete"><h2>Resultado parcial da enquete</h2></div>');
  $('.resultado-enquete').fadeIn();
} else {
  alert("Você precisa escolher uma das opções.");
}


Na primeira linha, criamos uma variável para receber o número de checkboxes com o nome “opção” que estão selecionadas.
Se o número armazenado é maior do que zero, significa que foi escolhida uma opção. Então a enquete desaparece e é inserido imediatamente antes desta enquete o código da div que contém os resultados da enquete. Mas até o momento a div não esta visível porque definimos que não seria no código CSS. Sendo assim, na linha de baixo ela é mostrada com um efeito.

Se o número da variável “opção” não for maior do que zero, sendo assim nenhuma das opções foi escolhida, é mostrado um alerta na tela e nada disso acontece.

Efeito No Resultado

Logo abaixo da linha que mostra a div com os resultados, entra este código:
$.post("grava-enquete.php", $(this).serialize(), function(retorno){

var total_votos = parseInt(retorno.op01_n) + parseInt(retorno.op02_n) + parseInt(retorno.op03_n);

var porcento1 = Math.round(retorno.op01_n / total_votos * 100);
var porcento2 = Math.round(retorno.op02_n / total_votos * 100);
var porcento3 = Math.round(retorno.op03_n / total_votos * 100);

var resultado = '<div><p>' + retorno.op01 + ' - ' + porcento1 +'%</p></div>';
resultado += '<div><p>' + retorno.op02 + ' - ' + porcento2 +'%</p></div>';
resultado += '<div><p>' + retorno.op03 + ' - ' + porcento3 +'%</p></div>';

$('.resultado-enquete').append(resultado);

$('.resultado-enquete div').eq(0).animate({width: retorno.op01_n +"px"}, 'slow');
$('.resultado-enquete div').eq(1).animate({width: retorno.op02_n +"px"}, 'slow');
$('.resultado-enquete div').eq(2).animate({width: retorno.op03_n +"px"}, 'slow');

$('.resultado-enquete').append("<p>Total de votos: " + total_votos + "</p>");
  
}, "json")



É feita uma requisição POST ao arquivo responsável pela gravação do voto. Antes de enviados, estes dados são serializados com a função serialize(), que simplesmente formata os dados para envio. Isto evita a necessidade de armazenar em uma variável o valor selecionado e passá-la para a função.

Pule para a última linha e veja que o formato dos dados a serem retornado é JSON. Se você ainda não conhece este formato, acesse a página do JSON( http://www.json.org/json-pt.html).

Voltando á primeira linha, a resposta desta submissão é armazenada na variável “retorno”. Simplificando, as variáveis retornadas são:

pergunta – a pergunta da enquete.

op01, op02, op03 – as opções da enquete.

op01_n, op02_n, op03_n – o número de votos das respectivas opções.

Para acessar os valores, basta colocar “retorno.nomedavariavel”. A primeira ação feita com a resposta é a soma dos votos de cada opção. O parseInt() transforma uma string de texto em um numeral inteiro. Sem esta função os números seriam apenas concatenados ao invés de somados.

Nas três linhas seguintes são feitos os cálculos para obter o valor percentual de cada opção e utilizado o Math.round() para arredondar o resultado.

A variável “resultado” recebe as porcentagens e a opção encapsuladas pelas divs e parágrafos e no final este código é anexado à div “resultado-enquete”. Neste momento já estão visíveis os dados de cada opção, mas as barras (formada pelas divs) ainda não, já que definimos na folha de estilo a largura delas como zero.

Para encontrar a div certa a ser animada, utilizamos como elemento chave o seletor eq(), que permite selecionar um elemento conforme sua posição no código. Acabaram de ser anexadas três divs com os valores. Lembra? Cada uma correspondendo a uma opção e valor. Então para selecionar a primeira div, o código fica:
$('.resultado-enquete div').eq(0);

Isso mesmo, a contagem começa do zero.

Utilizando o método animate(), é feita a animação da largura (width) do elemento com o valor a ser alcançado definido pelo número de votos em pixels.

Para finalizar é anexado o total de votos.

Webmaster.pt

Enquete em php com cookie (1 voto por pessoa)

Uma das formas mais comuns de fidelizar o usuário na utilização do website é adicionar uma pergunta, de preferência polêmica, e disponibilizar duas ou três opções de resposta.

Neste primeiro tutorial, vou explicar somente a parte PHP da criação da enquete, o server-side. No próximo tutorial explicarei como apresentar o resultado de forma agradável e dinâmica utilizando o javascript.

O cadastro da pergunta e opções não será abordado neste tutorial por ser a parte mais simples. Vamos nos concentrar nos dados submetidos pelo usuário.

Tabela MySQL

Iniciamos criando os campos que receberão as informações.
CREATE TABLE EXISTS ‘enquete’ (
  ‘id’ int(5) NOT NULL auto_increment,
  ‘pergunta’ varchar(50) NOT NULL,
  ‘op01’ char(32) NOT NULL,
  ‘op01_n’ int(5) NOT NULL default '0',
  ‘op02’ char(32) NOT NULL,
  ‘op02_n’ int(5) NOT NULL default '0',
  ‘op03’ char(32) NOT NULL,
  ‘op03_n` int(5) NOT NULL default '0',
  PRIMARY KEY  (‘id’)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=2 ;



Precisamos de um campo para cadastrar a pergunta, um para cada opção de resposta e um para contabilizar o número de vezes que a opção foi escolhida.

Para agilizar o trabalho, após ter criado a tabela, você pode executar a linha abaixo, que adiciona uma pergunta e as opções.
INSERT INTO ‘enquete’ (‘id’, ‘pergunta’, ‘op01’, ‘op01_n’, ‘op02’, ‘op02_n’, ‘op03’, ‘op03_n’) VALUES
(1, 'Qual linguagem de programação você utiliza?', 'PHP', 0, 'ASP',04, 'Java', 0);



Mostrando A Enquete

Na tela será apresentada a enquete com as informações advindas do banco de dados.

<?php
  mysql_connect("localhost", "usuario", "senha") or trigger_error(mysql_error(),E_USER_ERROR);
  mysql_select_db("bancodedados");
 
  $busca = mysql_query("SELECT * FROM enquete ORDER BY id DESC LIMIT 1") or die(mysql_error());
  if (mysql_num_rows($busca)>0)
  { 
    $enquete = mysql_fetch_array($busca);
    extract($enquete);
?>

<p><?php echo utf8_encode($pergunta);?></p>

<form action="grava-enquete.php" method="post">
  <input type="hidden" name="id_pergunta" value="<?php echo $id;?>" />
  <input type="radio" name="opcao" value="op01" /><?php echo $op01;?><br />
  <input type="radio" name="opcao" value="op02" /><?php echo $op02;?><br />
  <input type="radio" name="opcao" value="op03" /><?php echo $op03;?><br />
    <input type="submit" name="enviar" value="Enviar" />        
</form>

<?php
  } else {
    exit ('<p>Nenhuma enquete cadastrada.</p>');
  }

?>


Como vamos trabalhar com banco de dados, precisamos fornecer as informações para efetuar a conexão. Quando for executar na sua máquina ou outro servidor este código, não esqueça de alterar as informações fornecidas no mysql_connect.

Em seguida é efetuada uma busca na tabela ‘enquete’ e selecionada a última linha. Por isso o “ORDER BY id DESC”. Como o campo ‘id’ é auto incrementável, o último registro será o maior.

Se for encontrado algum registro, sendo assim, maior do que zero, a variável “enquete” recebe uma array com os dados retornados pela busca. A linha de baixo é muito interessante. O extract permite fazer referência às variáveis pelo nome da coluna na tabela de dados.

Desta forma, ao invés de utilizar “$enquete[‘op01’]” podemos utilizar “$op01”.

É mostrada a pergunta e criado o formulário com os valores retornados pela pesquisa. O arquivo que receberá os dados é o “grava-enquete.php” através do método POST.

Um detalhe a observar é o campo com o id da pergunta que esta escondido e será útil no código que grava a opção escolhida pelo visitante. Todos os input radio tem o mesmo nome, mas valores diferentes para que seja possível identificar a opção escolhida.

Um Voto Por IP

Todo desenvolvedor ao criar uma enquete tem a preocupação de não permitir que um mesmo visitante vote múltiplas vezes e desta forma manipule o resultado. A forma mais comum para evitar este problema é a utilização de cookies.

Os cookies são arquivos que contém alguns dados trocados entre o computador do usuário e o servidor Isso permite identificar o usuário.

A função setcookie permite definir nome, dados e tempo de validade destes dados.
setcookie('enquete_php',$_SERVER['REMOTE_ADDR'],time()+86400);

Criamos um cookie com o nome ‘enquete_php’, que contém o endereço ip do usuário e que permanecerá no computador dele por 24 horas. O 86400 são os segundos que compõem o dia.

Antes que algum de vocês se levante para dizer que o cookie pode ser deletado pelo usuário, lembro que a maioria dos usuários nem sabe que eles existem. E os que sabem como deletar teriam que fazer isso para cada voto. E dificilmente uma enquete merece todo esse trabalho.

Recebendo Os Dados

O código somente executa se os dados estão completos e válidos.
if (isset($_COOKIE['enquete_php']))
{
  exit ('<p>Você já votou nesta enquete.</p>'.$_COOKIE['enquete_php']); 
} else {
  setcookie('enquete_php',$_SERVER['REMOTE_ADDR'],time()+86400);
  $opcao = strip_tags($_POST['opcao']);
  $id_pergunta = $_POST['id_pergunta'];
  $id_pergunta = filter_var($id_pergunta, FILTER_SANITIZE_NUMBER_INT);
}



Se um cookie com o nome “enquete_php” já estiver setado, isso significa que o usuário já votou nas últimas 24 horas. Informamos o usuário sobre isso ao mesmo tempo que paramos a execução naquele ponto.

Se o cookie ainda não foi criado, então isto é feito. Com o nome de “enquete_php”, o ip da máquina e válido por 24 horas.

A opção escolhida é recebida e tratada para evitar a tentativa de inserção de código. O id da pergunta também é tratado, mas de uma forma diferente.

Adicionando O Voto

Incluir diversas verificações durante a execução do código ajuda a evitar processamento desnecessário com dados incompletos. Por isso, garantimos que as variáveis que receberam a opção da enquete e o id da pergunta não estão vazias.

Todo o código abaixo é inserido dentro do else da verificação feita acima.
  if ($id_pergunta!='' and $opcao!='')
  {
  mysql_connect("localhost", "usuario", "senha") or trigger_error(mysql_error(),E_USER_ERROR);
  mysql_select_db("bancodedados");

    $consulta = mysql_query("SELECT * FROM enquete WHERE id='$id_pergunta'") or die(mysql_error());
    if (mysql_num_rows($consulta)>0)
    {
      $query = mysql_fetch_array($consulta);
      extract($query);
      switch($opcao)
      {
        case "op01";
        $voto = $op01_n + 1;
        mysql_query("UPDATE enquete SET op01_n='$voto' WHERE id='$id_pergunta'");
        break;
   
        case "op02";
        $voto = $op02_n + 1;
        mysql_query("UPDATE enquete SET op02_n='$voto' WHERE id='$id_pergunta'");
        break;
   
        case "op03";
        $voto = $op03_n + 1;
        mysql_query("UPDATE enquete SET op03_n='$voto' WHERE id='$id_pergunta'");
        break;
      }
    }

Se os dados foram preenchidos é feita a conexão com o banco de dados e realizada uma consulta que procura na tabela um campo de id que tenha o mesmo valor que o id da pergunta submetida.

A pesquisa retornando alguma linha da tabela, o resultado é extraído de maneira que possamos utilizar o nome das colunas como variáveis e estruturamos uma verificação.

Dentre as diversas declarações condicionais disponíveis, considero o switch a melhor quando necessário mais de duas comparações. No início da verificação fornecemos a informação que será comparada com as contidas nos case.

Se fechar com alguma delas, ao número de votos da opção é adicionado mais um. A linha da tabela é atualizada alterando o valor de votos da opção escolhida e a cadeia de verificação é quebrada. Pula para a continuação do código além da verificação.

O Resultado Na Tela

Com o voto adicionado é preciso apresentar ao visitante os resultados da enquete.
  $busca_total = mysql_query("SELECT * FROM enquete WHERE id='$id_pergunta'");
 
  $resultado = mysql_fetch_array($busca_total);
  extract($resultado, EXTR_PREFIX_ALL, 'e');
  $total = $e_op01_n + $e_op02_n + $e_op03_n;
  echo '<p><strong>Obrigado por votar! Veja o resultado parcial:</strong></p>';
   
  echo '<p>'.$e_pergunta.'</p>';
 
  echo '<p>'.$e_op01. ': '.$e_op01_n. ' votos</p>';
  echo '<p>'.$e_op02. ': '.$e_op02_n. ' votos</p>';
  echo '<p>'.$e_op03. ': '.$e_op03_n. ' votos</p>';
  echo '<p>Total de votos: '.$total.'</p>';

É feita uma busca pelos registros com a id da pergunta submetida e extraído o resultado. Como já utilizamos o extract anteriormente no código, para evitar problemas com as variáveis, é adicionado um prefixo nas variáveis extraídas.

Na linha seguinte é criada uma variável para receber a soma dos votos das três opções. Um agradecimento pelo voto é mostrado e segue a pergunta com as opções e os respectivos votos. Finalizando com o total de votos.

Conclusão

O código completo é este
<?php
if (isset($_COOKIE['enquete_php']))
{
  exit ('<p>Você já votou nesta enquete.</p>'.$_COOKIE['enquete_php']);   
} else {
  setcookie('enquete_php',$_SERVER['REMOTE_ADDR'],time()+8640;
  $opcao = strip_tags($_POST['opcao']);
  $id_pergunta = $_POST['id_pergunta'];
  $id_pergunta = filter_var($id_pergunta, FILTER_SANITIZE_NUMBER_INT);
 
  if ($id_pergunta!='' and $opcao!='')
  {
    include('db.php');
    $consulta = mysql_query("SELECT * FROM enquete WHERE id='$id_pergunta'") or die(mysql_error());
    if (mysql_num_rows($consulta)>0)
    {
      $query = mysql_fetch_array($consulta);
      extract($query);
      switch($opcao)
      {
        case "op01";
        $voto = $op01_n + 1;
        mysql_query("UPDATE enquete SET op01_n='$voto' WHERE id='$id_pergunta'");
        break;
   
        case "op02";
        $voto = $op02_n + 1;
        mysql_query("UPDATE enquete SET op02_n='$voto' WHERE id='$id_pergunta'");
        break;
   
        case "op03";
        $voto = $op03_n + 1;
        mysql_query("UPDATE enquete SET op03_n='$voto' WHERE id='$id_pergunta'");
        break;
      }
    }
     
    $busca_total = mysql_query("SELECT * FROM enquete WHERE id='$id_pergunta'");
   
    $resultado = mysql_fetch_array($busca_total);
    extract($resultado, EXTR_PREFIX_ALL, 'e');
    $total = $e_op01_n + $e_op02_n + $e_op03_n;

    echo '<p><strong>Obrigado por votar! Veja o resultado parcial:</strong></p>';
   
    echo '<p>'.$e_pergunta.'</p>';
   
    echo '<p>'.$e_op01. ': '.$e_op01_n. ' votos</p>';
    echo '<p>'.$e_op02. ': '.$e_op02_n. ' votos</p>';
    echo '<p>'.$e_op03. ': '.$e_op03_n. ' votos</p>';
    echo '<p>Total de votos: '.$total.'</p>';
  }
}
?>


Webmaster.pt

terça-feira, 22 de novembro de 2011

iPhone 4S: conversamos com o dono da voz do "Siri" britânico

Jon Briggs, o assistente pessoal da Apple na versão britânica do sistema, conta como foi o trabalho de captação das mais de 5 mil frases



Business Insider
Jon Briggs

Em outubro, o batemos um papo com o Siri, assistente pessoal do iPhone 4S em Londres (Inglaterra). E ficamos intrigados: como será a gravação de algo tão complexo? Quem é o "dono" daquela voz? E mais: como o Siri é um software sem "script" definido, quantas frases e palavras ele precisou gravar?

Pois nós insistimos bastante até descobrir o autor da façanha: a voz da versão britânica do Siri é de Jon Briggs, um famoso locutor britânico que já trabalhou na rádio BBC e hoje empresta sua voz para as emissoras de TV do grupo. Ele reside em Londres e, quando se perde em algum trajeto com seu jeep Range Rover, é guiado por ele mesmo até encontrar o caminho correto - Briggs também é o responsável pelas instruções dos navegadores GPS das marcas TomTom e Garmin. Sua história como "assistente pessoal" da Apple começou de uma maneira não muito convencional - ele nem sabia que estava trabalhando, naquele momento, para este fim. As frases e palavras usadas para o Siri foram captadas há seis anos para uma empresa chamada Scansoft. Essa companhia acabou virando a Nuance Communications, parceira da Apple na criação do Siri, que levou consigo a voz do locutor.

Até o lançamento do iPhone 4S, Briggs não sabia que sua voz comandaria milhões de usuários do Reino Unido. "Eu adoro estar no bolso das pessoas e gosto mais ainda de saber que o sistema ajuda pessoas com deficiências visuais ou de comunicação”, comenta. A seguir, descubra como o locutor e ex-jornalista de tecnologia se transformou no Daniel, o "assistente pessoal" do iPhone 4S britânico.

OD - Quantas frases ou palavras você gravou? E quanto tempo demorou?

Jon Briggs - Foram cerca de cinco mil frases, algumas com pontuação e outras sem. Algumas delas tinham o comprimento dessa frase que acabei de falar. Em relação ao tempo, foram cerca de três semanas de gravação mais alguns dias de atualizações.

OD - Você finalizou as gravações em uma única etapa?

JB - Assim que a voz, chamada de Daniel, estava disponível ela não foi mais atualizada. Já as gravações para os sistemas de GPS tiveram que ganhar cerca de 200 a 1500 instruções exclusivas para cada marca ou personalização.

OD - Como eles escolheram as sentenças a serem gravadas?

JB - Eu suponho que a Nuance tenha escolhido os mais diversos fonemas. O objetivo é criar um discurso bem natural. A minha voz, aparentemente, funciona bem para esse tipo de coisa, pois eu li sem grandes problemas. O inglês é um idioma bem difícil para um computador. Veja essa frase, por exemplo: "My latest project is to learn how to project my voice" [Meu último projeto foi aprender como projetar minha voz]. É possível ver que usamos a mesma palavra duas vezes e que se escrevem da mesma maneira, mas os significados são diferentes e se pronunciam de forma diferente em cada ocasião. O Siri é capaz de fazer essa diferenciação.

OD - Como você sabia as entonações das frases?

JB - Havia pouca entonação. As leituras tinham que ser mais insípidas e leves. Apenas algumas sentenças precisavam ser mais empostadas.

OD - Você gravou uma frase após a outra ou foi como uma conversação?

JB - Cada frase foi gravada separadamente e só existiam pausas na pontuação. Elas não eram lidas como seriam normalmente. Imagine ler uma frase pausando apenas nas pontuações. É realmente difícil. A Scansoft providenciou um roteiro com as cinco mil frases.

OD - As gravações aconteceram em um estúdio?

JB - Sim. Eu estava em meu estúdio, em Londres, que era ligado a um estúdio nos Estados Unidos, onde a Scansoft ficava localizada. Eles gravavam minha voz nos Estados Unidos, e eu fazia o backup no meu estúdio como forma de segurança.

OD - Como as frases são combinadas?

JB - É possível fazer isso de diversas formas, mas não é simplesmente pegá-las e grudá-las. Eles usam fonemas, difonemas, sílabas, palavras e frases individuais e criam um banco de dados com todos os sons necessários para se reproduzir a fala humana.

OD - Qual é a sensação de ser o "assistente pessoal" de tantas pessoas?

JB - É ótimo! É bom saber que contribuí com o sistema de fala de uma companhia que se orgulha de ter criado uma tecnologia tão brilhante. E fico feliz que minha voz tenha sido escolhida para se tornar parte do cotidiano de tantas pessoas. Eu adoro estar no bolso das pessoas e gosto mais ainda de saber que o sistema ajuda pessoas com deficiências visuais ou de comunicação.

OD - Porque você aceitou o trabalho? Você recebeu um bom dinheiro?

JB - Eu sou locutor e esse foi mais uma trabalho normal que fiz. Eu não tinha ideia de onde estas frases seriam usadas ou onde acabariam. E a remuneração foi normal, dentro dos padrões para esse tipo de trabalho.

OD - Você não se importou que sua voz tenha sido usada em outro programa sem seu consentimento? Pretende fazer algo sobre isso?

JB - Não e também não gostaria de falar mais sobre isso. (N.E.: a Apple pediu que ele nunca se identificasse como o dono da voz do Siri britânico, mas Briggs encontrou uma saída: ele assinou contrato com a Scansoft, e não a Apple. Assim, conseguiu driblar a legislação e afirmar, publicamente, que sua voz era a utilizada no assistente pessoal).

OD - O que você acha do Siri?

JB - Eu amo o senso de humor dele e amo os produtos da Apple. Eu sou cliente deles desde 1980, quando as pessoas que tinham os produtos da empresa eram vistos como "estranhos". Eu ainda tenho um Macintosh SE, que fica na minha casa como um lembrete de que a tecnologia não para de avançar. No meu estúdio, eu realizo todo o meu trabalho de áudio com dois iMacs. Eu acredito que o iPhone mudou a indústria móvel do mundo e o Siri será o próximo grande transformador.

OD - Que tipo de trabalho você tem feito atualmente?

JB - Eu ainda trabalho com rádio e TV, incluindo o programa de quizz da BBC. Também dou palestras em conferências e trabalho como apresentador de eventos. Eu também tenho uma agência de dublagem, chamada Excelent Talent, há 15 anos.



















Fonte: Olhar Digital

4G Americas quer decisão “supranacional” sobre faixa de 700 MHz na América Latina

A 4G Americas, que representa teles e fabricantes de equipamentos interessados em explorar operações de LTE, fez nesta terça-feira, 22/11, uma defesa da alocação, para esse serviço, do dividendo digital – ou seja, a faixa de 700 MHz a ser “liberada” com a migração para a TV Digital.

“Nos Estados Unidos, onde os 700 MHz já são usados em LTE, existem 3 milhões de assinantes, o que dá escala nessa faixa”, sustentou o diretor da 4G Americas para a América Latina e Caribe, Erasmo Rojas. A entidade lamentou a “demora” de vários países da região para completarem o “apagão analógico” – o fim da migração para a TV Digital – e pediu “medidas urgentes” para “assegurar o espectro necessário”.

Embora sem citar diretamente o Brasil, que vem reiteradamente adiando qualquer decisão sobre o uso da faixa de 700 MHz, a 4G Americas defendeu a criação de um “órgão supranacional” para tratar da harmonização de frequências na região.

Nessa linha, também defendeu o fim dos limites de espectro por empresa e a eliminação do uso de frequências não licenciadas – a não ser em faixas acima dos 5 GHz. E, curiosamente, sustentou que o aumento da concentração no setor é benéfico.

“Pode haver reduções de custos com ganhos de eficiência e escala”, sustentou o consultor Jose Otero, da Signals Telecom. “O ideal é que a América Latina harmonize o uso da faixa de 700 MHz com os Estados Unidos”, emendou Rojas. A defesa da harmonização do espectro na região já tinha sido feita pela Qualcomm, em teleconferência com a imprensa, realizada na semana passada.










Fonte: Convergência Digital

Mulher coloca o próprio marido à venda por ser viciado em Call of Duty

A americana Alyse Baddley, 21 anos, publicou recentemente um anúncio inusitado no site de classificados Craigslist. De acordo com a postagem, a jovem colocou à venda o próprio marido Kyle Baddley, de 22 anos que, segundo ela, passou três dias seguidos jogando Call of Duty: Modern Warfare 3 logo após o lançamento, em 8 de novembro.

"Estou vendendo meu marido de 22 anos. Ele gosta de comer e jogar videogames o dia inteiro. Fácil de alimentá-lo, apenas com água e comida a cada 3 ou 5 horas. Você precisa ter internet e espaço para games. Cansei de esperar por um tempo livre com ele em nossa casa. Se você tiver algo a oferecer, podemos combinar uma troca para fechar a venda", diz o anúncio de Alyse no Craigslist.

Kyle, que era soldado no Afeganistão, foi dispensado há pouco tempo do serviço militar devido a uma lesão. O jovem explica que usa o game para se manter ligado aos amigos que ainda servem no exterior.

Mas tudo não passou de uma brincadeira, e a própria Alyse se disse surpresa com as respostas e ofertas dadas ao anúncio, que vão desde um saco de balas até a de um homem que prefere ler a jogar videogame. Já outras pessoas parecem ter levado a sério essa história ao oferecerem aconselhamento conjugal por e-mail.

Mas, ao que parece, a proposta de Alyse deu certo, e seu marido Kyle diminuiu o tempo que passa jogando Modern Warfare 3. O casal, agora, vai viajar pela Flórida para passar o feriado norte-americano de Ação de Graças com amigos e familiares.

Call of Duty: Modern Warfare 3 tem sido um dos assuntos mais comentados do ano, não só pelos números impressionantes de vendas - cerca de R$ 1,3 bilhão em apenas cinco dias -, mas também por fatos curiosos envolvendo o game. Um deles foi quando um homem tentou roubar uma cópia do jogo na rede norte-americana de lojas GameStop, horas antes de ser lançado. Já na Europa, ladrões franceses levaram seis mil cópias do título de um caminhão responsável pelo transporte dos games.













Fonte: Olhar Digital

 

Related Posts with Thumbnails