A tecnologia retrô encontra o streetwear distópico. Esta pixel art exclusiva (1/1) retrata o personagem icônico com um chefe de TV transmitindo o Olho da Providência.
https://opensea.io/item/ethereum/0x008d50b3b9af49154d6387ac748855a3c62bf40d/6
Soft & Games
A tecnologia retrô encontra o streetwear distópico. Esta pixel art exclusiva (1/1) retrata o personagem icônico com um chefe de TV transmitindo o Olho da Providência.
https://opensea.io/item/ethereum/0x008d50b3b9af49154d6387ac748855a3c62bf40d/6
Estou iniciando o Desafio de Codificação Demensdeum nº 2:
1. Você precisa vibrar o aplicativo web para exibir uma lista de festas/eventos na área do usuário.
2. A fonte de dados pode ser web scraping frontal ou um banco de dados local/remoto.
3. Mostrar eventos/festas no mapa apenas para hoje.
4. Você pode alterar o raio de pesquisa.
5. Envie como uma sequência de prompts de texto que podem ser reproduzidos em geradores de código gratuitos, como o Google AI Studio.
6. Deve funcionar na web para iOS, Android, PC
7. O melhor design vence
8. Exiba informações detalhadas sobre o evento tocando no evento no mapa.
9. Amplie mapas com os dedos ou o mouse.
10. O vencedor é escolhido pelo júri (escreva-me para participar do júri)
11. Prêmio 200 USDT
12. Data de vencimento: 1º de julho.
Vencedor do último DemensDeum Coding Challenge #1
https://demensdeum.com/blog/ru/2025/06/03/demensdeum-code-challenge-1-winner/
A capacidade de comprar moedas por criptomoeda foi adicionada ao jogo Masonry-AR! Por US$ 1 você pode obter 5.000 MOS. Links de referência também foram adicionados ao jogo; para cada compra de um amigo, o indicador recebe 50.000 MOS. Detalhes no Wiki Maçônico. Também foi adicionado um modo de caminhada automática: quando não há acesso ao módulo GPS, o Mason começa a caminhar de uma das capitais do mundo automaticamente, apenas para frente.

Link do jogo:
https://demensdeum.com/demos/masonry-ar/client/
“Donkey Adept” é uma peça impressionante e eletrizante de surrealismo pixelado. No centro está uma figura com uma jaqueta de couro preta, cuja cabeça é uma televisão em chamas e cheia de estática, com orelhas de burro em chamas. O sujeito segura uma lanterna poderosa, agindo como um sentinela solitário que busca a verdade em meio ao barulho. É uma meditação furiosa em estilo retrô sobre a mídia, a loucura e a busca incansável pela luz.
https://opensea.io/item/ethereum/0x008d50b3b9af49154d6387ac748855a3c62bf40d/5
Conheça o Cube Art Project 2 Online – Editor leve, rápido e totalmente reescrito da programação da estação, que funciona diretamente no navegador. Agora, com a possibilidade de criatividade conjunta!
Isso não é apenas uma ferramenta, mas um experimento com cor, geometria e uma criação 3D meditativa à qual você pode conectar amigos. O projeto foi criado em JavaScript Pure e três.js sem estruturas e membros da Web, demonstrando os recursos de WebGL e Shaaders.
NOVO: Multiplayer! Cooperar com outros usuários em tempo real. Todas as mudanças, a adição e coloração dos cubos são sincronizadas instantaneamente, permitindo que você crie obras -primas da estação.
Controlar:
– WASD – movendo a câmera
– Mouse – rotação
– GUI – Configurações de cores
On-line:
https://demensdeum.com/software/cube-art-project-2-online/
Fontes no Github:
https://github.com/demensdeum/cube-art-project-2-online
O projeto é escrito em JavaScript puro usando três.js.
Sem estruturas, sem colecionadores, sem o WebAssembly – apenas Webgl, Shaders e um pouco de amor pela geometria de pixels.
Donki Hills é um jogo de terror de comédia, uma experiência narrativa emocionante na primeira pessoa, mergulhando os jogadores em um profundo segredo com uma mistura de humor inesperado. Desenvolvido e publicado por Demensdeum no motor Unreal Engine, o jogo permite controlar James, uma pessoa comum, cuja vida dá uma virada incomum após o misterioso desaparecimento de seu conhecido online, Maria. Sua única pista é uma única foto sugerindo uma vila russa isolada chamada Quiet Donki, localizado perto de Novosibirsk. Dirigindo com uma conexão inabalável e uma necessidade desesperada de respostas (e, possivelmente, com várias risadas nervosas), James faz uma jornada épica para revelar a verdade sobre o desaparecimento de Maria.
O jogo está disponível no Steam:
https://store.steampowered.com/app/3476390/Donki_Hills/
[Complementos]
A entropia na programação é uma força poderosa, mas muitas vezes discreta, que determina a variabilidade e a imprevisibilidade do comportamento do software. De bugs simples a avós complexas, a entropia é a razão pela qual nossos programas nem sempre se comportam como esperamos.
A entropia no software é uma medida de resultados inesperados de algoritmos. O usuário percebe os resultados 1stti como erros ou bugs, mas do ponto de vista da máquina, o algoritmo executa exatamente as instruções que o programador estabeleceu nele. O comportamento inesperado surge devido a um grande número de combinações possíveis de dados de entrada, condições do sistema e interações.
Causas de entropia:
* Alterando o estado: quando o objeto pode alterar seus dados internos, o resultado de seu trabalho se torna dependente de todo o histórico de seu uso.
* A complexidade dos algoritmos: à medida que o programa cresce, o número de maneiras possíveis de executar o código cresce exponencialmente, o que torna quase impossível a previsão de todos os resultados.
* Fatores externos: sistema operacional, outros programas, atrasos na rede – tudo isso pode afetar a execução do seu código, criando fontes adicionais de variabilidade.
Causas de entropia:
* Alterando o estado: quando o objeto pode alterar seus dados internos, o resultado de seu trabalho se torna dependente de todo o histórico de seu uso.
* A complexidade dos algoritmos: à medida que o programa cresce, o número de maneiras possíveis de executar o código cresce exponencialmente, o que torna quase impossível a previsão de todos os resultados.
* Fatores externos: sistema operacional, outros programas, atrasos na rede – tudo isso pode afetar a execução do seu código, criando fontes adicionais de variabilidade.
Em seu trabalho, “Global Varia Bybles Conseded Liveful” (1973) W.A. Wulf e M. Shaw mostraram que as variáveis globais são uma das principais fontes de comportamento imprevisível. Eles criam vícios implícitos e efeitos colaterais difíceis de rastrear e controlar, que é uma manifestação clássica da entropia.
A idéia de crescente complexidade dos sistemas de software formulou perfeitamente Manny Leman em suas leis de evolução do software. Dois deles refletem diretamente o conceito de entropia: O programa de computador usado será modificado. Esta declaração sugere que o software não é estático. Ele vive, desenvolve e muda para atender a novos requisitos e meio ambiente. Cada nova “rodada” da vida do programa é uma fonte potencial de entropia. Quando o programa de computador é modificado, sua complexidade aumenta, desde que ninguém impeça isso. Esta lei é uma conseqüência direta da entropia. Sem esforços direcionados de gerenciamento de complexidade, cada nova modificação introduz variabilidade adicional e imprevisibilidade no sistema. Existem novas dependências, condições e efeitos colaterais que aumentam a probabilidade de bugs e comportamento não obsoleto. No campo da inteligência artificial e dos grandes modelos de idiomas (LLM), a entropia é especialmente aguda, pois aqui estamos lidando com algoritmos não -metâmicos. Ao contrário dos programas tradicionais, onde o mesmo acesso sempre oferece a mesma saída, o LLM pode fornecer respostas diferentes para a mesma solicitação. Isso cria um enorme problema: a correção do algoritmo pode ser confirmada apenas em um determinado conjunto limitado de dados de entrada usando autores. Mas ao trabalhar com dados de entrada desconhecidos (solicitações dos usuários), o comportamento do modelo se torna imprevisível. Vocabulário e declarações racistas e inordenadas: casos conhecidos quando os bots de bate -papo, como Tay da Microsoft ou Grok de XII, depois de treinar dados da Internet, começaram a gerar declarações ofensivas ou racistas. Este foi o resultado da entropia: dados de entrada desconhecidos em combinação com um enorme volume de amostra de treinamento levou a um comportamento imprevisível e incorreto. Apelações ilegais: esses problemas surgem quando uma rede neural começa a emitir conteúdo que viola direitos autorais ou normas éticas. Ai Bota nos Jogos: A introdução de personagens de IA em jogos com a possibilidade de aprender, por exemplo, em Fortnite, levou ao fato de que a IA Bot teve que ser desligada e adicionada ao rastreamento da correção da atividade, para impedir que ações ilegais do LLM Bot. Código mal escrito e soluções de desvio Isso demonstra o efeito direto e cumulativo do dever técnico sobre a propagação de erros e a integridade dos algoritmos, onde cada redução atual adota leva a erros mais complexos e frequentes no futuro. Quando os sistemas de software não são testados com cuidado, eles são muito mais suscetíveis a erros e comportamento inesperado. Essa inadequação permite que os erros se acumulem com o tempo, criando um sistema difícil de suportar e que é muito suscetível a outros erros. Negligenciar os testes desde o início não apenas aumenta a dívida técnica, mas também ajuda diretamente a aumentar o número de erros. A “teoria das janelas quebradas” na entropia de software sugere que erros insignificantes, ignorados ou problemas de design podem se acumular ao longo do tempo e levar a problemas mais sérios e reduzir a qualidade do software. Isso estabelece uma relação causal direta: a falta de teste leva ao acúmulo de erros, o que leva a um aumento na entropia, o que leva a erros mais complexos e frequentes, afetando diretamente a correção e a confiabilidade dos algoritmos. A documentação adequada é frequentemente ignorada ao desenvolver software, o que leva à fragmentação ou perda de conhecimento sobre como o sistema funciona e como apoiá -lo. Isso força os desenvolvedores a “apoiar” o sistema para fazer alterações, aumentando significativamente a probabilidade de mal -entendidos e modificações incorretas, o que leva diretamente a erros. Também complica seriamente a adaptação de novos desenvolvedores, pois informações críticas não estão disponíveis ou enganosas. A entropia do programa ocorre devido à “falta de conhecimento” e “discrepâncias entre suposições gerais e o comportamento real do sistema existente”. Esta é uma observação organizacional mais profunda: a entropia se manifesta não apenas no nível do código, mas também no nível do conhecimento. Esses conhecimentos informais e implícitos são frágeis e são facilmente perdidos (por exemplo, ao deixar os membros da equipe), o que leva diretamente a erros ao tentar modificar, especialmente os novos membros da equipe, levando assim a integridade da lógica algorítmica, uma vez que suas principais suposições deixam de ser claras. O fator humano é um fator determinante significativo, geralmente subestimado, na entropia de software. Várias habilidades, codificação e expectativas de qualidade entre os desenvolvedores levam a inconsistências e desvios no código -fonte. A falta de processos padronizados para linhagem, revisões de código, testes e documentação exacerba esse problema. Além disso, um código pouco claro ou instável do código, quando vários comandos possuem parte do código ou nenhum possui, leva a negligenciar e aumentar em decaimento, o que leva à duplicação de componentes que desempenham a mesma função de maneiras diferentes, espalhando erros. Isso mostra que a entropia não é apenas um problema técnico, mas também um sociotécnico, profundamente enraizado na dinâmica organizacional e no comportamento humano. A “inconsistência coletiva” que surge devido a práticas inconsistentes e posse fragmentada leva diretamente a inconsistências e defeitos, tornando o sistema imprevisível e difícil de controlar, o que afeta muito a integridade dos algoritmos. Os sistemas de software modernos geralmente são complexos e muito interconectados. Em tais sistemas, um alto grau de complexidade e componentes intimamente relacionados aumentam a probabilidade de falhas em cascata, quando a recusa de um componente causa uma reação em cadeia de falhas em outros. Esse fenômeno exacerba a influência de erros e o comportamento inadequado dos algoritmos, transformando problemas localizados em riscos sistêmicos. Os resultados dos algoritmos nesses sistemas se tornam muito vulneráveis a falhas que surgem longe de seu caminho direto de execução, o que leva a resultados incorretos generalizados. A complexidade arquitetônica, a manifestação direta da entropia, pode transformar erros algorítmicos isolados em falhas de grande escala de escala, tornando o sistema geral não confiável e seus dados de saída não são confiáveis. Isso enfatiza a necessidade de estabilidade arquitetônica de conter a propagação de efeitos de entropia. Um dos exemplos mais recentes é a parada bem conhecida dos aeroportos da América e da Europa devido ao aparecimento da tela de morte azul após atualizar o software antivírus em 2024, o resultado errôneo do algoritmo antivírus e o sistema operacional levou ao tráfego aéreo no mundo. Vejamos um exemplo simples com um campo de texto, limitado por 32 bytes. Se o campo aceitar apenas símbolos ASCII, cada símbolo pega 1 bytes. Assim, exatamente 32 caracteres são colocados no campo. Qualquer outro símbolo simplesmente não será aceito. @startuml Usuário -> TextField: apresenta 32 símbolos ASCII Agora, nosso programa de seus anos 80 cai em 2025. Quando o campo toma UTF-8, cada símbolo pode ocupar de 1 a 4 bytes. Se o usuário introduzir uma linha superior a 32 bytes, o sistema poderá cortá -la incorretamente. Por exemplo, o emoji ocupa 4 bytes. Se a poda ocorrer dentro do símbolo, obtemos um símbolo “quebrado”. @startuml Usuário -> TextField: apresenta “Hi” (37 byte) Aqui a entropia se manifesta no fato de que a mesma operação de poda para diferentes dados de entrada leva a resultados imprevisíveis e incorretos. Mesmo em tecnologias aparentemente estáveis, como o CSS, a entropia pode ocorrer devido a diferentes interpretações dos padrões. Imagine que o desenvolvedor aplicou o usuário eleito: nenhum; A todos os elementos para desativar a saída de texto. O navegador 10 faz uma exceção para os campos de entrada. Assim, apesar da bandeira, o usuário pode inserir dados. @startuml Usuário -> Browser10: Entrando na entrada Os desenvolvedores do novo navegador decidiram seguir estritamente as especificações, aplicando a regra a todos os elementos sem exceção. @startuml Usuário -> Browser11: Inserindo a entrada Este exemplo clássico de entropia – a mesma regra leva a diferentes resultados, dependendo do “sistema” (versão do navegador). Uma tarefa técnica ambígua (TK) é outra fonte poderosa de entropia. Quando dois desenvolvedores, Bob e Alice, entendem o mesmo requisito de maneiras diferentes, isso leva a implementações incompatíveis. TK: “Para implementar um gerador de números de Fibonacci. Para otimização, uma lista de números gerados deve ser armada dentro do gerador”. Modelo mental de Bob (OOP com uma condição variável) Alice se concentrou na frase "retorna a sequência". Ela escreveu uma função pura que retorna uma nova lista a cada vez, usando o cache apenas como otimização interna. Quando Alice começa a usar o gerador Bob, ela espera que a geração (5) sempre retorne 5 números. Mas se antes disso Bob chamou Gereate (8) no mesmo objeto, Alice receberá 8 números. Conclusão: entropia aqui está uma conseqüência dos modelos mentais. O estado mutável na implementação de Bob torna o sistema imprevisível para Alice, que aguarda o comportamento da função pura. Na programação multi -fluxo, a entropia se manifesta especialmente. Vários fluxos são realizados simultaneamente e o procedimento para sua implementação é imprevisível. Isso pode levar à condição de corrida, quando o resultado depende de qual fluxo é o primeiro a acessar o recurso comum. O caso extremo é o avô quando dois ou mais fluxos estão esperando um pelo outro, e o programa congela. Exemplo da solução de Dedlok: O problema do Dedlok surge quando dois ou mais fluxo se bloqueiam, aguardando a liberação do recurso. A solução é estabelecer um procedimento único e fixo para aproveitar os recursos, por exemplo, bloqueá -los aumentando o ID. Isso exclui uma expectativa cíclica que impede o impasse. @startuml Thread1 -> Accounta: Blocks Conta A Essa abordagem - bloqueio ordenado (pedidos de bloqueio) - é uma estratégia fundamental para prevenir os Deadlles em programação paralela. Ótimo, vamos analisar como o estado mutável na abordagem OOP aumenta a entropia, usando o exemplo de desenho de tela e comparar isso com uma função pura. Quando o objeto tem um estado alterado, seu comportamento se torna imprevisível. O resultado de chamar o mesmo método depende não apenas de seus argumentos, mas também de toda a história da interação com esse objeto. Isso traz entropia para o sistema. Considere as duas abordagens do retângulo que desenham tela: uma em um estilo OOP com uma condição variável, a outra em uma função funcional, com uma função pura. 1. Abordagem OOP: Classe com um estado variável Diagrama UML da abordagem OOP: Esse diagrama mostra claramente que a chamada do método de desenho fornece resultados diferentes, embora seus argumentos possam não mudar. Isso se deve a uma chamada setColor separada, que mudou o estado interno do objeto. Esta é uma manifestação clássica da entropia em um estado mutável. 2. Abordagem funcional: função pura Aqui usamos uma função pura. Sua tarefa é simplesmente desenhar um retângulo usando todos os dados necessários que são transmitidos a ele. Ela não tem condição, e seu desafio não afetará nada fora de suas fronteiras. Diagrama de uml de uma abordagem funcional: Este diagrama mostra que a função Drawrectangle sempre recebe a cor externa. Seu comportamento depende completamente dos parâmetros de entrada, o que o torna limpo e com um baixo nível de entropia. @startuml Programador -> drawfunc: drawrewerctangle (ctx, reta, 'vermelho') DrawFunc -> Canvas: inundações com a cor 'vermelha' Em um exemplo com uma função pura, o comportamento é completamente previsível, pois a função não tem condição. Todas as informações para o trabalho são transmitidas por meio de argumentos, o que a torna isolada e segura. Em uma abordagem OOP com um estado variável para o comportamento do método de desenho, toda a história da interação com o objeto pode afetar, o que introduz entropia e torna o código menos confiável. A divisão de sistemas complexos em módulos menores, independentes e auto -suficientes simplifica o design, desenvolvimento, teste e manutenção. Cada módulo processa certas funcionalidades e interage através de interfaces claramente definidas, reduzindo a interdependência e contribuindo para a separação de responsabilidade. Essa abordagem melhora a legibilidade, simplifica a manutenção, facilita o desenvolvimento paralelo e simplifica testes e depuração, isolando problemas. É fundamental que isso reduz o "raio da derrota" de erros, segurando defeitos em módulos separados e impedindo falhas em cascata. A arquitetura do microsserviço é uma poderosa realização da modalidade. A modularidade não é apenas uma maneira de organizar o código, mas também uma abordagem fundamental para conter defeitos e aumentar a estabilidade. Limitando o impacto do erro em um módulo, a modalidade aumenta a estabilidade geral do sistema para decaimento de entropia, garantindo que um ponto de recusa não comprometa a correção de todo o aplicativo. Isso permite que as equipes se concentrem em partes menores e mais controladas do sistema, o que leva a testes mais completos e erros de detecção e correção mais rápidos. Beijo (mantenha -o simples, estúpido): O KISS não é apenas uma preferência estética, mas uma escolha deliberada de design, que reduz a superfície do ataque por erros e torna o código mais resistente a mudanças futuras, mantendo assim a correção e a previsibilidade dos algoritmos. Esta é uma medida proativa contra entropia em um nível detalhado de código. Seco (não se repita): A duplicação do código leva a alterações inconsistentes, o que, por sua vez, leva a erros. O seco impede isso, fornecendo uma única fonte de verdade para lógica e dados, que contribuem diretamente para a correção dos algoritmos, garantindo que a lógica geral se comporte de maneira uniforme e previsível em todo o sistema, impedindo que erros finos e difíceis de inserir. princípios
Este acrônimo mnemônico apresenta cinco princípios fundamentais de design (responsabilidade unificada, abertura/proximidade, substituição de liskin, separação de interfaces, inversões de dependências) que são cruciais para a criação de projetos orientados a objetos claros, flexíveis e solidários. A adesão a entidades sólidas de software se torna mais fácil de suportar e adaptar, o que leva a um número menor de erros e ciclos de desenvolvimento mais rápidos. Eles conseguem isso simplificando o Serviço (SRP), garantindo as funções de adição escalável sem modificação (OCP), garantindo consistência comportamental (LSP), minimizando a coerência (ISP) e aumentando a flexibilidade devido à abstração (DIP). Os princípios sólidos fornecem uma abordagem holística da integridade estrutural, que torna o sistema em essência mais resistente aos efeitos de acrobacias das mudanças. Promovendo modularidade, separação e responsabilidades claras, eles impedem erros em cascata e mantêm a correção dos algoritmos, mesmo quando o sistema é continuamente evolução, atuando como medidas fundamentais para combater a entropia. O design orientado ao domínio (DDD) não é apenas uma filosofia, mas uma metodologia completa que oferece padrões específicos para dividir a aplicação em domínios, o que permite controlar efetivamente a complexidade e combater a entropia. O DDD ajuda a transformar um sistema caótico em um conjunto de componentes previsíveis e isolados. O livro "Padrões de design: elementos do software reutilizável orientado a objetos" (1994), escrito por uma "gangue de quatro" (GOF), ofereceu um conjunto de soluções comprovadas para problemas típicos. Esses padrões são excelentes ferramentas para combater a entropia, pois criam sistemas estruturados, previsíveis e controlados. Um dos principais efeitos dos padrões é a criação de um único aparelho conceitual. Quando o desenvolvedor em uma equipe fala sobre a "fábrica" ou "solitária", seus colegas entendem imediatamente de que tipo de código é que estamos falando. Isso reduz significativamente a entropia na comunicação, porque: A ambiguidade diminui: os padrões têm nomes e descrições claras, o que exclui diferentes interpretações, como no exemplo de Bob e Alice. Acelera o intervalo: os novos membros da equipe são derramados mais rapidamente no projeto, pois não precisam adivinhar a lógica atrás de estruturas complexas. A refatoração é facilitada: se você precisar alterar a parte do sistema construído de acordo com o padrão, o desenvolvedor já sabe como é organizado e quais peças podem ser modificadas com segurança. Exemplos de padrões de GOF e sua influência na entropia: Padrão "Estratégia": permite encapsular vários algoritmos em classes individuais e torná -los intercambiáveis. Isso reduz a entropia, pois permite alterar o comportamento do sistema sem alterar seu código principal. Padrão "comando" (comando): inkapsules o método do método para o objeto. Isso permite que você adie a execução, coloque os comandos na fila ou os cancele. O padrão reduz a entropia, pois separa o remetente da equipe de seu destinatário, tornando -os independentes. Padrão de observador (observador): determina a dependência do "um para muitos", no qual uma alteração no estado de um objeto notifica automaticamente todos os dependentes. Isso ajuda a controlar os efeitos colaterais, tornando -os óbvios e previsíveis, e não caóticos e ocultos. Padrão "Método da Fábrica": define a interface para criar objetos, mas permite que as subclasses decidam qual classe instituir. Isso reduz a entropia, pois permite criar objetos com flexibilidade sem a necessidade de conhecer classes específicas, reduzindo a conexão. Esses padrões ajudam os programadores a criar sistemas mais previsíveis, testados e controlados, reduzindo assim a entropia, o que ocorre inevitavelmente em projetos complexos. Contextos limitados: esse padrão é a fundação DDD. Ele se oferece para dividir um grande sistema em peças pequenas e autônomas. Cada contexto tem seu próprio modelo, um dicionário de termos (idioma onipresente) e lógica. Isso cria limites estritos que impedem a propagação de mudanças e efeitos colaterais. A mudança em um contexto limitado, por exemplo, no "contexto das ordens", não afetará o "contexto de entrega". Agregados (agregados): A unidade é um cluster de objetos relacionados (por exemplo, "ordem", "linhas da ordem"), que é considerada como um todo. A unidade possui um objeto raiz (raiz agregada), que é o único ponto de entrada para todas as alterações. Isso fornece consistência e garante que o estado da unidade sempre permaneça integral. Ao alterar a unidade apenas através de seu objeto raiz, controlamos como e quando há uma alteração na condição, o que reduz significativamente a entropia. Serviços de domínio Serviços: Para operações que não pertencem a nenhum objeto específico da área de assunto (por exemplo, a transferência de dinheiro entre contas), o DDD propõe usar os serviços de domínio. Eles coordenam as ações entre várias unidades ou objetos, mas não mantêm a condição. Isso torna a lógica mais transparente e previsível. Os eventos da área de assunto (eventos de domínio): em vez de métodos de chamada direta de diferentes contextos, o DDD oferece para usar eventos. Quando algo importante acontece em um contexto, ele "publica" o evento. Outros contextos podem se inscrever neste evento e responder a ele. Isso cria uma conexão fraca entre os componentes, o que torna o sistema mais escalável e resistente a alterações. O DDD ajuda a controlar a entropia, criando limites claros, regras estritas e componentes isolados. Isso transforma um sistema complexo e confuso em um conjunto de partes independentes e controladas, cada uma das quais tem sua própria "lei" e comportamento previsível. Manter documentação detalhada e relevante sobre alterações de código, soluções de design, diagramas arquitetônicos e manuais do usuário é de suma importância. Essa "documentação ao vivo" ajuda os desenvolvedores a entender os meandros do sistema, rastrear alterações e comemoradamente fazer modificações futuras ou corrigir erros. Reduz significativamente o tempo gasto na “re -abertura” ou no design reverso do sistema, que são fontes comuns de erros. A entropia do programa ocorre devido à "falta de conhecimento" e "discrepâncias entre suposições gerais e o comportamento real do sistema existente". A documentação atua não apenas como um guia, mas como O mecanismo crítico para preservar o conhecimento, que luta diretamente com a "entropia do conhecimento". Ao tornar o conhecimento implícito explícito e acessível, reduz os mal -entendidos e a probabilidade de cometer erros devido a suposições incorretas sobre o comportamento de algoritmos ou interações do sistema, protegendo assim a correção funcional. Testes automatizados: testes modulares, de integração, sistema e regressão O teste automatizado é a principal proteção contra o acúmulo de defeitos ocultos. Ele "muda" ativamente a descoberta de erros para a esquerda no ciclo de desenvolvimento, o que significa que os problemas são encontrados quando sua correção é a mais barata e mais simples, impedindo sua contribuição para o efeito do coma de neve da entropia. Isso afeta diretamente a correção dos algoritmos, constantemente verificando o comportamento esperado em vários níveis de detalhe. O desenvolvimento através do teste (TDD) é um processo de desenvolvimento de software, que inclui a gravação de testes para o código antes de escrever o código em si. Esse ciclo iterativo "refactorar vermelho-verde" promove um feedback rápido, permitindo a detecção precoce de erros e reduzindo significativamente o risco de problemas complexos em estágios posteriores de desenvolvimento. Foi demonstrado que o TDD leva a um número menor de erros e à qualidade ideal do código, coordenando bem a filosofia da seca (não se repete). Estudos empíricos da IBM e da Microsoft mostram que o TDD pode reduzir a densidade de erro a ser lançada em impressionantes 40-90%. Exemplos de teste também servem como documentação ao vivo. O TDD atua como controle proativo da qualidade, construído diretamente no processo de desenvolvimento. Forçando os desenvolvedores a determinar o comportamento esperado antes da implementação, minimiza a introdução de erros lógicos e garante que o código seja criado propositadamente para cumprir os requisitos, melhorando diretamente a correção e a previsibilidade dos algoritmos desde o início. Integração e entrega contínuas (IC/CD): Feedback inicial e liberações estáveis Os transportadores de CI/CD funcionam como um mecanismo contínuo para reduzir a entropia. Ao automatizar a integração e o teste, eles impedem o acúmulo de problemas de integração, fornecem uma condição constantemente em desdobramento e fornecem visibilidade imediata de regressão. Essa abordagem sistemática e automatizada neutraliza diretamente o distúrbio feito por alterações contínuas, mantendo a estabilidade dos algoritmos e impedindo a propagação de erros em todo o sistema. A refatoração é o processo de reestruturação do código existente para melhorar sua estrutura interna sem alterar seu comportamento externo. Esse é um meio direto de combater o software apodrecendo e reduzindo a complexidade. Embora a refatoração seja geralmente considerada uma maneira de reduzir o número de erros, é importante admitir que algumas refraturas podem contribuir com inauguração novos erros, o que requer testes rígidos. No entanto, os estudos geralmente confirmam que o código refratado está menos sujeito a erros do que o não aceito. Increting A refatoração, na qual o gerenciamento da dívida é integrada ao atual processo de desenvolvimento e não é adiada, é crucial para impedir o acúmulo exponencial da dívida técnica. A refatoração é uma ação deliberada para reduzir a entropia, reestruturação de código proativo para torná -la mais resistente a alterações, reduzindo assim a probabilidade de erros futuros e melhorar a clareza dos algoritmos. Transforma incêndios reativos com extinção no gerenciamento proativo da saúde estrutural. A manutenção de um Bablog atual da dívida técnica é uma prática crítica para o gerenciamento sistemático e a eliminação da dívida técnica. Este backlog serve como um registro abrangente de elementos identificados de serviço técnico e áreas que exigem melhorias, garantindo que esses problemas não sejam negligenciados. Ele permite que os gerentes de projeto priorizem os elementos da dívida com base em sua seriedade de influência e riscos potenciais. A integração do Bablog durante o projeto garante que a refatoração, a correção de erros e a limpeza de código sejam partes regulares do gerenciamento diário do projeto, reduzindo os custos de pagamento de longo prazo. O baclog da dívida técnica transforma um problema abstrato e crescente em um conjunto de tarefas controlado e eficaz. Essa abordagem sistemática permite que as organizações adotem compromissos razoáveis entre o desenvolvimento de novas funções e investimentos em qualidade, impedindo a acumulação de dívida discreta, o que pode levar a erros críticos ou degradação da produtividade do algoritmo. Ele fornece visibilidade e controle sobre o poder de entropia da chave. Análise estática Essa técnica inclui uma análise do código -fonte sem sua implementação para identificar problemas como erros, cheiros de código, vulnerabilidade de segurança e padrões de codificação prejudicados. Ele serve como a “primeira linha de proteção”, identificando problemas nos estágios iniciais do ciclo de desenvolvimento, melhorando a qualidade geral do código e reduzindo a dívida técnica, identificando modelos problemáticos antes que eles apareçam como erros durante a execução. A análise estática atua como uma "polícia de qualidade de código automatizada". Identificando problemas em potencial (incluindo aqueles que afetam a lógica algorítmica) antes de executar, evita sua manifestação na forma de erros ou desvantagens arquitetônicas. Este é um método escalável de garantir padrões de codificação e identificar erros comuns que contribuem para a entropia do software. Análise dinâmica Este método avalia o comportamento do software durante a execução, fornecendo informações valiosas sobre problemas que se manifestam apenas durante a execução. Excelentemente descobre erros durante a execução, como vazamentos de memória, a condição da raça e a exclusão do ponteiro zero, bem como locais estreitos no desempenho e vulnerabilidade da segurança. A análise dinâmica é fundamental para identificar desvantagens comportamentais durante a execução, que não pode ser detectada por análise estática. A combinação de análise estática e dinâmica garante uma idéia abrangente da estrutura e comportamento do código, permitindo que as equipes identifiquem defeitos antes de se transformarem em problemas sérios. Monitorando a produção e o escritório de incidentes APM (Monitoramento de desempenho do aplicativo): As ferramentas da APM criticam soluções proativas para problemas e manutenção dos níveis de serviço. Eles fornecem uma visibilidade profunda no ambiente de produção, permitindo que as equipes identifiquem e eliminem rapidamente problemas que podem afetar os algoritmos corretos ou causar erros, minimizando assim o tempo de inatividade e melhorando a experiência do usuário. Observabilidade (logs, métricas, rastreio): A observabilidade refere -se à capacidade de analisar e medir os estados internos dos sistemas com base em seus dados de saída e interações entre ativos. Três pilares principais de observabilidade são métricas (dados quantitativos sobre produtividade e uso de recursos), logs (registros cronológicos detalhados de eventos) e rastreamento (rastreando o fluxo de solicitações através de componentes do sistema). Juntos, eles ajudam a identificar e resolver problemas, fornecendo uma compreensão abrangente do comportamento do sistema. A observabilidade vai além do monitoramento tradicional, ajudando a entender "desconhecido desconhecido" e melhorando o tempo da aplicação livre de aplicativos. A observabilidade permite que as equipes investigem flexivelmente o que está acontecendo e determine rapidamente a causa raiz dos problemas que podem não ter previsto. Isso fornece uma compreensão mais profunda, flexível e proativa do comportamento do sistema, permitindo que as equipes identifiquem rapidamente e eliminem problemas imprevistos e mantenham a alta acessibilidade dos aplicativos. Análise da causa raiz (RCA)
A análise das causas radiculares (RCA) é um processo estruturado com base em dados que revelam as causas fundamentais de problemas em sistemas ou processos, permitindo que as organizações implementem soluções eficazes e de longo prazo, e não apenas elimine os sintomas. Inclui a definição do problema, coleta e análise dos dados relevantes (por exemplo, métricas, logs, escalas temporárias), determinação de fatores causais e relacionados usando ferramentas como "5 por que" e diagramas de Ishikawa, bem como o desenvolvimento e implementação de ações corretivas. A RCA é crucial para impedir a re -ocorrência de problemas e treinamento em incidentes. A RCA é crucial para a prevenção a longo prazo de problemas e treinamento em incidentes. Identificando e eliminando sistematicamente as principais causas, e não apenas os sintomas, as organizações podem impedir a re -ocorrência de erros e falhas de algoritmos, reduzindo assim o sistema geral do sistema e aumentando sua confiabilidade. Gerenciamento de erros no Agile: No ambiente ágil, o gerenciamento de erros é extremamente importante e é recomendável alocar o tempo em sprints para corrigi -los. Os erros devem ser registrados em um único produto do produto e associados ao histórico correspondente para facilitar a análise de causas radiculares e melhorar o código nas sprints subsequentes. As equipes devem se esforçar para corrigir os erros o mais rápido possível, de preferência no sprint atual, a fim de impedir seu acúmulo. A coleta de estatísticas de erros (o número de resolvidos, o número de horas registradas e as horas em correção) ajuda a ter uma idéia da qualidade do código e melhorar os processos. Isso enfatiza a importância de correções imediatas, análise de causas radiculares e melhora contínua. As metodologias flexíveis fornecem uma estrutura para o controle proativo dos erros, impedindo sua contribuição para a entropia do sistema e mantendo a correção dos algoritmos por verificação e adaptação constantes. Práticas
As práticas do DevOps ajudam a reduzir os defeitos do software e melhorar a qualidade através de várias abordagens importantes. Eles incluem o desenvolvimento de uma cultura de cooperação e comunicação inconfundível, a adoção de integração e entrega contínuas (IC/CD), a configuração de testes automatizados, focando a atenção na observabilidade e métricas, evitando trabalho artesanal, incluindo segurança nos estágios iniciais do ciclo de desenvolvimento e treinamento em incidentes. Essas práticas reduzem o número de erros, melhoram a qualidade e contribuem para melhorias constantes. O DevOps contribui para a melhoria contínua e a redução da entropia através da automação, feedback rápido e uma cultura de responsabilidade geral. Integrando os processos de desenvolvimento e operação, o DevOps cria um ambiente no qual os problemas são detectados e eliminados rapidamente, impedindo sua acumulação e degradação de sistemas, que suporta diretamente a integridade dos algoritmos. A entropia do programa é uma força inevitável que se esforça constantemente para a degradação de sistemas de software, especialmente no contexto da correção de algoritmos e erros. Isso não é apenas o envelhecimento físico, mas uma interação dinâmica entre o código, seu ambiente e fatores humanos que constantemente fazem uma bagunça. As principais forças motrizes desse decaimento incluem crescente complexidade, acúmulo de dívida técnica, documentação inadequada, alterações em ambientes externos constantemente e métodos de desenvolvimento inconsistentes. Esses fatores levam diretamente a resultados incorretos do trabalho de algoritmos, a perda de previsibilidade e um aumento no número de erros que podem se espalhar em cascata pelos sistemas interconectados. A luta contra a entropia de software requer uma abordagem multifacetada, contínua e proativa. Não basta apenas corrigir erros à medida que ocorrem; É necessário eliminar sistematicamente os principais motivos que os geram. A adoção dos princípios do design modular, código limpo (beijo, seco, sólido) e documentação complexa é fundamental para a criação de sistemas estáveis, que são essencialmente menos suscetíveis à entropia. Testes automatizados rigorosos, desenvolvimento por meio de testes (TDD) e integração/entrega contínua (IC/CD) atuam como mecanismos críticos da detecção e prevenção precoce de defeitos, constantemente verificando e estabilizando a base de código. Além disso, o gerenciamento sistemático da dívida técnica por meio de refatoração incidental e bafflogistas da dívida técnica, bem como o uso de ferramentas estáticas e dinâmicas de análise de código, permite que as organizações identifiquem e eliminem ativamente as áreas problemáticas antes de levarem a falhas críticas. Finalmente, o monitoramento confiável da produção com a ajuda de ferramentas APM e plataformas de observabilidade, em combinação com uma análise disciplinada das causas radiculares e práticas flexíveis da equipe, garante uma rápida resposta a problemas emergentes e cria um ciclo de melhoria contínua. Por fim, garantindo a integridade dos algoritmos e minimizando erros nas condições de entropia de software - esse não é um esforço único, mas uma obrigação constante de manter a ordem em um ambiente dinâmico e em constante mudança. Aplicando essas estratégias, as organizações podem aumentar significativamente a confiabilidade, previsibilidade e durabilidade de seus sistemas de software, garantindo que os algoritmos funcionarão conforme o planejado, mesmo à medida que se evoluem. entropia no mundo da IA e LLM: código imprevisível
Exemplos de entropia em LLM
Dívida técnica: juros acumulados em defeitos
O dever técnico é um compromisso consciente ou inconsciente, no qual é dada prioridade à entrega rápida em detrimento do apoio e qualidade a longo prazo. Correções rápidas e soluções de desvio sem documentos, geralmente implementadas em pouco tempo, acumulam, formando um “campo minado”. Isso torna a base de código extremamente sensível, mesmo para pequenas alterações, uma vez que se torna difícil distinguir soluções de desvio intencional da lógica errônea real, o que leva a regressão inesperada e um aumento no número de erros. testes inadequados e seu efeito cumulativo
Falta de documentação e informação Silos
Métodos de desenvolvimento inconsistentes e perda de propriedade
Falações em cascata em sistemas interconectados
Exemplos práticos
Exemplo 1: Entropia em Unicode e Restrição de Byte
Cenário com ASCII (baixa entropia)
Exemplo de título com ASCII (baixa entropia)
Usuário do ator
Participante “Textfield”
TextField -> TextField: verifica o comprimento (32 bytes)
Nota à direita
Tudo está bem.
Nota final
TextField -> Usuário: Aceps entrada
@enduml Cenário com UTF-8 (alta entropia):
Exemplo de título com UTF-8 (alta entropia)
Usuário do ator
Participante “Textfield”
TextField -> TextField: Corta a linha até 32 bytes
Nota à direita
De repente! Símbolo
Cortado por bytes.
Nota final
TextField -> Usuário: exibe “oi”
Nota esquerda
Símbolo incorreto.
Nota final
@enduml Exemplo 2: Entropia no CSS e incompatibilidade dos navegadores
navegador 10 (lógica antiga)
Navegador de título 10
Usuário do ator
Participante “Navegador 10” como navegador10
Browser10 -> navegador10: verifica o CSS
Nota à direita
-User-Elect: Nenhum;
Ignorado para entrada
Nota final
Navegador10 -> usuário: permite a entrada
@enduml navegador 11 (nova lógica)
Navegador de título 11
Usuário do ator
Participante “Navegador 11” como navegador11
Navegador11 -> navegador11: verifica o CSS
Nota à direita
-User-Elect: Nenhum;
Aplicado a todos os elementos, incluindo entrada
Nota final
Navegador11 -> Usuário: se recusa a entrar
Nota esquerda
O usuário não pode fazer nada
tipo.
Nota final
@enduml Exemplo 3: Entropia devido a um TK ambíguo
Bob se concentrou na frase “Lista … deve ser arrancada”. Ele implementou uma classe que armazena o mesmo estado (Self.Sensence) e a aumenta a cada chamada. def __init__(self):
self.sequence = [0, 1]
def generate(self, n):
if n <= len(self.sequence):
return self.sequence
while len(self.sequence) < n:
next_num = self.sequence[-1] + self.sequence[-2]
self.sequence.append(next_num)
return self.sequence
Modelo mental de Alice (abordagem funcional)
sequence = [0, 1]
if n <= 2:
return sequence[:n]
while len(sequence) < n:
next_num = sequence[-1] + sequence[-2]
sequence.append(next_num)
return sequence
Entropia e multi -definição: a condição da raça e do avô
Solução de título: Procedimento de bloqueio unificado
Participante "Stream 1" como Thread1
Participante "Stream 2" como Thread2
Participante "como" como conta
Participante "Conta B" como conta
Nota sobre o thread1
A regra segue:
ID do bloco
Nota final
Thread2 -> Accounta: esperando a conta A será libertado
Nota sobre Thread2
A regra segue:
Esperando por bloquear um
Nota final
Thread1 -> AccountB: Blocks Conta B
Thread1 -> Accounta: Frees Conta A
Thread1 -> AccountB: Liberações Pontuação B
Nota sobre o thread1
A transação está concluída
Nota final
Thread2 -> conta: bloqueia a conta a
Thread2 -> AccountB: Blocks Conta B
Nota sobre Thread2
A transação termina
Nota final
@enduml Problema: Condição alterada e entropia
Aqui, criamos uma classe de cursor, que armazena seu estado interno, neste caso, cor. O método de desenho desenhará um retângulo usando esta condição. constructor(initialColor) {
// Внутреннее состояние объекта, которое может меняться
this.color = initialColor;
}
// Метод для изменения состояния
setColor(newColor) {
this.color = newColor;
}
// Метод с побочным эффектом: он использует внутреннее состояние
draw(ctx, rect) {
ctx.fillStyle = this.color;
ctx.fillRect(rect.x, rect.y, rect.width, rect.height);
}
}
// Использование
const myCursor = new Cursor('red');
const rectA = { x: 10, y: 10, width: 50, height: 50 };
const rectB = { x: 70, y: 70, width: 50, height: 50 };
myCursor.draw(ctx, rectA); // Используется начальный цвет: red
myCursor.setColor('blue'); // Изменяем состояние курсора
myCursor.draw(ctx, rectB); // Используется новое состояние: blue
title ООП-подход
actor "Программист" as Programmer
participant "Класс Cursor" as Cursor
participant "Canvas" as Canvas
Programmer -> Cursor: Создает new Cursor('red')
note left
- Инициализирует состояние
с цветом 'red'.
end note
Programmer -> Cursor: draw(ctx, rectA)
note right
- Метод draw использует
внутреннее состояние
объекта (цвет).
end note
Cursor -> Canvas: Рисует 'red' прямоугольник
Programmer -> Cursor: setColor('blue')
note left
- Изменяет внутреннее состояние!
- Это побочный эффект.
end note
Programmer -> Cursor: draw(ctx, rectB)
note right
- Тот же метод draw,
но с другим результатом
из-за измененного состояния.
end note
Cursor -> Canvas: Рисует 'blue' прямоугольник
@enduml
// Функция принимает все необходимые данные как аргументы
ctx.fillStyle = color;
ctx.fillRect(rect.x, rect.y, rect.width, rect.height);
}
// Использование
const rectA = { x: 10, y: 10, width: 50, height: 50 };
const rectB = { x: 70, y: 70, width: 50, height: 50 };
drawRectangle(ctx, rectA, 'red'); // Рисуем первый прямоугольник
drawRectangle(ctx, rectB, 'blue'); // Рисуем второй прямоугольник
Abordagem funcional do título
Ator "Programador" como programador
Participante "função \ n drecrectangle" como drawfunc
Participante "tela" como tela
Nota à direita
- Ligue com argumentos:
- ctx
- Recta (coordenadas)
- 'vermelho' (cor)
- A função não tem condição.
Nota final
Programador -> drawfunc: dreatrewerctangle (ctx, retb, 'azul')
Nota à direita
- Ligue com novos argumentos:
- ctx
- Retb (coordenadas)
- 'azul' (cor)
Nota final
DrawFunc -> Canvas: inundações com a cor 'azul'
@enduml Design e arquitetura modulares: isolamento, testabilidade e re -use
Práticas de código puro: beijo, seca e princípios sólidos para confiabilidade
Essa filosofia de design significa simplicidade e clareza, evitando ativamente a complexidade desnecessária. Um código simples é inerentemente mais fácil de ler, entender e modificar, o que leva diretamente a uma diminuição em uma tendência a erros e melhorar o suporte. A complexidade é claramente definida como um ambiente de nutrientes para erros.
O princípio seco visa reduzir a repetição de informações e duplicação de código, substituindo -a por abstrações ou usando a normalização dos dados. Sua posição principal é que "cada fragmento de conhecimento deve ter uma representação única, inequívoca e autoritária no sistema". Essa abordagem elimina a redundância, que, por sua vez, reduz as inconsistências e evita a propagação de erros ou sua correção inconsistente em várias cópias da lógica duplicada. Ele também simplifica o suporte e a depuração da base de código. sólido
Design de entropia e domínio (DDD)
Padrões de gangue de quatro design como um único aparelho conceitual
Padrões -chave DDD para controlar a entropia
Documentação complexa e animada
Teste rigoroso e garantia de qualidade contínua
O teste automatizado é uma ferramenta indispensável para amolecer a entropia do software e prevenir erros. Ele permite a detecção precoce de problemas, garantindo que as alterações de código não violem a funcionalidade existente e fornecem feedback rápido e consistente. Os tipos de chave incluem testes modulares (para componentes isolados), testes de integração (para interações entre módulos), testes do sistema (para um sistema integrado completo) e testes de regressão (para garantir que novas alterações não levem à aparência repetida de erros antigos). O teste automatizado reduz significativamente o fator humano e aumenta a confiabilidade. Desenvolvimento através do teste (TDD): Mudar para a esquerda na detecção de erros
As práticas de CI/CD são fundamentais para o desenvolvimento moderno de software, ajudando a identificar erros nos estágios iniciais, acelerar o desenvolvimento e garantir o processo de implantação ininterrupto. A integração frequente de pequenos pacotes de código no repositório central permite a detecção precoce de erros e a melhoria contínua da qualidade do código por meio de conjuntos e testes automatizados. Esse processo fornece um feedback rápido, permitindo que os desenvolvedores eliminem de maneira rápida e eficaz os problemas e também aumente significativamente a estabilidade do código, impedindo o acúmulo de código não verificado ou instável. Gerenciamento sistemático da dívida técnica
REFATORIA INCRECIONAL: Melhoria estratégica de código
Backlogs da dívida técnica: priorização e distribuição de recursos
Análise de código estático e dinâmico: identificação proativa de problemas
As ferramentas APM foram projetadas para monitorar e otimizar o desempenho dos aplicativos. Eles ajudam a identificar e diagnosticar problemas complexos de desempenho, além de detectar as causas raiz dos erros, reduzindo assim a perda de renda do tempo de inatividade e da degradação. Os sistemas APM monitoram várias métricas, como tempo de resposta, uso de recursos e frequência de erros, fornecendo informações em tempo real, o que permite resolver proativamente os problemas antes que eles afetem os usuários. Metodologias flexíveis e práticas de equipe
DevOps
Conclusão
O diagrama de blocos é uma ferramenta visual que ajuda a transformar um algoritmo complexo em uma sequência de ações compreensíveis e estruturadas. Da programação ao gerenciamento de processos de negócios, eles servem como uma linguagem universal para visualização, análise e otimização dos sistemas mais complexos.
Imagine um mapa onde, em vez de estradas, é lógica e, em vez de cidades – ações. Esta é um diagrama de blocos-uma ferramenta indispensável para navegação nos processos mais confusos.
Exemplo 1: Esquema de lançamento de jogo simplificado
Para entender o princípio do trabalho, vamos apresentar um simples esquema de lançamento de jogo.

Esse esquema mostra o script perfeito quando tudo acontece sem falhas. Mas na vida real, tudo é muito mais complicado.
Exemplo 2: Esquema expandido para iniciar o jogo com carregamento de dados
Os jogos modernos geralmente exigem conexão à Internet para baixar dados, salvamento ou configurações do usuário. Vamos adicionar essas etapas ao nosso esquema.

Esse esquema já é mais realista, mas o que acontecerá se algo der errado?
No início do projeto, os desenvolvedores não puderam levar em consideração todos os cenários possíveis. Por exemplo, eles se concentraram na lógica principal do jogo e não pensaram no que aconteceria se o jogador tivesse uma conexão com a Internet.
Em tal situação, o diagrama de blocos de seu código ficaria assim:

Nesse caso, em vez de emitir um erro ou fechar corretamente, o jogo congelou na fase de espera por dados que ela não recebeu devido à falta de uma conexão. Isso levou à “tela preta” e congelando o aplicativo.
Após inúmeras reclamações dos usuários sobre pairando, a equipe do desenvolvedor percebeu que precisávamos corrigir o erro. Eles fizeram alterações no código adicionando uma unidade de processamento de erros que permite que o aplicativo responda corretamente à falta de conexão.
É assim que o diagrama de blocos corrigido se parece, onde ambos os cenários são levados em consideração:

Graças a essa abordagem, o jogo agora informa corretamente o usuário sobre o problema e, em alguns casos, ele pode até ir para o modo offline, permitindo que você continue o jogo. Este é um bom exemplo de por que os diagramas de blocos são tão importantes : eles fazem o desenvolvedor pensar não apenas sobre a maneira ideal de execução, mas também sobre todas as falhas possíveis, tornando o produto final muito mais estável e confiável.
Pendurado e erros são apenas um exemplos de comportamento imprevisível do programa. Na programação, existe um conceito de comportamento incerto (comportamento indefinido) – Esta é uma situação em que o padrão do idioma não descreve como o programa deve se comportar em um determinado caso.
Isso pode levar a qualquer coisa: do “lixo” aleatório na retirada ao fracasso do programa ou mesmo à séria vulnerabilidade de segurança. O comportamento indefinido geralmente ocorre ao trabalhar com memória, por exemplo, com linhas na linguagem de C.
Um exemplo do idioma c:
Imagine que o desenvolvedor copiou a linha para o buffer, mas esqueceu de adicionar ao final o símbolo zero (`\ 0`) , que marca o final da linha.
É assim que o código se parece:
#include
int main() {
char buffer[5];
char* my_string = "hello";
memcpy(buffer, my_string, 5);
printf("%s\n", buffer);
return 0;
}
Resultado esperado: “Olá”
O resultado real é imprevisível.
Por que isso está acontecendo? A função `printf` com o especificador`%s` espera que a linha termine com um símbolo zero. Se ele não estiver, ela continuará lendo a memória fora do buffer destacado.
Aqui está o diagrama de blocos deste processo com dois resultados possíveis:

Este é um exemplo claro de por que os diagramas de blocos são tão importantes: eles fazem o desenvolvedor pensar não apenas sobre a maneira ideal de execução, mas também sobre todas as falhas possíveis, incluindo problemas de baixo nível, tornando o produto final muito mais estável e confiável.
Atualmente, todos os provedores populares de serviços LLM usam ajuste fino usando arquivos JSONL, que descrevem as entradas e saídas do modelo, com pequenas variações, por exemplo, para Gemini, OpenAI, o formato é um pouco diferente.
Após o download de um arquivo JSONL especialmente formado, o processo de especialização do modelo LLM no conjunto de dados especificado começa, para todos os provedores de LLM bem conhecidos atuais, este serviço é pago.
Para ajustar uma máquina local usando Ollama, recomendo confiar em um vídeo detalhado da tecnologia de canal do YouTube com a maneira mais fácil de ajustar um LLM e nós com Alloma:
https://www.youtube.com/watch?v=pTaSDVz0gok
Um exemplo de um laptop Jupyter com a preparação do conjunto de dados JSONL a partir de exportações de todas as mensagens do Telegram e o lançamento do processo de ajuste fino local está disponível aqui:
https://github.com/demensdeum/llm-train-example
O React Native se estabeleceu como uma ferramenta poderosa para o desenvolvimento cruzado de aplicativos móveis e da Web. Ele permite criar aplicativos nativos para Android e iOS, bem como aplicativos da Web usando uma única base de código no JavaScript/TypeScript.
A React National Architecture é baseada em ligações nativas do JavaScript/TypeScript. Isso significa que a lógica de negócios básica e um aplicativo no aplicativo são gravados em JavaScript ou TypeScript. Quando o acesso a funcionalidade nativa específica (por exemplo, o dispositivo ou a câmera GPS) é necessária, essas ligações nativas são usadas, o que permite chamar o código escrito no SWIFT/Objective-C para iOS ou Java/Kotlin para Android.
É importante observar que as plataformas resultantes podem variar em funcionalidade. Por exemplo, uma determinada funcionalidade pode estar disponível apenas para Android e iOS, mas não para a Web ou vice -versa, dependendo dos recursos nativos da plataforma.
A configuração das ligações nativas é realizada através da tecla Plugins. Para um desenvolvimento estável e seguro, é fundamental usar as versões mais recentes dos componentes nativos do React e sempre recorrer à documentação atual. Isso ajuda a evitar problemas de compatibilidade e a usar todas as vantagens das atualizações mais recentes. O React Native pode gerar projetos resultantes para plataformas específicas (por exemplo, pastas Android e iOS). Isso permite que os desenvolvedores, se necessário, corrigem os arquivos de projetos resultantes manualmente para otimização fina ou configurações específicas, o que é especialmente útil para aplicativos complexos que exigem uma abordagem individual ao desempenho. Para aplicações típicas e simples, geralmente é suficiente usar a Expo Bandle com ligações nativas construídas. No entanto, se o aplicativo possui funcionalidade complexa ou requer uma personalização profunda, é recomendável usar conjuntos personalizados nativos do React. Uma das principais vantagens do React Native é o suporte a quente para recarregar para o código TypeScript/JavaScript durante o desenvolvimento. Isso acelera significativamente o processo de desenvolvimento, pois as alterações do código são exibidas instantaneamente no aplicativo, permitindo que o desenvolvedor veja o resultado em tempo real. O React Native também suporta “Atualização silenciosa) ignorando o processo do Google Play e da Apple App Store, mas isso é aplicável apenas ao código TypeScript/JavaScript. Isso permite que você libere rapidamente erros ou pequenas atualizações de funcionalidade sem a necessidade de passar por um ciclo completo de publicação através de lojas de aplicativos. É importante entender que o código TS/JS é enfaixado em uma versão específica de dependências nativas usando impressão digital, o que garante a coordenação entre JavaScript/TypeScript Part e parte nativa do aplicativo. Embora seja possível a Codhegeneração com LLM (modelos de idiomas grandes), sua adequação nem sempre é alta devido a conjuntos de dados potencialmente desatualizados nos quais os modelos foram treinados. Isso significa que o código gerado pode não corresponder às versões mais recentes do React Native ou as práticas recomendadas. O React Native continua a desenvolver, oferecendo aos desenvolvedores uma maneira flexível e eficaz de criar aplicativos cruzados. Ele combina a velocidade do desenvolvimento com a possibilidade de acesso a funções nativas, tornando -a uma escolha atraente para muitos projetos. Recursos de desenvolvimento e otimização
Comerabilidade do desenvolvimento e atualizações
Uso de LLM no desenvolvimento
Tutoriais para RaidenVideoripper sobre como extrair som de um vídeo usando RaidenVideorpper, faça GIF a partir de fragmentos de vídeo:
https://www.youtube.com/watch?v=T_6Bm-1RWN8
https://www.youtube.com/watch?v=7x8LFlVjzKs
No mundo do desenvolvimento de interfaces, existe um conceito comum – “Pixel perfeito no alojamento” . Isso implica a reprodução mais precisa da máquina de design ao menor pixel. Durante muito tempo, era um padrão -ouro, especialmente na era de um design clássico da web. No entanto, com a chegada da milha declarativa e o rápido crescimento da variedade de dispositivos, o princípio de “Pixel Perfect” está se tornando mais efêmero. Vamos tentar descobrir o porquê.
Tradicionalmente, muitas interfaces, especialmente o desktop, eram criadas usando abordagens imperativas ou wysiwyg (o que você vê é o que recebe) dos editores. Nessas ferramentas, o designer ou desenvolvedor manipula diretamente com elementos, colocando -os em tela com precisão no pixel. É semelhante ao trabalho com um editor gráfico – você vê como o seu elemento se parece e definitivamente pode posicioná -lo. Nesse caso, a conquista de “Pixel Perfect” era um objetivo muito real.
No entanto, o desenvolvimento moderno é cada vez mais baseado em milhas declarativas . Isso significa que você não diz ao computador para “colocar este botão aqui”, mas descreva o que deseja obter. Por exemplo, em vez de indicar as coordenadas específicas do elemento, você descreve suas propriedades: “Este botão deve ser vermelho, ter recua de 16px de todos os lados e estar no centro do contêiner”. Freimvorki como React, Vue, Swiftui ou Jetpack Compose apenas use esse princípio.
Imagine que você cria um aplicativo que deve parecer igualmente bom no iPhone 15 Pro Max, Samsung Galaxy Fold, iPad Pro e uma resolução 4K. Cada um desses dispositivos possui resolução de tela diferente, densidade de pixels, partes e tamanhos físicos.
Quando você usa a abordagem declarativa, o próprio sistema decide como exibir a interface descrita em um dispositivo específico, levando em consideração todos os seus parâmetros. Você define as regras e dependências, não coordenadas duras.
* Adaptabilidade e capacidade de resposta: O principal objetivo das milhas declarativas é criar interfaces adaptativas e responsivas . Isso significa que sua interface deve se adaptar automaticamente ao tamanho e orientação da tela sem quebrar e manter a legibilidade. Se procurássemos “pixel perfeito” em cada dispositivo, teríamos que criar inúmeras opções para a mesma interface, o que nivelará completamente as vantagens da abordagem declarativa.
* densidade de pixel (DPI/PPI): Os dispositivos têm densidade de pixels diferentes. O mesmo elemento com o tamanho de 100 pixels “virtuais” em um dispositivo com alta densidade parecerá muito menor do que em um dispositivo de baixa densidade, se você não levar em consideração a escala. As estruturas declarativas são abstraídas por pixels físicos, trabalhando com unidades lógicas.
* Conteúdo dinâmico: em aplicativos modernos geralmente é dinâmico – seu volume e estrutura podem variar. Se embutirmos com força para os pixels, qualquer alteração no texto ou imagem levaria ao “colapso” do layout.
* Várias plataformas: Além da variedade de dispositivos, existem diferentes sistemas operacionais (iOS, Android, Web, Desktop). Cada plataforma possui seu próprio design, controles padrão e fontes. Uma tentativa de fazer uma interface perfeita de pixel absolutamente idêntica em todas as plataformas levaria a um tipo não natural e uma experiência de usuário ruim.
É importante entender que a abordagem das interfaces não é uma escolha binária entre “imperativo” e “declarativo”. Historicamente, para cada plataforma, havia suas próprias ferramentas e abordagens para a criação de interfaces.
* Arquivos de interface nativos: Para iOS, eram xib/storyboards, para arquivos de marcação Android-xml. Esses arquivos são um layout wysiwyg perfeito para pixels, que é exibido no rádio como no editor. Essa abordagem não desapareceu em nenhum lugar, continua a se desenvolver, integrando -se com quadros declarativos modernos. Por exemplo, SwiftUi na Apple e Jetpack compor no Android partiu no caminho de um código puramente declarativo, mas, ao mesmo tempo, manteve a oportunidade de usar um layout clássico.
* Soluções híbridas: Em projetos reais, é usada uma combinação de abordagens. Por exemplo, a estrutura básica do aplicativo pode ser implementada declarativamente e, para específicos, exigindo posicionamento preciso de elementos, métodos imperativos de nível inferior, podem ser usados ou componentes nativos desenvolvidos levando em consideração as especificidades da plataforma.
O mundo das interfaces digitais passou por tremendas mudanças nas últimas décadas. De computadores estacionários com licenças fixas, chegamos à era do crescimento exponencial da variedade de dispositivos de usuário . Hoje, nossos aplicativos devem funcionar igualmente bem em: * smartphones de todos os fatores de forma e tamanhos de tela. Cada um desses dispositivos possui seus próprios recursos exclusivos: dimensões físicas, proporção de partes, densidade de pixels, métodos de entrada (tela de toque, mouse, controladores, gestos, comandos vocais) e, principalmente, as sutilezas do ambiente do usuário . Por exemplo, um shlesh de VR requer uma imersão profunda e um trabalho intuitivo e rápido do smartphone em movimento, enquanto a interface da geladeira deve ser tão simples e grande para navegação rápida. Na era do domínio dos desktops e dos primeiros dispositivos móveis, o negócio usual era a criação e o suporte de arquivos de interface individuais ou mesmo um código de interface completamente separado para cada plataforma . * O desenvolvimento em iOS geralmente exigia o uso de storyboards ou arquivos XIB no Xcode, escrevendo código no Objective-C ou Swift. Essa abordagem garantiu o controle máximo sobre cada plataforma, permitindo que você levasse em consideração todos os seus recursos específicos e elementos nativos. No entanto, ele teve uma enorme desvantagem: duplicação de esforços e enormes custos de apoio . A menor mudança no design ou funcionalidade exigia a introdução de um direito a vários, de fato, bases de código independentes. Isso se transformou em um pesadelo real para as equipes de desenvolvedores, diminuindo a desaceleração da produção de novas funções e aumentando a probabilidade de erros. Foi uma resposta a essa rápida complicação que as milhas declarativas apareceram como o paradigma dominante. Framws como React, Vue, Swiftui, Jetpack compõem e outros não são apenas uma nova maneira de escrever código, mas uma mudança fundamental no pensamento. A idéia principal da abordagem declarativa : em vez de dizer o sistema “como” desenhar todos os elementos (imperativos), descrevemos “o que” queremos ver (declarativo). Definimos as propriedades e a condição da interface, e a estrutura decide como exibi -la melhor em um dispositivo específico. Isso se tornou possível graças às seguintes vantagens importantes: 1. Abstração dos detalhes da plataforma: O Fraimvorki declarativo é especialmente projetado para esquecer os detalhes de baixo nível de cada plataforma. O desenvolvedor descreve os componentes e seus relacionamentos em um nível mais alto de abstração, usando um único código transferido. A milha declarativa não é apenas uma tendência de moda, mas a etapa evolutiva necessária causada pelo rápido desenvolvimento de dispositivos de usuário, incluindo a esfera da a Internet das Coisas (IoT) e eletrodomésticos inteligentes. Ele permite que desenvolvedores e designers criem interfaces complexas, adaptativas e uniformes, sem se afogar em inúmeras implementações específicas para cada plataforma. A transição do controle imperativo sobre cada pixel para a descrição declarativa do estado desejado é um reconhecimento de que no mundo das interfaces futuras deve ser flexível, transferido e intuitivo independentemente de qual tela são exibidas. Programadores, designers e usuários precisam aprender a viver neste novo mundo. Os detalhes extras do pixel perfeito, projetados para um dispositivo ou resolução específica, levam a custos de tempo desnecessários para desenvolvimento e suporte. Além disso, esses layouts severos podem simplesmente não funcionar em dispositivos com interfaces não padrão, como TVs de entrada limitadas, mudanças de VR e AR, bem como outros dispositivos do futuro, que ainda nem conhecemos hoje. Flexibilidade e adaptabilidade – essas são as chaves para a criação de interfaces bem -sucedidas no mundo moderno.
* comprimidos com seus modos de orientação exclusivos e uma tela separada.
* Laptops e desktops com várias licenças de monitores.
* TVs e centros de mídia , controlados remotamente. Vale ressaltar que, mesmo para as TVs, cujas observações podem ser simples como Apple TV Remote com um mínimo de botões, ou vice -versa, sobrecarregados com muitas funções, os requisitos modernos para interfaces são tais que o código não exija adaptação específica para esses recursos de entrada. A interface deve funcionar “como se por si só”, sem uma descrição adicional do que “como” interagir com um controle remoto específico.
* relógios inteligentes e dispositivos vestíveis com telas minimalistas.
* Capacetes de realidade virtual (VR) , exigindo uma abordagem completamente nova para uma interface espacial.
* Dispositivos de realidade aumentada (AR) , aplicando informações sobre o mundo real.
* Informações de automóveis e sistemas de entretenimento .
* E até eletrodomésticos : de geladeiras com telas sensoriais e máquinas de lavar com displays interativos para fornos e sistemas inteligentes da casa inteligente. Abordagem clássica: o ônus de apoiar interfaces individuais
* Para Android Os arquivos de marcação XML e o código em Java ou Kotlin foram criados.
* Interfaces da Web ativadas em HTML/CSS/JavaScript.
* Para aplicativos C ++ Em várias plataformas de desktop, foram usadas suas estruturas e ferramentas específicas:
* Em Windows Estes foram MFC (Microsoft Foundation Classes), API Win32 com elementos de desenho manual ou usando arquivos de recursos para janelas de diálogo e elementos de controle.
* Cacau (Objective-C/Swift) ou A API de carbono antigo para controle direto da interface gráfica foram usados no macOS .
* Nos sistemas Linux/UNIX , bibliotecas como GTK+ ou QT foram frequentemente usadas, o que forneceu seu conjunto de widgets e mecanismos para criar interfaces, geralmente por meio de arquivos de marcação do tipo XML (por exemplo, arquivos .ui no designer QT) ou criação de software direto de elementos. Miles declarativos: um único idioma para a diversidade
2. Adaptação e capacidade de resposta automáticas: Freimvorki assume a responsabilidade pela escala automática, alterando o layout e a adaptação dos elementos para diferentes tamanhos de telas, densidade de pixels e métodos de entrada. Isso é conseguido através do uso de sistemas de layout flexíveis, como Flexbox ou grade, e conceitos semelhantes a “pixels lógicos” ou “dp”.
3. Consistência da experiência do usuário: Apesar das diferenças externas, a abordagem declarativa permite manter uma única lógica de comportamento e interação em toda a família de dispositivos. Isso simplifica o processo de teste e fornece uma experiência mais previsível do usuário.
4. A aceleração do desenvolvimento e redução de custos: Com o mesmo código capaz de trabalhar em muitas plataformas, significativamente é reduzido pelo tempo e custo de desenvolvimento e suporte . As equipes podem se concentrar na funcionalidade e no design, e não na reescrita repetida na mesma interface.
5. prontidão para o futuro: A capacidade de abstrair das especificidades dos dispositivos atuais torna o código declarativo mais mais resistente ao surgimento de novos tipos de dispositivos e fatores de forma . O Freimvorki pode ser atualizado para oferecer suporte a novas tecnologias, e seu código já escrito receberá esse suporte é relativamente perfeito. Conclusão
O lançamento do RaidenVideoripper na Microsoft Store – Aplicativos para instalação rápida de vídeo e conversão para formatos MP4, WebM e GIF.
https://apps.microsoft.com/detail/9nvzjs98smgc?hl=en-us&gl=GE&ocid=pdpshare
Nova versão do RaidenVideoripper – 1.0.2.0
Adicionado suporte para um tema sombrio para o Windows 11.
Rapiden Video Ripper é um aplicativo para um corte de vídeo simples em WebM, formatos GIF.

Visite a página de lançamento para acompanhar as últimas edições e atualizações:
https://github.com/demensdeum/RaidenVideoRipper/releases
Hoje, as redes neurais são usadas em todos os lugares. Os programadores os usam para gerar código, explicar outras soluções, automatizar tarefas de rotina e até criar aplicativos inteiros do zero. Parece que isso deve levar a um aumento de eficiência, reduzindo erros e aceleração do desenvolvimento. Mas a realidade é muito mais prosaica: muitos ainda não conseguem. As redes neurais não resolvem problemas importantes – elas apenas iluminam a profundidade da ignorância.
A principal razão é que muitos desenvolvedores confiam completamente no LLM, ignorando a necessidade de uma compreensão profunda das ferramentas com as quais trabalham. Em vez de estudar documentação – uma solicitação de bate -papo. Em vez de analisar os motivos do erro – copiar a decisão. Em vez de soluções arquitetônicas – a geração de componentes de acordo com a descrição. Tudo isso pode funcionar em um nível superficial, mas assim que surgir uma tarefa não padrão, integração com um projeto real ou a necessidade de ajuste fino é necessário, tudo está desmoronando.
As redes neurais geram o código generalizado. Eles não levam em consideração os detalhes da sua plataforma, versão das bibliotecas, restrições ambientais ou soluções arquitetônicas do projeto. O que é gerado geralmente parece plausível, mas não tem nada a ver com o código real e suportado. Mesmo recomendações simples podem não funcionar se pertencem à versão desatualizada da estrutura ou abordagens de uso que há muito são reconhecidas como ineficazes ou inseguras. Os modelos não entendem o contexto – eles dependem de estatísticas. Isso significa que erros e antipattterns, populares em código aberto, serão reproduzidos repetidamente.
O código gerado pela IA geralmente é redundante. Inclui dependências desnecessárias, duplica a lógica, adiciona abstrações desnecessariamente. Acontece que uma estrutura pesada e ineficaz que é difícil de apoiar. Isso é especialmente agudo no desenvolvimento móvel, onde o tamanho da gangue, o tempo de resposta e o consumo de energia são críticos.
A rede neural não conduz o perfil, não leva em consideração as restrições da CPU e da GPU, não se importa com os vazamentos da memória. Ele não analisa a eficácia do código na prática. A otimização ainda é feita à mão, exigindo análise e exame. Sem ele, o aplicativo se torna lento, instável e intensivo em recursos, mesmo que pareça “certo” do ponto de vista da estrutura.
Não se esqueça da segurança. Já existem casos conhecidos em que projetos parcial ou totalmente criados usando LLM foram invadidos com sucesso. Os motivos são típicos: o uso de funções inseguras, falta de verificação dos dados de entrada, erros na lógica da autorização, vazamento por meio de dependências externas. A rede neural pode gerar um código vulnerável simplesmente porque foi encontrado em repositórios abertos. Sem a participação de especialistas em segurança e uma revisão completa, esses erros se tornam facilmente pontos de entrada para ataques.
A lei de Pareto funciona claramente com as redes neurais: 80% do resultado é alcançado devido a 20% do esforço. O modelo pode gerar uma grande quantidade de código, criar a base do projeto, espalhar a estrutura, organizar tipos, conectar módulos. No entanto, tudo isso pode estar desatualizado, incompatível com versões atuais de bibliotecas ou estruturas, e requer revisão manual significativa. A automação aqui funciona como um rascunho que precisa ser verificado, processado e adaptado a realidades específicas do projeto.
No entanto, o futuro parece encorajador. Atualização constante dos conjuntos de dados de treinamento, integração com documentação atual, verificações automatizadas de arquitetura, conformidade com padrões de design e segurança – tudo isso pode alterar radicalmente as regras do jogo. Talvez em alguns anos possamos realmente escrever o código mais rápido, mais seguro e eficiente, confiando no LLM como um verdadeiro co -autor técnico. Mas por enquanto – infelizmente – muito precisa ser verificado, reescrito e modificado manualmente.
As redes neurais são uma ferramenta poderosa. Mas, para que ele trabalhe para você, e não contra você, você precisa de uma base, pensamento crítico e vontade de assumir o controle a qualquer momento.
Resumindo o Desafio Demensdeum 1.
Nosso vencedor é uma opção do SNKBP95 escrito manualmente no Assembler – o tamanho do arquivo executável 50KB junto com a imagem.
Parabéns ao vencedor!
https://github.com/snkbp95/DemensDeum-Coding-Challenge-1/
Apresento à sua atenção que o editor de texto Kate chamado Gingerita. Por que garfo, por que, qual é o objetivo? Quero adicionar a funcionalidade de que preciso no meu trabalho, para não esperar pela correção, adicionando recursos da equipe Kate ou a adoção de minhas correções na filial principal.
No momento, está atualmente uma versão de protótipo para Windows, versão quase baunilha do Kate com alterações mínimas. Para o Gingerita, desenvolvi dois plugues – uma imagem das imagens diretamente do editor e do navegador construído, para depurar meus projetos da web ou para interagir com a IA com assistentes como o ChatGPT.
A versão para Windows pode ser testada pelo link abaixo:
https://github.com/demensdeum/Gingerita/releases/tag/prototype
Bem -vindo à página de suporte!
Se você tiver dúvidas, problemas com produtos Demensdeum ou deseja oferecer melhorias, estamos sempre prontos para ajudar.
Como entrar em contato conosco:
support@demensdeum.com
Tentamos responder aos recursos dentro de 3-5 dias úteis.
O que indicar na carta:
O nome do produto
Versão (se conhecida)
Uma descrição detalhada do problema
Capturas de tela ou vídeos (se possível)
Dispositivo e sistema operacional no qual surgiu o problema
Agradecemos pelo uso de nossos produtos e nos esforçamos para tornar sua experiência o mais conveniente e agradável possível.
Sinceramente,
Equipe Demensdeum
Com o desenvolvimento de grandes modelos de idiomas (LLM), como ChatGPT, mais e mais desenvolvedores os usam para gerar código, projetar arquitetura e acelerar a integração. No entanto, com a aplicação prática, torna -se perceptível: os princípios clássicos da arquitetura – sólidos, secos, limpos – se dão mal com as peculiaridades da gordura do LLM.
Isso não significa que os princípios estejam desatualizados – pelo contrário, eles funcionam perfeitamente com o desenvolvimento manual. Mas com o LLM, a abordagem deve ser adaptada.
Por que o LLM não pode lidar com os princípios arquitetônicos
O incapsolamento requer a compreensão dos limites entre partes do sistema, conhecimento sobre as intenções do desenvolvedor, bem como seguem restrições estritas de acesso. O LLM geralmente simplifica a estrutura, torna o Fields público sem motivo ou duplica a implementação. Isso torna o código mais vulnerável a erros e viola os limites arquitetônicos.
Os padrões de design, como uma fábrica ou estratégia abstrata, requerem uma visão holística do sistema e entender sua dinâmica. Os modelos podem criar uma interface sem um objetivo claro sem garantir sua implementação ou violar a conexão entre as camadas. O resultado é uma arquitetura excessiva ou não funcional.
O LLM não procura minimizar o código de repetição – pelo contrário, é mais fácil para eles duplicarem blocos do que fazer lógica geral. Embora eles possam oferecer refatoração mediante solicitação, os modelos padrão tendem a gerar fragmentos “auto -suficientes”, mesmo que isso leve à redundância.
A limpeza implica uma hierarquia estrita, independência das estruturas, dependência direcionada e conexão mínima entre as camadas. A geração de tal estrutura requer uma compreensão global do sistema – e o trabalho de LLM no nível de probabilidade de palavras, não a integridade arquitetônica. Portanto, o código é misturado, com a violação das direções da dependência e uma divisão simplificada em níveis.
Molhado em vez de seco
A abordagem molhada (escreva tudo duas vezes) é mais prática para trabalhar com o LLM. A duplicação do código não requer contexto do modelo de retenção, o que significa que o resultado é previsível e é mais fácil de corretamente correto. Também reduz a probabilidade de conexões e bugs não óbvios.
Além disso, a duplicação ajuda a compensar a lembrança curta do modelo: se um certo fragmento de lógica for encontrado em vários lugares, é mais provável que o LLM leve em consideração com mais geração. Isso simplifica o acompanhamento e aumenta a resistência ao “esquecimento”.
Evitando encapsulamento complexo e confiar na transmissão direta de dados entre as partes do código, você pode simplificar bastante a geração e a depuração. Isto é especialmente verdade com um rápido desenvolvimento iterativo ou criação de MVP.
Uma estrutura simples e plana do projeto com uma quantidade mínima de dependências e abstrações fornece um resultado mais estável durante a geração. O modelo adapta esse código mais fácil e menos frequentemente viola as conexões esperadas entre os componentes.
A maioria dos modelos de idiomas é treinada em versões desatualizadas de documentação. Portanto, ao gerar instruções para a instalação do SDK, os erros geralmente aparecem: comandos desatualizados, parâmetros irrelevantes ou links para recursos inacessíveis. Mostra de prática: é melhor usar documentação oficial e ajuste manual, deixando o LLM uma função auxiliar – por exemplo, gerando um código de modelo ou adaptação de configurações.
É importante entender que as dificuldades de sólido, seco e limpo dizem respeito à código de código através do LLM. Quando o desenvolvedor escreve o código manualmente, esses princípios continuam demonstrando seu valor: reduzem a conexão, simplificam o suporte, aumentam a legibilidade e a flexibilidade do projeto.
Isso se deve ao fato de que o pensamento humano é propenso à generalização. Estamos procurando padrões, trazemos a lógica repetida para entidades individuais, criamos padrões. Provavelmente, esse comportamento tem raízes evolutivas: reduzir a quantidade de informações salva recursos cognitivos.
O LLM age de maneira diferente: eles não experimentam cargas do volume de dados e não se esforçam para economizar. Pelo contrário, é mais fácil para eles trabalhar com informações fragmentadas e duplicadas do que construir e manter abstrações complexas. É por isso que é mais fácil lidar com o código sem encapsulamento, com estruturas repetidas e severidade arquitetônica mínima.
Modelos de idiomas grandes são uma ferramenta útil no desenvolvimento, especialmente nos estágios iniciais ou ao criar um código auxiliar. Mas é importante adaptar a abordagem a eles: simplificar a arquitetura, limitar a abstração, evitar dependências complexas e não confiar nelas ao configurar o SDK.
Os princípios de sólidos, secos e limpos ainda são relevantes, mas dão o melhor efeito nas mãos de uma pessoa. Ao trabalhar com a LLM, é razoável usar um estilo prático e simplificado que permite obter um código confiável e compreensível que seja fácil de finalizar manualmente. E onde LLM esquece – a duplicação do código o ajuda a se lembrar.
Quero compartilhar meu novo projeto-a coleção da NFT “Demens TV Heads”.

Esta é uma série de obras de arte digital, eles refletem pessoas de diferentes personagens e profissões, no estilo do logotipo Demensdeum.
O primeiro trabalho é feroz “Grozny”, este é um auto -portão estilizado.
Eu pretendo lançar apenas 12 NFT, um a cada mês.
Cada trabalho existe não apenas no Blockchain Ethereum, mas também está disponível no site Demensdeum e nas estradas Github, junto com o Metadã.
Se estiver interessado, veja ou apenas avalie visualmente, ficarei feliz:
https://opensea.io/collection/demens-tv-heads
https://github.com/demensdeum/demens-tv-heads-collection
https://demensdeum.com/collections/demens-tv-heads/fierce.png
https://demensdeum.com/collections/demens-tv-heads/fierce-metadata.txt

Quem é ele – esse super programador misterioso, efêmero e quase mítico? Uma pessoa cujo código é compilado pela primeira vez é lançado a partir da metade -pike e imediatamente entra no Prod. A lenda transmitida em bytes de Senor para junho. Aquele que escreve insetos especificamente para que outros não fiquem entediados. Honestamente, vamos, com calor e ironia, descobriremos quais superpotências ele deve ter para usar essa capa digital.
1. Escreve sobre C/C ++ sem uma vulnerabilidade unificada
Buffer Overflow? Nunca ouvi falar disso.
O super programador em C ++ não possui variáveis inconvenientes – elas próprias são inicializadas a partir do respeito. Ele escreve novo char [256], e o compilador silenciosamente adiciona uma verificação de bordas. Onde outros colocam um ponto de interrupção – ele olha. E o bug desaparece.
2. Escreva fichs sem insetos e testes
Ele não precisa de testes. Seu código se testa à noite quando ele dorme (embora … ele dorme?). Qualquer linha é uma versão estável final, imediatamente com o suporte de 12 idiomas e o nível acessível da NASA. E se o bug ainda apareceu, o universo o está testando.
3. Funciona mais rápido que ai
Enquanto o ChatGPT está imprimindo “que boa pergunta!”, O super programador já bloqueou o novo sistema operacional, portou para a torradeira e documentou tudo em Markdown com diagramas. Ele não pede Stackoverflow – ele o apóia com suas perguntas do futuro. GPT está estudando em suas comunidades.
4. Ele entende o código de outra pessoa melhor que o autor
“Claro, eu escrevi … mas não entendo como funciona.” – Um autor comum.
“Ah, isso se deve à chamada recursiva na linha 894, que está ligada ao efeito colateral no filtro Regex. Smart.” – Super programador sem piscar.
Ele lê Perl na primeira tentativa, entende as abreviações nos nomes das variáveis, e os bugs capturas por vibração do cursor.
5.
Por que escrever sobre a ferrugem, se possível no X86 Pure, Arm e Risc-V imediatamente, com uma bandeira “trabalha em todos os lugares”? Ele tem sua própria mesa dos Oppodes. Até a CPU pensa antes de estragar suas instruções. Ele não otimiza – ele transcende.
6. Ele responde a perguntas sobre os prazos até um segundo
“Quando estará pronto?”
“Após 2 horas, 17 minutos e 8 segundos. E sim, isso está levando em consideração os insetos, uma quebra de fumaça e uma pergunta filosófica no bate -papo”.
Se alguém pedir para fazer mais rápido, ele simplesmente reconstrua o espaço-tempo através de make-jives.
7. Revertees e Reparar estruturas proprietárias
O SDK proprietário caiu, a API sem documentação, tudo é criptografado pelo Base92 e tosse Segfault? Para um super -programador, esta é uma terça -feira comum. Ele abrirá um binário, inspira hexadecimal e, uma hora depois, haverá um patch com uma correção, melhorias de desempenho e um modo escuro adicionado.
8. Designer e especialista em UX para si mesmo
Ui sai para ele que as pessoas choram de beleza e os botões são adivinhados pela intuição. Até os gatos lidam – verificado. Ele não desenha uma interface – ele abre sua essência interior, como um escultor em mármore. Cada imprensa está encantada.
9. Realiza pesquisa de marketing entre commits
Entre Git Push e Coffee Break, ele consegue coletar análises de mercado, criar um funil de vendas e repensar a estratégia de monetização. Nos fins de semana, as hipóteses de testes. Ele tem testes A/B são lançados automaticamente quando ele abre um laptop.
10. Repita a Microsoft sozinha
Isso para as empresas 10 anos e mil engenheiros, para ele – sexta -feira à noite e boa pizza. Windows 11? Windows 12. Office? Já aí. Excel? Ele trabalha em gerenciamento de voz e ajuda a planejar férias. Tudo funciona melhor e pesa menos.
11. Desdobra e suporta infraestrutura para 1 milhão de usuários
Seu NAS caseiro é um clister Kubernetes. Monitoramento? Grafana com memes. Ele desdobra a API mais rápido do que alguns conseguem abrir o Postman. Ele tem tudo documentado, automatizado e confiável como um bule soviético.
12. O suporte técnico não é necessário
Os usuários não reclamam disso. Eles apenas o usam com reverência. PERGUNTAS FREQUENTES? Não é necessário. Tutoriais? Intuição dirá. Ele é o único desenvolvedor que tem o botão “Ajuda” para a página de gratidão.
13. Ele não dorme, não come, não está distraído
Ele se alimenta de cafeína e um desejo puro de escrever um código. Em vez de dormir, refatorando. Em vez de comer – pacotes debianos. Seu ciclo de vida é um ciclo de desenvolvimento contínuo. O CI/CD não é um pipeline, este é um estilo de vida.
14. Comunica -se com clientes sem dor
“Precisamos fazer o Uber, mas apenas melhor, em dois dias.” – “Veja: aqui está o roteiro, aqui estão os riscos, aqui está o MVP. E vamos primeiro decidir sobre os objetivos”.
Ele sabe como dizer não “para que o cliente responda:” Obrigado, agora eu entendo o que quero. ”
15. Provavelmente programa os reatores nucleares
Quanto calor é liberado quando o núcleo de urânio é dividido? O super -programador sabe. E ele sabe como roubá -lo em ferrugem, C, Swift, mesmo no Excel. Seu reator não é apenas seguro – também é atualizado pela OTA.
16. tem conhecimento em todas as áreas possíveis
Filosofia, física, relatórios tributários da Mongólia – tudo em sua cabeça. Ele participa de testes, onde é um líder. Se ele não souber de algo, ele simplesmente desligou temporariamente a memória para abrir espaço para novos conhecimentos. Agora ele voltará.
17. Conhece todos os algoritmos e padrões de design
Não há necessidade de explicar a ele como funciona um*, Dijkstra ou Singleton. Ele veio com eles. Com ele, os padrões se comportam corretamente. Até os antipattternos são corrigidos – da vergonha.
18. Trabalhou na Apple, Google e deixou o tédio
Ele estava em toda parte: Apple, Google, NASA, IKEA (testou a interface do gabinete). Então eu percebi que já era muito bom e fui desenvolver projetos gratuitos de código aberto por prazer. Ele não precisa de dinheiro porque:
19. Ele tem Pontid Bitcoin e ele é Satoshi Nakamoto
Sim, é ele. Só não diz. Todas as carteiras com milhões de BTC estão na verdade em sua unidade de flash, parada em concreto. Enquanto isso, ele escreve back -end para uma cooperativa de agricultores no Outback, porque “foi interessante tentar o Kotlin multiplatform”.
Conclusão: um pouco de seriedade
De fato, os programadores são pessoas comuns.
Estamos enganados. Ficamos cansados. Às vezes, estamos tão confiantes em nós mesmos que não vemos o óbvio – e é então que os erros mais caros da história são cometidos.
Portanto, vale lembrar:
* É impossível saber tudo – mas é importante saber onde olhar.
* Trabalhar em uma equipe não é uma fraqueza, mas um caminho para uma decisão melhor.
* As ferramentas que nos protegem não são “muletas”, mas armaduras.
* Ask é normal. Duvidar está certo. Cometer erros é inevitável. O aprendizado é necessário.
* A ironia é o nosso escudo. O código é a nossa arma. Responsabilidade é nossa bússola.
E as lendas sobre um super -programador são um lembrete de que todos às vezes nos esforçamos pelo impossível. E isso é precisamente nisso – magia de programação real.
(e como não ser um guru cujos conselhos deixam de trabalhar após a atualização)
“Os aplicativos só podem usar APIs públicas e devem ser executadas no sistema operacional de envio atualmente”. Diretrizes de revisão do aplicativo da Apple
Se você já começou a trabalhar com uma nova estrutura e se pegou pensando: “Agora vou entender tudo, a documentação é para os furos”-você definitivamente não está sozinho. Muitos desenvolvedores têm um instinto natural: primeiro tentativa, e só então – leia. Isso está bem.
Mas é nesta fase que você pode desligar facilmente o caminho certo e se encontrar em uma situação em que o código funciona … mas apenas hoje, e apenas “eu tenho”.
Freimvorki, especialmente fechado e proprietário, é complexo e multi -camada. Eles têm muita lógica oculta, otimização e recursos de implementação, que:
* não documentado;
* não garantido;
* pode mudar a qualquer momento;
* são um segredo comercial e podem ser protegidos por patentes
* contém bugs, falhas conhecidas apenas pelos desenvolvedores da estrutura.
Quando você age “em um palpite”, você pode facilmente criar arquitetura em observações aleatórias, em vez de suporte nas regras claramente descritas. Isso leva ao fato de que o código se torna vulnerável a atualizações e casos de borda.
Os desenvolvedores de estruturas criam manuais por um motivo – este é um acordo entre você e eles. Enquanto você está agindo como parte da documentação, eles prometem:
* estabilidade;
* apoiar;
* comportamento previsível.
Se você vai além dessa estrutura – tudo o que acontece se tornará exclusivamente sua responsabilidade.
Experimentos? Certamente. Mas no quadro das regras.
A curiosidade é a super -via do desenvolvedor. Explore, tente limites não padrão e de teste – tudo isso é necessário. Mas há um importante “mas”:
Você precisa experimentar a estrutura da documentação e práticas recomendadas.
A documentação não é uma prisão, mas um cartão. Ela mostra quais oportunidades são realmente planejadas e apoiadas. São esses experimentos que não são apenas úteis, mas também seguros.
Às vezes você pode encontrar “especialistas” reais:
* Eles conduzem cursos
* realizar em conferências,
* Escreva livros e blogs,
* compartilhou “sua abordagem” à estrutura.
Mas mesmo que pareçam convincentes, é importante lembrar:
Se suas abordagens são contrárias à documentação, elas são instáveis.
Tais “padrões empíricos” podem:
* trabalhar apenas em uma versão específica da estrutura;
* ser vulnerável a atualizações;
* Break em situações imprevisíveis.
Guru é legal quando eles respeitam os manuais. Caso contrário, suas dicas devem ser filtradas através da documentação oficial.
Três idéias de princípios sólidos são especialmente relevantes aqui:
* Princípio aberto/fechado: expanda o comportamento por meio de uma API pública, não entre no interior.
* Princípio da Substituição de Liskov: não confie na implementação, confie no contrato. Distúrbios – tudo quebrará ao substituir a implementação.
* Inversão de dependência: os módulos de nível alto não devem depender de módulos de baixo nível. Ambos os tipos devem depender de abstrações. A abstração não deve depender dos detalhes. Os detalhes devem depender de abstrações.
O que isso significa na prática? Se você usa uma estrutura e ligado diretamente aos seus detalhes internos – você viola esse princípio.
Em vez disso, você precisa criar dependência de interfaces públicas, protocolos e contratos que a estrutura apóie oficialmente. Isso dá:
* o melhor isolamento do seu código das alterações na estrutura;
* a capacidade de testar e substituir facilmente as dependências;
* Comportamento previsível e estabilidade da arquitetura.
Quando seu código depende dos detalhes, e não de abstrações, você literalmente se incorporou em uma implementação específica que pode desaparecer ou mudar a qualquer momento.
Às vezes acontece que você fez tudo certo, mas funciona incorretamente. Isso acontece – as estruturas não são perfeitas. Nesse caso:
* Reúna um exemplo mínimo reproduzido.
* Certifique -se de usar apenas API documentada.
* Envie um bug-port-Eles definitivamente o entenderá e, provavelmente, ajudará.
Se o exemplo for construído sobre hacks ou desvios, os desenvolvedores não precisam apoiá -lo e provavelmente seu caso simplesmente perderá.
* Leia a documentação. Seriamente.
* Siga os guias e recomendações dos autores.
* Experimento – mas dentro do descrito.
* Verifique as dicas (até os alto -falantes mais famosos!) Através do manual.
* Dobre os bugs com casos mínimos e respeito pelo contrato.
Freimvorki não são caixas pretas, mas ferramentas que possuem as regras de uso. Ignorá -los significa escrever o código “aleatoriamente”. Mas queremos que nosso código viva por um longo tempo, encanta usuários e não rompe com a atualização menor.
Então: confie, mas verifique. E sim, leia os manuais. Eles são sua superpotência.
https://developer.apple.com/app-store/review/guidelines/
https://en.wikipedia.org/wiki/SOLID
https://en.wikipedia.org/wiki/API
https://en.wikipedia.org/wiki/RTFM
Meet – Cube Art Project 2
A segunda versão do editor da estação, totalmente reescrita em JavaScript puro sem o WebAssembly.
Leve, rápido e começa bem no navegador – nada mais.

Este é um experimento: cubos, cor, liberdade e um pouco de geometria 3D meditativa.
Você pode alterar as cores usando os relevantes RGB, salvar e carregar cenas, mover-se pelo espaço e apenas jogar.
Controlar:
– WASD – movendo a câmera
– Mouse – rotação
– GUI – Configurações de cores
On-line:
https://demensdeum.com/software/cube-art-project-2/
Fontes no Github:
https://github.com/demensdeum/cube-art-project-2
O projeto é escrito em JavaScript puro usando três.js.
Sem estruturas, sem colecionadores, sem o WebAssembly – apenas Webgl, Shaders e um pouco de amor pela geometria de pixels.
As cenas podem ser salvas e carregadas – crie seus mundos, exceto como JSON, compartilhe ou retorne mais tarde para refinar.
O Docker se tornou uma ferramenta indispensável no DevOps e no desenvolvimento modernos. Ele permite que você isole o cerco, simplifique a roupa e escala rapidamente aplicativos. No entanto, por padrão, o Docker requer uma raiz, e isso cria uma zona potencialmente perigosa, que é frequentemente ignorada nos estágios iniciais.
O Docker usa os recursos do Linux: CGROUPS, Namespaces, iptables, Mount, Networking e outras funções do sistema. Essas operações estão disponíveis apenas para o super -usuário.
É por isso:
* Dockerd Demon começa da raiz,
* Os comandos do Docker são transmitidos a este demônio.
Isso simplifica o trabalho e fornece controle total sobre o sistema, mas ao mesmo tempo abre vulnerabilidades em potencial.
Com isolamento fraco, um invasor pode usar chroot ou pivot_root para entrar no host.
Exemplos de ataques reais:
* CVE-2019-5736-Vulnerabilidade para Runc, permitido reescrever o aplicativo e executar o código no host.
* CVE-2021-3156-Vulnerabilidade para sudo, permitido obter uma raiz dentro do contêiner e sair.
Se o aplicativo no contêiner estiver vulnerável e iniciar da raiz, RCE = controle total sobre o host.

Para minimizar esses riscos, o modo sem raiz apareceu no Docker. Nesse modo, o demônio e os contêineres são lançados em nome do usuário usual, sem nenhum privilégio de raiz. Isso significa que, mesmo que um invasor receba controle sobre o contêiner, ele não poderá prejudicar o sistema host.
Existem restrições: você não pode usar portas abaixo de 1024 (por exemplo, 80 e 443), o modo -privilegiado, bem como alguns modos de rede, não estão disponíveis. No entanto, na maioria dos cenários de desenvolvimento e no Docker sem raiz CI/CD, ele lida com sua tarefa e aumenta significativamente o nível de segurança.
Desde o início, o princípio dos menores privilégios foi aplicado no mundo Unix/Linux. Quanto menos direitos o processo, menos danos ele puder causar. O Docker exigiu inicialmente um acesso à raiz, mas hoje é considerado uma ameaça potencial.
https://docs.docker.com/engine/security/rootless/
https://rootlesscontaine.rs/
O problema não óbvio dos recipientes do Docker: Vulnerabilidades ocultas
O que é “Dependensky Hell” (DH)?
“Dependência Inferno” (DH) é um termo que denota um problema que surge ao gerenciar dependências no software. Suas principais razões estão no conflito de versões, nas dificuldades de integrar várias bibliotecas e a necessidade de manter a compatibilidade entre elas. DH inclui os seguintes aspectos:
– Conflitos de versões: os projetos geralmente exigem versões específicas de bibliotecas e diferentes componentes podem depender de versões incompatíveis da mesma biblioteca.
– Dificuldades nas atualizações: a atualização de dependências pode levar a erros inesperados ou quebra de compatibilidade, mesmo que uma nova versão contenha correções ou melhorias.
– O ambiente: o desejo de isolar e estabilizar o ambiente levou ao uso de ambientes virtuais, contêinerização e outras soluções destinadas a simplificar o gerenciamento de dependência.
É importante observar que, embora a eliminação das vulnerabilidades seja uma das razões para o lançamento de versões atualizadas das bibliotecas, não é a principal força motriz do DH. O principal problema é que cada alteração – seja corrigindo erros, adicionando uma nova funcionalidade ou eliminando a vulnerabilidade – pode causar uma cadeia de dependências que complique o desenvolvimento e o suporte estáveis do aplicativo.
Como a luta contra o DH levou à criação de Docker?
Na tentativa de resolver os problemas da DH, os desenvolvedores estavam procurando maneiras de criar um ambiente isolado e estável para aplicações. Docker foi uma resposta a esse desafio. A contêinerização permite:
– Isole o ambiente: todas as dependências e bibliotecas são embaladas junto com o aplicativo, que garante trabalho estável em qualquer lugar onde o Docker esteja instalado.
– Simplifique a implantação: o desenvolvedor pode configurar o ambiente e usá -lo para implantar em qualquer servidor sem configurações adicionais.
– Minimize conflitos: como cada aplicativo funciona em seu próprio contêiner, o risco de conflitos entre as dependências de vários projetos é significativamente reduzido.
Assim, o Docker propôs uma solução eficaz para combater o problema de DH, permitindo que os desenvolvedores se concentrassem na lógica do aplicativo, e não nas dificuldades de configurar o ambiente.
O problema das dependências desatualizadas no Docker
Apesar de todas as vantagens do Docker, uma nova direção dos problemas apareceu – a obsolescência de vícios. Isso acontece por vários motivos:
1. O recipiente congela a tempo
Ao criar uma imagem do Docker, um determinado estado de todos os pacotes e bibliotecas é corrigido. Mesmo que após a montagem na imagem básica (por exemplo, `Ubuntu: 04.20,` python: 3.9`, `nó: 18-alpine`), as vulnerabilidades são encontradas ou as novas versões são produzidas, o contêiner continuar trabalhando com as versões instaladas inicialmente. Se a imagem não for enviada, o aplicativo poderá funcionar com componentes obsoletos e potencialmente vulneráveis por anos.
2. Falta de atualizações automáticas
Diferentemente dos servidores tradicionais, onde você pode configurar os pacotes automáticos atualizando através dos gerentes de sistema (por exemplo, `APT Upgrade` OR` npm update`), os contêineres não são atualizados automaticamente. A atualização ocorre apenas ao re -selecionar a imagem, que requer disciplina e controle regular.
3. Dependências fixas
Para garantir a estabilidade, os desenvolvedores geralmente corrigem a versão de dependências em arquivos como `redirentions.txt` ou` package.json`. Essa abordagem impede alterações inesperadas, mas, ao mesmo tempo, congela o estado das dependências, mesmo que erros ou vulnerabilidades sejam posteriormente detectados nelas.
4. Usando imagens básicas obsoletas
As imagens básicas selecionadas para contêineres também podem estar desatualizadas com o tempo. Por exemplo, se o aplicativo for construído sobre a imagem de `nó: 16`, e os desenvolvedores já foram alterados para ‘nó: 18’ devido a melhorias e correções, seu ambiente permanecerá com uma versão desatualizada, mesmo que tudo funcione corretamente dentro do código.
Como evitar problemas com dependências desatualizadas?
Inclua inspeções regulares para dependências e vulnerabilidades desatualizadas no processo CI/CD:
– Para Python:
pip list --outdated
– Para Node.js:
npm outdated
– Use ferramentas para analisar vulnerabilidades, por exemplo, `trivy`:
trivy image my-app
Monitore as atualizações das imagens básicas
Inscreva -se nas atualizações das imagens básicas no Docker Hub ou nos repositórios correspondentes no Github, a fim de aprender oportunamente sobre correções e atualizações críticas.
Conclusão
O problema do inferno de dependência surgiu não apenas devido à necessidade de eliminar a vulnerabilidade, mas também como resultado de dificuldades no gerenciamento e atualização de dependências. O Docker propôs uma solução eficaz para combater a DH, fornecendo ambiente isolado e estável para aplicações. No entanto, com o advento da contêinerização, surgiu uma nova tarefa – a necessidade de renovação regular de imagens, a fim de impedir a obsolescência das dependências e o aparecimento de vulnerabilidade crítica.
É importante para os especialistas em DevOps modernos não apenas resolver os problemas dos conflitos de versões, mas também para introduzir práticas de controle regularmente e automatizadas para a relevância dos vícios, para que os contêineres permaneçam seguros e eficazes.
Introdução
O último artigo examinou o caso geral de usar o padrão do construtor, mas a opção não foi abordada quando o objeto é criado em etapas no tempo.
O Builder Pattern (Builder) é um modelo de design gerador que permite criar gradualmente objetos complexos. É especialmente útil quando o objeto tem muitos parâmetros ou várias configurações. Um dos exemplos interessantes de seu uso é a capacidade de separar o processo de criação de um objeto no tempo.
Às vezes, o objeto não pode ser criado imediatamente – seus parâmetros podem se tornar conhecidos em diferentes estágios do programa.
Um exemplo no Python
Neste exemplo, o objeto do carro é criado em estágios: primeiro, parte dos dados é carregada no servidor e o usuário insere as informações ausentes.
import requests
def fetch_car_data():
response = requests.get("https://api.example.com/car-info")
return response.json()
builder = CarBuilder()
# Backend API data
car_data = fetch_car_data()
builder.set_model(car_data["model"])
builder.set_year(car_data["year"])
# User input
color = input("Car color: ")
builder.set_color(color)
gps_option = input("GPS feature? (yes/no): ").lower() == "yes"
builder.set_gps(gps_option)
car = builder.build()
print(car)
Imagine uma chamada de API, a entrada de dados ocorra em diferentes partes do aplicativo, ou mesmo em diferentes bibliotecas. Então, o uso do padrão do construtor se torna mais óbvio do que em um exemplo simples acima.
Vantagens
– A saída é uma estrutura imunológica que não precisa armazenar dados opcionais para montagem temporária
– O objeto é coletado gradualmente
– Evitando designers complexos
– O código de montagem do objeto é incompleto apenas em uma essência do construtor
– Conveniência de entender o código
Fontes
https://www.amazon.com/Design-Patterns-Object-Oriented-Addison-Wesley-Professional-ebook/dp/B000SEIBB8
https://demensdeum.com/blog/2019/09/23/builder-pattern/
Inicie o Desafio de Codificação de Demensdeum #1
Prêmio 100 USDT
1. Precisamos escrever fotos de renderização para o Windows 11 64 bits
2. Render
https://demensdeum.com/logo/demens1.png
3. A imagem deve ser integrada ao aplicativo
4. API gráfica – Direct3D ou DirectDraw
5.
6. A imagem deve ser 1 em 1 como original, salve cores
7. Quaisquer idiomas/estruturas não requerem instalação adicional -> para que você possa iniciar imediatamente a partir do aplicativo. Por exemplo, se a solução for apenas um script python, essa solução não será adequada. A instalação de Python, Pygame e lançamento manualmente é necessária. Bom exemplo: o script python envolto em Python e Pygame no EXE, que começa sem instalações adicionais.
8. Dê a forma de um link para um repositório público com o código -fonte, instruções para montar o aplicativo. Bom exemplo: um projeto com as instruções de montagem no Visual Studio Community Edition
Prazo: 1 de junho resumindo o concurso
Solução de referência em zig + sdl3 + sdl3_image:
https://github.com/demensdeum/DemensDeum-Coding-Challenge-1
No aplicativo GhostContacts, você pode adicionar contatos à Lista Secreta, há suporte para tópicos escuros e brilhantes, localização, exportação e importações de contatos CSV, uma senha de emergência é suportada para redefinir a lista de contatos se o usuário repentinamente exigir uma senha regular para entrar.
Aplicativo online:
https://demensdeum.com/software/ghost-contacts/
Github:
https://github.com/demensdeum/GhostContacts
Quando comecei a pensar em começar meu próprio blog em 2015, me deparei com a seguinte questão: qual plataforma deveria escolher? Depois de muita pesquisa e comparação, decidi pelo WordPress. Esta não foi uma escolha aleatória, mas sim o resultado de uma análise das capacidades da plataforma, suas vantagens e desvantagens. Hoje gostaria de compartilhar meus pensamentos e experiências usando o WordPress.
WordPress é uma ferramenta que oferece o equilíbrio perfeito entre simplicidade e poder. Para mim, as suas vantagens superam as desvantagens, principalmente considerando o grande número de soluções para eliminá-las. Graças ao WordPress, consegui criar um blog que atende perfeitamente às minhas necessidades.
Recentemente encontrei um aplicativo de leitura dinâmica que gostaria de recomendar a você.
A leitura dinâmica é uma habilidade que pode aumentar muito sua produtividade, melhorar sua compreensão de leitura e economizar tempo. Existem muitos aplicativos no mercado que prometem ajudar você a dominar essa habilidade, mas um que se destaca é o Wordex para iOS. Neste artigo contaremos o que é Wordex, quais recursos ele possui, para quem é adequado e por que merece atenção.
Wordex é um aplicativo iOS projetado especificamente para desenvolver habilidades de leitura dinâmica. Ajuda os usuários a ler textos com mais rapidez, concentrar-se nas ideias principais e evitar distrações. O programa é baseado em abordagens científicas e oferece ferramentas convenientes para melhorar sua velocidade de leitura.
Wordex é perfeito para:
Wordex não é apenas uma ferramenta para ensinar leitura dinâmica. Este é um programa que desenvolve a concentração, amplia o vocabulário e aumenta a produtividade. Depois de experimentar o Wordex, você notará como a leitura deixará de ser uma tarefa árdua e se tornará uma atividade emocionante.
Se você deseja aprender leitura dinâmica ou melhorar as habilidades existentes, o Wordex é uma ótima escolha. Fácil de usar e eficaz, o aplicativo o ajudará a atingir seus objetivos e economizar um tempo valioso. Baixe Wordex na App Store e comece a treinar hoje mesmo!
Loja de aplicativos:
https://apps.apple.com/us/app/speed-reading-book-reader-app/id1462633104