Rebranding 24/07/2023 10:20

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

(No escritório de uma rede social fictícia)
Chefe: Desde que eu comprei essa rede, já comecei a cobrar mensalidade para quem quer aparecer mais, mudei as regras várias vezes, favoreci discursos de ódio e a rede continua firme e forte...
Programador: É porque a rede tem um nome e uma marca já bem estabelecida...
Chefe: Ótimo! Vamos mudar isso também!
Programador, Programadora e P.A.: PLOFT!
(Passarinho jogado pela janela)
--
Camiseta: Piu!

Goodbye, Kevin! 20/07/2023 15:42

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

Programador: Cara, que barra! Você viu que o Kevin Mitnick morreu? Eu tô fazendo uma lista aqui em homenagem, vou te adicionar. Qual é o seu e-mail?
P.A.: Tá, Anota aí: [email protected]
Programador: Bacana, e qual é a senha?
(P.A. olha estranho)
P.A.: Olha, se vai homenagear um cara que era o mestre da engenharia social, precisa melhorar muito seu estilo!
Programador (sorrindo): Eu tinha que tentar...
--
Camiseta: FREE KEVIN!

[Vídeo] Como usar o Github como portfolio (de verdade!) 20/07/2023 13:07

Eu sempre digo que o Github não é um portfolio, porque ninguém vai ficar olhando seus repositórios, mas nesta palestra a Pachi Parra mostra como realmente tornar seu perfil num portfolio e ser uma ótima apresentação sua para empresas e recrutamento.

Aprenda nessa palestra bem prática como melhorar seu perfil, eu mesmo aproveitei pra melhorar um pouco o meu!

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!

↑ Voltar ao Topo