IPhone 4 8GB – Grátis (bem você sabe que não é…)

Parece que começaram a surgir as primeiras fotos do IPhone 4 de 8GB montado no Brasil e algumas operadoras estão oferecendo ele por R$ 0,00.

Você sabe que paga por ele no plano, mas …. Pelo menos não estamos dando dinheiro para os chineses (quer dizer, alguma coisa sim, sabe como é, nós não fabricamos chips…)

A informação é da MacMagazine

Windows Phone 7.5 (Mango), impressões de um usuário

Este post vai ser um pouco diferente. Primeiro por não ser escrito pelo editores tradicionais do blog mas sim por um de nossos leitores, o Mark Bierast. E, segundo, por não se tratar de um review, mas da impressão de uso dele do sistema WP7.  Gostaria de agrader antecipamente ao Mark pelo tempo investido em escrever e compartilhar este texto com todos nós. Espero que venham outros ! Com vocês, Mark Bierast.

——

Este post não se trata de um review do Windows Phone. Como existem hoje vários aparelhos rodando Windows Phone, não seria justo focar em apenas um. A ideia do post é compartilhar a impressão do sistema, após alguns dias de uso. Vocês provavelmente não me conhecem, mas sou um usuário de longa data do iOS, tendo começado com o iPhone 3G, depois o 3GS e finalmente o iPhone 4.

Então, como explicar então um usuário de iOs comentando sobre Windows Phone? Simples, antes de mais nada, não sou fanático por nenhum sistema ou marca, sou um entusiasta de tecnologia em geral, principalmente em dispositivos móveis. Atualmente tenho em casa um iPhone 4, um Nokia E5 e, a última aquisição, um HTC Trophy rodando Windows Phone 7.5 (Mango), sobre  qual vou escrever um pouco aqui.

Desde o lançamento do WP, venho prestando atenção no sistema e lendo sobre ele na internet, já que me pareceu algo bem diferente de iOS ou Android (sim, já usei bastante o Android também, sendo que o último aparelho foi um Samsung Nexus S Branco, lindão) e muito embora os usuários detestem admitir, acho os dois sistemas (iOS e Android) muito parecidos, tanto em funcionalidades quanto em interface. Na minha opinião, ambos são uma evolução da interface do Palm OS, sistema que deu origem a minha paixão pela área (comecei com um  um Pilot e usei até o Tungsten). Quando digo interface me refiro à lógica de apresentar vários ícones, um ao lado do outro, que abrem aplicações ao serem tocados.

Embora funcionem muito bem, ambos os sistemas acabam tendo a mesma forma de operação, diferindo nos detalhes. Por exemplo, um tem widgets e outro não, em um pode-se personalizar a Lock Screen e no outro não, etc. No entanto, isto não altera o mecanismo fundamental de operação,  ambos tem vários ícones que abrem aplicações ao serem tocados.

Diante desta “mesmice”, eu achei o Windows Phone como um sistema com personalidade própria e, após algum tempo de uso, posso afirmar que ele é bem diferente no funcionamento também. A melhor explicação para diferenciar os sistemas que encontrei foi em um podcast que costumo ouvir (crédito ao Coca Tech e ao apresentador Gustavo Faria) onde ele dizia, em linhas gerais, que enquanto o Android e iOs funcionam basicamente focados em aplicações enquanto que o WP funciona em cima da pessoa, da comunicação online e todas suas vertentes. Entenderam? Não? Eu explico.

Ao ligar o Windows Phone, pode parecer bem esquisito, mas ele pede a sua ID do Windows Live (coisa que não tenho). Pulei essa parte e pensei ”droga, já não vai funcionar direito”. Ledo engano! Ele ligou e então fui explorar um pouco o sistema e me acostumar um pouco mais com os “quadradinhos” (tiles, em inglês e que a Microsoft traduziu como “blocos dinâmicos”) da tela inicial do sistema. Vocês podem pensar nela como a tela inicial do Android, pois é a que fica antes da tela dos aplicativos. Até aí, tudo bem, o sistema de organizar os blocos dinâmicos é muito parecido com o Android ou iOS. Basta tocar e deixar o dedo e pronto, pode-se mudar a posição deles. Alguns tem animações, como os dos contatos, da aplicação “EU”, que falo daqui a pouco, e aplicações de terceiros também, como o Foursquare, previsão do tempo, entre outros.

 

Blocos dinâmicos do WP7

Mas voltemos a minha descoberta. Tratei logo configurar o Mail, coloquei minha conta do Gmail lá, ele aceitou de primeira e já começou a sincronizar. No entanto, quando saio do aplicativo de volta a “home”… meu bloco dinâmico dos contatos estava com várias fotos que tenho salvo nos contatos do Google rodando na tela principal. Ou seja, ele puxou os contatos do Google e já estavam no telefone. Vocês podem pensar: “grande coisa, meu Android faz isso desde sempre”. Mas a questão é essa, não é um Android com a alma do Google, isso aqui tem alma Microsoft. Eu gostei. Depois fui visitar o Marketplace para ver a quantas anda e,  aí sim, tive que criar um ID da Microsoft, pois sem ele nada de loja. No fundo isso se resumiu a criar um email no hotmail e funcionou a contento.

Com o acesso ao Marketplace ok, fui explorar a lojinha do Balmer. A primeira coisa que procurei foi o Twitter. E lá estava ele, embora muitos me falassem que não estava na loja aqui do Brasil, ele existia sim, apesar de todo em inglês, mas disponível. Baixei. Nada diferente dos demais sistemas. Tocou em cima, autorizou. Ele instala, sem sustos nem mistérios.

Após instalar, lá vou eu configurar o dito cujo. Tranquilo, configurou de primeira e permanece funcionando aqui. O que senti falta? Das notificações! O aplicativo não fornece atualizações automáticas, não avisa quando chega uma mensagem direta (DM), não avisa menções, nada. Mas para isso temos o aplicativo nativo “EU” que é mais um quadradinho na tela inicial e que eu não tinha a menor ideia para que servia. Mas pensando logicamente, imaginei que se ele puxou todos meus contatos do Google, deveria funcionar da mesma forma com os demais serviços que uso na Internet. E é isso mesmo, cliquei no dito cujo e ele pede para configurar quase tudo que se usa socialmente na Internet, como Twitter, Facebook, Gmail, tudo. Lá fui eu autorizar a Microsoft a ver todos meus dados online e, após configurar tudo, outra surpresa. O aplicativo é um agregador de tudo relacionado a você nessas redes, ele avisa (sim, no bloco dinâmico e na aplicação) que você foi mencionado aqui, que publicaram algo no Facebook relativo a sua conta acolá, e por aí vai. Um resumo bacana, já que tudo o que ele mostra é relativo de alguma forma a você, não à sua timeline toda.  Mais foco e menos perda de tempo, na minha opinião.

Agregação do "EU"

Foi aí que comecei a entender o funcionamento do Windows Phone e a proposta dele. Focar no usuário, não na Internet toda. É claro que ele tem um navegador, tem os aplicativos como os outros sistemas, mas todo o foco é em cima do usuário do smartphone. Ou seja, para quem gosta de interagir na Internet é perfeito, o aplicativo nativo EU deixa isso muito claro.

 

EU, foco no usuário

Mas como não só de redes sociais vive o usuário, vamos em frente. Outra coisa que sempre gostei no iOS e que me prende a ele é o Itunes. Tem quem deteste, mas eu sempre gostei, seja pela obrigação de ter minhas músicas e principalmente meus podcasts (sou viciado em podcasts) organizados, gerenciados de uma forma bem organizada. Isto representa grande parte do meu uso no iPhone. Como gosto de fazer caminhadas e academia, ele sempre foi meu companheiro nessas horas. Quando se pratica esportes, quanto menos aparelhos se leva, melhor. Então nada de levar iPod, celular, carteira, etc. Prefiro um aparelho que agregue tudo, é mais prático.

Mas, e agora? Poxa, iTunes lembra Apple, que lembra iOS, que lembra iPhone, correto? Errado! O Windows Phone se conecta com o iTunes perfeitamente, sem gambiarras, sem “jeitinho”, basta baixar o Conector para Mac no site do Windows Phone, marcar o que quer sincronizar, sejam músicas, Podcasts, Vídeos, Fotos (ele manda as fotos para o iPhoto) e pronto. Espetou o WP no Mac (sim, aqui um detalhe, uso Mac em casa como meu computador principal) e ele já começa a sincronia perfeitamente, desconectou, está tudo no WP. Ouviu um Podcast? Ele exclui na próxima sincronia, igual ao iPhone. Ou seja, não tive nenhum contato com o programa Zune que é necessário para sincronizar o WP no PC. Eu diria que é mais fácil ele interagir com o Mac que com o próprio Windows. Estranho, mas é assim, da mesma forma que eu usava o iTunes no Windows sem problemas.. Na minha opinião, uma ótima sacada da Microsoft, não colocando empecilho tanto na sincronia com o Mac como na sincronia com o Google. Sem dúvidas isso pesou muito para eu gostar do sistema, já que eu não tenho preconceito com nenhuma plataforma, não quero que meu gadget tenha também.

As fotos, sim, as fotos! Isso vai depender muito do aparelho, lentes, etc, então vamos focar no aplicativo, não na qualidade delas ok? Como já tinha me cadastrado em tudo que é lugar no “EU”, assim que a foto é tirada, podemos escolher para onde mandar. Facebook? Fácil, Twitter? Idem. Email? Melhor ainda. Mais uma vez ele mostra toda sua rede pessoal e é só escolher. Clicou, tá lá, e faz isso bem rápido (igual ao iPhone, mesma velocidade). Muito prático também.

Da mesma forma que quando acessamos os contatos, ele já “puxou” os dados dele, então vão aparecer as opções para contatar a pessoa: Facebook, Celular, Casa, email, etc. Tudo comum clique.

As configurações do aparelho em si também são bem simples, sem nenhum mistério. Mas ele não permite muita personalização. A tela de bloqueio é ela mesmo e pronto, no máximo mudar o papel de parede. Pode-se mudar as cores do quadradinho e não muita coisa além disso. É claro, é possível personalizar os avisos, toques, etc, mas nem perto do que os mais nerds fazem com os Androids e afins (imaginem ainda o finado N900, o rei das personalizações).

 

Tela de entrada das configurações

O sistema em si é rápido e fluído, mesmo o Trophy sendo um dos primeiros aparelhos a vir com o Windows Phone embarcado e recebendo o update para o Mango,  ele está muito rápido e fluído. Em meus cinco dias de uso, não tive nenhuma travada, nenhuma reinicialização, nada do tipo, mas assim como qualquer smartphone, ele também gasta muita bateria. Mas me surpreendi ao chegar ao final do dia com cerca de 30% de bateria para o meu uso. Em geral fico conectado direto, com WiFi habilitado e 3G também, usando por cerca de 2h/dia de MP3 (olha os podcasts aqui).

Ele tem um GPS bem competente também, muito embora ainda não tenham mapas para o Brasil, a dona Nokia com o Lumia 800 e seu Nokia Drive deve mudar isso bem em breve. No Foursquare ou RunKeeper (sim, ele existe para WP já) ele fica bem rápido e com uma boa precisão aqui.

Agora, a pergunta que todos me fazem: ele é melhor que o Android? Que o iOS? Vai mudar do iOS para ele? Bom, eu diria que desde que passei a usar o Windows Phone, meu chip principal ficou nele, não voltou ao iPhone. Mas claro que cada usuário tem seu uso específico e isso é o que acaba pesando na escolha do aparelho. O sistema tem me suprido muito bem em minhas necessidades móveis e não senti falta de algo que me fizesse correr de volta ao iPhone, coisa que ocorreu em mais ou menos dois dias com o Android. Mas, como eu disse, esta decisão é completamente dependente do seu uso.

Hoje, como o Windows Phone é mais focado especificamente em minhas atividades na Internet, eu passo menos tempo com o smartphone na mão, o que me rende mais tempo com outras coisas, o que não deixa de ser bom também. Mas bem que podiam implementar algumas notificações a mais, não é Microsoft? Quem sabe na próxima atualização, pois na última (esta semana) já posso usá-lo como hotspot WiFi e o Marketplace, cresce todo santo dia.

Acho que com isso demos uma boa “pincelada” inicial no sistema, pelo menos na parte nativa dele. Existe muito mais a respeito dele a ser dito, mas caso gostem e meu amigo Marcelo me convide novamente, podemos falar sobre a loja e alguns aplicativos em especifico. É só comentarem o post !

Abração pessoal, e foi um prazer.

Como não fazer um curriculum para vaga de TI (e vagas em geral)

Continuando a minha saga de procurar funcionários faço agora um apelo patético: pelo menos faça um curriculum decente!

A razão de ser deste apelo é o fato de que muitos curriculum que recebi são terríveis, tanto na forma como no conteúdo, aqui vão algumas dicas:

1) Eu não quero saber sobre o seu físico: não coloque, moreno, 1,80m, 78kg. Isso não é vaga para modelo, é para desenvolvedor. Não nenhum motivo na face da terra que faça com que uma criatura coloque seus atributos físicos ao se candidatar a uma vaga de TI.

2) Não quero ver sua foto. Foto você põe no seu Orkut e no seu Facebook. No curriculum foto é brega. Isto não é ficha policial, nem concurso de beleza. Colocar sua cara tira o foco do que você sabe.

3) Curriculum não é sopa de letrinhas: não encha de siglas de coisas que você apenas viu uma vez na vida: PHP, LAMP, HL7, JDO, JDBC, ODBC, OPQP, CA4, CNSC, FDPS, etc. Foque nas coisas que você realmente quer destacar para aquela vaga.

4) Eu não quero saber se você passou sete anos no Tibet. Nem se você coleciona tampinhas de refrigerante Armênio. Seus hobbies são algo que você pode mencionar SE for relevante para a vaga. Se eu chamar você para uma vaga em TI e você disser que tem como hobby fazer railgun, provavelmente vai me interessar e seu curriculum vai se destacar. Se disser que passou sete anos no Tibet, seu curriculum vai para /dev/null

5) Não diga que você sabe algo que não sabe. Isto pode fazer com que a entrevista fique bem desconfortável. Você diz que sabe C++ avançado e não conhece a STL ou não sabe implementar um algoritmo simples em C++ com Templates. O mínimo que pode acontecer é a entrevista encerrar na hora e você perder o seu tempo e o meu. Pense bem no que você realmente sabe.

6) Não é porque no seu estágio anterior havia um cara cujo primo tinha um amigo cujo professor uma vez programou em Erlang que você vai colocar experiência em Erlang. Seja honesto. Coloque a experiência que você realmente teve. Lembre-se que o entrevistador tem como saber se você está enrrolando.

7) Não mande o curriculum do e-mail da sua empresa atual, menos ainda se for com o logo dela na assinatura e um disclaimer dizendo que o e-mail é para uso exclusivo da corporação. Isto mostra que você não tem apreço pelo seu trabalho atual e provavelmente não terá no que estou oferecendo.

8) Algumas experiências profissionais, embora tenham sido boas para sua vida não acrescentam no curriculum vitae em uma vaga de TI. Você foi padeiro, fico feliz, e é uma profissão muito útil e honesta. Mas não me adiciona informação. Coisas assim você pode deixar para falar na entrevista se houver clima.

9) Não me interessa saber se você tem carteira de motorista. Não estou contratando você para dirigir para mim.

10) Envie seu curriculum para vagas que você está preparado para exercer. Se você terminou o ensino médio, e está fazendo cursinho, por favor, não envie seu curriculum se candidatando a uma vaga de desenvolvedor C++ especializado em Mecânica Quântica. O tempo que eu levo para deletar seu e-mail aumenta o aquecimento global.

Um curriculum bem feito, breve e focado na vaga a qual você está se candidatando, mostra que você realmente quer aquele emprego e que você tem consideração pela pessoa que está organizando o processo seletivo. Isto ajudará muito em sua carreira.

Salvando a tela do seu Galaxy Tab 10.1 da famosa “mancha de óleo”

Parece ser um problema recorrente ter uma mancha parecida com uma mancha de óleo na tela do Galaxy Tab, como essa abaixo:

A mancha é muito mais visível ao vivo. Nessa foto ela está entre os dois reflexos de luminária.
A mancha é muito mais visível ao vivo. Nessa foto ela está entre os dois reflexos de luminária.

Se seu aparelho é nacional e está na garantia, parece que a Samsung troca. Tenho meus pés atrás com qualquer garantia nesse país, mas tudo bem.

Caso seu aparelho não esteja mais na garantia a Samsung vai cobrar pelo conserto. Caso tenha comprado fora do país eles nem mexem no aparelho (a Nokia faz o mesmo e outras empresas também). Se um desses for o seu caso veja como resolver o problema no blog do Alexandre Novello. O aparelho dele ficou assim:

Agora sem a mancha. (Não reparem no banco da praça) :)
Agora sem a mancha. (Não reparem no banco da praça)

O post que ele conta como tirou a mancha é esse.

Abelhas Estressadas será o novo Tiny Wings

Ontem foi lançado na AppStore aquele, que na minha opinião, será o novo Tiny Wings. Digo isto pelos seguintes motivos:

  • Desenvolvido por duas pessoas (o Tiny Wings é de um cara só)
  • Com um único comando, touch and hold.
  • Muito bonito gráficamente
  • Com níveis bem desafiadores.

Chama-se Abelhas Estressadas

Mas ele tam algumas vantagens: está disponível para iOS e em breve para Android, é grátis até o nível 13 (de um total de 75) e na minha opinião é mais interessante que o Tiny Wings.

Disponível na loja AppStore Br: http://migre.me/6bgsl

Tem um hotsite legal também: http://www.bytepronto.com.br/abelhasestressadas/

Parabéns aos criadores: Dario e Daniel

Escrever código porco ajuda a ganhar este prêmio

The International Obfuscated C Code Contest é um concurso em que vence aquele que escrever o código C mais difícil de se ler e que faça uma coisa útil.

Por incrível que pareça não é uma tarefa tão simples, veja um dos ganhadores da última edição (2006)

#define			      q [v+a]
#define			     c b[1]
#define			    O 1 q
#define			   o 0 q
#define			  r(v,a\
)v<0&&(			 v*=-1,		a*=-1);
#define			p(v,m,	    s,w)*c==*#v?2 q\
<m?(c++		       ,d=1,3	   q=0,5      q=m,main\
(a+3,b)		      ,o=o*s	 q,O=O*		 w q):0:
static		     d,v[99	];main		  (int a,
char**b		    ){d=7;     if(*c?!		  (p(+,3
,4 q+O*		   3,4)p(			   -,(o?3
:(O=1,6		  )),4 q			  -O*3,4)
p(*,4,3		 ,4)p(/				  ,5,4,3)
p((),d,		0+3,0+				 04)*c==
')'?2 q	       <02?(c				++,0):0
:(o=012	      *o+*c-			      '0',c++
,O=1)):	     2 q?3-			   2:printf(
"%d/%d"	    "\n",o		       ,O))return
1;d=a,r    (o,d)r		     (O,d)3 q
=o<O?(4	  q=o,O)		   :(4 q=O,
	 o);r(d,		 o)a+=3;O?
				 1:(O=1,2
				q=1);while
				(2 q=o%1 q)a++;v[d]/=O;d[
				v+1]/=O;return main(d,b);}

Acho que pode ser divertido …

Dois desenhos animados que formaram uma geração tecnológica

Ao ver as crianças serem demenciadas por desenhos como Bob Esponja, Ben 10 e outras baboseiras resolvi fazer este post para homenagear dois desenhos animados dos anos 80 que moldaram uma geração tecnológica no Brasil: O Pirata do Espaço e a Patrulha Estelar.

Radar, Laser, Foguetes, Computadores, tudo isto mexeu com a imaginação de muitas crianças naqueles anos e estimulou vários deles a se interessar por tecnologia.





Aqui vai uma recordação, se você sentir um nó na garganta ou deixar uma lágrima correr (não que eu tenha feito isto, que conste em ofício) não se assuste, você não está ficando velho, apenas os criadores de desenhos animados atuais não tem cabeça nem coração.

Bom feriado!

Pirata do Espaço Joe e Rita, Groizer X

Adobe vai descontinuar o Flash para dispositivos móveis.

É curioso que, logo depois de um post sobre os problemas do Flash com os browsers de desktops e notebooks, eu venha aqui dar a notícia de que a Adobe vai parar de desenvolver o Flash para dispositivos móveis.

Ontem eles anunciaram que não vão mais desenvolver o plugin para browsers móveis e vão focar no desenvolvimento de soluções baseadas em HTML5.

“O HTML5 é agora universalmente suportado pelos aparelhos portáteis, e, em alguns casos, exclusivamente. Isso faz do HTML5 a melhor solução para criação e exibição de conteúdo em navegadores de plataformas móveis.”, escreveu Danny Winokur, vice-presidente e gerente-geral de desenvolvimento interativo da Adobe.“Daqui pra frente, nosso trabalho com o Flash será focado em permitir a desenvolvedores Flash criar apps nativos com Adobe AIR para as principais lojas de aplicativos.”

Para os fanáticos desenvolvedores de joguinhos em Flash para celular, isso é um balde de água fria. Para os desenvolvedores de aplicativos nativos, isso é um alento. Para os usuários, isso é a melhor coisa que aconteceu, já que mesmo nos dispositivos móveis que tinham plugin para Flash, o desempenho dele era péssimo.

Concordo plenamente com o VP da Adobe quando ele diz que precisa focar no Flash para o Adobe AIR. Isso é agora a melhor plataforma da Adobe. Fazer aplicativos que funcionem bem em PC/Mac/Linux em Adobe AIR é mil vezes mais simples do que qualquer solução em Java, Qt, GTK+ ou outro framework/linguagem multi-plataforma. Já fiz alguns programas muito legais com o AIR, que demorariam bem mais para serem feitos em Java, ou Qt, por exemplo.

Parabéns para a Adobe pela coragem de dar esse passo! Agora, para ficarem perfeitos, só precisam baixar os preços do Photoshop para eu poder parar de usar o Gimp ou o Acorn no Mac. 😀

Chrome + Flash = Crash (Update: Não é só o Chrome)

Estou há dias (ou mais de um mês, se bobear) sem poder usar o Chrome porque todo site que use flash faz o bendito plugin dar um erro na minha cara. Como esse aí embaixo:

Não reparem no endereço do “Banco Maldito” na barra, o que interessa é o erro do Flash.

Além disso, todos os lugares onde o existe um item em flash, ficam dessa forma:

Já tentei de tudo, desinstalei o Flash e instalei novamente; desinstalei o Chrome e instalei novamente; desinstalei o Chrome e instalei a versão beta; desinstalei a versão beta e instalei a versão alpha; bloqueei a versão do plugin que vem com o Chrome e testei só com o plugin baixado; bloqueei a versão baixada do plugin e e testei só com com o plugin nativo do Chrome… NADA! Sempre o mesmo resultado.

Numa rápida pesquisa com os seguidores do Twitter, reparei que isso não é privilégio dos usuários do Mac. Tanto no Mac quanto no Windows o problema acontece.

Tentei voltar para o Firefox, mas não aguentei a lerdeza dele. Agora estou usando o Safari novamente.

Alguém aí tem alguma sugestão para tentar resolver o problema? Leia acima o que eu já fiz antes de sugerir, por favor.

ATUALIZAÇÃO DO POST: Agora o erro também acontece no Safari e no Firefox… Algo me diz que o problema é no próprio Flash.

Números primos e algoritmos – Parte III (final)

Hoje mostraremos algoritmos que são rápidos e determinísticos (ou seja, sempre indicam correto se o número é primo ou não), alguns destes foram desenvolvidos no ano de 1983, no entanto em 2002 foi mostrado pela primeira vez um algoritmo, chamado AKS, para encontrar números primos que reunia as seguintes características:

  • Geral: para qualquer tipo de número primo e não apenas para alguns subconjuntos de primos.
  • Tempo Polinomial: com relação ao número de dígitos.
  • Determinístico
  • Incondícional: Ou seja, foi provado que o algoritmo não depende de nenhuma conjectura.

O teorema sobre o qual o algoritmo AKS se sustenta é uma generalização do pequeno teorema de Fermat que mostramos na semana passada.

pow ((x-a),n) % pow(x,n)-a = n

Onde n é o número primo e a é um primo em comum com n.

Abaixo vai uma das possíveis implementações dele:

#include <iostream>
using namespace std;
#include <math.h>
 
#ifdef _M_IX86
 
#define umulrem(z, x, y, m)	\
__asm	mov		eax, x	\
__asm	mul		y	\
__asm	div		m	\
__asm	mov		z, edx
 
#define umuladdrem(z, x, y, a, m)	\
__asm	mov		eax, x	\
__asm	mul		y	\
__asm	add		eax, a	\
__asm	adc		edx, 0	\
__asm	div		m	\
__asm	mov		z, edx
 
#else
 
#ifdef _MSC_VER
typedef unsigned __int64	Tu64;
#else
typedef unsigned long long	Tu64;
#endif
 
#define umulrem(z, x, y, m)	\
	{	\
	z = (unsigned int)(x * (Tu64)y % m);	\
	}
 
#define umuladdrem(z, x, y, a, m)	\
	{	\
	z = (unsigned int)((x * (Tu64)y + a) % m);	\
	}
 
#endif
 
static bool IsPrime(unsigned int n)
{
	if (n < 2) return false;
	if (n < 4) return true;
	if (n % 2 == 0) return false;
 
	const unsigned int iMax = (int)sqrt(n) + 1;
	unsigned int i;
	for (i = 3; i <= iMax; i += 2)
		if (n % i == 0)
			return false;
 
	return true;
}
 
static unsigned int LargestPrimeFactor(unsigned int n)
{
	if (n < 2) return 1;
 
	unsigned int r = n, p;
	if (r % 2 == 0)
	{
		p = 2;
		do { r /= 2; } while (r % 2 == 0);
	}
	unsigned int i;
	for (i = 3; i <= r; i += 2)
	{
		if (r % i == 0)
		{
			p = i;
			do { r /= i; } while (r % i == 0);
		}
	}
	return p;
}
 
static unsigned int Powm(unsigned int n, unsigned int e, unsigned int m)
{
	unsigned int r = 1;
	unsigned int t = n % m;
	unsigned int i;
	for (i = e; i != 0; i /= 2)
	{
		if (i % 2 != 0)
		{
			umulrem(r, r, t, m);
		}
		umulrem(t, t, t, m);
	}
	return r;
}
 
static unsigned int Inv(unsigned int n, unsigned int m)
{
	unsigned int a = n, b = m;
	int u = 1, v = 0;
	do
	{
		const unsigned int q = a / b;
 
		const unsigned int t1 = a - q*b;
		a = b;
		b = t1;
 
		const int t2 = u - (int)q*v;
		u = v;
		v = t2;
	} while (b != 0);
	if (a != 1) u = 0;
	if (u < 0) u += m;
	return u;
}
 
class CPolyMod
{
protected:
	// (mod x^r - 1, n)
	const unsigned int m_r;
	const unsigned int m_n;
	unsigned int m_deg;
	unsigned int * mp_a;
 
private:
	CPolyMod():m_r(0), m_n(0) { mp_a = NULL; };
 
public:
	// default value is x
	CPolyMod(unsigned int r, unsigned int n)
		: m_r(r), m_n(n)
	{
		m_deg = 1;
		mp_a = new unsigned int [2];
		mp_a[0] = 0; mp_a[1] = 1;
	}
 
	CPolyMod(const CPolyMod & p)
		: m_r(p.m_r), m_n(p.m_n)
	{
		m_deg = p.m_deg;
		mp_a = new unsigned int [p.m_deg + 1];
		unsigned int i;
		for (i = 0; i <= p.m_deg; ++i)
			mp_a[i] = p.mp_a[i];
	}
 
	virtual ~CPolyMod()
	{
		if (mp_a != NULL)
			delete [] mp_a;
	}
 
private:
	void _polySquare()
	{
		const unsigned int deg = m_deg;
		const unsigned int n = m_n;
		const unsigned int * const p_a = mp_a;
 
		const unsigned int degr = deg + deg;
		unsigned int * const p_ar = new unsigned int [degr + 1];
		unsigned int k;
		for (k = 0; k <= degr; ++k)
			p_ar[k] = 0;
 
		unsigned int j;
		for (j = 1; j <= deg; ++j)
		{
			const unsigned int x = p_a[j];
			if (x != 0)
			{
				unsigned int i;
				for (i = 0; i < j; ++i)
				{
					const unsigned int y = 2 * p_a[i];
					unsigned int t = p_ar[j + i];
					umuladdrem(t, x, y, t, n);
					p_ar[j + i] = t;
				}
			}
		}
		unsigned int i;
		for (i = 0; i <= deg; ++i)
		{
			const unsigned int x = p_a[i];
			unsigned int t = p_ar[2 * i];
			umuladdrem(t, x, x, t, n);
			p_ar[2 * i] = t;
		}
 
		m_deg = degr;
		delete [] mp_a;
		mp_a = p_ar;
	}
 
	void _polyMul(const CPolyMod & p)
	{
		const unsigned int deg = m_deg;
		const unsigned int n = m_n;
		const unsigned int * const p_a = mp_a;
 
		const unsigned int degr = deg + p.m_deg;
		unsigned int * const p_ar = new unsigned int [degr + 1];
		unsigned int k;
		for (k = 0; k <= degr; ++k)
			p_ar[k] = 0;
 
		unsigned int j;
		for (j = 0; j <= p.m_deg; ++j)
		{
			const unsigned int x = p.mp_a[j];
			if (x != 0)
			{
				unsigned int i;
				for (i = 0; i <= deg; ++i)
				{
					const unsigned int y = p_a[i];
					unsigned int t = p_ar[j + i];
					umuladdrem(t, x, y, t, n);
					p_ar[j + i] = t;
				}
			}
		}
 
		m_deg = degr;
		delete [] mp_a;
		mp_a = p_ar;
	}
 
	void _Mod()
	{
		unsigned int deg = m_deg;
		unsigned int * const p_a = mp_a;
		while (deg >= m_r)
		{
			p_a[deg - m_r] += p_a[deg];
			if (p_a[deg - m_r] >= m_n) p_a[deg - m_r] -= m_n;
			--deg;
 
			while (p_a[deg] == 0) --deg;
		}
		m_deg = deg;
	}
 
	void _Norm()
	{
		const unsigned int deg = m_deg;
		const unsigned int n = m_n;
		unsigned int * const p_a = mp_a;
		if (p_a[deg] != 1)
		{
			const unsigned int y = Inv(p_a[deg], m_n);
			unsigned int i;
			for (i = 0; i <= deg; ++i)
			{
				unsigned int t = p_a[i];
				umulrem(t, t, y, n);
				p_a[i] = t;
			}
		}
	}
 
public:
	CPolyMod & operator = (const CPolyMod & p)
	{
		if (&p == this) return *this;
		m_deg = p.m_deg;
		delete [] mp_a;
		mp_a = new unsigned int [p.m_deg + 1];
		unsigned int i;
		for (i = 0; i <= p.m_deg; ++i)
			mp_a[i] = p.mp_a[i];
		return *this;
	}
 
	int operator != (const CPolyMod & p) const
	{
		if (m_deg != p.m_deg)
			return true;
		unsigned int i;
		for (i = 0; i <= m_deg; ++i)
			if (mp_a[i] != p.mp_a[i])
				return true;
		return false;
	}
 
	CPolyMod & operator += (unsigned int i)
	{
		const unsigned int t = i % m_n;
		mp_a[0] += t;
		if (mp_a[0] >= m_n) mp_a[0] -= m_n;
		return *this;
	}
 
	CPolyMod & operator -= (unsigned int i)
	{
		const unsigned int t = m_n - i % m_n;
		mp_a[0] += t;
		if (mp_a[0] >= m_n) mp_a[0] -= m_n;
		return *this;
	}
 
	CPolyMod Pow(unsigned int e) const
	{
		unsigned int er = 1;
		unsigned int j;
		for (j = e; j != 1; j /= 2)
		{
			er = 2 * er + (j % 2);
		}
 
		CPolyMod t(*this);
		unsigned int i;
		for (i = er; i != 1; i /= 2)
		{
			t._polySquare();
			t._Mod();
			if (i % 2 != 0)
			{
				t._polyMul(*this);
				t._Mod();
			}
		}
		t._Norm();
		return t;
	}
};

Com isto encerramos nossa série de introdução aos números primos. Se você quiser ler mais sobre o assunto eu recomendo este artigo avançado:
http://www.cse.iitk.ac.in/users/manindra/algebra/primality_v6.pdf
e este artigo em termos mais leigos:
http://www.flonnet.com/fl1917/19171290.htm

Image Anonymizer – Proteja suas fotos

Muitas vezes o envio de uma foto pela internet tem como inconveniente os dados que são inseridos no cabeçalho. Estes dados, conhecidos como EXIF (Exchangeable image file format) servem para o usuário poder anotar diversas coisas de maneira automática na fotografia. Mal comparando é como aquela data que as câmeras analógicas colocavam nas fotos.

Acontece que em alguns casos os dados podem ser privados e você não reparar que está enviando muito mais que uma foto. Veja o exemplo do cabeçalho abaixo:

Além de informar a marca e o modelo do celular, ele informa também as coordenadas GPS do local em que a foto foi tirada e se possível escreve o nome do local.

Para limpar este cabeçalho há um App recém lançado chamado Image Anonymizer. Ele é bem simples e eficaz. Veja mais no nosso blog de Apps: Zapps