Valores nulos 18/07/2023 11:38

tirinha
Inclua essa tirinha em seu site
COLE ESSE CÓDIGO EM SEU SITE x
Transcrição ↓

real historia;
string sender = "George Albuquerque Pinto";

QA: ... Tá aparecendo "null" onde não tem nada, era só pra ficar em branco...
Dev: Estranho, eu mesmo fiz essa parte e estava certo...
Dev: Olha aqui... O código está certo, quando o valor é nulo devia ficar em branco... Deixa eu ver o banco...
Dev: PLOFT!
QA: O que foi???
Dev (no chão): O Alonso salvou o texto "NULL" no banco onde não tinha dados...
--
Camiseta: I NULL YOU

Produtividade 14/07/2023 17:37

tirinha
Inclua essa tirinha em seu site
COLE ESSE CÓDIGO EM SEU SITE x
Transcrição ↓

(Na empresa)
Pessoa 1: Meleca, tá tudo aparecendo de ponta-cabeça! Chama o Programador pra ele dar uma olhada aqui...
Pessoa 2: Não dá, ele tá remoto...
(Em outro ambiente)
Pessoa 3: A impressora enguiçou de novo, cadê o Programador?
Pessoa 4: Ih, já liguei no ramal, mas estão todos remotos...
(Em outro ambiente)
Pessoa 5: Porcaria de ar condicionado que não esfria. Chama o...
Pessoa 6: O programador tá remoto...
(Em outro ambiente)
Pessoa 7: Que droga, não funciona aqui esse troço, tá pedindo pra atualizar. Como é que faz isso??
Pessoa 8: Se tem botões, é com o Programador...
(Reunião da diretoria)
Chefe: Vamos ter que chamar a equipe de desenvolvimento de volta para o presencial. Isso está prejudicando muito a produtividade da empresa...
(Programador, em casa, conversando pela internet)
Programador: Então, P.A., como eu tava te falando, minha produtividade nunca foi tão alta sem aquele monte de interrupções que tinha na empresa... Sem contar que o meu café é bem melhor!
--
Camiseta: Comprei um monitor colorido

[Vídeo] Quantas vezes você teve que escrever um algoritmo de ordenação do zero?? 13/07/2023 11:37

Bubble Sort, Merge Sort, Radix Sort, Quick Sort... Qual desses você mais usa? Qual deles você já teve que escrever "na unha" durante a sua vida profissional?

Provavelmente você não teve que fazer nenhuma vez (ou poucas vezes), mas esse não é o ponto principal. Por que aprendemos isso nos currículos de nossos cursos de graduação?

Neste vídeo aproveitei uma boa discussão sobre isso que aconteceu no Twitter. Comecei a ver por esse tweet do Giovanni Bassi:

https://twitter.com/giovannibassi/status/1672568256148766726

Daí o tweet do Morgan McGuire que peguei para destacar no vídeo:

https://twitter.com/CasualEffects/status/1672390700854386690

Meu vídeo sobre o Radix Sort com cartas do Pokémon:

https://youtu.be/8mA9tbThC74

E segue uma playlist com os vídeos de danças para ilustrar algoritmos de ordenação:

https://www.youtube.com/watch?v=EdIKIf9mHk0&list=PLOmdoKois7_FK-ySGwHBkltzB11snW7KQ

Como escrever um BOT para o BlueSky que posta imagens 10/07/2023 18:30

Sim, eu sei, a rede "Threads" que é a bambambam da vez, parece até que a BlueSky já ficou obsoleta, antes mesmo de sair da fase de convites.

Mas enquanto as coisas não se estabilizam, sigo no Twitter, Mastodon, BlueSky e Threads (nem vou falar de Koo aqui porque esse é um blog de família).

Mas o Threads ainda não tem vários recursos que as outras redes têm. Como eu já tinha o meu botzinho que posta tirinhas no Twitter e no Mastodon diariamente, queria que ele postasse também no BlueSky, daí eu fiz e estou escrevendo esse texto porque a documentação dele é bem limitada ainda. O BlueSky utiliza o AT Protocol, que é parecido com o esquema do Mastodon, mas tem suas diferenças.

Buscando na internet, é até fácil achar textos sobre como fazer um app postar textos no BlueSky. Primeiro você precisa criar a "App Password". É só ir em Settings < Apps passwords.

Print da configuração do BlueSky

Clicar em "Add app password".

Print da configuração do BlueSky

Escolher um nome para o app.

Print da configuração do BlueSky

Copiar a senha gerada (e guardar num lugar seguro).

Print da configuração do BlueSky

Feito isso, podemos gerar o nosso bot.

Como eu disse, era fácil encontrar um código padrão. Então, encontrei esse mesmo código em mais de um lugar, às vezes com acesso ao OpenAI, às vezes sem (é Node.js):

import * as dotenv from 'dotenv'
import blue from '@atproto/api';
import ai from 'openai'

dotenv.config()
const { BskyAgent } = blue;
const { Configuration, OpenAIApi } = ai;
const configuration = new Configuration({
    apiKey: process.env.OPENAI_API_KEY,
});

const openai = new OpenAIApi(configuration);
const generateFunnyCatQuote = async () => {
    // get the post from the openAI API
    const completion = await openai.createChatCompletion({
        model: "gpt-3.5-turbo",
        messages: [{role: "user", content: "Generate a funny cat quote Tweet, omit the hashtags."}],
    });
    // terrible way to deal with the fact that ChatGPT sometimes puts the posts in ""
    const postText = completion.data.choices[0].message.content.slice(1, completion.data.choices[0].message.content.lastIndexOf('"') )
    console.log("Post:"+postText);
    
    //now that we have the post, lets post it to bluesky
    const {RichText} = blue;
    const agent = new BskyAgent({ service: 'https://bsky.social/' })
    await agent.login({identifier: process.env.BLUESKY_BOT_EMAIL, password: process.env.BLUESKY_BOT_PASSWORD})
    const rt = new RichText({text: postText })
    const postRecord = {
        $type: 'app.bsky.feed.post',
        text: rt.text,
        facets: rt.facets,
        createdAt: new Date().toISOString()
    }
    await agent.post(postRecord)
};

generateFunnyCatQuote();

Fica de brinde a parte do "OpenAI", mas eu não preciso disso. Então mexi no código para ficar mais "enxugado".

const blue = require("@atproto/api");
require("dotenv").config();

const { BskyAgent } = blue;

const BLUESKY_BOT_USERNAME = process.env.BLUESKY_APP_USERNAME;
const BLUESKY_BOT_PASSWORD = process.env.BLUESKY_APP_PASSWORD;

const postBlueSky = async (tweet) => {
  const { RichText } = blue;
  const agent = new BskyAgent({ service: "https://bsky.social/" });
  await agent.login({
    identifier: BLUESKY_BOT_USERNAME,
    password: BLUESKY_BOT_PASSWORD,
  });

  const rt = new RichText({ text: tweet });
  const postRecord = {
    $type: "app.bsky.feed.post",
    text: rt.text,
    facets: rt.facets,
    createdAt: new Date().toISOString(),
  };
  await agent.post(postRecord);
};

Podem ver que deixei o parâmetro do texto com o nome "tweet". No Twitter chama "tweet", no Mastodon chama "toot", não sei como é o nome oficial no BlueSky, mas deixei "tweet" mesmo...

O código funciona que é uma beleza. Daí o problema era subir a imagem.

A ideia quando se faz um bot desses, nas diferentes redes, é você subir a imagem, pegar o identificador gerado pela imagem enviada e embutir esse identificador no seu post. Porém, qual é o formato de envio? Quais são os parâmetros do protocolo?

Encontrei um código em chinês e outro numa língua que não reconheci, que se aproximavam do que eu queria, mas não era o que eu precisava, porque usavam outros recursos e eu queria algo mais clean.

Voltei na documentação, lá tem as definições léxicas da API. Fui na parte dos "embed", tem o léxico do "external", que é para quando se coloca um link com miniatura (os famosos "cards"), tem o "images", que é o que eu precisava, depois tem os "records" (que ignorei).

Então, a ideia era subir a imagem em BLOB. O meu botzinho já lia a imagem das tirinhas, gerava o blob e passava para base64, para o Twitter. No Bluesky não precisa passar para base64.

Depois de subir o BLOB, a ideia era montar a estrutura do "embed" para enviar junto com o "tweet". Vão ver que a função final aceita posts com ou sem imagens, fazendo um teste se adiciona o embed ou não.

const blue = require("@atproto/api");
require("dotenv").config();

const { BskyAgent } = blue;

const BLUESKY_BOT_USERNAME = process.env.BLUESKY_APP_USERNAME;
const BLUESKY_BOT_PASSWORD = process.env.BLUESKY_APP_PASSWORD;

const postBlueSky = async (tweet, image, alt) => {
  const { RichText } = blue;
  const agent = new BskyAgent({ service: "https://bsky.social/" });
  await agent.login({
    identifier: BLUESKY_BOT_USERNAME,
    password: BLUESKY_BOT_PASSWORD,
  });

  let embed = null;
  if (image) {
    const uploadedImage = await agent.uploadBlob(image, {
      encoding: 'image/png',
    } );
    if (!uploadedImage) throw new Error("Failed to upload blob");

    embed = {
      $type: 'app.bsky.embed.images',
      images: [
        {
          image: {  
            $type: 'blob',
            ref: {
              $link: uploadedImage.data.blob.ref.toString(),
            },
            mimeType: uploadedImage.data.blob.mimeType,
            size: uploadedImage.data.blob.size,
          },
          alt: alt,
        }
      ]
    };
  }

  const rt = new RichText({ text: tweet });
  const postRecord = {
    $type: "app.bsky.feed.post",
    text: rt.text,
    facets: rt.facets,
    createdAt: new Date().toISOString(),
  };
  if (embed) postRecord.embed = embed;
  await agent.post(postRecord);
};

E daí, meu botzinho agora faz posts no twitter, mastodon e bluesky, sendo chamados num cronjob.

Threads 07/07/2023 16:10

tirinha
Inclua essa tirinha em seu site
COLE ESSE CÓDIGO EM SEU SITE x
Transcrição ↓

P.A.: Vi que você entrou no "Threads"... Por acaso você leu realmente os termos ou só marcou que leu?
Programador: Está insinuando que eu sou mentiroso?? Mas não li, o que tem lá?
P.A.: Cara, lá diz que eles vão ter acesso até às suas informações financeiras!
Programador: Ótimo... Quem sabe ano que vem ele já preenche o meu imposto de renda por mim...
(P.A. perplexo)
--
Camiseta: Nem eu tenho o controle sobre as minhas finanças

Você já ouviu falar da última sensação da internet? Prepare-se para se conectar com pessoas que você nem sabia que existiam e compartilhar detalhes da sua vida que nem sua própria mãe conhece. Sim, estou falando de "Threads", a rede social que veio para transformar sua vida e tornar sua privacidade algo tão raro quanto uma espécie em extinção. Mas não se preocupe, é tudo em nome da comodidade!

Mas hey, quem precisa ler coisas chatas, como termos de uso, não é mesmo? Afinal, quem tem tempo para analisar minuciosamente o que acontece com nossos dados pessoais quando clicamos naquele botãozinho adorável que diz "Concordo"? Ninguém! Estamos ocupados demais postando fotos das nossas últimas férias paradisíacas e compartilhando o que tivemos para o jantar.

No final das contas, "Threads" é apenas mais uma rede social em um oceano de aplicativos que nos mantêm entretidos e nos fazem questionar se realmente sabemos o que estamos fazendo. A vantagem é que dessa vez é só a Meta, a mega-empresa que já usa todos os nossos dados para o mal, mesmo. Talvez estejamos trocando nossa privacidade por momentos fugazes de diversão e validação virtual. Mas hey, enquanto estamos dando risadas com os memes compartilhados pelos nossos amigos virtuais, tudo parece valer a pena. Então, sigamos postando, curtindo e compartilhando, sem pensar muito nas implicações, porque afinal de contas, a vida é muito curta para ler termos de uso, não é?

(Esse texto contém trechos de ironia e sarcasmo :D. As partes ruins são culpa do ChatGPT.)

[Vídeo] LGPD: Como essa Lei se aplica aos desenvolvedores 06/07/2023 10:35

Neste vídeo inspirador, você terá a oportunidade de assistir à palestra "LGPD: Como essa Lei se aplica aos desenvolvedores", ministrada pela renomada advogada Maria Luiza Marussi durante o evento The Developer's Life Weekend 2022.

Durante essa palestra envolvente, Maria Luiza Marussi compartilha insights valiosos sobre a Lei Geral de Proteção de Dados (LGPD) e explora de forma abrangente suas implicações cruciais no universo do desenvolvimento de software. Como desenvolvedores, é essencial compreender a importância da conformidade com a LGPD e como isso impacta diretamente o processo de criação de software.

Maria Luiza Marussi, especialista no assunto, aborda os principais conceitos da LGPD de maneira clara e acessível, destacando os direitos dos usuários, as responsabilidades dos desenvolvedores e as medidas de segurança necessárias para proteger dados pessoais sensíveis. Ela oferece uma visão abrangente das implicações legais e práticas que os desenvolvedores precisam considerar ao criar aplicativos e sistemas digitais.

Esta palestra informativa é uma fonte essencial de conhecimento para desenvolvedores, estudantes de ciência da computação, empresários e qualquer pessoa interessada em entender como a LGPD afeta o ambiente de desenvolvimento de software. Ao assistir a esta palestra, você terá uma visão clara e atualizada sobre a LGPD e poderá tomar decisões informadas para garantir a conformidade legal e a proteção dos dados em seus projetos de software.

Não perca a oportunidade de aprender com Maria Luiza Marussi, uma profissional experiente no campo da proteção de dados e uma voz autorizada no setor jurídico. Assista a esta palestra cativante e capacite-se com o conhecimento necessário para navegar com segurança pelo cenário regulatório da LGPD.

Inscreva-se na próxima edição

Erro no laudo 05/07/2023 17:42

tirinha
Inclua essa tirinha em seu site
COLE ESSE CÓDIGO EM SEU SITE x
Transcrição ↓

real historia;
string sender = "walter dias";

Usuário (por telefone): Estou com problemas para emitir os laudos aqui no sistema... Para emitir os laudos eu preciso gerar o relatório, esse relatório tem que vir com a imagem e ... <longa explicação>
Programador: Peraí... Deixa eu entender
melhor... O sistema não está gerando os laudos como deveria?
Usuário: Isso!
Programador: Pode ser um bug, mas aqui não verifiquei nada. Vou precisar acessar remoto aí para você fazer passo a passo e me mostrar o erro...
Usuário: OK.
(Após o procedimento de acesso remoto)
Usuário: Daí eu entro aqui... Vou nessa tela... Digito aqui... Aí... Tá vendo o erro?
Programador: Hmmm... É sempre esse mesmo erro?
Usuário: Sim!
Programador: Essa é a tela de login e o erro é "Senha inválida". Você esqueceu a senha?
Usuário: É...
Programador: PLOFT!
--
Camiseta: Vamos precisar trocar o usuário para resolver

Quem nunca se deparou com um erro enigmático em um sistema e ficou completamente perdido? Os usuários enfrentam uma verdadeira saga ao tentar reportar esses erros aos desenvolvedores.

A dificuldade começa quando somos confrontados com mensagens de erro cheias de termos técnicos que mais parecem palavras mágicas de um feitiço incompreensível. 'Fatal error', 'exception', 'stack trace'... Será que isso é uma língua alienígena? Fica difícil explicar o problema quando nem entendemos o que está escrito.

E tem mais: reproduzir o erro é um verdadeiro desafio digno de um programa de TV de aventura. O erro parece acontecer quando menos esperamos, em momentos inoportunos e em situações inexplicáveis. Tentar explicar como aconteceu é como tentar desvendar o mistério do Triângulo das Bermudas.

Mas a saga não para por aí! A comunicação com a equipe de suporte técnico também pode ser uma experiência peculiar. Mensagens de erro confusas, ambíguas ou até mesmo inexistentes nos deixam com um ponto de interrogação gigante na cabeça. Fica difícil descrever o erro quando nem sabemos o que ele quer dizer.

Então, desenvolvedores, vamos facilitar a vida dos usuários! Mensagens de erro mais amigáveis, documentação acessível e formulários de reporte de erros simples e diretos podem salvar a vida de quem está perdido nesse labirinto tecnológico.

E para os usuários, um conselho: não percam o senso de humor! Afinal, enquanto lutamos contra esses erros misteriosos, podemos aproveitar o lado cômico dessa aventura tecnológica. Em vez de ficar frustrado, vamos rir juntos dos erros e transformar essa saga em uma comédia hilariante!

Resumindo: reportar erros pode ser um desafio divertido. Entre mensagens criptografadas e reproduções impossíveis, os usuários enfrentam uma verdadeira jornada cômica. Mas com um pouco de empatia e bom humor, podemos desvendar esses mistérios tecnológicos e tornar a experiência mais leve e divertida para todos!

Mocks 03/07/2023 12:01

tirinha
Inclua essa tirinha em seu site
COLE ESSE CÓDIGO EM SEU SITE x
Transcrição ↓

real historia;
string sender = "";

Chefe: Programador, já terminou? A gente precisa entregar isso o mais rápido possível!
Programador: Caramba, ontem você disse que tinha um prazo de 5 dias... Ainda está tudo com os Mocks...
Chefe: Ótimo! Manda com esses mocks mesmo. É sempre bom mandar com algo a mais...
Programador: PLOFT!
--
Camiseta: Você escuta o que você diz

"Objetos mock, objetos simulados ou simplesmente mock (do inglês mock object) em desenvolvimento de software são objetos que simulam o comportamento de objetos reais de forma controlada. São normalmente criados para testar o comportamento de outros objetos. Em outras palavras, os objetos mock são objetos 'falsos' que simulam o comportamento de uma classe ou objeto 'real' para que possamos focar o teste na unidade a ser testada." (Wikipedia)

Ah, os famosos mocks no desenvolvimento! Quem diria que esses pequenos artefatos poderiam causar tantos dilemas e situações engraçadas, não é mesmo?

Os mocks são uma ferramenta importante no desenvolvimento de software. Eles nos permitem simular o comportamento de componentes ou serviços externos, tornando mais fácil e ágil testar o código que estamos desenvolvendo.

Claro, nem sempre é fácil lidar com eles. Às vezes, os mocks podem ser teimosos, agindo de maneira inesperada e nos deixando de cabelo em pé. Mas, no fim das contas, eles estão ali para nos ajudar a entregar um trabalho de qualidade.

Então, nobres devs, quando o chefe vier com essas ideias mirabolantes de mandar com mocks ou qualquer outra coisa "a mais", respirem fundo, soltem um "PLOFT!" mentalmente e sigam em frente. Afinal, no mundo do desenvolvimento, o humor é sempre bem-vindo para nos lembrar que, no final das contas, somos todos humanos enfrentando desafios tecnológicos.

E assim seguimos, com mocks ou sem mocks, levando a vida de programador com muito bom humor e um pouco de sarcasmo. Porque, afinal, como dizem por aí, "Se o código não está funcionando, coloca mais mocks!" (ou talvez não, melhor não seguir esse conselho...).

Que a força dos mocks esteja com vocês, meus amigos! E que as linhas de código sejam sempre engraçadas e livres de bugs!

[Vídeo] A Inteligência Artificial NÃO VAI MELHORAR a sua vida, mas você PRECISA dela! 26/06/2023 17:23

Sim, já é realidade a Inteligência Artificial no nosso dia a dia. Sim, ela deixa muito mais rápido o trabalho. Mas será que vai melhorar a nossa vida? O título acima diz que não, não vou revelar muito na descrição porque eu quero bastante que você assista o vídeo!

Ali a gente conversa um pouco sobre esses novos sistemas de IA e como eles combinam (ou não) com nosso dia a dia no desenvolvimento (ou em qualquer outra área).

Comente aí o que achou.

Camiseta do vídeo

e-books 26/06/2023 15:34

tirinha
Inclua essa tirinha em seu site
COLE ESSE CÓDIGO EM SEU SITE x
Transcrição ↓

real historia;
string sender = "Renato Cassino";

Chefe: Programador, o pessoal do marketing te passou informações sobre a parceria que fechamos?
Programador: Ah, sim. Já estou trabalhando nisso. Nós vamos disponibilizar acesso a mais de 40 mil e-books da editora em nosso sistema. Vamos puxar pelo webservice e...
Chefe: Mais de 40 mil e-books?? Se for indexar isso tudo a gente vai derrubar o Google!
Programador: PLOFT!
--
Camiseta: Segura essa, Google!

Quem nunca teve que lidar com a difícil escolha entre levar três livros pesadões na mala ou sacrificar espaço para aquela camiseta favorita? É aí que entram os e-books, os heróis da praticidade literária! Essas versões digitais dos nossos amados livros estão conquistando corações (e estantes virtuais) em todo o mundo. Com eles, podemos ter acesso a uma biblioteca inteira sem ocupar espaço físico ou ter que carregar quilos extras na bolsa. Adeus, dilema do viajante bibliófilo!

Mas a praticidade não é o único superpoder dos e-books. Eles também são importantes para a democratização do conhecimento e a acessibilidade à leitura. Com apenas um dispositivo, como um smartphone ou tablet, é possível levar consigo uma infinidade de obras literárias. Os e-books tornam a leitura mais acessível a pessoas com deficiências visuais, por meio de recursos de acessibilidade, como a possibilidade de ajustar o tamanho da fonte ou utilizar a leitura em voz alta. Além disso, muitos e-books são mais baratos ou até mesmo gratuitos, permitindo que mais pessoas possam desfrutar de uma boa história sem gastar uma fortuna.

E não podemos deixar de mencionar a comodidade de poder ler em qualquer lugar e a qualquer hora. Os e-books se tornaram companheiros inseparáveis em filas intermináveis, no transporte público ou até mesmo durante uma pausa para o café. Basta ter um dispositivo eletrônico e um pouco de bateria, e voilà! O mundo da literatura se abre diante dos nossos olhos. E se você está indeciso sobre qual livro começar, os e-books ainda têm a vantagem de permitir uma rápida prévia ou acesso a resenhas, para te ajudar a tomar a melhor decisão literária do momento.

Os e-books vieram para revolucionar a forma como lemos e nos relacionamos com os livros. Além de proporcionar praticidade, eles têm um papel importante na democratização da leitura e na acessibilidade a todos os tipos de leitores. Com um toque de bom humor, os e-books nos convidam a embarcar em aventuras literárias sem carregar pesos extras ou ocupar espaço nas nossas estantes. Então, que tal abraçar essa revolução digital e mergulhar nas páginas virtuais dos e-books? A leitura nunca foi tão divertida e prática!

↑ Voltar ao Topo