Bash para Excel

Quando não se sabe fazer uma fórmula de multiplicação em linha no Excel:

for i in {6..36}; do echo -n "+B$i*\$O\$$i"; done

Performance improvement options in Firefox

Changes in about:config:

network.http.pipelining = true
network.http.proxy.pipelining = true

content.notify.interval = 500000
content.notify.ontimer = true

content.switch.threshold = 250000
content.interrupt.parsing = false

browser.cache.memory.capacity = 65536

javascript.options.jit.chrome = true
javascript.options.jit.content = true

Sort git tags by version

To print the git tags in version order:

git tag | sort -V

Convert Heroku deploy versions to git tags

To convert the Heroku deploy output on https://dashboard.heroku.com/apps/<your app>/activity to git tags, do:

echo "<paste list here>" | \
awk '{ print "git tag " $1 " " $4 }' | \
sed 's/v\([0-9]*\)/0.\1/g'

2014

python -c 'print sum(ord(c) for c in "Happy new year to you!")'

Natal de 2001 tem queda e não é tão bom, enquanto o de 2013 tem crescimento e é preocupante

No natal de 2001 o comércio em São Paulo teve uma queda de 2% no volume das vendas, mas ainda assim "estava muito bom", porque as quedas esperadas eram de 5% -- o tom da notícia é de recuperação, e os motivos das quedas não são apontados.

Em 2013, após uma sequência de natais com vendas crescentes, o menor resultado de crescimento nos últimos 10 anos é trazido em um texto maior, com tom alarmante e com diversos motivos apresentados para a desaceleração.

Ironicamente, a palavra 'inflação' aparece no segundo texto, e não no primeiro.

Tiveram ao menos a decência de publicar a opinião de Dagmar Zibas no painel do leitor:

Em questão de economia, a Folha tem a tendência de análises sempre pessimistas. Vejam o caso das vendas de Natal destacadas na manchete de 27/12. Mesmo como leiga no assunto, não posso deixar de notar que, se as vendas por internet aumentaram mais de 40%, é óbvio que as vendas nos shoppings devem diminuir. E, no balanço geral, as compras por meio eletrônico não deveriam ser somadas às vendas físicas? Parece-me que, se a conta fosse feita, a conclusão é de que não há crise. Por que será que a Folha insiste na tese contrária?

Seguem as duas edições:


Comércio de São Paulo "festeja" queda de 2% nas vendas

26/12/2001

Para quem esperava uma queda nas vendas de até 5% em relação a 2000, o Natal deste ano foi bom. A avaliação é do presidente da Associação Comercial de São Paulo, Alencar Burti, ao prever que as vendas foram 2% menores do que as registradas no ano passado.

Segundo a associação, o comércio a prazo caiu 6,2% em relação a 2000, enquanto as compras à vista cresceram 8,1% na mesma comparação. Os números levam em conta as vendas feitas entre os dias 1º e 24 de dezembro até as 11h. "O movimento de pessoas aumentou, mas os valores gastos foram menores. O consumidor está mais racional, mais cauteloso para comprar a longo prazo."

Para o consultor em varejo Marcos Gouvêa, as vendas no país devem ter empatado, na média de todos os setores, com o Natal passado. Alguns setores, estima, tiveram crescimento de até 15% no seu faturamento -como confecção, calçados e cosméticos.

A Alshop (Associação dos Lojistas de Shopping do Estado de São Paulo), também comemora o resultado deste final de ano. Segundo o presidente da entidade, Nabil Sahyoun, as vendas em dezembro devem ficar entre 1% e 2% superiores às de dezembro de 2000. O resultado é inferior ao estimado no início do ano -esperava-se aumento entre 5% e 6% nas vendas. "Considerando todos os problemas em 2001, como a crise energética, a situação da Argentina, a alta do dólar e o terrorismo, podemos dizer que o saldo deste Natal foi positivo."

Sahyoun diz que o valor gasto por consumidor nos shoppings frequentados pelas classes média e alta cresceu entre 10% e 15% neste ano. "No ano passado, ficou entre R$ 45 e R$ 60. Neste ano, esses valores foram de R$ 50 a R$ 70." Segundo ele, isso aconteceu porque muitos consumidores, com medo das ameaças de atentados em 2001, cancelaram viagens ao exterior e usaram o dinheiro na compra de presentes.

Para a superintendente do Shopping Interlagos, Carla Bordon Gomes, ao deixar de viajar, o consumidor gastou com presentes mais caros, como DVDs e TVs de 29 polegadas.

Segundo o gerente de marketing do Shopping Central Plaza, Wilson Franciscão, as compras deste ano também foram mais planejadas. "Na semana, entre os dias 17 e 21, o consumidor pesquisou muito. De sábado até o dia 24 comprou."


Vendas de Natal têm pior desempenho em 11 anos, segundo Serasa Experian

26/12/2013

Crédito restrito, confiança em baixa, juros em alta e dólar mais caro levaram os brasileiros a reduzir o ritmo de consumo neste Natal, a principal data do ano para o comércio. Balanços preliminares indicam o pior desempenho em 11 anos.

Os fatores acima, somados ao ainda alto endividamento das famílias e à inflação elevada, provocaram, em 2013, uma desaceleração do comércio depois do forte ritmo registrado nos últimos anos. Até então, o consumo vinha se mantendo como o principal vetor de crescimento da economia brasileira.

O fraco desempenho do Natal confirma as previsões de economistas de que o comércio deva fechar o ano com o menor crescimento em uma década.

Segundo a Serasa Experian, as vendas do varejo no país subiram 2,7% no período entre 18 a 24 de dezembro, o menor percentual desde quando o dado começou a ser medido, em 2003. A média anual de crescimento no período foi de 7,55%.

Dados da Boa Vista também indicam perda de ritmo. O crescimento foi de 2,5%, ante os 4,1% registrados em 2012. Não há dados históricos para o indicador.

Os balanços de ambas as empresas são feitos com base nas consultas dos varejistas aos bancos de dados disponíveis sobre os consumidores.

Nos shoppings, as vendas tiveram um incremento de 5%, o menor ritmo dos últimos cinco anos, segundo a Alshop (associação do setor).

Para o presidente da entidade, Luiz Augusto Idelfonso, a desaceleração veio para ficar. "A volúpia de compras acabou. As pessoas ja compraram o que precisavam e agora estão fazendo reposição", diz.

O gasto individual do brasileiro nos shoppings neste Natal caiu 10% com relação ao ano anterior. Nos empreendimentos populares, o ticket médio ficou entre R$ 35 e R$ 55. Já nos de classe média e alta, variou entre R$ 75 e R$ 125.

E-COMMERCE

No comércio eletrônico, as vendas de final de ano superaram as expectativas. Os gastos dos consumidores entre 15 de novembro até 24 de dezembro somaram R$ 4,3 bilhões e representaram um avanço de 41% em relação ao ano anterior.

A consultoria e-bit, responsável por compilar os dados, esperava um crescimento de 25%. De acordo com a entidade, os gastos da ação promocional da Black Friday, em 29 de novembro, contribuíram para o aumento. Só naquele dia, o varejo on-line movimentou R$ 770 milhões.

Merge without conflicts in Git

If you end up generating two very different versions of codebases that will give you a very conflictive merge, then you can "keep" one of these versions by overwriting the merge source or target using the -X option in git merge.

For example, if I'm sure that my working copy is the one to keep, and if I can't do git pull because of a very big conflict, I would simply do this:

git merge -X ours origin/master

Then, my current local revision will be "kept" as the one in the results of a merge with the master branch of the origin remote.

Samba full_audit in Ubuntu 12.04

To use the full_audit module in Samba on Ubuntu 12.04 I did the following.

Add the vfs objects section in /etc/samba/smb.conf

[global]

    ... other stuff ...

    # Full audit
    vfs object = full_audit
    full_audit:prefix = %u|%I|%m|%S
    full_audit:success = mkdir rmdir read pread write pwrite rename unlink
    full_audit:failure = connect
    full_audit:facility = local7
    full_audit:priority = notice

Take a look at the full audit manpage list to verify what are the valid options in success and failure parameter.

Edit the file /etc/rsyslog.d/50-default.conf to don't send the audit log to /var/log/syslog:

# Change this line
*.*;auth,authpriv.none             -/var/log/syslog

# To
*.*;auth,authpriv.none,local7.none -/var/log/syslog

Then add the local7 log faciliy and put messages in /var/log/samba-audit.log:

# Add this line
local7.notice                       /var/log/samba-audit.log

To totate the logs weekly add this section to /etc/logrotate.d/samba:

/var/log/samba-audit.log {
    weekly
    missingok
    rotate 7
    postrotate
        reload rsyslog > /dev/null 2>&1 || true
    endscript
    compress
    notifempty
}

Restart everything:

service rsyslog restart
service smbd restart

Problems

SELinux won't let rsyslogd processes write to any files outside /var/log. I was trying to use the /var/log/samba/audit.log file, and it wasn't working because of that.

Also, it is important to just let rsyslogd create the files you want to use as their permissions must be the following:

-rw-r----- 1 syslog adm 928536 Dez 10 17:19 /var/log/samba-audit.log

If user and group aren't syslog and adm (or the ones configured in /etc/rsyslogd.conf), things won't work either.

Result

Log goes beautiful like this, but it grows really quick.

Dec 10 17:18:42 bispo smbd[10515]: someuser|192.168.0.21|someuser|Share name|pread|ok|file_name.xlsx
Dec 10 17:19:19  smbd[10515]: last message repeated 3 times
Dec 10 17:19:19 bispo smbd[10516]: nobody|192.168.0.170|onix|Other share name|pwrite|ok|other_file_name.txt

Os vieses do academicismo auto-educativo

Estive faz pouco tempo em um congresso de economia e fui assistir a uma sessão de trabalhos sobre educação financeira -- daqueles estudos do tipo Jornal Hoje que analisam os gastos das pessoas e concluem que elas gastam demais.

Dos painéis, as conclusões era cartesianamente na mesma linha: as pessoas não sabem gastar, as pessoas não sabem usar cartão de crédito, as pessoas não se seguram para gastar, as pessoas gastam muito mais do que podem, etc.

O último painel foi sobre um trabalho em uma escola de ensino médio do interior de Pernambuco feita por um professor da UFPE, e analisava os salários e os gastos dos alunos concluindo, novamente, que eles não sabem poupar e gastam tudo quase instantaneamente quando ganham, afundando-se em empréstimos e compras a prestações.

As discussões dos presentes durante as perguntas não apresentava uma anteposição significativa ao que era apresentado. Parecia automaticamente coerente poupar para comprar à vista porque custa mais barato.

Foi então que um professor que esteve bastante quieto até o momento se posicionou, e cuja fala vale a pena escrever sobre.

Contou ele que estava vindo para São Paulo e perguntou para a empregada se ela gostaria que ele trouxesse alguma coisa para ela. A resposta foi um choque com a realidade: "Mas o que é que vai ter em São Paulo pra mim, doutor?"

Isto nos coloca diante de uma realidade simples mas que parece difícil de ser enxergada de dentro da bolha acadêmica: poder poupar é um luxo de poucos. E isso não tem muito a ver com o controle psicológico sobre a compra, mas sim com a própria colocação social. Não podemos esperar que de um salário de R$700 alguém vá economizar R$150 ao mês para que no final de todo um ano possa comprar uma geladeira à vista. As possibilidades de qualidade de vida para quem ganha pouco estão bastante condicionadas na compra a prazo, caso contrário simplesmente não existirá acesso a televisores e máquinas de lavar.

A crítica frente à esta realidade era sobre o enviesamento dos estudos. A conclusão apontada ia bastante no sentido da falta de educação e sugeriam propostas como a inserção da educação financeira nas escolas, mas falhava até que grotescamente ao não analisar o cotidiano de compra das pessoas, interpretando a relação receita X gasto de forma direta sem analisar a realidade social a que cabe tal receita.

A academia pode facilmente virar uma bolha para os pesquisadores.

Desenvolvimento em comunidade: A história técnica e política de um plugin no WordPress

Apresentação

A palestra apresentada no Latinoware 2013 e no WordCamp São Paulo 2013 está disponível no SlideShare. O código fonte em LaTeX está em um repositório no GitHub.

Entendendo o problema

O WordPress é uma das plataformas mais populares no mundo, sendo o produto de 10 anos de desenvolvimento e representando hoje cerca de 20% da Internet. Esta palestra vem ilustrar o que é o desenvolvimento em comunidade deste software, tentando gradualmente tornar-se mais técnica também descrevendo como ocorreu o desenvolvimento de um plugin que a princípio pareceu simples de ser desenvolvido, mas envolveu muito mais discussão do que horas de codificação.

Os plugins do WordPress nada mais são do que trechos de código inseridos durante a instanciação do software, sendo indexados pelo gerenciador de plugins através do parse de seus cabeçalhos. Em outras palavras, um plugin no WordPress nada mais é do que um arquivo no diretório wp-content/plugins e que possui o seguinte cabeçalho:

<?php
/*
* Plugin Name: Nome do plugin
* Plugin URI: http://url.do/plugin
* Description: Descricao do plugin
* Author: Nome de quem fez o plugin
* Version: 0.1
* Author URI: http://blog.do/autor-do-plugin
*/

A história aqui contada é do plugin Better Front Page UI, um plugin bastante simples, de meras 160 linhas de código e que adiciona um único campo no admin do WordPress, mas que surgiu devido a vários meses de discussão e de 20 core patches na comunidade internacional porque se propõe a modificar uma funcionalidade central do gerenciador de templates do WordPress.

O problema a ser tratado pode ser resumido em um único recurso do WordPress: sua hierarquia de templates. Existem regras confusas para escolher especificadamente a página inicial a ser servida por um website, e isto se agrava quando a terminologia não ajuda.

Para você, qual a diferença entre front page e home?

Para o WordPress, home e front page são coisas completamente diferentes e que acabam mais do que gerando uma alta sensibilidade ao usuário, também acarretando em diversos problemas de construção de templates. Junto com esta regra confusa, tem-se também que especificar uma documentação verborragicamente desnecessária para instruir os usuários ou clientes do website a o utilizarem de modo adequado. Conteúdos passam a sumir inexplicavelmente no lugar de outros e sites deixam de ser funcionais através do usa de uma funcionalidade pobremente projetada.

Começamos da hierarquia de templates do WordPress, uma figura que desenvolvedores de temas com mais de 6 meses de experiência vão ter que saber de cor e salteado. Através de 5 grandes grupos de conteúdo -- erros, buscas, archives, singles e index -- o WordPress escolhe qual será o arquivo de template a ser renderizado juntamente com os dados obtidos a partir das variáveis de requisição enviadas ao servidor. Isto faz com que a URL de cada conteúdo específico acabe tendo a escolha de seu template adequadamente. Vejamos alguns exemplos:

No esquema a seguir, as URLs acessadas terminam seu caminho de escolha de template no (*):

Acesso a índices de data:

http://site/2010
http://site/2010/09
http://site/2010/09/22

• → date.php
  → archive.php
  → index.php (*)

Acesso a singles e conteúdos isolados:

http://site/qualquer-post-do-tipo-livro/

• → single-livros.php
  → single.php
  → index.php (*)

Acesso a listagem de posts de uma determinada categoria:

http://site/category/qualquer-categoria

• → category-qualquer-categoria.php
  → category-22.php
  → category.php
  → archive.php
  → index.php (*)

Acesso a uma taxonomia específica "tipo" de um post type "livro":

http://site/livros/historia

• → taxonomy-livros-historia.php
  → taxonomy-livros.php
  → taxonomy.php
  → archive.php
  → index.php (*)

Até aqui tudo bem. A hierarquia é direta e a escolha do template não tem nenhuma bifurcação, sendo somente eliminada em progressão. O que acontece, porém, quando tentamos acessar a página inicial e um site em WordPress?

http://site/

• → p*-problema.php (*)

É, temos um p* problema.

Se olharmos nas configurações de leitura no admin do WordPress veremos que a primeira opção é: "A página inicial mostra...".

Neste ponto teremos que entender o que é home e front page.

  • front page: a página principal de um site, ou landing page inicial que acessamos ao requisitar a URL principal. Para muitos, esta é a home de um site, mas cuidado com a terminologia aqui;
  • home: a página de listagem dos últimos posts, ou o 'índice de posts' de um site, contendo a listagem principal dos posts publicados.

Assim, enquanto a front page mostra um conteúdo qualquer de referência à uma página principal, a home deverá mostrar somente os últimos posts preservando a estrutura padrão do WordPress que é a ideia de exibição de conteúdo em blog.

Se quisermos que um site seja configurado desta forma, deveremos obedecer um recurso chamado dummy pages, que são literalmente páginas burras e que no contexto de conteúdo não servem para nada. Esta páginas serão utilizadas pelo gerenciador de templates para definir algum conteúdo e uma URLs de um site.

Precisamos notar que ao substituir a página inicial por qualquer outra coisa estamos também eliminando o índice de posts principal, ou a home do site. Fazer uso da primeira opção nas configurações de leitura é nada mais do que indicar através de duas páginas quais será o conteúdo da página inicial e qual será a URL do índice de posts principal.

Só que a regra é um pouco mais complicada.

Esta opção das configurações de leitura gera as opções na tabela wp_options chamadas de show_on_front e page_on_front, e que segue a seguinte regra:

Atenção: somente representação em código abaixo:

$show_on_front = get_option( 'show_on_front' );

if ( 'posts' == $show_on_front )

    // mostra os posts da página inicial, como usual e padrão para
    // temas do WordPress.

else if ( 'page' == $show_on_front' )

    // condiciona à seguinte sub-regra de selação de conteúdo:

    if ( $front_page == int( get_option( 'page_on_front' ) ) )

        // regra de seleção de templates para a página de ID 22:

        // • 22 == int( get option( ’page on front’ ) )
        //   → front-page.php
        //   → page-minha-pagina.php
        //   → page-22.php
        //   → page.php
        //   → index.php (*)

    if ( $home = int( get_option( 'page_for_posts' ) ) )

        // • int( get option( ’page for posts’ ) )
        //   → home.php
        //   → index.php (*)

Assim, a URL raiz de um site irá verificar se o valor para show_on_front é existente, o que por sua vez verificará o conteúdo de page_on_front, que se contiver um ID de página gerará uma busca de template para esta página.