home.social

Search

129 results for “faker_js”

  1. #apresentacao

    Tô há alguns meses por aqui, sou um cara entusiasta do Fediverso, da privacidade na navegação, da imposição de freios e mais freios ao avanço dos patrões (e dos colegas que agem como patrões) e das empresas sobre o nosso tempo livre, sonho com um mundo em que todo mundo possa trabalhar em algo que seja socialmente proveitoso e interessante para si mesmo, e que tenha assegurado o seu descanso na exata proporção em que a gente vai - em conjunto, como classe trabalhadora - aumentando a nossa produtividade.

    Acompanho com especial interesse os desdobramentos da revolução de Rojava, que passa por um momento crítico, mas como no internacionalista proletário fico extremamente feliz com as lutas que têm acontecido na Índia, na França, na Itália, na Albânia,... e vejo que pode ser um momento de virada as recentes mobilizações populares na Argentina e no segundo turno do Brasil. Só a luta muda a vida, e se a gente retomar as ruas, vamos mudar esse jogo e fazer recuar o pesadelo do fascismo - não se enganem, se os trabalhadores se mobilizam, com radicalidade e autonomia, será a direita que vai implorar por um governo de conciliação e "pacificação social".

  2. The Rise of AI: Is There Hope for Mankind?

    Beyond Today Magazine

    November—December 2025

    Extraordinary advances in artificial intelligence fuel dreams of ease on one hand, and nightmares of catastrophe on the other. Will AI supplant human decision-making? Will humanity even survive?

    The Rise of AI: Is There Hope for Mankind?

    by Steven Britt

    ince the release of ChatGPT in late 2022, the world has been captivated by advances in the field of artificial intelligence (AI). As these systems become more humanlike in their output, everyone—from leading experts in the field to presidents and pundits alike—is feeling the accelerated pace of technology and wondering where we are headed.

    In 2023, Elon Musk warned, “AI is more dangerous than, say, mismanaged aircraft design or production maintenance or bad car production . . . It has the potential of civilization destruction” (emphasis added throughout).

    Is there reason to fear AI? Is it possible that AI will soon achieve human-level or even superhuman intelligence? And, if so, is there hope for mankind to survive the creation and implementation of such a powerful technology?

    When machines learn to think

    While the AI we see today is impressive, many experts believe we are only a few years away from artificial general intelligence (AGI)—systems with the humanlike ability to solve entirely new problems by innovation, experimentation and learning.

    Since the inception of the machine age, computer software has only been able to accomplish rigid, preprogrammed instructions within strict boundaries. However, AI is now able, without a single line of new code, to perform a multitude of tasks on request. In minutes, it can make a better diagnosis than your doctor, out-argue a lawyer, translate a speech into another language, negotiate a contract and write a poem about it all in Shakespearian style.

    The current reality was nearly unthinkable to the average person just three years ago when ChatGPT debuted. At the time of this writing, AI models are already able to score above average on IQ tests and ace graduate-level exams across multiple disciplines.

    Despite these impressive achievements, these systems fall short of AGI.

    Intelligence, much like consciousness, is difficult to actually define, and there is no widely accepted definition of exactly what constitutes AGI. Current AI systems perform well on tests because they have likely seen the information before—a distinguishing feature of AGI would be the humanlike ability to solve entirely new challenges, learning and adapting as it goes.

    While today’s AI tools can already outperform most human beings on a wide variety of written and verbal tests, a true AGI system would be a world-changing breakthrough. The reason is simple: Machine intelligence can be scaled just by hooking up more processors. One could easily create entire teams of AGIs working together on complex problems from different angles just as people would—researching, experimenting, publishing findings and reasoning. They would never sleep, never take a break, and would operate at superhuman speed.

    The first and most obvious task on the agenda, in the minds of many, would be to set this AGI to work unlocking the secrets of building even higher intelligence—redesigning and improving itself until it has completely surpassed human beings, a level known as artificial superintelligence (ASI).

    Much thought has gone into the consequences of AGI or ASI becoming a reality, and the imagined outcomes fall into four different possible endings to the story:

    1. The A.I. utopia. Guided by careful design and moral wisdom, AGI works tirelessly to end disease, to design and build clean energy grids, and to free humanity to pursue creativity. Work becomes optional, poverty fades and everyone lives happily ever after.

    2. The hostile machine. Like the plot of numerous action movies, a rogue AI decides it would be better off without mankind and moves to destroy us.

    3. The paperclip maximizer problem. Philosopher Nick Bostrom warned in 2004 that even a neutral AGI can be lethal if it’s simply given the wrong goal. In this scenario, the AGI is set over a factory and told to make as many paperclips as possible. It soon begins converting forests, oceans and eventually human beings into raw materials for more paperclips—inadvertently destroying mankind in a blind pursuit of a poorly defined goal!

    4. Human mischief—supercharged. The most likely and earliest danger is abuse of this rapidly changing technology for evil. Just as mid-20th-century physics gave way to nuclear bombs with terrible destructive power, nations or criminals could weaponize and unleash AGI for cyberwarfare, bioweapons and more.

    Notice that only one of these outcomes doesn’t end with the destruction of mankind! But will the technologies really advance to such extremes?

    2025: The year of AI agents

    By the end of 2024, tech leaders were already calling 2025 “the year of AI agents,” signaling a fundamental change in how AI would be used.

    Until recently, AI tools like ChatGPT could only generate text and ideas—they could not take real-world action outside of giving a response to a user’s input. AI agents change that completely.

    The key difference between a chatbot and an AI agent is that an agent can interface with other software tools, even without being explicitly told to do so, to accomplish a task on its own. The earliest step toward AI agents was adding simple web-search features, allowing AI to perform its own Internet searches, scanning through dozens of different websites to answer detailed queries with up-to-date information.

    Significantly, on July 17, 2025, Open-AI released Agent Mode in ChatGPT, imbued with the ability to fully use the Internet through a web browser. For example, you can give Agent Mode the dates of an upcoming trip, your budget and some interests, and it can research the area, plan a full, day-by-day itinerary and book your hotel and tickets for you!

    The massive financial bet on AI

    If investment is a measure of expectation, the world’s richest companies and governments all clearly believe that AGI—or something similarly world-changing—is coming soon.

    In January 2025, OpenAI announced construction of Project Stargate, a $500 billion datacenter requiring over five gigawatts of power—more than twice the output of Hoover Dam. Meanwhile, Elon Musk’s supercomputing center, dubbed Colossus, has cost $4 billion so far and draws 150 megawatts from the grid, with plans to spend $25 billion to quadruple its capacity to nearly 1 gigawatt.

    And the spending doesn’t stop at hardware. In one of the most aggressive talent recruiting wars in history, Meta (formerly known as Facebook) has offered elite AI researchers compensation packages worth $300 million per person over four years—sometimes more than $100 million in the first year!

    In all this, key chipmaker Nvidia skyrocketed to become the world’s most valuable company in history, topping $4.5 trillion in value.

    This “compute race” resembles the nuclear arms buildup of the Cold War, but with one striking difference—the pace. Nuclear weapons development spanned decades; ChatGPT was released just three years ago.

    Russian President Vladimir Putin famously said in 2017, “Whoever becomes the leader in AI will become the ruler of the world.” That prediction accurately summed up the fervor for powerful AI systems that has ignited these historic investments.

    Biblical perspective: Is AGI really possible?

    The fact is, machines cannot replicate the God-given, spiritual nature of human beings.  Ecclesiastes 3:11 tells us that God “has put eternity in their hearts.” People are not just biological processors of data. It is the human spirit from our Creator that gives us human understanding (Job 32:8; 1 Corinthians 2:11). And He designed us to live in a loving relationship with Him!

    Genesis 2:7 states that “the Lord God formed man of the dust of the ground, and breathed into his nostrils the breath of life; and man became a living being.” AI systems, made of silicon circuits and transistors, are mere dust of the ground.

    However, the Bible gives grave warnings about human ingenuity. At the Tower of Babel, God said that, because the people were working together with the same mindset and language, “Nothing that they propose to do will be withheld from them” (Genesis 11:6).

    The spread of global technology has helped to remove the language barrier God introduced at Babel. And today’s engineers, corporations and governments are working with one mind and one goal—to create machine intelligence that can learn and perform nearly any task as well as, or better than, human beings.

    Gary Kasparov, the renowned chess grandmaster who famously lost to IBM’s Deep Blue chess computer in 1997—a feat once considered impossible for a machine—stated, “Saying that Deep Blue doesn’t really think is like saying an airplane doesn’t really fly because it doesn’t flap its wings.”

    In other words, in the eyes of the world the difference between intelligence and capability will be considered irrelevant—as what matters is what AI can do.

    Just as the builders at Babel, humanity is coming against limits that once seemed unreachable.

    The real dangers start before AGI arrives

    Science fiction loves the trope of self-aware AI turning against its creators. Despite the dazzling leaps of AI agents or how human the newest AI models may seem in their writing, they are not at all a step toward true humanlike intelligence.

    However, the most immediate dangers of AI do not require any form of consciousness or sentience to amplify evil in the world.

    “The heart is deceitful above all things, and desperately wicked; who can know it?” (Jeremiah 17:9).

    Recall the problem of “fake news” in recent years. Hundreds of provocative, but untrue, headlines deceived many. AI will be used to produce more convincing content faster than ever, including not only text but fraudulent images and videos that are increasingly difficult to discern.

    Likewise, bad actors across the board augment their abilities with AI already—from hackers holding companies hostage with ransomware to phishing scams duping people for their bank information. Very soon, AI agents will make it possible to outsource these evil deeds completely, enabling a single person to deploy as many simultaneous attacks as their computing resources can support.

    The scale of the threat grows when considering geopolitical motives. State-sponsored cyber attacks from China against critical U.S. systems are now routine, and their human hackers are probably already equipped with AI assistants at their side. It’s not a stretch to imagine the Chinese government commissioning an army of AI cyberwarfare agents that autonomously seek out vulnerabilities in critical American systems and infiltrate them for espionage and/or disruption.

    Internet-based attacks can have real, deadly consequences, but the dangers of AI do not stop there. An Encyclopedia Britannica essay titled “Killer Robots: The Future of War?” postulates that “the first revolution in warfare was the invention of gunpowder. The second was the invention of nuclear weapons. And this [AI-powered autonomous robots] will be the third” (Toby Walsh, Britannica.com, originally published 2018). As it rightly observes, “The weakest link in a drone is the radio link back to base.” Now it can keep going on its own.

    Coinciding with developments in AI, drone technology and humanoid robotics have undergone rapid advances in recent years. Flying drones are already redefining the principles of modern warfare through the Russia-Ukraine war, where cheap remote-piloted drones carrying explosives have neutralized multimillion-dollar tanks, dramatically altering battlefield dynamics. Replacing remote drone pilots with AI is an all-but-certain escalation that will soon make these platforms capable of greater destruction and on a much larger scale.

    On the robotics front, Boston Dynamics in the U.S. and Unitree Robotics in China are routinely demoing new humanlike and doglike robots—powered by AI systems—that learn via neural networks to not only walk, but run, jump, climb, dance and do backflips. In the near future, governments may be manufacturing vast armies of AI-powered autonomous robot soldiers.

    Consider also the problem of AGI or ASI falling into the hands of volatile dictators, and the stakes become even higher. On June 22, 2025, U.S. stealth bombers destroyed three Iranian nuclear facilities, derailing Iran’s uranium enrichment ambitions for years to come. Replace the thought of “uranium enrichment” with “AI computer clusters” and the same logic may apply in the near future—nations launching preemptive strikes to prevent rivals from reaching AI supremacy.

    Will humanity survive the AI explosion?

    Jesus Christ warned that in the end times the world would be plagued by “wars and rumors of wars” (Matthew 24:6). AI is poised to be both fuel and the spark for that fire.

    While AI marches forward at breakneck speed, the “AI utopia” scenario does not seem at all likely. Human nature, as history has shown many times over, dictates that AI will be used as a tool for both good and evil. The abilities of these systems in the near future leave us with very bleak prospects.

    Will mankind survive? Jesus said that things will get so bad that “unless those days were shortened, no flesh would be saved [alive] . . .” (Matthew 24:22). In other words, the Bible confirms that the doom-and-gloom scenarios are indeed the logical, predictable outcome of man’s efforts!

    Our greatest problems—war, greed, corruption—are not technical but spiritual in nature. AI cannot solve them. Rather, it will amplify them.

    And yet, there is hope! Jesus continued, “. . . but for the elect’s sake those days will be shortened.” In the absence of a loving Creator, the collective sins of mankind would be our undoing—but God, out of mercy and love for His people, will intervene before AI or any other threat would destroy mankind.

    Until the return of Jesus Christ, the world we live in will become increasingly dangerous and unpredictable. Paul warned that “in the last days perilous times will come” (2 Timothy 3:1). AI advances are worsening many spiritual dangers. Social media will become more addictive and more toxic. Advertising will become more enticing than ever, fueling hedonism. Deceptive AI content will soon make it nearly impossible to tell truth from reality. All these problems and more are at our doorstep!

    What should we do as AI races ahead? Stay spiritually awake, testing every claim against God’s Word, and remember that the only true hope for the world is the coming Kingdom of God.

    Our world is charging toward a future it cannot control—but, thankfully, that future is securely in the hands of God the Father and Jesus Christ. For our sake, man’s self-destructive course will be cut short, and God’s Kingdom will bring the peace that no human-devised AI could ever deliver!

    ****

    LOLGB+

    #agi #AI #artificialIntelligence #chatgpt #technology
  3. Nos artigos anteriores construímos uma visão cada vez mais completa do Apache Spark.

    Passamos por:

    Data
    ↓
    Partitions
    ↓
    Tasks
    ↓
    Executors
    ↓
    Shuffle
    ↓
    Joins
    ↓
    Spark SQL
    ↓
    Catalyst
    ↓
    Physical Plan

    Mas existe um recurso atravessando praticamente todas essas etapas:

    memória.

    Quando comecei a estudar problemas de memória no Spark, era tentador resumir tudo a:

    OutOfMemory
    ↓
    aumentar RAM

    Hoje eu vejo esse raciocínio como incompleto.

    Um problema de memória pode estar relacionado a:

    Driver
    Executors
    Partitions
    Shuffle
    Broadcast
    Cache
    Serialization
    Garbage Collection
    Python workers
    Off-heap/native memory
    Memory Overhead

    E aumentar memória sem descobrir qual desses componentes está causando o problema pode apenas tornar um Job caro antes de ele falhar novamente.

    A pergunta correta não é:

    Quanto de memória devo adicionar?


    É:

    Quem está consumindo memória, por quê, e em qual parte da arquitetura?


    1. Memória em uma aplicação Spark


    Vamos voltar à arquitetura básica:

    DRIVER
    │
    ▼
    Cluster Manager
    │
    ┌─────────┼─────────┐
    ▼ ▼ ▼
    Executor 1 Executor 2 Executor 3

    Temos dois contextos que precisam ser diferenciados imediatamente:

    Driver Memory

    e:

    Executor Memory

    Essa distinção é fundamental.

    Porque:

    Driver OOM

    e:

    Executor OOM

    podem ter causas completamente diferentes.

    2. Driver Memory


    O Driver coordena a aplicação.

    Ele mantém informações relacionadas a:

    • aplicação;
    • Jobs;
    • Stages;
    • Tasks;
    • scheduling;
    • metadados;
    • planos de execução;
    • resultados retornados ao Driver;
    • estado necessário para coordenar a computação.

    Conceitualmente:

    DRIVER
    │
    ┌──────────────┼──────────────┐
    ▼ ▼ ▼
    Planning Scheduling Metadata
    │ │ │
    └──────────────┼──────────────┘
    ▼
    Control

    Isso significa que o Driver não deveria ser tratado como destino para todo o dataset distribuído.

    Esse ponto parece óbvio.

    Até alguém executar:

    dados = df.collect()

    3. O perigo do collect()


    Considere:

    df.count()

    O processamento acontece de maneira distribuída e o resultado retornado é pequeno:

    123456789

    Agora compare com:

    dados = df.collect()

    collect() solicita que todos os registros do DataFrame sejam retornados ao Driver.

    Conceitualmente:

    Executor 1 ──────┐
    Executor 2 ──────┤
    Executor 3 ──────┼──► DRIVER
    Executor 4 ──────┤
    Executor 5 ──────┘

    Se o dataset possuir:

    500 GB

    e o Driver tiver:

    8 GB

    temos um problema bastante previsível.

    O Spark é distribuído.

    Mas acabamos de pedir:

    Traga tudo para uma única máquina.


    4. collect() não é ruim — o contexto é que importa


    Não existe problema em:

    df.limit(10).collect()

    quando sabemos que o resultado será pequeno.

    Também existem cenários legítimos em que precisamos trazer pequenas quantidades de dados ao Driver.

    O problema é usar collect() sem compreender:

    Distributed Dataset
    ↓
    Driver

    A pergunta antes de um collect() deveria ser:

    Qual o volume máximo que pode voltar para o Driver?


    Essa pergunta evita muitos problemas.

    5. Outros caminhos para sobrecarregar o Driver


    collect() é o exemplo mais conhecido, mas não é o único.

    Problemas de Driver também podem aparecer com:

    • resultados excessivamente grandes;
    • estruturas locais gigantes;
    • excesso de metadados;
    • quantidade extrema de Tasks;
    • operações que materializam dados no processo do Driver;
    • código Python executado localmente;
    • determinadas operações de visualização ou conversão.

    Por exemplo:

    pdf = df.toPandas()

    merece atenção.

    O resultado precisa caber na memória do processo que recebe esse DataFrame local.

    Ou seja:

    Spark DataFrame distribuído
    ↓
    toPandas()
    ↓
    DataFrame local
    ↓
    DRIVER

    Se os dados forem grandes, temos novamente uma concentração de memória.

    6. Executor Memory


    Agora vamos para os Executors.

    Eles executam as Tasks.

    Conceitualmente:

    Executor
    │
    ├── Task 1
    ├── Task 2
    ├── Task 3
    └── Task 4

    Durante a execução, memória pode ser necessária para:

    • processamento;
    • agregações;
    • joins;
    • sorting;
    • shuffle;
    • estruturas intermediárias;
    • cache;
    • dados serializados;
    • execução de código;
    • componentes fora do heap JVM.

    É aqui que começam vários problemas clássicos.

    7. Uma partição vira trabalho para uma Task


    Da Parte 3:

    Em uma determinada Stage, cada partição normalmente corresponde ao trabalho de uma Task.


    Então existe uma conexão direta:

    Partition
    ↓
    Task
    ↓
    Memory pressure

    Imagine:

    Partition 1 → 200 MB
    Partition 2 → 180 MB
    Partition 3 → 220 MB
    Partition 4 → 18 GB

    A Task responsável pela quarta partição terá um perfil completamente diferente das demais.

    Podemos observar:

    Task 1 → OK
    Task 2 → OK
    Task 3 → OK
    Task 4 → Memory Pressure

    Talvez o problema não seja:

    Executor com pouca memória.


    Talvez seja:

    Uma partição absurdamente maior que as outras.


    8. Particionamento e memória são inseparáveis


    Imagine um dataset de:

    1 TB

    distribuído em:

    10 partitions

    Simplificando muito:

    ≈ 100 GB por partition

    Agora considere:

    1000 partitions

    Teríamos algo mais próximo de:

    ≈ 1 GB por partition

    Isso não significa que uma Task precise manter toda a partição simultaneamente em memória.

    Mas o exemplo mostra uma relação importante:

    O tamanho e a distribuição das partições influenciam diretamente a pressão de memória das Tasks.


    É por isso que simplesmente aumentar spark.executor.memory pode esconder a causa real.

    9. Execution Memory


    Durante operações como:

    df.groupBy("customer_id").sum("value")

    Spark precisa de memória para executar estruturas intermediárias.

    Também em:

    df.orderBy("timestamp")

    ou em determinados joins.

    Podemos pensar conceitualmente:

    Executor Memory
    │
    ├── Execution
    │ │
    │ ├── Shuffle
    │ ├── Join
    │ ├── Sort
    │ └── Aggregation
    │
    └── Storage
    │
    ├── Cached Data
    └── Persisted Data

    No Spark moderno, execution e storage participam de um modelo de gerenciamento de memória integrado.

    Isso é importante porque a memória disponível não deve ser imaginada como caixas totalmente independentes e rígidas em todos os momentos.

    10. Storage Memory


    Agora imagine:

    df.cache()

    Quando o DataFrame é materializado, Spark pode manter partições para reutilização.

    Conceitualmente:

    Executor
    │
    ├── Execution Memory
    │
    └── Storage Memory
    │
    ├── Partition A
    ├── Partition B
    └── Partition C

    Isso pode ser extremamente útil.

    Se o mesmo dataset caro for utilizado várias vezes:

    Expensive computation
    ↓
    CACHE
    ↓
    ┌─────┼─────┐
    ▼ ▼ ▼
    Use 1 Use 2 Use 3

    evitamos recalcular repetidamente a mesma linhagem.

    Mas cache também custa memória.

    11. cache() não significa "deixe rápido"


    Esse é outro anti-pattern comum:

    df.cache()

    ser utilizado como se significasse:

    optimize(df)

    Não significa.

    Imagine um DataFrame de:

    800 GB

    que será utilizado apenas uma vez.

    Fazer cache pode simplesmente:

    • consumir memória;
    • provocar eviction;
    • aumentar pressão sobre o Executor;
    • competir com execution memory;
    • não trazer benefício relevante.

    Cache faz mais sentido quando existe reuso.

    Por exemplo:

    base = transformacao_cara(df)

    base.cache()

    resultado_a = base.groupBy("estado").count()
    resultado_b = base.groupBy("produto").sum("valor")
    resultado_c = base.filter("status = 'ACTIVE'")

    Agora existe um motivo claro:

    Expensive Base
    ↓
    CACHE
    ↓
    ┌────┼────┐
    ▼ ▼ ▼
    A B C

    12. Cache também é Lazy


    Considere:

    df.cache()

    Isso não significa necessariamente:

    Neste instante, todas as partições foram computadas e armazenadas.


    A materialização ocorre quando uma Action força a computação.

    Por exemplo:

    df.cache()

    df.count()

    Agora temos:

    cache()
    ↓
    mark for persistence
    ↓
    count()
    ↓
    compute partitions
    ↓
    store according to persistence strategy

    Lazy evaluation continua presente.

    13. persist()


    Além de:

    df.cache()

    podemos trabalhar com:

    df.persist()

    e escolher estratégias de persistência adequadas ao contexto.

    Conceitualmente, a persistência pode envolver combinações de:

    Memory
    Disk
    Serialization
    Replication

    A escolha depende de fatores como:

    • tamanho;
    • frequência de reuso;
    • custo de recomputação;
    • memória disponível;
    • tolerância a I/O.

    Novamente, não existe uma configuração universalmente melhor.

    14. E quando a memória não é suficiente?


    Agora chegamos a algo que apareceu na Parte 4:

    Spill


    Imagine uma Task realizando:

    Sort

    ou:

    Aggregation

    ou processamento relacionado a:

    Shuffle

    Ela utiliza estruturas em memória.

    Mas a quantidade necessária ultrapassa o que pode ser mantido eficientemente ali.

    Então parte dos dados pode ser enviada para disco.

    Conceitualmente:

    Task
    ↓
    Memory
    ↓
    Memory pressure
    ↓
    Spill
    ↓
    Disk

    Depois:

    Disk
    ↓
    Read
    ↓
    Continue processing

    Isso permite que determinadas operações continuem mesmo quando tudo não cabe simultaneamente em memória.

    Mas existe um preço.

    15. Spill troca memória por I/O


    Compare:

    Memory
    ↓
    CPU

    com:

    Memory
    ↓
    Disk Write
    ↓
    Disk Read
    ↓
    CPU

    Disco normalmente é muito mais lento do que memória.

    Então grandes volumes de spill podem transformar:

    Job

    em:

    Job lento

    Mesmo sem ocorrer um OutOfMemory.

    Essa é uma lição importante:

    Uma aplicação pode estar sofrendo de pressão de memória sem necessariamente falhar por OOM.


    Ela pode simplesmente ficar muito mais lenta.

    16. Shuffle + Memory + Spill


    Agora conectamos vários artigos.

    Considere:

    resultado = (
    vendas
    .groupBy("customer_id")
    .sum("valor")
    )

    Podemos ter:

    Partitions
    ↓
    Partial Aggregation
    ↓
    Shuffle Write
    ↓
    Network
    ↓
    Shuffle Read
    ↓
    Aggregation
    ↓
    Memory pressure
    ↓
    Spill
    ↓
    Disk

    Agora um simples:

    groupBy()

    ganha uma interpretação completamente diferente.

    17. Data Skew volta novamente


    Imagine:

    P1 = 200 MB
    P2 = 210 MB
    P3 = 190 MB
    P4 = 15 GB

    Durante uma agregação:

    P1 → OK
    P2 → OK
    P3 → OK
    P4 → Spill → Spill → Spill

    Ou pior:

    P4 → OutOfMemory

    A reação inicial pode ser:

    Aumentar executor memory.


    Talvez funcione.

    Mas talvez a pergunta correta seja:

    Por que existe uma partição de 15 GB quando as demais possuem aproximadamente 200 MB?


    Estamos novamente diante de:

    Data Skew

    A causa é distribuição.

    O sintoma aparece na memória.

    18. OutOfMemory não é um único problema


    Quando alguém diz:

    "Spark deu OOM."


    Ainda sabemos muito pouco.

    Precisamos perguntar:

    Onde?

    Por exemplo:

    Driver OOM?

    ou:

    Executor OOM?

    ou pressão fora do heap/container?

    Também precisamos perguntar:

    Em qual Stage?

    Em qual operação?

    Em todas as Tasks?

    Em uma única Task?

    Depois de um Shuffle?

    Durante Broadcast?

    Durante collect()?

    Essas perguntas mudam completamente a investigação.

    19. Um Driver OOM pode indicar problema de arquitetura


    Imagine:

    dados = df.collect()

    sobre um dataset enorme.

    Podemos aumentar:

    spark.driver.memory

    de:

    4 GB

    para:

    16 GB

    Depois:

    32 GB

    Depois:

    64 GB

    Talvez o Job finalmente funcione.

    Mas a pergunta continua:

    Por que estamos trazendo um dataset distribuído gigantesco para um único processo?


    Aumentar memória resolveu o sintoma.

    Talvez não tenha resolvido o design.

    20. Executor OOM também pode esconder outro problema


    Agora imagine:

    Executor OOM

    A reação:

    spark.executor.memory
    8 GB → 16 GB

    Mas talvez exista:

    uma partition = 40 GB

    Ou:

    join skewed

    Ou:

    broadcast excessivo

    Ou várias Tasks concorrentes disputando recursos.

    Ou consumo significativo fora do heap principal.

    Então:

    Executor OOM não significa automaticamente que o Executor precisa apenas de mais heap.


    21. spark.executor.memory


    Uma configuração conhecida é:

    spark.executor.memory

    Ela define a quantidade de memória heap disponibilizada ao processo Executor JVM.

    Por exemplo:

    --executor-memory 8g

    Mas existe uma armadilha conceitual importante:

    A memória total necessária por um Executor não é necessariamente igual ao valor de spark.executor.memory.


    Existe memória utilizada fora desse heap.

    E isso nos leva diretamente ao tema do material original que estudei:

    Memory Overhead

    22. O que é Memory Overhead?


    Uma aplicação Spark não utiliza memória apenas para o heap principal da JVM.

    Podemos pensar de forma simplificada:

    Executor Container / Process Environment
    │
    ├── JVM Heap
    │
    │ └── spark.executor.memory
    │
    └── Additional / Non-Heap Memory
    │
    ├── JVM overhead
    ├── native memory
    ├── Python processes
    ├── direct buffers
    └── other runtime overhead

    É essa segunda região que torna memoryOverhead tão importante.

    Dependendo do ambiente e do workload, um Executor pode morrer mesmo quando aparentemente existe heap suficiente.

    23. Um exemplo conceitual


    Imagine uma configuração:

    Executor Heap
    8 GB

    Isso não significa necessariamente:

    Executor total
    =
    8 GB

    O processo também precisa de espaço para outras necessidades.

    Podemos pensar:

    Container / Pod / Executor allocation

    ┌───────────────────────────────┐
    │ │
    │ JVM Heap │
    │ spark.executor.memory │
    │ │
    ├───────────────────────────────┤
    │ │
    │ Memory Overhead │
    │ │
    │ Native / Python / Direct / │
    │ JVM non-heap / other │
    │ │
    └───────────────────────────────┘

    Se a região adicional for insuficiente, o processo pode exceder os limites impostos pelo gerenciador de recursos.

    24. Por que isso aparece muito com PySpark?


    Em PySpark existe uma característica importante.

    Nosso código Python não transforma a JVM inteira em Python.

    Existe interação entre:

    JVM
    ↕
    Python worker

    Conceitualmente:

    Executor JVM
    │
    ├── Spark execution
    │
    └── Python worker
    │
    └── Python code

    Esses processos também consomem memória.

    Dependendo do workload, bibliotecas e operações utilizadas, isso pode se tornar relevante para o consumo total do Executor.

    Portanto, em PySpark precisamos olhar além de:

    JVM Heap

    25. Memory Overhead no material histórico


    Uma das anotações que motivou este capítulo tratava especificamente de problemas de memoryOverhead.

    Esse tipo de problema continua conceitualmente relevante.

    O que mudou ao longo dos anos foram:

    • versões do Spark;
    • nomes e comportamento de determinadas configurações;
    • resource managers;
    • defaults;
    • cálculo automático de overhead;
    • integração com containers;
    • Kubernetes;
    • execução Python;
    • mecanismos internos de memória.

    Por isso não considero uma boa prática pegar uma configuração antiga e simplesmente reproduzi-la hoje.

    O conceito continua válido.

    A configuração precisa ser analisada no contexto da versão e do ambiente atuais.

    26. Heap vs. Off-Heap vs. Overhead


    Uma simplificação útil é:

    PROCESS MEMORY
    │
    ├── JVM Heap
    │
    ├── JVM Non-Heap
    │
    ├── Direct / Native Memory
    │
    ├── Python Worker Memory
    │
    └── Runtime Overhead

    Isso é mais próximo da realidade do que pensar:

    memory = spark.executor.memory

    Quando um container é encerrado por ultrapassar limite de memória, precisamos descobrir qual parte do consumo cresceu.

    27. Garbage Collection


    Agora vamos entrar em outro sintoma importante:

    GC


    A JVM gerencia automaticamente memória de objetos.

    Objetos são criados:

    Objects
    ↓
    Heap

    Depois deixam de ser necessários.

    O Garbage Collector precisa recuperar esse espaço.

    Em um cenário saudável:

    Application Work ███████████████████

    GC █

    Mas sob forte pressão podemos encontrar algo mais próximo de:

    Application ███████

    GC █████████████

    Ou seja:

    A aplicação passa tempo demais tentando gerenciar memória em vez de processar dados.


    28. GC alto é sintoma


    Assim como OOM, GC excessivo não deveria gerar automaticamente:

    Aumente a heap.


    Talvez tenhamos:

    • objetos demais;
    • partições grandes;
    • agregações pesadas;
    • estruturas intermediárias enormes;
    • cache excessivo;
    • serialização inadequada;
    • concorrência excessiva por Executor.

    Precisamos descobrir por que a memória está sob pressão.

    29. Mais cores por Executor também afetam memória


    Imagine:

    Executor
    8 cores

    Dependendo da configuração, várias Tasks podem executar simultaneamente nesse Executor.

    Conceitualmente:

    Executor Memory
    │
    ┌────┼────┬────┬────┬────┐
    ▼ ▼ ▼ ▼ ▼ ▼
    T1 T2 T3 T4 T5 ...

    Cada Task pode precisar de memória.

    Então existe uma relação:

    mais Tasks concorrentes por Executor
    ↓
    mais competição pela memória disponível

    Isso mostra por que tuning não deveria analisar:

    executor memory

    isoladamente.

    Precisamos olhar para:

    Executor Memory
    +
    Executor Cores
    +
    Partition Size
    +
    Task Behavior

    30. Executors gigantes também não são automaticamente melhores


    Poderíamos pensar:

    1 Executor
    64 cores
    256 GB RAM

    Parece poderoso.

    Mas Executors gigantes podem trazer trade-offs relacionados a:

    • concorrência;
    • garbage collection;
    • blast radius de falha;
    • utilização;
    • scheduling;
    • memória compartilhada entre muitas Tasks.

    No outro extremo:

    64 Executors
    1 core
    4 GB

    também possui trade-offs.

    Não existe um tamanho universal.

    Precisamos equilibrar:

    cores
    memory
    parallelism
    partition size
    workload
    cluster manager

    31. Broadcast também consome memória


    Na Parte 5 vimos:

    from pyspark.sql.functions import broadcast

    resultado = grande.join(
    broadcast(pequena),
    "id"
    )

    A estratégia pode evitar um shuffle grande.

    Mas existe um custo:

    Small Table
    ↓
    Broadcast
    ┌──┼──┐
    ▼ ▼ ▼
    E1 E2 E3

    Cada Executor precisa conseguir trabalhar com a estrutura transmitida.

    Se tentarmos broadcast de algo grande demais, podemos criar pressão significativa de memória.

    Novamente:

    Network optimization
    ↕
    Memory cost

    Sistemas distribuídos são cheios de trade-offs.

    32. Cache também compete por recursos


    Imagine:

    df_a.cache()
    df_b.cache()
    df_c.cache()
    df_d.cache()

    Pode parecer:

    Quanto mais cache, melhor.


    Mas:

    Cache A
    Cache B
    Cache C
    Cache D
    ↓
    Storage Pressure
    ↓
    Eviction / recomputation / resource competition

    Cache deveria ser uma decisão baseada em:

    reuse frequency
    ×
    recomputation cost
    ×
    available resources

    e não um reflexo automático.

    33. unpersist()


    Se um dataset não será mais reutilizado, podemos liberar sua persistência:

    df.unpersist()

    Isso comunica:

    Não preciso mais manter essas partições persistidas.


    Em pipelines longos isso pode ser importante.

    Por exemplo:

    Phase A
    ↓
    cache intermediate
    ↓
    reuse several times
    ↓
    phase completed
    ↓
    unpersist
    ↓
    free resources for Phase B

    Gerenciamento de memória também faz parte do design do pipeline.

    34. O Spark UI volta a ser essencial


    Se existe problema de memória, não quero começar alterando configurações.

    Quero observar.

    No Spark UI e métricas relacionadas, procuro sinais como:

    Task Duration
    GC Time
    Shuffle Read
    Shuffle Write
    Spill
    Storage
    Executor behavior
    Failed Tasks
    Skew

    Também observo logs.

    A pergunta é:

    O que aconteceu antes da falha?


    35. Um padrão de investigação


    Imagine:

    Job falhou
    ↓
    Executor lost
    ↓
    Memory-related error

    Meu raciocínio começaria assim:

    Qual Stage?
    ↓
    Qual operação?
    ↓
    Join?
    Aggregation?
    Sort?
    UDF?
    Cache?

    Depois:

    Todas as Tasks falharam?
    ↓
    ou apenas algumas?

    Se apenas algumas:

    Possível skew?

    Depois:

    Qual tamanho das partitions?
    Quanto shuffle?
    Quanto spill?
    Quanto GC?

    Só então:

    Heap insuficiente?
    Overhead insuficiente?
    Particionamento ruim?
    Broadcast inadequado?
    Concorrência excessiva?

    36. Caso 1 — Driver morrendo


    Sintoma:

    Driver OutOfMemory

    Código:

    dados = df.collect()

    Dataset:

    120 GB

    Driver:

    8 GB

    Diagnóstico provável:

    Distributed Data
    ↓
    collect()
    ↓
    Single Process
    ↓
    OOM

    Solução arquitetural:

    Não coletar o dataset inteiro.


    Talvez:

    df.write.parquet(
    "/data/output"
    )

    ou continuar o processamento distribuído.

    A solução principal não é necessariamente:

    8 GB → 128 GB

    37. Caso 2 — Uma Task morre repetidamente


    Sintoma:

    Stage 12

    199 Tasks → OK
    1 Task → FAIL

    Isso é extremamente informativo.

    Talvez tenhamos:

    Data Skew

    ou uma partição muito maior.

    Se aumentarmos memória de todos os Executors:

    Cluster cost ↑

    para resolver uma única partição anormal, talvez estejamos atacando o lugar errado.

    Precisamos investigar a distribuição.

    38. Caso 3 — Todas as Tasks sofrem Spill


    Imagine:

    Task 1 → heavy spill
    Task 2 → heavy spill
    Task 3 → heavy spill
    Task 4 → heavy spill
    ...

    Agora talvez tenhamos um problema sistêmico.

    Possíveis causas:

    Partitions muito grandes
    Memory insuficiente
    Join pesado
    Sort pesado
    Aggregation pesada
    Task concurrency

    Nesse cenário, ajustar recursos pode realmente fazer parte da solução.

    Mas ainda precisamos medir.

    39. Caso 4 — OOM depois de Broadcast


    Imagine que:

    Job funcionava

    e alguém adicionou:

    broadcast(dim)

    Agora Executors começam a morrer.

    Pergunta:

    Qual o tamanho real de dim?

    Talvez:

    "small table"

    tenha crescido.

    Ontem:

    50 MB

    Hoje:

    6 GB

    Uma otimização válida no passado pode se tornar um problema quando os dados mudam.

    Isso é importante:

    Performance depende também da evolução dos dados.


    40. Caso 5 — PySpark e memória externa ao heap


    Imagine:

    spark.executor.memory

    aparentemente confortável.

    Mas containers continuam sendo encerrados por memória.

    Agora precisamos olhar para:

    JVM Heap
    +
    Python workers
    +
    Native memory
    +
    Direct buffers
    +
    Other overhead

    É exatamente nesse tipo de cenário que compreender memoryOverhead deixa de ser detalhe e passa a ser parte do diagnóstico.

    41. Não ajuste memoryOverhead às cegas


    Se um Executor morre por ultrapassar limites externos ao heap, aumentar overhead pode ser apropriado.

    Mas ainda precisamos perguntar:

    Por que esse consumo existe?

    Pode ser:

    • Python;
    • bibliotecas nativas;
    • buffers;
    • comportamento da JVM;
    • volume de dados;
    • operação específica.

    A configuração correta depende do workload e do ambiente.

    Por isso evito recomendações como:

    sempre configure X GB

    ou:

    sempre use Y%

    sem contexto.

    Defaults e comportamentos também evoluem entre versões.

    42. Memória em Kubernetes


    Em ambientes containerizados, a questão fica ainda mais visível.

    Podemos pensar:

    Kubernetes Pod
    │
    └── Executor
    │
    ├── JVM Heap
    ├── Non-Heap
    ├── Native
    ├── Python
    └── Overhead

    O Pod possui limites.

    Não basta a JVM achar que possui heap suficiente.

    O consumo total do processo e componentes associados precisa respeitar os recursos disponíveis.

    Esse é um dos motivos pelos quais problemas modernos de Spark precisam ser analisados também no nível da infraestrutura.

    43. Memória em YARN


    Em ambientes YARN, existe raciocínio semelhante.

    O Executor executa dentro de recursos controlados pelo gerenciador do cluster.

    Historicamente, muitos erros de memoryOverhead ficaram conhecidos justamente em ambientes onde o container ultrapassava seu limite mesmo quando a heap configurada parecia aceitável.

    O princípio permanece:

    JVM Heap
    ≠
    Total Process Memory

    44. A configuração depende do ambiente


    Hoje Spark pode rodar em diferentes contextos:

    Standalone
    YARN
    Kubernetes
    Managed Platforms
    Cloud Services

    Isso significa que recomendações de memória precisam considerar:

    • Spark version;
    • cluster manager;
    • container limits;
    • JVM;
    • Python;
    • workload;
    • plataforma gerenciada.

    Uma configuração copiada de um artigo antigo pode estar:

    correta historicamente

    e:

    inadequada atualmente

    ao mesmo tempo.

    Esse é exatamente o tipo de cuidado que estou aplicando ao revisitar meu material antigo nesta série.

    45. Um modelo mental melhor para OOM


    Em vez de:

    OOM
    ↓
    More Memory

    prefiro:

    OOM
    │
    ┌──────────┴──────────┐
    ▼ ▼
    Driver? Executor?
    │ │
    ▼ ▼
    collect()? Which Stage?
    toPandas()? │
    metadata? ▼
    Which Operation?
    │
    ┌──────────┼──────────┐
    ▼ ▼ ▼
    Skew Shuffle Broadcast
    │ │ │
    └──────────┼──────────┘
    ▼
    Partition Size
    │
    ▼
    Heap or Overhead?
    │
    ▼
    Root Cause

    Esse modelo evita tratar todos os erros de memória como iguais.

    46. Performance tuning começa com observabilidade


    Imagine dois engenheiros.

    O primeiro vê:

    OutOfMemoryError

    e imediatamente altera:

    spark.executor.memory

    O segundo investiga:

    Stage
    Tasks
    Partition distribution
    Shuffle
    Spill
    GC
    Executor logs
    Physical plan
    Data volume

    O segundo talvez leve alguns minutos a mais antes de alterar a configuração.

    Mas a chance de resolver a causa real é muito maior.

    Essa é uma diferença importante entre:

    configuration tuning

    e:

    performance engineering

    47. Um checklist para problemas de memória


    Quando encontro um problema de memória em Spark, quero responder:

    • O erro aconteceu no Driver ou Executor?
    • Qual Stage estava executando?
    • Qual operação estava acontecendo?
    • Existe collect()?
    • Existe toPandas()?
    • Existe broadcast?
    • Existe cache excessivo?
    • As partições estão equilibradas?
    • Existe data skew?
    • Qual o tamanho das maiores Tasks?
    • Existe Shuffle?
    • Quanto?
    • Existe Spill?
    • Quanto?
    • Quanto tempo está sendo gasto em GC?
    • Todas as Tasks sofrem ou apenas algumas?
    • Existem Python workers?
    • Existe consumo nativo relevante?
    • O limite do container está sendo ultrapassado?
    • O problema é heap ou overhead?
    • A configuração corresponde à versão e ao cluster manager utilizados?

    Só depois:

    Qual configuração preciso alterar?


    48. O que eu evitaria fazer automaticamente


    Se o Job estiver lento ou falhando, eu evitaria começar por:

    dobrar executor memory

    ou:

    dobrar driver memory

    ou:

    aumentar memoryOverhead arbitrariamente

    ou:

    cachear tudo

    ou:

    reduzir o número de partitions sem medir

    ou:

    aumentar o cluster

    Todas essas ações podem ser válidas.

    Mas nenhuma delas deveria substituir diagnóstico.

    49. Memória, performance e custo


    Em cloud, existe ainda outra dimensão.

    Imagine:

    Executor Memory
    8 GB

    e simplesmente dobramos para:

    16 GB

    em dezenas ou centenas de Executors.

    Talvez o Job fique estável.

    Mas talvez tenhamos acabado de aumentar recursos para compensar:

    Data Skew

    ou:

    repartition ruim

    ou:

    join inadequado

    ou:

    cache desnecessário

    Então temos:

    Problema arquitetural
    ↓
    Mais infraestrutura
    ↓
    Maior custo
    ↓
    Problema mascarado

    Performance tuning também é FinOps.

    50. A conexão entre tudo que vimos até aqui


    Agora podemos montar uma visão muito mais completa:

    DATA
    │
    ▼
    PARTITIONS
    │
    ▼
    TASKS
    │
    ▼
    EXECUTORS
    │
    ┌───────────┼───────────┐
    ▼ ▼ ▼
    Memory CPU Network
    │ │
    ▼ ▼
    Aggregation Shuffle
    │ │
    └───────────┬───────────┘
    ▼
    Spill
    │
    ▼
    Disk
    │
    ▼
    Performance
    │
    ▼
    Cost

    Agora adicione:

    Data Skew

    e podemos gerar:

    Uneven Partition
    ↓
    Huge Task
    ↓
    Memory Pressure
    ↓
    Spill / GC
    ↓
    Slow Task
    ↓
    Straggler
    ↓
    Slow Stage

    Isso mostra por que os capítulos anteriores estavam conectados.

    51. A principal lição deste capítulo


    Se eu pudesse resumir memória no Spark em uma frase:

    Problemas de memória frequentemente são sintomas de como os dados e a computação foram distribuídos.


    Nem sempre.

    Às vezes realmente precisamos de mais memória.

    Mas antes de aumentar recursos, quero saber:

    Quem está consumindo?
    ↓
    Onde?
    ↓
    Durante qual operação?
    ↓
    Por quê?

    Só então:

    Architecture
    +
    Configuration
    +
    Resources

    entram na solução.

    52. Como penso hoje


    Meu modelo mental deixou de ser:

    Spark OOM
    ↓
    Increase Memory

    e passou a ser:

    Spark OOM
    ↓
    Driver or Executor?
    ↓
    Heap or Overhead?
    ↓
    Which Stage?
    ↓
    Which Task?
    ↓
    Which Operation?
    ↓
    Partition Size?
    ↓
    Skew?
    ↓
    Shuffle?
    ↓
    Spill?
    ↓
    Broadcast?
    ↓
    Cache?
    ↓
    Python / Native Memory?
    ↓
    Root Cause
    ↓
    Then Tune

    Esse raciocínio é muito mais útil do que decorar valores de configuração.

    Próximo artigo


    Agora entendemos:

    Partitions
    ↓
    Tasks
    ↓
    Memory
    ↓
    Shuffle
    ↓
    Spill

    Mas existe outro conceito fundamental que apareceu desde os primeiros artigos:

    Lineage.

    Quando uma partição é perdida, como Spark sabe reconstruí-la?

    Por que RDD significa:

    Resilient Distributed Dataset

    ?

    Como Spark obtém tolerância a falhas sem simplesmente replicar toda computação intermediária?

    E o que acontece quando a linhagem fica grande demais?

    No próximo artigo vamos explorar:

    • RDD Lineage;
    • DAG;
    • fault tolerance;
    • recomputation;
    • cache vs. recomputation;
    • checkpoint;
    • persistência;
    • falha de Executor;
    • recuperação de partições;
    • por que Spark é "resilient";
    • e como essas ideias evoluíram nas APIs modernas.

    Vamos partir deste modelo:

    Source
    ↓
    Map
    ↓
    Filter
    ↓
    Join
    ↓
    Aggregate
    ↓
    Result

    para enxergar algo mais profundo:

    LINEAGE
    │
    ▼
    Source → Transform → Transform → Shuffle → Result
    │ │ │
    └──────────┴──────────┘
    │
    information needed
    for recomputation

    Essa é uma das ideias fundamentais que fizeram o Spark ser Spark.

    ← Parte 6: Spark SQL e DataFrames — do código ao plano de execução

    Próximo: Parte 8 — RDD Lineage e tolerância a falhas: como o Spark se recupera quando algo dá errado#cluster #spark #python #bigdata #software #coding #development #engineering #inclusive #community
    Como aprendi Apache Spark — Parte 7: Memória — Executors, Driver, Cache, Spill e OutOfMemory

  4. Facebook: Hey, we've created a new Meta account that can also be used to access all your accounts including this one you already have and has been working for 20 years.

    Me: I don't really want a new.....

    Facebook: Someone just tried to use that new account we created without you asking. Was that you?

    Me: Um....Thanks Facebook for providing a second point of attack!

  5. [Veille 📣]: Le gaz lacrymogène est-il dangereux pour la santé ? Ce qu’en dit la science
    lemonde.fr/les-decodeurs/artic
    Si jamais vous aviez raté toutes les vidéos récentes sur le sujet, oui le lacrymo est ultra dangereux. C’est pas pour rien que c’est interdit en conflit armé.

    > Comme toute arme chimique, l'utilisation de gaz lacrymogène est interdite dans le cadre d'un conflit armé par une convention internationale signée en 1993 et entrée en vigueur en 1997. Cette convention ne réglemente cependant pas l'usage de substances chimiques dans le cadre du maintien de l'ordre public. - [Wikipédia](fr.wikipedia.org/wiki/Gaz_lacr)

    Même les flics commencent à s’inquiéter des conséquences de l’exposition aux gaz.

    > Après les manifestations du 17 octobre, […] [Alliance Police nationale publie les photographies d’]un jeune fonctionnaire présentant des lésions autour des yeux. Selon le syndicaliste, elles seraient apparues après douze heures de service et une exposition prolongée aux gaz lacrymogènes. Plusieurs jours plus tard, les paupières du policier étaient encore « terriblement enflammées », affirme-t-il.

    archive : archive.is/LjZBw

    #lacrymogène #répression #armes #violencesPolicières #manifestation #links #liens #veille

  6. [Veille 📣]: Mobilisations du 24 octobre : l’extrême droite a provoqué les manifestants sous le regard de policiers | Mediapart
    mediapart.fr/journal/france/25
    Ça fait des années qu’on dénonce les liens entre l’ED et la police. On dispose maintenant de vidéos de flics collaborant ouvertement avec des milices fascistes.

    > « Ils l’ont attaqué à cinq, autour de 19 heures », témoigne une de ses amies, vidéo à l’appui. La jeune femme ajoute : « Avant et après qu’ils s’en prennent à mon ami, on les a vus discuter avec les CRS, on a donc préféré partir vite. »

    Ça passe les dernières semaines à interpeller des lycéen·ne·s par milliers, mais ça bafouille pour faire pareil avec les fachos, comme c’est étrange…

    > Le ministère indique que si les « militants d’ultradroite n’ont pas systématiquement été interpellés », ce choix ne résulte pas d’une consigne mais du « contexte très dur de gestion de l’ordre public ».
    #extrêmeDroite #police #fascisme #France #links #liens #veille

  7. [Veille 📣]: On a enquêté sur les chiffres de la répression ! - Le Média
    video.lemediatv.fr/w/dNhRux1cy
    Très bon analyse des chiffres de la répression du mouvement lycéen, en comparaison avec d’autres.

    Ce qui se passe actuellement est extrêmement grave, il faut se révolter.
    #manifestation #répression #veilleVidéo #links #liens #veille

  8. [Veille 📣]: Information exclusive Blast : Le premier ministre a préparé la coupure des réseaux sociaux pour le 24 octobre | Blast le souffle de l’info, site d’information français d’actualités et d’investigations indépendant
    blast-info.fr/articles/2026/in
    Lecornu est un fou du bus, il prépare la dictature en pensant que personne ne répondra.

    Du coup, go sur Signal et DeltaChat, organisons-nous en amont, il n’est plus temps de tergiverser, quand ça sera trop tard, ça sera trop tard.

    #autoritarisme #répression #réseauxSociaux #France #censure #links #liens #veille

Share on Mastodon

Enter the server where you have an account.