A nossa necessidade será a verdadeira criadora

Até dezembro de 2016 eu utilizei um Windows Phone (já com a versão mobile do Windows 10), e o abandonei devido à comodidade, ou a falta dela: um Android era barato o suficiente, e oferecia toda sorte de aplicativos constantemente atualizados provendo os mais variados serviços. Já na loja da Microsoft, aplicativos desatualizados, bugados, e muitas vezes abandonados pelos desenvolvedores.

Recentemente vimos notícias que desanimaram os últimos usuários dessa plataforma: um funcionário de alto escalão da Microsoft, ao ser questionado se era a hora de abandonar o Windows Phone, respondeu não só que a plataforma não vai evoluir, mas que ele próprio já a havia abandonado.

Entretanto, guardo daquela época uma lembrança muito querida: o esforço de desenvolvedores independentes, que na falta de bons aplicativos oficiais, criavam por eles próprios aplicativos alternativos tão bons, mas tão bons, que a experiência de uso superava e muito aos aplicativos oficiais em plataformas atualizadas (Android e iOS).

“A nossa necessidade será a verdadeira criadora”, teria dito Platão.

Cito em particular dois casos muito peculiares: o Tweet It!, que é um cliente de Twitter tão bom, que só pensar em usar o aplicativo oficial desatualizado seria uma loucura. E o Poki, um cliente alternativo do Pocket, com uma usabilidade tão boa quanto, se não melhor que o original.

Os desenvolvedores desses e de outros aplicativos tinham tanto apreço pela plataforma Windows Mobile que, vendo uma necessidade decorrente da falta de bons aplicativos oficiais, se esforçaram, desenvolveram, ganharam uma graninha (espero que sim), e ajudaram a manter essa plataforma usável por um bom tempo, a despeito do descuidado da própria Microsoft. Eles não queriam que essa plataforma morresse.

Entretanto, mesmo com essas alternativas a serviços populares, há aplicativos para os quais não é possível desenvolver alternativas, principalmente quando lidam com serviços fechados: Uber, Cabify, aplicativos de bancos, etc. Nestes casos, os usuários eram obrigados a conviver com versões antigas, capadas ou bugadas dos apps oficiais, isso quando existiam. Vimos a cada dia notícias de mais serviços abandonando e retirando seus apps da plataforma.

O Windows Phone agora jaz em seu leito, mas pra mim o que fica na memória é a comunidade de desenvolvedores que abraçou a ideia, e tentou tornar a vida dos usuários – e a sua própria – um pouco mais fácil.

Obrigado developers, developers, developers.

Eu sou trouxa

Eu sou trouxa, e não é pouco.

Ao longo dos anos tenho pensado em como eu não consigo prejudicar os outros para tirar vantagem, apesar de ver a maior parte da sociedade fazê-lo.

E não falo só dos políticos, que tiram vantagem de sua posição privilegiada para afanar os recursos que deveriam ser retornados à população. Falo no geral.

Uma vez eu decobri que alguém tinha roubado uma tampinha do ventil de um dos pneus do meu carro. O cara devia estar sem, viu meu carro estacionado, foi ali e pegou. Pensei se eu conseguiria fazer o mesmo e tirar a tampinha de outro carro, pra cobrir o meu prejuízo. Até hoje meu pneu está sem a tampinha.

Só de pensar em fazer algo pra tirar vantagem (mediante prejuízo de outros), eu já me reprovo antes de fazer. Se o fizesse, eu nem ia ficar contente com a vantagem. Eu não consigo fazer. Eu fico me colocando no lugar do outro que vai sair prejudicado, e não faço. Eu não dormiria a noite se o fizesse.

Eu me pergunto sempre: como os outros conseguem?

O Mário Sérgio Cortella conta a história de um maratonista que deve ser trouxa como eu. Assista aqui.

Meu consolo é que não sou trouxa sozinho. Essa semana, duas pessoas próximas vieram me confessar que tem o mesmo dilema. Uma, inclusive, disse espontaneamente: “como eu sou trouxa!”, logo no início da sua fala.

Uns dizem que é empatia, outros moral, e outros que sou trouxa.

Meu deus, como é bom ser trouxa.

O dilema da privacidade

Quase todos utilizamos de diversos serviços gratuitos: e-mail, mensageiro instantâneo, redes sociais, armazenamento de fotos, e muitos outros (vide GMail, Outlook.com, Google Photos, Onedrive, Google Drive, iCloud, Facebook, Whatsapp, etc). Todavia, é sabido que a gratuidade destes sistemas é falsa, pois, apesar de não dispendermos de dinheiro para utilizá-los, cedemos informação. Essa informação é utilizada pelas empresas que fornecem esses serviços “gratuitos” para seu próprio lucro, bem como manutenção de seus serviços.

O Google, por exemplo, pode utilizar toda a informação cedida em buscas, e-mail, etc para traçar um perfil seu, e exibir os melhores anúncios de produtos e serviços, ou seja, os que mais se direcionam ao seu perfil. Os anunciantes, por sua vez, são quem efetivamente pagam ao Google para anunciar seus produtos.

Assim sendo, diversas gigantes do software possuem hoje detalhados perfis de nosso dia a dia, nossas preferência. Google, Microsoft, Apple, Facebook, e muitas outras tem uma infinidade de dados que podem ser utilizados; cada uma dessas empresas tem, geralmente, uma política de privacidade que versa quando e como esses dados serão utilizados.

Todavia, devemos nos preocupar com toda essa informação armazenada nas mãos de um pequeno grupo de empresas?

O argumento da vigilância governamental/de terceiros

Muitos defendem que não devíamos ceder tanta informação em troca de serviços, pois a concentração de dados nas mãos de uma empresa facilitaria a vigilância governamental desses dados. Escândalos recentes dão conta da colaboração entre empresas e governos.

Todavia, outras correntes afirmam que o cidadão usual e não-criminoso não teria nada a temer pela vigilância desses dados, pois, se não cometeu crime, não será punido pelo conteúdo de seus dados.

Entretanto, é válido notar outro argumento: o de que, na eventualidade de ascensão de um regime autoritário, os governos conseguiriam facilmente espionar e perseguir cidadãos de interesse, simplesmente por suas visões políticas.

Ainda, há os que não temem uma vigilância governamental, mas sim que os dados caiam em mãos de pessoas mal-intencionadas. Já ocorreu, e pode ocorrer de novo. Nesse caso, seria conveniente que dados tão pessoais não ficassem expostos da forma como ficam hoje.

O argumento do uso de dados para lucro de terceiros

Há grupos que defendem que o lucro obtido sobre a exploração de dados dos usuários seria espúrio ou desonesto, e que propagandas deveriam ser direcionadas a pessoas sem levar em conta as suas preferâncias. Também, que a manutenção de um perfil traçando a personalidade de cada usuário seria uma invasão à privacidade, pois cada pessoa tem seus segredos, mesmo que não sejam crimes.

Entretanto é útil notar que as propagandas direcionadas não só obtiveram melhores resultados ao longo da história, mas também são melhor toleradas por quem as vê, visto que são produtos que correspondem aos seus interesses.

O argumento da praticidade

Hoje temos diversas ferramentas para (tentar) garantir nossa privacidade online. Há mensageiros instantâneos como o Signal que utilizam o estado-da-arte de segurança de dados para comunicação. Temos o PGP, que nos permite enviar e-mails assinados digitalmente, e até mesmo criptografá-los. Temos complementos de navegador que impedem trackers ao longo da internet.

Todavia, para cada um desses, é necessário algum esforço de instalação e configuração que não são triviais nem para um usuário habituado com tecnologia, logo, imagine para um usuário comum. Além disso, quando é para comunicação, as duas pontas (emissor e receptor) precisam estar utilizando das mesmas tecnologias.

Sendo assim, a maioria dos usuários não utiliza dessas ferramentas, por não serem práticas (out-of-the-box), e elas acabam sendo utilizadas apenas por pequenos grupos que compartilham desses interesses.

Há alternativas sendo criadas e evoluindo, como o ProtonMail, cuja proposta é adicionar os layers de segurança necessários, sem que o usuário comum sequer saiba disso. Mas ainda são embriões, não são perfeitos, e a resistência à mudança é grande.

O argumento da gratuidade

Sabemos que não há almoço grátis. Se o serviço que utilizamos não exige pagamento, ele explorará nossos dados. Alguns defendem que, afim de garantir nossa privacidade, valeria a pena começarmos a pagar para utilizar esses serviços, mediante garantia de privacidade. Outros dizem que preferem ceder a informação e, assim, poder usar seu dinheiro com coisas que lhe tragam outros benefícios.

Afinal, devemos nos preocupar?

Não há resposta universal. Cada um de nós terá de realizar tal julgamento, pessoalmente. Vale a pena arriscarmos dados pessoais em prol de gratuidade e praticidade? Ou devemos investir tempo configurando ferramentas que protegem nossos dados e não são tão práticas? Mas não será um disperdício de tempo? E se as pessoas com as quais nos comunicamos não tem a mesma sintonia, vale a pena investir nessas tecnologia? Mas e se um dia formos chantageados pela informação que colocamos na nuvem?

Nosso perfil somos nós. Cada um de nós terá de ver o quanto vale, e se queremos nos arriscar a uma exposição que, talvez seja danosa, ou talvez nunca traga diferença alguma.

O compartilhamento de dados entre WhatsApp e Facebook não é coisa nova

Foi feito um alarde essa semana referente ao anúncio do Facebook de que os dados dos usuários de WhatsApp serão compartilhados com a rede social. Há inclusive agora, no WhatsApp, um toggle que permite desabilitar o compartilhamento.

Todavia, esse compartilhamento de dados já era realizado. O toggle para desabilitar, de fato, é novo.

No ano passado, quando eu ainda tinha uma conta de Facebook, o número de telefone associado à minha conta era o mesmo número que utilizo no WhatsApp. Todavia, não tinha app do Facebook no smartphone, tampouco acessava a rede social via browser mobile, nada. Não entrava no facebook de forma alguma no celular. Isso justamente para evitar que a rede social me perguntasse se eu queria fazer o upload dos meus contatos e ver quem eu conhecia. Eu preferia adicionar um a um, e manter a minha lista de contatos “privada”.

A bem da verdade, só utilizava o Facebook no browser do notebook, em casa.

Um colega de trabalho, então, me passou o telefone de uma corretora imobiliária. Adicionei em meu telefone, o WhatsApp viu o número, colocou entre os contatos de WhatsApp, conversei com ela pelo mesmo app.

Ao chegar em casa à noite, entrei no Facebook no notebook, e para minha surpresa, ele exibia na página inicial o banner “Pessoas que talvez você conheça”. A primeira delas era a corretora imobiliária, pessoa que eu conheci no mesmo dia.

Muitos dirão:

“Ah, mas o compartilhamento de dados pode não ter se dado pelo teu WhatsApp, mas pelo smartphone dela. Ela tinha ambos os apps no smartphone dela (Facebook e WhatsApp), ela ‘syncava’ os contatos entre o smartphone e o Facebook, e o Facebook entendeu então que ela te conhecia, e sugeriu para os dois se adicionarem…” – Você espertalhão conhecedor dos paranauês tecnológicos

Ok, tecnicamente possível. Todavia, em minha opinião, o máximo que se deveria fazer era exibir para ELA, no Facebook DELA, que talvez ELA ME conhecesse. Exibir para mim é muita intrusão, pois eu tornei o compartilhamento de meus contatos impráticável (jamais autorizando o upload de meus contatos, e sequer tendo o app do Facebook). Acho, inclusive, que sugerir pessoas que eu conheça é questionável, se jamais permiti o upload de meus contatos pra rede social.

De qualquer forma, privacidade hoje é, na prática, inexistente. Os seus dados vão parar lá, de uma forma ou de outra. Seja pelo seu smartphone, seja pelo do coleguinha.

É o que eu acho.

Obsolescência Programada

Ou: Como as Fabricantes o Forçam a Comprar as Novas Versões Ou: Tática Chaves de Venda de Balões

Quando você compra um eletrônico (como smartphones, tablets ou até notebooks), após um certo tempo, o fabricante geralmente lança atualizações de software que, sabidamente, vão prejudicar o desempenho do seu dispositivo.

Até então ele estava funcionando perfeitamente mas, com a nova versão, torna-se lento, ou às vezes inutilizável. A saída é apenas uma: comprar outro aparelho mais novo que suporte melhor essas novas versões e com desempenho aceitável.

Após algum tempo, lançam novas atualizações para este aparelho novo, que torna-se lento, e assim segue o ciclo. Essa é a famosa Obsolescência Programada.

Todos somos vítimas dela. Eu fui vítima dela quando comprei um iPhone 3GS por exemplo. Excelente aparelho, rápido. Com o tempo, novas atualizações de software surgiram, e hoje o iPhone 3GS jaz em uma gaveta pois, afinal, é impraticável utilizá-lo: é lento, trava.

Por que não deixaram como versão máxima para ele uma versão na qual ele ainda funcionava rapidamente? Para forçar o usuário a comprar outro modelo mais novo.

Isso ocorre também com smartphones Android, Windows Phone, com tablets, computadores, etc. Independe da marca.

Como se proteger? Duas opções:

  1. Pesquise antes de atualizar. Se usuários relatam perda de desempenho, não atualize. Continue na versão antiga.
  2. Recorra a um sistema operacional alternativo. Usuários de Android costumam dar sobrevida a aparelhos aparentemente obsoletos com ROMs alternativas como o Cyanogenmod, por exemplo. Isso mantém o aparelho atualizado, e algumas vezes mais rápido do que ele era de fábrica. Testei isso num Samsung Galaxy S3 e foi impressionante. Para computadores, vale tentar usar uma distribuição linux e salvar a máquina antiga. Eu uso Debian em meu notebook já um tanto antigo e fraco, e é ótimo.

Por que estou escrevendo sobre isso? Na segunda-feira, percebi que a Apple me oferecia gratuitamente uma atualização para meu Mac Mini de 5 anos (modelo de 2010) para seu novíssimo sistema Mac OS X El Capitan.

Há algum tempo atrás, me ofereceram a atualização para o então novíssimo Yosemite, que prejudicou consideravelmente o desempenho de meu computador até então 100% funcional. E na terça, a Apple anuncia os novíssimos preços para seus computadores: cifras astronômicas.

Atualizarei? Provavelmente não. Na verdade, acho que vou tentar regredir para uma versão anterior para obter o funcionamento pleno novamente.

Se atualizasse, ficaria inutilizável, aposto. O que fazer nesse caso? Comprar outro.

O Chaves e o Sr. Madruga desenvolveram um sistema infalível para venda de balões.

  1. O Sr. Madruga vendia um balão.
  2. O Chaves espetava o balão do cliente quando o Sr. Madruga já tivesse o dinheiro no bolso.
  3. Quando o cliente atônito perguntava o que deveria fazer, o Chaves disparava: comprar outro.

Em tempos de crise, convém evitar que seu aparelho funcional torne-se obsoleto. Em tempos de bonança, também. Vamos evitar o consumismo desenfreado. Salve seu hardware funcional com software que funciona nele e que lhe atenda.

Instalando Phalcon Framework no Debian 8 64 bits

O Phalcon é um Framework PHP de alto desempenho, pois ele é uma extensão compilada do PHP. Assim, suas classes residem já na memória do PHP por padrão, não sendo carregadas por interpretação de arquivos PHP. Isso nos provê um altíssimo desempenho e menor consumo de memória.

Este guia nos mostra como instalar o Phalcon em 5 minutos em sua máquina Debian 8 64 bits.

  • Atualize seus repositórios
    • sudo apt-get update
  • Instale os pacotes necessários à compilação e utilização da extensão
    • sudo apt-get install php5-dev libpcre3-dev gcc make php5-mysql git
  • Inicie a compilação do pacote
    • cd /opt
    • sudo git clone --depth=1 git://github.com/phalcon/cphalcon.git
    • cd cphalcon/build
    • sudo ./install
  • Aguarde o fim da compilação
    • Thanks for compiling Phalcon!
    • Build succeed: Please restart your web server to complete the installation
  • Crie os arquivos de carregamento da extensão
    • sudo printf "; configuration for phalcon module\n; priority=50\nextension=phalcon.so" > /etc/php5/cli/conf.d/50-phalcon.ini
    • sudo printf "; configuration for phalcon module\n; priority=50\nextension=phalcon.so" > /etc/php5/apache2/conf.d/50-phalcon.ini
  • Crie um arquivo phpinfo para conferir se a extensão será carregada
    • sudo printf "<?php\nphpinfo();" > /var/www/html/phpinfo.php
  • Reinicie o apache
    • sudo service apache2 restart
  • Carregue no seu navegador o phpinfo na URL http://localhost/phpinfo.php

Se apareceu o phalcon na página do phpinfo, pronto! Sua instalação está pronta e rodando corretamente.

Performance e Otimização de Bancos de Dados MySQL

O seguinte Webinar foi apresentado ao vivo em 23/09/2015 pela empresa KingHost. Nele, eu – Jeronimo Fagundes – e Rodrigo Paris falamos sobre as melhores práticas para obter o máximo desempenho ao realizar buscas em um servidor MySQL, afim de tornar sua aplicação mais rápida, e melhorando a usabilidade da mesma.

São apresentados 4 pontos-chave:

  1. Indexação de tabelas
  2. Particionamento de tabelas
  3. Otimização de consultas
  4. Infraestrutura

Aprimorando o particionamento em MySQL – Subpartições

Dando seguimento ao post anterior sobre particionamento de tabelas no MySQL, este post explica um passo a mais: subparticionamento.

O MySQL permite que você particione uma partição, onde o primeiro nível (PARTITION) é definido por uma expressão de particionamento, e o nível inferior (SUBPARTITION) é definido por outra.

Para utilizar o subparticionamento, é necessário seguir duas restrições:

  1. O tipo de particionamento (PARTITION) precisa ser dos tipos RANGE ou LIST;
  2. O tipo de particionamento (SUBPARTITION) precisa ser dos tipos HASH ou INDEX.

Portanto, não é possível subparticionar tabelas particionadas por HASH ou INDEX.

É importante notar que o número total de partições de uma tabela (nº de PARTITIONs * nº de SUBPARTITIONs) não pode ultrapassar 1024, que é o máximo que o MySQL suporta. Ex.: se uma tabela é particionada por RANGE em 2 partições, cada partição pode ser subparticionada em 512, pois 2 * 512 = 1024.

Abaixo segue um exemplo de tabela subparticionada:

CREATE TABLE ts (
id INT,
purchased DATE
) PARTITION BY RANGE( YEAR(purchased) )
SUBPARTITION BY HASH( TO_DAYS(purchased) )
SUBPARTITIONS 2 (
PARTITION p0 VALUES LESS THAN (1990),
PARTITION p1 VALUES LESS THAN (2000),
PARTITION p2 VALUES LESS THAN MAXVALUE
);

No exemplo acima a tabela ts possui 3 partições, e cada uma é subparticionada em 2 partições. Assim, temos 6 partições no total.

Veja outro exemplo:

CREATE TABLE ts (
id INT,
purchased DATE
)
PARTITION BY RANGE( YEAR(purchased) )
SUBPARTITION BY HASH( TO_DAYS(purchased) ) (
PARTITION p0 VALUES LESS THAN (1990) (
SUBPARTITION s0,
SUBPARTITION s1
),
PARTITION p1 VALUES LESS THAN (2000) (
SUBPARTITION s2
),
PARTITION p2 VALUES LESS THAN MAXVALUE (
SUBPARTITION s3,
SUBPARTITION s4
)
);

Neste outro exemplo, a tabela ts tem 5 partições no total, pois as partições p0 e p2 são subparticionadas em 2 partições cada, mas a partição p1 tem apenas uma subpartição.

Para saber mais sobre o subparticionamento em MySQL, consulte a documentação oficial do MySQL sobre subparticionamento.

Acelerando suas queries com o particionamento do MySQL

Quando você tem uma tabela com muitos registros no MySQL, as buscas podem se tornar extremamente lentas. Uma forma de otimizar a velocidade de suas buscas pode ser particionar a tabela.

Quando uma tabela é particionada, é como se você tivesse várias tabelinhas menores que, juntas, compõem a tabela completa.

Esta divisão é feita de acordo com algum critério lógico, de forma que quando você realize uma busca, o MySQL busque em apenas uma tabelinha, e não no universo todo de dados. Você não tem mais um grande universo de dados, mas vários “universinhos”. Como seu universo de busca se torna menor, a busca fica mais rápida.

O critério lógico de particionamento sempre é definido com base nos valores de uma ou mais colunas predeterminadas. Dependendo dos valores que essas colunas assumirem, uma row é guardada em uma ou em outra partição. Assim, quando formos buscar um conjunto de dados via SELECT, dependendo dos valores especificados para aquelas colunas na cláusula WHERE, sabemos exatamente em quais partições os dados se encontram, e assim evitamos a busca nas demais partições.

Há diversos tipos de particionamento no MySQL. Cada um atende a um tipo de critério lógico de particionamento.

Particionamento por RANGE

No particionamento por RANGE, o MySQL decide quais rows vão em uma partição de acordo com um intervalo de valores de uma coluna (ou expressão baseada em colunas). Na seguinte tabela:

CREATE TABLE Funcionarios ( cpf VARCHAR(14) NOT NULL, nome VARCHAR(255) NOT NULL, admissao DATE NOT NULL PRIMARY KEY (cpf) ) PARTITION BY RANGE(MONTH(admissao)) ( PARTITION primeiro_trimestre VALUES LESS THAN (4), PARTITION segundo_trimestre VALUES LESS THAN (7), PARTITION terceito_trimestre VALUES LESS THAN (10), PARTITION quarto_trimestre VALUES LESS THAN MAXVALUE );

Definimos 4 partições baseadas no mês da asmissão:

A partição primeiro_trimestre vai conter todos os registros de funcionários cuja admissão ocorreu nos meses 1, 2 ou 3 (janeiro, fevereiro ou março), ou seja, segundo a definição, todos os meses menores que 4. A partição segundo_trimestre conterá todos os registros de funcionários cujo mês de admissão é maior ou igual a 4 e menor que 7, ou seja, os meses de abril, maio e junho. A partição terceiro_trimestre conterá os registros de funcionários admitidos nos meses 7, 8 e 9, ou seja, julho, agosto e setembro. A partição quarto_trimestre conterá os registros dos demais funcionários. Assim, caso o seguinte select fosse feito:

SELECT * FROM Funcionarios WHERE admissao = '2015-03-15';

o MySQL saberia automaticamente que teria que procurar apenas na partição primeiro_trimestre, e não consideraria as outras partições na busca. O universo de busca fica muito menor, e a query mais rápida.

É importante notar que na expressão PARTITION BY (expr), expr deve ser uma expressão que retorne necessariamente um valor inteiro.

Particionamento por LIST

O particionamento por LIST é bem parecido com o RANGE. Todavia, em vez de especificarmos um intervalo de valores, vamos especificar um conjunto discreto de valores, fixos, predeterminados.

CREATE TABLE Funcionarios ( cpf VARCHAR(14) NOT NULL, nome VARCHAR(255) NOT NULL, filial INT NOT NULL PRIMARY KEY (cpf) ) PARTITION BY LIST(filial) ( PARTITION regiao_norte VALUES IN (1, 2, 7), PARTITION regiao_sul VALUES IN (3, 9), PARTITION regiao_leste VALUES IN (4, 5, 6), PARTITION regiao_oeste VALUES IN (8), );

Neste exemplo, se buscássemos todos os funcionários da filial número 5, o MySQL buscaria apenas na partição regiao_leste, que contém os funcionários das filiais 4, 5 e 6.

Particionamento por RANGE COLUMNS

É igual ao particionamento com RANGE, mas a expressão de particionamento pode ser de outros tipos que não um número inteiro, a saber: DATE, DATETIME, CHAR, VARCHAR, BINARY e VARBINARY. Além disso, pode-se usar tuplas de colunas em vez de uma só coluna.

CREATE TABLE xyz ( a INT NOT NULL, b INT NOT NULL, c DATETIME NOT NULL ) PARTITION BY RANGE COLUMNS (a, MONTH(c)) ( PARTITION p0 VALUES LESS THAN (3, 7), PARTITION p1 VALUES LESS THAN (4, 9), PARTITION p2 VALUES LESS THAN (4, 11), PARTITION p3 VALUES LESS THAN (MAXVALUE, MAXVALUE) );

Neste exemplo, se buscássemos por uma row em que a = 4 e c = ‘2015-10-01′, o MySQL buscaria na partição p2. Já uma row em que a = 4 e c = ‘2015-11-20′ estaria na partição p3.

Particionamento por LIST COLUMNS

Assim como o RANGE COLUMNS é uma extensão do RANGE, o LIST COLUMNS é uma extensão do LIST. Ele também permite que a expressão de particionamento seja de outros tipos, e também permite tuplas.

CREATE TABLE Funcionarios ( cpf VARCHAR(14) NOT NULL, estadoVARCHAR(2) NOT NULL DEFAULT 'RS', PRIMARY KEY (cpf) ) PARTITION BY LIST COLUMNS (estado) ( PARTITION regiao_sul VALUES IN ('RS', 'SC, 'PR'), PARTITION regiao_sudeste VALUES IN ('SP', 'RG', 'MG', 'ES'), PARTITION regiao_centro_oeste VALUES IN ('MT', 'MS', 'GO', 'DF'), PARTITION regiao_norte VALUES IN ('AC', 'AM', 'RO', 'RR', 'PA', 'AP', 'TO'), PARTITION regiao_nordeste VALUES IN ('MA', 'PI', 'CE', 'RN', 'PB', 'PE', 'AL', 'SE', 'BA') );

Particionamento por HASH ou por LINEAR HASH

O particionamento por HASH é um dos mais simples, e de uso mais comum. A sua expressão de particionamento deve ser um valor inteiro. Neste tipo de particionamento, você deve especificar não só a expressão de particionamento, mas também o número de partições a utilizar. O MySQL vai nomear essas partições automaticamente, e vai escolher a melhor partição para sua row de acordo com o módulo da expressão de particionamento pelo número de partições. Esse é o tipo de particionamento recomendado se você quer ter uma distribuição semelhante de rows entre as partições.

CREATE TABLE Pedidos ( idNOT NULL AUTO_INCREMENT, id_cliente INT NOT NULL, valor DECIMAL(5, 2) NOT NULL, descricao VARCHAR(255) NOT NULL ) PARTITION BY HASH (id_cliente) PARTITIONS 10;

Neste exemplo, criamos 10 partições por id de cliente. Isso significa, por exemplo, que todos os pedidos do cliente com id 7 vão residir na partição 7, pois 7 % 10 = 7 (sete módulo dez é igual a sete). Já os pedidos do cliente 22 estarão todos na partição 2, pois 22 % 10 = 2.

O número máximo de partições por tabela que o MySQL permite é 1024.

O particionamento por LINEAR HASH é muito semelhante ao por HASH. Todavia, em vez do módulo, o MySQL usa outra fórmula baseada em potências de 2.

Particionamento por KEY ou por LINEAR Key

Muito parecida com a partição por HASH. Todavia, no particionamento por KEY, o MySQL server é que vai escolher o melhor algoritmo para o cálculo da partição resultante.

A expressão de particionamento pode ser zero ou mais colunas, conforme segue:

Se não é especificada nenhuma coluna, o MySQL vai usar a chave primária se houver; se não houver chave primária, vai usar uma chave única que houver. Se houver colunas especificadas, elas precisam fazer parte da chave primária ou da chave única. LINEAR KEY é semelhante à KEY, usando cálculo de potências de 2 (assim como LINEAR HASH).

Um cuidado deve ser tomado: se você efetuar uma busca (SELECT) e não especificar na cláusula WHERE o valor da coluna de particionamento, o MySQL não vai saber em qual partição buscar, e vai acabar varrendo todas as partições para efetuar sua busca. Isso será mais lento que buscar em uma tabela não-particionada. Assim sendo, o particionamento é uma poderosa ferramenta, mas suas queries terão de ser adaptadas para aproveitar esse particionamento.

Quer saber mais sobre particionamento no MySQL? Consulte a documentação oficial do MySQL sobre particionamento.

Lidando com o mercado dos eletrônicos

O mercado dos eletrônicos (smartphones, computadores, tablets, etc) é frustrante. Você compra algo, pra pouco tempo depois cair o valor, ou então lançar uma versão nova muito melhor pelo mesmo preço.

Quando comprei um Mac Mini, há alguns anos, olhei por um bom tempo o valor, configuração, etc. Convenci a mim mesmo que o compraria para programar e criar aplicativos para iPhone e assim ficar rico (promessa nunca cumprida, na verdade, fiquei mais pobre com a compra). Quando finalmente me decidi por comprar, paguei R$ 2700,00 no aparelho.

Um mês depois, a Apple decidiu baixar o valor do aparelho para R$ 2000,00. Perdi R$ 700 por não esperar um mês.


Meu amigo @mateuschmitz comprou um smartphone novo para aposentar uma porcaria velha que ele tinha. Menos de um mês depois anunciaram um aparelho muito mais legal, muito melhor, cujo preço provavelmente vai ser bem semelhante.


Então, meus amigos, como lidar com as constantes frustrações do insano mercado tecnológico? Eis algumas dicas que a vida me ensinou:

  1. Após comprar algo eletrônico, não olhe coisas semelhantes no mercado ou nas notícias por um tempo. – Isso evita que você veja aquela outra coisa muito mais legal e nova, que vai deixar a sua defasada instantaneamente. Ainda, evita que você perceba que fez uma cagada ao comprar precipitadamente, caso o preço caia.
  2. Não desanime se seu coleguinha aparecer com algo melhor que o seu pouco depois da sua compra. – Lembre-se que outro aparecerá em poucos dias com algo melhor ainda, e essa será sua vingança contra o filho da puta.
  3. Aprenda a diferença entre necessidade e desejo. – Você pode querer um Samsung Moto Galaxy G X Note Dual LG Quad Core CPU Lollipop Ultra Mega. Contudo, de nada adianta você ter tudo isso só pra ouvir música e abrir o Twitter. Se você precisa de pouco, compre pouco. Pegue algo mais barato, assim a decepção não vai ser tão grande, afinal, você não gastou tanto mesmo.
  4. Contente-se. – Lançaram um smartphone novo? Legal. O seu não dá mais conta do recado? Se dá conta, não tem porque substituí-lo. Isso é nada mais que um complemento à dica 3. Resista à tentação.
  5. Conforme-se. – O mercado de tecnologia é assim. Eles fazem de tudo pra você gastar o máximo possível e com a máxima frequência possível, mesmo que desnecessariamente. Cabe a você ceder ou resistir.

“Ah, mas eu tenho dinheiro pra andar com tudo do último modelo.” – Você rico.

Então compra, ué.

“E você? Cumpre essas regras todas?” – Você malandrinho.

Não, realmente não. Caio em muitas tentações desnecessárias. Às vezes me decepciono com uma compra que se torna “obsoleta” por um lançamento mais recente. Mas estou tentando me controlar e aprender, e colocar cada vez mais em prática.