Maracujá é a fruta da Flor da Paixão

Eu passei a vida toda achando que o nome internacional do maracujá — passion fruit, fruta da paixão — era devido a sua cor e aroma exóticos e afrodisíacos.

Me enganaram! Ou, mais provável, eu me enganei a si próprio.

O maracujá é típico da Amazônia e o nome latim/inglês/francês — passiflora — foi dado pelos jesuítas, no século 18, porque usavam a flor para ensinar sobre a Paixão de Cristo aos nativos do novo mundo. Pois a flor tem pétalas que lembram uma coroa de espinhos, e estames que lembram uma cruz.

O nome original em tupi — mara kuya — significa alimento na cuia. Porque afinal fazemos da casca do fruto o recipiente para se comer a polpa.

Mais uma coisa bem aprendida numa bela viagem.

https://www.facebook.com/543888243/posts/pfbid0d8inPPkhbvnf3S3jEJz98aAnJZp6QtgEZqidmjnRf5y87Si3MEzD8TbLFPoXSweSl/

CoViD-19 acabou?

Aeroportos cheios e quase ninguém mais usa máscara, inclusive dentro do avião, durante o voo. Nenhum oficial nem pede também comprovante de vacinação nem teste negativo.

Fila de pessoas em aeroporto e poucos usam máscara

Seria porque ⓐ não se importam mais, ⓑ usar máscara é muito chato, ⓒ estamos simplesmente agindo como pessoas vacinadas?

Read More

Se eu fosse nutricionista

Se eu fosse nutricionista, me associaria a um restaurante de região comercial super movimentada — Paulista, Itaim etc — e ofereceria almoços e jantares para redução e controle de peso. Cardápio e quantidades viriam prontos, sem eu ter que pensar, escolher e nem me servir. Adicionalmente, o cliente sairia de lá com cardápio sugerido e escrito para seu café da manhã do dia seguinte, ítens e quantidades.

Se algo assim existisse perto de onde trabalho, eu almoçaria lá todos os dias. Todos os dias.

https://www.facebook.com/543888243/posts/pfbid022XevZN8wQ4T46GEAcwuFE2dsL8u58p1CLP9tbgFDWs5gt8sJAdpg9wgs2XbucSNsl/?mibextid=cr9u03

Abacaxi vem da Amazônia

O abacaxi é uma bromélia amazônica.

A gente chama de “fruta”, mas aquilo é na verdade um conglomerado de frutos, sendo cada fruto um dos gomos que se vê na casca. Da bromélia brota uma estrutura cheia de florzinhas, parecida com a foto. E aí cada 1 florzinha se transforma em 1 fruto. Eles vão engordando e grudando um no outro até formar o abacaxi inteiro.

Read More

Vitória-Régia da Amazônia

A Vitória-Régia, além de linda e exótica, é também uma planta alimentícia não-convencional (P.A.N.C.).

Típica da Amazônia, ancora sua raiz no fundo de lagos ou águas doces estáveis, e de lá estende grossos caules até a superfície para cada flor, cada fruto, cada folha enorme em forma de prato de 1 a 2 metros de diâmetro.

A raiz é um tubérculo, que pode ser cozido e consumido como batata. Os caules podem ser descascados e preparados como palmito ou aspargos ou espaguete. As folhas, após removidos os espinhos, podem ser consumidas cruas ou cozidas como couve.

Read More

Panettone ou Chocottone

— Avi, você gosta mais de panettone ou chocottone?

— Eu gosto igual dos dois.

— Ah, eu já prefiro panettone mesmo. Se eu tivesse que escolher eu sempre escolheria panettone.

— Então, se eu tivesse que escolher eu deixaria prá outra pessoa escolher, prá não ter que lidar com a perda da outra opção.

Terrorismo e o silêncio do presidente

24 horas depois e nem 1 palavra sequer do presidente da república repudiando os atos terroristas em Brasília.

Nem 1 palavra de repúdio sequer também do diretor da PF, Márcio Nunes de Oliveira.

Do ministro da justiça, Anderson Torres, só tweets dúbios e amenos.

Se for capaz, justifique para mim que esse presidente, ministro e diretor não têm sonhos e desejos golpistas.

https://www1.folha.uol.com.br/poder/2022/12/bolsonaro-divulga-mensagem-dubia-em-evento-militar-e-silencia-sobre-vandalismo.shtml

Command Line in Windows

Command line on Windows (10+) nowadays doesn’t have to be only PuTTY to a remote Linux machine. In fact many Linux concepts were incorporated on Windows.

Windows Subsystem for Linux

First, activate WSL. Since I enjoy using Fedora, and not Ubuntu, this guide by Jonathan Bowman has helped me to set WSL exactly as I like.

Windows native SSH clients

Yes, it has tools from OpenSSH, such as the plain ssh client, ssh-agent and others. No need for PutTTY.

This guide by Chris Hastie explains how to activate SSH Agent with your private key. I’m not sure it is fairly complete, since I didn’t test yet if it adds your key in session startup for a complete password-less experience. I’m still trying.

Windows Terminal

The old command prompt is very limited, as we know, and obsolete. Luckily, Microsoft has released a new, much improved, Terminal application that can be installed from the Store.

It allows defining sessions with custom commands as ‘wsl‘ (to get into the Fedora WSL container installed above), ‘cmd‘, ‘ssh‘. I use tmux in all Linux computers that I connect, so my default access command is:

ssh -l USERNAME -A -t HOSTNAME "tmux new-session -s default -n default -P -A -D"

Windows Terminal app is highly customizable, with colors and icons. And this repo by Mark Badolato contains a great number of terminal color schemes. Select a few from the windowsterminal folder and paste their JSON snippet into the file %HOME%\AppData\Local\Packages\Microsoft.WindowsTerminal_8wekyb3d8bbwe\LocalState\settings.json.

Data Scientist × Data Analyst

Analysts inform, explain and visualize DATA THAT EXISTS in order to help business executives make strategic decisions. Thus, data analysts live in business meetings, talk to a lot of people and create data visualizations to help others understand what is going on. Tools: SQL, BI, spreadsheets, PowerPoint.

Scientists infer and calculate INFORMATION THAT STILL DOESN’T EXIST, such as the future, usually in order to optimize each and every business transaction. Example: if you like this one product, you might also like that other product. Example: according to data from surroundings, this house price should be around $X. Example: I learned how cars look like, so there is 98% chance there is a car in this photo. Thus, they create or improve digital products using machine learning and applied statistics. To create such improved user experiences, first data scientists use advanced exploratory data analysis techniques, create data visualization only for themselves, only for their better comprehension of what is going on. Tools: SQL, Pandas, math and statistics, git, programing, containers, Linux.

Data analysts tend to have a more glamorous job, while data scientists job is more hard skills oriented. Both need to work with large amounts of information, such as tables with millions or billions of data points.

There is also the Data Engineer role, which is as important as these other data professions, and focused on data availability, consistency and performance.

Inspired by Gerson Lerner’s post, I thought I should give my take on the subject too.

https://www.linkedin.com/posts/avibrazil_datascientist-dataanalyst-data-activity-7006727421861224448-9bt0

Clientes sempre ativos

No caixa, na hora de pagar uma roupa, já foram fazendo meu cadastro. Nome, CPF, e-mail, celular, aniversário.

— Precisa mesmo de tudo isso, moça?

— É que fazemos umas promoções, aí prá você ficar sabendo.

— Mas aí vocês vão me pagar para eu receber suas propagandas? Costumo cobrar por essa audição.

Ela fechou a cara com um sorriso azedo e simplesmente só cobrou o item comprado.

Marketeiros que me perdoem, mas essa mentalidade de manter o cliente sempre ativado e desejoso, sempre informado sobre as coisas que ele nem sabia que precisava, é um câncer na nossa sociedade, na minha opinião.

Eu não quis ser rude com a moça, só irônico mesmo. Mas é que esse incentivo ao consumo sem fim tem implicações terríveis sobre a nossa existência neste planeta, eu não sou ingênuo quanto a isso e nem pretendo ser conformado ou leniente.


https://facebook.com/story.php?story_fbid=pfbid0Ate7fEEC8qAyib7WULt4kyK9AFDbuSgqCzMH6YRGRKiCvueGd9Hicaz4zqnZmBaVl&id=543888243

Dicas para tirar Bilhete Único

Baita conquista dos meus filhos que agora têm Bilhete Único para facilitar circularem por São Paulo com transporte público — ônibus e metrô, com desconto nas baldeações e integrações.

🟢 Para emitir o BU, preencha o cadastro no site da SPTrans enviando foto e validando e-mail.

🟢 Crianças que moram há mais de 2km de distância da escola têm direito ao bilhete de estudante cujas passagens saem pela metade do preço ou de graça. Informe-se na escola.

🟢 Aí pegue o plástico de graça em algum terminal de ônibus urbano da cidade. Só precisa levar documento com foto. Tem terminais na cidade toda; o que fica na estação Santa Cecília do metrô é o mais perto da minha casa.

🟢 Aí adicione crédito quando e quanto quiser, pagando boleto que você emite em outro serviço da SPTrans sem taxas extras. Ou, com taxas extras, via alguns intermediários privados. Meus jovens pré-adolescentes fazem isso eles próprios, pagando o boleto com a app do banco — eles já têm conta bancária.

⚠️ Se perder o cartão do Bilhete Único, a SPTrans te emite outro ao custo de 7 passagens de ônibus. Trate de não perder!

🔷 Dica extra, só para metrô: caso esteja sem seu Bilhete Único, ou sem crédito e também sem dinheiro vivo (eu nem sei mais o que é isso), você pode comprar passagem de metrô, na hora, por Pix, interagindo com o número +55-11-3888-2200 por WhatsApp. Assim que pagar o Pix, o robô de atendimento te manda um QR via WhatsApp para passar na catraca.

Esses sites da SPTrans são meio chatinhos de usar pelo celular, mas os serviços funcionam direitinho.


https://m.facebook.com/story.php?story_fbid=pfbid0zZqiGn7kTCEviQpVcgt9sVd82QU1xRqFAvyWJjuBWtAvfA8p3aLmw2h6DVqkWu5sl&id=543888243

7 caminhos para a Felicidade

Estudo de longuíssima duração apontou os 7:

1️⃣ Exercício aeróbico

2️⃣ Espiritualidade (que pode andar junto, mas é diferente de religião) para canalizar sentimentos de gratidão, compaixão e paz

3️⃣ Experimentar coisas novas

4️⃣ Voluntariado e dedicação ao outro

5️⃣ Manter negatividade longe

6️⃣ Conexão com pessoas

7️⃣ Álcool sem exagero

https://oglobo.globo.com/saude/noticia/2022/11/os-7-habitos-que-devemos-incorporar-no-dia-a-dia-para-sermos-mais-felizes-de-acordo-com-estudos-de-harvard.ghtml

Ad Guard bloqueador de propaganda

Em todos os meus navegadores, celular e laptop, eu uso o Ad Guard para me livrar de propagandas e rastreadores indesejados. Ele também elimina popups e paywalls de vários sites. Já usei diversos outros ad blockers e este achei o melhor. A internet fica muito mais leve com ele. Ninguém me pagou para falar nada disso; recomendo porque acho muito eficiente e essencial.

https://m.facebook.com/story.php?story_fbid=pfbid0ELc1aK9XytmvL4xpU8KkhFnNYoTyK5RCNnDKvJBrxCDfGeYsSmyWyjgdKvR8142Tl&id=543888243

Má política e patrocino comercial

A marca Puma patrocina o jogador Neymar. Mas Neymar declarou apoio a um político condenado por crimes contra a humanidade (link nos comentários), conhecido pelo seu sadismo e elogios à tortura e que, nem veladamente, apoia, por exemplo, desmatamento ilegal.

Como fica a situação da Puma que é a 2ª empresa têxtil mais sustentável do mundo?

Artigo intrigante de Rodrigo Tavares na Folha de São Paulo.

https://www1-folha-uol-com-br.cdn.ampproject.org/c/s/www1.folha.uol.com.br/amp/colunas/rodrigo-tavares/2022/10/quem-devemos-boicotar-neymar-ou-a-puma.shtml
https://www.linkedin.com/posts/avibrazil_opini%C3%A3o-rodrigo-tavares-quem-devemos-boicotar-activity-6983794916590010368-BT0i

Biometria facial nos aeroportos

Por que o Serpro e os Aeroportos do Brasil adotaram biometria facial ao invés de leitor de dedo?

Porque o leitor de dedo, como sabemos, é anti-higiênico, dissemina doenças e fluidos indesejados. E porque o seu rosto é a informação mais pública que você possui. É como se houvesse alguém com memória facial infinita reconhecendo pessoas na fila, só de olhar para elas.

Além do mais:

[…] os viajantes poderão optar entre o sistema [biométrico] e os procedimentos tradicionais de check-in e embarque, que continuam disponíveis.

Não sei vocês, mas eu jamais registro ou uso meus dedos em catraca de prédio comercial. Da perspectiva de segurança da informação aquilo é um engodo, além de ser bem nojento. A única excessão que faço é em governos e para documentos, por ser situação não-banal e que se faz uma única vez.

https://www1-folha-uol-com-br.cdn.ampproject.org/c/s/www1.folha.uol.com.br/amp/mercado/2022/08/como-funciona-a-ponte-aerea-com-embarque-biometrico-entre-rio-e-sao-paulo.shtml

https://www.linkedin.com/posts/avibrazil_como-funciona-a-ponte-a%C3%A9rea-com-embarque-activity-6963080770332581888–kbd?utm_source=share&utm_medium=member_ios

State of the Windows Laptop Market

The Windows-based laptop market is a bad joke of confusing, overlapping offerings. It operates almost like a scam to underskilled consumers because manufacturers try hard to increase their profit around a purely commodity product. The results are “creative” but quite useless features as detachable keyboards, pens and tablet PCs. If you have one of those, think about the rare situations you actually used them in a comfortable way.

For a general use laptop, a $1000 MacBook Air has all the features you need, in order of importance: great high density screen (a.k.a. Retina display, most important feature, always), light and small and elegant, fast internal storage, outstanding global customer service, enough RAM (8GB minimum, 16GB recommended), modern connectivity with USB-C. Oh, and a good CPU too.

Don’t go for less than that and be aware that a similar feature set in the Windows universe will have same price, if not more. But it will be hidden under a pile of confusing, overlapping and oversized configurations.

This post was written for your private life laptop consumer self, to help you buy your next good laptop. Not for your corporate self.

https://www.macrumors.com/2022/07/05/windows-laptop-makers-worried-by-macbook-air/

https://www.linkedin.com/posts/avibrazil_windows-laptop-makers-worried-about-new-activity-6950380428016988160-6KdS?utm_source=share&utm_medium=member_ios

An old laptop

Como Escolher e Comprar um Laptop

Um laptop funcional, poderoso e elegante para a maioria das pessoas custa em torno de $1000. Um MacBook da Apple nessa faixa de preços deve atender bem 95% das pessoas: navegar na Internet, editar documentos, editar fotos/videos/multimídia simples, assistir a filmes/videos, jogos comuns e ter bateria de longa duração. Mas se você quer ir de Windows, prepare-se para atravessar a nado um oceano de ofertas confusas que fabricantes despejam no mercado em seu esforço para se diferenciarem para conquistar clientes, com características que o consumidor poderia dispensar.

As características mais importantes a se considerar estão aqui, nesta ordem. Eu quero que você compre uma coisa boa e fique blindado contra papo de vendedor que tenta te vender coisas caras e desnecessárias, ou simplesmente a velharia que ele precisa desaguar de seu estoque. Mesmo que você queira gastar mais ou menos que $1000, use este guia para priorizar as características e escolher melhor.

QUALIDADE DA TELA

Esta é a característica mais importante e onde você deve investir mais dinheiro e tempo de procura, com a finalidade de ser gentil para seus olhos. Escolha telas OLED (alto contraste) e de altíssima resolução (tipo 3000×2000 pixels ou mais). Telas Full HD (em torno de 1920×1080) são OK, mas já obsoletas.

TAMANHO FÍSICO DO COMPUTADOR

Laptop menor (13 polegadas) é melhor. Laptop maior (15 polegadas e acima) é em geral pior, leva componentes de pior qualidade, é mais pesado e deselegante. Tamanho físico não tem nenhuma relação com o poder do computador nem com sua capacidade. Você deve valorizar portabilidade (laptop pequeno e leve) sem abrir mão de poder computacional (computador útil e funcional). Se você quer tela grande, considere ligar monitor externo nas situações que precisar dele.

Fechadas estas 2 características, que são as mais importantes, o resto é configurável.

MEMÓRIA

Mais memória (RAM) dá espaço para o sistema trabalhar e por isso aumenta sua velocidade. Para a esmagadora maioria das pessoas e suas atividades, 8GB de RAM é suficiente. Vá de 16GB se você quer aumentar o tempo de vida do laptop. Mais do que isso só é realmente necessário para quem faz edição profissional de multimídia, ou para alguns tipos de programadores, ou para quem trabalha com quantidades gigantescas de dados (dezenas de gigabytes ou mais) no próprio laptop.

ARMAZENAMENTO

Este é um parâmetro importante e extremamente confuso que se desdobra em TIPO DO ARMAZENAMENTO e TAMANHO DO ARMAZENAMENTO. Armazenamento (storage) é onde suas fotos e arquivos ficam guardados até mesmo quando o computador está desligado. Hoje em dia você quer armazenamento de TIPO estado sólido (chamado SSD, é um chip especial) e que não é um disco que gira nem tem peças móveis. SSD traz velocidade ao computador. Quanto ao TAMANHO, é uma boa prática guardar fora do seu laptop, na nuvem (iCloud, Dropbox, Google Drive etc), seus arquivos de longa duração (fotos históricas da família etc), ou em um computador mais estável e de alta capacidade (soluções como NextCloud, QNAP, Synology etc). No seu laptop você deve carregar somente o que está usando agora e fazer streaming do resto. O seu laptop não deve ser o guardião das fotos da família de 10 anos atrás, pois assim você vai perdê-las. Isto posto, 256GB SSD (ou até menos) é totalmente suficiente para a maioria das pessoas. Enfiar 1 terabyte num laptop, sem motivo específico, é sinal de compra superfaturada, desague de componentes velhos, uso errado e, de certa forma, anuncia que você vai perder suas preciosas fotos.

E, por último, PROCESSADOR (CPU)

É o parâmetro menos importante, mas é o que mais recebe os holofotes. Dê preferência para o que for mais moderno e de última geração para assim aumentar o tempo de vida do seu investimento. Um processador Intel i3 ou i5 é totalmente suficiente, confortável e poderoso para praticamente qualquer pessoa. Saiba que agora estamos na geração 11 desses processadores. Saiba que geração 8 (por exemplo) é tecnologia de 4 anos atrás, e assim por diante. O fabricante AMD de processadores tem boas ofertas também, mas são menos conhecidas.

PORTAS E CONEXÕES

Conectores USB-C e USB

Seu laptop novo deve ter portas USB-C (fisicamente menores que o USB convencional, mais novas, de alta velocidade e alta potência energética) e que sejam preferencialmente Thunderbolt (não vou explicar, mas peça por isto). Pois a nova geração de periféricos é compatível com USB-C. Um usuário médio não usa mais do que 2 portas simultaneamente. Uma porta USB-C pode ser estendida com hubs ou docks que permitem ligar energia, monitor e pen-drive numa mesma porta simultaneamente. Prepare-se para um laptop fisicamente maior, mais pesado e deselegante se realmente precisar de mais portas.

OUTRAS CARACTERÍSTICAS

Sugiro você dar pouca importância para características como virar tablet, caneta, teclado removível. Com o tempo, você perceberá que nunca usa seu laptop como tablet ou com caneta pois reduzem sua produtividade e conforto. Estas são algumas características que fabricantes inventaram só para tentarem se diferenciar e que eu considero totalmente superfluas.

Trackpads contemporâneos estão muito melhores e você deve se dar alguns dias para se acostumar a eles, e aí se desvencilhar da necessidade de ficar carregando um mouse prá todo canto, pois ele já é obsoleto.

Alguns laptops vêm com chips de video especiais, como Nvidia ou Radeon. Isso encarece o laptop, tende a consumir mais energia e só é necessário para alguns jogos muito especiais. É o tipo de diferenciação inventada que eu evito quando posso.

Se você gosta de jogos ESPECIAIS, este guia não serve para você. Mas serve muitíssimo bem para jogos comuns, tipo Minecraft, Roblox, Paciência etc.

FABRICANTES

Na Apple, este laptop é um MacBook Air. Na Dell é um XPS. Linha Spectre ou Envy na HP. Linha X1 na Lenovo. Com excessão da Apple, onde o serviço e garantia funcionam e são globais, e o hardware é sempre premium, todos os fabricantes tem ofertas que parecem diferentes e confusas (eles precisam tentar se diferenciar para ganhar clientes), mas são extremamente similares e com serviço, garantia e alcance pior que a Apple. Eu recomendo Apple pelo preço, simplicidade de escolha, qualidade, e principalmente pelo suporte global que é efetivo e funciona.

Os tamanhos e configurações que citei acima fazem um laptop excelente e de uso geral em torno de $1000 nos EUA. Optei fazer assim para o guia ficar mais estável. Obviamente valores devem ser convertidos para reais e somados de impostos.

https://www.linkedin.com/pulse/como-escolher-e-comprar-um-laptop-avi-alkalay/

https://www.facebook.com/avibrazil/posts/pfbid0dEHkc2KuS4y7qG6B4siWkXPHuyU3NeHu8bbMpd3c6GoSathPDR15gZ5YZ2V96cEwl

Jupyter and Data Science on a Mac (without Anaconda)

macOS Catalina doesn’t ship with Python 3, only 2. But you can still get 3 from Apple, updated regularly through system’s official update methods. You don’t need to get the awful Anaconda on you Mac to play with Python.

Python 3 is shipped by Xcode Command Line Tools. To get it installed (without the heavy Xcode GUI), type this in your terminal:

xcode-select --install

This way, every time Apple releases an update, you’ll get it.

Settings window will pop so wait 5 minutes for the installation to finish.

If you already have complete Xcode installed, this step was unnecessary (you already had Python 3 installed) and you can continue to the next section of the tutorial.

Clean Old Python Modules

In case you already have Python installed under your user and modules downloaded with pip, remove it:

rm -rf ${HOME}/Caches/com.apple.python/${HOME}/Library/Python \
${HOME}/Library/Python/ \
${HOME}/Library/Caches/pip

Install Python Modules

Now that you get a useful Python 3 installation, use pip3 to install Python modules that you’ll need. Don’t forget to use –user to get things installed on your home folder so you won’t pollute your overall system. For my personal use, I need the complete machine learning, data wrangling and Jupyter suite:

pip3 install --user sqlalchemy
pip3 install --user matplotlib
pip3 install --user pandas
pip3 install --user jupyterlab
pip3 install --user PyMySQL
pip3 install --user configobj
pip3 install --user requests
pip3 install --user seaborn
pip3 install --user bs4
pip3 install --user xgboost
pip3 install --user scikit_learn

But you might need other things as Django or other sqlalchemy drivers. Set yourself at home and install them with pip3.

For modules that require compilation and special library, say crypto, do it like this:

CFLAGS="-I/Library/Developer/CommandLineTools/Library/Frameworks/Python3.framework/Versions/3.7/include" \
LDFLAGS="-L/Library/Developer/CommandLineTools/Library/Frameworks/Python3.framework/Versions/3.7/lib" \
pip3 install --user pycrypto

Use Correct Python 3 Binary

For some reason, Apple installs many different Python 3 binaries in different places of the system. The one that gets installed on /usr/bin/python3 has problems loading some libraries and instrumentation with install_name_tool would be required. So lets just use the binary that works better:

export PATH=/Library/Developer/CommandLineTools/usr/bin:$PATH

Run Jupyter Lab on your Mac

Commands installed by pip3 will be available in the ~/Library/Python/3.7/bin/ folder, so just add it to your PATH:

export PATH=$PATH:~/Library/Python/3.7/bin/

Now I can simply type jupyter-lab anywhere in the terminal or command line to make it fire my browser and get a Jupyter environment.

More about Xcode Command Line Tools

Xcode Command Line Tools will get you a full hand of other useful developer tools, such as git, subversion, GCC and LLVM compilers and linkers, make, m4 and a complete Python 3 distribution. You can see most of its installation on /Library/Developer/CommandLineTools folder.

For production and high end processing I’ll still use Python on Linux with my preferred distribution’s default packages (no Anaconda). But this method of getting Python on macOS is fastest and cleanest to get you going on your own data scientist laptop without a VM nor a container.

Fascínio Sempre

Esta campanha presidencial foi uma das experiências mais incríveis e inesperadas da minha vida. Contundente também.

Nos revelamos nas redes e deixamos positiva e negativamente surpresos muitos amigos. Mas nossa faceta política é só uma entre muitas que nos constituem como humanos legítimos e complexos. Se a faceta de gostos políticos de um amigo me decepcionou, sua faceta musical, profissional, culinária ou de pai/mãe pode me fascinar. E vice-versa.

Meu objetivo de vida é eliminar minhas complexidades interiores para viver em constante fascínio com todos. Conectando o meu elementar humano com o elementar humano de todos a minha volta.

Como o WhatsApp foi usado para disseminar fake news e como combater

Ao contrário do que se pensa, os robôs da campanha via WhatsApp não enviaram as fake news diretamente para milhões de brasileiros. Enviavam só para algumas centenas de grupos extremistas enormes como “Direita é o Poder”, “Parada Hétero” etc. A partir daí, seus usuários humanos propagavam organicamente os memes e fakes pelos seus grupos de família, escola e trabalho, que por sua vez também os propagavam. E foi assim que a maioria dos brasileiros receberam de seus próprios amigos (e não de robôs) a enxurrada de memes que vimos ao longo de setembro.

Todas as campanhas políticas da história lançaram mão de disseminação de boatos, propaganda enganosa, disseminação de medo, incerteza e dúvida. Essas construções da mente são, inclusive, uma das característica que nos diferenciam dos outros animais, conforme citam Yuval Harari em seu livro Sapiens e outros autores.

Mas na campanha presidencial brasileira de 2018 isso foi levado a níveis extremamente nocivos devido a junção inédita de 3 fatores:

  1. Conteúdos mais acessíveis, em forma de memes, imagens, charges, videos e também artigos. As mensagens são sutis e enviesadas, nem sempre são noticias falsas, às vezes são só piadas de mau gosto. Mas o objetivo é claro e sempre o mesmo: destilar escárnio, ódio e preconceito. Seus mensageiros, quando questionados quanto a ofensa contida na mensagem, frequentemente responderão que ela contém “a mais pura verdade”. O meme é facilmente produzido pelos próprios usuários em seus celulares ou por agências profissionais contratadas. O importante é capturar imediatamente a atenção de quem recebe o conteúdo. Veja alguns exemplos neste artigo do El Pais.
  2. Disseminação em massa do conteúdo por robôs, em grandes grupos de WhatsApp de muito interesse naquela mensagem. Trata-se de grandes grupos de WhatsApp onde a maioria dos participantes não se conhecem pessoalmente, nunca saberão se um dos números de telefone alí é um robô de disparo de mensagens. Quando o conteúdo é inserido pelo robô, a posição política coletiva do grupo entra rapidamente em sintonia com ele, e sua pitada de humor o livra de maiores questionamentos sobre sua veracidade. Um usuário mais questionador rapidamente perderia força num embate com o grupo extremista porque o massacrariam com “deixa disso”s. Depois da inserção intencional do conteúdo, começa a 2ª fase: os próprios usuários, felizes com um novo conteúdo divertido e importante, divulgam-no organicamente para seus outros grupos restritos e fechados que são da família, da escola, do trabalho e assim ele continua se propagando organicamente. A enorme maioria das pessoas acaba recebendo o conteúdo nessa segunda fase, de forma orgânica. Essa 2ª fase orgânica esconde a origem robótica e artificial da 1ª fase. A seleção inicial desses grandes grupos de WhatsApp, que têm afinidade com a mensagem que se quer transmitir, e a adição dos robôs neles, é a parte mais estratégica da campanha porque é o mecanismo para se plantar a semente. Os robôs enviam os memes somente para os grupos de interesse, nunca diretamente para pessoas avulsas, como alguns pensam.
  3. Mobilidade pervasiva. Este fator obviamente habilitou os dois anteriores. É o celular que nos chama o tempo todo e que só saberemos se é uma emergência médica de um parente ou uma bobagem qualquer depois de dar uma olhadinha.

Foi no começo de setembro que observei um aumento expressivo na disseminação de memes nos grupos da escola e da família que faço parte. É difícil saber se é puramente orgânico ou se foi estimulado por uma campanha de robôs alguns níveis antes. No meu caso, o conteúdo era encaminhado sempre por 3 usuários, um deles declaradamente de extrema direita e muito ativo politicamente.

O video da denuncia, que mostra o próprio Bolsonaro e a tela do WhatsApp em atualização frenética devido ao envio robótico de mensagens (que emergiu em 2 de outubro de 2018), revela os grupos de muito interesse através de seus nomes: “Direita é o Poder”, “Direita Ativa”, “Direita Agreste”, “BolsoMito”, “Direita Aprendiz”, “Parada Hétero” etc. Essa lista específica de grupos, aquela alta velocidade anormal de recebimento de mensagens, nas mãos de Bolsonaro, para mim comprovam o uso consciente de robôs de envio de mensagens de campanha. Todos os brasileiros puderam observar a eficácia dessa campanha visto a enxurrada de memes de ódio e escárnio que recebemos em nossos celulares. Muitos infelizmente foram permeáveis a esse ódio constante e insistentemente comunicado.

Como levantar provas sobre o conteúdo inserido no WhatsApp, ainda para as eleições de 2018

O aplicativo registra quando uma mensagem é encaminhada, pode-se ver o “Forward” ou “Encaminhado” sobre o balão da mensagem. Por trás dos panos, o aplicativo guarda uma série de metadados sobre a mensagem que numa análise forense nos servidores do WhatsApp permitiriam recriar toda a trajetória da mensagem, mesmo que o conteúdo em si é criptografado na transmissão entre usuários. Em outras palavras, via mandado judicial ou outro pedido formal, o WhatsApp seria capaz de dar um relatório completo sobre o conteúdo, incluindo quando o meme foi inicialmente publicado na rede, de qual endereço de internet, se foi usado um computador ou celular, de qual marca, de que região do planeta, número de telefone do usuário e eventualmente até seu usuário Facebook.

Como combater esse mal de forma mais definitiva no futuro

Qualquer tipo de limitação ou restrição não é a solução de longo prazo, mesmo porque o aplicativo não sabe diferenciar entre receitas de bolo e memes de ódio. Criar restrições para um tipo, valerão desnecessariamente para o outro tipo de conteúdo.

O que falta no WhatsApp é um mecanismo para que usuários denunciem conteúdo impróprio, colocando-o numa espécie de quarentena e assim evitar que outros usuários, inclusive em outros grupos façam qualquer coisa com tal conteúdo problemático. No Facebook, funcionalidade similar já foi implementada após os problemas nas eleições do Trump. Uma proposta para o WhatsApp seria o usuário selecionar o conteúdo ofensivo e denunciá-lo via alguma opção inédita no aplicativo. Uma vez decidido que é ofensivo/falso, o conteúdo passaria a ter uma moldura vermelha ou outra marca visual clara aos usuários informando que ele é problemático. O aplicativo inibiria e bloquearia outras operações sobre esse conteúdo também, como encaminhamentos, salvar no rolo da câmera etc.

Mas tudo isso, só para as próximas eleições.

Jupyter Notebook on Fedora with official packages and SSL

Jupyter Notebooks are the elegant way that Data Scientists work and all software needed to run them are already pre-packaged on Fedora (and any other Linux distribution). It is encouraged to use your distribution’s packaging infrastructure to install Python packages. Avoid at any cost installing Python packages with pip, conda, anaconda and from source code. The reasons for this good practice are security, ease of use, to keep the system clean and to make installation procedures easily reproducible in DevOps scenarios.

Jupyter Notebook on Fedora with MathJax and Python
Jupyter Notebook on Fedora with MathJax and Python

Read More

Dicas para uma Paris alternativa

Eis uma lista de dicas que costumo mandar para amigos que vão para Paris. Dicas que não são encontradas em qualquer lugar. Procure fazer tudo a pé.

Tem um mapa com alguns desses pontos aqui.
Instale o Google Maps no seu celular e copie esse mapa pro seu Google Drive prá fazer os landmarks aparecerem no seu celular.

  1. Passeie pelo bairro Marais. É antigo mas cheio de jovens, ruazinhas, falafel e crepe.
  2. Imperdível: no Marais (fale “Marré”), na minúscula rua Bourg Tibourg tem a minúscula perfumaria L’Artisain Perfumeur. Olhe pro lugar não como loja mas como um museu de cheiros sensacionais. Eu acho esse lugar incrível. Torre €90 prá comprar um frasco. Tinha uma época que a davam 20% de desconto na segunda compra, então compre uma coisa barata na primeira compra e o produto caro na segunda. Prá presente, eles tem caixas com amostras de diversos perfumes. Peça também amostras grátis que eles dão de montão.
  3. Ao lado, tem o Mariage Frère, uma loja antiga de chás muito bons. Vendem a granel. A loja é bonita e pode-se tomar chá lá também, mas eu prefiro comprar prá fazer em casa, no Brèsille. Vá de Plain Lune, Marco Polo ou um chá salgado que eles tem. Ou escolha outros pelo cheiro.
  4. Suba o morro até o Sacré-Cœur. O lugar é bem turístico, cheio da juventude, não falha. Desça pelo outro lado, prá conhecer mais bairros.
  5. A torre Eiffel é muito interessante de se visitar, mas tem filas enormes prá subir. Eu nunca subi. Repare nos nomes de dezenas de cientistas e engenheiros gravados no mezanino. Muito emocionante.
  6. No verão acontece o Paris Plages que transforma o Sena numa longa praia com pequenos eventos na beira do rio. Legal prá passear, correr, alugar bike de graça, sentir a vida parisiense. Só no verão.
  7. Há o serviço Batobus no rio Sena que pára em várias estações. Você entra e sai onde quiser, tipo a estação da torre Eiffel. Compre passe diário e divirta-se.
  8. Vá ao Louvre, tire fotos com as pirâmides no pátio, mas sugiro entrar somente se você for um estudioso entusiasta da arte. O museu é enorme, precisa-se de semanas para conhecê-lo direito e não vale a pena se vc tiver pouco tempo. Minha esposa conhece e gosta de arte e usou passe de longo prazo quando morava lá. É massante. Veja a Monalisa na Internet com mais calma. Eu fui prá Paris umas 4 vezes e nunca entrei no Louvre.
  9. Vá ao museu d’Orsay. É pequeno (2 ou 3h prá visitar tudo) e muito muito bonito. Tem Rodin, Degas, Monet, Toulouse-Lautrec e outros impressionistas. Acho que existe app pro iPhone que serve de guia.
  10. Jardim Luxembourg
  11. Jardins des Tuileries
  12. O Arco do Triunfo na Champs Élysées é uma região muito turística, cheia de gente, mas ele fica no meio do Axe historique onde uma série de monumentos se alinham e pode-se vê-los um dentro do outro
  13. …e o melhor lugar prá ver isso acho que é no Place de la Concorde, onde há o original obelisco egipcio.
  14. Ile de La Cité é a ilha central onde a cidade começou e é onde fica a Catedral Notre Dame. As pontes que conectam a ilha ao continente tem cadeados que as pessoas deixam lá como promessa.
  15. Tem uma sorveteria muito famosa numa das ilhas. Não lembro o nome…
  16. As pontes do Sena no verão são chão para piquenique dos parisienses no fim da tarde. Galera senta no chão e abre o vinho. Cada ponte tem uma história. A Pont Neuf é a mais antiga.
  17. Onde se lê “é” fale “ê”. E onde se lê “è” fale “é”. Demorei prá descobrir isso.
  18. Imperdível: vá a Fromagerie Laurent Dubois. Fromagerie é “queijaria”. Evite sábados e domingos de manhã pois há fila e você precisará de atendimento premium prá provar lascas de tudo. Prove os queijos, escolha e peça para embrulhar a vácuo e traga de presente para amigos no Brèsille. Os que mais gosto são o bleu (tipo rockfort ou o próprio rockfort verdadeiro e de origem controlada), o comté (tipo suiço) e o camembert e variações, mas tem uns 800 outros tipos lá, de cabra, de ovelha etc. Compre a vácuo prá trazer ao Brèsille no dia que você estiver voltando. Não antes. Mantenha em geladeira até o último momento e não espere muito prá comer no Brèsille. Eu costumo colocar 3 pedaços pequenos de queijos diferentes em cada envelope a vácuo e cada envelope vai de presente prum amigo diferente. Na viagem de volta, despache os envelopes com queijos na bagagem. Não traga na bagagem de mão pois vão achar que há algum defunto na cabine. Se o Dubois for fora de mão, há outras queijarias, mas não encontrei outras tão impressionantes e tradicionais. Última viagem trouxe uns 12 envelopes da felicidade prá distribuir. Não compre queijos no supermercado.
  19. Prove também saucisson, um salame defumado muito cheiroso.
  20. Vende-se também nos supermercados latas de escargot e de patês de fígado de pato e de ganso. Fique à vontade…
  21. Vá a boulangers (padarias) porque os pães são ótimos, principalmente os com sementes. Tem em todo canto. Nos boulangers há o famoso pain au chocolat, uma espécie de croissant recheado de chocolate. E também o com amêndoas.
  22. Nas patisseries (tipo de docerias) há o famoso macaron de vários sabores, que é uma espécie de sanduichinho colorido com massa de farinha de amendoa. Delícia total. Dizem que o melhor macaron de Paris é o Ladurée Royale, mas é super metido a besta; fica perto do metrô Madeleine. Sugiro não trazer pro Brèsille pq é super frágil. Coma em Paris mesmo.
  23. Vá ao Le Calbar, um bar minúsculo numa rua minúscula cujo dono e barman é mundialmente premiado e faz uns coquetéis diferentes e decliciosos. Um amigo parisiense me levou lá e adoramos. É coisa de local, turista não conheçe.
  24. Verão na Europa produz melões rosados sensacionais, pêssegos, ameixas e nectarinas suculentos. Dificil encontrar assim no Brèsille. Prove as frutas da estação.
  25. Fique atento a postes baixos de metal com uma placa em formato de brasão. São pontos históricos. Nesses lugares há casas medievais curiosas e entortadas pelo tempo, ou outros monumentos históricos.
  26. Repare na arquitetura art nouveau das estações de metrô. Adoro.
  27. Jantamos numa sexta ou sábado num restaurante chamado La Terrasse Saint Catherine, apinhado de gente. Nem lembro da comida, mas fica numa praça charmosíssima de mesmo nome onde músicos de rua se apresentavam e crianças brincavam. Super idílico. Paris é cheia dessas micro-praças ultra-lindas. Ligue antes para reservar. Há outros restaurantes nessa praça.
  28. Outro jantar maneiro foi no judaico Chez Marianne, no Marais. Nada de especial, mas cito porque só tenho boas lembranças. As mesas geralmente são na calçada em todos os restaurantes… as pessoas adoram ver outras pessoas passando na rua.
  29. Aproveite a diferença de fuso prá fazer noites estendidas. Vale a pena.

Tem os landmarks famosos aqui, mas não é o roteiro que eu focaria: https://en.wikipedia.org/wiki/Landmarks_in_Paris

Proteja seu computador e seus arquivos de ataques e ransomware

A Internet sofreu um ataque de grandes proporções recentemente, conhecido como WannaCry. Nada melhor do que aproveitar o medinho que isso causou nas pessoas para se protegerem de próximos ataques. Siga as dicas aqui sozinho, ou peça para um amigo te ajudar a configurar seu computador. É tudo gratuito e fácil. As duas primeiras são para Windows, o resto serve para qualquer pessoa.

  1. Ative as atualizações automáticas do Windows, conhecido como Windows Update (Configurações ➡ Atualização e Segurança). De tempos em tempos seu computador vai pedir para reiniciar para instalar essas atualizações.
  2. Você não precisa de anti-virus extra. O Windows já vem com um anti-virus gratuito muito bom chamado Windows Defender. Basta ativá-lo e mantê-lo atualizado (via a dica anterior). Se seu computador já veio de fábrica com o MacAfee, Symantec etc, o período de testes acabou e ele te pede para pagar para ficar protegido, desinstále-o completamente para que ele pare de te irritar (e ative o Windows Defender).
  3. Em hipótese alguma instale o Adobe PDF Reader. Desinstale completamente se o tiver instalado. O Windows puro (e Mac e Linux) já é capaz de mostrar PDFs, sem a necessidade de programas externos. O Adobe PDF Reader é inseguro, inútil, gordo e desnecessário. Hoje serve mais como canal para a Adobe te bombardear com propaganda. Se achar que precisa realmente de um leitor de PDF, vá de Foxit, bem mais leve e menos agressivo. Sub-dica: PDF é um formato obsoleto, otimizado para a era do papel (agora já estamos na era digital). Considere parar de usar este tipo de arquivo.
  4. Instale no navegador um bloqueador de propaganda (ad block). É muito comum as pessoas pegarem virus através de uma propaganda enganosa que aparecem inclusive em sites confiáveis. Um bloqueador tornará sua experiência na Web mais leve, limpa e segura pois evita as partes da página que contém propagandas — elas simplesmente desaparecem sem ocupar espaço nem banda de Internet. Eu uso o AdBlock Plus mas há outros, inclusive para seu smartphone.
  5. Tenha um navegador extra para usar somente quando acessa sites suspeitos. Por exemplo, se você usa o Chrome no dia a dia, mantenha um Firefox instalado para esse uso. Ou se prefere o Firefox para o dia a dia, use o navegador do Windows como secundário. E assim por diante. No meu Mac eu uso o Safari (que vem de fábrica) e tenho o Firefox como navegador extra.
  6. Não instale e evite usar o Adobe Flash Player. Novamente, é inseguro, pesado e obsoleto. Se não tiver jeito, instale e use-o somente no navegador extra (da dica anterior).
  7. Mantenha seus arquivos pessoais numa pasta que sincroniza e faz backup automático em algum serviço na nuvem. O plano gratuito desses serviços costuma ser suficiente para a maioria das pessoas. Tem o Box (é o que a empresa me dá para usar) (10GB grátis), Dropbox (5GB grátis), Mega (50GB grátis); todos pedem para instalar um programa (opcional) no seu computador para o backup automático. No Windows já vem de fábrica o OneDrive (5GB grátis), no mundo Apple tem o iCloud Drive (5GB grátis). Há também o Google Drive (15GB grátis). Estes serviços mantém cópia de seus arquivos e fotos na nuvem, caso seu computador seja roubado ou pife, e permitem também acesso a eles quando você não estiver perto de seu PC, através de seu smartphone. Além disso, alguns deles oferecem também ótimos editores de planilhas e documentos em geral, tudo na nuvem, como o Google Drive, iCloud e OneDrive.
  8. Se você usa o Gmail, use endereços especiais infinitos para se cadastrar em serviços da Internet. Por exemplo, se seu endereço é meunome@gmail.com, use meunome+assinatura_da_revista@gmail.com para se cadastrar no suposto serviço assinatura_da_revista. Tudo o que aparece entre o ‘+’ e o ‘@’ é de livre escolha sua. Quando o Gmail recebe uma mensagem para esse endereço, a entrega do mesmo jeito para você e já a marca com uma tag/etiqueta ‘assinatura_da_revista’ automaticamente. Permite também você tratar essas mensagens de forma diferente e automática, por exemplo, criando um filtro no Gmail que joga na lixeira todas as mensagens destinadas a meunome+assinatura_da_revista@gmail.com.

Advanced Multimedia on the Linux Command Line

There was a time that Apple macOS was the best platform to handle multimedia (audio, image, video). This might be still true in the GUI space. But Linux presents a much wider range of possibilities when you go to the command line, specially if you want to:

  • Process hundreds or thousands of files at once
  • Same as above, organized in many folders while keeping the folder structure
  • Same as above but with much fine grained options, including lossless processing, pixel perfectness that most GUI tools won’t give you

The Open Source community has produced state of the art command line tools as ffmpeg, exiftool and others, which I use every day to do non-trivial things, along with Shell advanced scripting. Sure, you can get these tools installed on Mac or Windows, and you can even use almost all these recipes on these platforms, but Linux is the native platform for these tools, and easier to get the environment ready.

These are my personal notes and I encourage you to understand each step of the recipes and adapt to your workflows. It is organized in Audio, Video and Image+Photo sections.

I use Fedora Linux and I mention Fedora package names to be installed. You can easily find same packages on your Ubuntu, Debian, Gentoo etc, and use these same recipes.

Audio

Show information (tags, bitrate etc) about a multimedia file

ffprobe file.mp3
ffprobe file.m4v
ffprobe file.mkv

Lossless conversion of all FLAC files into more compatible, but still Open Source, ALAC

ls *flac | while read f; do
	ffmpeg -i "$f" -acodec alac -vn "${f[@]/%flac/m4a}" < /dev/null;
done

Convert all FLAC files into 192kbps MP3

ls *flac | while read f; do
   ffmpeg -i "$f" -qscale:a 2 -vn "${f[@]/%flac/mp3}" < /dev/null;
done

Convert all FLAC files into ~256kbps VBR AAC with Fraunhofer AAC encoder

First, make sure you have Negativo17 build of FFMPEG, so run this as root:

dnf config-manager --add-repo=http://negativo17.org/repos/fedora-multimedia.repo
dnf update ffmpeg

Now encode:

ls *flac | while read f; do
   ffmpeg -i "$f" -vn -c:a libfdk_aac -vbr 5 -movflags +faststart "${f[@]/%flac/m4a}" < /dev/null;
done

Has been said the Fraunhofer AAC library can’t be legally linked to ffmpeg due to license terms violation. In addition, ffmpeg’s default AAC encoder has been improved and is almost as good as Fraunhofer’s, specially for constant bit rate compression. In this case, this is the command:

ls *flac | while read f; do
   ffmpeg -i "$f" -vn -c:a aac -b:a 256k -movflags +faststart "${f[@]/%flac/m4a}" < /dev/null;
done

Same as above but under a complex directory structure

This is one of my favorites, extremely powerful. Very useful when you get a Hi-Fi, complete but useless WMA-Lossless collection and need to convert it losslesslly to something more portable, ALAC in this case. Change the FMT=flac to FMT=wav or FMT=wma (only when it is WMA-Lossless) to match your source files. Don’t forget to tag the generated files.

FMT=flac
# Create identical directory structure under new "alac" folder
find . -type d | while read d; do
   mkdir -p "alac/$d"
done

find . -name "*$FMT" | sort | while read f; do
   ffmpeg -i "$f" -acodec alac -vn "alac/${f[@]/%$FMT/m4a}" < /dev/null;
   mp4tags -E "Deezer lossless files (https://github.com/Ghostfly/deezDL) + 'ffmpeg -acodec alac'" "alac/${f[@]/%$FMT/m4a}";
done

Embed lyrics into M4A files

iPhone and iPod music player can display the file’s embedded lyrics and this is a cool feature. There are several ways to get lyrics into your music files. If you download music from Deezer using SMLoadr, you’ll get files with embedded lyrics. Then, the FLAC to ALAC process above will correctly transport the lyrics to the M4A container. Another method is to use beets music tagger and one of its plugins, though it is very slow for beets to fetch lyrics of entire albums from the Internet.

The third method is manual. Let lyrics.txt be a text file with your lyrics. To tag it into your music.m4a, just do this:

mp4tags -L "$(cat lyrics.txt)" music.m4a

And then check to see the embedded lyrics:

ffprobe music.m4a 2>&1 | less

Convert APE+CUE, FLAC+CUE, WAV+CUE album-on-a-file into a one file per track ALAC or MP3

If some of your friends has the horrible tendency to commit this crime and rip CDs as 1 file for entire CD, there is an automation to fix it. APE is the most difficult and this is what I’ll show. FLAC and WAV are shortcuts of this method.

  1. Make a lossless conversion of the APE file into something more manageable, as WAV:
    ffmpeg -i audio-cd.ape audio-cd.wav
  2. Now the magic: use the metadata on the CUE file to split the single file into separate tracks, renaming them accordingly. You’ll need the shnplit command, available in the shntool package on Fedora (to install: yum install shntool). Additionally, CUE files usually use ISO-8859-1 (Latin1) charset and a conversion to Unicode (UTF-8) is required:
    iconv -f Latin1 -t UTF-8 audio-cd.cue | shnsplit -t "%n · %p ♫ %t" audio-cd.wav
  3. Now you have a series of nicely named WAV files, one per CD track. Lets convert them into lossless ALAC using one of the above recipes:
    ls *wav | while read f; do
       ffmpeg -i "$f" -acodec alac -vn "${f[@]/%wav/m4a}" < /dev/null;
    done

    This will get you lossless ALAC files converted from the intermediary WAV files. You can also convert them into FLAC or MP3 using variations of the above recipes.

Now the files are ready for your tagger.

Video

Add chapters and soft subtitles from SRT file to M4V/MP4 movie

This is a lossless and fast process, chapters and subtitles are added as tags and streams to the file; audio and video streams are not reencoded.

  1. Make sure your SRT file is UTF-8 encoded:
    bash$ file subtitles_file.srt
    subtitles_file.srt: ISO-8859 text, with CRLF line terminators
    

    It is not UTF-8 encoded, it is some ISO-8859 variant, which I need to know to correctly convert it. My example uses a Brazilian Portuguese subtitle file, which I know is ISO-8859-15 (latin1) encoded because most latin scripts use this encoding.

  2. Lets convert it to UTF-8:
    bash$ iconv -f latin1 -t utf8 subtitles_file.srt > subtitles_file_utf8.srt
    bash$ file subtitles_file_utf8.srt
    subtitles_file_utf8.srt: UTF-8 Unicode text, with CRLF line terminators
    
  3. Check chapters file:
    bash$ cat chapters.txt
    CHAPTER01=00:00:00.000
    CHAPTER01NAME=Chapter 1
    CHAPTER02=00:04:31.605
    CHAPTER02NAME=Chapter 2
    CHAPTER03=00:12:52.063
    CHAPTER03NAME=Chapter 3
    …
    
  4. Now we are ready to add them all to the movie along with setting the movie name and embedding a cover image to ensure the movie looks nice on your media player list of content. Note that this process will write the movie file in place, will not create another file, so make a backup of your movie while you are learning:
    MP4Box -ipod \
           -itags 'track=The Movie Name:cover=cover.jpg' \
           -add 'subtitles_file_utf8.srt:lang=por' \
           -chap 'chapters.txt:lang=eng' \
           movie.mp4
    

The MP4Box command is part of GPac.

OpenSubtitles.org has a large collection of subtitles in many languages and you can search its database with the IMDB ID of the movie. And ChapterDB has the same for chapters files.

Add cover image and other metadata to a movie file

Since iTunes can tag and beautify your movie files in Windows and Mac, libmp4v2 can do the same on Linux. Here we’ll use it to add the movie cover image we downloaded from IMDB along with some movie metadata for Woody Allen’s 2011 movie Midnight in Paris:

mp4tags -H 1 -i movie -y 2011 -a "Woody Allen" -s "Midnight in Paris" -m "While on a trip to Paris with his..." "Midnight in Paris.m4v"
mp4art -k -z --add cover.jpg "Midnight in Paris.m4v"

This way the movie file will look good and in the correct place when transferred to your iPod/iPad/iPhone.

Of course, make sure the right package is installed first:

dnf install libmp4v2

File extensions MOV, MP4, M4V, M4A are the same format from the ISO MPEG-4 standard. They have different names just to give a hint to the user about what they carry.

Decrypt and rip a DVD the loss less way

  1. Make sure you have the RPMFusion and the Negativo17 repos configured
  2. Install libdvdcss and vobcopy
    dnf -y install libdvdcss vobcopy
  3. Mount the DVD and rip it, has to be done as root
    mount /dev/sr0 /mnt/dvd;
    cd /target/folder;
    vobcopy -m /mnt/dvd .

You’ll get a directory tree with decrypted VOB and BUP files. You can generate an ISO file from them or, much more practical, use HandBrake to convert the DVD titles into MP4/M4V (more compatible with wide range of devices) or MKV/WEBM files.

Convert 240fps video into 30fps slow motion, the loss-less way

Modern iPhones can record videos at 240 or 120fps so when you’ll watch them at 30fps they’ll look slow-motion. But regular players will play them at 240 or 120fps, hiding the slo-mo effect.

We’ll need to handle audio and video in different ways. The video FPS fix from 240 to 30 is loss less, the audio stretching is lossy.

# make sure you have the right packages installed
dnf install mkvtoolnix sox gpac faac
#!/bin/bash

# Script by Avi Alkalay
# Freely distributable

f="$1"
ofps=30
noext=${f%.*}
ext=${f##*.}

# Get original video frame rate
ifps=`ffprobe -v error -select_streams v:0 -show_entries stream=r_frame_rate -of default=noprint_wrappers=1:nokey=1 "$f" < /dev/null  | sed -e 's|/1||'`
echo

# exit if not high frame rate
[[ "$ifps" -ne 120 ]] && [[ "$ifps" -ne 240 ]] && exit

fpsRate=$((ifps/ofps))
fpsRateInv=`awk "BEGIN {print $ofps/$ifps}"`

# loss less video conversion into 30fps through repackaging into MKV
mkvmerge -d 0 -A -S -T \
	--default-duration 0:${ofps}fps \
	"$f" -o "v$noext.mkv"

# loss less repack from MKV to MP4
ffmpeg -loglevel quiet -i "v$noext.mkv" -vcodec copy "v$noext.mp4"
echo

# extract subtitles, if original movie has it
ffmpeg -loglevel quiet -i "$f" "s$noext.srt"
echo

# resync subtitles using similar method with mkvmerge
mkvmerge --sync "0:0,${fpsRate}" "s$noext.srt" -o "s$noext.mkv"

# get simple synced SRT file
rm "s$noext.srt"
ffmpeg -i "s$noext.mkv" "s$noext.srt"

# remove undesired formating from subtitles
sed -i -e 's|<font size="8"><font face="Helvetica">\(.*\)</font></font>|\1|' "s$noext.srt"

# extract audio to WAV format
ffmpeg -loglevel quiet -i "$f" "$noext.wav"

# make audio longer based on ratio of input and output framerates
sox "$noext.wav" "a$noext.wav" speed $fpsRateInv

# lossy stretched audio conversion back into AAC (M4A) 64kbps (because we know the original audio was mono 64kbps)
faac -q 200 -w -s --artist a "a$noext.wav"

# repack stretched audio and video into original file while removing the original audio and video tracks
cp "$f" "${noext}-slow.${ext}"
MP4Box -ipod -rem 1 -rem 2 -rem 3 -add "v$noext.mp4" -add "a$noext.m4a" -add "s$noext.srt" "${noext}-slow.${ext}"

# remove temporary files 
rm -f "$noext.wav" "a$noext.wav" "v$noext.mkv" "v$noext.mp4" "a$noext.m4a" "s$noext.srt" "s$noext.mkv"

1 Photo + 1 Song = 1 Movie

If the audio is already AAC-encoded (may also be ALAC-encoded), create an MP4/M4V file:

ffmpeg -loop 1 -framerate 0.2 -i photo.jpg -i song.m4a -shortest -c:v libx264 -tune stillimage -vf scale=960:-1 -c:a copy movie.m4v

The above method will create a very efficient 0.2 frames per second (-framerate 0.2) H.264 video from the photo while simply adding the audio losslessly. Such very-low-frames-per-second video may present sync problems with subtitles on some players. In this case simply remove the -framerate 0.2 parameter to get a regular 25fps video with the cost of a bigger file size.

The -vf scale=960:-1 parameter tells FFMPEG to resize the image to 960px width and calculate the proportional height. Remove it in case you want a video with the same resolution of the photo. A 12 megapixels photo file (around 4032×3024) will get you a near 4K video.

If the audio is MP3, create an MKV file:

ffmpeg -loop 1 -framerate 0.2 -i photo.jpg -i song.mp3 -shortest -c:v libx264 -tune stillimage -vf scale=960:-1 -c:a copy movie.mkv

If audio is not AAC/M4A but you still want an M4V file, convert audio to AAC 192kbps:

ffmpeg -loop 1 -framerate 0.2 -i photo.jpg -i song.mp3 -shortest -c:v libx264 -tune stillimage -vf scale=960:-1 -c:a aac -strict experimental -b:a 192k movie.m4v

See more about FFMPEG photo resizing.

There is also a more efficient and completely lossless way to turn a photo into a video with audio, using extended podcast techniques. But thats much more complicated and requires advanced use of GPAC’s MP4Box and NHML. In case you are curious, see the Podcast::chapterize() and Podcast::imagify() methods in my  music-podcaster script. The trick is to create an NHML (XML) file referencing the image(s) and add it as a track to the M4A audio file.

Image and Photo

Move images with no EXIF header to another folder

mkdir noexif;
exiftool -filename -T -if '(not $datetimeoriginal or ($datetimeoriginal eq "0000:00:00 00:00:00"))' *HEIC *JPG *jpg | while read f; do mv "$f" noexif/; done

Set EXIF photo create time based on file create time

Warning: use this only if image files have correct creation time on filesystem and if they don’t have an EXIF header.

exiftool -overwrite_original '-DateTimeOriginal< ${FileModifyDate}' *CR2 *JPG *jpg

Rotate photos based on EXIF’s Orientation flag, plus make them progressive. Lossless

jhead -autorot -cmd "jpegtran -progressive '&i' > '&o'" -ft *jpg

Rename photos to a more meaningful filename

This process will rename silly, sequential, confusing and meaningless photo file names as they come from your camera into a readable, sorteable and useful format. Example:

IMG_1234.JPG2015.07.24-17.21.33 • Max playing with water【iPhone 6s✚】.jpg

Note that new file name has the date and time it was taken, whats in the photo and the camera model that was used.

  1. First keep the original filename, as it came from the camera, in the OriginalFileName tag:
    exiftool -overwrite_original '-OriginalFileName<${filename}' *CR2 *JPG *jpg
  2. Now rename:
    exiftool '-filename<${DateTimeOriginal} 【${Model}】%.c.%e' -d %Y.%m.%d-%H.%M.%S *CR2 *HEIC *JPG *jpg
  3. Remove the ‘0’ index if not necessary:
    \ls *HEIC *JPG *jpg *heic | while read f; do
        nf=`echo "$f" | sed -e 's/0.JPG/.jpg/i; s/0.HEIC/.heic/i'`;
        t=`echo "$f" | sed -e 's/0.JPG/1.jpg/i; s/0.HEIC/1.heic/i'`;
        [[ ! -f "$t" ]] && mv "$f" "$nf";
    done

    Alternative for macOS without SED:

    \ls *HEIC *JPG *jpg *heic | perl -e '
    	while (<>) {
    		chop; $nf=$_; $t=$_;
    		$nf=~s/0.JPG/.jpg/i; $nf=~s/0.HEIC/.heic/i;
    		$t=~s/0.JPG/1.jpg/i; $t=~s/0.HEIC/1.heic/i;
    		rename($_,$nf) if (! -e $t);
    	}'
  4. Optional: make lower case extensions:
    \ls *HEIC *JPG | while read f; do
        nf=`echo "$f" | sed -e 's/JPG/jpg/; s/HEIC/heic/'`;
        mv "$f" "$nf";
    done
  5. Optional: simplify camera name, for example turn “Canon PowerShot G1 X” into “Canon G1X” and make lower case extension at the same time:
    \ls *HEIC *JPG *jpg *heic | while read f; do
        nf=`echo "$f" | sed -e 's/Canon PowerShot G1 X/Canon G1X/;
          s/iPhone 6s Plus/iPhone 6s✚/;
          s/iPhone 7 Plus/iPhone 7✚/;
          s/Canon PowerShot SD990 IS/Canon SD990 IS/;
          s/HEIC/heic/;
          s/JPG/jpg/;'`;
        mv "$f" "$nf";
    done

You’ll get file names as 2015.07.24-17.21.33 【Canon 5D Mark II】.jpg. If you took more then 1 photo in the same second, exiftool will automatically add an index before the extension.

Even more semantic photo file names based on Subject tag

\ls *【*】* | while read f; do
	s=`exiftool -T -Subject "$f"`;
	if [[ " $s" != " -" ]]; then         
		nf=`echo "$f" | sed -e "s/ 【/ • $s 【/; s/\:/∶/g;"`;
		mv "$f" "$nf";
	fi;
done

Copy Subject tag to Title-related tags

exiftool -overwrite_original '-ImageDescription< ${Subject}' '-XPTitle<${Subject}' '-Title<${Subject}' '-Description<${Subject}' '-Caption-Abstract<${Subject}' *jpg

Full rename: a consolidation of some of the previous commands

exiftool '-filename<${DateTimeOriginal} • ${Subject} 【${Model}】%.c.%e' -d %Y.%m.%d-%H.%M.%S *CR2 *JPG *HEIC *jpg *heic

Set photo “Creator” tag based on camera model

  1. First list all cameras that contributed photos to current directory:
    exiftool -T -Model *jpg | sort -u

    Output is the list of camera models on this photos:

    Canon EOS REBEL T5i
    DSC-H100
    iPhone 4
    iPhone 4S
    iPhone 5
    iPhone 6
    iPhone 6s Plus
  2. Now set creator on photo files based on what you know about camera owners:
    CRE="John Doe";    exiftool -overwrite_original -creator="$CRE" -by-line="$CRE" -Artist="$CRE" -if '$Model=~/DSC-H100/'            *.jpg
    CRE="Jane Black";  exiftool -overwrite_original -creator="$CRE" -by-line="$CRE" -Artist="$CRE" -if '$Model=~/Canon EOS REBEL T5i/' *.jpg
    CRE="Mary Doe";    exiftool -overwrite_original -creator="$CRE" -by-line="$CRE" -Artist="$CRE" -if '$Model=~/iPhone 5/'            *.jpg
    CRE="Peter Black"; exiftool -overwrite_original -creator="$CRE" -by-line="$CRE" -Artist="$CRE" -if '$Model=~/iPhone 4S/'           *.jpg
    CRE="Avi Alkalay"; exiftool -overwrite_original -creator="$CRE" -by-line="$CRE" -Artist="$CRE" -if '$Model=~/iPhone 6s Plus/'      *.jpg

Recursively search people in photos

If you geometrically mark people faces and their names in your photos using tools as Picasa, you can easily search for the photos which contain “Suzan” or “Marcelo” this way:

exiftool -fast -r -T -Directory -FileName -RegionName -if '$RegionName=~/Suzan|Marcelo/' .

-Directory, -FileName and -RegionName specify the things you want to see in the output. You can remove -RegionName for a cleaner output.
The -r is to search recursively. This is pretty powerful.

Make photos timezone-aware

Your camera will tag your photos only with local time on CreateDate or DateTimeOriginal tags. There is another set of tags called GPSDateStamp and GPSTimeStamp that must contain the UTC time the photos were taken, but your camera won’t help you here. Hopefully you can derive these values if you know the timezone the photos were taken. Here are two examples, one for photos taken in timezone -02:00 (Brazil daylight savings time) and on timezone +09:00 (Japan):

exiftool -overwrite_original '-gpsdatestamp<${CreateDate}-02:00' '-gpstimestamp<${CreateDate}-02:00' '-TimeZone<-02:00' '-TimeZoneCity<São Paulo' *.jpg
exiftool -overwrite_original '-gpsdatestamp<${CreateDate}+09:00' '-gpstimestamp<${CreateDate}+09:00' '-TimeZone<+09:00' '-TimeZoneCity<Tokio' Japan_Photos_folder

Use exiftool to check results on a modified photo:

exiftool -s -G -time:all -gps:all 2013.10.12-23.45.36-139.jpg
[EXIF]          CreateDate                      : 2013:10:12 23:45:36
[Composite]     GPSDateTime                     : 2013:10:13 01:45:36Z
[EXIF]          GPSDateStamp                    : 2013:10:13
[EXIF]          GPSTimeStamp                    : 01:45:36

This shows that the local time when the photo was taken was 2013:10:12 23:45:36. To use exiftool to set timezone to -02:00 actually means to find the correct UTC time, which can be seen on GPSDateTime as 2013:10:13 01:45:36Z. The difference between these two tags gives us the timezone. So we can read photo time as 2013:10:12 23:45:36-02:00.

Geotag photos based on time and Moves mobile app records

Moves is an amazing app for your smartphone that simply records for yourself (not social and not shared) everywhere you go and all places visited, 24h a day.

  1. Make sure all photos’ CreateDate or DateTimeOriginal tags are correct and precise, achieve this simply by setting correctly the camera clock before taking the pictures.
  2. Login and export your Moves history.
  3. Geotag the photos informing ExifTool the timezone they were taken, -08:00 (Las Vegas) in this example:
    exiftool -overwrite_original -api GeoMaxExtSecs=86400 -geotag ../moves_export/gpx/yearly/storyline/storyline_2015.gpx '-geotime<${CreateDate}-08:00' Folder_with_photos_from_trip_to_Las_Vegas

Some important notes:

  • It is important to put the entire ‘-geotime’ parameter inside simple apostrophe or simple quotation mark (), as I did in the example.
  • The ‘-geotime’ parameter is needed even if image files are timezone-aware (as per previous tutorial).
  • The ‘-api GeoMaxExtSecs=86400’ parameter should not be used unless the photo was taken more than 90 minutes of any detected movement by the GPS.

Concatenate all images together in one big image

  • In 1 column and 8 lines:
    montage -mode concatenate -tile 1x8 *jpg COMPOSED.JPG
  • In 8 columns and 1 line:
    montage -mode concatenate -tile 8x1 *jpg COMPOSED.JPG
  • In a 4×2 matrix:
    montage -mode concatenate -tile 4x2 *jpg COMPOSED.JPG

The montage command is part of the ImageMagick package.

Docker on Bluemix with services

Docker on Bluemix with automated full-stack deploys and delivery pipelines

Introduction

This document explains working examples on how to use Bluemix platform advanced features such as:

  • Docker on Bluemix, integrated with Bluemix APIs and middleware
  • Full stack automated and unattended deployments with DevOps Services Pipeline, including Docker
  • Full stack automated and unattended deployments with cf command line interface, including Docker

For this, I’ll use the following source code structure:

github.com/avibrazil/bluemix-docker-kickstart

The source code currently brings to life (as an example), integrated with some Bluemix services and Docker infrastructure, a PHP application (the WordPress popular blogging platform), but it could be any Python, Java, Ruby etc app.

This is how full stack app deployments should be

Before we start: understand Bluemix 3 pillars

I feel it is important to position what Bluemix really is and which of its parts we are going to use. Bluemix is composed of 3 different things:

  1. Bluemix is a hosting environment to run any type of web app or web service. This is the only function provided by the CloudFoundry Open Source project, which is an advanced PaaS that lets you provision and de-provision runtimes (Java, Python, Node etc), libraries and services to be used by your app. These operations can be triggered through the Bluemix.net portal or by the cf command from your laptop. IBM has extended this part of Bluemix with functions not currently available on CloudFoundry, notably the capability of executing regular VMs and Docker containers.
  2. Bluemix provides pre-installed libraries, APIs and middleware. IBM is constantly adding functions to the Bluemix marketplace, such as cognitive computing APIs in the Watson family, data processing middleware such as Spark and dashDB, or even IoT and Blockchain-related tools. These are high value components that can add a bit of magic to your app. Many of those are Open Source.
  3. DevOps Services. Accessible from hub.jazz.net, it provides:
    • Public and private collaborative Git repositories.
    • UI to build, manage and execute the app delivery pipeline, which does everything needed to transform your pure source code into a final running application.
    • The Track & Plan module, based on Rational Team Concert, to let your team mates and clients exchange activities and control project execution.

This tutorial will dive into #1 and some parts of #3, while using some services from #2.

The architecture of our app

Docker on Bluemix with services

When fully provisioned, the entire architecture will look like this. Several Bluemix services (MySQL, Object store) packaged into a CloudFoundry App (bridge app) that serves some Docker containers that in turns do the real work. Credentials to access those services will be automatically provided to the containers as environment variables (VCAP_SERVICES).

Structure of Source Code

The example source code repo contains boilerplate code that is intentionally generic and clean so you can easily fork, add and modify it to fit your needs. Here is what it contains:

bridge-app folder and manifest.yml file
The CloudFoundry manifest.yml that defines app name, dependencies and other characteristics to deploy the app contents under bridge-app.
containers
Each directory contains a Dockerfile and other files to create Docker containers. In this tutorial we’ll use only the phpinfo and wordpress directories, but there are some other useful examples you can use.
.bluemix folder
When this code repository is imported into Bluemix via the “Deploy to Bluemix” button, metadata in here will be used to set up your development environment under DevOps Services.
admin folder
Random shell scripts, specially used for deployments.

Watch the deployment

The easiest way to deploy the app is through DevOps Services:

  1. Click to deploy

    Deploy to Bluemix

  2. Provide a unique name to your copy of the app, also select the target Bluemix space
    Deploy to Bluemix screen
  3. Go to DevOps Services ➡ find your project clone ➡ select Build & Deploy tab and watch
    Full Delivery Pipeline on Bluemix

Under the hood: understand the app deployment in 2 strategies

Conceptually, these are the things you need to do to fully deploy an app with Docker on Bluemix:

  1. Instantiate external services needed by your app, such as databases, APIs etc.
  2. Create a CloudFoundry app to bind those services so you can handle them all as one block.
  3. Create the Docker images your app needs and register them on your Bluemix private Docker Registry (equivalent to the public Docker Hub).
  4. Instantiate your images in executable Docker containers, connecting them to your backend services through the CloudFoundry app.

The idea is to encapsulate all these steps in code so deployments can be done entirely unattended. Its what I call brainless 1-click deployment. There are 2 ways to do that:

  • A regular shell script that extensively uses the cf command. This is the admin/deploy script in our code.
  • An in-code delivery pipeline that can be executed by Bluemix DevOps Services. This is the .bluemix/pipeline.yml file.

From here, we will detail each of these steps both as commands (on the script) and as stages of the pipeline.

  1. Instantiation of external services needed by the app…

    I used the cf marketplace command to find the service names and plans available. ClearDB provides MySQL as a service. And just as an example, I’ll provision an additional Object Storage service. Note the similarities between both methods.

    Deployment Script
    cf create-service \
      cleardb \
      spark \
      bridge-app-database;
    
    cf create-service \
      Object-Storage \
      Free \
      bridge-app-object-store;
    Delivery Pipeline

    When you deploy your app to Bluemix, DevOps Services will read your manifest.yml and automatically provision whatever is under the declared-services block. In our case:

    declared-services:
      bridge-app-database:
        label: cleardb
        plan: spark
      bridge-app-object-store:
        label: Object-Storage
        plan: Free
    
  2. Creation of an empty CloudFoundry app to hold together these services

    The manifest.yml file has all the details about our CF app. Name, size, CF build pack to use, dependencies (as the ones instantiated in previous stage). So a plain cf push will use it and do the job. Since this app is just a bridge between our containers and the services, we’ll use minimum resources and the minimum noop-buildpack. After this stage you’ll be able to see the app running on your Bluemix console.

    Deployment Script
    Delivery Pipeline
    Stage named “➊ Deploy CF bridge app” simply calls cf push;
  3. Creation of Docker images

    The heavy lifting here is done by the Dockerfiles. We’ll use base CentOS images with official packages only in an attempt to use best practices. See phpinfo and wordpress Dockerfiles to understand how I improved a basic OS to become what I need.

    The cf ic command is basically a clone of the well known docker command, but pre-configured to use Bluemix Docker infrastructure. There is simple documentation to install the IBM Containers plugin to cf.

    Deployment Script
    cf ic build \
       -t phpinfo_image \
       containers/phpinfo/;
    
    cf ic build \
       -t wordpress_image \
       containers/wordpress/;
    
    
    Delivery Pipeline

    Stages handling this are “➋ Build phpinfo Container” and “➍ Build wordpress Container”.

    Open these stages and note how image names are set.

    After this stage, you can query your Bluemix private Docker Registry and see the images there. Like this:

    $ cf ic images
    REPOSITORY                                          TAG     IMAGE ID      CREATED     SIZE
    registry.ng.bluemix.net/avibrazil/phpinfo_image     latest  69d78b3ce0df  3 days ago  104.2 MB
    registry.ng.bluemix.net/avibrazil/wordpress_image   latest  a801735fae08  3 days ago  117.2 MB
    

    A Docker image is not yet a container. A Docker container is an image that is being executed.

  4. Run containers integrated with previously created bridge app

    To make our tutorial richer, we’ll run 2 sets of containers:

    1. The phpinfo one, just to see how Bluemix gives us an integrated environment
      Deployment Script
      cf ic run \
         -P \
         --env 'CCS_BIND_APP=bridge-app-name' \
         --name phpinfo_instance \
         registry.ng.bluemix.net/avibrazil/phpinfo_image;
      
      
      IP=`cf ic ip request | 
          grep "IP address" | 
          sed -e "s/.* \"\(.*\)\" .*/\1/"`;
      
      
      cf ic ip bind $IP phpinfo_instance;
      Delivery Pipeline

      Equivalent stage is “➌ Deploy phpinfo Container”.

      Open this stage and note how some environment variables are defined, specially the BIND_TO.

      Bluemix DevOps Services default scripts use these environment variables to correctly deploy the containers.

      The CCS_BIND_APP on the script and BIND_TO on the pipeline are key here. Their mission is to make the bridge-app’s VCAP_SERVICES available to this container as environment variables.

      In CloudFoundry, VCAP_SERVICES is an environment variable containing a JSON document with all credentials needed to actually access the app’s provisioned APIs, middleware and services, such as host names, users and passwords. See an example below.

    2. A container group with 2 highly available, monitored and balanced identical wordpress containers
      Deployment Script
      cf ic group create \
         -P \
         --env 'CCS_BIND_APP=bridge-app-name' \
         --auto \
         --desired 2 \
         --name wordpress_group_instance \
         registry.ng.bluemix.net/avibrazil/wordpress_image
      
      
      cf ic route map \
         --hostname some-name-wordpress \
         --domain $DOMAIN \
         wordpress_group_instance

      The cf ic group create creates a container group and runs them at once.

      The cf ic route map command configures Bluemix load balancer to capture traffic to http://some-name-wordpress.mybluemix.net and route it to the wordpress_group_instance container group.

      Delivery Pipeline

      Equivalent stage is “➎ Deploy wordpress Container Group”.

      Look in this stage’s Environment Properties how I’m configuring container group.

      I had to manually modify the standard deployment script, disabling deploycontainer and enabling deploygroup.

See the results

At this point, WordPress (the app that we deployed) is up and running inside a Docker container, and already using the ClearDB MySQL database provided by Bluemix. Access the URL of your wordpress container group and you will see this:

WordPress on Docker with Bluemix

Bluemix dashboard also shows the components running:

Bluemix dashboard with apps and containers

But the most interesting evidence you can see accessing the phpinfo container URL or IP. Scroll to the environment variables section to see all services credentials available as environment variables from VCAP_SERVICES:

Bluemix VCAP_SERVICES as seen by a Docker container

I use these credentials to configure WordPress while building the Dockerfile, so it can find its database when executing:

.
.
.
RUN yum -y install epel-release;\
	yum -y install wordpress patch;\
	yum clean all;\
	sed -i '\
		         s/.localhost./getenv("VCAP_SERVICES_CLEARDB_0_CREDENTIALS_HOSTNAME")/ ; \
		s/.database_name_here./getenv("VCAP_SERVICES_CLEARDB_0_CREDENTIALS_NAME")/     ; \
		     s/.username_here./getenv("VCAP_SERVICES_CLEARDB_0_CREDENTIALS_USERNAME")/ ; \
		     s/.password_here./getenv("VCAP_SERVICES_CLEARDB_0_CREDENTIALS_PASSWORD")/ ; \
	' /etc/wordpress/wp-config.php;\
	cd /etc/httpd/conf.d; patch < /tmp/wordpress.conf.patch;\
	rm /tmp/wordpress.conf.patch
.
.
.

So I’m using sed, the text-editor-as-a-command, to edit WordPress configuration file (/etc/wordpress/wp-config.php) and change some patterns there into appropriate getenv() calls to grab credentials provided by VCAP_SERVICES.

Dockerfile best practices

The containers folder in the source code presents one folder per image, each is an example of different Dockerfiles. We use only the wordpress and phpinfo ones here. But I’d like to highlight some best practices.

A Dockerfile is a script that defines how a container image should be built. A container image is very similar to a VM image, the difference is more related to the file formats that they are stored. VMs uses QCOW, VMDK etc while Docker uses layered filesystem images. From the application installation perspective, all the rest is almost the same. But only only Docker and its Dockerfile provides a super easy way to describe how to prepare an image focusing mostly only on your application. The only way to automate this process on the old Virtual Machine universe is through techniques such as Red Hat’s kickstart. This automated OS installation aspect of Dockerfiles might seem obscure or unimportant but is actually the core of what makes viable a modern DevOps culture.

  1. Being a build script, it starts from a base parent image, defined by the FROM command. We used a plain official CentOS image as a starting point. You must select very carefully your parent images, in the same way you select the Linux distribution for your company. You should consider who maintains the base image, it should be well maintained.
  2. Avoid creating images manually, as running a base container, issuing commands manually and then committing it. All logic to prepare the image should be scripted in your Dockerfile.
  3. In case complex file editing is required, capture edits in patches and use the patch command in your Dockerfile, as I did on wordpress Dockerfile.
    To create a patch:

    diff -Naur configfile.txt.org configfile.txt > configfile.patch

    Then see the wordpress Dockerfile to understand how to apply it.

  4. Always that possible, use official distribution packages instead of downloading libraries (.zip or .tar.gz) from the Internet. In the wordpress Dockerfile I enabled the official EPEL repository so I can install WordPress with YUM. Same happens on the Django and NGINX Dockerfiles. Also note how I don’t have to worry about installing PHP and MySQL client libraries – they get installed automatically when YUM installs wordpress package, because PHP and MySQL are dependencies.

When Docker on Bluemix is useful

CloudFoundry (the execution environment behind Bluemix) has its own Open Source container technology called Warden. And CloudFoundry’s Dockerfile-equivalent is called Buildpack. Just to illustrate, here is a WordPress buildpack for CloudFoundry and Bluemix.

To chose to go with Docker in some parts of your application means to give up some native integrations and facilities naturally and automatically provided by Bluemix. With Docker you’ll have to control and manage some more things for yourself. So go with Docker, instead of a buildpack, if:

  • If you need portability, you need to move your runtimes in and out Bluemix/CloudFoundry.
  • If a buildpack you need is less well maintained then the equivalent Linux distribution package. Or you need a reliable and supported source of pre-packaged software in a way just a major Linux distribution can provide.
  • If you are not ready to learn how to use and configure a complex buildpack, like the Python one, when you are already proficient on your favorite distribution’s Python packaging.
  • If you need Apache HTTPD advanced features as mod_rewrite, mod_autoindex or mod_dav.
  • If you simply need more control over your runtimes.

The best balance is to use Bluemix services/APIs/middleware and native buildpacks/runtimes whenever possible, and go with Docker on specific situations. Leveraging the integration that Docker on Bluemix provides.

Receita de Pimentões Assados

pimentoes-assadosIngredientes

  • Pimentões vermelhos e verdes
  • Sal, vinagre, açúcar (ou adoçante)
  • Azeite de oliva

Preparo

  1. Asse os pimentões diretamente no fogo da boca do fogão até queimarem em todos os lugares.
  2. Insira-os em sacos plásticos fechados até esfriarem. Continuarão cozinhando dentro do saco com seu próprio calor.
  3. Remova a fina pele dos pimentões debaixo de água corrente da torneira e sobre uma peneira grande, até ficarem limpos. Remova também as sementes.
  4. Corte ao meio de forma que se tire 2 “bifes” de cada pimentão.
  5. Tempere a gosto e misture com sal, vinagre, azeite de oliva e um pouco de açúcar ou adoçante.

US bank account for non-US citizens

I’ve searched for a long time and finally found a US regular bank that will let me open a free checking account. It is BBVA Compass bank.

All these services are free: ATM withdraw and deposit (BBVA’s and AllPoint ATMs), full featured Internet banking, full featured mobile banking, Visa debit card, Apple Pay and more. The non-free services are listed here and exact rates depend on the US state where the account was opened.

bbva-logo

To open a checking account, you must personally visit a physical branch in US and spend 40 minutes on an interview. You will leave the branch with an open account and routing numbers containing a $26 balance plus valid user and password that can be used on BBVA’s app and Internet banking. Free Visa debit card will arrive to some US address in a week or two, so no ATM until then.

They have 2 free checking account types. You should chose the one that includes free or charge AllPoint ATM usage which are very popular throughout US, and can be found in almost every 7 Eleven store. Use the AllPoint app to find one near you. Read More

WordPress on Fedora with RPM, DNF/YUM

WordPress is packaged for Fedora and can be installed as a regular RPM (with DNF/YUM). The benefits of this method are that you don’t need to mess around with configuration files, filesystem permissions and since everything is pre-packaged to work together, additional configurations are minimal. At the end of this 3 minutes tutorial, you’ll get a running WordPress under an SSL-enabled Apache using MariaDB as its backend.

All commands need to be executed as root. Read More