# Change slug style to wiki style
Caloni, 2026-03-05 <projects> <ideas> [up] [copy]I stumbled into an old wiki (since 1995) and this reminded me about the WikiStyle links, where you can use this CamelCase to refer to an existing entry or a need to be filled entry. I was thinking if this could be a better idea to insert inner links in my post texts because 1) this is a style loose enough to be OK to use without a link, 2) it is tied enough to detect those links in my parser (and it there is no post just keep it as simple text), 3) it is elegant enough to be used in the blog posts permalinks (easy to remember, can be shorter than original title) and 4) it is smart enough to reference movies in my journal. Maybe it is even better to relate to future ebook inner links with a reference table (to translate CamelCase to A Great Title to replace it). Maybe we can even do this to some links in metadata.
Need to give second thought in near future, since this will change all already published permalinks in blog. However, we can do it now and change the parser later.
# Revisar códigos e diagramas (usar Mermaid e IA) dos posts do blogue.
Caloni, 2026-03-10 <projects <ideas [up] [copy]Após bagunçar a formatação acho que seria uma boa atualizar os posts selecionados para uma versão padronizada e fácil de manter no futuro. Manter o limite de colunas no código é elegante o suficiente para manter.
# Programming
Caloni, 2026-03-13 <computer> <programming_tag <blog> [up] [copy]Aqui estão os artigos que considero essenciais para seguir a carreira de programador. Foco principalmente nos fundamentos, pois considero que eles são tudo o que um programador necessita para evoluir. Tendo os fundamentos o resto se faz sozinho no dia-a-dia.
Por isso mesmo desenvolvi uma seção com o tema "básico do básico":
Seguindo a mesma vibe tenho dois artigos exploratórios focados em desenvolvimento para Windows (mas que podem ser adaptados para qualquer IDE hoje em dia) sobre programar e depurar no dia-a-dia. Estes são os guias básicos:
Como este último é sobre depuração você logo vê que os temas se mesclam. Muito pouco tempo um programador se dedica a programar (e hoje com a IA menos ainda). Muito mais tempo é dedicado a depuração mental e prática.
# Reversing
Caloni, 2026-03-13 <computer> <reversing_tag <blog> [up] [copy]A depuração é o meu assunto favorito de ciência da computação. Para mim é até a mais ciência de todas (programação eu considero mais próxima até de matemática). A criação de teorias, testes, obtenção de teorias e a transpiração constante em busca de padrões e os diabos dos detalhes é o que praticamente me fez virar programador. Sem gostar dessa parte menos nobre onde precisamos escarafunchar os algoritmos que criamos ou mantemos, muito se perde de tempo no dia-a-dia. Afinal de contas, se você trabalha com algo que não gosta está perdendo seu tempo. Se depuração te atrai, tenho boas notícias sobre a área para você :).
Para começar a rodar seu código passo-a-passo comece com o artigo Guia básico para programadores de primeiro breakpoint. Se estiver usando outro ambiente adapte o que aprendeu para este ambiente. Os conceitos são os mesmos.
Não escrevi muitos posts sobre depuração depuração mesmo. Minha vibe gira mais em torno de descobrir como as coisas funcionam por trás dos panos, o que acaba sendo útil também quando você conhece o código-fonte, mas se transforma em um superpoder quando você descobre que se souber assembly você nem precisa do fontes.
Por isso estou listando posts com um viés mais sobre engenharia reversa do que depuração no sentido acadêmico da coisa. Considero conhecimento fundamental para não perder tempo se intimidando com a entranhas de um sistema. Não será o que você irá mexer sempre, apenas em casos exceptionais, mas te dará mais confiança ao longo do tempo para a depuração com o código-fonte.
E por isso mesmo tenho alguns artigos mais densos utilizando ferramentas mais complexas como WinDbg e IDA. Eu sempre apelo para o WinDbg porque programo para Windows e ele é o depurador definitivo para todos os casos. Ele é mantido pela Microsoft junto do sistema operacional e é possível depurar userland e kernel na mesma ferramenta. Seus comandos não são intuitivos, mas seu poder acaba compensando. Especialmente para reversa :).
Antes de saber como desmontar as coisas para descobrir erros ou comportamentos é bom ter uma noção de como as coisas deveriam funcionar. Esses dois primeiros artigos são leves e irão te guiar por este caminho. Os dois próximos já começam a adentrar em assuntos que um depurador master precisa dominar, como multithreading. O último deles abre o leque de aprendizados fundamentais.
A partir daí você terá alguns possíveis caminhos a seguir com mais ênfase. Pode se dedicar inteiramente ao baixo nível, mais próximo das entranhas da máquina e do sistema operacional. Eu não tenho muito aqui sobre kernel development, mas a depuração muitas vezes passa pelo kernel mode e assembly. Você pode pular esta série e a seguinte se não preferir se enveredar por caminhos tão escuros.
Este grupo abaixo é mais sobre conhecimento de sistema aliado à depuração efusiva. Deve sair desta lista com uma confiança muito boa em conseguir depurar qualquer coisa para Windows e outros SOs (o aprendizado de um acaba sendo uma escalada independente para outros).
Agora, se você sentir que sua vibe está mais para user land, talvez um escalation engineer que manja muito sobre os paranauê dos registros, coisas e tá, quem sabe uma boa não seja você praticar reversa e depuração de sistemas fechados? Nesta série tenho algumas brincadeiras que fiz no serviço e no lazer.
E é isso. Desculpe pela extensa lista. E ela não é final, há mais posts escondidos sobre esses assuntos por aqui. No futuro devo manter este artigo atualizado, talvez mais enxuto e focado ou estruturado por áreas específicas. Se você quiser algum tipo de contato eu criei um grupo de engenharia reversa no Telegram. Dá uma passada por lá.
Boas depuradas!
# Replicar código rapidamente
Caloni, 2026-03-18 <computer> [up] [copy]Claudeão me ensinou uma boa essa semana. Precisava replicar um bloco de código para N diferentes itens. Queria usar algo simples como AWK. Eis o padrão:
printf '%s\n' Item1 Item2 Item3 | awk '
{
item = $0
print "{"
print " changePart = " item ","
print " otherMembers = imutable,"
print " pathMember = c:\\\\somepath\\\\withslashes,"
print "},"
print ""
}
'
Para executar no Windows é possível usar o bash do Git.
O padrão era mais complexo, com mais membros e algumas variáveis que mudavam de acordo com outro parâmetro. Porém, a ideia geral do printf junto de um script awk rapidão é o que me fez escrever este post.
Note on the backslashes: In a bash inline awk '...' script, you need \\ to get a literal \ in the output, since bash and awk each consume one level of escaping. The .awk file version only needed \ because bash wasn't involved.
# Creative Commons
Caloni, 2026-03-21 <archive [up] [copy]Update 2026-03-21. Mantive este artigo pelo histórico e pelos comentários. Há muito tempo desconsidero a propriedade imaginária dos meus textos. Faça o que quiser.
Talvez a maioria das pessoas ignore o fato que, ao publicarem algum conteúdo, qualquer conteúdo, na internet, estarão criando algo, e esse algo tem um autor, e portanto, de acordo com nossa lei (Brasil) e alguns tratados internacionais, está protegida pelo direito autoral.
Para ajudar os autores da internet a informarem ao seu público qual o nível de proteção e liberdade dados às suas obras de maneira padronizada e internacionalizada, foi criado o Creative Commons, cuja função é exatamente essa que descrevi.
Exatamente por não ser obrigado o registro de uma obra para tornar válido o seu direito autoral, o Creative Commons apenas define alguns logos e links que simbolizam e especificam quais os direitos que um autor gostaria de aplicar à sua obra, variando de uma obra totalmente protegida até uma obra sem qualquer nível de proteção. No meu caso, por exemplo, as obras do Caloni.com.br estão publicadas sob as seguintes condições:
Você pode:
Copiar, distribuir, exibir e executar a obra.
Sob as seguintes condições:
- Atribuição. Você deve dar crédito ao autor original, de forma
especificada pelo autor ou licenciante.
- Uso Não-Comercial. Você não pode utilizar esta obra com
finalidades comerciais.
- Vedada a Criação de Obras Derivadas. Você não pode alterar,
transformar ou criar outra obra com base nesta.
- Para cada novo uso ou distribuição, você deve deixar claro para outros
os termos da licença desta obra.
- Qualquer uma destas condições podem ser renunciadas, desde que
você obtenha permissão do autor.
- Nothing in this license impairs or restricts the author's moral rights.
Essa foi uma configuração que escolhi ao ler os termos do sítio e configurar minha licença. É necessário que essa licença esteja "assinada" junto da obra, através de um link disponível sempre que a obra for exibida.
2008-02-19 Daniel Quadros:
Legal, estava na minha lista de idéias para o blog indicar os direitos de reprodução, mas não tinha muita idéia de como fazer. Uma dica para quer for tapado como eu: para criar o ícone basta acessar a página do Creative Commons e clicar no alto em 'License Your Work'.
Agora só falta achar tempo para rever o layout do blog, além do ícone do Creative Commons estou pensando em incluir o widget do Shelfari e o do Dilbert e colocar uma lista de links para sites interessantes (como o seu).
2008-02-19 Caloni:
Também ficou na minha lista por um bom tempo, até que chegou o ponto onde eu não tinha mais idéias (nem tempo), a não ser escrever sobre isso. A propósito, os direitos do seu blogue são os mesmos que o meu?
Eu pensava que "enfeitava" meu sítio apenas para mim, já que, pelo menos eu, acesso todos os blogues pelo Google Reader. Aliás, é uma enquete interessante: "você conhece o leiaute do seu blogue favorito?"
[]s
# Linux e o DHCP
Caloni, 2026-03-21 <computer> <archive> [up] [copy]Quando procuramos no google por "linux dhcp", o que vem em resposta são diversas dicas, tutoriais, documentos oficiais e palpites sobre como configurar um servidor Linux.
Muito bem. E a outra ponta da história?
[Testes feitos em um Fedora 8, não me pergunte mais detalhes]
O primeiro linque útil encontrado foi a documentação da Red Hat. Além disso seguem alguns macetes que eu descobri no decorrer do percurso. A primeira coisa a ser configurada é o arquivo /etc/sysconfig/network. Nele devemos, em uma configuração simplista, colocar uma única linha:NETWORKING=yesTive alguns problemas com a entrada NETWORKING_IPV6, ou algo do gênero. A comunicação com o servidor DHCP da rede simplesmente não funcionava com essa linha, deixando o computador sem IP durante o boot. Má configuração do servidor? Pode até ser. Porém, não quis entrar nesses meandros.
Por isso, se houver a linha sobre IPV6 e você tiver problemas, comente-a temporariamente.
O passo seguinte é configurar a interface de rede, que é no fim das contas a representação da sua placa. Para isso temos alguns arquivos em /etc/sysconfig/network-scripts no formato ifcfg-nome-da-interface. Se você digitar ifconfig na linha de comando terá os nomes de interface disponíveis. No meu caso, eth0.
vi /etc/sysconfig/network-scripts/ifcfg-eth0 DEVICE=eth0 BOOTPROTO=dhcp ONBOOT=yes :wq
Note que o valor BOOTPROTO é realmente BOOTPROTO, com um O no final. Tive alguns problemas de soletrar também nesse caso, o que me gerou mais alguns reboots mal-sucedidos.
Bem, o que isso faz? Basicamente, manda o Linux utilizar o protocolo DHCP, procurando na rede algum servidor que lhe dê algum IP válido. Só isso. O resto ele faz dinamicamente.
Inclusive alterar automaticamente o arquivo /etc/resolv.conf. Nele estão definidas algumas coisas como o domínio de nomes que estamos e os IPs de onde buscar a resolução de nomes.
Feito isso, como se costuma dizer, voilà! Temos um cliente DHCP funcionando contente e feliz. Eu reiniciei a máquina para tudo dar certo, mas provavelmente devem existir maneiras mais saudáveis de reiniciar a rede (talvez um ifdown seguido de ifup resolvesse). E agora eu posso finalmente ter acesso aos pacotes de instalação que precisava.
Notas de um Linux padawan =)
2008-04-09 Gustavo Monteiro:
W,
Na realidade, o arquivo é o /etc/resolv.conf.
=)
Abcs.,
2008-04-13 Caloni:
É verdade! Lapso meu.
Corrigido.
[]s
# Projetos no Caloni.com.br
Caloni, 2026-03-21 <computer> <archive> [up] [copy]Update 2026-03-21. Mantive este artigo pelo histórico e pelos comentários.
Atualizado para refletir migração dos projetos para o Launchpad.
Aproveitando a deixa de mudança de controle de fonte dos meus miniprojetos de Mercurial para Bazaar, estou publicando-os sob uma forma mais acessível e didática, além de possuir todo o histórico de mudanças: como um controle de fonte deve ser.
Dessa forma, todos os projetos estarão sob o endereço https://launchpad.net/~wanderley-caloni.
Para obter uma ramificação qualquer, basta digitar o comando abaixo.
bzr clone lp:nome-do-projeto
Espero que seja de bom uso de todos os que se interessam por mouses clicando, xadrez e dicionários eletrônicos.
2008-05-05 Marcio Andrey Oliveira:
Muito legal a tua iniciativa. Espero que ela ajude a divulgar o MouseTool e o bazaar.
[]s,
mao
2008-05-05 Caloni:
Olá, Márcio!
Também espero isso. Com relação aos protocolos suportados, o Bazaar possui um arcabouço bem mais robusto do que o Mercurial, entre outras coisas =)
[]s
# Voltando à linha de comando (again)
Caloni, 2026-03-23 <computer <blog [up] [copy]Trabalhar com Windows é um exercício de paciência constante. Junto do Visual Studio um treinamento para ser monge. Cada vez mais penso com carinho em meu aprendizado de algumas ferramentas UNIX para conseguir fazer busca e editar arquivos rapidamente. Talvez hoje com a proximidade e compatibilidade entre os dois SOs seja possível uma convivência produtiva de ferramentas feitas originalmente para terminal. O uso de IA também facilita dar alguns primeiros passos mais rápido, como por exemplo saber lidar com projetos do Visual Studio unicamente pelo terminal.
Com base nisso comecei a migrar meu uso diário do Visual Studio para VS Code apenas com a extensão do Vim e linha de comando. A primeira barreira que encontrei foi usar o msbuild para compilar os projetos C++ e suas dependência. Acontece que aqui no trabalho os projetos possuem ponto no nome e o msbuild simplesmente não suporta-os.
Minha primeira tentativa foi usar o arquivo vcxproj diretamente, mas ele depende de outros vcxprojs que o msbuild não encontra, provavelmente por se tratar de um projeto isolado quando executado assim.
msbuild path\My.Project.Dll.vcxproj cl : command line error D8003: missing source filename [path\My.Project.Lib.vcxproj]
Então resolvi apelar para o nome do projeto. E qual não foi minha surpresa ao descobrir essa incompatibilidade de nomes.
grep My.Project Solution.sln
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "My.Project.Dll",
"path\My.Project.Dll.vcxproj", "{B0191DE5-584F-40BE-8E2B-A8EF5DB2306D}"
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "My.Project.Lib.Lib",
"path\My.Project.Lib.vcxproj", "{3D6A78F0-57D2-4F87-8B51-7E9EBAD3872C}"
msbuild Solution.sln -t:"My.Project.Dll"
MSBuild version 17.14.40+3e7442088 for .NET Framework
MSBUILD : error MSB5016: The name "My.Project.Dll"
contains an invalid character ".". Switch: target
For switch syntax, type "MSBuild -help"
Então outra opção que tentei foi usar a GUID do projeto, o que de acordo com o Chat-GPT "sempre funciona".
msbuild Workplace.Container.sln /t:{B0191DE5-584F-40BE-8E2B-A8EF5DB2306D}
path\AnotherProject.vcxproj : error MSB4057: The target
"{B0191DE5-584F-40BE-8E2B-A8EF5DB2306D}" does not exist in the project.
E por fim tentei especificar no parâmetro /t, só para descobrir que nem lá é permitido usar pontos.
msbuild Solution.sln /t:"path\My.Project.Dll.vcxproj" MSBUILD : error MSB5016: The name "path\My.Project.Dll.vcxproj" contains an invalid character ".".
Por fim, depois de muito suor e tentativas frustradas, encontro a solução: usar o arquivo vcxproj diretamente, mas com o parâmetro /p:BuildProjectReferences=true, que força compilar as dependências do projeto.
msbuild path\My.Project.Dll.vcxproj /p:BuildProjectReferences=true
Importante: para isso funcionar as dependências devem estar em ProjectReference e não só na ordem do .sln. Se seu projeto for antigo pode depender do .sln; aí complica, precisa atualizar as dependências também no ProjectReference.
Este post foi inspirado em saber que (pelo menos atualmente) nem sempre a IA acerta de primeira (ou de segunda, ou de terceira... ou de quinta).