error: gpg failed to sign the data

A couple of months ago I noticed that commits I’ve done through the GitHub web interface were receiving a “Verified” badge while commits done through the Git command line in WSL (Windows Subsystem for Linux) at my local dev machine weren’t.

I’m all for badges so I followed the steps found at About commit signature verification to setup GPG signing. The thing is, there was something still missing and as a result, when trying to commit I was getting an error message as follows:

error: gpg failed to sign the data
fatal: failed to write commit object

Fortunately, the solution is simple. Export a variable named GPG_TTY as follows:

export GPG_TTY=$(tty)

I ended appending it to ~/.bashrc so as to persist it between terminal sessions.

Cannot find runtime ‘node’ on PATH. Is ‘node’ installed?

On my current Windows box, I have Node.js installed only in WSL – not on Windows itself.

When debugging a Node.js application from within a Visual Studio Code instance started from WSL, you may receive the following message:

Cannot find runtime 'node' on PATH. Is 'node' installed?
Cannot find runtime ‘node’ on PATH. Is ‘node’ installed?

While the dev experience certainly could be better, the solution is quite simple: Click on the “Open launch.json” button and add a configuration for “useWSL” with the value set to “true”.

The system does not support local kernel debugging

If you’re trying to do some local kernel debugging with one of Windows Debugging Tools’ debuggers and Windows isn’t booted into debug mode you’ll get a message like one of the following (all commands run from an elevated command prompt):

kd -kl

Microsoft (R) Windows Debugger Version 10.0.15063.400 AMD64
Copyright (c) Microsoft Corporation. All rights reserved.

The system does not support local kernel debugging.
Local kernel debugging requires Administrative privileges.
Only a single local kernel debugging session can run at a time.
Local kernel debugging is disabled by default. You must run “bcdedit -debug on” and reboot to enable it.
Debuggee initialization failed, HRESULT 0x80004001
Not implemented

windbg -kl

WinDbg:10.0.15063.400 AMD64
The system does not support local kernel debugging.

Local kernel debugging requires Administrative
privileges, and is not supported by WOW64.
Only a single local kernel debugging session can run at a time.
Local kernel debugging is disabled by default. You must run ‘bcdedit -debug on’ and reboot to enable it.

You can enable Windows debug mode by using…

bcdedit.exe -debug on

 or msconfig.exe, but if you have BitLocker enabled for your OS drive, you’ll have to have to enter the recovery key or recovery password.

Here’s the message from msconfig.exe:

System Configuration
BitLocker Drive Encryption is enabled on your OS drive. Because these changes modify the machine’s boot settings, the machine will enter recovery mode at next boot and you will need to provide a BitLocker recovery key or recovery password. Are you sure you want to proceed?
Yes No

Depending on what you’re up to, that’s just too much of a hassle. Fortunately there’s a tool from Sysinternals that removes the need of booting Windows into debug mode: livekd.

By default, livekd will run kd.exe, but you can tell it to run WinDbg by passing the -w option:

livekd -w

Several other options can be set when running livekd (see the link above for details). The ones it doesn’t understand are passed on to the chosen debugger.

Important to note that the feature set of the debugger when running through livekd is not the same as when running without it. See the docs for more information.




warning CS0618: ‘Device.OS’ is obsolete: ‘TargetPlatform is obsolete as of version 2.3.4. Please use RuntimePlatform instead.’

Here is a couple of compiler generated warnings I found on project I was recently reviewing:

  1. warning CS0618: ‘Device.OS’ is obsolete: ‘TargetPlatform is obsolete as of version 2.3.4. Please use RuntimePlatform instead.’
  2. warning CS0612: ‘TargetPlatform’ is obsolete

A CS0612 is generated when the code references a type or member to wich the parameterless ObsoleteAttribute was applied.

CS0618 is generated when the code references a type or member to wich a parameterized ObsoleteAttribute was applied.

In this case, the reference to Device.OS has to be replaced with a reference to Device.RuntimePlatform.

Since Device.OS was an enum of type TargetPlatform and Device.RuntimePlatform is a string, it is necessary to update the right hand of the expression as well.

For that you can use one of the string constants defined on the Device class:

  • iOS;
  • Android;
  • WinPhone;
  • UWP;
  • WinRT;
  • macOS;

Here’s how the code looked like originally:

And here’s how the looks code after the update:

Getting the latest version of Sysinternals’ tools

You can easily grab the latest version of any Sysinternals tool pointing your browser to

Say you want to run Process Monitor, point your browser to:

and voila!

All browsers will download the file to your system, but Internet Explorer and Edge will give you the option to run the tool automatically as soon as it finishes downloading.

But here’s a neat trick I learned today while reading the first chapter of Troubleshooting with the Windows Sysinternals Tools (2nd Edition):

You can run any Sysinternals tool directly from a UNC path such as the following:


Being a UNC share, you can map it as a local drive and use it from Windows Explorer, from the command line or from PowerShell.

The book goes on to tell that for this to work, a Windows Service called WebClient needs to be running.

On recent versions of Windows it is stopped by default. There are a handfull of ways to start the service – both explicitly and implicitly. Some of them require user elevation, others don’t, but the neatest way I didn’t find in the book:

pushd \\\tools

pushd will map the share to the first available drive starting from z: and change the current directory to it.

Although running this way is kind of slow (the files are being downloaded from the internet after all…), it is still usefull for those situations where you wanna get in, do whatever you gotta do, and leave without having to worry about deleting any files later.

When you’re ready to remove the mapping, popd will remove it and change the directory back to the one that was current when you pushd in.


ASP.NET For The oWin

It’s been a while since my last post but I’m eager to come back blogging again.

I’ve started at a new job back in May supporting software development teams and since then I’ve been getting back up to speed with the .NET Framework and studying like crazy all things ASP.NET.

The ASP.NET stack has changed a lot in the ten years since the last time I looked seriously into it as a whole while preparing for certification exams. Using just user management and role management as an example, in the span of ten years ASP.NET went from ASP.NET Membership to ASP.NET Simple Membership to ASP.NET Universal Providers to ASP.NET Identity (to ASP.NET Core Identity? – I haven’t yet taken a look into that to see how different it is from its classical ASP.NET counterpart).

The good news is that for the most part it all has gone open source. I feel that not many people appreciate how much the source code worths as a learning tool.

Now let me get back into building an OAuth 2.0 authentication server using OWIN.

Sobre O Estado da imprensa escrita

Hoje pela manhã recebi a newsletter do Estadão.
Entre as notícias, uma me chamou a atenção: As 10 cidades mais baratas do mundo para turistas. E as 10 mais caras.

Clico no link e caio numa página onde só tem imagens. Todas com a mesma legenda:

“O site de planejamento e reserva de viagens TripAdvisor divulgou nesta terça-feira (19 de julho) o índice TripIndex Cidades, que identifica as cidades mais baratas e mais caras do mundo para turistas… … Confira a lista

A ênfase no “Confira a lista” é por minha conta. Não tem lista. Não tem o nome da cidade a qual se refere cada uma das fotos. Não diz quais as cidades mais baratas, tampouco quais as mais caras.

Olhando os comentários, vejo vários leitores reclamando sobre a falta de mais informações.

Faço uma busca no Google e entre as primeiras respostas vem um link para uma “matéria” no próprio Estadão: As cidades mais baratas do mundo para turistas; veja lista.

Ênfase no “veja lista” [sic] por minha conta. Não tem lista. De novo.

Faço nova busca no Google. Desta vez procurando pela fonte, o próprio TripAdvisor. A pesquisa trás links para vários sites que de alguma forma reproduzem a notícia. Finalmente encontro um link para a fonte que está em inglês.

Decido postar o link nos comentários para facilitar a vida de outros leitores.

Vejo o comentário de outro leitor dizendo que o nome das cidades está lá sim. Basta passar com o mouse em cima da imagem, que aparece uma tooltip com o nome da cidade. (In)felizmente, meu celular não tem mouse.

Meu interesse pelo assunto acaba. Já tenho o que eu queria. A informação. Direto da fonte. E a vida segue.

São Paulo Aluga

Ontem fui fotografar o Mercado Municipal de Pinheiros durante a FotoJornada. Depois de ter fotografado o que queria no mercado, resolvi dar uma voltinha pelos arredores.
Mais uma vez, encontrei no comércio reflexos da crise que afeta a nossa economia.
Em pouco mais de meia-hora, fiz 11 fotos de pontos comerciais térreo que estão desocupados esperando que alguém os alugue.
Entre as imagens, o exemplo emblemático de um shopping (de boxes) inteiro posto para alugar.
Por ter uma economia mais diversificada, a crise neste pedacinho de Pinheiros não é tão aguda e visível quanto no Bom Retiro, mas ainda assim, chama a atenção. Clique na imagem para ser redirecionado para o Flickr e ver as 11 imagens captadas ontem.

São Paulo Aluga

A seguir, temos um mapa onde pode-se ver os locais onde foram feitas todas as 164 imagens parte da série. Clique em qualquer marcador para expandir o agrupamento ou para ver a imagem produzida naquele local.

E clicando na imagem abaixo, você será redirecionado para o Flickr, onde poderá ver todas 164 as imagens da série.

São Paulo Fecha as Portas

Retrospectiva de 2015

2015 foi um ano “interessante”. Depois de bastante tempo onde o plano era não ter plano, eis que resolvi dar uma nova guinada.


Voltei a correr no finalzinho de 2014. Vinha treinando bem, ganhei ritmo e cheguei a completar uma meia-maratona. Mas no segundo semestre eu dei uma relaxada nos treinos e pra fechar o ano com uma certa vergonha, saí uma única vez para correr agora em dezembro – e foram míseros 2Km.

A única coisa que salvou dezembro de um vexame total e retumbante foi que esses 2Km foram percorridos descalços no chão duro com o calçamento variando entre pedra portuguesa, asfalto e concreto. Apesar de algumas bolhas no pé, a experiência me fez querer mais.

Retrospectiva 2015 - Corrida
Retrospectiva 2015 – Corrida


Juntamente com a volta aos treinos, passei a tomar mais de cuidado com a alimentação. Não tanto quanto a quantidade, mas sim com a regularidade e a qualidade do que eu vinha comendo.

Havia mais de uma década que eu não tinha o hábito de tomar café da manhã regularmente. Num dia típico eu chegava até a hora do almoço com somente duas canecas de café com leite no estômago. Isso não faz nada bem para o nível de insulina no organismo.

Por volta de fevereiro ou março, eu procurei passar a tomar café da manhã nos primeiros 30 minutos depois de acordado. E garantia a ingestão de pelo menos 30g de proteína, mais uma porção de carbohidratos e mais uma porção de algum vegetal. Procurei não ficar mais que 3 ou 4 horas sem comer alguma coisa.

Praticamente abolí o consumo de carbohidratos brancos e/ou refinados como arroz, derivados de trigo como pães, macarrão, bolos, biscoitos, etc. das refeições diárias deixando-os para ocasiões “especiais”. A ingestão de carbohidratos vinha basicamente de coisas como feijão, grão-de-bico, lentilhas, etc.

Mas depois de alguns meses eu comecei a relaxar e a coisa descambou de vez em setembro depois que voltei a trabalhar. Apesar de continuar tomando café da manhã, eu troquei o combo proteína+carbohidrato+vegetal por granola – que apesar de relativamente saudável, acredito ser pior do que eu vinha comendo.

De forma geral, continuo seletivo na hora do almoço e raramente pego arroz ou algum tipo de massa. Mas é no intervalo entre as refeições que o bicho pega. Lá no trabalho tem uma mesinha com café, chá, torradas e… biscoitos recheados. E biscoito, você sabe, é basicamente trigo ultra processado, gordura vegetal e açúcar – uma verdadeira bomba. É difícil resistir, então facilita muito quando eu levo alguma coisa de casa.

O resultado da redução da carga de treinos e da relaxada na alimentação é que depois de chegar ao meu melhor peso em provavelmente duas décadas, eu voltei a ganhar peso. Ainda estou melhor que no começo do ano, mas tenho que tomar cuidado por que já são três meses seguidos ganhando peso.

Retrospectiva2015 - Peso
Retrospectiva2015 – Peso


Em 2015 eu praticamente deixei as paisagens naturais de lado e foquei em temas urbanos como street, documental e arquitetura.

Se por um lado eu tive uma pequena decepção quando nenhuma foto minha foi aceita na XIX Bienal de Arte Fotográfica Brasileira em Cores de Ribeirão Preto, eu tive uma fotografia aceita no 5º Salão Nacional de Arte Fotográfica de São Caetano do Sul, algumas imagens destacadas no blog do Flickr (1, 2, 3, 4), um prêmio no concurso mensal da Angel Foto, etc.

2015 também foi o ano em que a fotografia começou a render algum dinheiro através de licenciamento e da venda de prints.


Biblioteca Mário de Andrade
Biblioteca Mário de Andrade

Comecei o “ano” em março lendo The 4-Hour Workweek do Tim Ferriss. O podcast do cara é excelente. Ele entrevista pessoas dos mais diversos backgrounds em busca identificar o que as torna únicas em suas respectivas áreas de atuação. Já o livro tem idéias interessantes, mas alguns trechos parecem snake oil. No geral, acredito que valeu a pena ter lido o livro, mas ainda prefiro o podcast.

Uns tempos depois comecei a ler o excelente Capital in the Twenty-First Century – que estava na minha To Do List havia alguns meses. Este é um livro que estou lendo devagar já que em alguns momentos o Thomas Piketty carrega no economês. O bacana do livro, é que o argumento do cara sobre a riqueza, renda e desigualdade é baseada em dados – não em viagens teóricas ou retórica.

A partir de julho eu comecei a comprar alguns livros técnicos para ajudar na construção de um site que estou/estava desenvolvendo. Entre eles, o excelente JavaScript: The Definitive Guide e alguns sobre CSS.

Com a volta ao trabalho em setembro, eu comprei um monte de livros para me atualizar na plataforma Microsoft. Entre eles, o excelente CLR via C#.

A partir do finalzinho de novembro eu voltei a ler alguns livros não-técnicos que estavam na minha To Read List já havia bastante tempo.

O primeiro deles foi o The $12 Million Stuffed Shark: The Curious Economics of Contemporary Art para entender um pouco a economia por trás do mercado de arte. Bem distante (mas muito, muito mesmo) da realidade das minhas “fotinhas”, mas ainda assim, uma leitura bem interessante. Resumindo a estória: Segundo o autor, o mercado de arte contemporânea é movido mais por vaidade, status e marketing do que pela qualidade da arte em si.

Depois peguei pra ler outro livro que estava na lista já haviam vários meses e que volta-e-meia eu me pegava pensando que em algum momento eu tinha que ler: The Information Diet: A Case for Conscious Comsumption

O livro faz uma analogia interessante entre o consumo de informação e o consumo de calorias (alimentos). O texto tem idéias interessantes, mas por ter ficado na wish-list por tanto tempo, talvez eu tenha criado expectativas de mais.

Um insight interessante do livro é que muita gente ao vasculhar a web, jornais ou o noticiário está na verdade procurando por afirmação e não informação. Eles não querem os fatos. Só querem uma opinião baseada em parte dos fatos. A parte que coincide e reforça a opinião deles.


Depois de dois anos de período sabático, em setembro eu voltei a trabalhar com TI. Mais especificamente com o desenvolvimento de sistemas na plataforma Microsoft.

Eu já tinha tido um gostinho do que seria voltar a programar enquanto estudava JavaScript para desenvolver o site para um dos meus projetos pessoais. Mas trabalhando por conta própria – e durante o meu sabático em particular – a realidade é que eu fazia o que eu queria quando bem entendia – o que na prática quer dizer que não saia muita coisa.

No trabalho, a coisa é diferente. É bacana, é desafiador e o que é melhor: Tem resultados palpáveis. Depois de fazer alguma alteração qualquer, basta executar a aplicação ou os testes automatizados com o profiler ligado para ver o resultado do trabalho. Ver um memory leak ir embora ou o tempo de processamento de uma rotina cair de hora e meia para menos de cinco minutos é muito, mas muito legal! É bom estar de volta!


Sol, Praia e Cerveja Gelada
Sol, Praia e Cerveja Gelada

2015 foi um ano de despedidas, de encontros e reencontros. Foi também um ano fechar um ciclo e de alguns recomeços.

Que 2016 seja um ano porreta!


P.S.: Continuo firme e forte no Cold Shower Therapy há mais de um ano. Saia da zona de conforto!