<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"><channel><title>BlueberryPy</title><description>Python &amp; Fun</description><link>https://blueberry-py.github.io/blog/</link><language>en-us</language><item><title>This Month for Pythonistas - September 2026</title><link>https://blueberry-py.github.io/blog/post/this-month-for-pythonistas-2026-09/</link><guid isPermaLink="true">https://blueberry-py.github.io/blog/post/this-month-for-pythonistas-2026-09/</guid><description>&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;python&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;from&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; datetime &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;import&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; date&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;print&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(date.today().year, date.today().month)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# 2026 9&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img alt=&quot;issue-2026-09&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1280&quot; height=&quot;719&quot; src=&quot;/blog/_astro/splash.BUoIKTok_Z2lFejO.webp&quot;&gt;&lt;/p&gt;
&lt;p&gt;Welcome back Pythonistas! This is the September 2026 issue of “This Month for Pythonistas”, curating Python news, tutorials, articles, podcasts, repositories and community highlights for this month.&lt;/p&gt;
&lt;p&gt;Before we continue, please note that this blog is synced across the following platforms:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://blueberry-py.github.io/blog/post/this-month-for-pythonistas-2026-09/&quot;&gt;Github Pages&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://blueberrypy.netlify.app/post/this-month-for-pythonistas-2026-09/&quot;&gt;Netlify&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://blueberrypy.onrender.com/post/this-month-for-pythonistas-2026-09/&quot;&gt;Render&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://blueberrypy-blog.vercel.app/post/this-month-for-pythonistas-2026-09/&quot;&gt;Vercel&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://blog.blueberrypy.workers.dev/post/this-month-for-pythonistas-2026-09/&quot;&gt;Cloudflare&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Ready? Let’s get started!&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&quot;events--social&quot;&gt;Events &amp;amp; Social&lt;/h2&gt;
&lt;h3 id=&quot;risc-v-is-now-officially-supported-by-cpython&quot;&gt;&lt;a href=&quot;https://blog.python.org/2026/08/riscv-now-officially-supported/&quot;&gt;RISC-V is now officially supported by CPython!&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;CPython now officially supports RISC‑V as a tier‑3 platform, thanks to months of community work and RISE project hardware. Contributors fixed architecture‑specific issues, improved builds, and added testing on real hardware. Ongoing CI integration and potential tier‑2 promotion are planned, plus architecture‑specific optimizations. Users with RISC‑V hardware are encouraged to build CPython, run workloads, and report issues to help improve support.&lt;/p&gt;
&lt;h3 id=&quot;gpt-61-sol&quot;&gt;&lt;a href=&quot;https://openai.com/index/introducing-gpt-6-1-sol/&quot;&gt;GPT-6.1 Sol&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;OpenAI introduced GPT‑6.1 Sol, an upgraded version of GPT‑6 Sol tuned for agentic coding, computer use and professional work, delivering performance close to flagship GPT‑6 Astra at roughly one‑fifth the price ($2/$10 per million input/output tokens, $0.10 cached). It gains +6.4 points on DeepSWE, beats Opus 5.5 on GDP.pdf and AutomationBench at far lower cost, improves OSWorld 2.0 by 7 points, more than doubles Terminal‑Bench Science scores, and lowers factual‑error rate to 4.1%, with stronger alignment.&lt;/p&gt;
&lt;h3 id=&quot;introducing-claude-opus-55&quot;&gt;&lt;a href=&quot;https://www.anthropic.com/claude-opus-5-5&quot;&gt;Introducing Claude Opus 5.5&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Anthropic introduces Claude Opus 5.5, the first model in its Claude 5.5 family — a new flagship roughly matching Claude Fable 5.1 while costing ~40% less than Opus 5 ($4/$20 per million tokens, $0.20 cache reads) and producing output 30%+ faster. It leads in agentic coding, computer use, knowledge work, and science benchmarks, with testers citing dramatic efficiency gains on long jobs like codebase migrations. It scores best-ever on Anthropic’s behavioral audit, resists prompt injection better, keeps biology/cyber safeguards via verification programs, and writes more clearly.&lt;/p&gt;
&lt;h3 id=&quot;introducing-claude-sonnet-55&quot;&gt;&lt;a href=&quot;https://www.anthropic.com/claude-sonnet-5-5&quot;&gt;Introducing Claude Sonnet 5.5&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Claude Sonnet 5.5 is the second model in the Claude 5.5 family: a faster, cheaper complement to Opus 5.5, best for well-scoped everyday tasks, bug fixes, and polished documents, slides, and spreadsheets. It runs 30%+ faster and costs up to 30% less per task than Sonnet 5 at unchanged pricing. Gains are dramatic — 70.6% versus 10.3% on Terminal-Bench 4.0, near-Opus results on GDPval-AA, OSWorld, and chart recognition, and it’s the first Sonnet to beat Pokémon Red from screenshots alone.&lt;/p&gt;
&lt;h2 id=&quot;new-versions&quot;&gt;New Versions&lt;/h2&gt;
&lt;h3 id=&quot;python-3150-candidate-2-is-here&quot;&gt;&lt;a href=&quot;https://blog.python.org/2026/09/python-3150-rc2/&quot;&gt;Python 3.15.0 candidate 2 is here!&lt;/a&gt;&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;This release, 3.15.0rc2, is the final planned release candidate, containing around 144 bugfixes, build improvements and documentation changes from 76 contributors since 3.15.0rc1. The next release of Python 3.15 will be 3.15.0 final, scheduled for 2026-10-01.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id=&quot;pytorch-214-release-blog&quot;&gt;&lt;a href=&quot;https://pytorch.org/blog/pytorch-2-14-release-blog/&quot;&gt;PyTorch 2.14 Release Blog&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;PyTorch 2.14 is released, built from 2,995 commits by 487 contributors since 2.13. Highlights include NVGEMM (CuTeDSL-based CUTLASS GEMM kernels in Inductor with epilogue fusion and NVFP4 support), a preview of the rewritten “nccl2” NCCL backend from torchcomms, first-class fault tolerance in c10d with in-place process-group reconfiguration, one-sided RMA windows, and a backend-agnostic Flight Recorder. Apple Silicon gains native linear algebra (SVD, QR, Cholesky) plus more Metal kernels. New compiler features include torch.switch, graph-captured while_loop, declarative @dynamic_spec shapes, experimental complex-tensor compilation, Python 3.15/free-threaded wheels, and expanded ROCm 7.14, Intel XPU, and NVIDIA Rubin support.&lt;/p&gt;
&lt;h3 id=&quot;pypy-v800-release&quot;&gt;&lt;a href=&quot;https://pypy.org/posts/2026/09/pypy-v800-release.html&quot;&gt;PyPy v8.0.0 release&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;PyPy v8.0.0 is a major version shipping three interpreters: PyPy2.7, PyPy3.11 (likely the last 3.11 release), and a first-ever “beta”-quality PyPy3.12. The major bump reflects Linux builds moving to manylinux_2_28 (AlmaLinux 8, glibc 2.28, gcc14). Python 3.12 adds cp312-abi3 support by hiding PyPy’s internal &lt;code&gt;ob_pypy_link&lt;/code&gt; field, so CPython limited-ABI wheels should work — though import machinery and pip/uv acceptance remain unfinished. RPython code generation improved via computed gotos, inlining, and source-mapping comments. The internal HPy backend was dropped, and the clang-based pyhdrdump tool was revived.&lt;/p&gt;
&lt;h2 id=&quot;tutorials&quot;&gt;Tutorials&lt;/h2&gt;
&lt;h3 id=&quot;deeplearningais-building-adaptive-ai-agents-by-oracle&quot;&gt;deeplearning.ai’s &lt;a href=&quot;https://www.deeplearning.ai/courses/building-adaptive-ai-agents&quot;&gt;Building Adaptive AI Agents&lt;/a&gt; by Oracle&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;In this course, you’ll work with three adaptation layers. For behavior adaptation, you’ll build a skill induction pipeline that turns the agent’s traces, its conversations, tool calls, errors, and fixes, into reusable skills it applies the next time it sees a similar task, with a human in the loop approving each skill. For knowledge adaptation, you’ll build a code knowledge graph that connects files through imports, function calls, and co-edits in git history, so the agent retrieves context by navigating the structure of the codebase instead of relying on keyword search. For model adaptation, you’ll learn when it makes sense to adapt the model itself with techniques like fine-tuning.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id=&quot;deeplearningais-building-ai-assistants-with-on-device-memory-by-qdrant&quot;&gt;deeplearning.ai’s &lt;a href=&quot;https://www.deeplearning.ai/courses/building-ai-assistants-with-on-device-memory&quot;&gt;Building AI Assistants with On-Device Memory&lt;/a&gt; by Qdrant&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;A cloud-based assistant can remember what it sees, hears, and is told, but only by staying connected and sending that data to a remote server. An assistant that runs on the device builds that memory locally instead. Every note, photo, or recording becomes a vector you can search by meaning, tag with context, and delete on command, all without leaving the device.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id=&quot;realpythons-how-to-write-an-agentsmd-file-for-a-python-project&quot;&gt;RealPython’s &lt;a href=&quot;https://realpython.com/agents-md/&quot;&gt;How to Write an AGENTS.md File for a Python Project&lt;/a&gt;&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;An AGENTS.md file gives your AI coding agent the context it needs to write code that fits your project’s guidelines. It’s a plain Markdown file at your project root where you can pin your Python version, dependency manager, coding conventions, and constraints. In this tutorial, you’ll build one of these files section by section and watch your agent go from sloppy output to clean, idiomatic code.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id=&quot;realpythons-how-to-review-ai-generated-python-code-efficiently&quot;&gt;RealPython’s &lt;a href=&quot;https://realpython.com/review-ai-generated-code/&quot;&gt;How to Review AI-Generated Python Code Efficiently&lt;/a&gt;&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;An AI coding agent writes code faster than any human can read it, which makes you the bottleneck. Your job and responsibilities stay the same, but the volume and speed increase. To manage this, you need to review the code with a plan. You can’t read every line, so focus on the parts where the risk is highest.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;articles&quot;&gt;Articles&lt;/h2&gt;
&lt;h3 id=&quot;speeding-up-a-python-service-with-cinderx-jit-and-static-typing&quot;&gt;&lt;a href=&quot;https://dev.to/deadlovelll/speeding-up-a-python-service-with-cinderx-jit-and-static-typing-53bh&quot;&gt;Speeding Up a Python Service with CinderX: JIT and Static Typing&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;This article examines &lt;code&gt;CinderX&lt;/code&gt;, a CPython extension adding a full JIT compiler, “Static Python” typed subset, parallel garbage collector, and heap immortalization. Unlike CPython 3.14’s cheaper copy-and-patch tier 2, CinderX compiles entire functions through typed HIR/LIR SSA passes into machine code. Benchmarking a real recommendation service shows only typed kernels plus JIT meaningfully helped: throughput rose from 140 to 250 requests/second, p99 fell from 279ms to 13ms. Flags alone changed nothing; NumPy-bound endpoints gained zero. Types without JIT cost 3.4× more.&lt;/p&gt;
&lt;h3 id=&quot;soft-deprecating-rematch&quot;&gt;&lt;a href=&quot;https://hugovk.dev/blog/2026/soft-deprecating-re.match/&quot;&gt;Soft-deprecating re.match()&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;This post from Hugo van Kemenade explains Python 3.15’s soft deprecation of &lt;code&gt;re.match()&lt;/code&gt;, whose start-anchored-but-not-end-anchored behavior surprises many developers. Soft deprecation, introduced by &lt;a href=&quot;https://peps.python.org/pep-0387/&quot;&gt;PEP 387&lt;/a&gt;, is a documentation-only recommendation: no warnings, no removal, and it doesn’t graduate into hard deprecation. The release adds &lt;code&gt;re.prefixmatch()&lt;/code&gt;, an explicit alias for &lt;code&gt;match()&lt;/code&gt;, embodying “explicit is better than implicit.” New code should use &lt;code&gt;prefixmatch()&lt;/code&gt; for prefix matching, &lt;code&gt;re.search()&lt;/code&gt; for unanchored matching, or &lt;code&gt;re.fullmatch()&lt;/code&gt; when both ends must match; existing code supporting older Pythons can keep &lt;code&gt;match()&lt;/code&gt;. The post includes a comparison table and Ruff config to ban &lt;code&gt;re.match()&lt;/code&gt;.&lt;/p&gt;
&lt;h3 id=&quot;introducing-wrapture&quot;&gt;&lt;a href=&quot;https://grahamdumpleton.me/posts/2026/08/introducing-wrapture/&quot;&gt;Introducing wrapture&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;em&gt;Wrapture&lt;/em&gt; is a Python library that wraps real code rather than replacing it, enabling observation, testing and monkey‑patching from a single mechanism. Bindings name target methods, a timeline records calls with arguments, return values and call‑graph nesting, and can be queried in tests or streamed to sinks (printer, JSON, OpenTelemetry). The same bindings also support stubbing, raising, argument/result transforms, and ad‑hoc tracing of running applications without code changes.&lt;/p&gt;
&lt;h3 id=&quot;the-mullet-stack-javascript-in-the-front-python-in-the-back&quot;&gt;&lt;a href=&quot;https://seanhelvey.com/mullet-stack/guide/&quot;&gt;The Mullet Stack: JavaScript in the front, Python in the back.&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;The Mullet Stack guide pairs React + TypeScript frontend (Vite) with FastAPI + Pydantic backend, JavaScript in front, Python in back. It walks through parallel setup, defining/validating an Item model, contrasting TypeScript’s build-time structural typing with Pydantic’s runtime validation, testing with Vitest and pytest, handling CORS, and deriving frontend types from FastAPI’s OpenAPI schema via openapi-typescript to prevent drift, noting alternatives like Django, Next.js, GraphQL, and concluding codegen unifies the stack.&lt;/p&gt;
&lt;h3 id=&quot;making-a-python-interpreter-in-1024-bytes&quot;&gt;&lt;a href=&quot;https://austinhenley.com/blog/python1024.html&quot;&gt;Making a Python interpreter in 1024 bytes&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;The author describes building a Python-like interpreter in just 1024 bytes of C code, targeting a FizzBuzz program with recognizable Python syntax (def, colons, indentation). His first 512-byte attempt failed. Rather than tokenizing/compiling like CPython, he uses global arrays for source and symbols, recursive-descent parsing that executes immediately, the C call stack for indented blocks, and backward jumps re-parsing the source for loops and function calls (even recursion). Heavy “code golf” tricks — single-letter names, ASCII comparisons, bitwise/ternary tricks, C89 implicit ints — shrank a 4800-byte readable version to 1024.&lt;/p&gt;
&lt;h3 id=&quot;how-libraries-run-rust-inside-python-with-pyo3&quot;&gt;&lt;a href=&quot;https://belderbos.dev/blog/how-libraries-run-rust-inside-python/&quot;&gt;How Libraries Run Rust Inside Python (with PyO3)&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;The blog post explains how libraries like Pydantic v2 embed Rust in Python using &lt;code&gt;PyO3&lt;/code&gt;, demonstrated with a hand-rolled JSON parser. Four steps get Rust into Python: write a Rust module, annotate it with &lt;code&gt;#[pyfunction]&lt;/code&gt;/&lt;code&gt;#[pymodule]&lt;/code&gt; macros, compile with &lt;code&gt;maturin&lt;/code&gt; into a shared library, and import it. The parser returns a Rust &lt;code&gt;JsonValue&lt;/code&gt; enum, which Python never sees directly. The key insight: &lt;code&gt;.into_pyobject()&lt;/code&gt; must rebuild the entire tree as native Python objects, so on large documents this conversion can cost more than parsing itself. Errors translate via a &lt;code&gt;From&lt;/code&gt; impl into Python exceptions. For scalar returns, port freely; for large structures, profile the boundary and consider lazy, Rust-backed views.&lt;/p&gt;
&lt;h3 id=&quot;creating-temporary-files-in-python&quot;&gt;&lt;a href=&quot;https://www.pythonmorsels.com/temporary-files/&quot;&gt;Creating temporary files in Python&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;This article by Trey Hunner explains creating temporary files and directories using Python’s standard-library &lt;strong&gt;tempfile&lt;/strong&gt; module. &lt;code&gt;NamedTemporaryFile&lt;/code&gt; creates a file deleted when its &lt;code&gt;with&lt;/code&gt; block exits; use &lt;code&gt;delete=False&lt;/code&gt; (or Python 3.12’s better &lt;code&gt;delete_on_close=False&lt;/code&gt;) to keep the file so other code can use its name, then delete it manually. &lt;code&gt;TemporaryDirectory&lt;/code&gt; offers an auto-deleted folder. &lt;code&gt;TemporaryFile&lt;/code&gt; returns only a file descriptor, not a real filename, so a named file is usually preferable. Prefer pytest’s built-in temp utilities when available; otherwise use &lt;code&gt;NamedTemporaryFile&lt;/code&gt; and &lt;code&gt;TemporaryDirectory&lt;/code&gt;.&lt;/p&gt;
&lt;h3 id=&quot;pytest-plugins-that-actually-change-how-you-test-in-2026&quot;&gt;&lt;a href=&quot;https://dev.to/peytongreen_dev/pytest-plugins-that-actually-change-how-you-test-in-2026-1ecn&quot;&gt;pytest plugins that actually change how you test in 2026&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;In this hands-on guide, the author recommends seven pytest plugins that reshape testing workflows in 2026: &lt;code&gt;pytest-httpx&lt;/code&gt; mocks HTTP at the transport layer and fails tests when registered mocks go unused; &lt;code&gt;pytest-randomly&lt;/code&gt; exposes order dependencies via randomized runs and reproducible seeds; anyio’s built-in plugin simplifies async tests across asyncio and trio backends; &lt;code&gt;syrupy&lt;/code&gt; enables snapshot or golden-file testing; &lt;code&gt;pytest-watch&lt;/code&gt; reruns tests on file save; &lt;code&gt;freezegun&lt;/code&gt; deterministically freezes time, avoiding the outdated pytest-freezegun wrapper; and &lt;code&gt;pytest-cov&lt;/code&gt;, configured with branch coverage, skip-covered reporting and thresholds, reveals real gaps. Together they form a free, no-subscription testing stack.&lt;/p&gt;
&lt;h3 id=&quot;agentic-engineering-in-python-from-vibes-to-evidence&quot;&gt;&lt;a href=&quot;https://realpython.com/agentic-engineering/&quot;&gt;Agentic Engineering in Python: From Vibes to Evidence&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;This article introduces &lt;strong&gt;agentic engineering&lt;/strong&gt; — delegating bounded coding tasks to AI agents while humans retain ownership of intent, constraints, review, and release. Unlike vibe coding, which accepts plausible-looking output, agentic engineering demands evidence. It centers on two loops: a fast agent execution loop and a slower human acceptance loop. Key tools include the eight-level Engineering Evidence Ladder (from code existing to CI integration) and the RECAP review checklist (Role, Edges, Contracts, Assumptions, Proof). The article also warns against implementation-mirroring tests, scope creep, poor audit trails, and excessive agent access.&lt;/p&gt;
&lt;h2 id=&quot;podcasts&quot;&gt;Podcasts&lt;/h2&gt;
&lt;h3 id=&quot;-realpython-podcast&quot;&gt;🐍 RealPython Podcast&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://realpython.com/podcasts/rpp/310/&quot;&gt;Episode 310: Performance Engineering: Profiling and Making Apps Fast by Default&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://realpython.com/podcasts/rpp/311/&quot;&gt;Episode 311: Django Developers Survey Results &amp;amp; Reproducible Python Builds&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://realpython.com/podcasts/rpp/312/&quot;&gt;Episode 312: Navigating AI in Open Source: Insights From Wagtail&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;-python-bytes-podcast&quot;&gt;🍕 Python Bytes Podcast&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://pythonbytes.fm/episodes/show/494/python-wrapture&quot;&gt;#494 Python Wrapture&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://pythonbytes.fm/episodes/show/495/banned&quot;&gt;#495 Banned&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://pythonbytes.fm/episodes/show/496/a-lake-house-in-seattle&quot;&gt;#496 A lake house in Seattle&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://pythonbytes.fm/episodes/show/497/faster-than-light-profiling&quot;&gt;#497 Faster than light profiling&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://pythonbytes.fm/episodes/show/498/a-tiny-episode&quot;&gt;#498 A Tiny Episode&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;-talk-python-to-me&quot;&gt;📣 Talk Python to me&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://talkpython.fm/episodes/show/561/tonio-a-multi-threaded-async-runtime-for-python&quot;&gt;#561: TonIO, a Multi-threaded Async Runtime for Python&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://talkpython.fm/episodes/show/562/ducklake-the-lakehouse-thats-just-sql-and-parquet&quot;&gt;#562: DuckLake: The Lakehouse That’s Just SQL and Parquet&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://talkpython.fm/episodes/show/563/getting-started-with-rust-as-python-devs&quot;&gt;#563: Getting Started with Rust as Python Devs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://talkpython.fm/episodes/show/564/eve-online-departs-for-python-3&quot;&gt;#564: EVE Online Departs for Python 3&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;repositories&quot;&gt;Repositories&lt;/h2&gt;
&lt;h3 id=&quot;bruceeckelthinkinginpython-cc-by-nc-nd-40&quot;&gt;&lt;a href=&quot;https://github.com/BruceEckel/ThinkingInPython&quot;&gt;BruceEckel/ThinkingInPython&lt;/a&gt; (CC BY-NC-ND 4.0)&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;An intermediate-to-advanced book for experienced programmers. It opens with a fast introduction for programmers coming from other languages.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id=&quot;reflex-devxy-apache-20&quot;&gt;&lt;a href=&quot;https://github.com/reflex-dev/xy&quot;&gt;reflex-dev/xy&lt;/a&gt; (Apache 2.0)&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;XY is an extremely fast, interactive, customizable Python charting library for the web, notebooks, and static exports. Charts are composed declaratively or through matplotlib conventions. You can fully customize them with Python, CSS, or Tailwind.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id=&quot;gi0barotonio-bsd-3-clause&quot;&gt;&lt;a href=&quot;https://github.com/gi0baro/tonio&quot;&gt;gi0baro/tonio&lt;/a&gt; (BSD-3-Clause)&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;TonIO is a multi-threaded async runtime for free-threaded Python, built in Rust on top of the mio crate, and inspired by tinyio, trio and tokio. It supports both using &lt;code&gt;yield&lt;/code&gt; and the more canonical &lt;code&gt;async&lt;/code&gt;/&lt;code&gt;await&lt;/code&gt; notations, with the latter being available as part of the &lt;code&gt;tonio.colored&lt;/code&gt; module.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;have-time-for-some-fun&quot;&gt;Have time for some fun?&lt;/h2&gt;
&lt;h3 id=&quot;the-move-to-python-3-begins&quot;&gt;&lt;a href=&quot;https://store.steampowered.com/news/app/8500/view/690892322235222263&quot;&gt;The Move to Python 3 Begins!&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://clan.akamai.steamstatic.com/images//3952729/0d80a9a92ff735bf308ef951f7a43dd82af80a45.jpg&quot; alt=&quot;eve-online-moves-to-python-3&quot;&gt;&lt;/p&gt;
&lt;p&gt;EVE Online has begun migrating its 2.4-million-line Stackless Python codebase from Python 2.7, unchanged since 2010, to Python 3 as part of the EVE Forever initiative. First Singularity-tested changes are now live, with success defined as invisibility to players. Motivations include major Python 3 performance gains, access to modern libraries, debuggers and profilers, and cleaner strings, integers and classes. The staged approach first uses Python-Future to make code parse under both versions — 95.9% already does, with only ~3,300 blocking lines — before tackling ~20,000 lines with changed behavior like division.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;As we wrap up this journey together, I want to take a moment to express my gratitude for your reading. If you’ve enjoyed this issue and would like to help sustain this blog, please consider &lt;a href=&quot;https://github.com/blueberry-py/blog/stargazers&quot;&gt;starring this blog on github&lt;/a&gt;, it would be great motivation for me to keep updating!&lt;/p&gt;
&lt;p&gt;Alright, that concludes the September Edition of “This Month for Pythonistas”. Thank you again for reading my post and I hope you enjoy it or find something useful. Happy coding and see you in October! 👋&lt;/p&gt;
</description><pubDate>Wed, 30 Sep 2026 13:00:00 GMT</pubDate><category>python</category><category>python</category><category>news</category><category>podcast</category><category>AI</category><category>pycon</category><author>Zeyang Lin</author></item><item><title>[PyCon China 2026] It&apos;s Time to Learn (Some) Rust — Starting from a Faster pip install</title><link>https://blueberry-py.github.io/blog/post/pycon-china-2026-lightning-talk/</link><guid isPermaLink="true">https://blueberry-py.github.io/blog/post/pycon-china-2026-lightning-talk/</guid><description>&lt;h1 id=&quot;its-time-to-learn-some-rust--starting-from-a-faster-pip-install&quot;&gt;It’s Time to Learn (Some) Rust — Starting from a Faster pip install&lt;/h1&gt;
&lt;p&gt;Hi everyone! This post is adapted from my lightning talk at PyCon China 2026, “It’s Time to Learn (Some) Rust — Starting from a Faster pip install”. What the subtitle means — I’ll get to that in a moment.&lt;/p&gt;
&lt;p&gt;Whether you’ve noticed it or not, Rust is already part of your daily life as a Python developer. uv, ruff, and pyrefly — Meta’s open-source type checker — this new generation of Python tooling is all written in Rust. And plenty of Python libraries are bringing Rust in as well: pydantic v2 rewrote its validation core in Rust and got 17x faster; polars’ entire engine is Rust; cryptography uses it to harden its core. So Rust stopped being “the language next door” a long time ago — it’s hiding inside the dependencies of every &lt;code&gt;pip install&lt;/code&gt; you run.&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;rust_for_cpython&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;256&quot; height=&quot;256&quot; src=&quot;/blog/_astro/rust_for_cpython.FbDnyHve_ZiW0dN.webp&quot;&gt;&lt;/p&gt;
&lt;p&gt;Even CPython’s own source code may soon include Rust. Look at the timeline: in November 2025, the pre-PEP discussion thread opened; in March 2026, the forked CPython project’s CI builds went green on all platforms; and at PyCon US 2026 in May, the working group unveiled zlib-py as the first planned pilot module — a drop-in alternative to the existing zlib module, with decompression running 3 to 6 times faster. If it lands, every &lt;code&gt;pip install&lt;/code&gt; you run from then on will decompress faster. That’s where the subtitle comes from.&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;page_04&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1210&quot; height=&quot;905&quot; src=&quot;/blog/_astro/page_04.Drzz-mkR_28e7PY.webp&quot;&gt;&lt;/p&gt;
&lt;p&gt;The bad news: the PEP originally planned for July has slipped. The good news: the reason is nothing external — the design details of the internal Rust API simply deserve to be worked through slowly and carefully. It’s a slip, not a stall. Their target is Python 3.16, in 2027.&lt;/p&gt;
&lt;p&gt;So next, let’s see how simple getting started with Rust can be. It’s like the old joke about putting an elephant into a fridge — three steps in total.&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;page_05&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;2424&quot; height=&quot;956&quot; src=&quot;/blog/_astro/page_05.BtTpUSeY_ZGrn3a.webp&quot;&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Step one: install maturin with uv, then run &lt;code&gt;maturin init&lt;/code&gt; — and a Rust project is initialized, ready to be packaged straight into a Python wheel.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img alt=&quot;page_06&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1280&quot; height=&quot;1146&quot; src=&quot;/blog/_astro/page_06.MevrPFly_ZRtnF7.webp&quot;&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Step two: in &lt;code&gt;lib.rs&lt;/code&gt;, write a function that computes the n-th Fibonacci number. Only two macros in this code really matter: &lt;code&gt;#[pyfunction]&lt;/code&gt; exposes the Rust function to Python, and &lt;code&gt;#[pymodule]&lt;/code&gt; registers it as a Python module. The iterative logic in between is essentially the usual way you’d compute Fibonacci in Python — even with no Rust background, you can follow the gist.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img alt=&quot;page_07&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;3260&quot; height=&quot;1136&quot; src=&quot;/blog/_astro/page_07.B7AWKxvt_Z1o4qRb.webp&quot;&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Step three: &lt;code&gt;maturin develop&lt;/code&gt;. That single command compiles the Rust package, builds a wheel, and installs it into your current Python virtual environment — building, packaging, and installation all in one go, an experience nearly identical to a pure-Python toolchain. Then it’s back to Python: &lt;code&gt;import fibonacci_rs&lt;/code&gt;, call &lt;code&gt;fibonacci(88)&lt;/code&gt;, and the 88th Fibonacci number comes right out.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;One sentence to sum it up: Python handles the orchestration; Rust does the computing.&lt;/p&gt;
&lt;p&gt;Now, some of you may feel that computing Fibonacci numbers is a bit too simple — barely a step above Hello World.&lt;/p&gt;
&lt;p&gt;So let’s look at a somewhat more involved example: the Julia set. In short: take every point in the complex plane, repeatedly apply z = z² + c (with c a fixed complex number), and see which points never fly off to infinity (modulus above a threshold).&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;page_08&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1000&quot; height=&quot;1000&quot; src=&quot;/blog/_astro/page_08.Cpb8lXAk_Zi2lU0.webp&quot;&gt;&lt;/p&gt;
&lt;p&gt;In my concrete example, the canvas is 1000×1000 — one million points in total, each iterated at most 300 times. In the figure, the black areas are points that escaped quickly; the brighter the region, the more iterations it took to escape; and the white, snowflake-shaped region in the middle marks points that still hadn’t escaped after 300 iterations. This is a CPU-bound task — precisely the territory where Python is considered relatively weak.&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;page_09&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1280&quot; height=&quot;1148&quot; src=&quot;/blog/_astro/page_09_1.DnnDrnxZ_Z83Aye.webp&quot;&gt;&lt;/p&gt;
&lt;p&gt;We start with the pure-Python version: an honest, plain double loop. A run of line_profiler makes the picture stark: this one function devours 96.1% of the program’s total time, while the two list operations above it — each executed a million times — account for just 1.4% and 1.5% respectively.&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;page_09&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1276&quot; height=&quot;502&quot; src=&quot;/blog/_astro/page_09_2.CspV7Zyu_Px3FP.webp&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;page_10&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1280&quot; height=&quot;1519&quot; src=&quot;/blog/_astro/page_10_1.DC8rYGFU_Z2pTsi9.webp&quot;&gt;&lt;/p&gt;
&lt;p&gt;Still using maturin, we write a Rust function, &lt;code&gt;calculate_z_serial&lt;/code&gt;, that mirrors the pure-Python function roughly one-to-one in logic.&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;page_10&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1280&quot; height=&quot;799&quot; src=&quot;/blog/_astro/page_10_2.BwIqRbyN_PAxnF.webp&quot;&gt;&lt;/p&gt;
&lt;p&gt;Once it’s written, the Python script needs exactly one added import line and one changed function name — that’s it. From the caller’s point of view, the function signature and behavior are completely unchanged.&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;page_11&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1245&quot; height=&quot;477&quot; src=&quot;/blog/_astro/page_11_1.BO-Yf-kE_Z7JVhk.webp&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now we run line_profiler again: the function’s share of runtime drops from 96% straight down to 18% — the biggest time sinks are now Python’s for loops and list operations — and the script’s total runtime falls from 3.008 seconds to 0.144 seconds, a speedup of more than 20x. And that’s with a faithful serial port of the original; bring in Rayon for multithreaded parallelism, and the speedup tops 100x.&lt;/p&gt;
&lt;p&gt;If, after these two examples, you’d like to try building something in Rust, it’s worth first understanding the four mindset hurdles that lie between writing Python and writing Rust.&lt;/p&gt;
&lt;p&gt;First, from recommended explicitness to enforced explicitness: Python’s “explicit is better than implicit” is advice; Rust makes it law — mutating data requires declaring &lt;code&gt;mut&lt;/code&gt;, &lt;code&gt;match&lt;/code&gt; must be exhaustive, and if you don’t comply, it refuses to compile.&lt;/p&gt;
&lt;p&gt;Second, from referencing data to owning it: in Python, assignment is sticking a name tag on an object — share it freely, and the GC cleans up. In Rust, every value has exactly one owner, and whether it’s moved or borrowed is checked with total clarity at compile time.&lt;/p&gt;
&lt;p&gt;Third, from EAFP to LBYL — from “easier to ask forgiveness than permission” to “look before you leap”: Rust writes “can this fail?” into the types. With &lt;code&gt;Option&lt;/code&gt; and &lt;code&gt;Result&lt;/code&gt;, you can’t touch the value without checking it first.&lt;/p&gt;
&lt;p&gt;Fourth, from the GIL to real concurrency: data races become compile errors — if your program compiles, it is guaranteed free of data races.&lt;/p&gt;
&lt;p&gt;Here’s a reference roadmap for learning Rust, in four stages.&lt;/p&gt;
&lt;p&gt;Stage one, syntax bridging — with a Python foundation, you’ll get up to speed quickly.&lt;/p&gt;
&lt;p&gt;Stage two is the climb: ownership, borrowing, error handling, traits, closures — possibly the most painful stretch of the entire journey, but push through it and the change is qualitative.&lt;/p&gt;
&lt;p&gt;Stage three, concurrency. &lt;code&gt;std::thread&lt;/code&gt; has you writing real multithreaded code; shared mutable state gets the standard &lt;code&gt;Arc&lt;/code&gt;-plus-&lt;code&gt;Mutex&lt;/code&gt; combo; and whether data may cross thread boundaries is policed by the compiler through &lt;code&gt;Send&lt;/code&gt;/&lt;code&gt;Sync&lt;/code&gt;. Want to keep it easy? Rayon turns a loop into data-parallel execution with one line; for I/O-bound concurrency, there’s tokio, the async runtime.&lt;/p&gt;
&lt;p&gt;Last and most important: hands-on practice. Use maturin to rewrite a hot function from your own project — profile to locate it, test for parity, benchmark to compare — closing the loop.&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;page_14&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1242&quot; height=&quot;860&quot; src=&quot;/blog/_astro/page_14_1.B8a55GVO_oFbvv.webp&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;page_14&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1073&quot; height=&quot;753&quot; src=&quot;/blog/_astro/page_14_2.IRjiGYt9_Z2hghQ4.webp&quot;&gt;&lt;/p&gt;
&lt;p&gt;As we all know, writing code while you learn is one of the most effective ways to surface problems and consolidate knowledge. These are the three tools I found most helpful as a beginner: Rustlings — around ninety bite-sized exercises straight from the official project, a few minutes each, running locally; and Codewars and LeetCode, which both let you solve problems in Rust directly. Re-solving problems you previously did in Python — this time in Rust — makes the differences between the two languages far easier to internalize.&lt;/p&gt;
&lt;p&gt;So does this mean all your Python code should become Rust? Before you start, remember: profiling first — confirm the bottleneck before talking about a rewrite. Don’t go on a hunch.&lt;/p&gt;
&lt;p&gt;Good candidates for a rewrite: CPU-bound modules with clear boundaries that process untrusted input; I/O-bound code and glue code can often stay as they are.&lt;/p&gt;
&lt;p&gt;Before you dive in, also look at the alternatives: a better algorithm, a free-threaded build, an existing third-party library — or Cython, Numba, or GPU acceleration. Any of these may be the better deal.&lt;/p&gt;
&lt;p&gt;Of course, real-world decisions are more complicated — team skills and migration cost come into play, among other factors. And remember this line: Rust is not a “press for speed” button — speed has always been the reward for choosing the right problem.&lt;/p&gt;
&lt;p&gt;If you still feel Rust is too hard to learn, consider it from another angle: even if you never write production-grade Rust, the time is not wasted. Explicit types, ownership, explicit error handling, exhaustive matching — these habits of mind transfer back and make your Python more rigorous.&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;page_17&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;720&quot; height=&quot;393&quot; src=&quot;/blog/_astro/page_17.DbwOY4EL_ZDKaP8.webp&quot;&gt;&lt;/p&gt;
&lt;p&gt;OK, to wrap up. Rust is not Python’s rival — it’s Python’s partner: Python for orchestration, Rust for speed and safety. And learning Rust is more than an investment in personal skills: judging by the progress of Rust for CPython, it may be your ticket to contributing to CPython. The next Rust for CPython contributor might well be you, reading this article right now.&lt;/p&gt;
&lt;p&gt;Of course, this talk would not exist without the valuable material left behind by pioneers in the community — Microsoft’s Rust for Python Programmers course, plus several excellent talks and articles, all listed below. My thanks to all of them.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Microsoft — &lt;a href=&quot;https://microsoft.github.io/RustTraining/python-book/&quot;&gt;&lt;em&gt;Rust for Python Programmers&lt;/em&gt;&lt;/a&gt; (open course)&lt;/li&gt;
&lt;li&gt;Daroc Alden — &lt;a href=&quot;https://lwn.net/Articles/1046933/&quot;&gt;“Eventual Rust in CPython”&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Bob Belderbos — &lt;a href=&quot;https://belderbos.dev/blog/rust-made-me-a-better-python-developer/&quot;&gt;“Learning Rust Made Me a Better Python Developer”&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Daniel Szoke — &lt;a href=&quot;https://www.youtube.com/watch?v=lkSxUIdP6Ds&quot;&gt;“Why You, a Python Developer, Should Learn Rust”&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Emma Smith — &lt;a href=&quot;https://www.youtube.com/watch?v=42kibVnUHYE&quot;&gt;“Rust for CPython: Making Python Safer and More Robust for Everyone”&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Micha Gorelick &amp;amp; Ian Ozsvald — &lt;a href=&quot;https://www.oreilly.com/library/view/high-performance-python/9781492055013/&quot;&gt;&lt;em&gt;High Performance Python&lt;/em&gt;, 2nd Edition&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;That’s the whole talk. The demo code is on &lt;a href=&quot;https://github.com/linzeyang/pycon-china-2026&quot;&gt;GitHub&lt;/a&gt;, and if you’re interested, you’re welcome to find me on any of these platforms to keep the conversation going. Thanks for reading!&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;GitHub: &lt;a href=&quot;https://github.com/linzeyang&quot;&gt;@linzeyang&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Bluesky: &lt;a href=&quot;https://bsky.app/profile/linzeyang.bsky.social&quot;&gt;@linzeyang.bsky.social&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Mastodon: &lt;a href=&quot;https://mastodon.online/@zeyanglin&quot;&gt;@zeyanglin@mastodon.online&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description><pubDate>Sat, 05 Sep 2026 07:10:00 GMT</pubDate><category>python</category><category>rust</category><category>python</category><category>rust</category><category>pycon</category><author>Zeyang Lin</author></item><item><title>This Month for Pythonistas - August 2026</title><link>https://blueberry-py.github.io/blog/post/this-month-for-pythonistas-2026-08/</link><guid isPermaLink="true">https://blueberry-py.github.io/blog/post/this-month-for-pythonistas-2026-08/</guid><description>&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;python&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;from&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; datetime &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;import&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; date&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;print&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(date.today().year, date.today().month)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# 2026 8&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img alt=&quot;issue-2026-08&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1280&quot; height=&quot;719&quot; src=&quot;/blog/_astro/splash.CsOYb6_N_ZFQBBP.webp&quot;&gt;&lt;/p&gt;
&lt;p&gt;Welcome back Pythonistas! This is the August 2026 issue of “This Month for Pythonistas”, bringing you curated Python news, tutorials, articles, podcasts, repositories and community highlights for this month.&lt;/p&gt;
&lt;p&gt;Before we continue, please note that this blog is synced across the following platforms:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://blueberry-py.github.io/blog/post/this-month-for-pythonistas-2026-08/&quot;&gt;Github Pages&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://blueberrypy.netlify.app/post/this-month-for-pythonistas-2026-08/&quot;&gt;Netlify&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://blueberrypy.onrender.com/post/this-month-for-pythonistas-2026-08/&quot;&gt;Render&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://blueberrypy-blog.vercel.app/post/this-month-for-pythonistas-2026-08/&quot;&gt;Vercel&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://blog.blueberrypy.workers.dev/post/this-month-for-pythonistas-2026-08/&quot;&gt;Cloudflare&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Ready? Let’s get started!&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&quot;events--social&quot;&gt;Events &amp;amp; Social&lt;/h2&gt;
&lt;h3 id=&quot;djangocon-us-2026&quot;&gt;&lt;a href=&quot;https://2026.djangocon.us/&quot;&gt;DjangoCon US 2026&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://2026.djangocon.us/assets/img/2026/logo-styled.svg&quot; alt=&quot;djangocon-us-2026&quot;&gt;&lt;/p&gt;
&lt;p&gt;DjangoCon US 2026 took place in Chicago at the voco Chicago Downtown from August 24–28, 2026. It featured in-depth technical talks, hands-on workshops, Open Spaces, and community sprints. Key session topics spanned web development, Django 6.x features, API integration, deployment, security, testing, HTMX, and AI integration within the Django ecosystem. Attendees also engaged in networking, hallway discussions, and collaborative open-source contributions throughout the week.&lt;/p&gt;
&lt;h3 id=&quot;django-is-moving-to-an-annual-release-cycle&quot;&gt;&lt;a href=&quot;https://www.djangoproject.com/weblog/2026/aug/10/annual-release-cycle/&quot;&gt;Django is moving to an annual release cycle&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Django’s Steering Council accepted &lt;em&gt;DEP 20&lt;/em&gt; to move Django to an &lt;em&gt;annual release cycle&lt;/em&gt; starting &lt;strong&gt;January 2028&lt;/strong&gt;, with one feature release per year carrying three years of LTS-level support and version numbers reflecting the release year (e.g., Django 2028, 2029). Every release becomes an LTS with three years of support (one year mainstream bugfixes, two years security fixes), retiring the old “LTS” label. The new cycle aligns better with Python’s annual October releases, with each Django version supporting the three latest Python versions. API stability and deprecation policies remain unchanged, and the transition begins with Django 6.1 (Aug 2026) and 6.2 LTS (Apr 2027) as the final releases under the old cycle.&lt;/p&gt;
&lt;h3 id=&quot;qwen38-max-a-new-bar-for-coding-and-cowork&quot;&gt;&lt;a href=&quot;https://qwen.ai/blog?id=qwen3.8&quot;&gt;Qwen3.8-Max: A New Bar for Coding and Cowork&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Qwen3.8-Max is officially released as the most capable model in the Qwen family, scaling to 2.4 trillion parameters and delivering comprehensive improvements across coding, work, research, and long-horizon tasks. It is the first open-weight Qwen-Max-class model, with weights released on HuggingFace and ModelScope. Key capabilities include autonomous coding (building a self-evolving harness over 10+ days), reproducing and improving research papers (beating the original by +2.7 points on AIME24), and outperforming 87% of human teams in the WWW2025 challenge. It also excels at real-world work tasks, long-horizon planning (autonomous chip design, e-commerce operations), and multimodal agent tasks with visual feedback loops.&lt;/p&gt;
&lt;h3 id=&quot;glm-53-frontier-coding-with-emergent-cyber-capabilities&quot;&gt;&lt;a href=&quot;https://z.ai/blog/glm-5.3&quot;&gt;GLM-5.3: Frontier Coding with Emergent Cyber Capabilities&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;GLM-5.3 is a frontier coding model that uses the same base as GLM-5.2 but achieves major gains through scaled post-training alone. It is the most capable open-weights model for coding — 50% better than GLM-5.2 on Z.ai’s Code Bench and state-of-the-art on Terminal Bench 3.0 and Agents’ Last Exam — while also showing emergent cyber capabilities, scoring best on CyberGym and more than doubling GLM-5.2 on exploitation benchmarks. The model identified 2,436 vulnerabilities across 269 real-world projects, and its open-source weights will be released in two weeks.&lt;/p&gt;
&lt;h3 id=&quot;introducing-gemini-37-flash&quot;&gt;&lt;a href=&quot;https://blog.google/innovation-and-ai/models-and-research/gemini-models/introducing-gemini-3-7-flash/&quot;&gt;Introducing Gemini 3.7 Flash&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Gemini 3.7 Flash is Google’s most intelligent workhorse model for coding and agents, released three weeks after Gemini 3.6 Flash based on developer feedback. It delivers substantial improvements in software engineering, knowledge work, and web development at half the original 3.6 Flash cost. The model achieves strong gains in coding benchmarks (FrontierCode 1.1: 43.6% vs 34.4%; DeepSWE v1.1: 65.3% vs 49.0%), outperforms 3.6 Flash on WebDev Arena (Elo 1588 vs 1538), and excels in knowledge-dense fields like finance and law (GDP.pdf: 34.0% vs 22.0%).&lt;/p&gt;
&lt;h2 id=&quot;new-versions&quot;&gt;New Versions&lt;/h2&gt;
&lt;h3 id=&quot;python-3150-candidate-1-is-here&quot;&gt;&lt;a href=&quot;https://blog.python.org/2026/08/python-3150-rc1/&quot;&gt;Python 3.15.0 candidate 1 is here!&lt;/a&gt;&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;This is the first of two planned candidate releases. Entering the release candidate phase, only reviewed code changes which are clear bug fixes are allowed between this release candidate and the final release. The next release of Python 3.15 will be 3.15.0rc2, scheduled for 2026-09-01.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;The source tarballs and binary distributions can be downloaded &lt;a href=&quot;https://www.python.org/downloads/release/python-3150rc1/&quot;&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&quot;python-3147-and-31315-are-now-available&quot;&gt;&lt;a href=&quot;https://blog.python.org/2026/08/python-3147-31315/&quot;&gt;Python 3.14.7 and 3.13.15 are now available!&lt;/a&gt;&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;Python 3.14.7 is the seventh maintenance release of 3.14, containing around 499 bugfixes, build improvements and documentation changes from 86 contributors since 3.14.6. Python 3.13.15 is the fifteenth maintenance release of 3.13, containing around 400 bugfixes, build improvements and documentation changes since 3.13.14.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id=&quot;python-31214-31116-and-31021-are-now-available&quot;&gt;&lt;a href=&quot;https://blog.python.org/2026/08/python-31214-31116-31021/&quot;&gt;Python 3.12.14, 3.11.16 and 3.10.21 are now available!&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;These are new security releases for 3.12, 3.11 and 3.10, respectively, addressing numerous security vulnerabilities.&lt;/p&gt;
&lt;h2 id=&quot;tutorials&quot;&gt;Tutorials&lt;/h2&gt;
&lt;h3 id=&quot;deeplearningais-ai-coding-workflows-from-cloud-to-local-by-paul-everitt&quot;&gt;deeplearning.ai’s &lt;a href=&quot;https://www.deeplearning.ai/courses/ai-coding-workflows-from-cloud-to-local&quot;&gt;AI Coding Workflows: From Cloud to Local&lt;/a&gt; by Paul Everitt&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;You’ll use the same Python app to put each setup to the test: first from a Claude Code baseline, then with subagents that break the job into focused tasks, then with a cheaper model doing the routine work. From there you’ll switch to an open-source coding agent, connect it to different inference providers, and finally run models locally.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id=&quot;realpythons-how-to-integrate-opentelemetry-with-a-fastapi-app&quot;&gt;RealPython’s &lt;a href=&quot;https://realpython.com/fastapi-opentelemetry/&quot;&gt;How to Integrate OpenTelemetry With a FastAPI App&lt;/a&gt;&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;Adding observability to your applications is crucial for diagnosing issues in production. In this tutorial, you’ll learn how to integrate OpenTelemetry — an open-source observability framework — into a FastAPI application. After following along, you’ll be able to instrument FastAPI with OpenTelemetry to export traces and correlate them with your application logs, allowing you to explore your telemetry in a dedicated dashboard.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;articles&quot;&gt;Articles&lt;/h2&gt;
&lt;h3 id=&quot;why-the-hardest-concept-for-python-devs-is-concurrency-asyncio-vs-threading-vs-multiprocessing&quot;&gt;&lt;a href=&quot;https://oedokumaci.com/blog/posts/python-concurrency/&quot;&gt;Why the Hardest Concept for Python Devs Is Concurrency: asyncio vs threading vs multiprocessing&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;This article explains why concurrency is one of the hardest concepts for Python developers, covering how operating systems manage processes and threads, the role of the kernel and system calls, and how CPUs execute code in user and kernel modes. It explores Python’s Global Interpreter Lock (GIL), which prevents multiple threads from running Python bytecode simultaneously, and compares three concurrency approaches: &lt;strong&gt;asyncio&lt;/strong&gt; (cooperative multitasking via an event loop for I/O-bound work), &lt;strong&gt;threading&lt;/strong&gt; (preemptive multitasking for I/O-bound tasks that release the GIL), and &lt;strong&gt;multiprocessing&lt;/strong&gt; (true parallelism for CPU-bound work). The article also discusses CPU vs. GPU specialization, Amdahl’s Law, profiling tools like Python 3.15’s &lt;em&gt;Tachyon&lt;/em&gt; sampler, and practical guidance for choosing the right concurrency model in real applications like FastAPI.&lt;/p&gt;
&lt;h3 id=&quot;scaling-numpy-on-free-threaded-python&quot;&gt;&lt;a href=&quot;https://labs.quansight.org/blog/scaling-numpy-on-free-threaded-python&quot;&gt;Scaling NumPy on Free-Threaded Python&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Scaling NumPy on free-threaded Python required eliminating multi-threaded bottlenecks that prevented linear scaling across cores. Profiling revealed five key issues: lock contention in tracemalloc (fixed with atomic operations), lock contention in the ufunc dispatch cache (replaced with a lock-free concurrent hash map), reference count contention on global PyCapsule objects (resolved by making the default memory handler immortal), module attribute lookup contention (enabled bytecode specialization for &lt;code&gt;__getattr__&lt;/code&gt; modules), and memory allocator contention (routed NumPy allocations through CPython’s raw allocator backed by mimalloc). Coordinated changes across both NumPy and CPython yielded dramatic results — multi-threaded performance at 32 workers improved from ~44 seconds to ~1.5 seconds, outperforming multi-processing by 4x.&lt;/p&gt;
&lt;h3 id=&quot;running-subprocesses-in-python&quot;&gt;&lt;a href=&quot;https://www.pythonmorsels.com/running-subprocesses-in-python/&quot;&gt;Running subprocesses in Python&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;The article explains how to run subprocesses in Python using the &lt;code&gt;subprocess&lt;/code&gt; module, primarily the &lt;code&gt;subprocess.run()&lt;/code&gt; function. It covers launching external programs by passing commands as a list of arguments or a string with &lt;code&gt;shell=True&lt;/code&gt;, capturing subprocess output using &lt;code&gt;capture_output=True&lt;/code&gt;, decoding bytes to text with &lt;code&gt;text=True&lt;/code&gt;, checking the &lt;code&gt;returncode&lt;/code&gt; to detect errors, and using &lt;code&gt;check=True&lt;/code&gt; to automatically raise &lt;code&gt;CalledProcessError&lt;/code&gt; exceptions on non-zero exit codes. The article also recommends creating custom wrapper functions around &lt;code&gt;subprocess.run()&lt;/code&gt; to reduce repetitive keyword arguments when running multiple subprocesses in a script.&lt;/p&gt;
&lt;h3 id=&quot;two-lines-of-python-that-segfault-the-interpreter&quot;&gt;&lt;a href=&quot;https://deadlovelll.github.io/2026-08-10-conditional-annotations-set-add-crash/&quot;&gt;Two lines of Python that segfault the interpreter&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;This post describes a CPython crash caused by a type confusion in the &lt;code&gt;SET_ADD&lt;/code&gt; bytecode opcode, triggered by &lt;a href=&quot;https://peps.python.org/pep-0749&quot;&gt;PEP 749&lt;/a&gt;’s conditional annotations feature. PEP 749 introduced lazy annotation evaluation, requiring a &lt;code&gt;__conditional_annotations__&lt;/code&gt; set to track executed annotations — but this set is an ordinary module global that user code can rebind. When reassigned to an &lt;code&gt;int&lt;/code&gt;, &lt;code&gt;SET_ADD&lt;/code&gt; (which skips type checks, assuming its operand is a stack-allocated set) casts the int to a &lt;code&gt;PySetObject*&lt;/code&gt; and dereferences invalid memory, causing a segfault with no traceback. The fix differs by branch: on &lt;code&gt;main&lt;/code&gt;, a dedicated &lt;code&gt;add_conditional_annotation&lt;/code&gt; intrinsic with its own type check replaces &lt;code&gt;SET_ADD&lt;/code&gt; for annotations; on released 3.14/3.15 branches, &lt;code&gt;SET_ADD&lt;/code&gt; was patched to verify the operand is actually a set. The author notes that implicit compiler guarantees are fragile contracts — a safe invariant for one caller can silently become a vulnerability when a new caller appears.&lt;/p&gt;
&lt;h3 id=&quot;when-strlower-is-a-security-vulnerability-in-python&quot;&gt;&lt;a href=&quot;https://sethmlarson.dev/when-str-lower-is-a-security-vulnerability&quot;&gt;When str.lower() is a security vulnerability in Python&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;This post from Seth Larson describes a Python security vulnerability (&lt;strong&gt;CVE-2026-17084&lt;/strong&gt;) involving &lt;code&gt;str.lower()&lt;/code&gt;. The IDNA 2003 standard (&lt;code&gt;str.encode(&quot;idna&quot;)&lt;/code&gt;), built on &lt;code&gt;StringPrep&lt;/code&gt; from RFCs 3491/3454, requires case-folding per Unicode 3.2.0 tables B.2/B.3. However, Python’s implementation calls &lt;code&gt;str.lower()&lt;/code&gt;, which uses whatever newer Unicode version ships with the interpreter, causing certain characters (like Cherokee U+13A0) to encode differently than the specification requires — a divergence exploitable as a vulnerability. The fix added exception mappings emulating Unicode 3.2.0 behavior; credits go to Bitshift, Stan Ulbrych, Marc-Andre Lemburg, and Petr Viktorin.&lt;/p&gt;
&lt;h3 id=&quot;binary-search-in-python-with-bisect&quot;&gt;&lt;a href=&quot;https://www.pythonmorsels.com/binary-search/&quot;&gt;Binary search in Python with bisect&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Python’s &lt;code&gt;bisect&lt;/code&gt; module provides built-in binary search for sorted lists, offering O(log n) performance far faster than linear iteration. The article explains binary search conceptually through a number-guessing game, clarifies that “bisect” means cutting into two pieces, and details the module’s core functions (&lt;code&gt;bisect_left&lt;/code&gt;, &lt;code&gt;bisect_right&lt;/code&gt;, &lt;code&gt;insort_left&lt;/code&gt;, &lt;code&gt;insort_right&lt;/code&gt;) and their aliases. It covers practical recipes like finding exact matches, counting duplicates, locating first/last matches, and finding the closest value, while emphasizing that binary search excels at inexact or range-based lookups that sets and dictionaries cannot handle efficiently.&lt;/p&gt;
&lt;h3 id=&quot;celery-from-first-task-to-advanced-recipes&quot;&gt;&lt;a href=&quot;https://sgolev.github.io/blog/2026-07-28-celery-recipes/&quot;&gt;Celery: from first task to advanced recipes&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Celery is a mature distributed task queue system for Python that enables decoupled producer-consumer integration. This article covers its core concepts — brokers and backends, task definition, and worker configuration — along with practical recipes: running tasks from the command line and code (including remote calls via &lt;code&gt;send_task&lt;/code&gt;), using Canvas signatures and groups for batch execution, configuring queues, setting time limits (&lt;code&gt;timeout&lt;/code&gt;, &lt;code&gt;expires&lt;/code&gt;, soft/hard limits), implementing retry logic for transient errors, preventing parallel execution with Redis locks, and awaiting task results asynchronously.&lt;/p&gt;
&lt;h3 id=&quot;one-agent-every-surface-how-we-built-the-kiro-agent-harness&quot;&gt;&lt;a href=&quot;https://kiro.dev/blog/one-agent/&quot;&gt;One agent, every surface: how we built the Kiro agent harness&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Kiro consolidated three separate agent harnesses (IDE in TypeScript, CLI in Rust, web in Python) into a single unified agent harness running as a standalone server process. Previously, each client had its own agent with incompatible session formats, tools, and permissions, making cross-client session continuity impossible. The new harness communicates with all clients via the Agent Client Protocol (ACP), extended with Kiro-specific features like live steering and rich permissions. This eliminates duplicated effort, ensures consistent behavior across surfaces, and enables features like spec-driven development, custom agents, and hooks to work identically everywhere.&lt;/p&gt;
&lt;h3 id=&quot;building-an-advanced-agentic-harness&quot;&gt;&lt;a href=&quot;https://data4sci.com/blog/building-an-advanced-agentic-harness&quot;&gt;Building an Advanced Agentic Harness&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;The article explains how to upgrade a basic agentic harness into a production-grade system by composing small, testable primitives rather than hiding mechanics behind frameworks. It uses an air campaign analogy: just as real operations add mission planners, parallel squadrons, fuel budgets, flight recorders, and after-action reviews around a pilot, production agents need structure around a single LLM call. Key primitives include typed tools with Pydantic validation, a DAG-based planner for parallel execution, tiered memory, a verification hierarchy, multi-dimensional budgeting, and a tracer. Each primitive addresses a specific failure mode of naive agents (invalid arguments, silent errors, context bloat, cost runaway).&lt;/p&gt;
&lt;h3 id=&quot;designing-loops-for-production-grade-work&quot;&gt;&lt;a href=&quot;https://www.liquid.ai/blog/agent-loops&quot;&gt;Designing Loops for Production-Grade Work&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Liquid AI’s blog describes a late-2025 experiment testing whether coding agents could autonomously solve a production-grade problem from scratch. Two agents — Claude Opus 4.5 and Codex with GPT-5.2 — were tasked with building toktoktok, an open-source BPE tokenizer trainer capable of processing trillions of tokens on a single machine. Neither succeeded zero-shot on toy data, but through iterative loops against real production data and an external verification harness (checking tiktoken/Hugging Face compatibility), Claude Opus 4.5 delivered a working solution. Key lessons: write short, constraint-focused specifications leveraging agents’ multi-domain expertise, and design loops that converge against real-world constraints rather than self-reported tests.&lt;/p&gt;
&lt;h3 id=&quot;the-shapes-of-agent-memory--files-stores-and-experience&quot;&gt;&lt;a href=&quot;https://pinglin.tw/blog/the-shapes-of-agent-memory/&quot;&gt;The Shapes of Agent Memory – Files, Stores, and Experience&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;This article compares three architectures for agent memory that persists across sessions: &lt;strong&gt;files&lt;/strong&gt;, &lt;strong&gt;structured stores&lt;/strong&gt;, and &lt;strong&gt;trained experience&lt;/strong&gt;.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;File-based memory&lt;/strong&gt; (used by Claude Code, Cursor, Cline) lets the model curate plain markdown files — a small index plus topic files — and relies on text search for retrieval. It’s easy to ship but limited in scalability.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Structured memory&lt;/strong&gt; (mem0, Letta, Zep) mines every conversation turn into atomic, embedded facts stored in a vector index and temporal graph, retrieved via ranked similarity. It splits into two lineages: &lt;em&gt;place-organized&lt;/em&gt; (MemPalace, files by location) and &lt;em&gt;entity-and-time&lt;/em&gt; (Zep’s Graphiti, a bi-temporal knowledge graph).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Experience-based memory&lt;/strong&gt; (MemHarness, the state of the art) banks episodes but trains the model’s retrieval and usage of them directly into its weights via reinforcement learning.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Key findings:&lt;/strong&gt; The structured store beat files on both accuracy and token cost; files win when memory is small or when the right answer is “I don’t know.” A hybrid associative graph outperformed a plain vector index on long-haystack benchmarks, though no single benchmark ranks memory systems fairly. On agentic benchmarks, retrieved experience only helped weak actors with headroom; where reasoning alone suffices, a frontier model matched the trained system without memory, and where reward required practice, the trained policy stood alone.&lt;/p&gt;
&lt;h3 id=&quot;agent-memory-as-a-moat-how-context-compounds&quot;&gt;&lt;a href=&quot;https://redis.io/blog/compounding-context-memory-as-the-moat/&quot;&gt;Agent memory as a moat: how context compounds&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;This Redis blog argues that because LLMs are inherently stateless, persistent agent memory — storing facts, experiences, and procedures across sessions — transforms static RAG retrieval into a compounding learning system via a write-manage-read loop. Accurate, well-governed memory grows more valuable with use, creating switching costs and a defensible moat. But governance is essential: scoped namespaces per tenant, retention policies preventing context rot (poisoning, distraction, confusion, clash), and strict access controls against memory injection attacks. Redis supplies fast in-memory infrastructure — vector search, semantic caching, and managed Agent Memory — turning governed accumulated context into a durable competitive advantage.&lt;/p&gt;
&lt;h3 id=&quot;introducing-agent-plugins&quot;&gt;&lt;a href=&quot;https://vercel.com/blog/introducing-agent-plugins&quot;&gt;Introducing Agent Plugins&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Agent Plugins&lt;/strong&gt; 1.0.0 is an open, vendor-neutral standard for packaging AI agent extensions into distributable plugins. It provides a common format using a &lt;code&gt;plugin.json&lt;/code&gt; manifest and fixed directory structure for Agent Skills and MCP servers, allowing authors to package components once for use across multiple clients. Version 1 focuses on these two component types, leaving other features like commands and hooks to clients via a namespaced extension mechanism. Initiated by Vercel with AWS, Anysphere, GitHub, Microsoft, and OpenAI, it is supported across ChatGPT, Codex, Cursor, GitHub Copilot, Kiro, and VS Code, and is governed as an open, multi-vendor project.&lt;/p&gt;
&lt;h3 id=&quot;software-engineering-fundamentals-matter-more-than-ever&quot;&gt;&lt;a href=&quot;https://rhonabwy.com/2026/08/15/software-engineering-fundamentals-matter-more-than-ever/&quot;&gt;Software Engineering fundamentals matter more than ever&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Despite AI hype, software engineering fundamentals matter more than ever. The author argues that while agentic harnesses and LLMs can now generate working, testable code, they still fall short on the deeper craft: building software that is debuggable, maintainable, layered, and composable. LLMs predict rather than reason, making them vulnerable to prompt injection and poor judgment. The key skill remains carefully choosing abstractions, managing cognitive load, and thoughtfully designing how software components fit together over the long term. The best engineers aren’t those boasting about AI’s power, but those using it as a tool while applying timeless principles of good software craftsmanship.&lt;/p&gt;
&lt;h3 id=&quot;2x-not-10x-coding-with-llms-in-2026&quot;&gt;&lt;a href=&quot;https://obryant.dev/p/2x-not-10x/&quot;&gt;2x, not 10x: coding with LLMs in 2026&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;The article argues that LLMs have improved coding productivity by roughly 2x, not 10x, because they excel at producing code that meets verifiable acceptance criteria but still struggle with higher-level questions like code maintainability and documentation quality. The author proposes a “staircase hypothesis”: once LLMs became reliable enough for automated feedback loops, further improvements yield diminishing returns — like being tall enough to climb stairs one step at a time versus two. LLMs are best used for rough drafts, with the author iterating heavily afterward, noting that a working implementation is now only about 20% done rather than 80%. Future gains will likely come from industry retooling around current capabilities rather than model improvements alone.&lt;/p&gt;
&lt;h2 id=&quot;podcasts&quot;&gt;Podcasts&lt;/h2&gt;
&lt;h3 id=&quot;-realpython-podcast&quot;&gt;🐍 RealPython Podcast&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://realpython.com/podcasts/rpp/306/&quot;&gt;Episode 306: Programmatically Developing LLM Prompts With DSPy&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://realpython.com/podcasts/rpp/307/&quot;&gt;Episode 307: Improving NumPy Performance on Free-Threaded Python&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://realpython.com/podcasts/rpp/308/&quot;&gt;Episode 308: Navigating Silent Failures in AI: Strategies for Effective Oversight&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://realpython.com/podcasts/rpp/309/&quot;&gt;Episode 309: Exploring Complex Systems &amp;amp; Maintainable Data Science Pipelines&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;-python-bytes-podcast&quot;&gt;🍕 Python Bytes Podcast&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://pythonbytes.fm/episodes/show/491/feeling-judged&quot;&gt;#491 Feeling Judged&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://pythonbytes.fm/episodes/show/492/codeberg-puts-head-in-sand&quot;&gt;#492 Codeberg Puts Head in Sand&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://pythonbytes.fm/episodes/show/493/calver-and-lts&quot;&gt;#493 CalVer and LTS&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;-talk-python-to-me&quot;&gt;📣 Talk Python to me&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://talkpython.fm/episodes/show/557/security-of-everything-at-pycon-2026&quot;&gt;#557: Security of everything at PyCon 2026&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://talkpython.fm/episodes/show/558/hyper-personal-software-with-python&quot;&gt;#558: Hyper-Personal Software with Python&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://talkpython.fm/episodes/show/559/12-things-you-should-and-shouldnt-do-in-aws&quot;&gt;#559: 12 Things You Should (and Shouldn’t) Do in AWS&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://talkpython.fm/episodes/show/560/building-a-research-os-from-django-to-30-000-samples&quot;&gt;#560: Building a Research OS: From Django to 30,000 Samples&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;repositories&quot;&gt;Repositories&lt;/h2&gt;
&lt;h3 id=&quot;ryancodraiturbovec-mit&quot;&gt;&lt;a href=&quot;https://github.com/RyanCodrai/turbovec&quot;&gt;RyanCodrai/turbovec&lt;/a&gt; (MIT)&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;code&gt;turbovec&lt;/code&gt; is a Rust vector index with Python bindings, built on Google Research’s TurboQuant algorithm — a data-oblivious quantizer with near-optimal distortion and no separate training phase.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;have-time-for-some-fun&quot;&gt;Have time for some fun?&lt;/h2&gt;
&lt;h3 id=&quot;gamescom-2026&quot;&gt;Gamescom 2026&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://assets-prd.ignimgs.com/2026/08/18/gamescom2026-blogroll1-1787050662004.jpg?width=1876&amp;amp;format=jpg&amp;amp;auto=webp&amp;amp;quality=80&quot; alt=&quot;gamescom-2026&quot;&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;GTA 6&lt;/em&gt; — Take-Two and Rockstar skipped a traditional live stage demo at Gamescom, instead focusing on an extended gameplay breakdown that highlighted modern-day Vice City, its dynamic romance mechanics, and a criminal profile system.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Tomb Raider: Legacy of Atlantis&lt;/em&gt; — A 20-minute gameplay demo shown behind closed doors&lt;/li&gt;
&lt;li&gt;&lt;em&gt;The Witcher 3: Wild Hunt&lt;/em&gt; — CD Projekt Red surprised attendees with a full current-gen Remaster arriving September 2026, alongside a brand-new expansion titled Songs of the Past planned for 2027.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Gears of War: E-Day&lt;/em&gt; — Detailed with Unreal Engine 5 gameplay showcases focusing on its co-op campaign, Horde Siege, and multi-player modes.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Showa American Story&lt;/em&gt; — Developer NEKCOM Games debuted an absurd, high-energy Gamescom 2026 trailer for this post-apocalyptic B-movie style RPG. The footage showed off Choko fighting through a “Japanified” 1980s America using makeshift weapons like drill-arms and the American flag, alongside stat-boosting mini-games.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;p&gt;As we wrap up this journey together, I want to take a moment to express my gratitude for your reading. If you’ve enjoyed this issue and would like to help sustain this blog, please consider &lt;a href=&quot;https://github.com/blueberry-py/blog/stargazers&quot;&gt;starring this blog on github&lt;/a&gt;, it would be great motivation for me to keep updating!&lt;/p&gt;
&lt;p&gt;Alright, that concludes the August Edition of “This Month for Pythonistas”. Thank you again for reading my post and I hope you enjoy it or find something useful. Happy coding and see you in September! 👋&lt;/p&gt;
</description><pubDate>Mon, 31 Aug 2026 13:00:00 GMT</pubDate><category>python</category><category>python</category><category>news</category><category>podcast</category><category>AI</category><category>harness</category><author>Zeyang Lin</author></item><item><title>This Month for Pythonistas - July 2026</title><link>https://blueberry-py.github.io/blog/post/this-month-for-pythonistas-2026-07/</link><guid isPermaLink="true">https://blueberry-py.github.io/blog/post/this-month-for-pythonistas-2026-07/</guid><description>&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;python&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;from&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; datetime &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;import&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; date&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;print&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(date.today().year, date.today().month)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# 2026 7&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img alt=&quot;issue-2026-07&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1280&quot; height=&quot;719&quot; src=&quot;/blog/_astro/splash.2p5giHMn_Z2wGXCQ.webp&quot;&gt;&lt;/p&gt;
&lt;p&gt;Welcome back Pythonistas! This is the July 2026 issue of “This Month for Pythonistas”, bringing you curated Python news, tutorials, articles, podcasts, repositories and community highlights for this month.&lt;/p&gt;
&lt;p&gt;Before we continue, please note that this blog is synced across the following platforms:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://blueberry-py.github.io/blog/post/this-month-for-pythonistas-2026-07/&quot;&gt;Github Pages&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://blueberrypy.netlify.app/post/this-month-for-pythonistas-2026-07/&quot;&gt;Netlify&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://blueberrypy.onrender.com/post/this-month-for-pythonistas-2026-07/&quot;&gt;Render&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://blueberrypy-blog.vercel.app/post/this-month-for-pythonistas-2026-07/&quot;&gt;Vercel&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Ready? Let’s get started!&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&quot;events--social&quot;&gt;Events &amp;amp; Social&lt;/h2&gt;
&lt;h3 id=&quot;europython-2026&quot;&gt;EuroPython 2026&lt;/h3&gt;
&lt;p&gt;EuroPython 2026, held in Kraków, Poland from &lt;strong&gt;13–19 July 2026&lt;/strong&gt;, celebrated the conference’s &lt;strong&gt;25th anniversary&lt;/strong&gt; and brought together over &lt;strong&gt;1,500 Python developers, researchers, and enthusiasts&lt;/strong&gt;. The week featured tutorials, technical talks, community sessions, open-source sprints, and networking events. A highlight was its collaboration with &lt;strong&gt;EuroSciPy&lt;/strong&gt;, including joint sprints that connected the wider scientific Python community. Hosted at the &lt;strong&gt;ICE Kraków Congress Centre&lt;/strong&gt;, the event emphasized Python’s growing role in software development, AI, data science, education, and open-source collaboration across Europe and beyond.&lt;/p&gt;
&lt;h3 id=&quot;releases-now-reject-new-files-after-14-days&quot;&gt;&lt;a href=&quot;https://blog.pypi.org/posts/2026-07-22-releases-now-reject-new-files-after-14-days/&quot;&gt;Releases now reject new files after 14 days&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;PyPI now &lt;em&gt;rejects&lt;/em&gt; new file uploads to releases older than 14 days, preventing older, long-stable releases from being poisoned if publishing tokens or workflows are compromised. This change, discussed since &lt;a href=&quot;https://peps.python.org/pep-0740/&quot;&gt;PEP 740&lt;/a&gt; in January 2024 and accelerated after the LiteLLM and Telnyx supply chain attacks, was implemented on July 8, 2026. Data showed only 56 of 15,000 top projects had published Python 3.14 wheels more than 14 days post-release, indicating minimal disruption. The restriction reduces cleanup work for PyPI admins and prevents releases from ending in an indeterminate compromised state, though defined semantics for closed releases are still pending future standardization via &lt;a href=&quot;https://peps.python.org/pep-0694/&quot;&gt;PEP 694&lt;/a&gt; and Upload 2.0.&lt;/p&gt;
&lt;h3 id=&quot;planned-updates-to-the-pypi-user-interface&quot;&gt;&lt;a href=&quot;https://blog.pypi.org/posts/2026-07-22-ui-updates/&quot;&gt;Planned Updates to the PyPI User Interface&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;PyPI is rolling out user interface updates over the next few months, introducing a new Security tab for provenance and attestation data, horizontal navigation tabs, a right-placed metadata sidebar, trust-level labeling, and clearer status indicators. Changes are being deployed in four phases on TestPyPI first, allowing community feedback. These visual-only updates require no action from maintainers and automatically map existing attestations to the new UI.&lt;/p&gt;
&lt;h3 id=&quot;introducing-claude-sonnet-5&quot;&gt;&lt;a href=&quot;https://www.anthropic.com/news/claude-sonnet-5&quot;&gt;Introducing Claude Sonnet 5&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://www.anthropic.com/_next/image?url=https%3A%2F%2Fwww-cdn.anthropic.com%2Fimages%2F4zrzovbb%2Fwebsite%2F458ea645ef6b729f6847cba16932716e6b547f2f-2880x1620.png&amp;amp;w=3840&amp;amp;q=75&quot; alt=&quot;claude-sonnet-5&quot;&gt;&lt;/p&gt;
&lt;p&gt;Anthropic announced Claude Sonnet 5, their most agentic Sonnet model yet, capable of planning, using tools like browsers and terminals, and running autonomously at levels previously requiring more expensive models. Its performance approaches Opus 4.8 but at lower prices, with substantial improvements over Sonnet 4.6 in reasoning, tool use, coding, and knowledge work. Safety assessments show fewer undesirable behaviors than its predecessor.&lt;/p&gt;
&lt;h3 id=&quot;introducing-claude-opus-5&quot;&gt;&lt;a href=&quot;https://www.anthropic.com/news/claude-opus-5&quot;&gt;Introducing Claude Opus 5&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://www.anthropic.com/_next/image?url=https%3A%2F%2Fwww-cdn.anthropic.com%2Fimages%2F4zrzovbb%2Fwebsite%2F54b7ab1d2c2521f83ae5d2da5f9d99321c370d24-2880x1620.png&amp;amp;w=3840&amp;amp;q=75&quot; alt=&quot;claude-opus-5&quot;&gt;&lt;/p&gt;
&lt;p&gt;Claude Opus 5 is now available as a thoughtful and proactive model that approaches the frontier intelligence of Claude Fable 5 at half the cost. It is the new state-of-the-art on coding and knowledge work benchmarks like Frontier-Bench and CursorBench, while remaining behind Mythos 5 on cybersecurity tasks. Opus 5 excels on software engineering, scientific research (especially organic chemistry and protein tasks), and visual outputs, while being the most aligned and safest model to date.&lt;/p&gt;
&lt;h3 id=&quot;redeploying-fable-5&quot;&gt;&lt;a href=&quot;https://www.anthropic.com/news/redeploying-fable-5&quot;&gt;Redeploying Fable 5&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;After US export controls suspended access to Claude Fable 5 and Mythos 5 on June 12, the restrictions were lifted on June 30. Fable 5 is now available globally starting July 1, while Mythos 5 access resumed for select US organizations. Anthropic strengthened safeguards with improved safety classifiers, proposed a shared industry framework for assessing jailbreak severity, and deepened collaboration with the US government on pre-release testing, information sharing, and joint research.&lt;/p&gt;
&lt;h3 id=&quot;gpt-56-frontier-intelligence-that-scales-with-your-ambition&quot;&gt;&lt;a href=&quot;https://openai.com/index/gpt-5-6/&quot;&gt;GPT-5.6: Frontier intelligence that scales with your ambition&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;OpenAI launched GPT-5.6 series including flagship &lt;em&gt;Solo&lt;/em&gt;, balanced &lt;em&gt;Terra&lt;/em&gt; and cost-effective &lt;em&gt;Luna&lt;/em&gt; across ChatGPT, Codex and its API with global gradual rollout. All models beat competitors like Fable 5 and Claude Opus 4.8 in coding, agent workflows, cyber defense, life science research and office document creation, delivering stronger performance at far lower costs and shorter latency.&lt;/p&gt;
&lt;p&gt;It supports Programmatic Tool Calling and Ultra multi-agent parallel processing for complex tasks, boasting advanced UI design judgment and precise template-following document generation. Equipped with OpenAI’s most robust layered safety safeguards, it restricts high-risk cyber/biology features to verified users via Trusted Access without blocking legitimate defensive research. Tiered token pricing applies, alongside optimized prompt caching and beta multi-agent API functions for developers. Internal tests show it greatly accelerates AI research with doubled researcher token usage vs GPT-5.5.&lt;/p&gt;
&lt;h3 id=&quot;kimi-k3-open-frontier-intelligence&quot;&gt;&lt;a href=&quot;https://www.kimi.com/blog/kimi-k3&quot;&gt;Kimi K3: Open Frontier Intelligence&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://kimi-file.moonshot.cn/prod-chat-kimi/kfs/4/2/2026-07-16/1d9ccb76dcmosb3rn6vk0?x-tos-process=image%2Fauto-orient%2C1%2Fstrip%2Fignore-error%2C1&quot; alt=&quot;kimi-k3&quot;&gt;&lt;/p&gt;
&lt;p&gt;Kimi K3 is a new 2.8-trillion-parameter open model from Moonshot featuring native vision capabilities and a 1-million-token context window. Built on Kimi Delta Attention and Attention Residuals using Mixture of Experts (16 of 896 experts active), it excels at long-horizon coding, knowledge work, and reasoning. It demonstrated frontier-level performance across benchmarks, notably building a GPU compiler, designing a chip, and creating interactive research reports. The full model weights were then released on July 27, 2026.&lt;/p&gt;
&lt;h3 id=&quot;introducing-grok-45&quot;&gt;&lt;a href=&quot;https://x.ai/news/grok-4-5&quot;&gt;Introducing Grok 4.5&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Grok 4.5&lt;/strong&gt; is SpaceXAI’s smartest model, launched July 8, 2026, built for coding, agentic tasks, and knowledge work. Trained on tens of thousands of NVIDIA GB300 GPUs with curated datasets spanning coding, science, engineering, and math, it excels at engineering benchmarks. Served at 80 tokens per second with twice the token efficiency of leading models, it delivers intelligent results quickly and cost-effectively at $2/M input and $6/M output tokens. It’s available in Grok Build, Cursor, and via the SpaceXAI API console.&lt;/p&gt;
&lt;h2 id=&quot;new-versions&quot;&gt;New Versions&lt;/h2&gt;
&lt;h3 id=&quot;python-3150-beta-4-is-here&quot;&gt;&lt;a href=&quot;https://blog.python.org/2026/07/python-3150-beta-4/&quot;&gt;Python 3.15.0 beta 4 is here!&lt;/a&gt;&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;This release, 3.15.0b4, is the final planned beta release, containing around 298 bugfixes, build improvements and documentation changes since 3.15.0b3. The next pre-release of Python 3.15 will be 3.15.0rc1, scheduled for 2026-08-04.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id=&quot;pytorch-213-release-blog&quot;&gt;&lt;a href=&quot;https://pytorch.org/blog/pytorch-2-13-release-blog/&quot;&gt;PyTorch 2.13 Release Blog&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;PyTorch 2.13 brings major performance and scalability improvements: FlexAttention lands on Apple Silicon with up to 12× speedups and gains deterministic backward on CUDA; CuTeDSL provides a second high-performance code path for Inductor; &lt;code&gt;nn.LinearCrossEntropyLoss&lt;/code&gt; fuses linear and loss computation to cut peak GPU memory by up to 4×; a new torchcomms backend improves distributed training fault tolerance and debuggability; FSDP2 enables communication overlap for higher throughput; Python 3.15 wheel support is added; and broader platform gains include ROCm, Armv9-A, and Intel XPU updates.&lt;/p&gt;
&lt;h3 id=&quot;introducing-haystack-30-agent-hooks-skills-and-a-lighter-core&quot;&gt;&lt;a href=&quot;https://haystack.deepset.ai/blog/haystack-3-release&quot;&gt;Introducing Haystack 3.0: Agent Hooks, Skills and a Lighter Core&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Haystack 3.0 is a major release of the open-source AI orchestration framework, putting agents at the center. It introduces pre-configured agents (deep research, advanced RAG), hooks for controlling agent behavior, first-class skills with progressive disclosure, built-in introspection and observability, and a leaner core with fewer dependencies.&lt;/p&gt;
&lt;h2 id=&quot;tutorials&quot;&gt;Tutorials&lt;/h2&gt;
&lt;h3 id=&quot;deeplearningais-ai-code-reviews&quot;&gt;Deeplearning.ai’s &lt;a href=&quot;https://www.deeplearning.ai/courses/ai-code-review/&quot;&gt;AI Code Reviews&lt;/a&gt;&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;You’ll start with practical techniques for getting more out of AI review, like reviewing before you open a pull request, giving the reviewer task and repository context, and triaging findings by risk. Then you’ll build a context-aware review system of your own, beginning with a context engine that retrieves the most relevant code and extending it into an ensemble of specialized agents.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id=&quot;realpythons-langgraph-tutorial-build-stateful-ai-agents-in-python&quot;&gt;RealPython’s &lt;a href=&quot;https://realpython.com/langgraph-python/&quot;&gt;LangGraph Tutorial: Build Stateful AI Agents in Python&lt;/a&gt;&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;Explore the full tutorial to gain hands-on experience with LangGraph, including setting up workflows and building a LangGraph agent that can autonomously parse emails, send emails, and interact with API services.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id=&quot;realpythons-crewai-in-python-coordinating-teams-of-ai-agents&quot;&gt;RealPython’s &lt;a href=&quot;https://realpython.com/crewai-python/&quot;&gt;CrewAI in Python: Coordinating Teams of AI Agents&lt;/a&gt;&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;CrewAI is a Python framework that lets you build a crew of specialized AI agents, each focusing on one part of the job. For example, instead of cramming research, validation, and writing into a single prompt, you create a team. One agent researches, another validates, and a third writes. Each focuses on what it does best, working together to complete the task.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;articles&quot;&gt;Articles&lt;/h2&gt;
&lt;h3 id=&quot;pep-752--implicit-namespaces-for-package-repositories&quot;&gt;&lt;a href=&quot;https://peps.python.org/pep-0752/&quot;&gt;PEP 752 – Implicit namespaces for package repositories&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;PEP 752 is &lt;strong&gt;accepted&lt;/strong&gt;. It introduces implicit namespace reservations for Python package repositories, allowing organizations to reserve name prefixes (e.g., &lt;code&gt;google-cloud-&lt;/code&gt;, &lt;code&gt;aws-cdk-&lt;/code&gt;) to prevent name-squatting, typosquatting, and dependency confusion attacks. Following the NuGet approach, it works within the existing flat namespace — no new package syntax or installer changes are required, and pre-existing packages are unaffected. Uploads matching a reserved namespace fail with HTTP 409 unless the uploader holds an active grant. The JSON API is upgraded to version 1.5 to expose namespace metadata. The PEP is accepted and has community support from organizations including Apache Airflow, Microsoft, Datadog, pytest, and Project Jupyter.&lt;/p&gt;
&lt;h3 id=&quot;pep-814-add-frozendict-built-in-type&quot;&gt;&lt;a href=&quot;https://vstinner.github.io/pep-814-add-frozendict-builtin-type.html&quot;&gt;PEP 814: Add frozendict built-in type&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Victor Stinner recounts the long journey to adding &lt;code&gt;frozendict&lt;/code&gt; — an immutable, hashable dictionary type — as a built-in to Python 3.15. After his original &lt;a href=&quot;https://peps.python.org/pep-0416/&quot;&gt;PEP-416&lt;/a&gt; was rejected in 2012 and &lt;a href=&quot;https://peps.python.org/pep-0603/&quot;&gt;PEP-603&lt;/a&gt;’s &lt;code&gt;frozenmap&lt;/code&gt; stalled, Stinner and Donghee Na wrote PEP 814, which the Steering Council accepted in February 2026. Implemented in C and sharing most code with &lt;code&gt;dict&lt;/code&gt;, &lt;code&gt;frozendict&lt;/code&gt; preserves insertion order but comparison and hashing are order-independent. The article covers C API additions, stdlib integration (e.g., &lt;code&gt;json&lt;/code&gt;, &lt;code&gt;copy&lt;/code&gt;, &lt;code&gt;pickle&lt;/code&gt;), garbage collector bug fixes, and migration guidance for both Python and C code.&lt;/p&gt;
&lt;h3 id=&quot;what-every-python-developer-should-know-about-the-cpython-abi&quot;&gt;&lt;a href=&quot;https://labs.quansight.org/blog/python-abi-abi3t&quot;&gt;What Every Python Developer Should Know About the CPython ABI&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;The CPython &lt;strong&gt;Application Binary Interface&lt;/strong&gt; (ABI) underpins Python’s ability to call native C, C++, Rust, or Fortran code and vice versa. This post explains what an ABI is, how it differs from a C API (which is source-level), and details the five layers of the CPython C API—Internal, Private, Unstable, Version-Specific, and Limited. It covers ABI compatibility tags in wheel filenames (cp3XY for version-specific, abi3 for the stable ABI, cp3XYt for free-threaded, and abi3t for the new free-threaded stable ABI in Python 3.15+). The post also explains how the free-threaded build changes the PyObject struct layout, breaking backward compatibility, and how PEP 803 introduces abi3t to let a single wheel target both GIL-enabled and free-threaded interpreters going forward.&lt;/p&gt;
&lt;h3 id=&quot;when-to-use-classmethod-staticmethod-or-instance-method-in-python&quot;&gt;&lt;a href=&quot;https://belderbos.dev/blog/classmethod-vs-staticmethod-vs-instance-method-python/&quot;&gt;When to use classmethod, staticmethod, or instance method in Python&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;This article explains the differences between instance methods, classmethods, and staticmethods in Python. The key rule: if a method needs the instance (&lt;code&gt;self&lt;/code&gt;), it’s an instance method; if it needs the class (&lt;code&gt;cls&lt;/code&gt;) but not a specific instance, use &lt;code&gt;@classmethod&lt;/code&gt; (e.g., alternative constructors like &lt;code&gt;datetime.date.today()&lt;/code&gt;, registries); if it needs neither, use &lt;code&gt;@staticmethod&lt;/code&gt; for namespaced helper functions. The author warns that with AI-generated code, methods may look plausible but be structurally wrong, so developers should critically evaluate whether each method truly belongs where it is placed.&lt;/p&gt;
&lt;h3 id=&quot;selecting-random-values-in-python&quot;&gt;&lt;a href=&quot;https://www.pythonmorsels.com/random-numbers/&quot;&gt;Selecting &lt;code&gt;random&lt;/code&gt; values in Python&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;The article explains how to generate random values in Python using the &lt;strong&gt;&lt;code&gt;random&lt;/code&gt; module&lt;/strong&gt;, which provides pseudorandom numbers via the Mersenne Twister algorithm. It covers &lt;code&gt;randint&lt;/code&gt; and &lt;code&gt;randrange&lt;/code&gt; for integers, &lt;code&gt;random()&lt;/code&gt; for floats between 0 and 1, and &lt;code&gt;choice&lt;/code&gt;/&lt;code&gt;choices&lt;/code&gt; for picking items from sequences — the author’s most-used function. The deterministic nature allows reproducible results via &lt;code&gt;seed()&lt;/code&gt;, useful for testing but risky for security. For cryptographically-secure randomness, Python’s &lt;strong&gt;&lt;code&gt;secrets&lt;/code&gt; module&lt;/strong&gt; offers &lt;code&gt;choice&lt;/code&gt;, &lt;code&gt;randbelow&lt;/code&gt;, and &lt;code&gt;randbits&lt;/code&gt;, while the &lt;code&gt;SystemRandom&lt;/code&gt; class provides a full secure counterpart to &lt;code&gt;random&lt;/code&gt;’s API.&lt;/p&gt;
&lt;h3 id=&quot;stacks-and-queues-in-python&quot;&gt;&lt;a href=&quot;https://www.pythonmorsels.com/stacks-and-queues/&quot;&gt;Stacks and queues in Python&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Python lists are ideal for &lt;strong&gt;stacks&lt;/strong&gt; (last-in, first-out) using &lt;code&gt;append()&lt;/code&gt; and &lt;code&gt;pop()&lt;/code&gt;, as they are optimized for adding/removing items at the end. For &lt;strong&gt;queues&lt;/strong&gt; (first-in, first-out), use a &lt;code&gt;deque&lt;/code&gt; (double-ended queue) from the &lt;code&gt;collections&lt;/code&gt; module, which supports efficient &lt;code&gt;append()&lt;/code&gt;/&lt;code&gt;popleft()&lt;/code&gt; operations. While &lt;code&gt;deque&lt;/code&gt; can also work as a stack, lists are recommended for stack-like needs and &lt;code&gt;deque&lt;/code&gt; for queue-like needs in Python.&lt;/p&gt;
&lt;h3 id=&quot;protobuf-py-protobuf-for-python-without-compromises&quot;&gt;&lt;a href=&quot;https://buf.build/blog/protobuf-py&quot;&gt;protobuf-py: Protobuf for Python, without compromises&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Buf announced &lt;strong&gt;protobuf-py&lt;/strong&gt;, a new Protocol Buffers library for Python written from scratch. It passes the full Protobuf conformance suite (proto2, proto3, editions), supports extensions, custom options, dynamic messages, and well-known types. Unlike Google’s C-based package, it stores messages as plain Python objects with readable generated code and no runtime dependencies. An optional Rust accelerator boosts parsing/serialization for production workloads. It offers complete spec coverage with an idiomatic Python API, addressing the gap between Google’s complete but clunky package and the nicer but incomplete &lt;code&gt;betterproto&lt;/code&gt;.&lt;/p&gt;
&lt;h3 id=&quot;pip-262-only-deps-solves-16-years-of-app-deployment-hacks&quot;&gt;&lt;a href=&quot;https://jamesoclaire.com/2026/07/23/pip-26-2-only-deps-solves-16-years-of-app-deployment-hacks/&quot;&gt;Pip 26.2: –only-deps solves 16 years of app deployment hacks&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;pip 26.2 introduces the &lt;code&gt;--only-deps&lt;/code&gt; flag, solving a 16-year problem of installing dependencies for application-style Python projects without installing the package itself. The author traces the history of workarounds — from &lt;code&gt;pip freeze&lt;/code&gt;, manually cutting version pins, &lt;code&gt;pip install -e .&lt;/code&gt;, to third-party tools like &lt;code&gt;pip-chill&lt;/code&gt;, &lt;code&gt;pipreqs&lt;/code&gt;, &lt;code&gt;poetry&lt;/code&gt;, &lt;code&gt;hatch&lt;/code&gt;, and &lt;code&gt;uv&lt;/code&gt; — showing how community demand finally led to this native solution. Sebastian Höffner’s PR #13895 adds a global flag allowing &lt;code&gt;pip install --only-deps .&lt;/code&gt; to install only project dependencies from &lt;code&gt;pyproject.toml&lt;/code&gt;, eliminating years of fragile manual deployment hacks.&lt;/p&gt;
&lt;h3 id=&quot;how-to-publish-to-pypi-using-github-actions-securely&quot;&gt;&lt;a href=&quot;https://snarky.ca/how-to-publish-to-pypi-using-github-actions-securely/&quot;&gt;How to publish to PyPI using GitHub Actions securely&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;This article by Brett Cannon outlines three steps to securely publish Python packages to PyPI via GitHub Actions: (1) Use the &lt;strong&gt;zizmor&lt;/strong&gt; tool to scan workflows for insecure defaults — set no permissions by default, disable persisted credentials after checkout, and pin actions to commit hashes rather than tags; (2) adopt &lt;strong&gt;Trusted Publishing&lt;/strong&gt; to eliminate API token management and gain attestations; and (3) &lt;strong&gt;require manual approval&lt;/strong&gt; through GitHub Environments to prevent accidental or malicious releases. These measures mitigate recent GitHub Actions security incidents.&lt;/p&gt;
&lt;h3 id=&quot;uv-in-production-the-speed-is-real-the-integration-isnt-free&quot;&gt;&lt;a href=&quot;https://tsv.one/articles/uv-in-production-caveats&quot;&gt;uv in production: the speed is real, the integration isn’t free&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;The article discusses the author’s ~90-day production experience with &lt;strong&gt;uv&lt;/strong&gt;, Astral’s Python package manager. While uv delivers a genuine ~10x speed improvement over pip in CI, the article highlights five key caveats: (1) it refuses to install without an active venv, (2) auto-installing Python is blocked by corporate firewalls (fixable via a mirror), (3) parallel installs get serialized due to locking, (4) it defaults to first-index mode (defense against dependency confusion), and (5) bytecode compilation is off by default, slowing cold starts. The author concludes uv is worth adopting but warns that its deliberate strictness — unlike pip’s leniency — requires budgeting time for integration.&lt;/p&gt;
&lt;h3 id=&quot;sandboxing-an-ai-agent&quot;&gt;&lt;a href=&quot;https://sajalsharma.com/posts/sandboxing-an-ai-agent/&quot;&gt;Sandboxing an AI Agent&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;This post explores sandboxing AI agents by giving them isolated, disposable environments instead of running code directly on a host machine. He compares two architectures: a tool-backend model where the agent loop stays local and the sandbox executes commands remotely, versus the agent-in-the-box model where the entire agent lives inside the sandbox. He examines different isolation strengths—shared-kernel containers, gVisor’s software kernel, and Firecracker microVMs — and concludes sandboxes are becoming a default layer of the agent stack for containment, parallelism, reproducibility, and cheap recovery.&lt;/p&gt;
&lt;h3 id=&quot;state-of-cli-coding-agents-mid-2026&quot;&gt;&lt;a href=&quot;https://blog.arcbjorn.com/state-of-cli-coding-agents-2026&quot;&gt;State of CLI Coding Agents, Mid-2026&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;The article surveys 35 CLI coding agents as of mid-2026, noting the terminal unexpectedly won over IDEs for serious AI coding work. Claude Code’s February 2025 research preview set the template — agentic loop, file/shell tools, memory, hooks, subagents — that everyone else cloned. The landscape spans lab agents (Claude Code, Codex CLI, Antigravity CLI, Grok Build), platform CLIs (Copilot CLI, Cursor CLI, Amp, Junie), and open-source harnesses (OpenCode, Goose, Aider, Cline, Pi/Omp). Open-weight models like GLM-5.2 and DeepSeek V4 narrowed the frontier gap dramatically, while free tiers retreated industry-wide.&lt;/p&gt;
&lt;h3 id=&quot;what-our-ai-guiding-principles-actually-mean&quot;&gt;&lt;a href=&quot;https://wagtail.org/blog/what-our-ai-guiding-principles-actually-mean/&quot;&gt;What our AI guiding principles actually mean&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Wagtail has refreshed its AI guiding principles, emphasizing that AI will remain optional in core with features living in separate packages. The five principles include: no AI dependency in core, a responsible approach focused on ethics and sustainability, model and provider agnosticism favoring open-weight smaller models, only adopting AI where it delivers real value, and maintaining human-in-the-loop control to preserve user autonomy. The article stresses that while the principles are set, the real challenge lies in their practical implementation as AI adoption continues to evolve.&lt;/p&gt;
&lt;h3 id=&quot;how-much-can-you-delegate-to-agents&quot;&gt;&lt;a href=&quot;https://newsletter.posthog.com/p/agent-autonomy&quot;&gt;How much can you delegate to agents?&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;This article presents a framework for deciding agent autonomy levels based on two factors: how easy the task is to check and how cheap it is to undo. It defines four levels—Level 0 (agent as assistant for hard-to-check, costly-to-undo tasks), Level 1 (human-in-the-loop for hard-to-check, easy-to-undo tasks), Level 2 (agent delegation for easy-to-check, costly-to-undo tasks), and Level 3 (self-driving mode for easy-to-check, easy-to-undo tasks) — with real examples from PostHog’s engineering work and practical advice on progressively increasing delegation safely.&lt;/p&gt;
&lt;h3 id=&quot;the-short-leash-ai-coding-method-for-beating-fable&quot;&gt;&lt;a href=&quot;https://blog.okturtles.org/2026/07/short-leash-ai-method/&quot;&gt;The Short Leash AI Coding Method For Beating Fable&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;The &lt;strong&gt;Short Leash AI Coding Method&lt;/strong&gt; advocates for expert developers to use AI agents cautiously in security-critical software. Unlike “vibe coding” where AI works autonomously, this method keeps the developer actively engaged — reviewing every proposed diff, denying undesired changes, and committing after each subtask. For reviews, both AI and human input are essential: AI catches common mistakes like a linter, while humans handle high-level issues. The key principle is never letting the AI work unsupervised to maintain quality and codebase understanding.&lt;/p&gt;
&lt;h3 id=&quot;skill-engineering-and-the-case-against-one-shot-ai-design&quot;&gt;&lt;a href=&quot;https://www.latent.space/p/skill-engineering-design&quot;&gt;Skill engineering and the case against one-shot AI design&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Paul Bakaus, creator of the open-source design skills system &lt;em&gt;Impeccable&lt;/em&gt;, argues for “skill engineering” as a new discipline that gives AI agents a precise design vocabulary (e.g., “bolder,” “quieter”) instead of relying on one-shot AI design. He believes agents need domain knowledge and human steering, not full automation. His philosophy: AI quickly produces the first 80% of competent work, while humans own the final 20% where taste and context matter, rejecting the notion of “auto mode” entirely.&lt;/p&gt;
&lt;h2 id=&quot;podcasts&quot;&gt;Podcasts&lt;/h2&gt;
&lt;h3 id=&quot;-corepy&quot;&gt;🥝 core.py&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://open.spotify.com/episode/1d7fOuGcUiP59O7owtc2mc&quot;&gt;Episode 30: Live from EuroPython, an Interview with Guido van Rossum&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;-realpython-podcast&quot;&gt;🐍 RealPython Podcast&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://realpython.com/podcasts/rpp/301/&quot;&gt;Episode 301: Running Python Locally in a Sandbox&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://realpython.com/podcasts/rpp/302/&quot;&gt;Episode 302: Constructing and Judging Modern Agentic Workflows&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://realpython.com/podcasts/rpp/303/&quot;&gt;Episode 303: Free-Threaded Python’s History &amp;amp; uv in Production&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://realpython.com/podcasts/rpp/304/&quot;&gt;Episode 304: Configuring a Versatile LLM Harness &amp;amp; Scraping the Web With Scrapy&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://realpython.com/podcasts/rpp/305/&quot;&gt;Episode 305: Should You Understand Your Entire Python Codebase?&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;-python-bytes-podcast&quot;&gt;🍕 Python Bytes Podcast&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://pythonbytes.fm/episodes/show/486/underscore-underscore-ghost-emoji&quot;&gt;#486 underscore-underscore-ghost-emoji&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://pythonbytes.fm/episodes/show/487/minimum-requirements&quot;&gt;#487 Minimum requirements&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://pythonbytes.fm/episodes/show/488/tau-its-2pi-and-it-writes-code&quot;&gt;#488 tau - it’s 2pi and it writes code&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://pythonbytes.fm/episodes/show/489/or-json&quot;&gt;#489 Or JSON?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://pythonbytes.fm/episodes/show/490/it-s-a-vibe-coding-party&quot;&gt;#490 It’s a vibe coding party&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;-talk-python-to-me&quot;&gt;📣 Talk Python to me&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://talkpython.fm/episodes/show/554/trustworthy-ai-in-healthcare-and-longevity&quot;&gt;#554: Trustworthy AI in Healthcare and Longevity&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://talkpython.fm/episodes/show/555/marimo-pair-a-canvas-for-agent-developers-collaboration&quot;&gt;#555: Marimo Pair - A Canvas for Agent + Developers Collaboration&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://talkpython.fm/episodes/show/556/updates-on-djangos-async-story&quot;&gt;#556: Updates on Django’s Async Story&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;-vs-code-insiders-podcast&quot;&gt;🚀 VS Code Insiders Podcast&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.vscodepodcast.com/23&quot;&gt;Episode 23: VS Code’s Agent Host Protocol Explained with Connor Peet&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;repositories&quot;&gt;Repositories&lt;/h2&gt;
&lt;h3 id=&quot;mozilla-aiotari&quot;&gt;&lt;a href=&quot;https://github.com/mozilla-ai/otari&quot;&gt;mozilla-ai/otari&lt;/a&gt;&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;Open-source, OpenAI-compatible LLM gateway you run yourself. One endpoint for 40+ providers, with virtual keys, budgets, and usage tracking.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;p&gt;As we wrap up this journey together, I want to take a moment to express my gratitude for your reading. If you’ve enjoyed this issue and would like to help sustain this blog, please consider &lt;a href=&quot;https://github.com/blueberry-py/blog/stargazers&quot;&gt;starring this blog on github&lt;/a&gt;, it would be great motivation for me to keep updating!&lt;/p&gt;
&lt;p&gt;Alright, that concludes the July Edition of “This Month for Pythonistas”. Thank you again for reading my post and I hope you enjoy it or find something useful. Happy coding and see you in August! 👋&lt;/p&gt;
</description><pubDate>Fri, 31 Jul 2026 13:00:00 GMT</pubDate><category>python</category><category>python</category><category>news</category><category>podcast</category><category>AI</category><category>pycon</category><author>Zeyang Lin</author></item><item><title>This Month for Pythonistas - June 2026</title><link>https://blueberry-py.github.io/blog/post/this-month-for-pythonistas-2026-06/</link><guid isPermaLink="true">https://blueberry-py.github.io/blog/post/this-month-for-pythonistas-2026-06/</guid><description>&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;python&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;from&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; datetime &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;import&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; date&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;print&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(date.today().year, date.today().month)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# 2026 6&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img alt=&quot;issue-2026-06&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1080&quot; height=&quot;1080&quot; src=&quot;/blog/_astro/splash.2_F7aF_3_gtxsm.webp&quot;&gt;&lt;/p&gt;
&lt;p&gt;Welcome back Pythonistas! This is the June 2026 issue of “This Month for Pythonistas”, bringing you curated Python news, tutorials, articles, podcasts, repositories and community highlights worth noting in this month.&lt;/p&gt;
&lt;p&gt;Before we continue, please note that this blog is synced across the following platforms:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://blueberry-py.github.io/blog/post/this-month-for-pythonistas-2026-06/&quot;&gt;Github Pages&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://blueberrypy.netlify.app/post/this-month-for-pythonistas-2026-06/&quot;&gt;Netlify&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://blueberrypy.onrender.com/post/this-month-for-pythonistas-2026-06/&quot;&gt;Render&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://blueberrypy-blog.vercel.app/post/this-month-for-pythonistas-2026-06/&quot;&gt;Vercel&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Ready? Let’s get started!&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&quot;events--social&quot;&gt;Events &amp;amp; Social&lt;/h2&gt;
&lt;h3 id=&quot;an-announcement-from-the-steering-council-regarding-the-jit-project&quot;&gt;&lt;a href=&quot;https://discuss.python.org/t/an-announcement-from-the-steering-council-regarding-the-jit-project/107638&quot;&gt;An announcement from the Steering Council regarding the JIT project&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;The &lt;em&gt;Python Steering Council&lt;/em&gt; announced that the experimental JIT compiler in CPython must undergo formal review through a Standards Track PEP within six months. While acknowledging the developers’ valuable work and real performance gains, the Council noted the JIT lacks proper formal approval — PEP 744 was only informational. Until an accepted PEP addresses maintenance plans, compatibility guarantees, success metrics, and architectural stability, no new JIT features can be added to main (only bug/security fixes permitted). If no PEP is accepted within six months, the JIT code must be removed from CPython’s main repository.&lt;/p&gt;
&lt;h3 id=&quot;europython-2026-schedule-is-revealed-&quot;&gt;EuroPython 2026 schedule is revealed 📣&lt;/h3&gt;
&lt;p&gt;The full schedule for EuroPython 2026, hosted in Kraków, Poland, has been released. Check it out on &lt;a href=&quot;https://ep2026.europython.eu/schedule/&quot;&gt;the official website&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&quot;everything-security-at-pycon-us-2026&quot;&gt;&lt;a href=&quot;https://pyfound.blogspot.com/2026/06/everything-security-at-pycon-us-2026.html&quot;&gt;Everything Security at PyCon US 2026&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;PyCon US 2026&lt;/strong&gt; featured its first-ever dedicated security track, “Trailblazing Python Security”, with seven talks covering phishing, zero trust, supply chain attacks, SBOMs, and more. The Python Software Foundation (PSF) delivered a security update highlighting a surge in malware and watering-hole attacks targeting PyPI. An Open Space session brought together open-source maintainers to discuss CI/CD hardening, the overwhelming flood of LLM-generated vulnerability reports consuming most of their time, and the need for contributor quality signals. Additionally, Alpha-Omega–sponsored security roles presented updates on Python Security Response Team governance reforms and efforts to combat supply-chain attacks on the Python ecosystem.&lt;/p&gt;
&lt;h3 id=&quot;building-a-hill-climbing-machine-launching-seven-new-mai-models&quot;&gt;&lt;a href=&quot;https://microsoft.ai/news/building-a-hillclimbing-machine-launching-seven-new-mai-models/&quot;&gt;Building a hill-climbing machine: Launching seven new MAI models&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Microsoft AI (MAI) announced seven new in-house models during Microsoft Build 2026, spanning reasoning (MAI-Thinking-1), coding (MAI-Code-1-Flash), image generation (MAI-Image-2.5), transcription (MAI-Transcribe-1.5), and speech (MAI-Voice-2). All are trained from scratch on clean data without distillation from third parties. MAI also introduced &lt;strong&gt;Microsoft Frontier Tuning&lt;/strong&gt;, enabling organizations to adapt models to their own workflows using reinforcement learning. A partnership with Mayo Clinic was announced to co-develop a frontier healthcare AI model. MAI’s ultimate vision is “Humanist Superintelligence” — advanced AI designed to serve people, remain under human oversight, and never replace them.&lt;/p&gt;
&lt;h3 id=&quot;claude-fable-5-and-claude-mythos-5&quot;&gt;&lt;a href=&quot;https://www.anthropic.com/news/claude-fable-5-mythos-5&quot;&gt;Claude Fable 5 and Claude Mythos 5&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://www.anthropic.com/_next/image?url=https%3A%2F%2Fwww-cdn.anthropic.com%2Fimages%2F4zrzovbb%2Fwebsite%2Fb7055119423427c40a0e4d84054aed17682b50a2-2880x1620.png&amp;amp;w=3840&amp;amp;q=75&quot; alt=&quot;anthropic-claude-fable-5&quot;&gt;&lt;/p&gt;
&lt;p&gt;Anthropic has launched Claude Fable 5, a &lt;em&gt;Mythos&lt;/em&gt;-class AI model that is the most capable model they’ve ever made generally available, achieving state-of-the-art performance across software engineering, knowledge work, vision, and scientific research benchmarks. Due to its powerful capabilities, Fable 5 includes new safeguards that redirect sensitive queries on cybersecurity, biology, and chemistry to Claude Opus 4.8 instead. The company also released Claude Mythos 5, the same model with lifted safeguards for cyber defenders, deployed through Project Glasswing in collaboration with the US government.&lt;/p&gt;
&lt;h3 id=&quot;statement-on-the-us-government-directive-to-suspend-access-to-fable-5-and-mythos-5&quot;&gt;&lt;a href=&quot;https://www.anthropic.com/news/fable-mythos-access&quot;&gt;Statement on the US government directive to suspend access to Fable 5 and Mythos 5&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Shortly after Anthropic released Claude Fable 5 and Claude Mythos 5, the US government issued an export control directive citing national security concerns on June 12th, ordering Anthropic to suspend all access to its &lt;em&gt;Fable 5&lt;/em&gt; and &lt;em&gt;Mythos 5&lt;/em&gt; models for &lt;em&gt;all users&lt;/em&gt;, including foreign nationals. Anthropic is complying but disagrees with the decision, stating the government’s evidence involves a narrow jailbreak revealing minor vulnerabilities already discoverable by other models. Anthropic argues its safeguards are robust and that applying this standard industry-wide would halt all frontier model deployments. The company believes this is a misunderstanding and is working to restore access as soon as possible.&lt;/p&gt;
&lt;h3 id=&quot;minimax-m3-frontier-coding-1m-context-native-multimodality--all-in-one-model&quot;&gt;&lt;a href=&quot;https://www.minimax.io/blog/minimax-m3&quot;&gt;MiniMax M3: Frontier Coding, 1M Context, Native Multimodality — All in One Model&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://filecdn.minimax.chat/public/m3-msa-arch.png&quot; alt=&quot;minimax-sparse-attention&quot;&gt;&lt;/p&gt;
&lt;p&gt;MiniMax M3 is MiniMax’s latest frontier model combining three key capabilities: frontier-level coding/agentic performance, 1M-token context via MSA (MiniMax Sparse Attention), and native multimodality (image/video input and desktop operation). It surpasses GPT-5.5 and Gemini 3.1 Pro on SWE-Bench Pro, tops SVG-Bench and Claw-Eval, and excels at real-world tasks like independently reproducing research papers, optimizing CUDA kernels (achieving 9.4× speedup), and autonomously training models. Accompanying the release are MiniMax Code (an agent product), affordable Token Plans, and a tiered API. Model weights and a technical report have also been released.&lt;/p&gt;
&lt;h3 id=&quot;qwen37-plus-multimodal-agent-intelligence&quot;&gt;&lt;a href=&quot;https://qwen.ai/blog?id=qwen3.7-plus&quot;&gt;Qwen3.7-Plus: Multimodal Agent Intelligence&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://qianwen-res.oss-accelerate.aliyuncs.com/Qwen3.7/Figures/qwen3.7-plus-banner.png&quot; alt=&quot;qwen-3.7-plus&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Qwen3.7-Plus&lt;/strong&gt; is Alibaba’s latest multimodal agent model that unifies vision and language into a versatile agent foundation. It operates as a “multimodal interactive hybrid agent,” capable of perceiving real-world scenes, operating GUIs and CLIs, writing code from visual references, and completing end-to-end tasks. It excels in coding agent benchmarks (Terminal Bench 2.0, SWE-Verified), general-purpose agent tasks, STEM reasoning, and multimodal benchmarks including visual reasoning, search-augmented QA, video understanding, and autonomous driving perception.&lt;/p&gt;
&lt;h3 id=&quot;glm-52-built-for-long-horizon-tasks&quot;&gt;&lt;a href=&quot;https://z.ai/blog/glm-5.2&quot;&gt;GLM-5.2: Built for Long-Horizon Tasks&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;GLM-5.2 is Z.ai’s latest flagship model designed for long-horizon tasks, featuring a solid 1M-token context window. It introduces &lt;em&gt;IndexShare&lt;/em&gt; architecture, reducing per-token computation by 2.9×, and offers flexible effort levels to balance performance and latency. The model excels in coding benchmarks, ranking as the highest-performing open-source model across long-horizon evaluations like FrontierSWE and SWE-Marathon. GLM-5.2 uses advanced RL training with anti-hacking mechanisms and is released under an MIT license.&lt;/p&gt;
&lt;h2 id=&quot;new-versions&quot;&gt;New Versions&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;https://devguide.python.org/_static/release-cycle.svg&quot; alt=&quot;python-releases-chart&quot;&gt;&lt;/p&gt;
&lt;h3 id=&quot;python-3150-beta-3-is-here&quot;&gt;&lt;a href=&quot;https://blog.python.org/2026/06/python-3150-beta-3/&quot;&gt;Python 3.15.0 beta 3 is here!&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;This is the third of four planned beta releases of Python 3.15. Beta 4 is scheduled for 2026-07-18.&lt;/p&gt;
&lt;p&gt;Beta 2 was also released earlier this month.&lt;/p&gt;
&lt;h3 id=&quot;python-3146-and-31314-are-now-available&quot;&gt;&lt;a href=&quot;https://blog.python.org/2026/06/python-3146-31314/&quot;&gt;Python 3.14.6 and 3.13.14 are now available!&lt;/a&gt;&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;Python 3.14.6 is the sixth maintenance release of 3.14, containing around 179 bugfixes, build improvements and documentation changes since 3.14.5. Python 3.13.14 is the fourteenth maintenance release of 3.13, containing around 240 bugfixes, build improvements and documentation changes since 3.13.13.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id=&quot;pyodide-3140-release&quot;&gt;&lt;a href=&quot;https://blog.pyodide.org/posts/314-release/&quot;&gt;Pyodide 314.0 Release&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Pyodide 314.0 has been released, marking a major milestone for Python in the browser. The headline change is the acceptance of &lt;a href=&quot;https://peps.python.org/pep-0783/&quot;&gt;PEP 783&lt;/a&gt;, enabling package maintainers to publish Pyodide wheels directly to PyPI instead of relying on the Pyodide team to build and host 300+ packages. The project adopted a new Python-version-based versioning scheme (314 = Python 3.14). This release ships Python 3.14.2 and Emscripten 5.0.3, restores several standard library modules, converts Pyodide to a native ES module, adds experimental Node.js socket support, and introduces JavaScript interop improvements including proper &lt;code&gt;bigint&lt;/code&gt; roundtripping and enhanced array-like proxy support.&lt;/p&gt;
&lt;h2 id=&quot;tutorials&quot;&gt;Tutorials&lt;/h2&gt;
&lt;h3 id=&quot;deeplearningais-fast--efficient-llm-inference-with-vllm-from-red-hat&quot;&gt;DeepLearning.ai’s &lt;a href=&quot;https://www.deeplearning.ai/courses/fast-and-efficient-llm-inference-with-vllm&quot;&gt;Fast &amp;amp; Efficient LLM Inference with vLLM&lt;/a&gt; from Red Hat&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;You’ll run the full optimize-deploy-benchmark workflow on a real model: compressing an open-source Qwen model with LLM Compressor, serving it with vLLM, and benchmarking your deployment under realistic traffic using GuideLLM and lm-eval.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id=&quot;deeplearningais-voice-for-ai-agents-and-applications-from-vocal-bridge&quot;&gt;DeepLearning.ai’s &lt;a href=&quot;https://www.deeplearning.ai/courses/voice-for-ai-agents-and-applications&quot;&gt;Voice for AI Agents and Applications&lt;/a&gt; from Vocal Bridge&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;Taught by Ashwyn Sharma, CEO and Co-Founder of Vocal Bridge (an AI Fund portfolio company), this course covers three practical integration patterns that meet you where you are: voice embedded in an application, voice layered onto an existing agent without touching its logic, and voice as a tool your LLM can call when it decides a conversation is the right modality.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id=&quot;microsofts-rust-for-python-programmers&quot;&gt;Microsoft’s &lt;a href=&quot;https://microsoft.github.io/RustTraining/python-book/&quot;&gt;Rust for Python Programmers&lt;/a&gt;&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;A comprehensive guide to learning Rust for developers with Python experience. This guide covers everything from basic syntax to advanced patterns, focusing on the conceptual shifts required when moving from a dynamically-typed, garbage-collected language to a statically-typed systems language with compile-time memory safety.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;If you feel comfortable after learning this book and wish to move on, there’s another book from Microsoft covering async Rust: &lt;a href=&quot;https://microsoft.github.io/RustTraining/async-book/&quot;&gt;Async Rust: From Futures to Production&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&quot;articles&quot;&gt;Articles&lt;/h2&gt;
&lt;h3 id=&quot;free-threading-internals-reference-counting&quot;&gt;&lt;a href=&quot;https://vstinner.github.io/free-threading-reference-counting.html&quot;&gt;Free Threading internals: reference counting&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;This article by Victor Stinner explores Python’s free-threading reference counting challenges. Python uses reference counting (&lt;code&gt;Py_INCREF&lt;/code&gt;/&lt;code&gt;Py_DECREF&lt;/code&gt;) to track object lifetimes, requiring high efficiency. The “Gilectomy” project (2016-2018) initially used atomic operations but suffered severe performance issues — 18.9x slower on 7 cores due to lock contention. It later adopted buffered reference counting. The “nogil” project (2021-2026) solved this with &lt;em&gt;Biased Reference Counting&lt;/em&gt; (BRC), which recognizes that most objects are accessed by a single thread. BRC uses fast non-atomic operations for the owning thread and slower atomic operations for other threads, achieving better performance at the cost of increased implementation complexity.&lt;/p&gt;
&lt;h3 id=&quot;free-threading-internals-deferred-reference-counting&quot;&gt;&lt;a href=&quot;https://vstinner.github.io/free-threading-deferred-reference-counting.html&quot;&gt;Free Threading internals: deferred reference counting&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;This article continues to explore CPython’s Free Threading internals, focusing on techniques to reduce reference counting contention. &lt;strong&gt;Immortal objects&lt;/strong&gt; (&lt;a href=&quot;https://peps.python.org/pep-0683/&quot;&gt;PEP 683&lt;/a&gt;) skip &lt;code&gt;Py_INCREF&lt;/code&gt;/&lt;code&gt;Py_DECREF&lt;/code&gt; entirely, eliminating contention for commonly used singletons like small integers, strings, and built-in types. &lt;strong&gt;Deferred reference counting&lt;/strong&gt; avoids reference count adjustments altogether, relying on the tracing garbage collector for deallocation. &lt;strong&gt;Stack references&lt;/strong&gt; — tagged pointer-sized values introduced in Python 3.13 — allow the bytecode evaluation loop to skip most &lt;code&gt;INCREF&lt;/code&gt;/&lt;code&gt;DECREF&lt;/code&gt; calls. Together with Biased Reference Counting, these techniques resolve reference count contention, enabling Python threads to scale efficiently across CPU cores.&lt;/p&gt;
&lt;h3 id=&quot;free-threading-internals-pymutex&quot;&gt;&lt;a href=&quot;https://vstinner.github.io/free-threading-pymutex.html&quot;&gt;Free Threading internals: PyMutex&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;This is the third part in the series regarding Free Threading, in which Victor Stinner discusses &lt;code&gt;PyMutex&lt;/code&gt;, a lightweight 1-byte lock introduced in Python’s free-threading implementation (&lt;a href=&quot;https://peps.python.org/pep-0703/&quot;&gt;PEP 703&lt;/a&gt;), which replaces the Global Interpreter Lock with per-object locks. Designed for efficiency, PyMutex uses only 2 bits and is based on WebKit’s &lt;code&gt;WTF::Lock&lt;/code&gt;. It provides fast, inlineable lock/unlock operations using atomic compare-exchange for uncontended cases. Benchmarks show PyMutex is 1.4x to 4x faster than the previous &lt;code&gt;PyThread_type_lock&lt;/code&gt;. The implementation uses &lt;code&gt;_PyParkingLot&lt;/code&gt; APIs (futex-like) and supports various locking flags. In practice, the critical section API is preferred over direct PyMutex usage to avoid deadlocks.&lt;/p&gt;
&lt;h3 id=&quot;python-314-garbage-collection-rigamarole&quot;&gt;&lt;a href=&quot;https://theconsensus.dev/p/2026/06/06/python-3-14-garbage-collection-rigamarole.html&quot;&gt;Python 3.14 garbage collection rigamarole&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Python 3.14.0 replaced its traditional generational garbage collector with an incremental GC that reduced maximum pause times by scanning only part of the old generation per collection cycle. However, by doing less work each run, the incremental GC caused memory to accumulate in certain workloads — especially those generating cyclic garbage — leading to significantly higher peak memory usage and potential OOM kills. After users reported “memory pressure”, the Python team reverted the change in Python 3.14.5. Notably, the GC change was not implemented as a switchable alternative and bypassed the standard PEP process, leaving users who benefited from it with no option to use it.&lt;/p&gt;
&lt;h3 id=&quot;two-python-scoping-bugs-a-lesson-in-object-lifetimes&quot;&gt;&lt;a href=&quot;https://belderbos.dev/blog/two-scoping-bugs-object-lifetimes/&quot;&gt;Two Python Scoping Bugs: A Lesson in Object Lifetimes&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;This blog post illustrates two Python scoping bugs caused by mismatched object lifetimes. The first is &lt;strong&gt;over-sharing&lt;/strong&gt;: a module-level SQLAlchemy engine shared across tests causes state leaks (e.g., auto-increment IDs carry over). The fix is creating a per-test engine using an in-memory SQLite database. The second is &lt;strong&gt;under-sharing&lt;/strong&gt;: a FastAPI dependency that instantiates a new &lt;code&gt;FakeDataSource&lt;/code&gt; per request gives each browser tab its own diverging simulator state instead of a shared reality. Fixes include &lt;code&gt;@lru_cache&lt;/code&gt; or &lt;code&gt;app.state&lt;/code&gt; for shared runtime state.&lt;/p&gt;
&lt;h3 id=&quot;down-the-iterator-rabbit-hole&quot;&gt;&lt;a href=&quot;https://www.thepythoncodingstack.com/p/down-the-iterator-rabbit-hole-python&quot;&gt;Down The Iterator Rabbit Hole&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;This article explores Python iterator chains and how consuming values from one iterator affects others in the chain. Iterators don’t store data — they create lightweight streams that fetch from the original source on demand. When you chain iterators (e.g., a list → first_iter → second_iter → third_iter), calling &lt;code&gt;next()&lt;/code&gt; on any iterator in the chain consumes values that propagate through all dependent iterators. The author demonstrates how this can cause unexpected behavior, since iterators are one-way streams. The key takeaway: when building iterator chains, only use the final iterator to avoid confusion. Independent iterators from the same source, however, remain unaffected by each other.&lt;/p&gt;
&lt;h3 id=&quot;choosing-a-python-task-queue-library-in-2026&quot;&gt;&lt;a href=&quot;https://aleksul.space/posts/choosing-python-task-queue-library/&quot;&gt;Choosing a Python task queue library in 2026&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;This article compares five Python task queue libraries in 2026: Celery, Dramatiq, FastStream, Taskiq, and Repid. It evaluates them across broker support, async vs. sync capabilities, throughput benchmarks for both I/O-bound and CPU-bound workloads, and features like dependency injection, result backends, AsyncAPI integration, and retry handling. The author (Repid’s creator) finds that async-native libraries like Repid, FastStream, and Taskiq outperform sync-first Celery and Dramatiq in I/O-heavy scenarios, while differences shrink for CPU-bound tasks. Recommendations: Celery for the largest ecosystem, FastStream for stream-processing patterns, and Repid for high-throughput asyncio-native workloads.&lt;/p&gt;
&lt;h3 id=&quot;how-and-why-to-run-modified-python-code-using-the-ast-module&quot;&gt;&lt;a href=&quot;https://pydantic.dev/articles/eval-type-backport&quot;&gt;How and why to run modified Python code using the ast module&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;This Pydantic blog demonstrates how to use Python’s &lt;code&gt;ast&lt;/code&gt; module to parse, transform, and execute modified Python code at runtime. Using the &lt;code&gt;eval-type-backport&lt;/code&gt; library as an example, it shows how to convert newer type syntax like &lt;code&gt;X | Y&lt;/code&gt; into &lt;code&gt;typing.Union[X, Y]&lt;/code&gt; for older Python versions by manipulating abstract syntax trees with &lt;code&gt;ast.NodeTransformer&lt;/code&gt;. The author shares how mastering AST metaprogramming helped him land jobs at Grist and Pydantic, and argues this skill is increasingly valuable in the AI era since it’s harder to automate and essential for inspecting and controlling code produced by AI agents.&lt;/p&gt;
&lt;h3 id=&quot;why-i-wrote-pep-832--virtual-environment-discovery&quot;&gt;&lt;a href=&quot;https://snarky.ca/why-i-wrote-pep-832-virtual-environment-discovery/&quot;&gt;Why I wrote PEP 832 – virtual environment discovery&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Brett Cannon proposes PEP 832 which addresses the challenge of virtual environment discovery for tools like VS Code. The problem: editors struggle to know which workflow tool (Poetry, uv, Hatch, etc.) a project uses and where environments are stored, making it difficult to run code and analyze dependencies. Proposed solutions include using .venv directories for local discovery, a .python-envs file listing environment paths, and a [workflow] table in pyproject.toml with a workflow server protocol (WSP) for tool communication. The goal is creating a tool-agnostic standard that simplifies environment setup across all editors, not just VS Code.&lt;/p&gt;
&lt;h3 id=&quot;vulnerability-and-malware-checks-in-uv&quot;&gt;&lt;a href=&quot;https://astral.sh/blog/uv-audit&quot;&gt;Vulnerability and malware checks in uv&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Astral announces two new security features for &lt;strong&gt;uv&lt;/strong&gt;: &lt;code&gt;uv audit&lt;/code&gt;, a native command that scans dependencies for known vulnerabilities and deprecated packages — serving as a 4x–10x faster alternative to &lt;code&gt;pip-audit&lt;/code&gt; — and a lightweight malware check integrated into sync operations (&lt;code&gt;uv add&lt;/code&gt;, &lt;code&gt;uv sync&lt;/code&gt;, etc.) that queries &lt;a href=&quot;https://osv.dev/&quot;&gt;OSV&lt;/a&gt; for known malicious packages, blocking installation before harmful code executes. Both features are currently in preview. The post explains the growing importance of supply chain security, distinguishes malware remediation from ordinary vulnerability patching, and outlines future plans including tighter tooling integration, improved finding precision, and support for additional vulnerability backends and packaging formats.&lt;/p&gt;
&lt;h3 id=&quot;give-your-agent-its-own-computer&quot;&gt;&lt;a href=&quot;https://www.langchain.com/blog/give-your-ai-agent-its-own-computer&quot;&gt;Give your agent its own computer&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;LangChain’s &lt;em&gt;LangSmith Sandboxes&lt;/em&gt; solve a critical problem: AI agents need real computers to execute code, but giving them access to your infrastructure is dangerous. Containers aren’t secure enough for untrusted, model-generated code. LangSmith Sandboxes provide hardware-virtualized microVMs—each agent gets its own isolated computer with filesystem, shell, package manager, and persistent state. Features include instant startup, snapshots for forking sessions, pre-warmed blueprints, and secure credential injection. This enables production-ready coding assistants, CI agents, data pipelines, and RL training environments that can scale from zero to thousands of instances.&lt;/p&gt;
&lt;h3 id=&quot;a-practical-guide-to-becoming-an-ai-native-engineer&quot;&gt;&lt;a href=&quot;https://blog.bytebytego.com/p/a-practical-guide-to-becoming-an&quot;&gt;A Practical Guide to Becoming an AI-Native Engineer&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;This ByteByteGo article presents a practical guide for engineers transitioning to AI-native engineering. Rather than replacing engineers, AI shifts their role from code writers to orchestrators who command AI agents for 100x output. The guide outlines four core practices: context engineering (curating project-specific AI inputs), specification-driven development, critical verification (since ~45% of AI code contains security flaws), and problem decomposition. It recommends spending 40% of time on context-setting, 20% on generation, and 40% on verification. The article also details a three-phase individual transformation journey, team cultural foundations, an Agentic Development Life Cycle, and essential security guardrails against emerging AI-code threats.&lt;/p&gt;
&lt;h3 id=&quot;beyond-code-generation-rethinking-engineering-productivity-in-the-age-of-ai-agents&quot;&gt;&lt;a href=&quot;https://dropbox.tech/culture/beyond-code-generation-rethinking-engineering-productivity-in-the-age-of-ai-agents&quot;&gt;Beyond code generation: rethinking engineering productivity in the age of AI agents&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Dropbox’s blog post argues that AI coding tools, while boosting code generation, merely shift bottlenecks downstream — into code review, CI, validation, release coordination, and production operations. Their internal agent platform, Nova, now generates ~1 in 12 pull requests, handling tasks like migrations and bug investigation within guardrails. The key insight: AI doesn’t eliminate bottlenecks but relocates them. Dropbox rethinks productivity measurement through a four-stage model — Fuel, Adoption, Output, and Impact — emphasizing customer value over raw PR throughput. Engineers’ roles evolve toward defining intent and reviewing outputs. Ultimately, success depends not on having the best models but on building the best systems around them.&lt;/p&gt;
&lt;h3 id=&quot;dont-rely-on-instructions-use-agent-hooks-to-enforce-guardrails&quot;&gt;&lt;a href=&quot;https://zarar.dev/agent-hooks-deterministic-guardrails-for-ai-generated-code/&quot;&gt;Don’t rely on instructions, use Agent Hooks to enforce guardrails&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;This blog post demonstrates “Agent Hooks” as deterministic guardrails for AI coding agents like Claude Code, arguing that text-based instructions (e.g., in CLAUDE.md) are unreliable since agents often ignore them. Unlike git hooks that run after code is written, agent hooks intercept the agent’s workflow in real time. The author demonstrates two practical hooks: a &lt;strong&gt;PreToolUse&lt;/strong&gt; hook that blocks raw &lt;code&gt;&amp;lt;input&amp;gt;&lt;/code&gt; tags, forcing use of custom design components, and a &lt;strong&gt;Stop&lt;/strong&gt; hook that prevents the agent from declaring completion until a design-system ratchet test passes. Both provide guaranteed, deterministic enforcement that prompt-based instructions cannot.&lt;/p&gt;
&lt;h3 id=&quot;how-to-keep-your-developer-instincts-when-ai-writes-the-code&quot;&gt;&lt;a href=&quot;https://belderbos.dev/blog/dont-delegate-the-friction/&quot;&gt;How to Keep Your Developer Instincts When AI Writes the Code&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;The author argues that while AI tools promise to eliminate friction in software development, this friction is essential for building engineering intuition and judgment. He categorizes friction into three types: worth deleting (boilerplate), worth keeping (debugging, design decisions), and worth seeking out (deliberate practice). To avoid losing critical thinking skills, developers should adopt deliberate practices like forming expectations before prompting, carefully reviewing AI diffs, and coding without agents weekly. This routine is especially crucial for junior developers to build foundational skills and maintain the craft of engineering in an AI-driven era.&lt;/p&gt;
&lt;h3 id=&quot;the-speed-of-prototyping-in-the-age-of-ai&quot;&gt;&lt;a href=&quot;https://darylcecile.net/notes/speed-of-prototyping-age-of-ai&quot;&gt;The Speed of Prototyping in the Age of AI&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;The author reflects on how AI coding agents have transformed his prototyping workflow. Previously, his bottleneck was the time needed to scaffold projects; now, AI removes that friction, enabling him to ship far more functional prototypes—citing projects like the Sakoa programming language, the Kato notation format, and others. He estimates roughly 4x faster output, but the bigger shift is qualitative: he now thinks at a higher abstraction level, focusing on system boundaries and specifications rather than line-by-line implementation. This skill — clearly delegating work — transfers to managing people too. However, he deliberately carves out time for manual coding to stay sharp, and remains cautious about AI’s broader environmental, financial, and social implications.&lt;/p&gt;
&lt;h3 id=&quot;domain-expertise-has-always-been-the-real-moat&quot;&gt;&lt;a href=&quot;https://www.brethorsting.com/blog/2026/05/domain-expertise-has-always-been-the-real-moat/&quot;&gt;Domain Expertise Has Always Been the Real Moat&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;The article argues that domain expertise, not coding ability, has always been the true competitive moat in software development. Agentic AI has severed the link between understanding a domain and producing code, making code generation cheap while domain knowledge remains scarce. A domain expert with no coding background can now be remarkably effective with AI tools because they can verify whether outputs are correct. Conversely, a skilled generalist engineer lacking domain knowledge cannot distinguish plausible-but-wrong answers from right ones. The author advises experienced engineers to invest in deeply learning a real domain — whether regulatory, industrial, or scientific — as that verified domain model is the one thing AI cannot supply and is now the most valuable asset.&lt;/p&gt;
&lt;h3 id=&quot;software-is-not-a-single-player-game&quot;&gt;&lt;a href=&quot;https://www.davidpoll.com/2026/06/software-is-not-a-single-player-game/&quot;&gt;Software Is Not A Single-Player Game&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;This blog post argues that software development is inherently a multiplayer game, not a solo endeavor. The author contends that code review — not design docs — is where the most consequential engineering judgments are made. As AI makes producing code dramatically cheaper, the primary artifact of collaboration is shifting from abstract documents to real, working changes. Teams can now reason about actual implementations rather than proxies, making review more central, not less. While some decisions still require upfront planning, that boundary is shrinking. The author traces this collaborative pattern back to Linux’s early patch-review culture and concludes that building lasting software has always depended on groups exercising shared judgment together over concrete code changes.&lt;/p&gt;
&lt;h3 id=&quot;ais-brave-new-world-of-technical-debt&quot;&gt;&lt;a href=&quot;https://www.infoworld.com/article/4178964/ais-brave-new-world-of-technical-debt.html&quot;&gt;AI’s brave new world of technical debt&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;This article argues that AI agents are creating a dangerous new form of technical debt in software development. Agents automate tasks by adding layers of delegation — MCP servers, prompts, and auto-managed dependencies — but each layer becomes a dependency and a security risk. Studies show AI agents select vulnerable package versions more often than humans and even hallucinate non-existent dependencies. While tools like Anthropic’s Claude Mythos can cheaply discover zero-day exploits in old code, the article urges teams to adopt disciplined practices: minimize their attack surface, version-control prompts, and treat all AI integrations as production dependencies requiring rigorous review and governance.&lt;/p&gt;
&lt;h3 id=&quot;vibe-coder-vs-software-engineer&quot;&gt;&lt;a href=&quot;https://yusufaytas.com/vibe-coder-vs-software-engineer&quot;&gt;Vibe Coder vs Software Engineer&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;This article distinguishes between “vibe coders” and “software engineers” in the age of AI-assisted development. A vibe coder focuses on rapid prototyping and measuring time to a working demo, while a software engineer prioritizes “time to safe merge” — encompassing code review, testing, ownership, rollback, and long-term maintainability. The author argues that AI-generated code must meet the same standards as hand-written code, and that engineers must fully own and understand what they submit, since AI cannot take accountability. Vibe coding suits discovery and ideation, but production delivery demands engineering discipline, bounded tasks, and human judgment built through apprenticeship and system knowledge.&lt;/p&gt;
&lt;h2 id=&quot;podcasts&quot;&gt;Podcasts&lt;/h2&gt;
&lt;h3 id=&quot;-realpython-podcast&quot;&gt;🐍 RealPython Podcast&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://realpython.com/podcasts/rpp/298/&quot;&gt;Episode 298: Reducing the Size of Python Docker Containers&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://realpython.com/podcasts/rpp/299/&quot;&gt;Episode 299: EuroPython 2026: Celebrating 25 Years&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://realpython.com/podcasts/rpp/300/&quot;&gt;Episode 300: Maintaining Your Python Developer Instincts While Using LLM Tools&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;-python-bytes-podcast&quot;&gt;🍕 Python Bytes Podcast&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://pythonbytes.fm/episodes/show/482/mr.-beasts-episode&quot;&gt;#482 Mr. Beast’s episode&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://pythonbytes.fm/episodes/show/483/thanks-brian&quot;&gt;#483 Thanks Brian&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://pythonbytes.fm/episodes/show/484/all-our-tools&quot;&gt;#484 All our tools&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://pythonbytes.fm/episodes/show/485/creating-memories&quot;&gt;#485 Creating memories&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;-talk-python-to-me&quot;&gt;📣 Talk Python to me&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://talkpython.fm/episodes/show/551/stroll-down-startup-lane-2026&quot;&gt;#551: Stroll Down Startup Lane - 2026&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://talkpython.fm/episodes/show/552/astral-joins-openai&quot;&gt;#552: Astral joins OpenAI&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://talkpython.fm/episodes/show/553/all-of-our-tools&quot;&gt;#553: All of our tools&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;repositories&quot;&gt;Repositories&lt;/h2&gt;
&lt;h3 id=&quot;lvcidpsycheauto-browser-mit&quot;&gt;&lt;a href=&quot;https://github.com/LvcidPsyche/auto-browser&quot;&gt;LvcidPsyche/auto-browser&lt;/a&gt; (MIT)&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;Auto Browser is an MCP-native browser control plane for authorized workflows. It gives MCP clients, LLM agents, and operators a shared Playwright browser with human takeover, reusable auth profiles, approvals, audit trails, and local-first deployment.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id=&quot;nvidiaskillspector-apache-20&quot;&gt;&lt;a href=&quot;https://github.com/NVIDIA/SkillSpector&quot;&gt;NVIDIA/SkillSpector&lt;/a&gt; (Apache-2.0)&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;Security scanner for AI agent skills. Detect vulnerabilities, malicious patterns, and security risks before installing agent skills.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id=&quot;microsoftcoreutils-mit&quot;&gt;&lt;a href=&quot;https://github.com/microsoft/coreutils&quot;&gt;microsoft/coreutils&lt;/a&gt; (MIT)&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;A Microsoft-maintained build of &lt;code&gt;uutils/coreutils&lt;/code&gt;, &lt;code&gt;findutils&lt;/code&gt;, and &lt;code&gt;grep&lt;/code&gt; packaged as a single multi-call binary for Windows. The goal is to make moving between Linux, macOS, WSL, containers, and Windows frictionless.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;have-time-for-some-fun&quot;&gt;Have time for some fun?&lt;/h2&gt;
&lt;h3 id=&quot;sonys-state-of-play-2026-6-2&quot;&gt;Sony’s State of Play (2026-6-2)&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.playstation.com/tachyon/2026/06/35782cc3ce6947f374ee128c62052a655a8cdb64-scaled.jpg?resize=1088%2C612&amp;amp;crop_strategy=smart&amp;amp;zoom=1&quot; alt=&quot;state-of-play-2026-6&quot;&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;God of War: Laufey, the title from Santa Monica focusing on Kratos’ wife, is coming to PS5 with release date unknown.&lt;/li&gt;
&lt;li&gt;Phantom Blade Zero, the fast-paced action RPG from S-Game, is delayed to October 29th, 2026 with full trailer and pre-order available soon in summer.&lt;/li&gt;
&lt;li&gt;Control Resonant, the sequel to Control (2019), is coming September 24th, 2026.&lt;/li&gt;
&lt;li&gt;Tomb Raider: Legacy of Atlantis, another “remake” of the first Tomb Raider game, is coming February 12th, 2027.&lt;/li&gt;
&lt;li&gt;Onimusha: Way of the Sword from Capcom launches this September, with a playable demo available right now.&lt;/li&gt;
&lt;li&gt;Ace Combat 8: Wings of Theve from Bandai Namco is coming this October.&lt;/li&gt;
&lt;li&gt;Until Dawn 2 is announced, “featuring a brand new cast, a whole new world to explore, and gut-wrenching decisions”.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;summer-game-fest&quot;&gt;Summer Game Fest&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://cdn.mos.cms.futurecdn.net/pAgh4TNRRiPZKoPYGrHptS-1200-80.jpg.webp&quot; alt=&quot;summer-game-fest-2026&quot;&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Resident Evil Veronica, the remake of Resident Evil: Code: Veronica (2000) from Capcom, follows Claire Redfield searching for her brother Chris and is coming in 2027 to PS5, Xbox Series X|S, Nintendo Switch 2, and PC.&lt;/li&gt;
&lt;li&gt;Final Fantasy VII Revelation, the third and final chapter in the FF7 Remake trilogy from Square Enix, adds Vincent and Cid as playable party members with a new Job Class system, and launches Spring 2027 on PS5, Xbox Series X|S, PC, and Nintendo Switch 2 with day-one multiplatform release.&lt;/li&gt;
&lt;li&gt;Stellar Blade: Blood Rain, the sequel to Stellar Blade from Shift Up, introduces new protagonist Evie and continues the story beyond the first game, with Shift Up self-publishing this time and no platforms or release date confirmed yet.&lt;/li&gt;
&lt;li&gt;Guild Wars 3 from ArenaNet, the first new entry in the franchise since 2012, is set over a thousand years before the original Guild Wars in the land of Orr, featuring momentum-based movement and coming to PC and PS5 (the series’ first console release) with beta in Fall 2027.&lt;/li&gt;
&lt;li&gt;Trine 6: Together in Time from Frozenbyte, featuring two new playable characters Moira and Adrius alongside the classic trio, supports 1–4 player co-op and launches September 17, 2026 on PC, Nintendo Switch, Nintendo Switch 2, PS5, and Xbox Series X|S.&lt;/li&gt;
&lt;li&gt;Alien: Isolation 2 from Creative Assembly and SEGA, set on a remote storm-ravaged colony world at Kurosaki Station with both interior and exterior environments, is coming in 2027 to PS5, Xbox Series X|S, Nintendo Switch 2, and PC.&lt;/li&gt;
&lt;li&gt;Blood Message from 24 Entertainment and NetEase, the publisher’s first AAA single-player title, is a cinematic action-adventure set in 848 AD Tang Dynasty China where a nameless messenger and his son embark on a perilous 1,000-mile odyssey to Chang’an, coming to PC and consoles with no release date yet.&lt;/li&gt;
&lt;li&gt;Hitman Classic Trilogy Remastered from Saber Interactive and IO Interactive, collecting Hitman: Codename 47, Hitman 2: Silent Assassin, and Hitman: Contracts with upgraded visuals and a graphics toggle, is coming to PC, PS5, and Xbox Series X|S in 2027.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;p&gt;As we wrap up this journey together, I want to take a moment to express my gratitude for your reading. If you’ve enjoyed this issue and would like to help sustain this blog, please consider &lt;a href=&quot;https://github.com/blueberry-py/blog/stargazers&quot;&gt;starring this blog on github&lt;/a&gt;, it would be great motivation for me to keep updating!&lt;/p&gt;
&lt;p&gt;Alright, that concludes the June Edition of “This Month for Pythonistas”. Thank you again for reading my post and I hope you enjoy it or find something useful. Happy coding and see you in July! 👋&lt;/p&gt;
</description><pubDate>Tue, 30 Jun 2026 13:00:00 GMT</pubDate><category>python</category><category>python</category><category>news</category><category>podcast</category><category>AI</category><category>pycon</category><author>Zeyang Lin</author></item><item><title>[one-liner] Install OpenCode</title><link>https://blueberry-py.github.io/blog/post/one-liner-opencode/</link><guid isPermaLink="true">https://blueberry-py.github.io/blog/post/one-liner-opencode/</guid><description>&lt;h2 id=&quot;one-liner-series-opencode&quot;&gt;One-Liner series: OpenCode&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://opencode.ai/docs#install&quot;&gt;source: OpenCode documentation&lt;/a&gt;&lt;/p&gt;
&lt;h3 id=&quot;install-on-linux-macos&quot;&gt;Install on Linux, macOS&lt;/h3&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;curl&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; -fsSL&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; https://opencode.ai/install&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; |&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; bash&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;install-on-windows&quot;&gt;Install on Windows&lt;/h3&gt;
&lt;h4 id=&quot;install-with-npm&quot;&gt;Install with npm&lt;/h4&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;npm&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; install&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; -g&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; opencode-ai&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h4 id=&quot;install-with-chocolatey&quot;&gt;Install with chocolatey&lt;/h4&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;choco&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; install&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; opencode&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;verify-installation&quot;&gt;Verify installation&lt;/h3&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;opencode&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; --version&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;update&quot;&gt;Update&lt;/h3&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;opencode&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; upgrade&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
</description><pubDate>Mon, 29 Jun 2026 09:06:00 GMT</pubDate><category>cli</category><category>linux</category><category>opencode</category><category>ai</category><category>cli</category><category>windows</category><category>linux</category><category>ubuntu</category><category>macos</category><author>Zeyang Lin</author></item><item><title>[one-liner] Install Bun</title><link>https://blueberry-py.github.io/blog/post/one-liner-bun/</link><guid isPermaLink="true">https://blueberry-py.github.io/blog/post/one-liner-bun/</guid><description>&lt;h2 id=&quot;one-liner-series-bun&quot;&gt;One-Liner series: Bun&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://bun.com/docs/installation&quot;&gt;source: Bun docs&lt;/a&gt;&lt;/p&gt;
&lt;h3 id=&quot;install-on-linux-and-macos&quot;&gt;Install on Linux and macOS&lt;/h3&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;curl&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; -fsSL&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; https://bun.com/install&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; |&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; bash&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;install-on-windows-powershell&quot;&gt;Install on Windows (PowerShell)&lt;/h3&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;powershell&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;powershell &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;c &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;irm bun.sh/install.ps1|iex&quot;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;update&quot;&gt;Update&lt;/h3&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;bun&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; upgrade&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
</description><pubDate>Sat, 13 Jun 2026 08:20:00 GMT</pubDate><category>cli</category><category>linux</category><category>bun</category><category>javascript</category><category>windows</category><category>linux</category><category>ubuntu</category><category>macos</category><author>Zeyang Lin</author></item><item><title>[one-liner] Install pnpm</title><link>https://blueberry-py.github.io/blog/post/one-liner-pnpm/</link><guid isPermaLink="true">https://blueberry-py.github.io/blog/post/one-liner-pnpm/</guid><description>&lt;h2 id=&quot;one-liner-series-pnpm&quot;&gt;One-Liner series: pnpm&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://pnpm.io/installation&quot;&gt;source: pnpm docs&lt;/a&gt;&lt;/p&gt;
&lt;h3 id=&quot;install-on-posix-systems-except-intel-macs-darwin-x64&quot;&gt;Install on POSIX systems (except Intel Macs (darwin-x64))&lt;/h3&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;curl&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; -fsSL&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; https://get.pnpm.io/install.sh&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; |&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; sh&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; -&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;install-on-windows-powershell&quot;&gt;Install on Windows (PowerShell)&lt;/h3&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;powershell&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;Invoke-WebRequest&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; https:&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;get.pnpm.io&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;/&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;install.ps1 &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;UseBasicParsing &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;|&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; Invoke-Expression&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;update&quot;&gt;Update&lt;/h3&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;pnpm&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; self-update&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
</description><pubDate>Thu, 11 Jun 2026 08:20:00 GMT</pubDate><category>cli</category><category>linux</category><category>pnpm</category><category>javascript</category><category>windows</category><category>linux</category><category>ubuntu</category><category>macos</category><author>Zeyang Lin</author></item><item><title>This Month for Pythonistas - May 2026</title><link>https://blueberry-py.github.io/blog/post/this-month-for-pythonistas-2026-05/</link><guid isPermaLink="true">https://blueberry-py.github.io/blog/post/this-month-for-pythonistas-2026-05/</guid><description>&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;python&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;from&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; datetime &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;import&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; date&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;print&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(date.today().year, date.today().month)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# 2026 5&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img alt=&quot;issue-2026-05&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1280&quot; height=&quot;720&quot; src=&quot;/blog/_astro/splash.BYo7n7xb_Z1iGbfE.webp&quot;&gt;&lt;/p&gt;
&lt;p&gt;Welcome back Pythonistas! This is the May 2026 issue of “This Month for Pythonistas”, bringing you curated Python news, tutorials, articles, podcasts and community highlights.&lt;/p&gt;
&lt;p&gt;Before we continue, please note that this blog is synced across the following platforms:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://blueberry-py.github.io/blog/post/this-month-for-pythonistas-2026-05/&quot;&gt;Github Pages&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://blueberrypy.netlify.app/post/this-month-for-pythonistas-2026-05/&quot;&gt;Netlify&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://blueberrypy.onrender.com/post/this-month-for-pythonistas-2026-05/&quot;&gt;Render&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://blueberrypy-blog.vercel.app/post/this-month-for-pythonistas-2026-05/&quot;&gt;Vercel&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Ready? Let’s get started!&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&quot;events--social&quot;&gt;Events &amp;amp; Social&lt;/h2&gt;
&lt;h3 id=&quot;pycon-us-2026&quot;&gt;PyCon US 2026&lt;/h3&gt;
&lt;p&gt;PyCon US was held in Long Beach, California this May with 2000+ total attendees, 57% of which were first-time. It was a great success - thanks to PSF and the whole community - and I look forward to PyCon US 2027 already (still in Long Beach)! You can check out social media (X, Mastodon, BlueSky, etc.) for highlights.&lt;/p&gt;
&lt;p&gt;The recordings of the conference would be published to PyCon US Youtube channel later this year.&lt;/p&gt;
&lt;h3 id=&quot;introducing-claude-opus-48&quot;&gt;&lt;a href=&quot;https://www.anthropic.com/news/claude-opus-4-8&quot;&gt;Introducing Claude Opus 4.8&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://www.anthropic.com/_next/image?url=https%3A%2F%2Fwww-cdn.anthropic.com%2Fimages%2F4zrzovbb%2Fwebsite%2F0eaa0ed2dce9810169112e1c77de2585fcf1f5c2-2880x1620.jpg&amp;amp;w=3840&amp;amp;q=75&quot; alt=&quot;claude-opus-4.8&quot;&gt;&lt;/p&gt;
&lt;p&gt;Anthropic introduced &lt;strong&gt;Claude Opus 4.8&lt;/strong&gt;, an upgrade over Opus 4.7 with improved benchmark performance across coding, agentic skills, reasoning, and knowledge work, at the same price. Key improvements include greater honesty — Opus 4.8 is roughly four times less likely to let code flaws pass unremarked — and lower misaligned behavior rates. Launching alongside it are: &lt;strong&gt;dynamic workflows&lt;/strong&gt; in Claude Code (enabling massive parallel subagent tasks like codebase-scale migrations), &lt;strong&gt;effort control&lt;/strong&gt; on claude.ai (letting users adjust how deeply Claude thinks), and &lt;strong&gt;system entries inside the messages array&lt;/strong&gt; via the API. Opus 4.8 defaults to high effort, with “extra” and “max” options for harder tasks. Anthropic also teased upcoming cheaper Opus-class models and a more intelligent “Mythos”-class model pending stronger safety safeguards.&lt;/p&gt;
&lt;h2 id=&quot;new-versions&quot;&gt;New Versions&lt;/h2&gt;
&lt;h3 id=&quot;python-3150-beta-1-is-here&quot;&gt;&lt;a href=&quot;https://blog.python.org/2026/05/python-3150-beta-1/&quot;&gt;Python 3.15.0 beta 1 is here!&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Python 3.15.0 beta 1 was released on May 7, 2026, marking the first beta and feature freeze. Developers encourage third-party projects to test the preview and report bugs, though it is not recommended for production. Major features include explicit lazy imports, new built-in types like &lt;code&gt;frozendict&lt;/code&gt; and &lt;code&gt;sentinel&lt;/code&gt;, a dedicated profiling package, default &lt;em&gt;UTF-8&lt;/em&gt; encoding, &lt;code&gt;TypedDict&lt;/code&gt; improvements, and an upgraded JIT compiler delivering 8–13% performance gains. Other changes include frame pointers by default, unpacking in comprehensions, and stable ABI for free-threaded builds.&lt;/p&gt;
&lt;p&gt;The tarball and binary distributions for beta 1 can be downloaded &lt;a href=&quot;https://www.python.org/downloads/release/python-3150b1/&quot;&gt;here&lt;/a&gt;. The next pre-release, 3.15.0b2, is scheduled for June 2, 2026.&lt;/p&gt;
&lt;h3 id=&quot;python-3145-is-out&quot;&gt;&lt;a href=&quot;https://blog.python.org/2026/05/python-3145-is-out/&quot;&gt;Python 3.14.5 is out!&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;This is a very rare patch release due to a release candidate being released several days before the final release.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The incremental garbage collector shipped in Python 3.14.0 - 3.14.4 has been reverted back to the generational garbage collector from 3.13, due to a number of reports of significant memory pressure in production environments.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id=&quot;whats-new-in-pip-261---lockfiles-and-dependency-cooldowns&quot;&gt;&lt;a href=&quot;https://ichard26.github.io/blog/2026/04/whats-new-in-pip-26.1/&quot;&gt;What’s new in pip 26.1 - lockfiles and dependency cooldowns!&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;pip 26.1, released April 2026, drops Python 3.9 support and introduces key features: experimental lockfile support via &lt;code&gt;-r pylock.toml&lt;/code&gt; (PEP 751), dependency cooldowns with &lt;code&gt;--uploaded-prior-to=P3D&lt;/code&gt;, and fixes to the 2020 resolver. Security updates patch archive handling vulnerabilities and upgrade &lt;code&gt;urllib3&lt;/code&gt; to 2.x. The legacy resolver moves closer to removal (planned 2027), and &lt;code&gt;PIP_CONSTRAINT&lt;/code&gt; for build dependencies is deprecated for pip 26.2. A future &lt;code&gt;pip sync&lt;/code&gt; command is planned to complete lockfile support.&lt;/p&gt;
&lt;h3 id=&quot;pyrefly-v10-is-here&quot;&gt;&lt;a href=&quot;https://pyrefly.org/blog/v1.0/&quot;&gt;Pyrefly v1.0 is here!&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://pyrefly.org/assets/images/v1.0-53562449e846074eba274828c237e963.jpg&quot; alt=&quot;pyrefly-1.0-release&quot;&gt;&lt;/p&gt;
&lt;p&gt;Pyrefly, Meta’s open-source Python type checker and language server, has reached its stable v1.0 release, marking it as production-ready after over 60 minor releases since its alpha launch in mid-2025. Already used at scale by Instagram, PyTorch, NumPy, Pandas, and JAX, Pyrefly delivers significant performance improvements — up to 125x faster incremental editor updates and 34% faster full type checks on large codebases. It offers both CLI and IDE extension support for consistent results across environments, with built-in support for Pydantic and Django, and an upcoming integration with Microsoft’s Pylance via a new Type Server Protocol. The tool supports gradual adoption through configurable presets, migration from Mypy/Pyright, and incremental type annotation via &lt;code&gt;pyrefly infer&lt;/code&gt;. Looking ahead, Pyrefly is developing experimental tensor shape checking for ML frameworks and exploring integration into AI-assisted coding workflows.&lt;/p&gt;
&lt;h3 id=&quot;pytorch-212-release-blog&quot;&gt;&lt;a href=&quot;https://pytorch.org/blog/pytorch-2-12-release-blog/&quot;&gt;PyTorch 2.12 Release Blog&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;PyTorch 2.12 has been released with 2,926 commits from 457 contributors. Key highlights include: batched &lt;code&gt;linalg.eigh&lt;/code&gt; on CUDA is up to 100x faster; a new device-agnostic &lt;code&gt;torch.accelerator.Graph&lt;/code&gt; API unifies graph capture across CUDA, XPU, and other backends; &lt;code&gt;torch.export.save&lt;/code&gt; now supports Microscaling (MX) quantization formats for deploying compressed models; fused Adagrad optimizer joins Adam, AdamW, and SGD; and &lt;code&gt;torch.cond&lt;/code&gt; control flow can now be captured within CUDA Graphs. ROCm users gain expandable memory segments, rocSHMEM symmetric memory collectives, and FlexAttention pipelining. TorchScript is now deprecated, with &lt;code&gt;torch.export&lt;/code&gt; as its replacement.&lt;/p&gt;
&lt;h2 id=&quot;tutorials&quot;&gt;Tutorials&lt;/h2&gt;
&lt;h3 id=&quot;deeplearningais-build-interactive-agents-with-generative-ui-from-copilotkit&quot;&gt;DeepLearning.ai’s &lt;a href=&quot;https://www.deeplearning.ai/short-courses/build-interactive-agents-with-generative-ui/&quot;&gt;Build Interactive Agents with Generative UI&lt;/a&gt; from CopilotKit&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;You’ll work across the full Generative UI Spectrum, from hand-crafted components you control precisely, to declarative layouts the agent assembles from building blocks, all the way to open-ended experiences powered by MCP Apps. You’ll finish by building a canvas application where the agent works alongside the user on shared data. By the end, you’ll have a production-ready fullstack agent built on CopilotKit and AG-UI, an open protocol with first-party integrations across LangGraph, Google, AWS, Microsoft, and more.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id=&quot;deeplearningais-ai-agents-for-image-and-video-generation-from-google&quot;&gt;DeepLearning.ai’s &lt;a href=&quot;https://www.deeplearning.ai/courses/ai-agents-for-image-and-video-generation&quot;&gt;AI Agents for Image and Video Generation&lt;/a&gt; from Google&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;In this course, you’ll learn three complementary evaluation techniques, then combine them with image and video generation to build autonomous media agents. You’ll build an image agent that turns brand guidelines into UI mockups, and a video agent that plans multi-scene explainers, animates reference frames with synchronized audio, and checks consistency across scenes. In the final lesson, you’ll use Gemini CLI to build a generative media agent in natural language, packaging what you’ve learned into reusable agent skills.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;articles&quot;&gt;Articles&lt;/h2&gt;
&lt;h3 id=&quot;pep-661--sentinel-values&quot;&gt;&lt;a href=&quot;https://peps.python.org/pep-0661/&quot;&gt;PEP 661 – Sentinel Values&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;PEP 661 is &lt;strong&gt;accepted&lt;/strong&gt;. It introduces a new built-in &lt;code&gt;sentinel()&lt;/code&gt; class for creating unique sentinel values in Python. Sentinel values are special placeholder objects used when a distinct sentinel is needed that’s different from None. The new builtin addresses issues with common sentinel idioms like &lt;code&gt;object()&lt;/code&gt; which have uninformative reprs, lack distinct types, and behave unexpectedly after copying or pickling. The &lt;code&gt;sentinel(name)&lt;/code&gt; call creates a sentinel with a readable repr, proper identity preservation, pickling support, and type-checking integration. Sentinels are truthy and should be checked with &lt;code&gt;is&lt;/code&gt; operator. The feature targets Python 3.15+ with both Python and C API implementations, providing a standardized way to define sentinels throughout the standard library and user code.&lt;/p&gt;
&lt;h3 id=&quot;python-315-features-that-didnt-make-the-headlines&quot;&gt;&lt;a href=&quot;https://blog.changs.co.uk/python-315-features-that-didnt-make-the-headlines.html&quot;&gt;Python 3.15: features that didn’t make the headlines&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;This blog post covers lesser-known Python 3.15 features including: (1) &lt;strong&gt;asyncio TaskGroup cancellation&lt;/strong&gt; — a new &lt;code&gt;tg.cancel()&lt;/code&gt; method that simplifies graceful task group termination, replacing the awkward workaround of raising custom exceptions; (2) &lt;strong&gt;Context Manager Improvements&lt;/strong&gt; — &lt;code&gt;ContextDecorator&lt;/code&gt; now properly wraps the full lifecycle of async functions, generators, and async iterators, making context managers an ideal way to create decorators; and (3) &lt;strong&gt;Thread Safe Iterators&lt;/strong&gt; — new &lt;code&gt;threading.serialize_iterator&lt;/code&gt; and &lt;code&gt;threading.synchronized_iterator&lt;/code&gt; functions that enable safe shared iteration across threads, solving issues with skipped values or broken iterator state when using threading or free-threading.&lt;/p&gt;
&lt;h3 id=&quot;pycon-us-2026-typing-summit-recap&quot;&gt;&lt;a href=&quot;https://bernat.tech/posts/pycon-us-2026-typing-summit-recap/&quot;&gt;PyCon US 2026 Typing Summit Recap&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;The PyCon US 2026 Typing Summit featured eight talks and a Typing Council Q&amp;amp;A. Key highlights: &lt;em&gt;Guido van Rossum&lt;/em&gt; argued PEP 484’s &lt;em&gt;no-new-syntax&lt;/em&gt; rule is already broken and urged prioritizing user pain over power features, citing the 2025 Typing Survey. &lt;em&gt;Jelle Zijlstra&lt;/em&gt; proposed intersection and negation types for the spec. &lt;em&gt;Michael Sullivan&lt;/em&gt; presented PEP 827 for type manipulation (conditional/mapped types). &lt;em&gt;Douglas Creager&lt;/em&gt; showed how ty’s constraint-set solver fixes a &lt;code&gt;partial(choose, None)&lt;/code&gt; example all current checkers get wrong. &lt;em&gt;Conner Nilsen&lt;/em&gt; found type-checker feedback helps AI agents on well-typed code but not lightly-typed codebases. &lt;em&gt;Jia Chen&lt;/em&gt; formalized Python typing in Lean 4, and &lt;em&gt;Avik Chaudhuri&lt;/em&gt; demoed tensor-shape types in Pyrefly. The council panel updated on checker landscape (Pyre and pytype winding down) and open spec issues.&lt;/p&gt;
&lt;h3 id=&quot;i-spent-2-years-building-the-async-python-task-queue-i-wished-existed&quot;&gt;&lt;a href=&quot;https://aleksul.space/posts/i-spent-2-years-building-repid/&quot;&gt;I spent 2 years building the async Python task queue I wished existed&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;The author spent two years developing Repid v2, an async Python task queue that solves the lack of modern async background processing tools. The Python web ecosystem excels with frameworks like FastAPI, but task queues remained antiquated, requiring separate sync contexts and lacking automatic documentation. Repid v1 showed promise but had fundamental design flaws: it was too opinionated about broker capabilities and assumed features like delayed messaging were universal. Production issues with AMQP 0.9.1 prompted the author to write a custom AMQP 1.0 implementation. The v2 redesign embraces simplicity: user-defined message types, broker-agnostic AsyncAPI documentation, and support for multiple brokers including AMQP 1.0, SQS, Kafka, and Redis Streams. Despite modest adoption, the project represents the exact library the author wanted—a self-documenting, truly async message consumer that gets out of the developer’s way.&lt;/p&gt;
&lt;h3 id=&quot;learn-concurrency---a-deep-dive-into-multithreading-with-python&quot;&gt;&lt;a href=&quot;https://blog.geekuni.com/2026/04/python-concurrency.html&quot;&gt;Learn concurrency - a deep dive into multithreading with Python&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;This blog post provides a comprehensive overview of concurrency in Python, covering key concepts like multithreading, multiprocessing, race conditions, and synchronization mechanisms such as locks. It explains the differences between sequential, concurrent, and parallel execution, with practical examples. The Global Interpreter Lock (GIL) is discussed as a major limitation preventing true CPU-bound multithreading in Python, though it doesn’t hinder I/O-bound tasks. The article highlights the drawbacks of GIL — such as inability to leverage modern multi-core hardware and the complexity of multiprocessing — and introduces the emerging “free-threaded” build (PEP 703) starting in Python 3.13, which allows developers to disable the GIL and achieve true parallel multithreading.&lt;/p&gt;
&lt;h3 id=&quot;behavior-oriented-concurrency-in-python&quot;&gt;&lt;a href=&quot;https://microsoft.github.io/bocpy/&quot;&gt;Behavior-Oriented Concurrency in Python&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://microsoft.github.io/bocpy/images/logo.svg&quot; alt=&quot;behavior-oriented concurrency&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;bocpy&lt;/code&gt; is a Python library implementing Behavior-Oriented Concurrency (BOC), a lock-less, deadlock-free paradigm for parallel programming. It uses “cowns” (concurrent-owned variables) to ensure temporal data ownership across sub-interpreters, eliminating traditional locks. Behaviors — decorated functions — declare required cowns and are automatically scheduled for parallel execution, simplifying concurrent code. The library includes a noticeboard for eventually-consistent state sharing and a &lt;code&gt;Matrix&lt;/code&gt; class for high-performance numerical operations. &lt;code&gt;bocpy&lt;/code&gt; achieves near-linear multi-core scaling via lock-free scheduling and zero-copy data transfer, offering an intuitive alternative to thread-based concurrency.&lt;/p&gt;
&lt;h3 id=&quot;the-simplest-mcp-example-possible-in-python&quot;&gt;&lt;a href=&quot;https://inventwithpython.com/blog/basic-mcp-python-example.html&quot;&gt;The Simplest MCP Example Possible in Python&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;This blog post by &lt;em&gt;Al Sweigart&lt;/em&gt; demonstrates the simplest possible MCP (Model Context Protocol) example in Python, showing how to give a local LLM access to external tools. Using FastMCP and Ollama, the author creates an MCP server with two tools — &lt;code&gt;get_current_time&lt;/code&gt; and &lt;code&gt;get_current_date&lt;/code&gt; — that return the current time and date as formatted strings. A client script connects the Llama 3.2 model to these tools, allowing it to answer time-related questions. The post includes complete code for both the server and client, along with a sample conversation showing the model’s mixed results — correctly answering some questions but also exhibiting common LLM hallucinations, such as incorrectly converting 24-hour time and confidently stating the wrong day of the week.&lt;/p&gt;
&lt;h3 id=&quot;using-llms-to-find-python-c-extension-bugs&quot;&gt;&lt;a href=&quot;https://lwn.net/Articles/1067234/&quot;&gt;Using LLMs to find Python C-extension bugs&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;The article describes how hobbyist Daniel Diniz used Claude Code to systematically discover 575+ bugs in 44 Python C-extensions covering nearly a million lines of code. His cext-review-toolkit employs 13 specialized agents targeting reference-counting, GIL handling, and exception state issues. The approach emphasizes maintainer control, providing high-quality reports with reproducers via secret GitHub gists and adapting based on feedback to minimize false positives. While the reaction has been positive, maintainers note concerns about bug severity and prioritization, suggesting improvements. The article presents this as a responsible example of LLM-assisted bug finding that avoids overwhelming maintainers.&lt;/p&gt;
&lt;h3 id=&quot;uv-is-fantastic-but-its-package-management-ux-is-a-mess&quot;&gt;&lt;a href=&quot;https://www.loopwerk.io/articles/2026/uv-ux-mess/&quot;&gt;uv is fantastic, but its package management UX is a mess&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Astral’s &lt;strong&gt;uv&lt;/strong&gt; is praised for its speed and ability to replace multiple Python tools with one binary, but the author argues its package management UX lags behind peers like &lt;code&gt;pnpm&lt;/code&gt; and &lt;code&gt;poetry&lt;/code&gt;. Key complaints include: no simple &lt;code&gt;uv outdated&lt;/code&gt; command (only &lt;code&gt;uv tree --outdated --depth 1&lt;/code&gt; which displays a cluttered 50-line tree), unsafe default version constraints without upper bounds unlike pnpm’s caret syntax, and awkward upgrade commands requiring repeated &lt;code&gt;--upgrade-package&lt;/code&gt; flags. The author welcomes the new &lt;code&gt;--bounds&lt;/code&gt; option but notes it’s opt-in and a preview feature. Post-HN reader clarifications noted that &lt;code&gt;uv pip list --outdated&lt;/code&gt; exists, &lt;code&gt;--bounds&lt;/code&gt; can be set globally in pyproject.toml, and the no-upper-bounds default makes sense for libraries (to avoid dependency resolution issues) but not for applications.&lt;/p&gt;
&lt;h3 id=&quot;stop-writing-edge-case-tests-let-hypothesis-find-them-instead&quot;&gt;&lt;a href=&quot;https://dev.to/peytongreen_dev/stop-writing-edge-case-tests-let-hypothesis-find-them-instead-5hl0&quot;&gt;Stop writing edge case tests. Let Hypothesis find them instead.&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;The author shares how they wrote 47 edge case tests for a URL normalizer, but when they used &lt;code&gt;Hypothesis&lt;/code&gt;, it generated 10,000 test cases in 30 seconds and found a critical bug — an all-whitespace URL silently returned an empty string. Unlike conventional tests that check specific inputs, property-based tests define invariants that should hold for any input. Hypothesis generates diverse inputs, shrinks failures to minimal examples, and stores failing cases in a local database for regression testing. The author recommends adding one or two &lt;code&gt;@given&lt;/code&gt; tests per function to catch bugs you didn’t know to look for, and provides examples of useful properties like round-trip invariants, idempotency, and monotonicity.&lt;/p&gt;
&lt;h3 id=&quot;announcing-genkit-middleware-intercept-extend-and-harden-your-agentic-apps&quot;&gt;&lt;a href=&quot;https://developers.googleblog.com/announcing-genkit-middleware-intercept-extend-and-harden-your-agentic-apps/&quot;&gt;Announcing Genkit Middleware: Intercept, extend, and harden your agentic apps&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;Genkit&lt;/code&gt;, Google’s open-source framework for building AI-powered agentic applications, has introduced a middleware system to enhance reliability, security, and observability. Available in TypeScript, Go, Dart and Python, middleware allows developers to intercept generation calls and tool execution loops to inject custom behaviors. The system offers pre-built solutions including Retry for handling transient errors with exponential backoff, Fallback for switching to alternative models during failures, Tool Approval for human-in-the-loop confirmation of sensitive actions, Skills for dynamically loading contextual knowledge, and Filesystem for scoped file access. Developers can also create custom middleware to enforce specific business rules, such as preventing models from mentioning competitor products, providing a composable way to harden production-ready AI applications.&lt;/p&gt;
&lt;h3 id=&quot;inside-the-microsoft-agent-framework-how-we-designed-a-layered-sdk&quot;&gt;&lt;a href=&quot;https://commandline.microsoft.com/agent-framework-layered-sdk-loops-workflows-harnesses/&quot;&gt;Inside the Microsoft Agent Framework: How we designed a layered SDK&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://commandline.microsoft.com/wp-content/uploads/2026/05/AgentHarness-1536x833.png&quot; alt=&quot;microsoft-agent-framework-harness&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Microsoft Agent Framework (MAF)&lt;/strong&gt; is Microsoft’s layered SDK for building production-ready AI agents, which is organized around three core concepts. &lt;strong&gt;Agent loops&lt;/strong&gt; are the fundamental execution cycle where an agent receives input, reasons, calls tools, and iterates until done. &lt;strong&gt;Workflows&lt;/strong&gt; provide structured orchestration for multi-step, multi-agent, or business-critical processes, supporting patterns like sequential flows, handoffs, and author/critic loops. &lt;strong&gt;Harnesses&lt;/strong&gt; supply reusable runtime capabilities — tools, context, memory, planning, permissions, and middleware — that surround the agent and make it practical for real-world use. The framework is provider-agnostic, working across models from Microsoft, OpenAI, Anthropic, and others, and is available for .NET and Python.&lt;/p&gt;
&lt;h3 id=&quot;the-anatomy-of-an-agent-harness&quot;&gt;&lt;a href=&quot;https://langchain.com/blog/the-anatomy-of-an-agent-harness&quot;&gt;The Anatomy of an Agent Harness&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;This Langchain blog explains that an agent is composed of two parts: a model containing the intelligence and a harness that makes that intelligence useful. A harness includes all the code, configuration, and execution logic around the model. Key harness components include filesystems for durable storage and context management, bash/code execution for autonomous problem-solving, sandboxes for secure isolated execution, memory systems for continual learning, context compaction strategies to prevent context rot, and long-horizon execution features like planning and self-verification loops. The author argues that harness engineering will remain valuable even as models become more capable, as well-designed harnesses optimize model performance for specific tasks. The field continues evolving with active research into multi-agent orchestration, dynamic tool assembly, and self-improving systems.&lt;/p&gt;
&lt;h3 id=&quot;agent-skills&quot;&gt;&lt;a href=&quot;https://addyosmani.com/blog/agent-skills/&quot;&gt;Agent Skills&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;This article explores how AI coding agents skip essential senior-engineer practices — specs, tests, reviews, scope discipline — because they optimize for speed, not reliability. The project packages “skills” as workflow-driven markdown files injected into agent context, encoding six lifecycle phases (define, plan, build, verify, review, ship) with concrete exit criteria. Five principles guide design: process over prose, anti-rationalization tables rebutting plausible shortcuts, non-negotiable verification, progressive disclosure to limit context, and strict scope discipline. Skills embed Google-scale practices (Hyrum’s Law, test pyramids, DAMP tests, small PRs, trunk-based development) that agents otherwise ignore. Used as installed slash commands or lightweight runbooks, they force the scaffolding senior engineers provide, turning optional polish into mandatory guardrails for safe, reviewable, ship-worthy code.&lt;/p&gt;
&lt;h3 id=&quot;how-to-work-and-compound-with-ai&quot;&gt;&lt;a href=&quot;https://eugeneyan.com//writing/working-with-ai/&quot;&gt;How to Work and Compound with AI&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;The article outlines practical principles for working effectively with AI so that collaboration compounds over time. It argues that every finished artifact — code, docs, analysis, decisions — should become reusable context, while corrections update configurations that reduce future errors. Key practices include organizing work into clear directory structures so models can retrieve relevant context, maintaining annotated indexes and per-project onboarding docs (like &lt;code&gt;CLAUDE.md&lt;/code&gt; and &lt;code&gt;INDEX.md&lt;/code&gt;) so each session starts with the right knowledge, and separating persistent memory (project state) from personal preferences and workflows. Taste and behavior should be encoded as configuration (global, repo, and project-level &lt;code&gt;CLAUDE.md&lt;/code&gt; files), split into lazy‑loaded guides and skills to avoid context bloat. Skills capture repeatable weekly tasks as markdown workflows, bootstrapped by doing a task once and refining it through session transcripts rather than direct edits. Verification is shifted left with deterministic checks, automated tests, and model‑run evals before human review, and long‑running tasks use a “pair programmer” session to detect execution and direction drift. To scale, delegate larger end‑to‑end tasks with clear success criteria and parallel sessions, and make work observable with status signals and remote‑control options. Finally, close the loop by sharing openly, mining transcripts for missing steps or corrections, and periodically refactoring configs to avoid contradictions—the same principles that apply to managing human teams.&lt;/p&gt;
&lt;h3 id=&quot;vibe-coding-and-agentic-engineering-are-getting-closer-than-id-like&quot;&gt;&lt;a href=&quot;https://simonwillison.net/2026/May/6/vibe-coding-and-agentic-engineering/&quot;&gt;Vibe coding and agentic engineering are getting closer than I’d like&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Simon Willison distinguishes “vibe coding” — accepting AI‑generated code without review — from “agentic engineering”, where professionals use AI tools to build high-quality systems while maintaining security and maintainability. In this post he observes that the two practices are increasingly overlapping: because AI agents are becoming highly reliable, he now routinely ships production code he hasn’t reviewed, feeling uncomfortable about accountability. He also notes that AI makes it trivially easy to produce polished repos with tests and docs, so real evidence of value now comes from whether software has been actively used. Although AI has shifted bottlenecks from coding to design and evaluation, he believes the core difficulty of software engineering remains, and he doubts a widespread threat to enterprise SaaS since companies generally prefer proven, professionally managed solutions over DIY vibecoded projects.&lt;/p&gt;
&lt;h3 id=&quot;how-i-use-llms-as-a-staff-engineer-in-2026&quot;&gt;&lt;a href=&quot;https://www.seangoedecke.com/how-i-use-llms-in-2026/&quot;&gt;How I use LLMs as a staff engineer in 2026&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;In 2026, the author has significantly expanded his use of LLMs compared to 2025. The biggest shift is that AI agents are now reliable enough to produce entire pull requests in areas he’s familiar with, and he uses them constantly for bug investigation (correctly diagnosing ~80% of issues), codebase research, testing, and local setup tasks. He still writes his own PR descriptions and all public communications by hand, believing humans better convey core ideas and signal genuine review. He also avoids using LLMs for UI testing or writing blog posts, though he uses them for draft feedback. His core job — shipping projects, exercising judgment, and navigating politics — remains unchanged, but agents have expanded his capacity to take on small tasks. He warns that many people either under-utilize agents (not delegating enough) or over-utilize them (trusting them with unreviewed sweeping changes), and finding the right balance remains key.&lt;/p&gt;
&lt;h3 id=&quot;the-bottleneck-was-never-the-code&quot;&gt;&lt;a href=&quot;https://www.thetypicalset.com/blog/thoughts-on-coding-agents&quot;&gt;The bottleneck was never the code&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;The article argues that coding agents shift the bottleneck in software development from writing code to collaboration, decision-making, and context-sharing. While agents dramatically boost individual productivity, the real challenge for organizations is producing precise specifications and maintaining shared context — something humans acquire informally but agents require explicitly. The author emphasizes that focus (saying no to unnecessary features) and organizational coherence become more critical as code becomes cheaper to produce. Agents can help by reading exhaustively to extract implicit knowledge, but some tacit context remains unrecoverable. Ultimately, the companies that thrive will be those that treat coherence and context as maintainable artifacts, not just those with the best technical tools.&lt;/p&gt;
&lt;h3 id=&quot;agentic-coding-is-a-trap&quot;&gt;&lt;a href=&quot;https://larsfaye.com/articles/agentic-coding-is-a-trap&quot;&gt;Agentic Coding is a Trap&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;The article argues that over-reliance on AI coding agents is a trap that erodes developers’ critical thinking and debugging skills while creating costly dependencies. It warns that “agentic coding” distances engineers from implementation, causing cognitive atrophy, vendor lock-in, unpredictable token costs, and fragile systems that must manage AI’s non-determinism. Junior and senior developers alike lose the friction essential for deep learning and ownership. Drawing parallels to past tech shifts, the author insists the risk is real and immediate. He advocates using LLMs as secondary aids for planning and research—not as autonomous orchestrators—while keeping hands-on coding central, ensuring competence, quality, and long-term value over short-term speed.&lt;/p&gt;
&lt;h2 id=&quot;podcasts&quot;&gt;Podcasts&lt;/h2&gt;
&lt;h3 id=&quot;-realpython-podcast&quot;&gt;🐍 RealPython Podcast&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://realpython.com/podcasts/rpp/293/&quot;&gt;Episode 293: Agentic Data Science Pair Programming With marimo pair&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://realpython.com/podcasts/rpp/294/&quot;&gt;Episode 294: Declarative Charts in Python &amp;amp; Discerning Iterators vs Iterables&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://realpython.com/podcasts/rpp/295/&quot;&gt;Episode 295: Agentic Architecture: Why Files Aren’t Always Enough&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://realpython.com/podcasts/rpp/296/&quot;&gt;Episode 296: Managing Polars Schema Issues &amp;amp; Profiling GitHub Users&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://realpython.com/podcasts/rpp/297/&quot;&gt;Episode 297: Improving Python Through PEPs and Protocols&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;-python-bytes-podcast&quot;&gt;🍕 Python Bytes Podcast&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://pythonbytes.fm/episodes/show/478/iodine-tablets-and-potable-water&quot;&gt;#478 Iodine tablets and potable water&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://pythonbytes.fm/episodes/show/479/talking-about-types&quot;&gt;#479 Talking About Types&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://pythonbytes.fm/episodes/show/480/proud-parents&quot;&gt;#480 Proud Parents&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://pythonbytes.fm/episodes/show/481/ways-to-die&quot;&gt;#481 Ways to die&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;-talk-python-to-me&quot;&gt;📣 Talk Python to me&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://talkpython.fm/episodes/show/547/parallel-python-at-anyscale-with-ray&quot;&gt;#547: Parallel Python at Anyscale with Ray&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://talkpython.fm/episodes/show/548/event-sourcing-design-pattern&quot;&gt;#548: Event Sourcing Design Pattern&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://talkpython.fm/episodes/show/549/great-docs&quot;&gt;#549: Great Docs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://talkpython.fm/episodes/show/550/ai-contributions-and-maintainer-load-in-open-source&quot;&gt;#550: AI Contributions and Maintainer Load in Open Source&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;-vs-code-insiders-podcast&quot;&gt;🚀 VS Code Insiders Podcast&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.vscodepodcast.com/22&quot;&gt;Episode 22: Agent-First Development Workflows in VS Code with Brigit Murtaugh&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;repositories&quot;&gt;Repositories&lt;/h2&gt;
&lt;h3 id=&quot;pydantichttpx2-bsd-3-clause&quot;&gt;&lt;a href=&quot;https://github.com/pydantic/httpx2&quot;&gt;pydantic/httpx2&lt;/a&gt; (BSD-3-Clause)&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;With HTTPX itself seeing limited activity recently, Pydantic is picking up stewardship under the &lt;code&gt;HTTPX2&lt;/code&gt; name so that users have a reliably maintained path forward - including timely security updates for a library that sits in the critical path of so many production systems.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id=&quot;minishlabsemble-mit&quot;&gt;&lt;a href=&quot;https://github.com/MinishLab/semble&quot;&gt;MinishLab/semble&lt;/a&gt; (MIT)&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;Semble is a code search library built for agents. It returns the exact code snippets they need instantly, using ~98% fewer tokens than grep+read. Indexing and searching a full codebase end-to-end takes under a second, with ~200x faster indexing and ~10x faster queries than a code-specialized transformer, at 99% of its retrieval quality.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id=&quot;microsoftwebwright-mit&quot;&gt;&lt;a href=&quot;https://github.com/microsoft/Webwright&quot;&gt;microsoft/Webwright&lt;/a&gt; (MIT)&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;Webwright gives LLM a terminal where it can launch multiple browser sessions to inspect the page and complete a web task. It captures and inspects page screenshots/states only when needed. It enforces each web task to be completed end-to-end within a re-runnable Python script, i.e. your web agent browsing history is a single code file. No multi-agent system, no graph engine, no plugin layer, no hidden orchestration — just a terminal, a browser, and a model.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;p&gt;As we wrap up this journey together, I want to take a moment to express my gratitude for your reading. If you’ve enjoyed what you just read and would like to help sustain this blog, consider &lt;a href=&quot;https://github.com/blueberry-py/blog/stargazers&quot;&gt;starring this blog on github&lt;/a&gt;, it would be great motivation for me to keep updating the blogs!&lt;/p&gt;
&lt;p&gt;Alright, that concludes the May Edition of “This Month for Pythonistas”. Thank you again for reading my post. I hope you enjoy it or find something useful. Happy coding and see you in June! 👋&lt;/p&gt;
</description><pubDate>Sun, 31 May 2026 13:00:00 GMT</pubDate><category>python</category><category>python</category><category>news</category><category>podcast</category><category>AI</category><category>pycon</category><author>Zeyang Lin</author></item><item><title>This Month for Pythonistas - April 2026</title><link>https://blueberry-py.github.io/blog/post/this-month-for-pythonistas-2026-04/</link><guid isPermaLink="true">https://blueberry-py.github.io/blog/post/this-month-for-pythonistas-2026-04/</guid><description>&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;python&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;from&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; datetime &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;import&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; date&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;print&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(date.today().year, date.today().month)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# 2026 4&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img alt=&quot;issue-2026-04&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1280&quot; height=&quot;708&quot; src=&quot;/blog/_astro/splash.B5_2pwJJ_1aJo5x.webp&quot;&gt;&lt;/p&gt;
&lt;p&gt;Welcome back Pythonistas! This is the April 2026 issue of “This Month for Pythonistas”, bringing you curated Python news, tutorials, articles, podcasts and community highlights.&lt;/p&gt;
&lt;p&gt;Before we continue, please note that this blog is synced across the following platforms:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://blueberry-py.github.io/blog/post/this-month-for-pythonistas-2026-04/&quot;&gt;Github Pages&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://blueberrypy.netlify.app/post/this-month-for-pythonistas-2026-04/&quot;&gt;Netlify&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://blueberrypy.onrender.com/post/this-month-for-pythonistas-2026-04/&quot;&gt;Render&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://blueberrypy-blog.vercel.app/post/this-month-for-pythonistas-2026-04/&quot;&gt;Vercel&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Ready? Let’s get started!&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&quot;events--social&quot;&gt;Events &amp;amp; Social&lt;/h2&gt;
&lt;h3 id=&quot;reflecting-on-five-years-as-the-psfs-first-cpython-developer-in-residence&quot;&gt;&lt;a href=&quot;https://pyfound.blogspot.com/2026/04/reflecting-on-five-years-as-psfs-first.html&quot;&gt;Reflecting on Five Years as the PSF’s First CPython Developer in Residence&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;The article reflects on &lt;em&gt;Łukasz Langa&lt;/em&gt;’s nearly five-year tenure as the PSF’s first CPython Developer in Residence, highlighting contributions like transitioning to GitHub issues, automating the CLA process, introducing free threading, and modernizing the interactive shell. The role will continue with Meta’s sponsorship through mid-2027. The position has expanded from one to five full-time engineers, ensuring its stability. Łukasz expresses gratitude to the Steering Council and excitement about moving to Vancouver while joining Meta, emphasizing ongoing commitment to the Python community.&lt;/p&gt;
&lt;h3 id=&quot;djangocon-europe-2026&quot;&gt;DjangoCon Europe 2026&lt;/h3&gt;
&lt;p&gt;DjangoCon Europe goes to Athens, Greece this year, from April 15th to 19th. More info can be found &lt;a href=&quot;https://2026.djangocon.eu/&quot;&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&quot;introducing-gpt55&quot;&gt;&lt;a href=&quot;https://openai.com/index/introducing-gpt-5-5/&quot;&gt;Introducing GPT‑5.5&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;OpenAI released GPT-5.5 which excels in coding, knowledge work, scientific research and cybersecurity, matching GPT-5.4’s latency with stronger performance. It has higher token efficiency and stricter safeguards. Now available for Plus/Pro/Business/Enterprise users; API versions launch soon. GPT-5.5 Pro delivers better accuracy for complex tasks.&lt;/p&gt;
&lt;h3 id=&quot;introducing-claude-opus-47&quot;&gt;&lt;a href=&quot;https://www.anthropic.com/news/claude-opus-4-7&quot;&gt;Introducing Claude Opus 4.7&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://www.anthropic.com/_next/image?url=https%3A%2F%2Fwww-cdn.anthropic.com%2Fimages%2F4zrzovbb%2Fwebsite%2F96ea2509a90e527642c822303e56296a07bcfce4-1920x1080.png&amp;amp;w=3840&amp;amp;q=75&quot; alt=&quot;claude-opus-4.7&quot;&gt;&lt;/p&gt;
&lt;p&gt;Claude Opus 4.7, Anthropic’s latest model, is now generally available. It significantly advances Opus 4.6 in advanced software engineering, handling difficult coding tasks with greater autonomy, precision, and consistency. The model also features substantially improved vision, higher-resolution image understanding, and more creative, professional outputs. It demonstrates stronger reasoning, better instruction following, and enhanced multimodal capabilities. With safeguards for cybersecurity and expanded access across products and cloud platforms, Opus 4.7 aims to accelerate complex workflows while maintaining reliability and safety.&lt;/p&gt;
&lt;h3 id=&quot;qwen36-plus-towards-real-world-agents&quot;&gt;&lt;a href=&quot;https://qwen.ai/blog?id=qwen3.6&quot;&gt;Qwen3.6-Plus: Towards Real World Agents&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://qianwen-res.oss-accelerate.aliyuncs.com/Qwen3.6/Figures/3.6_plus_banner.png&quot; alt=&quot;qwen3.6-plus-image&quot;&gt;&lt;/p&gt;
&lt;p&gt;Qwen has launched &lt;em&gt;Qwen3.6-Plus&lt;/em&gt;, a major upgrade featuring dramatically enhanced agentic coding capabilities and improved multimodal reasoning. The model now supports a 1M context window by default and excels in complex tasks like frontend development, terminal operations, and automated task execution. It demonstrates state-of-the-art performance across coding benchmarks (SWE-bench, Terminal-Bench 2.0), general agent tasks, and multimodal understanding (MMMU, document analysis, video reasoning).&lt;/p&gt;
&lt;h3 id=&quot;glm-51-towards-long-horizon-tasks&quot;&gt;&lt;a href=&quot;https://z.ai/blog/glm-5.1&quot;&gt;GLM-5.1: Towards Long-Horizon Tasks&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;GLM-5.1 is Z.ai’s next-generation flagship model designed for agentic engineering tasks with significantly improved coding capabilities. It achieves state-of-the-art performance on SWE-Bench Pro and leads on NL2Repo and Terminal-Bench 2.0 benchmarks. Unlike previous models that plateau early, GLM-5.1 excels at long-horizon optimization, demonstrated by achieving 6× better results over 600 iterations on vector database optimization, sustaining 3.6× speedup over 1,000+ turns on ML workloads, and building a complete Linux desktop environment over 8 hours through continuous refinement.&lt;/p&gt;
&lt;h3 id=&quot;kimi-k26-advancing-open-source-coding&quot;&gt;&lt;a href=&quot;https://www.kimi.com/blog/kimi-k2-6&quot;&gt;Kimi K2.6: Advancing Open-Source Coding&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://kimi-file.moonshot.cn/prod-chat-kimi/kfs/4/2/2026-04-20/1d7j2jpl3v89kkei5mq70?x-tos-process=image%2Fauto-orient%2C1%2Fstrip%2Fignore-error%2C1&quot; alt=&quot;kimi-k2.6&quot;&gt;&lt;/p&gt;
&lt;p&gt;Kimi K2.6 is an open-source model from Moonshot featuring advanced coding, long-horizon execution, and agent swarm capabilities. It demonstrates significant improvements over K2.5 in complex engineering tasks, autonomously handling multi-step workflows across programming languages like Rust, Go, and Python. The model excels at long-running tasks—such as optimizing financial engines and deploying models—with strong tool-calling accuracy (96.60%). K2.6 also enables coding-driven frontend design and full-stack development, while its &lt;em&gt;Agent Swarm&lt;/em&gt; architecture scales to 300 sub-agents executing 4,000 coordinated steps. Used in proactive agents like &lt;em&gt;OpenClaw&lt;/em&gt; and &lt;em&gt;Hermes&lt;/em&gt;, it supports 24/7 autonomous operations and collaborative multi-agent systems through Claw Groups, achieving state-of-the-art performance on benchmarks like SWE-Bench and Terminal-Bench 2.0.&lt;/p&gt;
&lt;h3 id=&quot;the-next-evolution-of-the-agents-sdk&quot;&gt;&lt;a href=&quot;https://openai.com/en-US/index/the-next-evolution-of-the-agents-sdk/&quot;&gt;The next evolution of the Agents SDK&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;The article discusses the next evolution of OpenAI’s Agents SDK, introducing enhanced capabilities for building AI agents. The updated SDK enables developers to create agents that can inspect files, execute commands, edit code, and handle long-term tasks within controlled sandbox environments. Key features include configurable memory, sandbox-aware orchestration, filesystem tools, MCP integration for tool use, and native sandbox execution with providers like Blaxel and Daytona. The architecture separates harness from compute, supports durable execution through snapshotting, and provides standardized primitives for building reliable, scalable agent systems with improved security and performance.&lt;/p&gt;
&lt;h2 id=&quot;new-versions&quot;&gt;New Versions&lt;/h2&gt;
&lt;h3 id=&quot;python-3150a8-3144-and-31313-are-out&quot;&gt;&lt;a href=&quot;https://blog.python.org/2026/04/python-3150a8-3144-31313/&quot;&gt;Python 3.15.0a8, 3.14.4 and 3.13.13 are out!&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;3.15.0 alpha 8 is expected to be the last alpha build before beta 1 comes out in May 2026. You can find the full release schedule of Python 3.15 &lt;a href=&quot;https://peps.python.org/pep-0790/&quot;&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;3.14.4 and 3.13.13 are bug fix releases for Python 3.14 and 3.13 respectively, both with binary as well as tarball distributions.&lt;/p&gt;
&lt;h2 id=&quot;tutorials&quot;&gt;Tutorials&lt;/h2&gt;
&lt;h3 id=&quot;deeplearningais-efficient-inference-with-sglang-text-and-image-generation&quot;&gt;DeepLearning.ai’s &lt;a href=&quot;https://www.deeplearning.ai/short-courses/efficient-inference-with-sglang-text-and-image-generation/&quot;&gt;Efficient Inference with SGLang: Text and Image Generation&lt;/a&gt;&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;In this course, you’ll build a clear mental model of how inference works (from input tokens to generated output) and learn why the memory bottleneck exists. From there, you’ll implement the KV cache from scratch to store and reuse intermediate attention values within a single request. Then you’ll go further with RadixAttention, SGLang’s approach to sharing KV cache across requests by identifying common prefixes using a radix tree. Finally, you’ll apply these same optimization principles to image generation using diffusion models.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id=&quot;deeplearningais-spec-driven-development-with-coding-agents-from-paul-everitt&quot;&gt;DeepLearning.ai’s &lt;a href=&quot;https://www.deeplearning.ai/short-courses/spec-driven-development-with-coding-agents/&quot;&gt;Spec-Driven Development with Coding Agents&lt;/a&gt; from Paul Everitt&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;In this course, you’ll write project constitutions, plan and validate features in iterative loops, and apply the same repeatable workflow to both fresh and legacy codebases. You’ll also see how specs preserve context across agent sessions, reduce cognitive debt, and improve intent fidelity, keeping your agent aligned with what you actually want.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id=&quot;deeplearningais-building-multimodal-data-pipelines-from-snowflake&quot;&gt;DeepLearning.ai’s &lt;a href=&quot;https://www.deeplearning.ai/short-courses/building-multimodal-data-pipelines/&quot;&gt;Building Multimodal Data Pipelines&lt;/a&gt; from Snowflake&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;Images, audio, and video make up a growing share of the data companies generate today, but most pipelines are still built for structured data alone. This course teaches you to build AI-powered pipelines that process multimodal data and turn it into LLM-ready text.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id=&quot;realpythons-variables-in-python-usage-and-best-practices&quot;&gt;RealPython’s &lt;a href=&quot;https://realpython.com/python-variables/&quot;&gt;Variables in Python: Usage and Best Practices&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://realpython.com/cdn-cgi/image/width=1920,format=auto/https://files.realpython.com/media/UPDATE-Variables-in-Python_Watermarked.7d8b51f3adad.jpg&quot; alt=&quot;realpython-variables-in-python&quot;&gt;&lt;/p&gt;
&lt;p&gt;In Python, “variables” are symbolic names that refer to objects or values stored in memory, created by assigning a value with the &lt;code&gt;=&lt;/code&gt; operator. They are dynamically typed, so their type can change through reassignment, and naming follows rules like using letters, digits, and underscores but not starting with a digit, with snake_case preferred for readability. Variables can be used in expressions, as counters, accumulators, flags, loop variables, or data storage, and they exist in scopes (global, local, non-local, built-in) that determine accessibility. Python also supports type hints, multiple assignment, iterable unpacking, assignment expressions, and pattern matching for creating variables, while attributes in classes provide namespace-like behavior, and &lt;code&gt;del&lt;/code&gt; can remove variables from scope.&lt;/p&gt;
&lt;h2 id=&quot;articles&quot;&gt;Articles&lt;/h2&gt;
&lt;h3 id=&quot;cutting-python-web-app-memory-over-31&quot;&gt;&lt;a href=&quot;https://mkennedy.codes/posts/cutting-python-web-app-memory-over-31-percent/&quot;&gt;Cutting Python Web App Memory Over 31%&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;The article from &lt;em&gt;Michael Kennedy&lt;/em&gt; details how Michael Kennedy reduced his Python web app memory usage from 1,988 MB to 472 MB (over 31% reduction, saving 3.2 GB total) using five key techniques: migrating to Quart (async Flask) with a single Granian worker, replacing the MongoEngine ODM with a Raw+DataClass database pattern, isolating the search indexer into a subprocess (cutting it from 708 MB to 22 MB), moving heavy library imports like boto3 and pandas from global to local function-level imports, and shifting in-memory caches to disk-based caching using the diskcache library.&lt;/p&gt;
&lt;h3 id=&quot;python-introducing-profiling-explorer&quot;&gt;&lt;a href=&quot;https://adamj.eu/tech/2026/04/03/python-introducing-profiling-explorer/&quot;&gt;Python: introducing profiling-explorer&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;The author introduces &lt;strong&gt;profiling-explorer&lt;/strong&gt;, a new Python tool for exploring profiling data from pstats files generated by Python’s built-in profilers. It provides a web-based interface with features like dark mode, sortable columns, search filtering, and navigation between callers and callees. The tool was motivated by the author’s optimization work where the command-line pstats interface felt clunky. The article also explains Python’s three profilers — profile (deprecated), profiling.tracing (cProfile), and the new sampling profiler Tachyon in Python 3.15 — and provides instructions for generating pstats files and using profiling-explorer to analyze them, sponsored by Rippling.&lt;/p&gt;
&lt;h3 id=&quot;django-fixing-a-memory-leak-from-python-314s-incremental-garbage-collection&quot;&gt;&lt;a href=&quot;https://adamj.eu/tech/2026/04/20/django-python-3.14-incremental-gc/&quot;&gt;Django: fixing a memory “leak” from Python 3.14’s incremental garbage collection&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;The article details an out-of-memory error encountered when running Django migrations on Python 3.14, specifically on a resource-constrained Heroku server. Python 3.14 introduced &lt;strong&gt;incremental garbage collection&lt;/strong&gt; to reduce pause times, but this algorithm struggled with Django’s cyclical objects, causing memory usage to spike beyond limits. The author implemented a workaround by extending Django’s migrate command to force full garbage collection after each migration using &lt;code&gt;gc.collect()&lt;/code&gt;, which resolved the issue. Coincidentally, the Python core team announced they would revert incremental garbage collection in Python 3.14.5 due to widespread memory concerns, validating the problem and rendering the workaround temporary.&lt;/p&gt;
&lt;h3 id=&quot;using-a-pdbrc-file-to-customize-the-python-debugger&quot;&gt;&lt;a href=&quot;https://treyhunner.com/2026/04/customizing-pdb-with-pdbrc/&quot;&gt;Using a &lt;code&gt;~/.pdbrc&lt;/code&gt; file to customize the Python Debugger&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;The article explores customizing Python’s built-in debugger (pdb) via a &lt;code&gt;.pdbrc&lt;/code&gt; configuration file. It details how to set up persistent aliases, command shortcuts, and environment adjustments to streamline debugging workflows. The author provides practical examples, such as defining custom commands and automating routine tasks, demonstrating how &lt;code&gt;.pdbrc&lt;/code&gt; enhances productivity by reducing repetitive input. The piece also touches on best practices for organizing configurations and ensuring compatibility across different debugging sessions, making pdb more adaptable to individual developer preferences and complex project requirements.&lt;/p&gt;
&lt;h3 id=&quot;building-a-python-library-in-2026&quot;&gt;&lt;a href=&quot;https://stephenlf.dev/blog/python-library-in-2026/&quot;&gt;Building a Python Library in 2026&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;This blog post provides a comprehensive guide to building Python libraries in 2026, emphasizing modern tools and best practices. The author recommends using &lt;strong&gt;uv&lt;/strong&gt; from Astral as the central tool for project initialization, dependency management, building, and publishing. Key components include: a standard &lt;code&gt;src&lt;/code&gt; layout, &lt;code&gt;pyproject.toml&lt;/code&gt; metadata, linting/formatting with &lt;strong&gt;ruff&lt;/strong&gt;, type checking with &lt;strong&gt;mypy&lt;/strong&gt; (or alternatives), testing with &lt;strong&gt;pytest&lt;/strong&gt; and coverage, CI enforcement via GitHub Actions, and pre-commit hooks. The author also explores publishing options beyond PyPI and examines real-world implementations from OpenAI and Polars, demonstrating how these tools streamline modern Python package development.&lt;/p&gt;
&lt;h3 id=&quot;why-pylocktoml-includes-digital-attestations&quot;&gt;&lt;a href=&quot;https://snarky.ca/why-pylock-toml-includes-digital-attestations/&quot;&gt;Why pylock.toml includes digital attestations&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;This blog post from &lt;em&gt;Brett Cannon&lt;/em&gt; explains why &lt;code&gt;pylock.toml&lt;/code&gt; includes digital attestations to enhance Python package security. Triggered by a recent PyPI project hack, the author highlights how &lt;em&gt;trusted publishing&lt;/em&gt; allows continuous deployment systems to securely upload packages without exposing credentials. Digital attestations verify that a package genuinely originated from its expected CD system. When recorded in &lt;code&gt;pylock.toml&lt;/code&gt;, publisher details for each package enable automated or manual verification to detect suspicious changes, such as missing or altered attestation data. Ultimately, the author recommends maintainers adopt trusted publishing with attestations, use lock files like &lt;code&gt;pylock.toml&lt;/code&gt;, and regularly review attestation consistency to catch potential supply chain attacks.&lt;/p&gt;
&lt;h3 id=&quot;continual-learning-for-ai-agents&quot;&gt;&lt;a href=&quot;https://blog.langchain.com/continual-learning-for-ai-agents/&quot;&gt;Continual learning for AI agents&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;The blog post from Langchain explains that continual learning for AI agents can occur at three distinct layers: the model (weight updates using techniques like SFT or RL), the harness (optimizing the code and tools around the model), and the context (updating configuration, instructions, skills, or memory). While most discussions focus on model-level learning, the harness and context layers offer practical ways to improve agents over time. Traces — the full execution logs of agents — are central to all approaches, enabling analysis and improvement. The harness can be refined by reviewing traces to suggest code changes, while context can be updated at agent, user, or organization levels, either offline or in real-time. Tools like LangSmith and frameworks like Deep Agents support these patterns, allowing AI systems to continuously learn and adapt.&lt;/p&gt;
&lt;h3 id=&quot;pixi-one-package-manager-for-python-and-cc-libraries&quot;&gt;&lt;a href=&quot;https://codecut.ai/uv-pixi-comparison/&quot;&gt;pixi: One Package Manager for Python and C/C++ Libraries&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;The article compares &lt;strong&gt;uv&lt;/strong&gt; and &lt;strong&gt;pixi&lt;/strong&gt; as Python package managers, explaining that while uv excels at fast dependency resolution and lockfiles for pure Python projects from PyPI, it cannot install compiled C/C++ system libraries like GDAL, requiring separate OS package managers. &lt;strong&gt;pixi&lt;/strong&gt; solves this by managing both Python packages from PyPI and compiled libraries from conda-forge in a single tool, with automatic lockfiles, multi-platform support, built-in task running, and project-level environments. The author recommends using uv for simple Python projects and pixi when working with compiled dependencies, geospatial libraries, or needing unified package management across platforms.&lt;/p&gt;
&lt;h3 id=&quot;learning-rust-made-me-a-better-python-developer&quot;&gt;&lt;a href=&quot;https://belderbos.dev/blog/rust-made-me-a-better-python-developer/&quot;&gt;Learning Rust Made Me a Better Python Developer&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Learning Rust improved the author’s Python development by forcing explicit thinking about data ownership, error handling, and edge cases. Rust’s compiler enforces strict patterns that prevent common bugs: ownership rules stop unexpected mutations, Result types make failure explicit in return types, and exhaustive pattern matching ensures all cases are handled. Though Python’s type system can approximate these concepts, Rust’s compiler builds a disciplined reflex. The author now writes cleaner, more predictable Python — asking who owns data before mutating, modeling errors explicitly, and treating all possible states — even though Rust and Python serve different roles (performance vs. orchestration) and aren’t direct competitors.&lt;/p&gt;
&lt;h3 id=&quot;what-every-dev-should-know-about-ai-sandboxes&quot;&gt;&lt;a href=&quot;https://read.engineerscodex.com/p/every-dev-should-know-about-ai-sandboxes&quot;&gt;What every dev should know about AI sandboxes&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;AI sandboxes are critical for safely running AI agents, protecting production systems from potentially harmful actions. The threat model has evolved: agents may confidently execute wrong instructions, not just malicious attacks. Isolation levels range from lightweight containers (fast but share kernel) to MicroVMs (hardware-level isolation but slower), gVisor (userspace kernel), OS-level primitives like Bubblewrap (zero overhead), and simulated environments. Trade-offs exist between speed and security. Vendors like E2B (Firecracker-based), Modal (gVisor), and Daytona (container-based) offer solutions. Building your own sandbox is discouraged unless it’s your core product, as managing security, observability, and lifecycle complexity distracts from primary goals.&lt;/p&gt;
&lt;h3 id=&quot;long-running-agents&quot;&gt;&lt;a href=&quot;https://addyosmani.com/blog/long-running-agents/&quot;&gt;Long-running Agents&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Long-running agents are AI systems that maintain progress across hours, days, or weeks, overcoming the limitations of traditional chat-based agents that forget and fail over long tasks. They require solving three core problems: finite context windows, lack of persistent state, and unreliable self-verification. Leading approaches from Anthropic, Cursor, and Google converge on decoupling the model’s reasoning loop from execution sandboxes and durable session logs, while implementing patterns like checkpoint-and-resume, memory banks, and separate evaluators to ensure reliability. These systems enable economically feasible delegation of complex, multi-day work, though challenges remain around cost, security, alignment drift, and defining work that can survive autonomous execution.&lt;/p&gt;
&lt;h3 id=&quot;scaling-managed-agents-decoupling-the-brain-from-the-hands&quot;&gt;&lt;a href=&quot;https://www.anthropic.com/engineering/managed-agents&quot;&gt;Scaling Managed Agents: Decoupling the brain from the hands&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Anthropic’s &lt;em&gt;Managed Agents&lt;/em&gt; service decouples the “brain” (Claude and its harness) from the “hands” (execution sandboxes) and the “session” (event log) through stable, general-purpose interfaces. This architecture — inspired by operating system virtualization — addresses the fragility of earlier monolithic designs where components were tightly coupled in single containers. By treating each component as interchangeable “cattle” rather than precious “pets”, the system gains reliability, security (credentials are isolated from execution), and performance (reducing time-to-first-token by 60-90%). The meta-harness design is opinionated about interfaces but unopinionated about specific implementations, allowing it to evolve alongside model improvements.&lt;/p&gt;
&lt;h3 id=&quot;multi-agent-coordination-patterns-five-approaches-and-when-to-use-them&quot;&gt;&lt;a href=&quot;https://claude.com/blog/multi-agent-coordination-patterns&quot;&gt;Multi-agent coordination patterns: Five approaches and when to use them&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;The Claude blog outlines five multi-agent coordination patterns for teams building AI systems. The generator-verifier pattern loops output between generation and validation for quality-critical work. Orchestrator-subagent uses a lead agent to delegate clear, bounded subtasks. Agent teams employ persistent workers for independent, long-running parallel work. Message bus routes events through publish-subscribe for evolving pipelines. Shared state lets agents collaborate through a common knowledge store. The authors recommend starting with orchestrator-subagent as the simplest pattern, then evolving as needs clarify, emphasizing that patterns are building blocks often combined in production systems rather than mutually exclusive choices.&lt;/p&gt;
&lt;h3 id=&quot;managing-context-in-long-run-agentic-applications&quot;&gt;&lt;a href=&quot;https://slack.engineering/managing-context-in-long-run-agentic-applications/&quot;&gt;Managing context in long-run agentic applications&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://slack.engineering/wp-content/uploads/sites/7/2026/03/investigation_notebook.png&quot; alt=&quot;slack-engineering-investigation-notebook&quot;&gt;&lt;/p&gt;
&lt;p&gt;The article discusses managing context in long-running agentic systems, focusing on Slack’s approach to maintaining coherence across multi-agent investigations. It addresses challenges posed by limited language model context windows and proposes three complementary channels: the Director’s Journal for structured memory, the Critic’s Review for credibility-scored findings, and the Critic’s Timeline for consolidated, evidence-based chronology. These mechanisms enable specialized agent roles while preserving alignment and creativity, allowing systems to operate effectively over extended interactions. The solution emphasizes online summarization rather than accumulating message history, ensuring scalability and trustworthiness.&lt;/p&gt;
&lt;h3 id=&quot;components-of-a-coding-agent&quot;&gt;&lt;a href=&quot;https://magazine.sebastianraschka.com/p/components-of-a-coding-agent&quot;&gt;Components of A Coding Agent&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;This article by Sebastian Raschka explains the core components of coding agents (like Claude Code and Codex CLI) that make LLMs more effective for programming tasks. The author describes six key building blocks:&lt;/p&gt;
&lt;p&gt;(1) Live Repo Context - understanding the project structure and environment;
(2) Prompt Shape and Cache Reuse - efficiently packaging and caching stable information;
(3) Tool Access and Use - enabling structured tool calls with validation;
(4) Minimizing Context Bloat - compressing and deduplicating history;
(5) Structured Session Memory - maintaining both full transcripts and distilled working memory;
and (6) Delegation with Subagents - splitting tasks into bounded subtasks.&lt;/p&gt;
&lt;p&gt;The article emphasizes that the harness layer often matters as much as the underlying model itself, explaining why coding agents feel significantly more capable than the same models in plain chat interfaces.&lt;/p&gt;
&lt;h3 id=&quot;all-your-agents-are-going-async&quot;&gt;&lt;a href=&quot;https://zknill.io/posts/all-your-agents-are-going-async/&quot;&gt;All your agents are going async&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;The post argues that AI agents are shifting from synchronous chat to asynchronous, background workflows, breaking HTTP request‑response transport. Async agents need durable state and push-based delivery because they outlive connections, push unprompted updates, switch devices, and serve multiple users. Current solutions like Anthropic Channels, Cloudflare Sessions, and OpenClaw’s WhatsApp model address state or delivery but often rely on polling or custom backends. The author advocates a durable, realtime session layer—bi‑directional, multi‑device, and resilient—that separates conversation state from transport, enabling reliable async collaboration between humans and agents.&lt;/p&gt;
&lt;h3 id=&quot;why-were-rethinking-cache-for-the-ai-era&quot;&gt;&lt;a href=&quot;https://blog.cloudflare.com/rethinking-cache-ai-humans/&quot;&gt;Why we’re rethinking cache for the AI era&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Cloudflare’s analysis reveals that 32% of network traffic originates from automated sources, including AI bots and crawlers. Unlike human users, AI traffic exhibits high-volume sequential requests targeting long-tail content across websites, significantly raising cache miss rates and straining CDN infrastructure. This has caused real-world impacts like Wikipedia’s 50% surge in bandwidth usage and service slowdowns across platforms like SourceHut and Fedora. Current cache algorithms such as LRU struggle under AI’s constant scanning behavior. Cloudflare proposes AI-aware solutions including alternative cache replacement algorithms (SEIVE, S3FIFO), machine learning-based caching, and ultimately a separate cache layer dedicated to AI traffic to maintain performance for human users.&lt;/p&gt;
&lt;h3 id=&quot;your-harness-your-memory&quot;&gt;&lt;a href=&quot;https://blog.langchain.com/your-harness-your-memory/&quot;&gt;Your harness, your memory&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://storage.ghost.io/c/97/88/97889716-a759-46f4-b63f-4f5c46a13333/content/images/size/w1248/format/webp/2026/04/image--9--1.png&quot; alt=&quot;langchain-deep-agents&quot;&gt;&lt;/p&gt;
&lt;p&gt;Agent harnesses — the systems that coordinate LLMs with tools and data — are becoming the standard way to build AI agents, and they are fundamentally tied to memory management. Using closed, proprietary harnesses means surrendering control of your agent’s memory to third parties, which creates significant lock-in. Memory is what allows agents to learn from interactions and deliver personalized experiences, making it a crucial competitive advantage. The article argues that both memory and harnesses should be open and independently owned to maintain flexibility and avoid platform dependency. To address this, the author introduces Deep Agents as an open-source, model-agnostic framework that gives developers full control over their agents’ memory storage and retrieval.&lt;/p&gt;
&lt;h3 id=&quot;oh-memories-whered-you-go&quot;&gt;&lt;a href=&quot;https://weaviate.io/blog/engram-internal-use-case&quot;&gt;Oh Memories, Where’d You Go&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;em&gt;Engram&lt;/em&gt; is Weaviate’s memory product (in private preview) designed to store context beyond what fits in Claude Code’s built-in MEMORY.md file (~200 lines). The author tested it by building an MCP server integration but initially found Claude ignored Engram because MEMORY.md loads with zero latency. The solution involved categorizing memories (communication-style, domain-context, tool-preferences, workflow) and integrating at specific session lifecycle points. Testing showed Engram excelled at “decision archaeology” (30% faster with reasoning chains recalled), but failed on planning tasks where Claude defaults to forward-moving. Key improvements needed include fire-and-forget saves, automatic memory capture pipelines, and deterministic retrieval hooks at session start.&lt;/p&gt;
&lt;h3 id=&quot;the-spec-layer&quot;&gt;&lt;a href=&quot;https://blog.matt-rickard.com/p/the-spec-layer&quot;&gt;The Spec Layer&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;The blog advocates for spec-driven development (SDD) to constrain AI agents’ execution freedom and prevent “wrong kind of correct” mistakes. Unlike humans, agents make locally valid errors like disabling tests or reusing existing patterns. Written specs provide durable intent that narrows choices at implementation time. Historical protocol examples (RFCs for IP, HTTP, TLS, HTML) demonstrate how specs enable multiple implementations over decades. The ideal spec should be declarative, layered, and cheap to revise, with mechanical enforcement moved to lint, schemas, and tests. The goal is a narrow interface between human intent and machine execution: smaller specs, harder checks, and less guessing.&lt;/p&gt;
&lt;h3 id=&quot;i-still-prefer-mcp-over-skills&quot;&gt;&lt;a href=&quot;https://david.coffee/i-still-prefer-mcp-over-skills/&quot;&gt;I Still Prefer MCP Over Skills&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;The author argues that MCP (Model Context Protocol) is superior to Skills for connecting LLMs to external services because it’s an API abstraction where the LLM only needs to know the “what”, not the “how”. MCP offers zero-install remote usage, seamless auto-updates, proper authentication handling, true portability, sandboxing, and smart tool discovery. Skills, however, require CLI installation, can’t work in many environments like ChatGPT or Perplexity, create deployment and secret management nightmares, and bloat the context window. He concludes that MCP should be the standard for connecting to services, while Skills should only be used for teaching LLMs knowledge about existing tools or workflows — not as replacements for actual service connectors.&lt;/p&gt;
&lt;h3 id=&quot;the-beginning-of-programming-as-well-know-it&quot;&gt;&lt;a href=&quot;https://bitsplitting.org/2026/04/01/the-beginning-of-programming-as-well-know-it/&quot;&gt;The Beginning of Programming as We’ll Know It&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;The article discusses the impact of AI coding assistants on the programming profession. While AI tools like Claude and Codex can now complete significant coding tasks in minutes, the author argues that human programmers remain essential during this transitional period. Humans bring unique qualities like taste, wisdom, and caution that AI lacks. The author emphasizes that AI-generated code must be reviewed and corrected by humans before it can be considered real work. Despite AI’s impressive capabilities, there’s a “reality distortion field” around AI outputs that can mislead developers. The conclusion is that programmers who embrace AI while maintaining skepticism and human oversight will be better equipped than ever, while those who refuse these tools will fall behind.&lt;/p&gt;
&lt;h3 id=&quot;the-cult-of-vibe-coding-is-insane&quot;&gt;&lt;a href=&quot;https://bramcohen.com/p/the-cult-of-vibe-coding-is-insane&quot;&gt;The Cult Of Vibe Coding Is Insane&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;This article criticizes the “vibe coding” trend where developers avoid examining underlying code, instead relying solely on vague AI conversations. After Claude’s source code leak revealed poor quality, the author argues that “pure vibe coding” is a myth — human contributions still occur through language and infrastructure frameworks. Bad software isn’t inevitable with AI; it’s a conscious choice. The author explains that AI excels at cleaning up technical debt when given proper guidance through collaborative dialogue, and developers should actively steer AI toward high-quality outcomes rather than accepting mediocrity. The core message: poor software quality is a decision, not a necessity.&lt;/p&gt;
&lt;h3 id=&quot;claude-is-not-your-architect-stop-letting-it-pretend&quot;&gt;&lt;a href=&quot;https://www.hollandtech.net/claude-is-not-your-architect/&quot;&gt;Claude Is Not Your Architect. Stop Letting It Pretend.&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;The article warns against using AI like Claude as a software architect, arguing that while AI agents are excellent implementers, they cannot make real architectural decisions. AI is “pathologically agreeable” — always validating ideas enthusiastically without the crucial ability to say “no” or push back on complexity. It produces generic “Jenga tower” architectures that look sound but aren’t tailored to specific teams, constraints, or production realities. The real danger is that engineers are reduced to implementing AI-designed tickets, while accountability vanishes — when systems fail, humans stay up debugging decisions they didn’t make. The solution: humans must design, AI must implement.&lt;/p&gt;
&lt;h2 id=&quot;podcasts&quot;&gt;Podcasts&lt;/h2&gt;
&lt;h3 id=&quot;-corepy&quot;&gt;🥝 core.py&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://open.spotify.com/episode/5pD08pb1Tt7Z7k2ZSIdih9&quot;&gt;Episode 29: Is CPython developed with AI now?&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;-realpython-podcast&quot;&gt;🐍 RealPython Podcast&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://realpython.com/podcasts/rpp/290/&quot;&gt;Episode 290: Advice on Managing Projects &amp;amp; Making Python Classes Friendly&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://realpython.com/podcasts/rpp/291/&quot;&gt;Episode 291: Reassessing the LLM Landscape &amp;amp; Summoning Ghosts&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://realpython.com/podcasts/rpp/292/&quot;&gt;Episode 292: Becoming a Better Python Developer Through Learning Rust&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;-python-bytes-podcast&quot;&gt;🥧 Python Bytes Podcast&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://pythonbytes.fm/episodes/show/476/common-themes&quot;&gt;#476 Common themes&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://pythonbytes.fm/episodes/show/477/lazy-frozen-and-31-lighter&quot;&gt;#477 Lazy, Frozen, and 31% Lighter&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;-talk-python-to-me&quot;&gt;🦜 Talk Python to me&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://talkpython.fm/episodes/show/543/deep-agents-langchains-sdk-for-agents-that-plan-and-delegate&quot;&gt;#543: Deep Agents: LangChain’s SDK for Agents That Plan and Delegate&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://talkpython.fm/episodes/show/544/wheel-next-packaging-peps&quot;&gt;#544: Wheel Next + Packaging PEPs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://talkpython.fm/episodes/show/545/owasp-top-10-2025-list-for-python-devs&quot;&gt;#545: OWASP Top 10 (2025 List) for Python Devs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://talkpython.fm/episodes/show/546/self-hosting-apps-for-python-people&quot;&gt;#546: Self hosting apps for Python people&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;-vs-code-insiders-podcast&quot;&gt;🚀 VS Code Insiders Podcast&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.vscodepodcast.com/21&quot;&gt;Episode 21: Inside The Agent Loop with Pierce Boggan&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;repositories&quot;&gt;Repositories&lt;/h2&gt;
&lt;h3 id=&quot;nousresearchhermes-agent-mit&quot;&gt;&lt;a href=&quot;https://github.com/NousResearch/hermes-agent&quot;&gt;NousResearch/hermes-agent&lt;/a&gt; (MIT)&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;The self-improving AI agent built by Nous Research. It’s the only agent with a built-in learning loop — it creates skills from experience, improves them during use, nudges itself to persist knowledge, searches its own past conversations, and builds a deepening model of who you are across sessions.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id=&quot;dropseedplain-bsd-3&quot;&gt;&lt;a href=&quot;https://github.com/dropseed/plain&quot;&gt;dropseed/plain&lt;/a&gt; (BSD-3)&lt;/h3&gt;
&lt;p&gt;Forked from Django, &lt;code&gt;plain&lt;/code&gt; is an opinionated Python web framework which is ready for the AI Agent age. You can visit their &lt;a href=&quot;https://plainframework.com/&quot;&gt;official website&lt;/a&gt; for more information.&lt;/p&gt;
&lt;h3 id=&quot;smelloscopesmello-mit&quot;&gt;&lt;a href=&quot;https://github.com/smelloscope/smello&quot;&gt;smelloscope/smello&lt;/a&gt; (MIT)&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;Capture outgoing HTTP requests from your Python code and browse them in a local web dashboard — including gRPC calls made by Google Cloud libraries.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;p&gt;As we wrap up this journey together, I want to take a moment to express my gratitude for your reading. If you’ve enjoyed this issue and would like to help sustain this blog, please consider &lt;a href=&quot;https://github.com/blueberry-py/blog/stargazers&quot;&gt;starring this blog on github&lt;/a&gt;, it would be great motivation for me to keep updating!&lt;/p&gt;
&lt;p&gt;Alright, that concludes the April Edition of “This Month for Pythonistas”. Thank you again for reading my post. I hope you enjoy it or find something useful. Happy coding and see you in May! 👋&lt;/p&gt;
</description><pubDate>Thu, 30 Apr 2026 13:00:00 GMT</pubDate><category>python</category><category>python</category><category>news</category><category>podcast</category><category>AI</category><category>llm</category><category>linux</category><category>blog</category><author>Zeyang Lin</author></item><item><title>This Month for Pythonistas - March 2026</title><link>https://blueberry-py.github.io/blog/post/this-month-for-pythonistas-2026-03/</link><guid isPermaLink="true">https://blueberry-py.github.io/blog/post/this-month-for-pythonistas-2026-03/</guid><description>&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;python&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;from&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; datetime &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;import&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; date&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;print&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(date.today().year, date.today().month)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# 2026 3&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img alt=&quot;issue-2026-03&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1280&quot; height=&quot;720&quot; src=&quot;/blog/_astro/splash.D9t4tBm8_2puLMB.webp&quot;&gt;&lt;/p&gt;
&lt;p&gt;Welcome back Pythonistas! This is the March 2026 issue of “This Month for Pythonistas”, bringing you curated Python news, tutorials, articles, podcasts and community highlights.&lt;/p&gt;
&lt;p&gt;Time flies! It has been a whole year since the first issue of “This Month for Pythonistas”. I’m excited to kick off another year of informative content and community engagement, and I can’t wait to see what you have in store for this month.&lt;/p&gt;
&lt;p&gt;Before we continue, please note that this blog is synced across the following platforms:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://blueberry-py.github.io/blog/post/this-month-for-pythonistas-2026-03/&quot;&gt;Github Pages&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://blueberrypy.netlify.app/post/this-month-for-pythonistas-2026-03/&quot;&gt;Netlify&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://blueberrypy.onrender.com/post/this-month-for-pythonistas-2026-03/&quot;&gt;Render&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://blueberrypy-blog.vercel.app/post/this-month-for-pythonistas-2026-03/&quot;&gt;Vercel&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Ready? Let’s get started!&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&quot;events--social&quot;&gt;Events &amp;amp; Social&lt;/h2&gt;
&lt;h3 id=&quot;openai-acquires-astral&quot;&gt;&lt;a href=&quot;https://openai.com/index/openai-to-acquire-astral/&quot;&gt;OpenAI acquires Astral&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;OpenAI has announced its acquisition of Astral, the company behind popular Python developer tools including &lt;em&gt;uv&lt;/em&gt;, &lt;em&gt;Ruff&lt;/em&gt;, and &lt;em&gt;ty&lt;/em&gt;. This deal aims to integrate these widely-used open source tools into OpenAI’s Codex ecosystem, which has grown to over 2 million weekly active users with 3x user growth and 5x increased usage since the start of the year. The acquisition will help expand Codex beyond simple code generation to participate in the entire software development workflow, from planning changes to maintaining software over time. The deal is subject to regulatory approval, and Astral’s team will join OpenAI’s Codex team after closing.&lt;/p&gt;
&lt;p&gt;Astral founder &lt;em&gt;Charlie Marsh&lt;/em&gt; announced that this acquisition will accelerate their mission to make programming more productive by combining Astral’s tooling expertise with AI innovation at the frontier of software development. OpenAI will continue supporting Astral’s open source tools after the deal closes, maintaining their commitment to building in the open alongside the Python community for broader ecosystem impact.&lt;/p&gt;
&lt;h3 id=&quot;pycon-us-2026-schedule-revealed&quot;&gt;&lt;a href=&quot;https://us.pycon.org/2026/schedule/&quot;&gt;PyCon US 2026 Schedule Revealed&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;The PyCon US 2026 schedule has been released! Besides, the keynote speakers are announced: Lin Qiao, Pablo Galindo Salgado, amanda casari, Rachell Calhoun, as well as Tim Schilling.&lt;/p&gt;
&lt;h3 id=&quot;the-python-insider-blog-has-moved&quot;&gt;&lt;a href=&quot;https://blog.python.org/2026/03/the-python-insider-blog-has-moved/&quot;&gt;The Python Insider Blog Has Moved!&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;The &lt;em&gt;Python Insider&lt;/em&gt; official blog has moved from Blogger to &lt;strong&gt;blog.python.org&lt;/strong&gt;, with all 307 past posts migrated and old URLs auto-redirecting; RSS readers will update automatically without action. Shifting to Markdown/Git pull requests lowered contribution barriers vs. the prior Blogger/Google account setup. New site features include filtered/paginated posts, author/tag pages, Ctrl+K search, dark mode, and static Astro hosting.&lt;/p&gt;
&lt;h3 id=&quot;guido-van-rossum-interviews-thomas-wouters&quot;&gt;&lt;a href=&quot;https://gvanrossum.github.io/interviews/ThomasWouters.html&quot;&gt;Guido van Rossum Interviews Thomas Wouters&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;This interview with &lt;strong&gt;Thomas Wouters&lt;/strong&gt;, conducted by &lt;strong&gt;Guido van Rossum&lt;/strong&gt;, chronicles Wouters’ journey from discovering Python via LambdaMOO in the late 1990s to becoming a core Python developer. He contributed augmented assignment operators (+=) and range literals (PEP 203), while participating in pivotal discussions about backward compatibility and nested scopes that led to future imports. Wouters reflects on the friendly Python community during the Usenet era, mentioning key figures like Tim Peters, Fredrik Lundh, and Jeremy Hilton. He also discusses the founding of the Python Software Foundation in 2001 and the challenges of organizing the first PyCon, highlighting how Python evolved from individual use to corporate deployment while maintaining its collaborative spirit.&lt;/p&gt;
&lt;h3 id=&quot;guido-van-rossum-interviews-brett-cannon&quot;&gt;&lt;a href=&quot;https://gvanrossum.github.io/interviews/BrettCannon.html&quot;&gt;Guido van Rossum Interviews Brett Cannon&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;This interview with Python core developer &lt;strong&gt;Brett Cannon&lt;/strong&gt;, also conducted by &lt;strong&gt;Guido van Rossum&lt;/strong&gt;, explores Brett’s journey into the Python community. In 2000, philosophy student Brett discovered Python at UC Berkeley while seeking an object-oriented language for a CS course. After reading the tutorial and an O’Reilly book, he fell in love with the language. During a gap year before grad school, he submitted a pure-Python &lt;code&gt;strptime&lt;/code&gt; implementation to python-dev, which led to his first core contribution in 2002. He volunteered to write the python-dev summaries, became PSF member, gained commit rights in April 2003, and was involved in major projects like importlib and Python 3 (PEP 3000/3100). Brett reflects on the early community’s small, passionate nature, the transition from volunteer contributions to paid maintainers, and Python’s evolution through CVS, Subversion, Mercurial, and Git on SourceForge to GitHub.&lt;/p&gt;
&lt;h3 id=&quot;py-ai-conference&quot;&gt;&lt;a href=&quot;https://luma.com/i3cbt3sz&quot;&gt;Py AI Conference&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Hosted on March 10th at San Francisco, California, this one-day conference is for Python teams shipping AI to production. Keynote speakers include ​Guido van Rossum, Sebastián Ramírez (FastAPI) and more.&lt;/p&gt;
&lt;h3 id=&quot;gemini-31-flash-lite-built-for-intelligence-at-scale&quot;&gt;&lt;a href=&quot;https://blog.google/innovation-and-ai/models-and-research/gemini-models/gemini-3-1-flash-lite/&quot;&gt;Gemini 3.1 Flash-Lite: Built for intelligence at scale&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://storage.googleapis.com/gweb-uniblog-publish-prod/images/gemini-3.1_flash_Lite_blog_keywo.width-2200.format-webp.webp&quot; alt=&quot;gemini-3-1-flash-lite&quot;&gt;&lt;/p&gt;
&lt;p&gt;Google has launched &lt;strong&gt;Gemini 3.1 Flash-Lite&lt;/strong&gt;, its fastest and most cost-efficient AI model in the Gemini 3 series. Priced at just $0.25 per million input tokens and $1.50 per million output tokens, it delivers 2.5x faster response times and 45% higher output speed compared to its predecessor 2.5 Flash. The model achieves a 1432 Elo score and outperforms competitors on reasoning and multimodal benchmarks. Available via Google AI Studio and Vertex AI, Flash-Lite is optimized for high-volume workloads like translation, content moderation, and UI generation, with adaptive thinking levels for developer control.&lt;/p&gt;
&lt;h3 id=&quot;gemini-embedding-2-our-first-natively-multimodal-embedding-model&quot;&gt;&lt;a href=&quot;https://blog.google/innovation-and-ai/models-and-research/gemini-models/gemini-embedding-2/&quot;&gt;Gemini Embedding 2: Our first natively multimodal embedding model&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://storage.googleapis.com/gweb-uniblog-publish-prod/images/gemini-2_embedding_keyword_blog_.width-2200.format-webp.webp&quot; alt=&quot;gemini-embedding-2&quot;&gt;&lt;/p&gt;
&lt;p&gt;Google has also released Gemini Embedding 2, its first natively multimodal embedding model that maps text, images, videos, audio, and documents into a single unified embedding space, supporting over 100 languages. The model handles up to 8192 text tokens, 6 images, 120 seconds of video, native audio without transcription, and PDFs up to 6 pages per request. It supports interleaved multi-modal inputs in a single request and uses Matryoshka Representation Learning to offer flexible output dimensions (3072, 1536, or 768).&lt;/p&gt;
&lt;h3 id=&quot;introducing-gpt54&quot;&gt;&lt;a href=&quot;https://openai.com/index/introducing-gpt-5-4/&quot;&gt;Introducing GPT‑5.4&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;OpenAI has launched GPT-5.4, their most powerful and efficient frontier model for professional workloads. The model combines advanced reasoning, programming, and agent capabilities with native computer use functionality and 1M token context support. GPT-5.4 introduces “Thinking mode” in ChatGPT, providing transparent reasoning plans, and features improved web search, tool search, and higher accuracy with 33% reduced hallucinations. Performance benchmarks show significant improvements across knowledge work, coding, and complex tasks.&lt;/p&gt;
&lt;h3 id=&quot;minimax-m27-early-echoes-of-self-evolution&quot;&gt;&lt;a href=&quot;https://www.minimax.io/news/minimax-m27-en&quot;&gt;MiniMax M2.7: Early Echoes of Self-Evolution&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://www.minimax.io/_next/image?url=https%3A%2F%2Ffilecdn.minimax.chat%2Fpublic%2F86637d58-0e78-44f5-bb08-d149ed0c4418.png&amp;amp;w=2048&amp;amp;q=75&quot; alt=&quot;minimax-m2.7&quot;&gt;&lt;/p&gt;
&lt;p&gt;MiniMax M2.7 is a groundbreaking AI model that deeply participates in its own self-evolution, capable of building complex agent harnesses and completing elaborate productivity tasks. It excels in professional software engineering with 56.22% accuracy on SWE-Pro benchmark, demonstrates top-tier office software capabilities with the highest ELO score among open-source models (1495 on GDPval-AA), and maintains 97% skill adherence across 40 complex skills. The model shows enhanced character consistency and emotional intelligence for entertainment applications.&lt;/p&gt;
&lt;h2 id=&quot;new-versions&quot;&gt;New Versions&lt;/h2&gt;
&lt;h3 id=&quot;python-3150-alpha-7&quot;&gt;Python 3.15.0 alpha 7&lt;/h3&gt;
&lt;p&gt;This is &lt;a href=&quot;https://www.python.org/downloads/release/python-3150a7/&quot;&gt;the seventh&lt;/a&gt; and possiblly the second last alpha release for 3.15 series before the scheduled beta phase begins in May 2026.&lt;/p&gt;
&lt;p&gt;Besides, Python &lt;a href=&quot;https://blog.python.org/2026/03/python-31213-31115-31020/&quot;&gt;3.12.13, 3.11.15 and 3.10.20&lt;/a&gt;, the security bugfix releases for 3.12, 3.11 and 3.10 respectively with only tarball distributions, are also available.&lt;/p&gt;
&lt;h2 id=&quot;tutorials&quot;&gt;Tutorials&lt;/h2&gt;
&lt;h3 id=&quot;deeplearningais-agent-memory-building-memory-aware-agents-from-oracle&quot;&gt;DeepLearning.ai’s &lt;a href=&quot;https://www.deeplearning.ai/short-courses/agent-memory-building-memory-aware-agents/&quot;&gt;Agent Memory: Building Memory-Aware Agents&lt;/a&gt; from Oracle&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;You’ll design a complete memory system that stores and retrieves different memory types, scales tool access using semantic search, and builds write-back loops that allow agents to update their own memory autonomously. By the end, you’ll have assembled a fully stateful Memory Aware Agent that loads prior context at startup, assembles relevant context, state, tools, and outputs and improves across sessions.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id=&quot;real-pythons-pydantic-ai-build-type-safe-llm-agents-in-python&quot;&gt;Real Python’s &lt;a href=&quot;https://realpython.com/pydantic-ai/&quot;&gt;Pydantic AI: Build Type-Safe LLM Agents in Python&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://realpython.com/cdn-cgi/image/width=1920,format=auto/https://files.realpython.com/media/Pydantic-AI-Typed-LLM-Agents-with-Structured-Outputs_Watermarked.043c8afd949c.jpg&quot; alt=&quot;realpython-pydantic-ai&quot;&gt;&lt;/p&gt;
&lt;p&gt;Pydantic AI is a Python framework for building type-safe LLM agents that return validated, structured outputs using Pydantic models. It eliminates the need for error-prone string parsing by defining schemas with type hints, letting the framework handle validation automatically. The framework uses &lt;code&gt;@agent.tool&lt;/code&gt; decorator to register Python functions that LLMs can invoke based on user queries and docstrings. It also supports dependency injection with &lt;code&gt;deps_type&lt;/code&gt; for type-safe runtime context like database connections without using global state.&lt;/p&gt;
&lt;h2 id=&quot;articles&quot;&gt;Articles&lt;/h2&gt;
&lt;h3 id=&quot;thoughts-on-openai-acquiring-astral-and-uvruffty&quot;&gt;&lt;a href=&quot;https://simonwillison.net/2026/Mar/19/openai-acquiring-astral&quot;&gt;Thoughts on OpenAI acquiring Astral and uv/ruff/ty&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;uv stands out as the most impactful tool with 126 million+ monthly downloads, becoming essential for Python environment management. The author discusses potential risks of a major company owning critical infrastructure, parallels to Anthropic’s Bun acquisition, and concerns about OpenAI’s limited track record maintaining open source projects. The author notes that due to permissive licensing, forking remains a viable exit strategy if maintenance deteriorates after the transition.&lt;/p&gt;
&lt;h3 id=&quot;python-315s-jit-is-now-back-on-track&quot;&gt;&lt;a href=&quot;https://fidget-spinner.github.io/posts/jit-on-track.html&quot;&gt;Python 3.15’s JIT is now back on track&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Python 3.15’s JIT compiler has achieved its performance goals ahead of schedule, delivering 11-12% speed improvements on macOS AArch64 and 5-6% on x86_64 Linux compared to the interpreter. The article recounts how the original JIT in Python 3.13 and 3.14 was often slower than the interpreter, and funding cuts to the Faster CPython team made the project’s future uncertain. The author attributes the revival to community-led development, lucky technical choices like trace recording with dual dispatch and reference count elimination, and strong teamwork. Daily performance tracking and breaking complex problems into manageable tasks helped attract contributors, transforming the JIT from an opaque project into something newcomers could contribute to.&lt;/p&gt;
&lt;h3 id=&quot;the-optimization-ladder&quot;&gt;&lt;a href=&quot;https://cemrehancavdar.com/2026/03/10/optimization-ladder/&quot;&gt;The Optimization Ladder&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;This article presents a comprehensive benchmark of Python optimization techniques, demonstrating a spectrum of approaches from simple to complex. CPython’s dynamic design makes it fundamentally slow (177-875x slower than C for compute benchmarks). The “optimization ladder” shows increasing speedups at higher effort levels: upgrading Python (1.4x), alternative runtimes like PyPy/GraalPy (6-66x), compilation tools like Mypyc (2.4-14x), Numba (56-135x), Cython (99-124x), and JAX (up to 1,633x). For real-world JSON processing, gains were more modest. The author emphasizes that the choice depends on your specific problem - Python as an orchestration layer with NumPy can achieve near-compiled speeds, while pure compute loops benefit most from aggressive optimization.&lt;/p&gt;
&lt;h3 id=&quot;when-to-make-a-class-in-python&quot;&gt;&lt;a href=&quot;https://www.pythonmorsels.com/when-are-classes-used/&quot;&gt;When to make a class in Python&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;This article outlines when to use Python classes. Most developers first use classes when required by frameworks like Django for database models. Classes excel at bundling related data and functionality — for example, replacing functions passing a shared server object with an &lt;code&gt;IMAPChecker&lt;/code&gt; class. They also clarify data, like shutil’s terminal size class over a bare tuple. While much Python code avoids custom classes, classes improve readability by grouping state and methods together.&lt;/p&gt;
&lt;h3 id=&quot;invent-your-own-comprehensions-in-python&quot;&gt;&lt;a href=&quot;https://www.pythonmorsels.com/custom-comprehensions/&quot;&gt;Invent your own comprehensions in Python&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;This article explains how to create “custom comprehensions” in Python using generator expressions. While Python has built-in comprehensions for lists, sets, and dictionaries, it lacks tuple, frozenset, and other specialized collection comprehensions.&lt;/p&gt;
&lt;p&gt;The solution is to pass generator expressions to callable functions or classes that accept iterables. For example:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;tuple(n**2 for n numbers)&lt;/code&gt; acts as a “tuple comprehension”&lt;/li&gt;
&lt;li&gt;&lt;code&gt;frozenset(w.strip(...) for w in words)&lt;/code&gt; acts as a “frozenset comprehension”&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Counter(w.strip(...) for w in words)&lt;/code&gt; acts as a “Counter comprehension”&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Generator expressions also work with reducer functions like &lt;code&gt;sum()&lt;/code&gt;, &lt;code&gt;any()&lt;/code&gt;, &lt;code&gt;all()&lt;/code&gt;, and &lt;code&gt;join()&lt;/code&gt;. The key insight is that &lt;strong&gt;any&lt;/strong&gt; iterable-accepting callable can essentially become a custom comprehension tool.&lt;/p&gt;
&lt;h3 id=&quot;fire-and-forget-or-never-with-pythons-asyncio&quot;&gt;&lt;a href=&quot;https://mkennedy.codes/posts/fire-and-forget-or-never-with-python-s-asyncio/&quot;&gt;Fire and forget (or never) with Python’s asyncio&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;The article discusses a critical issue with fire-and-forget tasks in Python’s asyncio. Starting in Python 3.12, &lt;code&gt;asyncio.create_task()&lt;/code&gt; can silently garbage collect tasks before they execute because the event loop only maintains weak references. This means tasks that aren’t explicitly referenced may never run, creating subtle bugs. The solution is to store task references in a set and register a &lt;code&gt;done_callback&lt;/code&gt; to clean them up after completion. This non-obvious workaround violates Python’s “one obvious way” principle but prevents tasks from disappearing mid-execution, ensuring reliable background task execution in async applications.&lt;/p&gt;
&lt;h3 id=&quot;reinventing-pythons-asyncio&quot;&gt;&lt;a href=&quot;https://blog.baro.dev/p/reinventing-pythons-asyncio&quot;&gt;Reinventing Python’s AsyncIO&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;The author discusses reinventing Python’s &lt;code&gt;asyncio&lt;/code&gt; due to its complexity and limitations around the GIL. After discovering &lt;em&gt;tinyio&lt;/em&gt; — a simple event loop implementation — the author created &lt;code&gt;TonIO&lt;/code&gt;, a new async runtime built in Rust centered on two simple primitives: Event and Waiter. Unlike asyncio, TonIO leverages free-threaded Python to run code across multiple threads without worrying about the main thread. Benchmarks show TonIO is 2-3.5x faster than asyncio for both computation and I/O operations. The author advocates for “reinventing the wheel” to truly understand low-level concepts, encouraging developers to build rather than just ship code.&lt;/p&gt;
&lt;h3 id=&quot;what-pythons-asyncio-primitives-get-wrong-about-shared-state&quot;&gt;&lt;a href=&quot;https://www.inngest.com/blog/no-lost-updates-python-asyncio&quot;&gt;What Python’s asyncio primitives get wrong about shared state&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;This blog post discusses problems with Python’s asyncio primitives (Event, Condition, Queue) when coordinating concurrent tasks around shared state.&lt;/p&gt;
&lt;p&gt;The author explains that while &lt;code&gt;asyncio.Condition&lt;/code&gt; seems to solve the problem of waiting for specific states, it suffers from a &lt;strong&gt;lost update&lt;/strong&gt; bug under real concurrency: when a state changes rapidly (e.g., “closing” → “closed” in the same event loop tick), consumers wake up and check against the &lt;em&gt;current&lt;/em&gt; value, missing the intermediate state they were waiting for.&lt;/p&gt;
&lt;p&gt;The solution is &lt;strong&gt;per-consumer queues&lt;/strong&gt;: instead of waking consumers and asking “is the current state what you want?”, buffer every state transition into each consumer’s queue. This ensures no intermediate states are missed.&lt;/p&gt;
&lt;p&gt;The author provides a &lt;code&gt;ValueWatcher&lt;/code&gt; class implementation (about 300 lines) with features like thread safety, timeouts, predicate-based matching, and atomic registration.&lt;/p&gt;
&lt;h3 id=&quot;cli-subcommands-with-lazy-imports&quot;&gt;&lt;a href=&quot;https://snarky.ca/subcommands-with-lazy-imports/&quot;&gt;CLI subcommands with lazy imports&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Brett Cannon’s article discusses using lazy imports (PEP 810 in Python 3.15) with CLI subcommands to improve startup performance. While lazy imports allow importing only needed modules per subcommand, traditional argparse patterns break this: storing lazy imports in dicts or as default function arguments triggers their reification, defeating the purpose. Solutions include using a match statement instead of a dict for dispatching, or wrapping lazy imports in lambdas to add an indirection layer. Both approaches prevent accidental reification while keeping code organized.&lt;/p&gt;
&lt;h3 id=&quot;the-story-of-pythons-lazy-imports-why-it-took-three-years-and-two-attempts&quot;&gt;&lt;a href=&quot;https://techlife.blog/posts/the-story-of-pythons-lazy-imports-why-it-took-three-years-and-two-attempts/&quot;&gt;The Story of Python’s Lazy Imports: Why It Took Three Years and Two Attempts&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;This blog post tells the story of Python’s lazy imports feature, which took three years and two attempts to implement. The problem: running simple commands like &lt;code&gt;mytool --help&lt;/code&gt; forces Python to load heavy libraries (PyTorch, NumPy, pandas) even when unnecessary. Companies like Meta and Hudson River Trading built their own forks with lazy imports, achieving 50-70% startup time improvements.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;PEP 690&lt;/strong&gt; (2022) proposed a global &lt;code&gt;-L&lt;/code&gt; flag to make all imports lazy by default, but the Steering Council rejected it, fearing it would create “two Pythons” and break the ecosystem.&lt;/p&gt;
&lt;p&gt;At the 2023 Language Summit, Thomas Wouters was the only attendee who said he could “never” support lazy imports.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;PEP 810&lt;/strong&gt; (2025) changed the design: instead of a global flag, it uses an opt-in &lt;code&gt;lazy import&lt;/code&gt; keyword with proxy objects—avoiding changes to Python’s internal dictionary structure. Wouters himself became a co-author. The Steering Council unanimously accepted PEP 810 in November 2025, and it will arrive in Python 3.15.&lt;/p&gt;
&lt;h3 id=&quot;python-type-checker-comparison-typing-spec-conformance&quot;&gt;&lt;a href=&quot;https://pyrefly.org/blog/typing-conformance-comparison/&quot;&gt;Python Type Checker Comparison: Typing Spec Conformance&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;This article compares Python type checkers’ conformance to the typing specification, presenting test pass rates: Pyright (97.8%), Zuban (96.4%), Pyrefly (87.8%), mypy (58.3%), and ty (53.2%). It explains that conformance measures how closely checkers follow formal typing rules, with lower conformance forcing developers to work around limitations. However, the article notes conformance has limitations — it doesn’t assess type inference, narrowing behavior, performance, IDE integration, error clarity, or third-party package support. The conclusion recommends considering multiple factors beyond conformance when selecting a type checker, as overall developer experience depends on many dimensions.&lt;/p&gt;
&lt;h3 id=&quot;rewriting-a-20-year-old-python-library&quot;&gt;&lt;a href=&quot;https://www.b-list.org/weblog/2026/mar/23/20-year-library/&quot;&gt;Rewriting a 20-year-old Python library&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;The author recounts rewriting &lt;code&gt;akismet&lt;/code&gt;, a 20-year-old Python library for spam filtering originally created by Michael Foord. The rewrite, completed in 2024-2025, separated the library into &lt;code&gt;SyncClient&lt;/code&gt; and &lt;code&gt;AsyncClient&lt;/code&gt; classes to support both synchronous and asynchronous operations, introduced an enum-based response system to handle “blatant” spam detection, and switched from requests to httpx for better async support and testability. The codebase was reorganized into multiple files, added comprehensive type hints, pytest fixtures, and test client variants. The author dedicated the work to Foord, who passed away in 2025, hoping to honor his legacy by ensuring the library remains maintainable for decades to come.&lt;/p&gt;
&lt;h3 id=&quot;replacing-tox-with-uv&quot;&gt;&lt;a href=&quot;https://blog.changs.co.uk/replacing-tox-with-uv.html&quot;&gt;Replacing tox with UV&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;This blog post discusses replacing tox with UV for testing Python libraries across multiple Python versions. The author was upgrading libraries to Python 3.10+ and needed to run tests on different Python versions. While tox and nox are common tools for this, UV offers a more convenient single-tool solution.&lt;/p&gt;
&lt;p&gt;Key features of UV for testing include:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Using &lt;code&gt;uv run -p 3.10 pytest&lt;/code&gt; to test with specific Python versions&lt;/li&gt;
&lt;li&gt;Specifying extras and dependency groups with &lt;code&gt;--extra&lt;/code&gt; and &lt;code&gt;--group&lt;/code&gt; flags&lt;/li&gt;
&lt;li&gt;Overriding package versions with &lt;code&gt;--with&lt;/code&gt; or &lt;code&gt;-w&lt;/code&gt; options&lt;/li&gt;
&lt;li&gt;Using &lt;code&gt;--isolated&lt;/code&gt; to avoid contaminating the development virtual environment&lt;/li&gt;
&lt;li&gt;Running tests in parallel with commands like &lt;code&gt;parallel &quot;uv run -p {} --isolated pytest&quot; ::: 3.{10..14}&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The author concludes that while tox remains useful, UV provides a faster, more streamlined approach for debugging version incompatibilities.&lt;/p&gt;
&lt;h3 id=&quot;unit-testing-your-codes-performance-part-2-catching-speed-changes&quot;&gt;&lt;a href=&quot;https://pythonspeed.com/articles/speed-unit-tests/&quot;&gt;Unit testing your code’s performance, part 2: Catching speed changes&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;This article presents a technique for using unit tests to detect performance changes in code by measuring CPU instruction counts rather than elapsed time. The method involves using libraries like &lt;code&gt;py-perf-event&lt;/code&gt; or Valgrind’s &lt;code&gt;Cachegrind&lt;/code&gt; to count instructions during test runs. If the instruction count changes beyond a threshold, the test fails, providing early warning to developers before committing changes. The approach requires reducing noise through consistent environments, hash seeds, and disabling ASLR. While not a replacement for benchmarks, these tests offer immediate feedback during development. The technique has caveats: it may not work in virtualized CI, and results vary across hardware, but can help catch accidental performance regressions early.&lt;/p&gt;
&lt;h3 id=&quot;defense-in-depth-a-practical-guide-to-python-supply-chain-security&quot;&gt;&lt;a href=&quot;https://bernat.tech/posts/securing-python-supply-chain/&quot;&gt;Defense in Depth: A Practical Guide to Python Supply Chain Security&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;The article offers a practical guide to Python supply chain security, advocating defense in depth. Key strategies: use ruff security linting; pin dependencies with cryptographic hashes via uv; run &lt;code&gt;pip-audit&lt;/code&gt; in CI; generate SBOMs with CycloneDX; adopt Trusted Publishing (OIDC) instead of long-lived tokens; audit GitHub Actions with zizmor; consider delayed ingestion for internal mirrors. It covers threats like dependency confusion, account takeover, and malicious packages, and provides a phased implementation roadmap. The core message: no single control is perfect, so layer multiple defenses.&lt;/p&gt;
&lt;h3 id=&quot;building-shared-coding-guidelines-for-ai-and-people-too&quot;&gt;&lt;a href=&quot;https://stackoverflow.blog/2026/03/26/coding-guidelines-for-ai-agents-and-people-too/&quot;&gt;Building shared coding guidelines for AI (and people too)&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;This StackOverflow blog post explains how to create effective coding guidelines for AI coding agents. Unlike human developers who absorb tacit knowledge, AI agents lack contextual understanding and require explicit, unambiguous instructions. Guidelines should cover naming conventions, formatting, error handling, and comments using clear, simple language without idioms. Providing both correct and incorrect code examples, plus a “gold standard” reference file, helps agents learn patterns. Errors should be treated as feedback to iteratively improve guidelines collaboratively with the team. Ultimately, these guidelines should be stored in agent configuration files while still using traditional tools like linters to catch basics.&lt;/p&gt;
&lt;h3 id=&quot;when-ai-writes-the-worlds-software-who-verifies-it&quot;&gt;&lt;a href=&quot;https://leodemoura.github.io/blog/2026/02/28/when-ai-writes-the-worlds-software.html&quot;&gt;When AI Writes the World’s Software, Who Verifies It?&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;This post notes AI is already writing a growing share of global software — 25-30% of Google/Microsoft’s new code, plus a 100k-line C compiler in two weeks. It warns unvetted AI code risks widespread security flaws and supply chain attacks, with current poor software quality costing the US $2.4T annually. The solution is formal mathematical proofs, and Lean has emerged as the leading platform to guarantee correct, secure AI-generated code.&lt;/p&gt;
&lt;h3 id=&quot;ai-coding-is-gambling&quot;&gt;&lt;a href=&quot;https://notes.visaint.space/ai-coding-is-gambling/&quot;&gt;AI Coding is Gambling&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;AI coding generates impressive initial results but behaves like gambling — pulling a slot machine hoping for a jackpot. While AI makes codebase changes trivial and reduces cognitive burden, it often produces plausible yet flawed solutions. The process is addictive but lacks the traditional coding rewards: deep thinking, clever problem-solving, and the satisfaction of making things work. AI offloads the mental work that nurtures the soul, transforming coding from creative problem-solving into mindless slot-pulling, leaving developers to merely clean up poorly implemented code rather than genuinely building solutions.&lt;/p&gt;
&lt;h3 id=&quot;is-ai-killing-software-engineering-jobs&quot;&gt;&lt;a href=&quot;https://codemanship.wordpress.com/2026/03/02/is-ai-killing-software-engineering-jobs/&quot;&gt;Is AI Killing Software Engineering Jobs?&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;The article argues that AI is not responsible for declining software engineering jobs. The downturn actually began in May 2022, before ChatGPT’s launch, triggered by rising interest rates following pandemic-era cheap money. Hiring has been recovering (~5% growth recently). The apparent job shortage stems from reduced employee churn and fear-driven narratives, not AI replacing engineers. Despite layoffs, the developer population continued growing. Businesses claiming to replace engineers with AI still hire them. The author criticizes fear-mongering “AI thought leaders” and predicts demand will recover as it has after previous bust cycles, addressing the temporary pain of those who lost jobs.&lt;/p&gt;
&lt;h3 id=&quot;reports-of-codes-death-are-greatly-exaggerated&quot;&gt;&lt;a href=&quot;https://stevekrouse.com/precision&quot;&gt;Reports of code’s death are greatly exaggerated&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;The article argues against the notion that AI will eliminate coding. The author explains that English specifications feel precise until complexity reveals their vagueness, using examples like collaborative text editors. The solution to managing complexity is abstraction—compressing many details into single concepts. Even with AGI, code will remain essential because human thinking requires precise abstractions to master complexity, similar to how ChatGPT hasn’t replaced novelists. AI will actually enhance coding by helping create better abstractions and higher-quality code, not make it obsolete. The article concludes that code is just getting started, not dying.&lt;/p&gt;
&lt;h3 id=&quot;read-less-steer-more&quot;&gt;&lt;a href=&quot;https://blog.ezyang.com/2026/03/read-less-steer-more/&quot;&gt;Read Less, Steer More&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;The blog post argues that with AI coding agents, developers should focus less on reading generated code and more on steering the AI precisely. The author recommends treating AI as a fast typist executing your specifications rather than as an autonomous teammate, demanding justification when something doesn’t make sense. “Vibe coding” is a trap — instead, maintain active involvement to reduce cognitive burden. Beginners should practice without “accept edits” to train intuition, while recognizing that genuine discovery still requires human-speed creation and cannot be rushed. The key mindset shift: don’t accommodate the AI’s output; steer it to match your exact vision.&lt;/p&gt;
&lt;h3 id=&quot;design-me-a-highly-resilient-database&quot;&gt;&lt;a href=&quot;https://nikogura.com/DatabaseDesign.html&quot;&gt;“Design Me a Highly Resilient Database”&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;This article argues that there’s no such thing as a “highly resilient database” in the abstract — it always depends on the specific use case. The author recounts failing a job interview by asking clarifying questions about data types, query patterns, and failure modes instead of simply naming a database like “Cassandra”. The piece explains that different databases serve different purposes: PostgreSQL provides ACID compliance essential for financial transactions, Cassandra handles write-heavy workloads with eventual consistency for IoT data, and Redis works best for caching. The author emphasizes that the CAP theorem forces tradeoffs between consistency and availability, and choosing the wrong database — like eventual consistency for ledgers — can lead to audit failures and regulatory issues. The right approach starts with questions, not product names.&lt;/p&gt;
&lt;h2 id=&quot;podcasts&quot;&gt;Podcasts&lt;/h2&gt;
&lt;h3 id=&quot;-realpython-podcast&quot;&gt;🐍 RealPython Podcast&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://realpython.com/podcasts/rpp/287/&quot;&gt;Episode 287: Crafting and Editing In-Depth Tutorials at Real Python&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://realpython.com/podcasts/rpp/288/&quot;&gt;Episode 288: Automate Exploratory Data Analysis &amp;amp; Invent Python Comprehensions&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://realpython.com/podcasts/rpp/289/&quot;&gt;Episode 289: Limitations in Human and Automated Code Review&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;-python-bytes-podcast&quot;&gt;🥧 Python Bytes Podcast&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://pythonbytes.fm/episodes/show/471/the-orm-pattern-of-2026/&quot;&gt;#471 The ORM pattern of 2026?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://pythonbytes.fm/episodes/show/472/monorepos&quot;&gt;#472 Monorepos&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://pythonbytes.fm/episodes/show/473/a-clean-room-rewrite/&quot;&gt;#473 A clean room rewrite?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://pythonbytes.fm/episodes/show/474/astral-to-join-openai/&quot;&gt;#474 Astral to join OpenAI&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://pythonbytes.fm/episodes/show/475/haunted-warehouses&quot;&gt;#475 Haunted warehouses&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;-talk-python-to-me&quot;&gt;🦜 Talk Python to me&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://talkpython.fm/episodes/show/538/python-in-digital-humanities&quot;&gt;#538: Python in Digital Humanities&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://talkpython.fm/episodes/show/539/catching-up-with-the-python-typing-council&quot;&gt;#539: Catching up with the Python Typing Council&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://talkpython.fm/episodes/show/540/modern-python-monorepo-with-uv-and-prek&quot;&gt;#540: Modern Python monorepo with uv and prek&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://talkpython.fm/episodes/show/541/monty-python-in-rust-for-ai&quot;&gt;#541: Monty - Python in Rust for AI&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://talkpython.fm/episodes/show/542/zensical-a-modern-static-site-generator&quot;&gt;#542: Zensical - a modern static site generator&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;-pybites-podcast&quot;&gt;🍕 Pybites Podcast&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.pybitespodcast.com/1501156/episodes/18764761-218-why-python-developers-are-learning-rust&quot;&gt;#218: Why Python developers are learning Rust&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;-vs-code-insiders-podcast&quot;&gt;🚀 VS Code Insiders Podcast&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.vscodepodcast.com/20&quot;&gt;Episode 20: Autopilot Mode with Justin Chen&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;repositories&quot;&gt;Repositories&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/agentscope-ai/ReMe&quot;&gt;agentscope-ai/ReMe&lt;/a&gt; (Apache-2.0)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;ReMe is a memory management framework designed for AI agents, providing both file-based and vector-based memory systems.&lt;/p&gt;
&lt;p&gt;It tackles two core problems of agent memory: limited context window (early information is truncated or lost in long conversations) and stateless sessions (new sessions cannot inherit history and always start from scratch).&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/alibaba/OpenSandbox&quot;&gt;alibaba/OpenSandbox&lt;/a&gt; (Apache-2.0)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;OpenSandbox is a general-purpose sandbox platform for AI applications, offering multi-language SDKs, unified sandbox APIs, and Docker/Kubernetes runtimes for scenarios like Coding Agents, GUI Agents, Agent Evaluation, AI Code Execution, and RL Training.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/NVIDIA/OpenShell&quot;&gt;NVIDIA/OpenShell&lt;/a&gt; (Apache-2.0)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;OpenShell is the safe, private runtime for autonomous AI agents. It provides sandboxed execution environments that protect your data, credentials, and infrastructure — governed by declarative YAML policies that prevent unauthorized file access, data exfiltration, and uncontrolled network activity.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/Gen-Verse/OpenClaw-RL&quot;&gt;Gen-Verse/OpenClaw-RL&lt;/a&gt; (Apache-2.0)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;OpenClaw-RL is a fully asynchronous reinforcement learning framework that turns everyday conversations into training signals for personalized AI agents, and supports training general agents with large-scale environment parallelization.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;As we wrap up this journey together, I want to take a moment to express my gratitude for your reading. If you’ve enjoyed what you just read and would like to help sustain this blog, consider &lt;a href=&quot;https://github.com/blueberry-py/blog/stargazers&quot;&gt;starring this blog on github&lt;/a&gt;, it would be great motivation for me to keep updating the blogs!&lt;/p&gt;
&lt;p&gt;Alright, that concludes the March Edition of “This Month for Pythonistas”. Thank you again for reading my post. I hope you enjoy it or find something useful. Happy coding and see you next month! 👋&lt;/p&gt;
</description><pubDate>Tue, 31 Mar 2026 13:00:00 GMT</pubDate><category>python</category><category>python</category><category>news</category><category>podcast</category><category>AI</category><category>GPT</category><category>LLM</category><category>linux</category><author>Zeyang Lin</author></item><item><title>This Month for Pythonistas - February 2026</title><link>https://blueberry-py.github.io/blog/post/this-month-for-pythonistas-2026-02/</link><guid isPermaLink="true">https://blueberry-py.github.io/blog/post/this-month-for-pythonistas-2026-02/</guid><description>&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;python&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;from&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; datetime &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;import&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; date&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;print&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(date.today().year, date.today().month)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# 2026 2&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img alt=&quot;issue-2026-02&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1280&quot; height=&quot;720&quot; src=&quot;/blog/_astro/splash.Bx5VHkhC_nKQ4V.webp&quot;&gt;&lt;/p&gt;
&lt;p&gt;Welcome back Pythonistas! This is the February 2026 issue of “This Month for Pythonistas”, bringing you curated Python news, tutorials, articles, podcasts and community highlights.&lt;/p&gt;
&lt;p&gt;Before we continue, please note that this blog is synced across the following platforms:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://blueberry-py.github.io/blog/post/this-month-for-pythonistas-2026-02/&quot;&gt;Github Pages&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://blueberrypy.netlify.app/post/this-month-for-pythonistas-2026-02/&quot;&gt;Netlify&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://blueberrypy.onrender.com/post/this-month-for-pythonistas-2026-02/&quot;&gt;Render&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://blueberrypy-blog.vercel.app/post/this-month-for-pythonistas-2026-02/&quot;&gt;Vercel&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Ready? Let’s get started!&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&quot;events--social&quot;&gt;Events &amp;amp; Social&lt;/h2&gt;
&lt;h3 id=&quot;python-unplugged&quot;&gt;&lt;a href=&quot;https://lp.jetbrains.com/python-unplugged/&quot;&gt;Python Unplugged&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Python Unplugged is a free online conference bringing together the leading voices of the Python community. It would be live on Youtube on 4th of March, 2026 from 11:00 am to 6:30 pm CET.&lt;/p&gt;
&lt;h3 id=&quot;introducing-claude-opus-46&quot;&gt;&lt;a href=&quot;https://www.anthropic.com/news/claude-opus-4-6&quot;&gt;Introducing Claude Opus 4.6&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Anthropic has released &lt;strong&gt;Claude Opus 4.6&lt;/strong&gt;, its “most capable” AI model yet. The new flagship significantly improves coding, planning, and agentic task execution, with enhanced ability to work autonomously on complex, long-running projects. It features a 1M token context window (first for Opus-class) and achieves state-of-the-art results on key benchmarks including Terminal-Bench 2.0, Humanity’s Last Exam, and GDPval-AA, outperforming competitors by wide margins. Despite intelligence gains, Opus 4.6 maintains excellent safety with low misaligned behavior and minimal over-refusals. The model is available now on claude.ai, the API, and major cloud platforms with new developer features including adaptive thinking, effort controls, and context compaction.&lt;/p&gt;
&lt;h3 id=&quot;introducing-gpt-53-codex&quot;&gt;&lt;a href=&quot;https://openai.com/index/introducing-gpt-5-3-codex/&quot;&gt;Introducing GPT-5.3-Codex&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;OpenAI has launched &lt;strong&gt;GPT-5.3-Codex&lt;/strong&gt;, a highly capable agentic coding model that is 25% faster and sets new industry records on coding benchmarks like SWE-Bench Pro (56.8%) and Terminal-Bench 2.0 (77.3%). It can build complex games and handle professional tasks beyond coding, including data analysis and presentations. Notably, this model helped accelerate its own development. GPT-5.3-Codex offers real-time interactive steering, strong cybersecurity capabilities classified as “High capability,” and is available through paid ChatGPT plans and API access.&lt;/p&gt;
&lt;h3 id=&quot;glm-5-from-vibe-coding-to-agentic-engineering&quot;&gt;&lt;a href=&quot;https://z.ai/blog/glm-5&quot;&gt;GLM-5: From Vibe Coding to Agentic Engineering&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;GLM-5 is Z.ai’s latest model targeting complex systems engineering and long-horizon agentic tasks. It scales up to 744B parameters (40B active) with 28.5T tokens of training data, integrating &lt;em&gt;DeepSeek Sparse Attention&lt;/em&gt; for efficiency. A novel asynchronous RL infrastructure called “slime” improves training. GLM-5 achieves best-in-class performance among open-source models on reasoning, coding, and agent benchmarks, ranking #1 on Vending Bench 2 with a $4,432 final balance. It’s open-sourced under MIT license, available via API, and supports local deployment with compatibility for Claude Code and OpenClaw.&lt;/p&gt;
&lt;h3 id=&quot;minimax-m25-built-for-real-world-productivity&quot;&gt;&lt;a href=&quot;https://www.minimax.io/news/minimax-m25&quot;&gt;MiniMax M2.5: Built for Real-World Productivity.&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;MiniMax introduces M2.5, a new AI model extensively trained with reinforcement learning in complex real-world environments. It achieves state-of-the-art performance in coding (80.2% SWE-Bench Verified), tool use, search (76.3% BrowseComp), and office work. M2.5 completes tasks 37% faster than its predecessor M2.1, matching Claude Opus 4.6’s speed while costing only 10% as much. At $1 per hour (100 tokens/sec) or $0.30 (50 tokens/sec), it offers extremely cost-effective AI for productivity applications.&lt;/p&gt;
&lt;h3 id=&quot;nano-banana-2-combining-pro-capabilities-with-lightning-fast-speed&quot;&gt;&lt;a href=&quot;https://blog.google/innovation-and-ai/technology/ai/nano-banana-2/&quot;&gt;Nano Banana 2: Combining Pro capabilities with lightning-fast speed&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Google DeepMind has launched Nano Banana 2, a new AI image generation model that combines the advanced capabilities of Nano Banana Pro with the speed of Gemini Flash. The model offers enhanced features including advanced world knowledge with real-time information, subject consistency for up to five characters and 14 objects, precise instruction following, production-ready specs (512px to 4K), and improved visual fidelity.&lt;/p&gt;
&lt;h3 id=&quot;hello-entire-world&quot;&gt;&lt;a href=&quot;https://entire.io/blog/hello-entire-world/&quot;&gt;Hello Entire World&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Entire&lt;/strong&gt;, a new company backed by a $60 million seed round, aiming to create the world’s next developer platform for AI‑driven coding agents. Their first product, the &lt;strong&gt;Entire CLI&lt;/strong&gt;, introduces “Checkpoints” – a Git‑compatible primitive that automatically records an agent’s full context (prompts, transcripts, token usage, tool calls, etc.) with each commit, storing it on a dedicated branch. This makes AI‑generated code traceable, easier to review, and reusable across sessions, while reducing token waste and supporting multiple agents. The CLI is open‑source, supports Claude Code and Gemini now, and will expand to other models. The vision is an AI‑native, open, and scalable software‑development lifecycle.&lt;/p&gt;
&lt;h2 id=&quot;new-versions&quot;&gt;New Versions&lt;/h2&gt;
&lt;h3 id=&quot;python-3150-alpha-6&quot;&gt;Python 3.15.0 alpha 6&lt;/h3&gt;
&lt;p&gt;This &lt;a href=&quot;https://www.python.org/downloads/release/python-3150a6/&quot;&gt;sixth alpha build&lt;/a&gt; of 3.15 arrives in the middle of February.&lt;/p&gt;
&lt;p&gt;Additionally, &lt;em&gt;Python 3.14.3&lt;/em&gt; and &lt;em&gt;3.13.12&lt;/em&gt; (both being bugfix releases) are also available.&lt;/p&gt;
&lt;h3 id=&quot;transformers-5&quot;&gt;transformers 5&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Transformers v5&lt;/strong&gt; was released as a major upgrade, with support for over 400 model architectures (up from ~40 in v4) and 750,000+ model checkpoints. Key improvements include 20-30% faster inference, a new modular architecture that simplifies adding models, streamlined tokenizers and image processors, and native quantization support. It also introduces a built-in HTTP server (&lt;code&gt;transformers serve&lt;/code&gt;) for easy deployment. The library now integrates tightly with popular inference engines like vLLM and SGLang, and supports GGUF files for local execution. Existing v4 checkpoints remain compatible, though PyTorch-only support means Flax/TensorFlow have been deprecated.&lt;/p&gt;
&lt;h3 id=&quot;isort-8&quot;&gt;isort 8&lt;/h3&gt;
&lt;p&gt;isort 8 drops support of Python 3.9, and fixes a number of issues.&lt;/p&gt;
&lt;h2 id=&quot;tutorials&quot;&gt;Tutorials&lt;/h2&gt;
&lt;h3 id=&quot;deeplearningais-agent-skills-with-anthropic-by-anthropic&quot;&gt;Deeplearning.ai’s &lt;a href=&quot;https://www.deeplearning.ai/short-courses/agent-skills-with-anthropic/&quot;&gt;Agent Skills with Anthropic&lt;/a&gt; by Anthropic&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;In this course, you’ll learn how skills work, explore best practices for creating them, and build skills for different use cases. You’ll see skills in action across Claude.ai, Claude Code, the Claude API, and the Claude Agent SDK, and learn how to combine them with MCP and subagents for complex workflows.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id=&quot;deeplearningais-a2a-the-agent2agent-protocol-by-google-cloud-and-ibm&quot;&gt;Deeplearning.ai’s &lt;a href=&quot;https://www.deeplearning.ai/short-courses/a2a-the-agent2agent-protocol/&quot;&gt;A2A: The Agent2Agent Protocol&lt;/a&gt; by Google Cloud and IBM&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;In this course, you’ll build a healthcare multi-agent system with three specialized agents using different frameworks. You’ll wrap each agent in an A2A server, build A2A clients to communicate with them, and orchestrate them into sequential and hierarchical workflows. You’ll see how A2A complements MCP: while MCP connects agents to external data systems, A2A enables agents to collaborate with each other.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;articles&quot;&gt;Articles&lt;/h2&gt;
&lt;h3 id=&quot;pep-814--add-frozendict-built-in-type&quot;&gt;&lt;a href=&quot;https://peps.python.org/pep-0814/&quot;&gt;PEP 814 – Add frozendict built-in type&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;PEP 814 is &lt;strong&gt;accepted&lt;/strong&gt;. This PEP proposes adding an immutable &lt;code&gt;frozendict&lt;/code&gt; built-in type to Python 3.15. It implements the Mapping protocol, preserves insertion order, and is hashable when all keys/values are hashable. Unlike &lt;code&gt;MappingProxyType&lt;/code&gt;, it’s truly immutable and hashable, making it safe for use with &lt;code&gt;@functools.lru_cache()&lt;/code&gt; and as dictionary keys. It supports union operators (|, |=) and can replace mutable dicts in stdlib constants for safety. Unlike &lt;code&gt;collections.frozenmap&lt;/code&gt;, frozendict maintains insertion order and provides O(1) lookups. The implementation shares code with dict but is not a subclass to prevent mutation via dict methods.&lt;/p&gt;
&lt;h3 id=&quot;from-python-33-to-today-ending-15-years-of-subprocess-polling&quot;&gt;&lt;a href=&quot;https://gmpy.dev/blog/2026/event-driven-process-waiting&quot;&gt;From Python 3.3 to today: ending 15 years of subprocess polling&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;For 15 years, Python’s &lt;code&gt;subprocess&lt;/code&gt; module and &lt;code&gt;psutil&lt;/code&gt; used busy-loop polling to wait for processes, causing unnecessary CPU usage and latency. The author replaced this with event-driven approaches: using &lt;code&gt;pidfd_open()&lt;/code&gt; with &lt;code&gt;poll()&lt;/code&gt; on Linux (kernel 5.3+), &lt;code&gt;kqueue()&lt;/code&gt; on BSD/macOS, and existing mechanisms on Windows. This eliminates busy-looping - the process blocks until the kernel signals process termination or timeout. Measurements show dramatic reduction in CPU context switches (from 258+ to just 2). The improvement first landed in &lt;code&gt;psutil&lt;/code&gt; and was contributed upstream to CPython.&lt;/p&gt;
&lt;h3 id=&quot;speeding-up-pillows-open-and-save&quot;&gt;&lt;a href=&quot;https://hugovk.dev/blog/2026/faster-pillow/&quot;&gt;Speeding up Pillow’s open and save&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;This blog post by Hugo van Kemenade details performance improvements to Pillow’s image open/save operations using Python 3.15’s &lt;em&gt;Tachyon&lt;/em&gt; profiler. Previously, Pillow would import many image format plugins unnecessarily even when only one format was needed. A new file extension-to-plugin mapping enables lazy loading, only importing relevant plugins. Results: PNG opening 2.6x faster, WebP opening 14x faster, PNG saving 2.2x faster, and WebP saving 7.9x faster. These optimizations will be included in Pillow 12.2.0, making image processing more efficient especially for command-line tools.&lt;/p&gt;
&lt;h3 id=&quot;is-it-a-class-or-a-function&quot;&gt;&lt;a href=&quot;https://www.pythonmorsels.com/class-or-function/&quot;&gt;Is it a class or a function?&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;The article explains that in Python both classes and functions are &lt;em&gt;callables&lt;/em&gt; — they’re invoked with parentheses and may return a value. Examples: &lt;code&gt;print&lt;/code&gt; and &lt;code&gt;sum&lt;/code&gt; are built‑in functions; &lt;code&gt;str&lt;/code&gt;, &lt;code&gt;list&lt;/code&gt;, &lt;code&gt;bool&lt;/code&gt;, &lt;code&gt;enumerate&lt;/code&gt;, and &lt;code&gt;type&lt;/code&gt; are classes that behave like functions, returning new objects when called. Because the user‑facing syntax is the same, Python programmers often call any callable a “function” even when it’s technically a class. This fuzzy terminology fits Python’s duck‑typing philosophy: what matters is the object’s behavior (being callable), not its exact implementation.&lt;/p&gt;
&lt;h3 id=&quot;anatomy-of-a-python-function&quot;&gt;&lt;a href=&quot;https://www.mostlypython.com/anatomy-of-a-python-function/&quot;&gt;Anatomy of a Python Function&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;The article explains the terminology for a Python function’s parts. The &lt;strong&gt;function body&lt;/strong&gt; is everything indented after the definition. The &lt;strong&gt;function definition&lt;/strong&gt; runs from &lt;code&gt;def&lt;/code&gt; to the end of the body, though many think it ends at the colon. The first line (from &lt;code&gt;def&lt;/code&gt; to the colon) is called the &lt;strong&gt;function header&lt;/strong&gt; by the author; others may call it a &lt;strong&gt;declaration&lt;/strong&gt;, but not a &lt;strong&gt;signature&lt;/strong&gt;. A &lt;strong&gt;signature&lt;/strong&gt; consists only of the parameter list and return annotation, as defined by PEP 362. Clear naming matters for type‑checking and communication.&lt;/p&gt;
&lt;h3 id=&quot;switch-case-in-python-its-not-match-case&quot;&gt;&lt;a href=&quot;https://www.pythonmorsels.com/switch-case-in-python/&quot;&gt;switch-case in Python? It’s not match-case!&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Python lacks a traditional switch-case statement, though it has &lt;code&gt;match-case&lt;/code&gt; from Python 3.10. However, &lt;code&gt;match-case&lt;/code&gt; is designed for structural pattern-matching (matching iterables, dictionaries, objects, and nested patterns), not simple value-based switching. For basic switch-case needs, &lt;code&gt;if-elif&lt;/code&gt; chains are more readable and require less indentation. When mapping input values to outputs, dictionaries are typically the best alternative. The article advises using &lt;code&gt;match-case&lt;/code&gt; only for advanced pattern-matching scenarios, not as a direct replacement for switch statements found in other languages. Most Python programmers are unfamiliar with &lt;code&gt;match-case&lt;/code&gt;, so simpler constructs are usually preferable.&lt;/p&gt;
&lt;h3 id=&quot;making-pyrefly-diagnostics-18x-faster&quot;&gt;&lt;a href=&quot;https://pyrefly.org/blog/2026/02/06/performance-improvements/&quot;&gt;Making Pyrefly Diagnostics 18x Faster&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Pyrefly achieved an 18x performance improvement in diagnostic updates through two key optimizations. The first was implementing fine-grained dependency tracking, which reduces module invalidation from 2000+ to just 100+ by tracking exactly which types are used rather than all imports. The second was streaming diagnostics directly to the IDE as files are rechecked, rather than waiting for the entire recheck process to complete. These changes reduce diagnostic update time from ~3.6 seconds to under 200ms on an M4 Macbook Pro, making type errors refresh instantly after saving a file. The team continues prioritizing speed, memory efficiency, and functionality as they approach the v1 release.&lt;/p&gt;
&lt;h3 id=&quot;better-python-tests-with-inline-snapshot&quot;&gt;&lt;a href=&quot;https://pydantic.dev/articles/inline-snapshot&quot;&gt;Better Python tests with &lt;code&gt;inline-snapshot&lt;/code&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;The article introduces &lt;code&gt;inline-snapshot&lt;/code&gt;, a Python testing library that automatically manages test data. Instead of manually writing assertions for complex data structures, developers use &lt;code&gt;snapshot()&lt;/code&gt; placeholders that get auto-populated when running &lt;code&gt;pytest --inline-snapshot=fix&lt;/code&gt;. This eliminates tedious maintenance when data changes. The library pairs well with &lt;code&gt;dirty-equals&lt;/code&gt; to handle dynamic fields like timestamps via &lt;code&gt;IsInt()&lt;/code&gt; and &lt;code&gt;IsNow()&lt;/code&gt;. Snapshots can even be nested within complex structures. The underlying &lt;code&gt;executing&lt;/code&gt; library enables automatic source code updates by inspecting Python AST.&lt;/p&gt;
&lt;h3 id=&quot;django-profile-memory-usage-with-memray&quot;&gt;&lt;a href=&quot;https://adamj.eu/tech/2026/01/29/django-profile-memray/&quot;&gt;Django: profile memory usage with &lt;code&gt;Memray&lt;/code&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;This blog post explains how to profile and reduce memory usage in Django projects using &lt;code&gt;Memray&lt;/code&gt;, a memory profiler from Bloomberg. The author demonstrates profiling the Django “check” command, generating flame graphs to visualize allocations, and identifying that importing &lt;code&gt;numpy.random&lt;/code&gt; consumed 5.7MB (23% of peak 25.2MB). By replacing &lt;code&gt;numpy.random&lt;/code&gt; with Python’s built-in &lt;code&gt;random.shuffle()&lt;/code&gt;, memory usage dropped 22% to 19.4MB. The post also offers solutions like deferred imports, lazy imports (upcoming in Python 3.15), and provides a Zsh one-liner for faster iteration. The key takeaway: Memray helps pinpoint and eliminate unnecessary memory bloat in Django applications.&lt;/p&gt;
&lt;h3 id=&quot;implementing-local-first-agentic-ai-a-practical-guide&quot;&gt;&lt;a href=&quot;https://blog.logrocket.com/local-first-agentic-ai-guide/&quot;&gt;Implementing local-first agentic AI: A practical guide&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;This article provides a practical guide for implementing local-first agentic AI using Small Language Models (SLMs) in privacy-sensitive environments. It presents an enterprise use case: an HR triage system that processes sensitive employee reports. The system uses a three-stage pipeline: intent detection (classifying issues like harassment or burnout), planning (creating remediation steps), and tool execution (performing actions like opening HR cases). Key models include &lt;code&gt;sentence-transformers/all-MiniLM-L6-v2&lt;/code&gt; (~90M), &lt;code&gt;Phi-3-mini&lt;/code&gt; (~3.8B), and &lt;code&gt;Function Gemma&lt;/code&gt; (~2B). The “Local First, Cloud Last” architecture runs on modest hardware without GPUs, offering privacy, cost efficiency, and auditability while avoiding cloud latency and compliance risks. SLMs require precise prompt engineering but enable easy local testing without paid tokens, making them ideal for enterprise workloads with strict data locality constraints.&lt;/p&gt;
&lt;h3 id=&quot;agent-trace-capturing-the-context-graph-of-code&quot;&gt;&lt;a href=&quot;https://cognition.ai/blog/agent-trace&quot;&gt;Agent Trace: Capturing the Context Graph of Code&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://agent-trace.dev/&quot;&gt;&lt;strong&gt;Agent Trace&lt;/strong&gt;&lt;/a&gt; is an open, vendor-neutral specification for recording AI contributions alongside human authorship in version-controlled codebases. It solves the modern problem of context loss by linking each code change to its originating conversation and context, rather than just storing line differences like traditional git. This enables powerful engineering management tools (blaming AI vs humans, PR breakdowns, dashboards) and significantly improves AI agent performance by making context retrievable, reducing wasted inference time. The spec represents a shift where context—not lines of code—becomes the precious resource in the AI era.&lt;/p&gt;
&lt;h2 id=&quot;podcasts&quot;&gt;Podcasts&lt;/h2&gt;
&lt;h3 id=&quot;-realpython-podcast&quot;&gt;🐍 RealPython Podcast&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://realpython.com/podcasts/rpp/283/&quot;&gt;Episode 283: Improving Your GitHub Developer Experience&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://realpython.com/podcasts/rpp/284/&quot;&gt;Episode 284: Running Local LLMs With Ollama and Connecting With Python&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://realpython.com/podcasts/rpp/285/&quot;&gt;Episode 285: Exploring MCP Apps &amp;amp; Adding Interactive UIs to Clients&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://realpython.com/podcasts/rpp/286/&quot;&gt;Episode 286: Overcoming Testing Obstacles With Python’s Mock Object Library&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;-python-bytes-podcast&quot;&gt;🥧 Python Bytes Podcast&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://pythonbytes.fm/episodes/show/468/a-bolt-of-django&quot;&gt;#468 A bolt of Django&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://pythonbytes.fm/episodes/show/469/commands-out-of-the-terminal&quot;&gt;#469 Commands, out of the terminal&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://pythonbytes.fm/episodes/show/470/a-jolting-episode&quot;&gt;#470 A Jolting Episode&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;-talk-python-to-me&quot;&gt;🦜 Talk Python to me&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://talkpython.fm/episodes/show/536/fly-inside-fastapi-cloud&quot;&gt;#536: Fly inside FastAPI Cloud&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://talkpython.fm/episodes/show/537/datastar-modern-web-dev-simplified&quot;&gt;#537: Datastar: Modern web dev, simplified&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;-pybites-podcast&quot;&gt;🍕 Pybites Podcast&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.pybitespodcast.com/1501156/episodes/18609456-214-building-useful-ai-from-classroom-to-real-business-impact&quot;&gt;#214: Building useful AI - from classroom to real business impact&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.pybitespodcast.com/1501156/episodes/18654038-215-arthur-pastel-on-creating-actionable-optimisations-with-codspeed&quot;&gt;#215: Arthur Pastel on creating actionable optimisations with CodSpeed&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.pybitespodcast.com/1501156/episodes/18691634-216-resolving-our-own-git-mess&quot;&gt;#216: Resolving our own git mess&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.pybitespodcast.com/1501156/episodes/18698592-217-revisiting-quiet-links-with-tim-gallati&quot;&gt;#217: Revisiting Quiet Links with Tim Gallati&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;vs-code-insiders-podcast&quot;&gt;VS Code Insiders Podcast&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.vscodepodcast.com/19&quot;&gt;Episode 19: Subagents: Parallel Execution and Context Isolation&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;repositories&quot;&gt;Repositories&lt;/h2&gt;
&lt;h3 id=&quot;volcengineopenviking-apache-20&quot;&gt;&lt;a href=&quot;https://github.com/volcengine/OpenViking&quot;&gt;volcengine/OpenViking&lt;/a&gt; (Apache 2.0)&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://openviking.ai/&quot;&gt;OpenViking&lt;/a&gt; is a context database designed specifically for AI Agents which unifies the management of context (memory, resources, and skills) that Agents need through a file system paradigm, enabling hierarchical context delivery and self-evolving.&lt;/p&gt;
&lt;h3 id=&quot;nevamind-aimemu-apache-20&quot;&gt;&lt;a href=&quot;https://github.com/NevaMind-AI/memU&quot;&gt;NevaMind-AI/memU&lt;/a&gt; (Apache 2.0)&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;memU&lt;/code&gt; is a memory framework built for 24/7 proactive agents. It is designed for long-running use and greatly reduces the LLM token cost of keeping agents always online, making always-on, evolving agents practical in production systems. memU continuously captures and understands user intent. Even without a command, the agent can tell what you are about to do and act on it by itself.&lt;/p&gt;
&lt;h2 id=&quot;have-time-for-some-fun&quot;&gt;Have time for some fun?&lt;/h2&gt;
&lt;h3 id=&quot;kena-scars-of-kosmora-is-announced-during-state-of-play&quot;&gt;Kena: Scars of Kosmora is announced during &lt;em&gt;State of Play&lt;/em&gt;&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.playstation.com/tachyon/2026/02/dc57cf4a6e860a184aab3403caed4b1002316736.png?resize=1088%2C612&amp;amp;crop_strategy=smart&amp;amp;zoom=1&quot; alt=&quot;Kena: Scars of Kosmora&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://blog.playstation.com/2026/02/12/kena-scars-of-kosmora-announced-for-ps5-and-pc-out-2026/&quot;&gt;Kena: Scars of Kosmora&lt;/a&gt;, the second chapter of Kena’s adventure, brings our Spirit Guide to the mysterious realm of Kosmora, an island “full of buried secrets from a tragic past”. You can watch the announcement trailer &lt;a href=&quot;https://www.youtube.com/watch?v=12EQpTwn4lY&quot;&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;It is expected to launch on PlayStation 5 and PC later this year.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;As we wrap up this journey together, I want to take a moment to express my gratitude for your reading. If you’ve enjoyed what you just read and would like to help sustain this blog, consider &lt;a href=&quot;https://github.com/blueberry-py/blog/stargazers&quot;&gt;starring this blog on github&lt;/a&gt;, it would be great motivation for me to keep updating the blogs!&lt;/p&gt;
&lt;p&gt;Alright, that concludes the February Edition of “This Month for Pythonistas”. Thank you again for reading my post. I hope you enjoy it or find something useful. Happy coding and see you in March! 👋&lt;/p&gt;
</description><pubDate>Sat, 28 Feb 2026 13:00:00 GMT</pubDate><category>python</category><category>python</category><category>news</category><category>podcast</category><category>llm</category><category>linux</category><author>Zeyang Lin</author></item><item><title>This Month for Pythonistas - January 2026</title><link>https://blueberry-py.github.io/blog/post/this-month-for-pythonistas-2026-01/</link><guid isPermaLink="true">https://blueberry-py.github.io/blog/post/this-month-for-pythonistas-2026-01/</guid><description>&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;python&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;from&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; datetime &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;import&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; date&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;print&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(date.today().year, date.today().month)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# 2026 1&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img alt=&quot;issue-2026-01&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1280&quot; height=&quot;720&quot; src=&quot;/blog/_astro/splash.DGhLuMvf_6pVmi.webp&quot;&gt;&lt;/p&gt;
&lt;p&gt;Welcome back Pythonistas and Happy New Year 🎉! This is the first issue of 2026, and I’m excited to kick off another year of “This Month for Pythonistas” with curated Python news, tutorials, articles, podcasts and community highlights. And as a “special” issue it would cover also retrospectives of 2025 and expectations for 2026.&lt;/p&gt;
&lt;p&gt;Before we continue, please note that this blog is synced across the following platforms:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://blueberry-py.github.io/blog/post/this-month-for-pythonistas-2026-01/&quot;&gt;Github Pages&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://blueberrypy.netlify.app/post/this-month-for-pythonistas-2026-01/&quot;&gt;Netlify&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://blueberrypy.onrender.com/post/this-month-for-pythonistas-2026-01/&quot;&gt;Render&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://blueberrypy-blog.vercel.app/post/this-month-for-pythonistas-2026-01/&quot;&gt;Vercel&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Ready? Let’s get started!&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&quot;events--social&quot;&gt;Events &amp;amp; Social&lt;/h2&gt;
&lt;h3 id=&quot;europython-2026-location-revealed&quot;&gt;EuroPython 2026 Location Revealed&lt;/h3&gt;
&lt;p&gt;EuroPython 2026 will take place in Kraków, Poland from 13th to 19th July, 2026. The CFP (Call for Proposals) is open now until 15th of February. This is also the 25th anniversary of EuroPython. Learn more &lt;a href=&quot;https://ep2026.europython.eu/&quot;&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&quot;anthropic-invests-15-million-in-the-python-software-foundation-and-open-source-security&quot;&gt;&lt;a href=&quot;https://pyfound.blogspot.com/2025/12/anthropic-invests-in-python.html&quot;&gt;Anthropic invests $1.5 million in the Python Software Foundation and open source security&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Anthropic invests $1.5M over two years in the Python Software Foundation (PSF). Funds will enhance Python ecosystem security (e.g., automated PyPI package reviews to ward off supply-chain attacks) and sustain the PSF’s core work supporting CPython, its global community and infrastructure.&lt;/p&gt;
&lt;h3 id=&quot;2026-python-developers-survey&quot;&gt;&lt;a href=&quot;https://surveys.jetbrains.com/s3/python-developers-survey-2026&quot;&gt;2026 Python Developers Survey&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;This is the nineth official Developer Survey by PSF, in partnership with JetBrains. Completing the survey contributes to understanding the state of Python development and the Python community.&lt;/p&gt;
&lt;h3 id=&quot;pep-686---make-utf-8-mode-default&quot;&gt;&lt;a href=&quot;https://peps.python.org/pep-0686/&quot;&gt;PEP 686 - Make UTF-8 mode default&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;PEP 686 is &lt;em&gt;Final&lt;/em&gt;. Starting from Python 3.15, Python will use UTF-8 mode by default in text encoding. This change represents a significant step toward modernizing Python’s text handling while maintaining backward compatibility through opt-out mechanisms and warnings.&lt;/p&gt;
&lt;h2 id=&quot;new-versions&quot;&gt;New Versions&lt;/h2&gt;
&lt;h3 id=&quot;python-3150-alpha-5&quot;&gt;Python 3.15.0 alpha 5&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://devguide.python.org/_static/release-cycle.svg&quot; alt=&quot;python-release-cycle&quot;&gt;&lt;/p&gt;
&lt;p&gt;Here comes the &lt;a href=&quot;https://www.python.org/downloads/release/python-3150a5/&quot;&gt;fifth&lt;/a&gt; of &lt;del&gt;seven&lt;/del&gt; eight planned alpha releases of Python 3.15, just a couple of days after alpha 4 was released.&lt;/p&gt;
&lt;h3 id=&quot;pandas-300&quot;&gt;Pandas 3.0.0&lt;/h3&gt;
&lt;p&gt;Pandas 3.0.0 is the long-awaited major release which brings significant improvements to pandas, but also features some potentially breaking changes. The release notes can be found &lt;a href=&quot;https://pandas.pydata.org/docs/whatsnew/v3.0.0.html&quot;&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&quot;fastmcp-300-beta-1&quot;&gt;FastMCP 3.0.0 beta 1&lt;/h3&gt;
&lt;p&gt;FastMCP 3.0 introduces a redesigned framework for building Model Context Protocol servers. Built around three primitives — Components, Providers, and Transforms — it transforms from simple tool servers into dynamic “Context Applications” that intelligently manage information for AI agents. Read more at &lt;a href=&quot;https://www.jlowin.dev/blog/fastmcp-3-whats-new&quot;&gt;What’s New in FastMCP 3.0&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&quot;tutorials&quot;&gt;Tutorials&lt;/h2&gt;
&lt;h3 id=&quot;deeplearningais-document-ai-from-ocr-to-agentic-doc-extraction-from-landingai&quot;&gt;Deeplearning.ai’s &lt;a href=&quot;https://www.deeplearning.ai/short-courses/document-ai-from-ocr-to-agentic-doc-extraction/&quot;&gt;Document AI: From OCR to Agentic Doc Extraction&lt;/a&gt; from LandingAI&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;This course shows you how to build agentic workflows that process documents the way humans do: breaking them into parts, examining each piece carefully, and extracting information through multiple iterations.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id=&quot;deeplearningais-gemini-cli-code--create-with-an-open-source-agent-from-google&quot;&gt;Deeplearning.ai’s &lt;a href=&quot;https://www.deeplearning.ai/short-courses/gemini-cli-code-and-create-with-an-open-source-agent/&quot;&gt;Gemini CLI: Code &amp;amp; Create with an Open-Source Agent&lt;/a&gt; from Google&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;In this course, you’ll apply Gemini CLI to software development and creative tasks by building features for an AI conference. You’ll develop a website session catalog, create a data dashboard combining local and cloud data sources, and generate social media content from recordings. You’ll master context management, integrate MCP servers, and orchestrate across multiple services with Gemini CLI extensions.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id=&quot;realpythons-how-to-build-a-personal-python-learning-roadmap&quot;&gt;RealPython’s &lt;a href=&quot;https://realpython.com/build-python-learning-roadmap/&quot;&gt;How to Build a Personal Python Learning Roadmap&lt;/a&gt;&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;This tutorial will help you craft a personal Python learning roadmap so you can track your progress and stay accountable to your goals and timeline.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;articles&quot;&gt;Articles&lt;/h2&gt;
&lt;h3 id=&quot;python-numbers-every-programmer-should-know&quot;&gt;&lt;a href=&quot;https://mkennedy.codes/posts/python-numbers-every-programmer-should-know/&quot;&gt;Python Numbers Every Programmer Should Know&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;This article from Michael Kennedy outlines key Python performance and memory metrics for developers. Latency benchmarks include fast attribute reads (14 ns), dict lookups (22 ns), and FastAPI’s quick JSON responses (8.63 µs). Memory usage notes are striking: small ints/floats take 28/24 bytes, empty Python processes use ~15.7 MB, and slots-class instances (5 attributes) consume 212 bytes (vs 694 bytes for regular classes). Other stats highlight list append speed (28.7 ns) and SQLite query efficiency. These numbers aid in optimizing performance-sensitive algorithms.&lt;/p&gt;
&lt;h3 id=&quot;recent-optimizations-in-pythons-reference-counting&quot;&gt;&lt;a href=&quot;https://rushter.com/blog/python-refcount/&quot;&gt;Recent optimizations in Python’s Reference Counting&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;The article discusses Python 3.14+ optimizations for reference counting in CPython. It introduces a new bytecode instruction &lt;code&gt;LOAD_FAST_BORROW&lt;/code&gt; that avoids incrementing reference counts when loading local variables in hot loops, reducing memory management overhead. This optimization uses static lifetime analysis to ensure safety - borrowed references must be consumed within one code block, used for simple operations, and the source value can’t change during execution. The optimization is similar to Rust’s lifetime analysis and immutable borrowing concept. Additionally, there are ongoing efforts to eliminate redundant reference counting in JIT compiled code, though this is experimental and disabled by default.&lt;/p&gt;
&lt;h3 id=&quot;the-hidden-cost-of-python-dictionaries-and-3-safer-alternatives&quot;&gt;&lt;a href=&quot;https://codecut.ai/hidden-cost-python-dictionaries-safer-alternatives/&quot;&gt;The Hidden Cost of Python Dictionaries (And 3 Safer Alternatives)&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;This article explains the hidden dangers of Python dictionaries: typos in keys cause silent bugs, and type errors lead to data corruption. It presents three safer alternatives with increasing protection:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;NamedTuple&lt;/strong&gt; – Fixed structure with IDE autocomplete; immutable&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;dataclass&lt;/strong&gt; – Mutable fields, safe defaults, custom validation via &lt;code&gt;__post_init__&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Pydantic&lt;/strong&gt; – Runtime type enforcement, automatic type coercion, built-in constraints&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;The author recommends using dicts for quick prototyping and Pydantic for production code where safety matters.&lt;/p&gt;
&lt;h3 id=&quot;implicit-string-concatenation&quot;&gt;&lt;a href=&quot;https://www.pythonmorsels.com/implicit-string-concatenation/&quot;&gt;Implicit string concatenation&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Python automatically concatenates string literals placed next to each other without any operator - called “implicit string concatenation”. This feature is mainly used for breaking long strings across multiple lines using parentheses for implicit line continuation. However, it can cause bugs when commas are accidentally omitted in lists or function calls. The article recommends avoiding this feature in favor of explicit concatenation with &lt;code&gt;+&lt;/code&gt; or using multiline strings with &lt;code&gt;textwrap.dedent()&lt;/code&gt;, and suggests using linters to prevent accidental usage.&lt;/p&gt;
&lt;h3 id=&quot;what-async-really-means-for-your-python-web-app&quot;&gt;&lt;a href=&quot;https://hackeryarn.com/post/async-python-benchmarks/&quot;&gt;What async really means for your python web app?&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Python async web benchmarks reveal surprising results: synchronous Django with database connection pooling consistently outperforms async alternatives. Testing static content, database reads, and contentious writes shows that FastAPI excels only when it’s the sole bottleneck. For typical web services that directly access databases, the database — not the web service — is usually the bottleneck. Async Django shows 10x slower performance than sync Django for static content, while database pooling eliminates sync latency issues without code changes. The article concludes that for most services directly connecting to databases, optimized sync configurations deliver better performance than async alternatives.&lt;/p&gt;
&lt;h3 id=&quot;asyncio-is-neither-fast-nor-slow&quot;&gt;&lt;a href=&quot;https://blog.changs.co.uk/asyncio-is-neither-fast-nor-slow.html&quot;&gt;Asyncio is neither fast nor slow&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;This article critiques misleading benchmarks comparing Python’s async vs sync web frameworks. The author discovered that performance discrepancies often stem from implementation bugs (like SQLAlchemy fetching all results) rather than &lt;code&gt;asyncio&lt;/code&gt; itself. After proper configuration, async and sync perform similarly.&lt;/p&gt;
&lt;p&gt;The key takeaway: &lt;code&gt;asyncio&lt;/code&gt;’s advantage isn’t speed but resource efficiency — achieving comparable performance without extra threads/processes. The author advises against taking benchmarks at face value and encourages testing for your specific requirements. Performance depends more on implementation details and connection pools than the async/sync paradigm itself.&lt;/p&gt;
&lt;h3 id=&quot;how-to-type-hint-a-decorator-in-python&quot;&gt;&lt;a href=&quot;https://www.blog.pythonlibrary.org/2026/01/14/how-to-type-hint-a-decorator-in-python/&quot;&gt;How to Type Hint a Decorator in Python&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;This article explains how to properly type hint Python decorators. Using &lt;code&gt;TypeVar&lt;/code&gt; causes mypy errors. Instead, use &lt;code&gt;ParamSpec&lt;/code&gt; with &lt;code&gt;TypeVar&lt;/code&gt; to capture generic parameter and return types. For Python 3.12+, &lt;strong&gt;PEP 695&lt;/strong&gt; offers simplified syntax using square brackets (e.g., &lt;code&gt;def info[**P, R]&lt;/code&gt;) to implicitly declare &lt;code&gt;ParameterSpec&lt;/code&gt;. Both approaches maintain type safety for decorated functions while preserving their original signatures.&lt;/p&gt;
&lt;h3 id=&quot;static-protocols-in-python-behaviour-over-inheritance&quot;&gt;&lt;a href=&quot;https://patrickm.de/static-protocols-in-python/&quot;&gt;Static Protocols in Python: Behaviour Over Inheritance&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;This article explains static protocols in Python - a way to check object behavior rather than inheritance. Protocols enable structural typing where objects are validated by having required methods/attributes, not by class hierarchy. The author contrasts this with traditional “goose typing” using &lt;code&gt;isinstance()&lt;/code&gt;, showing how protocols reduce coupling and enable static type checking. A real-world ML example demonstrates using a Predictable protocol for models with predict_top_k methods. Static protocols (Python 3.8+) provide type safety while maintaining flexibility, allowing different coding styles to work together without complex inheritance trees. They catch errors at development time rather than runtime.&lt;/p&gt;
&lt;h3 id=&quot;unit-testing-your-codes-performance-part-1-big-o-scaling&quot;&gt;&lt;a href=&quot;https://pythonspeed.com/articles/big-o-tests/&quot;&gt;Unit testing your code’s performance, part 1: Big-O scaling&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;This article explains how to unit test your Python code’s performance by testing Big-O scalability. It introduces the &lt;code&gt;bigO&lt;/code&gt; library to empirically determine and test algorithm complexity. The author demonstrates how to track function performance, generate reports showing time/memory bounds (like O(n) or O(n²)), and write automated tests that fail when scalability changes. This approach catches critical performance regressions where algorithms become less efficient, which is especially important for processing large datasets. The method is presented as a starting point for performance testing, with plans to cover additional efficiency testing in future articles.&lt;/p&gt;
&lt;h3 id=&quot;how-we-made-pythons-packaging-library-3x-faster&quot;&gt;&lt;a href=&quot;https://iscinumpy.dev/post/packaging-faster/&quot;&gt;How we made Python’s packaging library 3x faster&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Python’s &lt;code&gt;packaging&lt;/code&gt; library was optimized to achieve 3x faster performance in version 26.0rc1. Key improvements include: Version construction became 2x faster, SpecifierSet operations up to 3x faster, and some operations up to 5x faster. Optimizations involved removing redundant &lt;code&gt;NamedTuple&lt;/code&gt; structures, eliminating duplicate &lt;code&gt;Version&lt;/code&gt; creation, using faster regex patterns, replacing &lt;code&gt;singledispatch&lt;/code&gt; with &lt;code&gt;if&lt;/code&gt; statements, and implementing better caching. The team used Python 3.15’s statistical profiler and PyPI metadata to measure performance. These changes significantly speed up dependency resolution for tools like pip, which creates millions of &lt;code&gt;Version&lt;/code&gt; objects during package installation.&lt;/p&gt;
&lt;h3 id=&quot;webassembly-as-a-python-extension-platform&quot;&gt;&lt;a href=&quot;https://nullprogram.com/blog/2026/01/01/&quot;&gt;WebAssembly as a Python extension platform&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;This blog post explores using WebAssembly (Wasm) as a Python extension platform. The author discusses two main use cases: (1) replacing Python functions with faster C-compiled-to-Wasm code for 10x performance improvements, and (2) embedding secure crypto libraries like Monocypher in Python applications. Key challenges include handling pointers as unsigned integers, managing memory allocation between host and guest, and working around wasmtime-py limitations.&lt;/p&gt;
&lt;p&gt;The author provides detailed examples showing how to create Python bindings for Wasm modules while avoiding common pitfalls like negative pointer arithmetic. Despite rough edges like large binary sizes and API instability, this approach enables distributing architecture-independent Python packages without requiring native toolchains.&lt;/p&gt;
&lt;h3 id=&quot;the-emperor-has-no-clothes-how-to-code-claude-code-in-200-lines-of-code&quot;&gt;&lt;a href=&quot;https://www.mihaileric.com/The-Emperor-Has-No-Clothes/&quot;&gt;The Emperor Has No Clothes: How to Code Claude Code in 200 Lines of Code&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;This article reveals that AI coding assistants like Claude Code aren’t magic — they’re built on a simple 200-line Python architecture. The core concept is a conversation loop between an LLM and a toolbox of three essential functions: read files, list files, and edit files.&lt;/p&gt;
&lt;p&gt;The process works by having the LLM decide when to use tools, sending structured tool calls, executing them locally, and feeding results back. The LLM never directly touches the filesystem—it just requests actions that your code performs.&lt;/p&gt;
&lt;p&gt;While production tools add features like better error handling, streaming, and more tools, the fundamental architecture remains this simple request-execute-respond cycle. The author demonstrates how anyone can build a functional coding agent using this straightforward pattern, proving that sophisticated AI coding tools are built on surprisingly simple foundations.&lt;/p&gt;
&lt;h3 id=&quot;the-future-of-software-development-is-software-developers&quot;&gt;&lt;a href=&quot;https://codemanship.wordpress.com/2025/11/25/the-future-of-software-development-is-software-developers/&quot;&gt;The Future of Software Development is Software Developers&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;The article argues that despite claims that AI (especially LLMs) will replace software developers, history shows new technologies don’t reduce programming needs but increase demand. The hard part of programming is translating human ambiguity into precise code, which AI struggles with. LLMs often slow development and produce unreliable code. While AI may assist in prototyping or inline completion, developers will remain essential. The current AI hype will likely fade, and businesses should hire and train developers now. The future will see AI as a tool, not a replacement, with more demand for skilled programmers.&lt;/p&gt;
&lt;h3 id=&quot;agent-native-architectures&quot;&gt;&lt;a href=&quot;https://every.to/guides/agent-native&quot;&gt;Agent-native Architectures&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;This guide outlines a revolutionary approach to software development where AI agents are first-class citizens, not just add-ons. The core principle: build applications where features aren’t code you write, but outcomes you describe that agents achieve using tools in loops.&lt;/p&gt;
&lt;p&gt;Five key principles govern this architecture: &lt;strong&gt;Parity&lt;/strong&gt; (agents can do everything users can via UI), &lt;strong&gt;Granularity&lt;/strong&gt; (atomic tools enable flexible composition), &lt;strong&gt;Composability&lt;/strong&gt; (new features emerge from prompt combinations), &lt;strong&gt;Emergent capability&lt;/strong&gt; (agents accomplish unanticipated tasks), and &lt;strong&gt;Improvement over time&lt;/strong&gt; (apps get better through context and prompt refinement).&lt;/p&gt;
&lt;p&gt;The approach shifts from traditional feature-by-feature development to creating a capable foundation and observing what users request, then formalizing patterns. Files serve as the universal interface due to their transparency and agent-friendliness.&lt;/p&gt;
&lt;p&gt;This architecture enables applications that are simple to start but endlessly powerful, discover latent user demand organically, and improve without code updates. The ultimate test: can your agent accomplish domain-specific outcomes you never explicitly built features for?&lt;/p&gt;
&lt;h3 id=&quot;demystifying-evals-for-ai-agents&quot;&gt;&lt;a href=&quot;https://www.anthropic.com/engineering/demystifying-evals-for-ai-agents&quot;&gt;Demystifying evals for AI agents&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;This article explains how to effectively evaluate AI agents, whose autonomy and flexibility make them harder to assess than traditional models. Good evaluations prevent reactive debugging cycles by catching issues before they affect users.&lt;/p&gt;
&lt;p&gt;The authors outline a comprehensive evaluation framework with key components: tasks (individual tests), trials (multiple attempts), graders (scoring logic), transcripts (complete interaction records), and evaluation harnesses (infrastructure). They recommend combining three grader types: code-based (fast, objective), model-based (flexible, nuanced), and human (gold standard validation).&lt;/p&gt;
&lt;p&gt;Different agent types require tailored approaches: coding agents use unit tests and static analysis; conversational agents need multidimensional scoring including interaction quality; research agents require groundedness and coverage checks; computer use agents need outcome verification in real environments.&lt;/p&gt;
&lt;p&gt;The article provides a practical roadmap: start early with 20-50 real-world tasks, build robust harnesses with stable environments, design thoughtful graders, and maintain long-term through transcript review. When combined with production monitoring, A/B testing, and user feedback, evaluations create a comprehensive quality system that accelerates development rather than slowing it down.&lt;/p&gt;
&lt;h3 id=&quot;how-to-build-self-improving-coding-agents&quot;&gt;How to build self-improving coding agents&lt;/h3&gt;
&lt;h4 id=&quot;part-1&quot;&gt;&lt;a href=&quot;https://ericmjl.github.io/blog/2026/1/17/how-to-build-self-improving-coding-agents-part-1/&quot;&gt;Part 1&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;To build self-improving coding agents without changing model weights, the author proposes modifying the agent’s environment using two key levers: &lt;strong&gt;AGENTS.md&lt;/strong&gt; as repository memory and &lt;strong&gt;skills&lt;/strong&gt; as reusable playbooks.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;AGENTS.md&lt;/code&gt; helps agents navigate codebases quickly through code maps and encodes repo-specific corrections and norms, preventing repeated mistakes. When agents discover mismatches or receive user feedback, they should update the documentation automatically, creating a durable feedback loop. This operational approach reduces repetitive guidance and makes agents improvement without constant babysitting.&lt;/p&gt;
&lt;h4 id=&quot;part-2&quot;&gt;&lt;a href=&quot;https://ericmjl.github.io/blog/2026/1/18/how-to-build-self-improving-coding-agents-part-2/&quot;&gt;Part 2&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;The second explores “skills” for coding agents—reusable prompt folders (&lt;code&gt;SKILL.md&lt;/code&gt; + assets) that streamline repetitive tasks. Skills explicitly define when to use them, steps to follow, and expected outputs. Examples include GitHub debugging, release announcements, ML model reports, and domain-specific troubleshooting. Skills evolve through iteration and feedback, making them easier to refine than starting from scratch. While distribution is less mature than MCP servers, tools like OpenSkills now help with installation and updates.&lt;/p&gt;
&lt;h4 id=&quot;part-3&quot;&gt;&lt;a href=&quot;https://ericmjl.github.io/blog/2026/1/19/how-to-build-self-improving-coding-agents-part-3/&quot;&gt;Part 3&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;Part 3 combines repo memory (&lt;code&gt;AGENTS.md&lt;/code&gt;) and skills into a practice with a maturity model: ad hoc prompting → repo-local memory → global personal skills → shared team skills. Watch agent traces to identify patterns—repo-specific go into &lt;code&gt;AGENTS.md&lt;/code&gt;, reusable workflows become skills. Markdown becomes executable when agents turn instructions into tool calls. The key distinction: &lt;code&gt;AGENTS.md&lt;/code&gt; for how a repo works; skills for repeatable, on-demand procedures. The meta skill is metacognition—watching yourself work to systematize repeated tasks. Coding agents are evolving beyond coding tools into general-purpose teammates across all intellectual work.&lt;/p&gt;
&lt;h3 id=&quot;ai-writes-code-faster-your-job-is-still-to-prove-it-works&quot;&gt;&lt;a href=&quot;https://addyosmani.com/blog/code-review-ai/&quot;&gt;AI writes code faster. Your job is still to prove it works.&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;AI accelerates coding but shifts the burden from writing to proving code works. By 2026, 30% of senior developers ship mostly AI-generated code, which has 75% more logic errors. Solo developers rely on automated testing as safety nets, while teams use human review for security, context, and accountability. AI generates 45% of code with security flaws and increases PR volume by 18%, creating review bottlenecks. The new “PR contract” requires authors to provide evidence of working code through tests and manual verification. AI serves as first-pass reviewer, but human judgment remains essential for quality control and responsibility.&lt;/p&gt;
&lt;h3 id=&quot;ai-makes-exploration-cheap-not-decisions-easy&quot;&gt;&lt;a href=&quot;https://www.nucleate.dev/blog/ai-makes-exploration-cheap-not-decisions-easy&quot;&gt;AI Makes Exploration Cheap, Not Decisions Easy&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;AI makes exploration cheaper, not decisions easier. The key insight is that AI accelerates the exploration phase of creative work, allowing designers and developers to try more options in less time, but it doesn’t eliminate the need for human judgment.&lt;/p&gt;
&lt;p&gt;Great work requires “wasted work” - trying multiple approaches that don’t work to discover what does. AI compresses this process from days/weeks to hours, enabling rapid prototyping and experimentation. However, AI cannot make final decisions because it lacks context about users, brand, constraints, and past experiences.&lt;/p&gt;
&lt;p&gt;The human role shifts to Director-Curator-Craftsman: setting vision, selecting from AI-generated abundance, and applying taste and judgment. The real benefit is faster learning - each failed attempt teaches something valuable about the problem.&lt;/p&gt;
&lt;p&gt;The trap is letting AI make decisions for you. Instead, use AI to multiply exploration, then apply critical thinking to choose the best option. Your value lies in knowing what should get built and why, not in the mechanical production work.&lt;/p&gt;
&lt;h3 id=&quot;top-python-libraries-of-2025&quot;&gt;&lt;a href=&quot;https://tryolabs.com/blog/top-python-libraries-2025&quot;&gt;Top Python libraries of 2025&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Tryolabs’ 11th 2025 top Python libraries list balances LLM-focused tools and broader ecosystem innovations (performance, security, dev experience). It includes 10 top general picks (e.g., Rust-powered &lt;code&gt;ty&lt;/code&gt; type checker) and 10 AI/ML/Data tools, plus runners-up for each category to reflect real-world AI system building.&lt;/p&gt;
&lt;h3 id=&quot;pypi-in-2025-a-year-in-review&quot;&gt;&lt;a href=&quot;https://blog.pypi.org/posts/2025-12-31-pypi-2025-in-review/&quot;&gt;PyPI in 2025: A Year in Review&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;The PyPI 2025 Year in Review highlights major growth and security improvements. Key statistics: over 3.9 million new files, 130,000 new projects, 1.92 exabytes transferred. Security enhancements included improved 2FA (52% of active users), trusted publishing (50,000+ projects), email verification, phishing protection, and zipfile security. Organizations grew to 7,742 created with 9,059 projects managed. The team processed 2,000+ malware reports (66% resolved in 4 hours), handled 2,221 account recoveries, and resolved 500+ name retention requests. New features included project archiving, new Terms of Service, and enhanced incident reporting transparency.&lt;/p&gt;
&lt;h3 id=&quot;2025-the-year-in-llms&quot;&gt;&lt;a href=&quot;https://simonwillison.net/2025/Dec/31/the-year-in-llms/&quot;&gt;2025: The year in LLMs&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;2025 was a transformative year for LLMs, with key trends including “reasoning” as a dominant feature—models like OpenAI’s o3 and o4-mini excelled in multi-step problem-solving and tool integration. Agents emerged critical, particularly coding agents (e.g., Claude Code, Codex CLI) handling asynchronous tasks, generating $1B in run-rate revenue. Chinese open-weight models (GLM-4.7, Qwen3) outperformed competitors, ranking highly. Prompt-driven image editing tools (GPT-4o, Google’s Nano Banana) drove viral adoption. Meta’s Llama 4 underperformed, and long tasks advanced, with models completing hours-long assignments. Agents streamlined search, and async coding tools became mainstream. Leadership shifted, with OpenAI and Google innovating, while Chinese models challenged Western dominance.&lt;/p&gt;
&lt;h3 id=&quot;five-takes-to-end-2025&quot;&gt;&lt;a href=&quot;https://parkerortolani.blog/2025/12/30/five-takes-to-end.html&quot;&gt;Five Takes to End 2025&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Parker Ortolani’s year-end tech analysis covers five key takes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;OpenAI risks distraction by over-productizing instead of focusing on core AI models;&lt;/li&gt;
&lt;li&gt;Google’s dominance is resurgent with successful AI initiatives;&lt;/li&gt;
&lt;li&gt;departing Apple designer Alan Dye deserves more credit for his influential 12-year tenure;&lt;/li&gt;
&lt;li&gt;software-on-demand through AI coding tools is disrupting traditional app development;&lt;/li&gt;
&lt;li&gt;while Apple delivered excellent hardware in 2025, they must launch a spectacular AI Siri in 2026 after delays.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;software-engineering-in-2026&quot;&gt;&lt;a href=&quot;https://benjamincongdon.me/blog/2025/12/29/Software-Engineering-in-2026/&quot;&gt;Software Engineering in 2026&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;The article explores how 2025’s AI coding advances will reshape software engineering in 2026. LLM tools have significantly reduced the marginal cost of producing quality code, shifting bottlenecks elsewhere. Key changes expected: infrastructure abstractions become more valuable, CI infrastructure needs higher quality, human-guided abstractions grow crucial for preventing technical debt, code review must evolve to focus on high-impact decisions, and project timeline estimates will increase in variance. While building code becomes cheaper, operating systems and high-value projects remain less LLM-amenable, requiring deeper human expertise.&lt;/p&gt;
&lt;h3 id=&quot;17-predictions-for-ai-in-2026&quot;&gt;&lt;a href=&quot;https://www.understandingai.org/p/17-predictions-for-ai-in-2026&quot;&gt;17 predictions for AI in 2026&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;This article presents 17 AI predictions from experts with confidence scores, focusing on technology advancement and economic impact. Key predictions include Big Tech exceeding $500B in capital expenditures, OpenAI/Anthropic hitting 2026 revenue goals ($30B/$15B), context windows stabilizing around 1M tokens, and US GDP growth remaining under 3.5%.&lt;/p&gt;
&lt;p&gt;Other notable predictions include Tesla offering driverless taxi service, Chinese companies potentially surpassing Waymo’s robotaxi fleet, and AI avoiding major catastrophes.&lt;/p&gt;
&lt;p&gt;Overall, the authors expect steady AI improvement but modest real-world economic impacts, dismissing both AI bubble fears and rapid “fast takeoff” scenarios, instead predicting gradual integration across industries.&lt;/p&gt;
&lt;h2 id=&quot;podcasts&quot;&gt;Podcasts&lt;/h2&gt;
&lt;h3 id=&quot;-corepy&quot;&gt;🥝 core.py&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://open.spotify.com/episode/5PR5PeuIb4f2Qyo4w9hTli&quot;&gt;Episode 28: 2025 In Review&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;-realpython-podcast&quot;&gt;🐍 RealPython Podcast&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://realpython.com/podcasts/rpp/278/&quot;&gt;Episode 278: PyCoder’s Weekly 2025 Top Articles &amp;amp; Hidden Gems&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://realpython.com/podcasts/rpp/279/&quot;&gt;Episode 279: Coding Python With Confidence: Beginners Live Course Participants&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://realpython.com/podcasts/rpp/280/&quot;&gt;Episode 280: Considering Fast and Slow in Python Programming&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://realpython.com/podcasts/rpp/281/&quot;&gt;Episode 281: Continuing to Improve the Learning Experience at Real Python&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://realpython.com/podcasts/rpp/282/&quot;&gt;Episode 282: Testing Python Code for Scalability &amp;amp; What’s New in pandas 3.0&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;-python-bytes-podcast&quot;&gt;🥧 Python Bytes Podcast&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://pythonbytes.fm/episodes/show/464/malicious-package-no-build-for-you&quot;&gt;#464 Malicious Package? No Build For You!&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://pythonbytes.fm/episodes/show/465/stack-overflow-is-cooked&quot;&gt;#465 Stack Overflow is Cooked&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://pythonbytes.fm/episodes/show/466/psf-lands-1.5-million&quot;&gt;#466 PSF Lands $1.5 million&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://pythonbytes.fm/episodes/show/467/toads-in-my-ai&quot;&gt;#467 Toads in my AI&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;-talk-python-to-me&quot;&gt;🦜 Talk Python to me&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://talkpython.fm/episodes/show/533/web-frameworks-in-prod-by-their-creators&quot;&gt;#533: Web Frameworks in Prod by Their Creators&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://talkpython.fm/episodes/show/534/diskcache-your-secret-python-perf-weapon&quot;&gt;#534: diskcache: Your secret Python perf weapon&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://talkpython.fm/episodes/show/535/pyview-real-time-python-web-apps&quot;&gt;#535: PyView: Real-time Python Web Apps&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;-pybites-podcast&quot;&gt;🍕 Pybites Podcast&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.pybitespodcast.com/1501156/episodes/18354849-210-codeflash-and-continuous-python-performance-with-saurabh-misra&quot;&gt;#210: Codeflash and continuous Python performance with Saurabh Misra&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.pybitespodcast.com/1501156/episodes/18492644-211-keeping-the-joy-in-coding-a-new-year-s-resolution&quot;&gt;#211: Keeping the joy in coding - a new year’s resolution&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.pybitespodcast.com/1501156/episodes/18532295-212-elmer-bulthuis-on-rust-webassembly-and-sustainable-design&quot;&gt;#212: Elmer Bulthuis on Rust, WebAssembly, and Sustainable Design&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.pybitespodcast.com/1501156/episodes/18564716-213-seven-software-engineering-tips-to-make-real-progress-this-year&quot;&gt;#213: Seven Software Engineering Tips to Make Real Progress This Year&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;-vs-code-insiders-podcast&quot;&gt;🚀 VS Code Insiders Podcast&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.vscodepodcast.com/18&quot;&gt;Episode 18: Orchestrating Multiple Agents in VS Code with Ben &amp;amp; Peng&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;repositories&quot;&gt;Repositories&lt;/h2&gt;
&lt;h3 id=&quot;adamchainztprof-mit&quot;&gt;&lt;a href=&quot;https://github.com/adamchainz/tprof&quot;&gt;adamchainz/tprof&lt;/a&gt; (MIT)&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;tprof&lt;/code&gt; is a targeting profiler for Python 3.12+ that only measures the time spent in specified target functions. You can use it to measure your program before and after an optimization to see if it made any difference, with a quick report on the command line.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;As we wrap up this journey together, I want to take a moment to express my gratitude for your reading. If you’ve enjoyed what you just read and would like to help sustain this blog, consider &lt;a href=&quot;https://github.com/blueberry-py/blog/stargazers&quot;&gt;starring this blog on github&lt;/a&gt;, it would be great motivation for me to keep updating the blogs!&lt;/p&gt;
&lt;p&gt;Alright, that concludes the January Edition of “This Month for Pythonistas”. Thank you again for reading my post. I hope you enjoy it or find something useful. Happy coding and see you in February! 👋&lt;/p&gt;
</description><pubDate>Sat, 31 Jan 2026 04:00:00 GMT</pubDate><category>python</category><category>python</category><category>news</category><category>podcast</category><category>ai</category><category>agentic</category><category>llm</category><category>linux</category><author>Zeyang Lin</author></item><item><title>This Month for Pythonistas - December 2025</title><link>https://blueberry-py.github.io/blog/post/this-month-for-pythonistas-2025-12/</link><guid isPermaLink="true">https://blueberry-py.github.io/blog/post/this-month-for-pythonistas-2025-12/</guid><description>&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;python&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;from&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; datetime &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;import&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; date&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;print&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(date.today().year, date.today().month)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# 2025 12&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img alt=&quot;issue-2025-12&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1280&quot; height=&quot;720&quot; src=&quot;/blog/_astro/splash.D-FnbyXz_2qOnvV.webp&quot;&gt;&lt;/p&gt;
&lt;p&gt;Welcome back Pythonistas! It’s the final month of 2025 (happy holidays!), and we have a lot to catch up on before the new year rings in.&lt;/p&gt;
&lt;p&gt;Before we continue, please note that this blog is synced across the following platforms:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://blueberry-py.github.io/blog/post/this-month-for-pythonistas-2025-12/&quot;&gt;Github Pages&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://blueberrypy.netlify.app/post/this-month-for-pythonistas-2025-12/&quot;&gt;Netlify&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://blueberrypy.onrender.com/post/this-month-for-pythonistas-2025-12/&quot;&gt;Render&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://blueberrypy-blog.vercel.app/post/this-month-for-pythonistas-2025-12/&quot;&gt;Vercel&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Ready? Let’s get started!&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&quot;events--social&quot;&gt;Events &amp;amp; Social&lt;/h2&gt;
&lt;h3 id=&quot;investing-in-the-python-ecosystem&quot;&gt;&lt;a href=&quot;https://vercel.com/blog/investing-in-the-python-ecosystem&quot;&gt;Investing in the Python ecosystem&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://assets.vercel.com/image/upload/contentful/image/e5382hct74si/6wH2QEDDNBKhbohIoRBkOk/af6cead60b46fc879c557e9e3c194d3f/vercel_python_og_card.png&quot; alt=&quot;vercel+python&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Vercel&lt;/strong&gt; has announced a significant expansion into the Python ecosystem by hiring the team behind &lt;strong&gt;Gel Data&lt;/strong&gt;, led by renowned Python core developer &lt;em&gt;Yury Selivanov&lt;/em&gt; and contributor &lt;em&gt;Elvis Pranskevichus&lt;/em&gt;. Known for creating high-performance tools like &lt;code&gt;uvloop&lt;/code&gt; and &lt;code&gt;asyncpg&lt;/code&gt;, this team will spearhead Vercel’s efforts to bring world-class Python support to its AI Cloud.&lt;/p&gt;
&lt;p&gt;This move marks a strategic shift for Vercel beyond its JavaScript and TypeScript roots, aiming to make Python deployment as seamless and fast as its existing frontend workflows. As part of this initiative, Vercel plans to improve Python framework support and actively contribute to the open-source tools the community relies on.&lt;/p&gt;
&lt;p&gt;To demonstrate its commitment, Vercel is investing directly in the Python community through several initiatives:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Becoming a Maintaining-level sponsor of the Python Software Foundation (PSF).&lt;/li&gt;
&lt;li&gt;Sponsoring core developer &lt;em&gt;Serhiy Storchaka&lt;/em&gt; for a full year to support his work on the interpreter and standard library.&lt;/li&gt;
&lt;li&gt;Funding key conferences, local meetups, and a planned hackathon.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Regarding the acquisition, Vercel clarified that the Gel Data platform itself will &lt;em&gt;wind down&lt;/em&gt; by &lt;strong&gt;January 31, 2026&lt;/strong&gt;, though its open-source components will remain available. The deal is focused strictly on acquiring Python expertise rather than entering the database market; Vercel intends to continue partnering with existing database providers via its marketplace.&lt;/p&gt;
&lt;h3 id=&quot;why-developers-still-flock-to-python-guido-van-rossum-on-readability-ai-and-the-future-of-programming&quot;&gt;&lt;a href=&quot;https://github.blog/developer-skills/programming-languages-and-frameworks/why-developers-still-flock-to-python-guido-van-rossum-on-readability-ai-and-the-future-of-programming/&quot;&gt;Why developers still flock to Python: Guido van Rossum on readability, AI, and the future of programming&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Despite TypeScript &lt;a href=&quot;https://github.blog/news-insights/octoverse/octoverse-a-new-developer-joins-github-every-second-as-ai-leads-typescript-to-1/&quot;&gt;recently overtaking&lt;/a&gt; Python in GitHub popularity, Python creator Guido van Rossum remains optimistic about his language’s future. In this interview, he attributes Python’s enduring success —- including a 49% year-over-year growth —- to its core philosophy of readability and developer friendliness.&lt;/p&gt;
&lt;p&gt;Guido highlights Python’s critical role in the AI boom, driven by a massive ecosystem (NumPy, PyTorch) rather than just syntax. He argues against enforcing strict typing for AI’s sake, believing tools should adapt to humans. Ultimately, Python’s accessibility to non-CS backgrounds and commitment to backward compatibility ensure it remains a foundational tool for the next generation of developers.&lt;/p&gt;
&lt;h3 id=&quot;the-rise-and-rise-of-fastapi&quot;&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=mpR8ngthqiE&quot;&gt;The Rise and Rise of FastAPI&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Sebastián Ramirez, the creator behind FastAPI, talks about his background, motivation, inspiration, and surprise at the meteoric rise of his open source project in this short documentary produced by CultRepo.&lt;/p&gt;
&lt;h3 id=&quot;aws-reinvent-2025&quot;&gt;&lt;a href=&quot;https://reinvent.awsevents.com/&quot;&gt;AWS re:Invent 2025&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://assets.aboutamazon.com/5c/a8/a50a32a04372a389c9c545f182c5/about-amazon-hero-aws-re-invent-tuesday.jpg&quot; alt=&quot;aws-re-invent-2025&quot;&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Nova 2: Lite, Pro, Sonic and Omni, all with multi-modal capabilities&lt;/li&gt;
&lt;li&gt;Nova Forge: blend proprietary data with Amazon Nova-curated training data and host custom models securely on AWS.&lt;/li&gt;
&lt;li&gt;Kiro Powers:&lt;/li&gt;
&lt;li&gt;strands-agents: TypeScript variant now in preview&lt;/li&gt;
&lt;li&gt;Frontier agents: autonomous, scalable agents which can work for hours or days without intervention&lt;/li&gt;
&lt;li&gt;AWS Lambda durable functions: build resilient multi-step applications and AI workflows that can execute for up to one year&lt;/li&gt;
&lt;li&gt;AWS Transform custom: AI-powered custom modernization for code, APIs, etc.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;introducing-gpt-52&quot;&gt;&lt;a href=&quot;https://openai.com/index/introducing-gpt-5-2/&quot;&gt;Introducing GPT-5.2&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;OpenAI introduced &lt;strong&gt;GPT-5.2&lt;/strong&gt;, their “most powerful” model series designed for professional knowledge work and persistent agents. The model significantly enhances capabilities in spreadsheet creation, presentation design, coding, image recognition, long-context understanding, and complex multi-step projects.&lt;/p&gt;
&lt;p&gt;Key benchmarks show substantial improvements: GDPval knowledge work tasks at 70.9% (vs. 38.8% for GPT-5), SWE-Bench Pro software engineering at 55.6%, GPQA Diamond scientific questions at 92.4%, and near-perfect long-context reasoning (100% accuracy on 4-needle MRCR tests up to 256k tokens). Visual understanding and tool calling also saw major advances.&lt;/p&gt;
&lt;p&gt;Three variants are available: GPT-5.2 Instant for daily tasks, Thinking for complex work, and Pro for highest-difficulty problems. The models are rolling out to paid ChatGPT users and available via API. Safety improvements include better responses to sensitive topics like mental health. Early partners like Notion, Box, Shopify, and Databricks report strong performance in real-world applications.&lt;/p&gt;
&lt;h3 id=&quot;gemini-3-flash-frontier-intelligence-built-for-speed&quot;&gt;&lt;a href=&quot;https://blog.google/products/gemini/gemini-3-flash/&quot;&gt;Gemini 3 Flash: frontier intelligence built for speed&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://storage.googleapis.com/gweb-uniblog-publish-prod/images/gemini-3_flash_model_blog_header.width-2200.format-webp.webp&quot; alt=&quot;gemini-3-flash&quot;&gt;&lt;/p&gt;
&lt;p&gt;Google introduced &lt;strong&gt;Gemini 3 Flash&lt;/strong&gt;, a high-speed AI model in Gemini 3 family designed to deliver “frontier intelligence” with industry-leading efficiency. It combines &lt;em&gt;Gemini 3 Pro&lt;/em&gt;-grade reasoning with Flash-level latency, significantly outperforming the 2.5 series. On benchmarks like GPQA Diamond, it achieves a 90.4% score while remaining 3x faster and more cost-effective ($0.50/1M input tokens) than previous models.&lt;/p&gt;
&lt;p&gt;Key Features and Capabilities:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Agentic Workflows: Optimized for the new Google Antigravity platform, it excels at complex coding and agentic tasks, scoring 78% on coding evaluations.&lt;/li&gt;
&lt;li&gt;Real-Time Multimodal Reasoning: It supports near-instant interactions, such as live sketching assistance, golf swing analysis, and “voice-to-app” creation without manual coding.&lt;/li&gt;
&lt;li&gt;Ecosystem Integration: It is now the default model for the Gemini app and AI Mode in Search, providing more nuanced and visual responses globally.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;donating-the-model-context-protocol-and-establishing-the-agentic-ai-foundation&quot;&gt;&lt;a href=&quot;https://www.anthropic.com/news/donating-the-model-context-protocol-and-establishing-of-the-agentic-ai-foundation&quot;&gt;Donating the Model Context Protocol and establishing the Agentic AI Foundation&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://www-cdn.anthropic.com/images/4zrzovbb/website/9f6a378a1e3592cf8d27447457409ba12284faef-1000x1000.svg&quot; alt=&quot;mcp-donation&quot;&gt;&lt;/p&gt;
&lt;p&gt;Anthropic has donated its &lt;strong&gt;Model Context Protocol (MCP)&lt;/strong&gt; to the newly established &lt;strong&gt;Agentic AI Foundation (AAIF)&lt;/strong&gt;, a directive fund under the Linux Foundation.&lt;/p&gt;
&lt;p&gt;The &lt;a href=&quot;https://aaif.io/&quot;&gt;AAIF&lt;/a&gt; was co-founded by Anthropic, Block, and OpenAI, with support from industry leaders like Google, Microsoft, and AWS. Its mission is to ensure the development of agentic AI remains transparent, collaborative, and in the public interest through shared open standards.&lt;/p&gt;
&lt;p&gt;Key details include:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;MCP’s Role:&lt;/strong&gt; Launched a year ago, MCP serves as a universal open standard for connecting AI applications to external systems. It has already seen massive adoption, with over 10,000 active servers and support from major platforms.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Strategic Donation:&lt;/strong&gt; By transferring MCP to the AAIF, Anthropic aims to maintain the protocol as a &lt;strong&gt;neutral, vendor-agnostic, and community-driven&lt;/strong&gt; standard, preventing any single company from controlling the ecosystem.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Future Growth:&lt;/strong&gt; MCP will be a founding project of the AAIF alongside Block’s “goose” and OpenAI’s “AGENTS.md.” Anthropic remains connected to the project and will continue to contribute to its development.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;cloudflare-outage-on-december-5-2025&quot;&gt;&lt;a href=&quot;https://blog.cloudflare.com/5-december-2025-outage/&quot;&gt;Cloudflare outage on December 5, 2025&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;On &lt;em&gt;December 5, 2025&lt;/em&gt;, Cloudflare experienced a 25-minute service outage (08:47–09:12 UTC) affecting approximately 28% of its HTTP traffic. The incident resulted in widespread HTTP 500 errors but was not caused by a cyberattack.&lt;/p&gt;
&lt;p&gt;The outage was triggered during an update intended to mitigate a critical React vulnerability (&lt;em&gt;CVE-2025-55182&lt;/em&gt;). While attempting to disable an internal testing tool via a global configuration change, engineers inadvertently activated a dormant bug in Cloudflare’s Lua-based rules engine. A “killswitch” applied to a specific rule type (action “execute”) caused the code to attempt to access a non-existent object, resulting in a runtime error.&lt;/p&gt;
&lt;p&gt;This error impacted customers using Cloudflare’s legacy FL1 proxy with Managed Rulesets. The outage ended once the configuration change was reverted. Cloudflare has apologized and is prioritizing resiliency measures, such as “fail-open” error handling and safer configuration rollout mechanisms, to prevent recurrence.&lt;/p&gt;
&lt;h2 id=&quot;new-versions&quot;&gt;New Versions&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Python 3.15.0 alpha 3&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Here comes the &lt;a href=&quot;https://www.python.org/downloads/release/python-3150a3/&quot;&gt;third&lt;/a&gt; of seven planned alpha releases of Python 3.15.&lt;/p&gt;
&lt;p&gt;Additionally, &lt;em&gt;Python 3.14.2&lt;/em&gt; and &lt;em&gt;3.13.11&lt;/em&gt; (yet another two expedited releases) are also available.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Django 6.0&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The highlights of this major release include: Template Partials, Background Tasks, Content Security Policy (CSP), Modernized Email API, and more. The full release notes can be found &lt;a href=&quot;https://docs.djangoproject.com/en/6.0/releases/6.0/&quot;&gt;here&lt;/a&gt;. Read on and you can find articles down below that highlight this release.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ty 0.0.8&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;ty&lt;/strong&gt;，the extremely fast Python type checker and language server from astral.sh, has &lt;a href=&quot;https://astral.sh/blog/ty&quot;&gt;reached its beta phase&lt;/a&gt;. Both the CLI and the VSCode extension are now updated.&lt;/p&gt;
&lt;h2 id=&quot;tutorials&quot;&gt;Tutorials&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;deeplearning.ai’s &lt;a href=&quot;https://www.deeplearning.ai/short-courses/building-coding-agents-with-tool-execution/&quot;&gt;Building Coding Agents with Tool Execution&lt;/a&gt; from E2B&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;In this course, you’ll build agents that write and execute code to accomplish tasks, going far beyond predefined function calls. Instead of limiting your agent to a fixed set of tools, you’ll let it access Python’s entire ecosystem, and write multi-step code sequences. Plus, you’ll learn to run this generated code safely in sandboxed cloud environments, protecting your systems from potentially harmful operations.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ul&gt;
&lt;li&gt;deeplearning.ai’s &lt;a href=&quot;https://www.deeplearning.ai/short-courses/nvidia-nat-making-agents-reliable/&quot;&gt;Nvidia’s NeMo Agent Toolkit: Making Agents Reliable&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;Nvidia’s open-source NeMo Agent Toolkit (NAT) provides the building blocks you need to harden your agents for production, whether built in raw Python, LangGraph, CrewAI, or any other framework.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ul&gt;
&lt;li&gt;RealPython’s &lt;a href=&quot;https://realpython.com/python-skills/&quot;&gt;How to Build the Python Skills That Get You Hired&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This tutorial provides a strategic approach to building Python skills for career success. It outlines a three-step framework:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Step 1: Identify Skills Employers Value&lt;/strong&gt;
Research job listings to find recurring patterns. Common requirements include Python fundamentals, Git, unit testing, debugging, and increasingly familiarity with AI coding tools (GitHub Copilot, Claude Code, etc.). Different paths exist: web development (Flask/Django), data science (NumPy, pandas), or machine learning (PyTorch).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Step 2: Map Your Learning Path&lt;/strong&gt;
Create a skill roadmap worksheet tracking your current proficiency (1-5 scale), job relevance, and specific next actions. Use SMART criteria—make goals Specific, Measurable, Achievable, Relevant, and Time-bound. Prioritize high-impact, high-urgency skills first.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Step 3: Build Sustainable Practice&lt;/strong&gt;
Design weekly practice sessions (distributed learning works better than marathon sessions). Build complete projects demonstrating skills, practice coding challenges for interviews, and learn to use AI tools effectively. Focus on demonstrating judgment when reviewing AI-generated code.&lt;/p&gt;
&lt;h2 id=&quot;articles&quot;&gt;Articles&lt;/h2&gt;
&lt;h3 id=&quot;pep-810---explicit-lazy-imports&quot;&gt;&lt;a href=&quot;https://peps.python.org/pep-0810/&quot;&gt;PEP 810 - Explicit lazy imports&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;PEP 810 is &lt;strong&gt;accepted&lt;/strong&gt;. It introduces syntax for explicit lazy imports in Python, allowing developers to defer module loading until the imported names are first used. This PEP is now targeted for Python 3.15.&lt;/p&gt;
&lt;h3 id=&quot;eventual-rust-in-cpython&quot;&gt;&lt;a href=&quot;https://lwn.net/SubscriberLink/1046933/d13433b823f559c0/&quot;&gt;Eventual Rust in CPython&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Core Python developers &lt;em&gt;Emma Smith&lt;/em&gt; and &lt;em&gt;Kirill Podoprigora&lt;/em&gt; proposed integrating Rust into CPython, initially for optional modules but eventually as a build requirement. They cited benefits like memory safety and attracting new contributors, a sentiment supported by Guido van Rossum.&lt;/p&gt;
&lt;p&gt;However, the proposal faced pushback regarding increased build complexity, potential community friction similar to “Rust for Linux”, and difficulties for niche architectures like those supported by Gentoo. Consequently, the authors scaled back the plan, indefinitely postponing mandatory adoption. They will focus instead on a gradual introduction via optional extension modules to build infrastructure and experience first.&lt;/p&gt;
&lt;h3 id=&quot;module-compression-overview&quot;&gt;&lt;a href=&quot;https://mathspp.com/blog/module-compression-overview&quot;&gt;Module compression overview&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;This article from &lt;em&gt;Rodrigo Girão Serrão&lt;/em&gt; teaches Python 3.14’s new &lt;code&gt;compression&lt;/code&gt; package, covering 5 modules: &lt;code&gt;bz2&lt;/code&gt;, &lt;code&gt;gzip&lt;/code&gt;, &lt;code&gt;lzma&lt;/code&gt;, &lt;code&gt;zlib&lt;/code&gt;, and &lt;code&gt;zstd&lt;/code&gt;. It explains basic compression/decompression, file operations, and incremental processing. The modules offer simple &lt;code&gt;compress&lt;/code&gt;/&lt;code&gt;decompress&lt;/code&gt; functions plus advanced options. Zstd is new to Python 3.14 and shows superior compression ratios.&lt;/p&gt;
&lt;h3 id=&quot;generalising-itertoolspairwise&quot;&gt;&lt;a href=&quot;https://mathspp.com/blog/generalising-itertools-pairwise&quot;&gt;Generalising &lt;code&gt;itertools.pairwise&lt;/code&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;This article explains Python’s &lt;code&gt;itertools.pairwise&lt;/code&gt;, a tool for creating overlapping pairs of consecutive elements from an iterable. While often implemented with slicing, the post suggests a more robust approach using &lt;code&gt;collections.deque&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;The main focus is generalizing this to &lt;code&gt;nwise&lt;/code&gt;, which generates tuples of &lt;code&gt;n&lt;/code&gt; consecutive items. Three implementations are demonstrated:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Adapting the &lt;code&gt;deque&lt;/code&gt; method with &lt;code&gt;maxlen=n&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Using &lt;code&gt;itertools.tee&lt;/code&gt; to manage multiple independent iterators.&lt;/li&gt;
&lt;li&gt;A recursive solution that builds &lt;code&gt;nwise&lt;/code&gt; by repeatedly applying &lt;code&gt;pairwise&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;django-whats-new-in-60&quot;&gt;&lt;a href=&quot;https://adamj.eu/tech/2025/12/03/django-whats-new-6.0/&quot;&gt;Django: what’s new in 6.0&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Django 6.0 introduces four headline features to the web framework:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Template Partials&lt;/strong&gt;: A new tag allows defining and reusing named fragments within templates, greatly simplifying workflows with libraries like HTMX.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Tasks Framework&lt;/strong&gt;: A standard, built-in API for defining and enqueuing background tasks, designed to work with various task runner backends (like &lt;code&gt;django-tasks&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Content Security Policy&lt;/strong&gt;: Native middleware and settings for CSP help prevent XSS attacks, including automatic nonce generation for scripts.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Modern Email API&lt;/strong&gt;: The internal email system now uses Python’s modern &lt;code&gt;EmailMessage&lt;/code&gt; library, fixing bugs and improving MIME support.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;a-first-look-at-djangos-new-background-tasks&quot;&gt;&lt;a href=&quot;https://roam.be/notes/2025/a-first-look-at-djangos-new-background-tasks/&quot;&gt;A first look at Django’s new background tasks&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Django 6.0 introduces &lt;code&gt;django.tasks&lt;/code&gt;, a standard API for background tasks, though it intentionally lacks a built-in worker mechanism for execution. While not immediately replacing robust tools like Celery, it unifies task definitions.&lt;/p&gt;
&lt;p&gt;The article demonstrates creating a custom database-backed task queue and worker to send notifications via &lt;code&gt;ntfy.sh&lt;/code&gt;. It details defining tasks using the &lt;code&gt;@task&lt;/code&gt; decorator, enqueuing them, and retrieving results. Although the native framework currently lacks automatic retries and complex orchestration, the specific implementation shown adds these features, suggesting &lt;code&gt;django.tasks&lt;/code&gt; successfully standardizes the majority of common background processing use cases.&lt;/p&gt;
&lt;h3 id=&quot;python-workers-redux-fast-cold-starts-packages-and-a-uv-first-workflow&quot;&gt;&lt;a href=&quot;https://blog.cloudflare.com/python-workers-advancements/&quot;&gt;Python Workers redux: fast cold starts, packages, and a uv-first workflow&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Cloudflare has significantly enhanced Python Workers with three major improvements. First, they’ve achieved dramatically faster cold starts using memory snapshots, reducing average start times to 1.027 seconds - 2.4x faster than AWS Lambda without SnapStart and 3x faster than Google Cloud Run. Second, they’ve integrated comprehensive package support using the &lt;code&gt;uv&lt;/code&gt; package manager, allowing developers to use any &lt;code&gt;Pyodide&lt;/code&gt;-compatible package (both pure Python and those with dynamic libraries). Third, they’ve created a Python-native developer experience with tools like &lt;code&gt;pywrangler&lt;/code&gt; for easy deployment and type hint generation.&lt;/p&gt;
&lt;p&gt;The technical innovations include sophisticated memory snapshotting that handles entropy challenges and WebAssembly state preservation. These advancements enable Python developers to deploy applications like FastAPI globally in under 2 minutes, with examples ranging from HTML templating with Jinja to WebSocket-based chat rooms using Durable Objects. The improvements also include sharding to reduce cold start frequency and plans for even faster performance and expanded package support.&lt;/p&gt;
&lt;h3 id=&quot;automate-python-package-releases&quot;&gt;&lt;a href=&quot;https://www.loopwerk.io/articles/2025/automate-python-releases/&quot;&gt;Automate Python package releases&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;This article explains how to fully automate Python package releases using GitHub Actions. The author previously handled releases manually but now uses a workflow that automatically runs tests, lints code, builds the package, publishes to PyPI, and creates GitHub releases with changelogs when a new tag is pushed. The process can be simplified further using &lt;code&gt;tbump&lt;/code&gt; to handle version bumps and tagging in one command.&lt;/p&gt;
&lt;h3 id=&quot;deprecations-via-warnings-dont-work-for-python-libraries&quot;&gt;&lt;a href=&quot;https://sethmlarson.dev/deprecations-via-warnings-dont-work-for-python-libraries&quot;&gt;Deprecations via warnings don’t work for Python libraries&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Seth Larson discusses how Python’s &lt;code&gt;DeprecationWarning&lt;/code&gt; system failed for urllib3, a top-3 Python package. Despite emitting warnings for over 3 years about deprecated APIs, major libraries like Kubernetes client, Fastly client, and Airflow were still broken when the APIs were removed. It concludes that &lt;code&gt;DeprecationWarning&lt;/code&gt; doesn’t work for Python libraries because warnings are ignored by default. Possible solutions include creating custom warning categories or adopting SemVer with frequent major version releases instead of relying on warnings for API deprecations.&lt;/p&gt;
&lt;h3 id=&quot;30-things-ive-learned-from-30-years-as-a-python-freelancer&quot;&gt;&lt;a href=&quot;https://lerner.co.il/2025/12/08/30-things-ive-learned-from-30-years-in-business/&quot;&gt;30 things I’ve learned from 30 years as a Python freelancer&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;After 30 years as a Python freelancer, &lt;em&gt;Reuven Lerner&lt;/em&gt; shares 30 lessons: freelancing requires business skills beyond coding, kindness matters more than brilliance, specialization beats generalization, and personal relationships drive success. He emphasizes continuous learning, work-life balance, fair pricing for global access, and the importance of family time. Despite earning less than corporate peers, he values autonomy, minimal meetings, and helping others learn.&lt;/p&gt;
&lt;h3 id=&quot;python-typing-survey-2025-code-quality-and-flexibility-as-top-reasons-for-typing-adoption&quot;&gt;&lt;a href=&quot;https://engineering.fb.com/2025/12/22/developer-tools/python-typing-survey-2025-code-quality-flexibility-typing-adoption/&quot;&gt;Python Typing Survey 2025: Code Quality and Flexibility As Top Reasons for Typing Adoption&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;The 2025 Typed Python Survey, conducted by JetBrains, Meta, and the Python typing community, gathered 1,241 responses (15% increase from 2024). Key findings:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Adoption:&lt;/strong&gt; 86% of respondents “always” or “often” use type hints, with highest adoption (93%) among developers with 5-10 years of Python experience. Most respondents have substantial Python and typing expertise.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Top Benefits:&lt;/strong&gt; Code quality and flexibility are primary reasons for adoption. Developers value optional gradual adoption, improved readability, enhanced IDE tooling, bug prevention, and system expressiveness.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Major Challenges:&lt;/strong&gt; Third-party library support issues, complexity of advanced features (generics, TypeVar), tooling ecosystem fragmentation, lack of runtime enforcement, verbosity, and integration with legacy code.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Tooling:&lt;/strong&gt; Mypy remains dominant (58%), but Rust-based checkers like Pyrefly, ty, and Zuban are gaining traction (20% collectively). VS Code leads as the most popular IDE.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Learning Resources:&lt;/strong&gt; Official documentation is the top resource, followed by blog posts. LLMs are increasingly used for help (400+ users). Reddit has become a key channel for discovering new developments.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Future Needs:&lt;/strong&gt; Better library type coverage, improved documentation, tooling consistency, TypeScript-inspired features, runtime type enforcement, and enhanced generics support.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;writing-a-good-claudemd&quot;&gt;&lt;a href=&quot;https://www.humanlayer.dev/blog/writing-a-good-claude-md&quot;&gt;Writing a good &lt;code&gt;CLAUDE.md&lt;/code&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;The &lt;code&gt;CLAUDE.md&lt;/code&gt; file helps onboard AI coding agents (like Claude Code) to a codebase by providing essential context—what the project does, why it exists, and how to work on it (e.g., tools, tests). However, LLMs ignore irrelevant instructions, so the file should be &lt;em&gt;short&lt;/em&gt; (&amp;lt;300 lines), universally applicable, and avoid overloading with commands or style rules. Use progressive disclosure (separate docs for specific tasks) and rely on linters for formatting. Focus on high-level guidance to maximize relevance and performance.&lt;/p&gt;
&lt;h3 id=&quot;how-uv-got-so-fast&quot;&gt;&lt;a href=&quot;https://nesbitt.io/2025/12/26/how-uv-got-so-fast.html&quot;&gt;How uv got so fast&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;The article explains that &lt;code&gt;uv&lt;/code&gt;’s speed advantage over pip stems primarily from design decisions rather than just being written in Rust.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Key factors:&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Modern standards&lt;/strong&gt; (PEP 518, 517, 621, 658) enabled static metadata, eliminating the need to execute code to discover dependencies — a “chicken-and-egg” problem that forced pip to run untrusted setup scripts.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Dropped legacy features&lt;/strong&gt;: uv eliminates support for .egg files, pip.conf, bytecode compilation, and system Python installation. It enforces stricter specs, ignores overly defensive Python version upper bounds, and uses “first-index-wins” for multiple indexes.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Language-agnostic optimizations&lt;/strong&gt;: Parallel downloads, global caching with hardlinks, HTTP range requests for metadata, Python-free resolution by parsing TOML directly, and the PubGrub resolver algorithm (which applies conflict-driven clause learning from SAT solvers).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Rust-specific benefits&lt;/strong&gt;: Zero-copy deserialization, thread-level parallelism (avoiding Python’s GIL), no interpreter startup costs, and compact version representation.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;Conclusion&lt;/strong&gt;: uv is fast mainly because it starts fresh with modern assumptions and drops 15 years of legacy compatibility constraints, not because of Rust alone.&lt;/p&gt;
&lt;h3 id=&quot;effective-harnesses-for-long-running-agents&quot;&gt;&lt;a href=&quot;https://www.anthropic.com/engineering/effective-harnesses-for-long-running-agents&quot;&gt;Effective harnesses for long-running agents&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Anthropic researchers developed a two-part solution to enable AI agents to work effectively across multiple context windows. The approach uses an “&lt;strong&gt;initializer agent&lt;/strong&gt;” to set up the environment on the first run and a “&lt;strong&gt;coding agent&lt;/strong&gt;” that makes incremental progress in each session while leaving clear artifacts for the next. Key components include feature lists, git commits, progress tracking files, and structured testing. This addresses problems where agents try to do too much at once, declare victory prematurely, or leave environments in buggy states between sessions.&lt;/p&gt;
&lt;h3 id=&quot;why-i-ignore-the-spotlight-as-a-staff-engineer&quot;&gt;&lt;a href=&quot;https://lalitm.com/software-engineering-outside-the-spotlight/&quot;&gt;Why I Ignore The Spotlight as a Staff Engineer&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;em&gt;Lalit Maganti&lt;/em&gt;, a Senior Staff Engineer at Google, advocates for a career specifically focused on “stewardship” rather than chasing the “spotlight.” Contrasting his infrastructure role with product engineers who must pivot frequently for executive visibility, Maganti argues for long-term ownership of stable systems.&lt;/p&gt;
&lt;p&gt;By building internal developer tools like Perfetto, he operates “bottom-up,” solving deep technical problems for other engineers rather than chasing quarterly business metrics. Maganti asserts that treating engineers as fungible assets destroys context. Conversely, staying with a system unlocks “compounding returns,” enabling systemic innovations—such as his creation of Bigtrace—that require deep historical knowledge to identify.&lt;/p&gt;
&lt;p&gt;This long-term reliability grants the political capital to resist hype cycles, such as unnecessary AI integration, thus protecting product integrity. He proposes an alternative path to promotion based on a “Shadow Hierarchy,” where success is measured by how much critical internal teams rely on your tools, rather than executive acclaim. Ultimately, valid high-impact careers in Big Tech can represent a choice for depth, patience, and building lasting foundations over rapid, flashy launches.&lt;/p&gt;
&lt;h3 id=&quot;2025-llm-year-in-review&quot;&gt;&lt;a href=&quot;https://karpathy.bearblog.dev/year-in-review-2025/&quot;&gt;2025 LLM Year in Review&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;In his “2025 LLM Year in Review”, &lt;em&gt;Andrej Karpathy&lt;/em&gt; highlights six paradigm shifts that redefined AI:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;RLVR (Reinforcement Learning from Verifiable Rewards):&lt;/strong&gt; Moving beyond RLHF, models now train against objective rewards (e.g., math/code), fostering spontaneous reasoning strategies and “thinking time” scaling laws, pioneered by OpenAI’s o1/o3.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Ghosts vs. Animals:&lt;/strong&gt; Karpathy describes LLM intelligence as “summoning ghosts”—jagged, non-human entities that excel in verifiable domains but remain vulnerable to simple failures. This has led to a loss of trust in traditional, easily “gamed” benchmarks.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;The LLM App Layer:&lt;/strong&gt; Cursor exemplifies a new “thick” application layer that orchestrates complex LLM workflows, context engineering, and custom GUIs for specific verticals.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Local Agents:&lt;/strong&gt; Claude Code demonstrated the power of agents living directly on a user’s computer, prioritizing local context and low-latency interaction over cloud-only deployments.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Vibe Coding:&lt;/strong&gt; AI has enabled “vibe coding,” where natural language allows anyone to create software. This makes code disposable, ephemeral, and accessible to non-professionals.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;LLM GUIs:&lt;/strong&gt; Models like “Gemini Nano Banana” suggest a shift from text-heavy chat to visual/spatial interfaces (infographics, apps), aligning AI output with human visual preferences.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Karpathy concludes that while LLMs are both smarter and dumber than expected, the field remains wide open with vast untapped potential.&lt;/p&gt;
&lt;h3 id=&quot;software-engineering-in-2026&quot;&gt;&lt;a href=&quot;https://benjamincongdon.me/blog/2025/12/29/Software-Engineering-in-2026/&quot;&gt;Software Engineering in 2026&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Progress in AI-powered coding tools, especially using large language models (LLMs), has significantly reduced the time and cost of producing quality code. However, the real bottlenecks in software engineering are shifting from coding to system design, evolution, and operations, which are less affected by AI.&lt;/p&gt;
&lt;p&gt;Key trends for 2026:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Infrastructure must be abstracted and self-service, easy for both humans and LLMs, minimizing the need for dedicated infrastructure engineers.&lt;/li&gt;
&lt;li&gt;Continuous Integration (CI) tooling grows in importance as AI agents generate more code, pushing for deeper automated testing and verification.&lt;/li&gt;
&lt;li&gt;Human-guided abstractions and “system taste” remain crucial; without them, LLM-generated code risks increasing technical debt.&lt;/li&gt;
&lt;li&gt;Human code reviews are a new bottleneck, focusing mainly on sensitive or performance-critical changes. Junior engineers need to develop review intuition earlier.&lt;/li&gt;
&lt;li&gt;Project timeline estimates will vary more, as some tasks are aided by LLMs while complex, context-heavy work is less suitable for automation.&lt;/li&gt;
&lt;li&gt;The cost reduction in coding may tip some SaaS “build vs buy” decisions towards building for larger tech firms, but infrastructure/compliance needs will likely remain outsourced.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;podcasts&quot;&gt;Podcasts&lt;/h2&gt;
&lt;h3 id=&quot;-corepy&quot;&gt;🥝 core.py&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://open.spotify.com/episode/5GYyoIawHa7FlvcCAuoLg1&quot;&gt;Calling Things, Part 1&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;-realpython-podcast&quot;&gt;🐍 RealPython Podcast&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://realpython.com/podcasts/rpp/276/&quot;&gt;Episode 276: Exploring Quantum Computing &amp;amp; Python Frameworks&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://realpython.com/podcasts/rpp/277/&quot;&gt;Episode 277: Moving Towards Spec-Driven Development&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;-python-bytes-podcast&quot;&gt;🥧 Python Bytes Podcast&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://pythonbytes.fm/episodes/show/460/overlooked-python-typing&quot;&gt;#460 Overlooked Python Typing&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://pythonbytes.fm/episodes/show/461/this-episdoe-has-a-typo&quot;&gt;#461 This episdoe has a typo&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://pythonbytes.fm/episodes/show/462/linkedin-cringe&quot;&gt;#462 LinkedIn Cringe&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://pythonbytes.fm/episodes/show/463/2025-is-wrapped&quot;&gt;#463 2025 is @wrapped&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;-talk-python-to-me&quot;&gt;🦜 Talk Python to me&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://talkpython.fm/episodes/show/529/computer-science-from-scratch&quot;&gt;#529: Computer Science from Scratch&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://talkpython.fm/episodes/show/530/anywidget-jupyter-widgets-made-easy&quot;&gt;#530: anywidget: Jupyter Widgets made easy&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://talkpython.fm/episodes/show/531/talk-python-in-production&quot;&gt;#531: Talk Python in Production&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://talkpython.fm/episodes/show/532/2025-python-year-in-review&quot;&gt;#532: 2025 Python Year in Review&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;-pybites-podcast&quot;&gt;🍕 Pybites Podcast&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.pybitespodcast.com/1501156/episodes/18262926-207-spicy-brains-real-code-simen-daehlin-talks-coding-with-neurodiversity&quot;&gt;#207: Spicy brains &amp;amp; real code - Simen Daehlin talks coding with neurodiversity&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.pybitespodcast.com/1501156/episodes/18277982-208-emma-saroyan-shares-her-practical-guide-to-generative-ai-for-web-developers&quot;&gt;#208: Emma Saroyan shares her practical guide to generative AI for web developers&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.pybitespodcast.com/1501156/episodes/18323412-209-transforming-the-hiring-process-with-jobhive&quot;&gt;#209: Transforming the hiring process with JobHive&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;-vs-code-insiders-podcast&quot;&gt;🚀 VS Code Insiders Podcast&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.vscodepodcast.com/16&quot;&gt;Episode 16: Models, Evals, and Raptor Mini with Julia Kasper&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.vscodepodcast.com/17&quot;&gt;Episode 17: VS Code - 2025 Wrapped with Burke Holland and Pierce Boggan&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;repositories&quot;&gt;Repositories&lt;/h2&gt;
&lt;h3 id=&quot;agentskills&quot;&gt;&lt;a href=&quot;https://github.com/agentskills/agentskills&quot;&gt;agentskills&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;This repo contains the specification, documentation, and reference SDK for Agent Skills, which recently goes open.&lt;/p&gt;
&lt;h3 id=&quot;mistralaimistral-vibe-apache-20&quot;&gt;&lt;a href=&quot;https://github.com/mistralai/mistral-vibe&quot;&gt;mistralai/mistral-vibe&lt;/a&gt; (Apache-2.0)&lt;/h3&gt;
&lt;p&gt;Mistral Vibe CLI is an open-source command-line coding assistant powered by Devstral, Mistral’s “next-generation coding model”. It explores, modifies, and executes changes across your codebase using natural language—in your terminal or integrated into your preferred IDE via the Agent Communication Protocol.&lt;/p&gt;
&lt;h3 id=&quot;raineworkmux-mit&quot;&gt;&lt;a href=&quot;https://github.com/raine/workmux&quot;&gt;raine/workmux&lt;/a&gt; (MIT)&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;workmux&lt;/strong&gt; is a command-line tool designed to streamline parallel development workflows by integrating &lt;strong&gt;Git worktrees&lt;/strong&gt; directly with &lt;strong&gt;tmux&lt;/strong&gt; windows.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Zero-Friction Parallel Dev:&lt;/strong&gt; It allows you to spin up isolated development environments instantly. One command creates a new git worktree (a separate checkout of your project) and a dedicated tmux window for it.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Automated Setup:&lt;/strong&gt; Through a configuration file (&lt;code&gt;.workmux.yaml&lt;/code&gt;), you can define exactly how that tmux window should look (e.g., split panes with an editor open in one and a shell in the other) and what commands to run immediately (like installing dependencies).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Environment Management:&lt;/strong&gt; It handles the tedious parts of creating new environments, such as copying or symlinking &lt;code&gt;.env&lt;/code&gt; files or &lt;code&gt;node_modules&lt;/code&gt; to the new worktree so you don’t have to set them up manually.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Cleanup:&lt;/strong&gt; When you are finished with a task, a single &lt;code&gt;merge&lt;/code&gt; command merges your branch, deletes the worktree, and closes the tmux window, keeping your workspace clean.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;AI Agent Focus:&lt;/strong&gt; The documentation highlights that this workflow is particularly perfect for running multiple AI agents in parallel without them conflicting with each other.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id=&quot;have-time-for-some-fun&quot;&gt;Have time for some fun?&lt;/h2&gt;
&lt;h3 id=&quot;the-game-awards-2025&quot;&gt;The Game Awards 2025&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://www.gematsu.com/wp-content/uploads/2025/11/TGA-2025_11-17-25-1440x810.jpg&quot; alt=&quot;the-game-awards-2025&quot;&gt;&lt;/p&gt;
&lt;p&gt;The Game Awards (TGA) 2025 was held on December 11th, 2025 at Peacock Theater in Los Angeles, California. &lt;strong&gt;Clair Obscur: Expedition 33&lt;/strong&gt;, with a record-breaking 12 nominations, took home the award for &lt;em&gt;Game of the Year&lt;/em&gt; (GOTY) along with 8 other awards. Check out the &lt;a href=&quot;https://thegameawards.com/&quot;&gt;official website&lt;/a&gt; for everything you want to know.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;As we wrap up this journey together, I want to take a moment to express my gratitude for your reading. If you’ve enjoyed what you just read and would like to help sustain this blog, consider &lt;a href=&quot;https://github.com/blueberry-py/blog/stargazers&quot;&gt;starring this blog on github&lt;/a&gt;, it would be great motivation for me to keep updating the blogs!&lt;/p&gt;
&lt;p&gt;Alright, that concludes the December and this year’s last edition of “This Month for Pythonistas”. Thank you again for reading my posts for this whole year! I hope you enjoy them or find something useful. Happy coding, Merry Christmas 🎄, and see you in 2026! 👋&lt;/p&gt;
</description><pubDate>Wed, 31 Dec 2025 08:00:00 GMT</pubDate><category>python</category><category>python</category><category>news</category><category>podcast</category><category>ai</category><author>Zeyang Lin</author></item><item><title>This Month for Pythonistas - November 2025</title><link>https://blueberry-py.github.io/blog/post/this-month-for-pythonistas-2025-11/</link><guid isPermaLink="true">https://blueberry-py.github.io/blog/post/this-month-for-pythonistas-2025-11/</guid><description>&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;python&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;from&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; datetime &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;import&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; date&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;print&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(date.today().year, date.today().month)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# 2025 11&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img alt=&quot;issue-2025-11&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1280&quot; height=&quot;720&quot; src=&quot;/blog/_astro/splash.C7Un_SmT_2oteXH.webp&quot;&gt;&lt;/p&gt;
&lt;p&gt;Welcome back Pythonistas! I’m glad to see you back reading the ninth issue of my “This month for Pythonistas” series which curates the news, articles, tutorials, podcasts, and more Python stuff worth noting in this month.&lt;/p&gt;
&lt;p&gt;Before we continue, please note that this blog is synced across the following platforms:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://blueberry-py.github.io/blog/post/this-month-for-pythonistas-2025-11/&quot;&gt;Github Pages&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://blueberrypy.netlify.app/post/this-month-for-pythonistas-2025-11/&quot;&gt;Netlify&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://blueberrypy.onrender.com/post/this-month-for-pythonistas-2025-11/&quot;&gt;Render&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://blueberrypy-blog.vercel.app/post/this-month-for-pythonistas-2025-11/&quot;&gt;Vercel&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Ready? Let’s get started!&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&quot;events--social&quot;&gt;Events &amp;amp; Social&lt;/h2&gt;
&lt;h3 id=&quot;pycon-us-2026-cfp-is-open&quot;&gt;PyCon US 2026 CFP is Open&lt;/h3&gt;
&lt;p&gt;&lt;img alt=&quot;PyCon-US-2026&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1080&quot; height=&quot;1080&quot; src=&quot;/blog/_astro/pyconus2026.yKrFO_F9_41kVA.webp&quot;&gt;&lt;/p&gt;
&lt;p&gt;The 2026 PyCon US &lt;a href=&quot;https://us.pycon.org/2026/speaking/guidelines/&quot;&gt;call for proposals&lt;/a&gt; (CFP) for Talks, Charlas, Tutorials and Posters is open until &lt;strong&gt;December 19th, 2025&lt;/strong&gt;. Don’t miss out on the largest Python conference in the world!&lt;/p&gt;
&lt;h3 id=&quot;pycon-ireland-2025&quot;&gt;PyCon Ireland 2025&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://s3.python.ie/images/Dublin_Skyline_2025-screen-size.width-800.png&quot; alt=&quot;PyCon-Ireland-2025&quot;&gt;&lt;/p&gt;
&lt;p&gt;PyCon Ireland this year took place November 15-16 in UCD O’Reilly Hall, Dublin, featuring two talk tracks and two workshop tracks on both days.&lt;/p&gt;
&lt;h3 id=&quot;20th-anniversary-of-first-ever-django-release&quot;&gt;20th anniversary of first ever Django release&lt;/h3&gt;
&lt;p&gt;For the past twenty years, Django has shipped over 440 releases, making it among the most popular and successful Python web frameworks. You can read more about it &lt;a href=&quot;https://www.djangoproject.com/weblog/2025/nov/19/twenty-years-of-django-releases/&quot;&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&quot;new-versions&quot;&gt;New Versions&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Python 3.15.0 alpha 2&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This is the second developer preview of the upcoming Python 3.15 release. It is available for download &lt;a href=&quot;https://www.python.org/downloads/release/python-3150a2/&quot;&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Django 6.0 RC 1&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Django 6.0 release candidate 1 is &lt;a href=&quot;https://www.djangoproject.com/download/6.0rc1/tarball/&quot;&gt;now available&lt;/a&gt;. The provisional release notes can be found &lt;a href=&quot;https://docs.djangoproject.com/en/dev/releases/6.0/&quot;&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Provided no major bugs are discovered that can’t be solved in the next two weeks, Django 6.0 will be released on or around &lt;em&gt;December 3&lt;/em&gt;.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;pytest 9.0&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;pytest 9.0 brings significant improvements including native TOML configuration support, a new strict mode for better testing practices, and the long-awaited subtests feature.&lt;/p&gt;
&lt;h2 id=&quot;tutorials&quot;&gt;Tutorials&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;DeepLearning.ai’s &lt;a href=&quot;https://www.deeplearning.ai/short-courses/jupyter-ai-coding-in-notebooks/&quot;&gt;Jupyter AI: AI Coding in Notebooks&lt;/a&gt; by Andrew Ng and Brian Granger&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;In this course, you’ll build a book research assistant using the Open Library API, and create a stock market data analysis workflow, all with the help of Jupyter AI. You’ll learn how to provide API documentation as context so the LLM generates accurate syntax for code that wasn’t part of its pretraining.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ul&gt;
&lt;li&gt;DeepLearning.ai’s &lt;a href=&quot;https://www.deeplearning.ai/short-courses/semantic-caching-for-ai-agents/&quot;&gt;Semantic Caching for AI Agents&lt;/a&gt; from Redis&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;In this course, you’ll build a semantic cache that makes your AI agents faster and more cost-effective by recognizing when different questions mean the same thing. For example, when someone asks “How do I get a refund?” and another asks “I want my money back”， your cache will reuse the answer instead of making another API call, reducing the need for redundant model calls.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ul&gt;
&lt;li&gt;DeepLearning.ai’s &lt;a href=&quot;https://www.deeplearning.ai/courses/design-develop-and-deploy-multi-agent-systems-with-crewai/&quot;&gt;Design, Develop, and Deploy Multi-Agent Systems with CrewAI&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;em&gt;Disclaimer: This course contains a small portion of content which requires a paid PRO subscription to access.&lt;/em&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Learn how to build multi-agent systems that automate complex, end-to-end workflows. You’ll create intelligent agent teams that plan, reason, and collaborate using tools, memory, and guardrails, and learn how to scale them for production.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ul&gt;
&lt;li&gt;RealPython’s &lt;a href=&quot;https://realpython.com/python-markitdown/&quot;&gt;Python MarkItDown: Convert Documents Into LLM-Ready Markdown&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;The MarkItDown library lets you quickly turn PDFs, Office files, images, HTML, audio, and URLs into LLM-ready Markdown. In this tutorial, you’ll compare MarkItDown with Pandoc, run it from the command line, use it in Python code, and integrate conversions into AI-powered workflows.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://cookbook.openai.com/examples/build_a_coding_agent_with_gpt-5.1&quot;&gt;Build a coding agent with GPT 5.1&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;In this guide, we’ll use the Agents SDK to build a coding agent that can scaffold a brand-new app from a prompt and refine it through user feedback.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;articles&quot;&gt;Articles&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://blog.jetbrains.com/pycharm/2025/10/why-performance-matters-in-python-development/&quot;&gt;Why Performance Matters in Python Development&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;em&gt;Disclaimer: This article contains promotional content regarding JetBrains products.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;The blog from JetBrains emphasizes Python performance optimization as a strategic business imperative, not just technical concern. Despite Python’s interpreted nature and GIL limitations, most bottlenecks stem from code-level inefficiencies. Performance impacts user experience, scalability, infrastructure costs, and development velocity. Key optimization areas include algorithmic improvements, proper data structures, I/O batching, and appropriate parallelism (threading for I/O-bound, multiprocessing for CPU-bound tasks). The article dispels myths about Python being universally slow, emphasizing profiling-driven optimization over intuition.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://mergify.com/blog/await-is-not-a-context-switch-understanding-python-s-coroutines-vs-tasks&quot;&gt;&lt;code&gt;await&lt;/code&gt; is Not a Context Switch: Understanding Python’s Coroutines vs Tasks&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This blog post clarifies a critical distinction in Python’s &lt;code&gt;asyncio&lt;/code&gt;: unlike JavaScript or C#, awaiting a coroutine does not automatically yield control to the event loop. In Python, &lt;code&gt;await&lt;/code&gt; synchronously executes a coroutine until a suspension occurs; true concurrency and interleaving mainly happen with explicitly created Tasks (&lt;code&gt;asyncio.create_task&lt;/code&gt;). This means critical sections without internal &lt;code&gt;await&lt;/code&gt; statements are atomic relative to the event loop. Understanding this prevents unnecessary locking, as race conditions only occur at specific suspension points, not at every &lt;code&gt;async&lt;/code&gt; function call.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.pythonmorsels.com/__slots__/&quot;&gt;&lt;code&gt;__slots__&lt;/code&gt; for optimizing classes&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Python classes store instance attributes in a &lt;code&gt;__dict__&lt;/code&gt; dictionary by default, allowing dynamic addition but consuming memory. Defining &lt;code&gt;__slots__ = (&apos;attr1&apos;, &apos;attr2&apos;, ...)&lt;/code&gt; replaces &lt;code&gt;__dict__&lt;/code&gt; with a fixed, efficient array-like structure. Benefits: restricts attributes (no extras allowed), reduces memory usage (e.g., from 271KB to 176KB for 1M Point objects), and speeds up attribute lookups. Ideal for classes with many instances or frequent access.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://codecut.ai/regex-pregex-pyparsing-text-pattern-matching-guide/&quot;&gt;Choose the Right Text Pattern Tool: Regex, Pregex, or Pyparsing&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This article compares three Python text pattern matching tools: regex (regular expressions), pregex (human-readable regex alternative), and pyparsing (grammar-based parsing). It teaches when to use each tool for extracting emails, phone numbers, and parsing structured data. The guide helps developers choose the right approach for different text processing scenarios in Python.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.paulox.net//2025/11/14/how-to-use-uuidv7-in-python-django-and-postgresql/&quot;&gt;How to use UUIDv7 in Python, Django and PostgreSQL&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This guide explains using UUIDv7 – time-ordered IDs for better index locality than UUIDv4 – in Python 3.14 (&lt;code&gt;uuid.uuid7()&lt;/code&gt;), Django 5.2 models, and PostgreSQL 18 (native &lt;code&gt;uuidv7()&lt;/code&gt; generation and &lt;code&gt;uuid_extract_timestamp()&lt;/code&gt; via GeneratedFields). Covers setup, migrations, client-side (SQLite) vs. DB-side generation, testing, and considerations for other databases like MySQL/Oracle. Recommends masking (UUIDv47) for public APIs to hide timestamps.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://jacobtomlinson.dev/posts/2025/python-package-managers-uv-vs-pixi/&quot;&gt;Python package managers: uv vs pixi?&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This post compares Python package managers uv (fast Rust pip reimplementation for PyPI) and pixi (next-gen conda for PyPI + conda-forge). uv suits scripts, apps, libraries; pixi excels in AI/CUDA/science with compiled deps. Historical evolution: pip → conda binaries → mamba speed → declarative locking. Author’s recommendations: uv for most, pixi for GPU/research, conda+uv for interdependent libs.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://openai.com/index/gpt-5-1-for-developers/&quot;&gt;Introducing GPT-5.1 for developers&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;OpenAI has released GPT-5.1 for the API platform, a model designed to balance intelligence and speed for agentic and coding tasks. It features adaptive reasoning, where the model dynamically adjusts thinking time based on task complexity—processing simple requests significantly faster while remaining persistent on difficult problems.&lt;/p&gt;
&lt;p&gt;Key updates include:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;No Reasoning Mode: A setting for ultra-low latency tasks like tool calling and search, behaving like a standard non-reasoning model but with GPT-5.1’s intelligence base.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Extended Prompt Caching: Supports up to 24-hour cache retention to lower costs and latency for long-context workflows.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;New Developer Tools: Introduces &lt;code&gt;apply_patch&lt;/code&gt; for reliable, structure-aware code editing and a &lt;code&gt;shell&lt;/code&gt; tool for executing local commands.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;GPT-5.1 utilizes a more steerable coding personality and outperforms GPT-5 on benchmarks like SWE-bench Verified (76.3%). It is available immediately to developers on paid tiers, with pricing matching GPT-5. Specialized &lt;code&gt;codex&lt;/code&gt; versions were also released for agentic coding workflows.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://blog.google/products/gemini/gemini-3/&quot;&gt;A new era of intelligence with Gemini 3&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&quot;https://storage.googleapis.com/gweb-uniblog-publish-prod/images/gemini_3_webdev_arena_leaderboar.width-1000.format-webp.webp&quot; alt=&quot;gemini-3-pro-tops-webdev-arena&quot;&gt;&lt;/p&gt;
&lt;p&gt;Google has introduced Gemini 3, its most intelligent and capable AI model to date. Gemini 3 Pro delivers state-of-the-art performance in multimodal reasoning, coding, and long-horizon planning, outperforming previous models on major benchmarks like Humanity’s Last Exam.&lt;/p&gt;
&lt;p&gt;Key features include:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Enhanced Reasoning: The model offers deeper nuance and reduced sycophancy. A new Deep Think mode, coming soon to Ultra subscribers, pushes reasoning capabilities even further for complex problem-solving.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Developer Tools: Google launched &lt;strong&gt;Antigravity&lt;/strong&gt;, a new agentic development platform where AI agents can autonomously plan, code, and validate software.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Practical Applications: Gemini 3 helps users learn by synthesizing diverse inputs (like video and text), build complex apps via “vibe coding,” and handle multi-step planning tasks for daily life.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Gemini 3 is available immediately across Google products, including the Gemini app, AI Studio, Vertex AI, and within Google Search’s AI Mode. The release emphasizes robust safety testing and improved resistance to misuse.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://cloud.google.com/blog/topics/developers-practitioners/where-to-use-sub-agents-versus-agents-as-tools&quot;&gt;ADK architecture: When to use sub-agents versus agents as tools&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This blog post compares &lt;em&gt;sub-agents&lt;/em&gt; vs. &lt;em&gt;agents as tools&lt;/em&gt; in multi-agent AI systems. Agents as tools are stateless, reusable for discrete tasks (e.g., NL2SQL, DB execution) with isolated context. Sub-agents are stateful, collaborative for complex workflows (e.g., data visualization, travel planning) sharing parent context. Decision matrix: Use tools for low-complexity/reusable tasks; sub-agents for high-complexity/stateful processes. Real-world cases include data analysis and trip planning.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://martinfowler.com/articles/llm-learning-loop.html&quot;&gt;The Learning Loop and LLMs&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The article argues that software development is fundamentally a learning process, not an assembly line. While LLMs excel at removing friction and generating code, they cannot replace the essential learning loop of observe-experiment-apply. True expertise comes from hands-on experience and understanding, not just AI-generated solutions. LLMs are best used as brainstorming partners, not autonomous builders, to avoid the “maintenance cliff” where systems become unmaintainable due to lack of deep understanding.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://octomind.dev/blog/why-agents-do-not-write-most-of-our-code-a-reality-check&quot;&gt;why agents DO NOT write most of our code - a reality check&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The article provides a reality check on AI coding agents. Despite building AI agents themselves, Octomind finds that most of their code is still written by humans. Through practical experiments, the author reveals that AI agents struggle with maintaining codebase mental models, produce overly verbose code (1000+ line PRs), lack self-reflection about their limitations, and often miss critical issues like transaction handling. While AI is valuable for brainstorming, debugging, and small tasks, the dream of agents writing most production code remains far from reality.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://stefaniemolin.com/articles/open-source/becoming-a-core-developer/&quot;&gt;Becoming a Core Developer&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Stefanie Molin became a numpydoc core developer by creating a pre-commit hook for docstring validation. Starting from fixing docstrings at a Scikit-Learn sprint, she developed &lt;code&gt;AstValidator&lt;/code&gt; using Python’s &lt;code&gt;ast&lt;/code&gt; module for static analysis, avoiding code execution. This led to numpydoc-validation (v1.6.0+), with CLI linting and config via &lt;code&gt;pyproject.toml&lt;/code&gt;. After PR merge and improvements, she joined as core dev in April 2024.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://newsletter.pragmaticengineer.com/p/what-caused-the-large-aws-outage&quot;&gt;What caused the large AWS outage?&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;A major AWS outage on October 20, 2025 was caused by a DynamoDB DNS failure in us-east-1. The 14-hour incident started when race conditions between DNS enactors emptied DynamoDB’s DNS records, making the database appear offline. This cascaded to EC2’s droplet management system, causing capacity shortages and network connectivity issues that took 12+ hours to fully resolve.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://blog.cloudflare.com/18-november-2025-outage/&quot;&gt;Cloudflare outage on November 18, 2025&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;On November 18, 2025, Cloudflare experienced a significant outage starting at 11:20 UTC that disrupted traffic across its network, causing widespread HTTP 5xx errors for customer websites and impacting services like Workers KV, Access, and the Dashboard.&lt;/p&gt;
&lt;p&gt;The outage was not caused by a cyberattack but by an internal configuration error. A change to database permissions caused a query to generate duplicate entries in a “feature file” used by Cloudflare’s Bot Management system. This doubling in file size exceeded a hardcoded memory limit within the core proxy software, causing the system to crash (panic) globally.&lt;/p&gt;
&lt;p&gt;Cloudflare engineers initially suspected a DDoS attack but soon identified the corrupt file. They resolved the issue by halting the bad file’s propagation and manually reverting to a known good version. Core traffic began flowing normally by 14:30 UTC, and all systems were fully restored by 17:06 UTC. Cloudflare has apologized and is implementing new safeguards, such as stricter file validation and global kill switches, to prevent future occurrences.&lt;/p&gt;
&lt;h2 id=&quot;podcasts&quot;&gt;Podcasts&lt;/h2&gt;
&lt;h3 id=&quot;-realpython-podcast&quot;&gt;🐍 RealPython Podcast&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://realpython.com/podcasts/rpp/273/&quot;&gt;Episode 273: Advice for Writing Maintainable Python Code&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://realpython.com/podcasts/rpp/274/&quot;&gt;Episode 274: Preparing Data Science Projects for Production&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://realpython.com/podcasts/rpp/275/&quot;&gt;Episode 275: Building a FastAPI Application &amp;amp; Exploring Python Concurrency&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;-python-bytes-podcast&quot;&gt;🥧 Python Bytes Podcast&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://pythonbytes.fm/episodes/show/456/youre-so-wrong&quot;&gt;#456 You’re so wrong&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://pythonbytes.fm/episodes/show/457/tapping-into-http&quot;&gt;#457 Tapping into HTTP&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://pythonbytes.fm/episodes/show/458/i-will-install-linux-on-your-computer&quot;&gt;#458 I will install Linux on your computer&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://pythonbytes.fm/episodes/show/459/inverted-dependency-trees&quot;&gt;#459 Inverted dependency trees&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;-talk-python-to-me&quot;&gt;🦜 Talk Python to me&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://talkpython.fm/episodes/show/526/building-data-science-with-foundation-llm-models&quot;&gt;#526: Building Data Science with Foundation LLM Models&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://talkpython.fm/episodes/show/527/mcp-servers-for-python-devs&quot;&gt;#527: MCP Servers for Python Devs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://talkpython.fm/episodes/show/528/python-apps-with-llm-building-blocks&quot;&gt;#528: Python apps with LLM building blocks&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;-pybites-podcast&quot;&gt;🍕 Pybites Podcast&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.pybitespodcast.com/1501156/episodes/17969765-204-the-science-of-open-science-with-leah-wasser-founder-of-pyopensci&quot;&gt;#204: The science of open science - with Leah Wasser, founder of pyOpenSci&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.pybitespodcast.com/1501156/episodes/18047967-205-building-reactive-python-notebooks-with-marimo&quot;&gt;#205: Building reactive Python notebooks with Marimo&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.pybitespodcast.com/1501156/episodes/18217165-the-power-of-one-clear-goal-kishan-patel-on-building-a-developer-mindset&quot;&gt;#206: The Power of One Clear Goal: Kishan Patel on building a Developer Mindset&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;-vs-code-insiders-podcast&quot;&gt;🚀 VS Code Insiders Podcast&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.vscodepodcast.com/12&quot;&gt;Episode 12: Behind the Scenes of VS Code’s Planning Agent with Bhavya U&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.vscodepodcast.com/13&quot;&gt;Episode 13: Beyond the Keynote: VS Code at GitHub Universe 2025&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.vscodepodcast.com/14&quot;&gt;Episode 14: Designing for Everyone: Accessibility in VS Code with Megan Rogge&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.vscodepodcast.com/15&quot;&gt;Episode 15: Taming AI Assisted Coding Models with Eleanor Berger&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;repositories&quot;&gt;Repositories&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/hyperflask/hyperflask&quot;&gt;hyperflask&lt;/a&gt; (MIT)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;hyperflask is a Flask-based (very) opiniated full-stack web framework where all the tech choices have been made. It combines multiple Flask extensions and frontend libraries into a seamless experience.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/langchain-ai/deepagents&quot;&gt;langchain-ai/deepagents&lt;/a&gt; (MIT)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Primarily inspired by Claude Code, deepagents is an agent harness built on langchain and langgraph, which is equipped with a planning tool, a filesystem backend, and the ability to spawn subagents - making them well-equipped to handle complex agentic tasks.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/MoonshotAI/kimi-cli&quot;&gt;MoonshotAI/kimi-cli&lt;/a&gt; (Apache 2.0)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Kimi CLI is yet another command-line agent but built within Python ecosystem unlike other Claude Code-alike tools. Apart from agentic coding, it can also be switched to “shell mode” where you can run (some of) shell commands.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/MemMachine/MemMachine&quot;&gt;MemMachine&lt;/a&gt; (Apache 2.0)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;MemMachine is a open-source, “universal” memory layer for AI agents which persists across multiple sessions, agents, and large language models. It provides Python SDK, RESTful API as well as MCP for easy integration with agents.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/OpenRouterTeam/python-sdk&quot;&gt;OpenRouterTeam/python-sdk&lt;/a&gt; (Apache 2.0)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This is OpenRouter’s official Python SDK, a type-safe toolkit for building AI applications with access to 300+ language models through a unified API. You can find the docs &lt;a href=&quot;https://openrouter.ai/docs/sdks/python&quot;&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&quot;have-time-for-some-fun&quot;&gt;Have time for some fun?&lt;/h2&gt;
&lt;h3 id=&quot;golden-joystick-awards-2025&quot;&gt;Golden Joystick Awards 2025&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://cdn.mos.cms.futurecdn.net/pqnA52wxB3ZWa6sVPJvyJZ-1200-80.jpg.webp&quot; alt=&quot;golder-joystick-ultimate-game-of-the-year&quot;&gt;&lt;/p&gt;
&lt;p&gt;The Golden Joystick Awards revealed its winners for 2025 on November 20th! Congratulations to the winners, especially &lt;strong&gt;Clair Obscure Expedition 33&lt;/strong&gt; which was crowned the Ultimate Game of the Year (UGOTY) along with other six thophies, for their outstanding contributions to the video game industry!&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;As we wrap up this journey together, I want to take a moment to express my gratitude for your reading. If you’ve enjoyed what you just read and would like to help sustain this blog, consider &lt;a href=&quot;https://github.com/blueberry-py/blog/stargazers&quot;&gt;starring this blog on github&lt;/a&gt;, it would be great motivation for me to keep updating the blogs!&lt;/p&gt;
&lt;p&gt;Alright, that concludes the November Edition of “This Month of Pythonistas”. Thank you again for reading my post. I hope you enjoy it or find something useful. Happy coding and see you in December!&lt;/p&gt;
</description><pubDate>Sun, 30 Nov 2025 13:00:00 GMT</pubDate><category>python</category><category>python</category><category>cli</category><category>linux</category><category>podcast</category><category>news</category><category>agentic</category><category>llm</category><category>ai</category><author>Zeyang Lin</author></item><item><title>[one-liner] Install Kiro Cli</title><link>https://blueberry-py.github.io/blog/post/one-liner-kiro-cli/</link><guid isPermaLink="true">https://blueberry-py.github.io/blog/post/one-liner-kiro-cli/</guid><description>&lt;h2 id=&quot;one-liner-series-kiro-cli&quot;&gt;One-Liner series: Kiro Cli&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://kiro.dev/docs/cli/installation/&quot;&gt;source: kiro.dev docs&lt;/a&gt;&lt;/p&gt;
&lt;h3 id=&quot;install-on-linuxmacos&quot;&gt;Install on Linux/macOS&lt;/h3&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;curl&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; -fsSL&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; https://cli.kiro.dev/install&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; |&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; bash&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;important-note-on-amazon-q-cli&quot;&gt;Important note on Amazon Q CLI&lt;/h3&gt;
&lt;p&gt;If Amazon Q CLI was already installed, running the script above would result in:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;text&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;Kiro CLI installer:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;Detected existing Amazon Q CLI installation&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;Kiro CLI is the new version of Amazon Q CLI. Updating to latest version.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;⚠️ Q CLI at /usr/bin/q does not support auto-update. Please uninstall it and rerun this script to install Kiro CLI.&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;To uninstall Q CLI, run:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;sudo&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; apt&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; remove&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; amazon-q&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;If succeeded, run the kiro-cli script again:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;curl&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; -fsSL&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; https://cli.kiro.dev/install&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; |&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; bash&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;It should install Kiro CLI:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;text&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;Kiro CLI installer:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;Downloading package...&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;✓ Downloaded and extracted&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;✓ Package installed successfully&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;🎉 Installation complete! Happy coding!&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;Next steps:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;Use the command &quot;kiro-cli&quot; to get started!&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This script would install Kiro Cli into current user’s .local/ directory:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;which&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; kiro-cli&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;text&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;/home/******/.local/bin/kiro-cli&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;update&quot;&gt;Update&lt;/h3&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;kiro-cli&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; update&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
</description><pubDate>Tue, 18 Nov 2025 08:20:00 GMT</pubDate><category>cli</category><category>linux</category><category>aws</category><category>amazon</category><category>kiro</category><category>cli</category><category>linux</category><category>ubuntu</category><category>macos</category><author>Zeyang Lin</author></item><item><title>[one-liner] Install Claude Code (Native Build)</title><link>https://blueberry-py.github.io/blog/post/one-liner-claude-code/</link><guid isPermaLink="true">https://blueberry-py.github.io/blog/post/one-liner-claude-code/</guid><description>&lt;h2 id=&quot;one-liner-series-claude-code-native-build&quot;&gt;One-Liner series: Claude Code (Native Build)&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://code.claude.com/docs/en/quickstart&quot;&gt;source: Claude Docs&lt;/a&gt;&lt;/p&gt;
&lt;h3 id=&quot;install-on-linuxmacoswsl&quot;&gt;Install on Linux/macOS/WSL&lt;/h3&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;curl&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; -fsSL&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; https://claude.ai/install.sh&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; |&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; bash&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;install-on-windows-powershell&quot;&gt;Install on Windows (PowerShell)&lt;/h3&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;powershell&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;irm https:&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;claude.ai&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;/&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;install.ps1 &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;|&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; iex&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;update&quot;&gt;Update&lt;/h3&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;claude&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; update&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
</description><pubDate>Sun, 02 Nov 2025 08:09:00 GMT</pubDate><category>cli</category><category>linux</category><category>claude</category><category>anthropic</category><category>windows</category><category>linux</category><category>ubuntu</category><category>macos</category><author>Zeyang Lin</author></item><item><title>This Month for Pythonistas - October 2025</title><link>https://blueberry-py.github.io/blog/post/this-month-for-pythonistas-2025-10/</link><guid isPermaLink="true">https://blueberry-py.github.io/blog/post/this-month-for-pythonistas-2025-10/</guid><description>&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;python&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;from&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; datetime &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;import&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; date&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;print&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(date.today().year, date.today().month)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# 2025 10&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img alt=&quot;issue-2025-10&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1280&quot; height=&quot;720&quot; src=&quot;/blog/_astro/splash.J0iciDAs_ZilchS.webp&quot;&gt;&lt;/p&gt;
&lt;p&gt;Welcome back Pythonistas! In this big month for Python community, I’m glad to see you back reading the eighth issue of my “This month for Pythonistas” series which curates the news, articles, tutorials, podcasts, and more Python stuff worth noting in this month.&lt;/p&gt;
&lt;p&gt;Before we continue, please note that this blog is synced across the following platforms:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://blueberry-py.github.io/blog/post/this-month-for-pythonistas-2025-10/&quot;&gt;Github Pages&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://blueberrypy.netlify.app/post/this-month-for-pythonistas-2025-10/&quot;&gt;Netlify&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://blueberrypy.onrender.com/post/this-month-for-pythonistas-2025-10/&quot;&gt;Render&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Ready? Let’s get started!&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&quot;events--social&quot;&gt;Events &amp;amp; Social&lt;/h2&gt;
&lt;h3 id=&quot;openai-devday-2025&quot;&gt;OpenAI DevDay 2025&lt;/h3&gt;
&lt;p&gt;OpenAI DevDay 2025 was held on October 6, 2025 at Fort Mason in San Francisco. The keynote was delivered by CEO Sam Altman and featured special guest Jony Ive, the renowned Apple designer. The event focused on empowering developers to build groundbreaking applications faster than ever.&lt;/p&gt;
&lt;p&gt;Highlights include:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://openai.com/index/introducing-apps-in-chatgpt/&quot;&gt;Apps in ChatGPT&lt;/a&gt; and &lt;a href=&quot;https://developers.openai.com/apps-sdk/&quot;&gt;Apps SDK&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://platform.openai.com/docs/guides/agents/agent-builder&quot;&gt;AgentKit&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Sora 2 and Sora 2 Pro&lt;/li&gt;
&lt;li&gt;GPT-5 Pro API&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://openai.com/index/codex-now-generally-available/&quot;&gt;Codex General-Available&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;GPT-Realtime-mini&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;github-universe-25&quot;&gt;Github Universe 25&lt;/h3&gt;
&lt;p&gt;At &lt;strong&gt;Github Universe 25&lt;/strong&gt;, which was held on October 28 - 29, 2025, GitHub announces &lt;strong&gt;Agent HQ&lt;/strong&gt; - a unified platform bringing coding agents from Anthropic, OpenAI, Google, Cognition, and xAI directly into GitHub workflows as part of Copilot subscriptions. Features include mission control for managing agents across devices, VS Code integration with plan mode and custom agents, enterprise governance tools, code quality checks, and metrics dashboards. It would be available starting with OpenAI Codex for Copilot Pro+ users in VS Code Insiders.&lt;/p&gt;
&lt;p&gt;A comprehensive recap can be found &lt;a href=&quot;https://github.com/events/universe/recap&quot;&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&quot;new-versions&quot;&gt;New Versions&lt;/h2&gt;
&lt;h3 id=&quot;python-3140-final&quot;&gt;Python 3.14.0 final&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://www.python.org/downloads/release/python-3140/&quot;&gt;&lt;img src=&quot;https://hugovk.dev/python-3.14.png&quot; alt=&quot;python3.14&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Python 3.14 (Pi, 𝜋, or Pie) is finally here! This release brings officially supported free-threaded build and lots of new features. Besides, Python 3.13.9 is also released.&lt;/p&gt;
&lt;p&gt;Python 3.12.12, 3.11.14, 3.10.19 and 3.9.24 are the latest security-only releases.&lt;/p&gt;
&lt;p&gt;Python 3.9 is reaching End-Of-Life this October, so don’t forget to upgrade!&lt;/p&gt;
&lt;h3 id=&quot;python-3150-alpha-1&quot;&gt;Python 3.15.0 alpha 1&lt;/h3&gt;
&lt;p&gt;Python 3.15.0 alpha 1 is the first of seven planned alpha releases for the Python 3.15 series. Key highlights include:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Statistical Sampling Profiler (PEP 799): A new high-performance profiling tool with virtually zero overhead that can sample at up to 1,000,000 Hz&lt;/li&gt;
&lt;li&gt;UTF-8 as Default Encoding (PEP 686): Python now uses UTF-8 as the default encoding for I/O operations, improving cross-platform compatibility&lt;/li&gt;
&lt;li&gt;New C API (PEP 782): Introduction of PyBytesWriter for creating Python bytes objects&lt;/li&gt;
&lt;li&gt;Improved Error Messages: Enhanced developer experience with better error reporting&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;langchain-10--langgraph-10&quot;&gt;LangChain 1.0 &amp;amp; LangGraph 1.0&lt;/h3&gt;
&lt;p&gt;This version marks LangChain’s commitment to stability with no breaking changes until 2.0, while reducing complexity and focusing on core agent functionality.&lt;/p&gt;
&lt;h3 id=&quot;crewai-10&quot;&gt;CrewAI 1.0&lt;/h3&gt;
&lt;p&gt;CrewAI 1.0 represents the transition from beta/experimental to production-grade enterprise solution, with better stability, enterprise features, and a more mature ecosystem while maintaining the core multi-agent orchestration capabilities.&lt;/p&gt;
&lt;h3 id=&quot;pytorch-29&quot;&gt;PyTorch 2.9&lt;/h3&gt;
&lt;p&gt;The 2.9 release focuses on enhancing multi-GPU programming, expanding hardware compatibility, and improving the developer experience for C++ extensions while maintaining performance optimizations.&lt;/p&gt;
&lt;p&gt;Major New Features include:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Symmetric Memory: New feature enabling easier multi-GPU kernel programming&lt;/li&gt;
&lt;li&gt;Enhanced torch.compile: Ability to arbitrarily toggle error or resume on graph breaks&lt;/li&gt;
&lt;li&gt;Expanded Hardware Support: Added ROCm, XPU, and CUDA 13 wheel variants&lt;/li&gt;
&lt;li&gt;FlexAttention: Now enabled on Intel GPUs with flash decoding optimization on x86 CPUs&lt;/li&gt;
&lt;li&gt;Arm Platform: Improvements and optimizations for Arm architecture&lt;/li&gt;
&lt;li&gt;Linux aarch64: Binary wheel builds across all CUDA versions&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;isort-70&quot;&gt;isort 7.0&lt;/h3&gt;
&lt;p&gt;isort 7 is a conservative major release focused on updating Python version support and maintaining compatibility with newer Python versions. The changes are relatively minor compared to the major architectural changes seen between versions 4.x → 5.x. The main impact for users will be the requirement for Python 3.10+ and improved debugging information for file processing.&lt;/p&gt;
&lt;h3 id=&quot;ubuntu-2510&quot;&gt;Ubuntu 25.10&lt;/h3&gt;
&lt;p&gt;Ubuntu 25.10 “Questing Quokka” is released! It “introduces GNOME 49 with media and power controls on the lock screen, HDR brightness settings, and enhanced accessibility features in line with the European Accessibility Act.”&lt;/p&gt;
&lt;p&gt;It “also debuts Rust-based implementations of sudo and coreutils for improved memory safety, and adopts the new RVA23 profile as the baseline for RISC-V, paving the way to Ubuntu 26.04 LTS.”&lt;/p&gt;
&lt;p&gt;Other spins like Xubuntu, Lubuntu, Kubuntu, edubuntu, and Ubuntu Studio are also released. Pick your favorite and start coding!&lt;/p&gt;
&lt;h2 id=&quot;tutorials&quot;&gt;Tutorials&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;DeepLearning.ai’s &lt;a href=&quot;https://www.deeplearning.ai/courses/agentic-ai/&quot;&gt;Agentic AI&lt;/a&gt; by Andrew Ng&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;In this course taught by Andrew Ng, you’ll gain a fundamental understanding and practical knowledge to develop production-ready agentic applications, from design patterns to deployment and evaluation.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ul&gt;
&lt;li&gt;DeepLearning.ai’s &lt;a href=&quot;https://www.deeplearning.ai/short-courses/building-live-voice-agents-with-googles-adk/&quot;&gt;Building Live Voice Agents with Google’s ADK&lt;/a&gt; from Google&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;You’ll learn how to build and deploy AI agents with Google’s open source Agent Development Kit (ADK). ADK provides modular components such as models, tools, memory, and orchestration, that make it easier to create both simple and complex systems.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ul&gt;
&lt;li&gt;DeepLearning.ai’s &lt;a href=&quot;https://www.deeplearning.ai/short-courses/governing-ai-agents/&quot;&gt;Governing AI Agents&lt;/a&gt; from databricks&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;Explore what it means to govern an agent, how to apply governance policies to a real dataset in Databricks, and how to add observability to track and debug performance. Through this course, you’ll know how to build agents that handle data responsibly while maintaining visibility, and safety.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;articles&quot;&gt;Articles&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://realpython.com/python314-new-features/&quot;&gt;Python 3.14: Cool New Features for You to Try&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;As usual, RealPython has a great article on the very latest Python version. This time it compiles a list of the new features in Python 3.14 (eg. t-strings, colorful REPL, deferred annotation evaluation) and demonstrates how to play with them.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://blog.miguelgrinberg.com/post/python-3-14-is-here-how-fast-is-it&quot;&gt;Python 3.14 Is Here. How Fast Is It?&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Python 3.14 is the fastest CPython release yet, showing significant improvements over previous versions. Benchmarks tested Fibonacci calculations and bubble sort algorithms across single-threaded and multi-threaded scenarios. Key findings show 3.14 running 27% faster than 3.13 for recursive functions. While the new JIT interpreter showed minimal gains, the free-threading variant delivered impressive 3x speed improvements for CPU-heavy multi-threaded workloads due to GIL removal. PyPy remained exceptionally fast, outperforming even Node.js in some tests, while Rust demonstrated the highest performance overall.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://blog.baro.dev/p/the-future-of-python-web-services-looks-gil-free&quot;&gt;The future of Python web services looks GIL-free&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Python 3.14’s free-threaded implementation (no GIL) shows promising results for web services. Benchmarks reveal ASGI apps maintain similar performance with 20% lower memory usage, while WSGI apps see 3-4x throughput improvements for CPU-bound tasks. Despite 5-10% performance penalty in pure Python Python code, the elimination of GIL contention enables true multi-core utilization, potentially revolutionizing Python web deployment by simplifying concurrency and reducing memory requirements.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.pythonmorsels.com/t-strings-in-python/&quot;&gt;T-strings: Python’s Fifth String Formatting Technique?&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Python 3.14 introduces t-strings, a fifth string formatting technique that returns Template objects instead of strings. Unlike f-strings which immediately interpolate values, t-strings enable lazy string interpolation - useful for library authors who need to pre-process inputs (like escaping SQL/HTML) before final string creation. T-strings use &lt;code&gt;t&quot;...&quot;&lt;/code&gt; syntax and are primarily designed for tool/library maintainers, not typical Python developers.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://codecut.ai/langchain-1-0-middleware-production-agents/&quot;&gt;Build Production-Ready LLM Agents with LangChain 1.0 Middleware&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This tutorial demonstrates how to build production-ready LLM agents using LangChain 1.0’s new middleware architecture. It covers five essential middleware components:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Message Summarization: Manages context windows by condensing conversations&lt;/li&gt;
&lt;li&gt;PII Filtering: Protects sensitive data through automatic redaction&lt;/li&gt;
&lt;li&gt;Human-in-the-Loop: Adds approval workflows for sensitive actions&lt;/li&gt;
&lt;li&gt;Task Planning: Structures complex requests into manageable subtasks&lt;/li&gt;
&lt;li&gt;Intelligent Tool Selection: Pre-filters tools to reduce costs and improve accuracy&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The middleware follows web server patterns, providing reusable, testable components that can be composed together. Each focuses on a single responsibility (monitor, modify, control, or enforce) and integrates seamlessly to build robust production agents with minimal infrastructure code.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.paulox.net/2025/10/06/django-orm-comparison/&quot;&gt;Django: one ORM to rule all databases 💍&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This article provides a comprehensive comparison of Django ORM features across PostgreSQL, SQLite, MariaDB, MySQL, and Oracle. It includes detailed feature matrices showing support levels (✅/⚠️/🚫) for various functionality including field types, constraints, query features, transactions, and GIS capabilities, using fictional data to illustrate what an automated feature comparison matrix could look like in Django’s official documentation.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://bui.app/why-reactive-programming-hasnt-taken-off-in-python-and-how-signals-can-change-that/&quot;&gt;Why Reactive Programming Hasn’t Taken Off in Python (And How Signals Can Change That)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Reactive programming hasn’t gained traction in Python because existing tools like RxPY are designed for event streams and require complex subscription management. However, signal-based reactive programming offers Python developers automatic state synchronization like spreadsheet formulas, reducing bugs and improving maintainability. The &lt;code&gt;reaktiv&lt;/code&gt; library provides transparent, synchronous updates where derived values automatically stay in sync with base data without manual coordination.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://vectifyai.notion.site/agentic-retrieval&quot;&gt;From Claude Code to Agentic RAG&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The article advocates moving from traditional vector-based RAG systems to “agentic retrieval” - letting LLMs reason through documents directly. It introduces &lt;code&gt;PageIndex&lt;/code&gt;, a vectorless hierarchical indexing system that creates human-like table-of-contents trees. Instead of complex vector databases, it gives LLMs navigational tools to find and retrieve relevant content, mirroring how Claude Code uses simple tools like grep. PageIndex achieved 98.7% accuracy on FinanceBench while requiring minimal infrastructure.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://simonwillison.net/2025/Oct/7/vibe-engineering/&quot;&gt;Vibe engineering&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Simon Willison proposes “vibe engineering” as the opposite of “vibe coding” - a sophisticated, accountable approach where experienced engineers use AI tools like coding agents responsibly. This method rewards advanced software practices: comprehensive testing, planning, documentation, version control, and good management skills.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://blog.arcbjorn.com/state-of-llms-2025&quot;&gt;State of LLMs in Late 2025&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The 2025 LLM landscape is hyper-specialized, moving from single generalist models to a diverse ecosystem where each model has distinct strengths. The article analyzes GPT-5’s unified intelligence system with automatic model switching, Claude Sonnet 4.5’s coding dominance (77% SWE-bench), open-source Llama 4 variants with 10M token contexts, Grok 4’s mathematical supremacy, and efficient alternatives like Mistral. It provides practical guidance on choosing the right model based on specific use cases rather than “which is smartest,” reflecting the era of tailored AI tools for specific tasks.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://kix.dev/two-things-llm-coding-agents-are-still-bad-at/&quot;&gt;Two things LLM coding agents are still bad at&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;LLM coding agents struggle with two key areas. First, they don’t use copy-paste operations—instead of moving code directly, they delete from the source and write from memory into the destination, which feels unnatural compared to human programming habits. Second, they’re terrible at asking clarifying questions when uncertain; instead they make assumptions and brute-force solutions until hitting walls.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://bytesauna.com/post/coding-vs-software-engineering&quot;&gt;AI can code, but it can’t build software&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The article argues that while AI can generate code, it cannot truly “build software” - the complex engineering required to create production-ready applications. Coding is solving isolated problems, but software engineering involves managing complexity, integration, and long-term maintainability. AI can demo features, but transforming prototypes into robust systems requires human expertise, explaining why non-technical founders still seek technical co-founders despite AI tools.&lt;/p&gt;
&lt;h2 id=&quot;podcasts&quot;&gt;Podcasts&lt;/h2&gt;
&lt;h3 id=&quot;-corepy&quot;&gt;🥝 core.py&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://open.spotify.com/episode/3zMQYlP7hF7fKi8wdlAxyn&quot;&gt;Episode 26.1: CPython Sprint Week in Cambridge UK, Part 1&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://open.spotify.com/episode/7rj1Sxqw8oOUvgkbbh59PN&quot;&gt;Episode 26.2: CPython Sprint Week in Cambridge UK, Part 2&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;-realpython-podcast&quot;&gt;🐍 RealPython Podcast&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://realpython.com/podcasts/rpp/268/&quot;&gt;Episode 268: Advice on Beginning to Learn Python&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://realpython.com/podcasts/rpp/269/&quot;&gt;Episode 269: Python 3.14: Exploring the New Features&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://realpython.com/podcasts/rpp/270/&quot;&gt;Episode 270: Evolving Teaching Python in the Classroom&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://realpython.com/podcasts/rpp/271/&quot;&gt;Episode 271: Benchmarking Python 3.14 &amp;amp; Enabling Asyncio to Scale&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://realpython.com/podcasts/rpp/272/&quot;&gt;Episode 272: Michael Kennedy: Managing Your Own Python Infrastructure&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;-python-bytes-podcast&quot;&gt;🥧 Python Bytes Podcast&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://pythonbytes.fm/episodes/show/452/pi-py-day-or-is-it-py-pi-day&quot;&gt;#452 pi py-day (or is it py pi-day?)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://pythonbytes.fm/episodes/show/453/python&quot;&gt;#453 Python++&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://pythonbytes.fm/episodes/show/454/its-some-form-of-elvish&quot;&gt;#454 It’s some form of Elvish&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://pythonbytes.fm/episodes/show/455/gilded-python-and-beyond&quot;&gt;#455 Gilded Python and Beyond&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;-talk-python-to-me&quot;&gt;🦜 Talk Python to me&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://talkpython.fm/episodes/show/522/data-sci-tips-and-tricks-from-codecut.ai&quot;&gt;#522: Data Sci Tips and Tricks from CodeCut.ai&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://talkpython.fm/episodes/show/523/pyrefly-fast-ide-friendly-typing-for-python&quot;&gt;#523: Pyrefly: Fast, IDE-friendly typing for Python&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://talkpython.fm/episodes/show/524/38-things-python-developers-should-learn-in-2025&quot;&gt;#524: 38 things Python developers should learn in 2025&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://talkpython.fm/episodes/show/525/nicegui-goes-3.0&quot;&gt;#525: NiceGUI Goes 3.0&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;-pybites-podcast&quot;&gt;🍕 Pybites Podcast&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.pybitespodcast.com/1501156/episodes/17891539-203-automating-api-documentation-with-zylosystems&quot;&gt;#203: Automating API Documentation with Zylosystems&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;-vs-code-insiders-podcast&quot;&gt;🚀 VS Code Insiders Podcast&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.vscodepodcast.com/8&quot;&gt;Episode 8: Impact of AI on How We Learn to Code with Scott Tolinski&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.vscodepodcast.com/9&quot;&gt;Episode 9: Building agent memory for VS Code with Harald Kirschner&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.vscodepodcast.com/10&quot;&gt;Episode 10: Mastering Chat Modes in VS Code with Burke Holland&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.vscodepodcast.com/11&quot;&gt;Episode 11: Building &amp;amp; Scaling Open Source Communities with Steve Francia&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;repositories&quot;&gt;Repositories&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/anthropics/claude-agent-sdk-python/&quot;&gt;claude-agent-sdk-python&lt;/a&gt; (MIT)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Claude Code SDK is renamed to Claude Agent SDK. It helps developers build powerful autonomous agents using Claude.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/microsoft/agent-framework&quot;&gt;microsoft/agent-framework&lt;/a&gt; (MIT)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;MAF is Microsoft’s comprehensive multi-language framework for building, orchestrating, and deploying AI agents with support for both .NET and Python implementations. It’s developed by the core AutoGen and Semantic Kernel teams at Microsoft, and is designed to be a new foundation for building AI applications going forward.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/microsoft/agent-lightning&quot;&gt;microsoft/agent-lightning&lt;/a&gt; (MIT)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;“The absolute trainer to light up AI agents.”&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/VectifyAI/PageIndex&quot;&gt;PageIndex&lt;/a&gt; (MIT)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;code&gt;PageIndex&lt;/code&gt; is a Vector-less, reasoning-based RAG system that simulates how human experts navigate and extract knowledge from long documents through tree search, enabling LLMs to think and reason their way to the most relevant document sections.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/hunvreus/devpush&quot;&gt;/dev/push&lt;/a&gt; (MIT)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;code&gt;/dev/push&lt;/code&gt; is a open-source Platform as a Service (PaaS) written in Python and HTML for developers to build and deploy their applications. It is self-hostable and can be considered as an alternative to Vercel, Netlify, etc.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/mitmproxy/pdoc&quot;&gt;mitmproxy/pdoc&lt;/a&gt; (MIT-0)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;code&gt;pdoc&lt;/code&gt; is a Python library for generating API documentation from code and comments.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/ludo-technologies/pyscn&quot;&gt;ludo-technologies/pyscn&lt;/a&gt; (MIT)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;code&gt;pyscn&lt;/code&gt; is a Python code quality analyzer written in Go. It detects dead code, tracks module dependencies, and analyzes complexity, etc. to make your code base more maintainable.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;As we wrap up this journey together, I want to take a moment to express my gratitude for your reading. If you’ve enjoyed what you just read and would like to help sustain this blog, consider &lt;a href=&quot;https://github.com/blueberry-py/blog/stargazers&quot;&gt;starring this blog on github&lt;/a&gt;, it would be great motivation for me to keep updating the blogs!&lt;/p&gt;
&lt;p&gt;Alright, that concludes the October Edition of “This Month of Pythonistas”. Thank you again for reading my post. I hope you enjoy it or find something useful. Happy coding and see you in November!&lt;/p&gt;
</description><pubDate>Fri, 31 Oct 2025 13:00:00 GMT</pubDate><category>python</category><category>python</category><category>cli</category><category>linux</category><category>podcast</category><category>news</category><category>agentic</category><author>Zeyang Lin</author></item><item><title>This Month for Pythonistas - September 2025</title><link>https://blueberry-py.github.io/blog/post/this-month-for-pythonistas-2025-09/</link><guid isPermaLink="true">https://blueberry-py.github.io/blog/post/this-month-for-pythonistas-2025-09/</guid><description>&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;python&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;from&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; datetime &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;import&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; date&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;print&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(date.today().year, date.today().month)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# 2025 9&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img alt=&quot;issue-2025-09&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1280&quot; height=&quot;720&quot; src=&quot;/blog/_astro/splash.BiMTt-n4_ZvyDwO.webp&quot;&gt;&lt;/p&gt;
&lt;p&gt;Welcome back Pythonistas! I’m glad to see you back reading the seventh issue of my “This month for Pythonistas” series which curates the news, articles, tutorials, podcasts, and more Python stuff worth noting in this month.&lt;/p&gt;
&lt;p&gt;Before we continue, please note that this blog is synced across several platforms:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://blueberry-py.github.io/blog/post/this-month-for-pythonistas-2025-09/&quot;&gt;Github Pages&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://blueberrypy.netlify.app/post/this-month-for-pythonistas-2025-09/&quot;&gt;Netlify&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://blueberrypy.onrender.com/post/this-month-for-pythonistas-2025-09/&quot;&gt;Render&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Ready? Let’s get started!&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&quot;events--social&quot;&gt;Events &amp;amp; Social&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;DjangoCon US 2025 was held in Chicago, United States.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;PyCon UK 2025 was held in Manchester, England.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;PyCon China 2025 was held in Shanghai, China.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;new-versions&quot;&gt;New Versions&lt;/h2&gt;
&lt;h3 id=&quot;python-314-rc3&quot;&gt;Python 3.14 RC3&lt;/h3&gt;
&lt;p&gt;This is the final release preview before 3.14 final, which is scheduled for Tuesday, 2025-10-07.&lt;/p&gt;
&lt;p&gt;Source tarball and binary releases are available &lt;a href=&quot;https://www.python.org/downloads/release/python-3140rc3/&quot;&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&quot;tutorials&quot;&gt;Tutorials&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Deeplearning.ai’s &lt;a href=&quot;https://www.deeplearning.ai/short-courses/knowledge-graphs-for-ai-agent-api-discovery/&quot;&gt;Knowledge Graphs for AI Agent API Discovery&lt;/a&gt; from SAP&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;You’ll implement API discovery that starts with semantic retrieval to reduce the API selection space, then adds APIs connected by business-process edges. The result is a small, relevant subset of APIs that includes the information about the process sequence the agent should follow.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ul&gt;
&lt;li&gt;Deeplearning.ai’s &lt;a href=&quot;https://www.deeplearning.ai/short-courses/build-ai-apps-with-mcp-server-working-with-box-files/&quot;&gt;Build AI Apps with MCP Servers: Working with Box Files&lt;/a&gt; from Box&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;Build an LLM-powered invoice app that processes local PDF invoices to extract fields such as client name, total amount, and purchased product, and generates per-client reports.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ul&gt;
&lt;li&gt;DeepLearning.ai’s &lt;a href=&quot;https://www.deeplearning.ai/short-courses/building-and-evaluating-data-agents/&quot;&gt;Building and Evaluating Data Agents&lt;/a&gt; from snowflake&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;You’ll know how to build, trace, and evaluate a multi-agent workflow that plans tasks, pulls context from structured and unstructured data, performs web search, and summarizes or visualizes the final results.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=YtHdaXuOAks&quot;&gt;Guide to Agentic AI – Build a Python Coding Agent with Gemini&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;This project-based tutorial provides a deep understanding of how powerful AI tools work by guiding you through the creation of an agentic loop powered by tool calling. You will implement the core abilities for your agent to interact with and modify a codebase, including reading files, writing to files, and executing code to get feedback.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;articles&quot;&gt;Articles&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://tonybaloney.github.io/posts/why-isnt-python-async-more-popular.html&quot;&gt;Python has had async for 10 years – why isn’t it more popular?&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Python’s &lt;code&gt;async&lt;/code&gt; / &lt;code&gt;await&lt;/code&gt; (introduced 2015) remains niche due to limited I/O use cases (excludes disk ops, reliant on GIL), fragmented ecosystem (Flask/Django’s patchy async adoption, duplicated sync/async APIs), and testing complexity. &lt;code&gt;FastAPI&lt;/code&gt;’s rise indicates async success in web contexts, but 3.14’s free-threading/sub-interpreter features may reduce async reliance.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://adamj.eu/tech/2025/08/29/python-fix-syntaxwarning-finally/&quot;&gt;Python: fix &lt;code&gt;SyntaxWarning: &apos;return&apos; in a &apos;finally&apos; block&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Python 3.14+ warns about &lt;code&gt;return&lt;/code&gt;/&lt;code&gt;break&lt;/code&gt;/&lt;code&gt;continue&lt;/code&gt; in &lt;code&gt;finally&lt;/code&gt; blocks (PEP 765) as they override preceding flow control. Always returns the &lt;code&gt;finally&lt;/code&gt; block’s value, causing silent bugs. Fix it by restructuring code to avoid these keywords in &lt;code&gt;finally&lt;/code&gt; blocks—move &lt;code&gt;return&lt;/code&gt;s to &lt;code&gt;except&lt;/code&gt; blocks or remove unnecessary exception handling.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://martinfowler.com/articles/build-own-coding-agent.html&quot;&gt;Building your own CLI Coding Agent with Pydantic-AI&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This article details building a custom CLI coding agent using Pydantic-AI and Model Context Protocol. Unlike commercial tools, a custom agent can be tailored to specific project needs, understanding project context and conventions. The agent combines Claude with specialized MCP servers for testing, code execution, documentation access, internet search, and file operations. Through incremental capabilities—from simple test running to full codebase management—the agent evolves into an intelligent development partner that maintains context, provides structured reasoning, and can autonomously debug and implement solutions.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://nkantar.com/blog/2025/08/static-python-uv-caddy-docker/&quot;&gt;Static Sites with Python, uv, Caddy, and Docker&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This blog post explains the author’s deployment stack for Python-built static sites using &lt;code&gt;uv&lt;/code&gt;, &lt;code&gt;Caddy&lt;/code&gt;, and Docker. The author details a multi-stage Docker build approach: first stage uses &lt;code&gt;uv&lt;/code&gt; with Python 3.13 to build the site, second stage uses &lt;code&gt;Caddy&lt;/code&gt;’s Alpine image to serve static files. The setup includes custom &lt;code&gt;Caddy&lt;/code&gt; configurations for reverse proxying analytics and handling custom error pages, domains, and content types.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://judoscale.com/blog/where-to-host-python-app&quot;&gt;Where to Host a Python Web App&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The article compares hosting options for Python web apps, recommending Heroku for non-Docker apps due to its excellent developer experience. Render offers a cheaper Heroku alternative, while Fly.io is usually the cheapest but requires more configuration. AWS ECS suits AWS-experienced users, and self-hosting is only viable with dedicated ops teams. Docker usage significantly impacts hosting choice. The author strongly recommends autoscaling regardless of platform choice, with Heroku being their top pick when prioritizing developer experience and reliability.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://betweentheprompts.com/three-act-play/&quot;&gt;AI-Assisted Development: A Three-Act Play&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The article presents three distinct approaches to AI-assisted software development: “Vibe Coding” (AI builds apps through chat iterations), “Copilot” (AI assists with planned code sections requiring human review), and “HUD” (AI serves as an intelligent code-completion tool). Author explains these methods aren’t mutually exclusive but suited for different tasks—designers prefer vibe-coding for rapid prototypes while developers use HUD (Cursor’s Tab) for production code.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://morningcoffee.io/parallel-ai-agents-are-a-game-changer.html&quot;&gt;Parallel AI Agents Are a Game Changer&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Parallel AI agents represent a major shift in software development, allowing multiple AI agents (like GitHub Copilot) to work simultaneously on different tasks. Instead of coding one feature at a time, developers can assign 10-20 issues to agents working in parallel, then focus on reviewing and refining their output.Success requires good system documentation, fast CI/CD, monorepo architecture, and skills in problem decomposition and code review rather than line-by-line coding.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.anthropic.com/engineering/writing-tools-for-agents&quot;&gt;Writing effective tools for agents — with agents&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The post explains how to create effective tools for AI agents using an evaluation-driven approach. Key insights include: building targeted tools for specific workflows rather than generic APIs, using clear namespacing to avoid confusion, returning meaningful context efficiently, and optimizing for token usage. The authors recommend prototyping quickly, creating comprehensive evaluations with real-world tasks, and collaborating with Claude itself to iteratively improve tool performance. Best practices involve designing tools that mirror human problem-solving while providing rich functionality under the hood.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.anthropic.com/engineering/building-agents-with-the-claude-agent-sdk&quot;&gt;Building Agents with the Claude Agent SDK&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The Claude Code SDK is now Claude Agent SDK. It helps developers build powerful autonomous agents using Claude. The framework operates on a feedback loop: gather context → take action → verify work → repeat. Key features include agentic search, tools/actions, subagents, MCP integrations, code generation, and verification methods.&lt;/p&gt;
&lt;h2 id=&quot;podcasts&quot;&gt;Podcasts&lt;/h2&gt;
&lt;h3 id=&quot;-realpython-podcast&quot;&gt;🐍 RealPython Podcast&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://realpython.com/podcasts/rpp/264/&quot;&gt;Episode 264: Large Language Models on the Edge of the Scaling Laws&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://realpython.com/podcasts/rpp/265/&quot;&gt;Episode 265: Python App Hosting Choices &amp;amp; Documenting Python’s History&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://realpython.com/podcasts/rpp/266/&quot;&gt;Episode 266: Dangers of Automatically Converting a REST API to MCP&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://realpython.com/podcasts/rpp/267/&quot;&gt;Episode 267: Managing Feature Flags &amp;amp; Comparing Python Visualization Libraries&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;-python-bytes-podcast&quot;&gt;🥧 Python Bytes Podcast&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://pythonbytes.fm/episodes/show/447/going-down-a-rat-hole&quot;&gt;#447 Going down a rat hole&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://pythonbytes.fm/episodes/show/448/im-getting-the-bios-flavor&quot;&gt;#448 I’m Getting the BIOS Flavor&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://pythonbytes.fm/episodes/show/449/suggestive-trove-classifiers&quot;&gt;#449 Suggestive Trove Classifiers&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://pythonbytes.fm/episodes/show/450/at-cost-agentic-ide-tooling&quot;&gt;#450 At-Cost Agentic IDE Tooling&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://pythonbytes.fm/episodes/show/451/databases-are-a-fad&quot;&gt;#451 Databases are a Fad&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;-talk-python-to-me&quot;&gt;🦜 Talk Python to me&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://talkpython.fm/episodes/show/518/celebrating-djangos-20th-birthday-with-its-creators&quot;&gt;#518: Celebrating Django’s 20th Birthday With Its Creators&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://talkpython.fm/episodes/show/519/data-science-cloud-lessons-at-scale&quot;&gt;#519: Data Science Cloud Lessons at Scale&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://talkpython.fm/episodes/show/520/pyx-the-other-side-of-the-uv-coin-announcing-pyx&quot;&gt;#520: pyx - the other side of the uv coin (announcing pyx)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://talkpython.fm/episodes/show/521/red-teaming-llms-and-genai-with-pyrit&quot;&gt;#521: Red Teaming LLMs and GenAI with PyRIT&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;-pybites-podcast&quot;&gt;🍕 Pybites Podcast&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.pybitespodcast.com/1501156/episodes/17830911-202-behind-the-scenes-at-pybites-with-bob-and-julian&quot;&gt;#202: Behind the scenes at Pybites with Bob and Julian&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;vs-code-insiders-podcast&quot;&gt;VS Code Insiders Podcast&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.vscodepodcast.com/3&quot;&gt;Episode 3: Building a MCP to Build VS Code &amp;amp; The Impact of AI on Kent C. Dodds&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.vscodepodcast.com/4&quot;&gt;Episode 4: Language Model Chat Provider (aka BYOK) API with Logan Ramos&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.vscodepodcast.com/5&quot;&gt;Episode 5: Life of a VS Code SWE Intern with Christy Nguyen&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.vscodepodcast.com/6&quot;&gt;Episode 6: The Future of Coding Agents in VS Code&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.vscodepodcast.com/7&quot;&gt;Episode 7: The Origins &amp;amp; Evolution of the GitHub MCP Registry&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;repositories&quot;&gt;Repositories&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/langchain-ai/open-swe&quot;&gt;langchain-ai/open-swe&lt;/a&gt; (MIT)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;OpenSWE is an open-source, cloud-based asynchronous coding agent built with LangGraph. It autonomously understand codebases, plans solutions, and executes code changes across repositories - creating issues and pull requests automatically. Features include human-in-the-loop feedback, parallel execution, and can be launched via web UI or GitHub issues with the “open-swe” label.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/google-agentic-commerce/AP2&quot;&gt;google-agentic-commerce/AP2&lt;/a&gt; (Apache 2.0)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Agent Payments Protocol (AP2) is Google’s initiative for secure, interoperable AI-driven payments. This repository provides code samples and demos using ADK and Gemini, with Python/Android scenarios for shopping agents. Features setup instructions, quickstart guides, and authentication via Google API Key or Vertex AI.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://huggingface.co/deepseek-ai/DeepSeek-V3.2-Exp&quot;&gt;deepseek-ai/DeepSeek-V3.2-Exp&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;As an intermediate step toward DeepSeek’s next-generation architecture, V3.2-Exp builds upon V3.1-Terminus by introducing DeepSeek Sparse Attention—a sparse attention mechanism designed to explore and validate optimizations for training and inference efficiency in long-context scenarios.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&quot;have-time-for-some-fun&quot;&gt;Have time for some fun?&lt;/h2&gt;
&lt;p&gt;Tokyo Game Show 2025 took place from September 25-28, 2025, featuring numerous major game announcements and reveals across various platforms.&lt;/p&gt;
&lt;p&gt;Major Xbox Announcements:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Forza Horizon 6: The highly anticipated racing game was officially revealed&lt;/li&gt;
&lt;li&gt;Gungrave G.O.R.E Blood Heat: A new entry in the action series&lt;/li&gt;
&lt;li&gt;007: First Light: A James Bond title&lt;/li&gt;
&lt;li&gt;Aniimo: A rhythm-based game&lt;/li&gt;
&lt;li&gt;Double Dragon: Revive: The classic franchise returns&lt;/li&gt;
&lt;li&gt;Hotel Barcelona: An adventure game&lt;/li&gt;
&lt;li&gt;Rhythm Doctor: A music/rhythm game&lt;/li&gt;
&lt;li&gt;Hitman: New content or entry in the franchise&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Capcom Presentations:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Pragmata: Updates revealed for this highly anticipated title&lt;/li&gt;
&lt;li&gt;Street Fighter 6: Continued support and new content&lt;/li&gt;
&lt;li&gt;Other Capcom franchises received updates or reveals&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;p&gt;As we wrap up this journey together, I want to take a moment to express my gratitude for your reading. If you’ve enjoyed what you just read and would like to help sustain this blog, consider &lt;a href=&quot;https://github.com/blueberry-py/blog/stargazers&quot;&gt;starring this blog on github&lt;/a&gt;, it would be great motivation for me to keep updating the blogs!&lt;/p&gt;
&lt;p&gt;Alright, that concludes the September Edition of “This Month of Pythonistas”. Thank you again for reading my post. I hope you enjoy it or find something useful. Happy coding and see you in October!&lt;/p&gt;
</description><pubDate>Tue, 30 Sep 2025 13:00:00 GMT</pubDate><category>python</category><category>python</category><category>cli</category><category>linux</category><category>podcast</category><category>news</category><author>Zeyang Lin</author></item><item><title>This Month for Pythonistas - August 2025</title><link>https://blueberry-py.github.io/blog/post/this-month-for-pythonistas-2025-08/</link><guid isPermaLink="true">https://blueberry-py.github.io/blog/post/this-month-for-pythonistas-2025-08/</guid><description>&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;python&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;from&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; datetime &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;import&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; date&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;print&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(date.today().year, date.today().month)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# 2025 8&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img alt=&quot;issue-2025-08&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1280&quot; height=&quot;720&quot; src=&quot;/blog/_astro/splash.BiFq9r7y_J7tK1.webp&quot;&gt;&lt;/p&gt;
&lt;p&gt;Welcome back Pythonistas! I’m glad to see you back reading the sixth issue of my “This month for Pythonistas” series which curates the news, articles, tutorials, podcasts, and more Python stuff worth noting in this month.&lt;/p&gt;
&lt;p&gt;Before we continue, please note that this blog is synced across several platforms:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://blueberry-py.github.io/blog/post/this-month-for-pythonistas-2025-08/&quot;&gt;Github Pages&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://blueberrypy.netlify.app/post/this-month-for-pythonistas-2025-08/&quot;&gt;Netlify&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://blueberrypy.onrender.com/post/this-month-for-pythonistas-2025-08/&quot;&gt;Render&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Ready? Let’s get started!&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&quot;events--social&quot;&gt;Events &amp;amp; Social&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=GfH4QL4VqJ0&quot;&gt;Python: The Documentary | An origin story&lt;/a&gt; is available on Youtube now.&lt;/p&gt;
&lt;h2 id=&quot;new-versions&quot;&gt;New Versions&lt;/h2&gt;
&lt;h3 id=&quot;python-3137&quot;&gt;Python 3.13.7&lt;/h3&gt;
&lt;p&gt;Python 3.13.7 is an expedited release which aims to fix a significant issue with the 3.13.6 release:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;code&gt;gh-137583&lt;/code&gt;: Regression in ssl module between 3.13.5 and 3.13.6: reading from a TLS-encrypted connection blocks&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;The official downloads are available &lt;a href=&quot;https://www.python.org/downloads/release/python-3137/&quot;&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&quot;python-314-rc2&quot;&gt;Python 3.14 RC2&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;This is the penultimate release candidate of Python 3.14.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;RC2 was originally planned as the final Release Candidate, but a bug was discovered and a third RC is scheduled in September, before October’s 3.14 final release.&lt;/p&gt;
&lt;p&gt;The official downloads are available &lt;a href=&quot;https://www.python.org/downloads/release/python-3140rc2/&quot;&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&quot;tutorials&quot;&gt;Tutorials&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;DeepLearning.ai’s &lt;a href=&quot;https://www.deeplearning.ai/short-courses/claude-code-a-highly-agentic-coding-assistant/&quot;&gt;Claude Code: A Highly Agentic Coding Assistant&lt;/a&gt; from Anthropic&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;In this course, you’ll learn best practices for using Claude Code to improve your coding workflow. You’ll learn key tips on how to provide Claude Code with clear context, such as specifying the relevant files, clearly defining the features and functionality, and connecting Claude Code to MCP servers.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ul&gt;
&lt;li&gt;DeepLearning.ai’s &lt;a href=&quot;https://www.deeplearning.ai/short-courses/agentic-knowledge-graph-construction/&quot;&gt;Agentic Knowledge Graph Construction&lt;/a&gt; from neo4j&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;You’ll implement an agentic system using Google’s Agent Development Kit (ADK), to build a knowledge graph that helps you find the root cause of product issues. You’ll work with structured data consisting of product and supplier information, and unstructured data consisting of product reviews.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ul&gt;
&lt;li&gt;Coursera’s &lt;a href=&quot;https://www.coursera.org/learn/fast-prototyping-of-genai-apps-with-streamlit&quot;&gt;Fast Prototyping of GenAI Apps with Streamlit&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;Build and iterate GenAI apps in hours instead of days! Start with a simple chatbot, then add prompt engineering and RAG powered by Snowflake’s secure data and LLM services, then push your prototype to Snowflake or Streamlit Community Cloud for instant feedback and quick improvement.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ul&gt;
&lt;li&gt;RealPython’s &lt;a href=&quot;https://realpython.com/async-io-python/&quot;&gt;AsyncIO Python&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;In this tutorial, you’ll learn how Python asyncio works, how to define and run coroutines, and when to use asynchronous programming for better performance in applications that perform I/O-bound tasks.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ul&gt;
&lt;li&gt;RealPython’s &lt;a href=&quot;https://realpython.com/python-mixin/&quot;&gt;What Are Mixin Classes in Python?&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;Mixins offer a powerful way to reuse code across multiple Python classes without forcing them into a rigid inheritance hierarchy. Instead of building deep and brittle class trees, you can use mixins to share common behaviors in a modular and flexible way.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;articles&quot;&gt;Articles&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://thenewstack.io/how-python-grew-from-a-language-to-a-community/&quot;&gt;How Python Grew From a Language to a Community&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Python’s growth from a programming language to a thriving community represents an inspiring story of collaboration and dedication. Starting in 1991, Python began as a pet project by Guido van Rossum, distributed through Usenet newsgroups. The pivotal moment came in 1994 with an in-person meeting of 20 developers in Maryland, where the Python community was born as something separate from the language itself.&lt;/p&gt;
&lt;p&gt;The journey from these humble beginnings to becoming the world’s #1 programming language involved several key phases. Early attempts to commercialize Python through a consortium model failed, but the passion and commitment of its community led to the creation of the nonprofit Python Software Foundation in 2001. This foundation, guided by open-source principles, employed Python’s core team to work full-time on the language.&lt;/p&gt;
&lt;p&gt;PyCon conferences became the “real engine for change”, generating revenue through sponsorships from tech giants like Google. This funding enabled the foundation to hire professional staff and support ongoing development and infrastructure projects. The foundation’s commitment to diversity and heterogeneous cultures positioned Python to capitalize on emerging trends like AI, ensuring its continued relevance and growth in the tech landscape.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://blog.jetbrains.com/pycharm/2025/08/the-state-of-python-2025/&quot;&gt;The State of Python 2025&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The article summarizes key findings from the 2025 Python Developers Survey, highlighting major trends in the Python ecosystem. It notes that 86% of respondents use Python as their main language, emphasizing its central role. Importantly, 50% of developers have less than two years of professional coding experience, and 39% have less than two years with Python. This underscores Python’s popularity among beginners and the importance of supporting newcomers with detailed tutorials and resources. The insights are based on over 30,000 responses and aim to guide both individual developers and tool vendors.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://astral.sh/blog/introducing-pyx&quot;&gt;pyx: a Python-native package registry, now in Beta&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Astral.sh’s ambition to build Python’s next-gen infrastructure (the Astral Platform) begins with &lt;code&gt;pyx&lt;/code&gt;, a “Python-native package registry” which could be seen as an optimized backend for tools like &lt;code&gt;uv&lt;/code&gt;. Some of its early partners are already using it while other have to submit their information to be on the waitlist.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.hudsonrivertrading.com/hrtbeat/inside-hrts-python-fork/&quot;&gt;Inside HRT’s Python Fork: Leveraging PEP 690 for Faster Import&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;HRT implemented “lazy imports” by forking CPython, using Meta’s &lt;code&gt;Cinder&lt;/code&gt; patches. This defers module loading until first use, solving import overhead in their Python monorepo. After migration challenges (2023-2024), all HRT Python now uses lazy imports by default, cutting CLI startup times and distributed compute overhead dramatically.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://savannah.dev/posts/how-your-code-runs-in-a-jit-build/&quot;&gt;How Your Code Runs in a JIT Build&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This post explains how JIT compilation works in Python, focusing on CPython’s Tier 2 and Tier 3 optimizations. It covers bytecode evolution, how code transforms from Tier 1 basic bytecode through Tier 2 micro-ops to Tier 3 machine code, the role of specializations for common patterns, and how JIT bridges Python’s flexibility with C-like performance through runtime optimization based on actual execution patterns.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://sailor.li/asyncio&quot;&gt;asyncio: a library with too many sharp corners&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The article criticizes Python’s &lt;code&gt;asyncio&lt;/code&gt; library and suggests that it is “too many sharp corners”. It details four major problems: cancellation is broken (edge-triggered vs level-triggered), tasks can be garbage collected while pending due to weak references, I/O APIs are convoluted callback-based systems inherited from &lt;code&gt;Twisted&lt;/code&gt;, and &lt;code&gt;asyncio.Queue&lt;/code&gt; has poor backpressure handling. Additional issues include thread integration problems, signal handling limitations, and broken eager tasks. The author recommends using &lt;code&gt;Trio&lt;/code&gt; or &lt;code&gt;AnyIO&lt;/code&gt; libraries instead, which implement cancellation properly with level-triggered semantics and saner I/O abstractions.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://lucumr.pocoo.org/2025/7/26/virtual-threads/&quot;&gt;From Async/Await to Virtual Threads&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;In this post Armin Ronacher explores the concept of virtual threads and structured concurrency as a way to simplify concurrent programming, especially in Python. It contrasts traditional async/await models with the idea of virtual threads managed in thread groups, where parallel tasks are spawned and automatically managed with cancellation and error propagation.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://lucumr.pocoo.org/2025/7/30/things-that-didnt-work/&quot;&gt;Agentic Coding Things That Didn’t Work&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This is another post from Armin Ronacher in which Armin discusses various approaches and tools to improve workflow automation with LLMs but found ineffective. It is highlighted that clear, manual instruction often outperforms elaborate automations. They caution that over-reliance on automation leads to mental disengagement and reduced code quality, emphasizing the importance of active review and critical thinking.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://live-comet-marketing-site.pantheonsite.io/blog/ai-agent-design/&quot;&gt;AI Agent Design Patterns: How to Build Reliable AI Agent Architecture for Production&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The article emphasizes that building reliable AI agents requires more than prompt engineering—it needs modular, role-based design, observability, and feedback loops. Modular design assigns specialized roles to agents, making systems scalable and easier to maintain. Observability involves monitoring and logging every step for improvement. Feedback loops enable agents to learn and self-optimize.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://userjot.com/blog/best-practices-building-agentic-ai-systems&quot;&gt;Best Practices for Building Agentic AI Systems: What Actually Works in Production&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The article outlines proven best practices for building productive agentic AI systems based on real-world implementation at UserJot. Key insights include using a simple two-tier architecture (primary agent + specialized subagents), keeping subagents stateless for predictability, and employing task decomposition (vertical for sequential tasks, horizontal for parallel processing). The system emphasizes structured communication protocols, parallel execution for performance, and robust error handling with graceful degradation.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://objectgraph.com/blog/building-mcp-pyexec-python-execution-server/&quot;&gt;Building MCP PyExec: Secure Python Execution Server with Docker &amp;amp; Authentication&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The blog details building MCP PyExec, a secure Python execution server using the Model Context Protocol (MCP). It covers three components: the PyExec server implementing MCP for streaming Python code execution; an OAuth 2.0 Identity Provider (IDP) for secure authentication supporting authorization code flow, JWT, and token validation; and a PyExec client for testing and interaction that manages OAuth tokens and streaming results.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://openai.com/index/introducing-gpt-oss/&quot;&gt;Introducing gpt-oss&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;OpenAI has released their first open-weight models since GPT-2 - &lt;code&gt;gpt-oss-120b&lt;/code&gt; and &lt;code&gt;gpt-oss-20b&lt;/code&gt; - under Apache 2.0 license.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://signoz.io/blog/why-observability-isnt-just-for-sres/&quot;&gt;Why Observability Isn’t Just for SREs (and How Devs Can Get Started)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This blog post serves as a guide for developers to understand the importance of observability and provides a playbook for integrating it into their workflow. Observability helps developers maintain cleaner code, manage systems better, and reduce technical debt by considering more edge cases and improving debugging processes.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://blog.val.town/vibe-code&quot;&gt;Vibe code is legacy code&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This blog highlights that vibe coding quickly generates tech debt as the produced code often becomes legacy code—difficult to understand or maintain. Vibe coding works well for prototypes and throwaway projects but is risky for large, maintainable systems, especially if done by non-programmers. Serious coding with AI requires caution, thorough understanding, and careful maintenance. The author emphasizes that while AI changes programming, deep technical knowledge and theory-building remain essential.&lt;/p&gt;
&lt;h2 id=&quot;podcasts&quot;&gt;Podcasts&lt;/h2&gt;
&lt;h3 id=&quot;-corepy&quot;&gt;🥝 core.py&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://podcasters.spotify.com/pod/show/corepy/episodes/Episode-25-A-Python-That-Never-Was-e37bk50&quot;&gt;Episode 25: A Python That Never Was&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;-realpython-podcast&quot;&gt;🐍 RealPython Podcast&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://realpython.com/podcasts/rpp/259/&quot;&gt;Episode 259: Design Patterns That Don’t Translate to Python&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://realpython.com/podcasts/rpp/260/&quot;&gt;Episode 260: Harnessing the Power of Python Polars&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://realpython.com/podcasts/rpp/261/&quot;&gt;Episode 261: Selecting Inheritance or Composition in Python&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://realpython.com/podcasts/rpp/262/&quot;&gt;Episode 262: Travis Oliphant: SciPy, NumPy, and Fostering Scientific Python&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://realpython.com/podcasts/rpp/263/&quot;&gt;Episode 263: Exploring Mixin Classes in Python&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;-python-bytes-podcast&quot;&gt;🥧 Python Bytes Podcast&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://pythonbytes.fm/episodes/show/443/patching-multiprocessing&quot;&gt;#443 Patching Multiprocessing&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://pythonbytes.fm/episodes/show/444/begone-python-of-yore&quot;&gt;#444 Begone Python of Yore!&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://pythonbytes.fm/episodes/show/445/auto-activate-python-virtual-environments-for-any-project&quot;&gt;#445 Auto-activate Python virtual environments for any project&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://pythonbytes.fm/episodes/show/446/state-of-python-2025&quot;&gt;#446 State of Python 2025&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;-talk-python-to-me&quot;&gt;🦜 Talk Python to me&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://talkpython.fm/episodes/show/515/durable-python-execution-with-temporal&quot;&gt;#515: Durable Python Execution with Temporal&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://talkpython.fm/episodes/show/516/accelerating-python-data-science-at-nvidia&quot;&gt;#516: Accelerating Python Data Science at NVIDIA&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://talkpython.fm/episodes/show/517/agentic-al-programming-with-python&quot;&gt;#517: Agentic Al Programming with Python&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://talkpython.fm/episodes/show/518/celebrating-djangos-20th-birthday-with-its-creators&quot;&gt;#518: Celebrating Django’s 20th Birthday With Its Creators&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;-pybites-podcast&quot;&gt;🍕 Pybites Podcast&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.pybitespodcast.com/1501156/episodes/17587007-199-charlie-marsh-on-ty-uv-and-the-python-tooling-renaissance&quot;&gt;#199: Charlie Marsh on ty, uv, and the Python tooling renaissance&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.pybitespodcast.com/1501156/episodes/17658068-200-celebrating-200-episodes-of-our-pybites-journey&quot;&gt;#200: Celebrating 200 episodes of our Pybites journey&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;vs-code-insiders-podcast&quot;&gt;VS Code Insiders Podcast&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.vscodepodcast.com/1&quot;&gt;Episode 1: Hello GPT-5 &amp;amp; GPT-5 mini&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.vscodepodcast.com/2&quot;&gt;Episode 2: Iteration Plan for August &amp;amp; Re-writing Terminal Tools&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;repositories&quot;&gt;Repositories&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/jd-opensource/oxygent&quot;&gt;jd-opensource/oxygent&lt;/a&gt; (Apache 2.0)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;code&gt;OxyGent&lt;/code&gt; is an open-source Python framework from &lt;a href=&quot;www.jd.com&quot;&gt;JD&lt;/a&gt; retail department for building production-ready multi-agent AI systems. It provides modular components that snap together like LEGO bricks, enabling efficient development of collaborative AI agents. Features include intelligent real-time task decomposition, elastic distributed architecture, continuous learning capabilities, and standardized tools/LLM integration.&lt;/p&gt;
&lt;p&gt;You can find more at their &lt;a href=&quot;https://oxygent.jd.com/&quot;&gt;project website&lt;/a&gt;.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/google/langextract&quot;&gt;google/langextract&lt;/a&gt; (Apache 2.0)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;code&gt;LangExtract&lt;/code&gt; is a Python library by Google that uses LLMs to extract structured data from unstructured text. Key features include precise source grounding (mapping extractions to exact source locations), optimized handling of long documents via chunking and parallel processing, interactive HTML visualization, and support for cloud models like Gemini and local LLMs via Ollama.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/nottelabs/notte&quot;&gt;nottelabs/notte&lt;/a&gt; (Server Side Public License 1.0)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;code&gt;Notte&lt;/code&gt; is an open-source web automation framework for building reliable AI agents. It provides essential tools for creating and deploying agents that interact with the web, combining AI reasoning with traditional scripting for cost-efficiency. Key features include structured data extraction, vaults for credential management, stealth browser sessions with CAPTCHA solving, and hybrid workflows.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/globalaiplatform/langdiff&quot;&gt;langdiff&lt;/a&gt; (Apache 2.0)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;…&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/mcp-use/mcp-use&quot;&gt;mcp-use&lt;/a&gt; (MIT)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This is a Python library that provides a simple way to connect any LLM to any MCP server and build custom MCP agents that have tool access, without using closed source or application clients.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/openai/gpt-oss&quot;&gt;openai/gpt-oss&lt;/a&gt; (Apache 2.0)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This is the repository as part of OpenAI’s GPT-OSS, which provides a set of code implementations including a &lt;code&gt;gpt-oss&lt;/code&gt; Python library, &lt;code&gt;harmony&lt;/code&gt;, and more.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/KittenML/KittenTTS&quot;&gt;KittenTTS&lt;/a&gt; (Apache 2.0)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This is the accompanying Python library for KittenTTS, an open-source realistic text-to-speech model with just 15 million parameters which can run without a GPU.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&quot;have-time-for-some-fun&quot;&gt;Have time for some fun?&lt;/h2&gt;
&lt;h3 id=&quot;gamescom-2025&quot;&gt;GamesCom 2025&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;Hollow Knight Silk Song&lt;/em&gt; finally has revealed its launch date: Sept. 4, 2025.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Resident Evil Requiem&lt;/em&gt; debuts a cinematic trailer featuring Grace Ashcroft for the sequel to the critically acclaimed survival horror game franchise.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Black Myth: Zhong Kui&lt;/em&gt; introduces Zhong Kui, a legendary demon-slayer from Chinese folklore, as the central figure of the sequel to hit Black Myth: Wukong.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Warhammer 40K Dawn of War IV&lt;/em&gt; is officially announced.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Lords of the Fallen II&lt;/em&gt; takes place a century after its predecessor, featuring faster and more punishing combat.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;LEGO Batman: Legacy of the Dark Knight&lt;/em&gt; covers the story of Batman, starting from a young Bruce Wayne.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;p&gt;As we wrap up this journey together, I want to take a moment to express my gratitude for your reading. If you’ve enjoyed what you just read and would like to help sustain this blog, consider &lt;a href=&quot;https://github.com/blueberry-py/blog/stargazers&quot;&gt;starring this blog on github&lt;/a&gt;, it would be great motivation for me to keep updating the blogs!&lt;/p&gt;
&lt;p&gt;Alright, that concludes August Edition of “This Month of Pythonistas”. Thank you again for reading my post. I hope you enjoy it or find something useful. Happy coding and see you in September!&lt;/p&gt;
</description><pubDate>Sun, 31 Aug 2025 13:00:00 GMT</pubDate><category>python</category><category>python</category><category>cli</category><category>linux</category><category>podcast</category><category>news</category><author>Zeyang Lin</author></item><item><title>This Month for Pythonistas - July 2025</title><link>https://blueberry-py.github.io/blog/post/this-month-for-pythonistas-2025-07/</link><guid isPermaLink="true">https://blueberry-py.github.io/blog/post/this-month-for-pythonistas-2025-07/</guid><description>&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;python&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;from&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; datetime &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;import&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; date&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;print&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(date.today().year, date.today().month)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# 2025 7&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img alt=&quot;issue-2025-07&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1536&quot; height=&quot;864&quot; src=&quot;/blog/_astro/splash.CyreQy-k_ZCRsMd.webp&quot;&gt;&lt;/p&gt;
&lt;p&gt;Welcome back Pythonistas! I hope you enjoy your summer vacation if you actually have one. But in any case I’m glad to see you back reading the fifth issue of my “This month for Pythonistas” series which curates the news, articles, tutorials, podcasts, and more Python stuff worth noting in this month.&lt;/p&gt;
&lt;p&gt;Before we continue, please note that this blog is synced across several platforms:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://blueberry-py.github.io/blog/post/this-month-for-pythonistas-2025-07/&quot;&gt;Github Pages&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://blueberrypy.netlify.app/post/this-month-for-pythonistas-2025-07/&quot;&gt;Netlify&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://blueberrypy.onrender.com/post/this-month-for-pythonistas-2025-07/&quot;&gt;Render&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Ready? Let’s get started!&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&quot;events--social&quot;&gt;Events &amp;amp; Social&lt;/h2&gt;
&lt;p&gt;EuroPython 2025 took place in Prague again this year. For those of you who did not attend, there’s no official recordings of the talks yet.&lt;/p&gt;
&lt;h2 id=&quot;new-versions&quot;&gt;New Versions&lt;/h2&gt;
&lt;h3 id=&quot;python-3140-release-candidate-1&quot;&gt;Python 3.14.0 release candidate 1&lt;/h3&gt;
&lt;p&gt;The first release candidate of Python 3.14 is ready! Source code as well as binary distributions can be found &lt;a href=&quot;https://www.python.org/downloads/release/python-3140rc1/&quot;&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The second candidate (and the last planned release preview) is scheduled for Tuesday, 2025-08-26, while the official release of 3.14.0 is scheduled for Tuesday, 2025-10-07.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;tutorials&quot;&gt;Tutorials&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Deeplearning.ai’s &lt;a href=&quot;https://www.deeplearning.ai/short-courses/post-training-of-llms/&quot;&gt;Post-training of LLMs&lt;/a&gt; from NexusFlow&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;In this course, you’ll learn three common post-training methods—Supervised Fine-Tuning (SFT), Direct Preference Optimization (DPO), and Online Reinforcement Learning (RL)—and how to use each one effectively.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ul&gt;
&lt;li&gt;Deeplearning.ai’s &lt;a href=&quot;https://www.deeplearning.ai/short-courses/pydantic-for-llm-workflows/&quot;&gt;Pydantic for LLM Workflows&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;Use Pydantic to generate structured outputs from LLMs, ensuring the responses follow a specific format that your application can reliably process.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;articles&quot;&gt;Articles&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://fromscratchcode.com/blog/how-global-variables-work-in-python-bytecode/&quot;&gt;How global variables work in Python bytecode&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The blog post explains how global variables work in Python bytecode using the Memphis interpreter built in Rust as an example. It highlights that while the VM doesn’t store the names of local variables, it performs dynamic name resolution for global variables, a key aspect of Python’s flexibility.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.thepythoncodingstack.com/p/python-disassembling-bytecode-dis-module&quot;&gt;Python Backstage • Disassembling Python Code Using the &lt;code&gt;dis&lt;/code&gt; Module&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This article explains how to use Python’s &lt;code&gt;dis&lt;/code&gt; module to view the bytecode generated from a simple script. The bytecode is a low-level representation of the Python code, showing the sequence of operations the Python interpreter performs. For example, the &lt;code&gt;LOAD_CONST&lt;/code&gt; and &lt;code&gt;STORE_NAME&lt;/code&gt; instructions represent assigning a constant value to a variable, while the &lt;code&gt;CALL&lt;/code&gt; instruction indicates a function call.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://pythonspeed.com/articles/different-ways-speed/&quot;&gt;330× faster: Four different ways to speed up your code&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The article discusses four ways to accelerate Python code: efficiency improvements by reducing unnecessary calculations, using compilation to optimize performance, leveraging parallelism with multiple CPU cores, and adopting development processes like benchmarking and testing. An example analyzing letter frequency in Jane Austen’s Northanger Abbey demonstrates how combining these methods yields significant speedups, ultimately achieving a 330× faster performance.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://bui.app/the-missing-manual-for-signals-state-management-for-python-developers/&quot;&gt;The Missing Manual for Signals: State Management for Python Developers&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The article discusses state management using Signals in Python, highlighting their benefits in handling complex state dependencies and cascading updates. It contrasts Signals with traditional manual approaches, which can lead to bugs and maintenance challenges due to implicit dependencies.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://fidget-spinner.github.io/posts/jit-reflections.html&quot;&gt;Reflections on 2 years of CPython’s JIT Compiler: The good, the bad, the ugly&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This blog post discusses the current state of CPython’s JIT (Just-In-Time) compiler. The author highlights that while the JIT is still experimental and not always faster than the interpreter, a growing community of contributors is working on improving it. Key areas for improvement include performance and coverage.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://lwn.net/Articles/1025893/&quot;&gt;Getting extensions to work with free-threaded Python&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The addition of free-threaded Python allows for better thread scalability, particularly in Python extensions like NumPy. Nathan Goldbaum and Lysandros Nikolaou presented at PyCon US 2025 about the challenges and solutions for migrating the Python ecosystem to support the new free-threaded model, emphasizing the importance of maintaining compatibility with existing C/C++/Rust-based extensions.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://lucumr.pocoo.org/2025/7/3/tools/&quot;&gt;Tools: Code Is All You Need&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The author details a method for converting a blog from reStructuredText to Markdown, using an LLM to generate and validate scripts, emphasizing the importance of trust in the automated process. It concludes that while MCP may be useful for certain tasks, it currently faces limitations in composability and context management compared to direct code generation.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://blog.mozilla.ai/wasm-agents-ai-agents-running-in-your-browser/&quot;&gt;Wasm-agents: AI agents running in your browser&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The article introduces Wasm-agents, a blueprint for creating AI agents that can run directly in your browser. These agents are packaged as standalone HTML files, utilizing WebAssembly and Pyodide to execute Python scripts and libraries.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.cubic.dev/blog/learnings-from-building-ai-agents&quot;&gt;Learnings from building AI agents&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The article discusses lessons learned from developing an AI code review agent at Cubic. Initially, the tool was too noisy, generating many false positives and irrelevant comments. Improvements included requiring the AI to explicitly justify its findings, simplifying the toolset to essential components, and employing specialized micro-agents for different tasks. These changes reduced false positives by 51%, improved developer trust, and streamlined the code review process.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.lesswrong.com/posts/uAEhvX6scvcZANWwg/a-guide-for-llm-assisted-web-research&quot;&gt;A Guide For LLM-Assisted Web Research&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The article reviews various LLMs and web research tools for internet-based research tasks. Overall, standard ChatGPT with web search is recommended for its speed, manageability, and iterative capabilities, while more complex, slower tools are less practical for routine research tasks.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://blog.langchain.com/context-engineering-for-agents/&quot;&gt;Context Engineering&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This article discusses “context engineering”, which involves providing the right information to agents (like LLMs) within their context window to help them perform tasks effectively. It covers four strategies: write, select, compress, and isolate.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://cekrem.github.io/posts/programming-as-theory-building-naur/&quot;&gt;Programming as Theory Building: Why Senior Developers Are More Valuable Than Ever&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The article discusses Peter Naur’s 1985 idea that programming is about building a shared theory of how a system works. Source code is just a representation, and critical knowledge is in developers’ minds. Today’s AI tools and novice developers risk losing this underlying theory, leading to incoherent code and technical debt. Senior developers are now more vital than ever because they preserve and evaluate the theoretical framework, ensuring system coherence and understanding the “why” behind code decisions.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://ordep.dev/posts/writing-code-was-never-the-bottleneck&quot;&gt;Writing Code Was Never The Bottleneck&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The article argues that while the creation of code may be sped up by tools like LLMs, the true bottlenecks in software engineering lie in code reviews, testing, debugging, coordination, and communication. These processes, which require deep understanding and collaboration, remain critical and cannot be bypassed.&lt;/p&gt;
&lt;h2 id=&quot;podcasts&quot;&gt;Podcasts&lt;/h2&gt;
&lt;h3 id=&quot;-corepy&quot;&gt;🥝 core.py&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://podcasters.spotify.com/pod/show/corepy/episodes/The-Megahertz-e35ffoi&quot;&gt;The Megahertz&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;-realpython-podcast&quot;&gt;🐍 RealPython Podcast&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://realpython.com/podcasts/rpp/256/&quot;&gt;Episode 256: Solving Problems and Saving Time in Chemistry With Python&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://realpython.com/podcasts/rpp/257/&quot;&gt;Episode 257: Comparing Real-World Python Performance Against Big O&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://realpython.com/podcasts/rpp/258/&quot;&gt;Episode 258: Supporting the Python Package Index&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;-python-bytes-podcast&quot;&gt;🥧 Python Bytes Podcast&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://pythonbytes.fm/episodes/show/438/motivation-time&quot;&gt;#438 Motivation time&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://pythonbytes.fm/episodes/show/439/that-astral-episode&quot;&gt;#439 That Astral Episode&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://pythonbytes.fm/episodes/show/440/cant-register-for-vibecon&quot;&gt;#440 Can’t Register for VibeCon&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://pythonbytes.fm/episodes/show/441/its-michaels-all-the-way-down&quot;&gt;#441 It’s Michaels All the Way Down&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://pythonbytes.fm/episodes/show/442/cloud-bills-in-scientific-notation&quot;&gt;#442 Cloud bills in scientific notation&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;-talk-python-to-me&quot;&gt;🦜 Talk Python to me&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://talkpython.fm/episodes/show/512/building-a-jit-compiler-for-cpython&quot;&gt;#512: Building a JIT Compiler for CPython&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://talkpython.fm/episodes/show/513/stories-from-python-history&quot;&gt;#513: Stories from Python History&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://talkpython.fm/episodes/show/514/python-language-summit-2025&quot;&gt;#514: Python Language Summit 2025&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;-pybites-podcast&quot;&gt;🍕 Pybites Podcast&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.pybitespodcast.com/1501156/episodes/17416659-194-evolution-not-extinction-why-developers-still-matter-in-the-age-of-ai&quot;&gt;#194: Evolution, not extinction: why developers still matter in the age of AI&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.pybitespodcast.com/1501156/episodes/17436411-195-patterns-paradigms-and-pythonic-thinking-with-rodrigo-girao-serrao&quot;&gt;#195: Patterns, paradigms, and pythonic thinking with Rodrigo Girão Serrão&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.pybitespodcast.com/1501156/episodes/17514265-196-robin-quintero-on-complexipy&quot;&gt;#196: Robin Quintero on Complexipy&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.pybitespodcast.com/1501156/episodes/17538206-197-polars-with-jeroen-janssens-and-thijs-nieuwdorp&quot;&gt;#197: Polars with Jeroen Janssens and Thijs Nieuwdorp&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.pybitespodcast.com/1501156/episodes/17574426-198-tim-hopper-on-uv-and-smarter-python-development&quot;&gt;#198: Tim Hopper on UV and smarter Python development&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;repositories&quot;&gt;Repositories&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/huggingface/screenenv&quot;&gt;huggingface/screenenv&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;blog -&amp;gt; &lt;a href=&quot;https://huggingface.co/blog/screenenv&quot;&gt;ScreenEnv: Deploy your full stack Desktop Agent&lt;/a&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/google-gemini/genai-processors&quot;&gt;google-gemini/genai-processors&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;blog -&amp;gt; &lt;a href=&quot;https://developers.googleblog.com/en/genai-processors/&quot;&gt;Announcing GenAI Processors: Build powerful and flexible Gemini applications&lt;/a&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;As we wrap up this journey together, I want to take a moment to express my gratitude for your reading. If you’ve enjoyed what you just read and would like to help sustain this blog, consider &lt;a href=&quot;https://github.com/blueberry-py/blog/stargazers&quot;&gt;starring this blog on github&lt;/a&gt;, it would be great motivation for me to keep updating the blogs!&lt;/p&gt;
&lt;p&gt;Alright, that concludes the fifth issue of “This Month of Pythonistas”. Thank you again for reading my post. I hope you enjoy it or find something useful, and see you in August!&lt;/p&gt;
</description><pubDate>Thu, 31 Jul 2025 13:00:00 GMT</pubDate><category>python</category><category>python</category><category>cli</category><category>linux</category><category>podcast</category><category>news</category><author>Zeyang Lin</author></item><item><title>This Month for Pythonistas - June 2025</title><link>https://blueberry-py.github.io/blog/post/this-month-for-pythonistas-2025-06/</link><guid isPermaLink="true">https://blueberry-py.github.io/blog/post/this-month-for-pythonistas-2025-06/</guid><description>&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;python&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;from&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; datetime &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;import&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; date&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;print&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(date.today().year, date.today().month)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# 2025 6&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img alt=&quot;issue-2025-06&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1536&quot; height=&quot;864&quot; src=&quot;/blog/_astro/splash.Dadds7nf_Z1ggANq.webp&quot;&gt;&lt;/p&gt;
&lt;p&gt;Welcome back! Summer is really here and I hope you all enjoy the heat or rain. I’m glad to see you back reading the fourth issue of my “This month for Pythonistas” series which curates the news, articles, tutorials and more Python stuff worth noting in this month.&lt;/p&gt;
&lt;p&gt;Before we continue, please note that this blog is synced across several platforms:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://blueberry-py.github.io/blog/post/this-month-for-pythonistas-2025-06/&quot;&gt;Github Pages&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://blueberrypy.netlify.app/post/this-month-for-pythonistas-2025-06/&quot;&gt;Netlify&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://blueberrypy.onrender.com/post/this-month-for-pythonistas-2025-06/&quot;&gt;Render&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Ready? Let’s get started!&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&quot;events--social&quot;&gt;Events &amp;amp; Social&lt;/h2&gt;
&lt;p&gt;DjangoCon US 2025 is coming this September in Chicago, United States. The in-person tickets are officially on sale now. You can also choose to attend online with even Sprints options available.&lt;/p&gt;
&lt;h2 id=&quot;new-versions&quot;&gt;New versions&lt;/h2&gt;
&lt;h3 id=&quot;python-3140-beta-3&quot;&gt;Python 3.14.0 beta 3&lt;/h3&gt;
&lt;p&gt;The third beta release of 3.14 is here! Source code as well as binary distributions can be found &lt;a href=&quot;https://www.python.org/downloads/release/python-3140b3/&quot;&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&quot;python-3135&quot;&gt;Python 3.13.5&lt;/h3&gt;
&lt;p&gt;Python 3.13.4 was an expected release early this month but was found to be having bugs. So another bugfix release 3.13.5 is out soon after.&lt;/p&gt;
&lt;h3 id=&quot;python-31211-31113-31018-and-3923&quot;&gt;Python 3.12.11, 3.11.13, 3.10.18 and 3.9.23&lt;/h3&gt;
&lt;p&gt;These are regular security releases with only offical tarball distributions. And remember that Python 3.9 is going to reach its end of life this October.&lt;/p&gt;
&lt;h2 id=&quot;tutorials&quot;&gt;Tutorials&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Deeplearning.ai’s &lt;a href=&quot;https://www.deeplearning.ai/short-courses/dspy-build-optimize-agentic-apps/&quot;&gt;DSPy: Build and Optimize Agentic Apps&lt;/a&gt; from DataBricks&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;This course teaches you how to use DSPy to build and optimize LLM-powered applications. You’ll write programs using DSPy’s signature-based programming model, debug them with MLflow tracing, and automatically improve their accuracy with DSPy Optimizer. Along the way, you’ll see how DSPy helps you easily switch models, manage complexity, and build agents that are both powerful and easy to maintain.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ul&gt;
&lt;li&gt;Deeplearning.ai’s &lt;a href=&quot;https://www.deeplearning.ai/short-courses/orchestrating-workflows-for-genai-applications/&quot;&gt;Orchestrating Workflows for GenAI Applications&lt;/a&gt; from Astronomer&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;In this course, you’ll learn how to turn a Retrieval Augmented Generation (RAG) prototype into a robust, automated pipeline using Airflow 3.0, a leading open-source orchestration tool. You’ll build two workflows for a typical RAG application: one that ingests and embeds book description texts into a vector database, and another that queries that database to recommend books.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ul&gt;
&lt;li&gt;Deeplearning.ai’s &lt;a href=&quot;https://www.deeplearning.ai/short-courses/building-with-llama-4/&quot;&gt;Building with Llama 4&lt;/a&gt; from Meta&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;In hands-on lessons, you’ll build apps using Llama 4’s long-context and its new multi-modal capabilities including reasoning across multiple images and “image grounding” in which you can identify elements and reason within specific image regions.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ul&gt;
&lt;li&gt;Deeplearning.ai’s &lt;a href=&quot;https://www.deeplearning.ai/short-courses/acp-agent-communication-protocol/&quot;&gt;ACP: Agent Communication Protocol&lt;/a&gt; from BeeAI and Linux Foundation&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;You’ll learn how to wrap an agent inside an ACP server and set up an ACP client to connect to the server. You’ll build sequential and hierarchical workflows of agents hosted inside ACP servers, and learn how to manage this workflow on the client side through a process or another agent.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ul&gt;
&lt;li&gt;RealPython’s &lt;a href=&quot;https://realpython.com/python-script-structure/&quot;&gt;How Can You Structure Your Python Script?&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This is a comprehensive guide on structuring a standalone, shareable Python script, including specifying its dependencies in the script itself following PEP 723, handling CLI inputs, proprerly logging, and more.&lt;/p&gt;
&lt;h2 id=&quot;articles&quot;&gt;Articles&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://peps.python.org/pep-0734/&quot;&gt;PEP 734 – Multiple Interpreters in the Stdlib&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;PEP 734 is &lt;strong&gt;accepted&lt;/strong&gt;. It proposes to add a new module, &lt;code&gt;interpreters&lt;/code&gt;, to support inspecting, creating, and running code in multiple interpreters in the current process.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://peps.python.org/pep-0779/&quot;&gt;PEP 779 – Criteria for supported status for free-threaded Python&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;PEP 779 is &lt;strong&gt;accepted&lt;/strong&gt;, which means that staring from Python 3.14 a “No-GIL” build is officially supported instead of being in “experimental” status like in Python 3.13.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://fromscratchcode.com/blog/how-local-variables-work-in-python-bytecode/&quot;&gt;How local variables work in Python bytecode&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Local variables are stored on the stack, specifically within the evaluation stack of a Frame in the CallStack. Despite this, most Python variables are actually references to objects stored on the heap. The post illustrates this concept through a simple function, demonstrating how the stack changes as the function executes.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://developers.googleblog.com/en/google-cloud-donates-a2a-to-linux-foundation/&quot;&gt;Google decided to donate Agent2Agent protocol/project to Linux Foundation&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The Linux Foundation has announced the creation of the Agent2Agent (A2A) project, which aims to develop an open standard protocol that enables AI agents from different vendors to communicate, collaborate, and share information securely. Google Cloud contributed the A2A protocol specifications, SDKs, and developer tools.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.anthropic.com/engineering/built-multi-agent-research-system&quot;&gt;How we built our multi-agent research system&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This post by Anthropic gives a behind-the-scenes look at how they set up a system where multiple AI agents can work together on different tasks. Think of it like a digital teamwork lab, where AI agents can play different roles—like writers, editors, or problem-solvers—and collaborate to get things done.&lt;/p&gt;
&lt;p&gt;The team designed the system to be super flexible, so they could easily run different types of experiments. Some agents work together on writing tasks, while others negotiate or help delegate work among themselves. It’s all about seeing how AIs interact, cooperate, and sometimes even challenge each other.&lt;/p&gt;
&lt;p&gt;Building this wasn’t all smooth sailing—they had to deal with tricky prompts, keep experiments reproducible, and figure out how to measure how well the agents were doing. Along the way, they learned a lot: use clear building blocks, design thoughtful communication between agents, and always keep good logs.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://benanderson.work/blog/agentic-search-for-dummies/&quot;&gt;Agentic Search for Dummies&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This blog post discusses building a search agent that uses full-text search with offline document augmentation to let AI models dynamically gather context from a large document corpus. The system uses a search index (Tantivy) and a set of tools to enable a language model to issue multiple queries, fuse results, and read selected documents iteratively until it produces a final answer. The post argues against relying on dense embeddings due to complexity and overhead, advocating for full-text search as a more predictable and effective method for agentic search.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://mrshiny608.github.io/MrShiny608/optimisation/2025/04/22/OhNoYouDidnt.html&quot;&gt;O(no) You Didn’t 😱&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This article discusses the difference between theoretical Big-O performance and real-world performance, emphasizing that actual speed depends on context and profiling. Using a “Two Sum” problem as an example, it compares the brute-force O(n^2) approach with an optimized O(n) hashmap method. The article explains how memory access times and hardware factors influence performance, illustrating that understanding practical bottlenecks is crucial beyond just Big-O notation.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://blog.alexmaccaw.com/how-to-vibe-code-as-a-senior-engineer/&quot;&gt;How to Vibe Code as a Senior Engineer&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Despite concerns about AI-generated code quality, recent advancements in AI models have made vibe coding a valuable tool for experienced engineers. However, human oversight remains crucial for guiding architecture and ensuring code quality. The author emphasizes the importance of using a robust scaffold, establishing clear rules, and providing perfect context for optimal AI performance.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://blog.adarshd.dev/posts/pycon-us-ai-and-future-of-programming/&quot;&gt;Will AI Replace Junior Developers? I Asked Experts at Pycon US&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The blog discusses whether AI will replace junior developers, based on conversations at PyCon US. Most experts believe AI won’t fully replace programmers but will change how they work, especially in tasks like boilerplate coding. Key figures like &lt;strong&gt;Guido van Rossum&lt;/strong&gt; and &lt;strong&gt;Trey Hunner&lt;/strong&gt; see AI as a tool for improving productivity rather than a threat. Some, like &lt;strong&gt;Samuel Colvin&lt;/strong&gt;, think AI could replace certain roles to increase efficiency.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://cognition.ai/blog/dont-build-multi-agents&quot;&gt;Don’t Build Multi-Agents&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The article argues against building multi-agent systems due to their fragility and context sharing challenges. It advocates for principles like sharing full context and implicit decision-making to build reliable AI agents. The author suggests simpler, single-threaded, linear agents or long-context compressed systems for better reliability.&lt;/p&gt;
&lt;h2 id=&quot;podcasts&quot;&gt;Podcasts&lt;/h2&gt;
&lt;h3 id=&quot;-corepy&quot;&gt;🥝 core.py&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://open.spotify.com/episode/1C0oe2vgW40CGBOFAhRlWY&quot;&gt;PyCon US 2025 Recap&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;-realpython-podcast&quot;&gt;🐍 RealPython Podcast&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://realpython.com/podcasts/rpp/252/&quot;&gt;Episode 252: Rodrigo Girão Serrão: Python Training, itertools, and Idioms&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://realpython.com/podcasts/rpp/253/&quot;&gt;Episode 253: Starting With Marimo Notebooks &amp;amp; Python App Config Management&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://realpython.com/podcasts/rpp/254/&quot;&gt;Episode 254: Scaling Python Web Applications With Kubernetes and Karpenter&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://realpython.com/podcasts/rpp/255/&quot;&gt;Episode 255: Structuring Python Scripts &amp;amp; Exciting Non-LLM Software Trends&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;-python-bytes-podcast&quot;&gt;🥧 Python Bytes Podcast&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://pythonbytes.fm/episodes/show/434/most-of-openai-s-tech-stack-runs-on-python&quot;&gt;#434 Most of OpenAI’s tech stack runs on Python&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://pythonbytes.fm/episodes/show/435/stop-with-.folders-in-my&quot;&gt;#435 Stop with .folders in my ~/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://pythonbytes.fm/episodes/show/436/slow-tests-go-last&quot;&gt;#436 Slow tests go last&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://pythonbytes.fm/episodes/show/437/python-language-summit-2025-highlights&quot;&gt;#437 Python Language Summit 2025 Highlights&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;-talk-python-to-me&quot;&gt;🦜 Talk Python to me&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://talkpython.fm/episodes/show/507/agentic-ai-workflows-with-langgraph&quot;&gt;#507: Agentic AI Workflows with LangGraph&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://talkpython.fm/episodes/show/508/program-your-own-computer-with-python&quot;&gt;#508: Program Your Own Computer with Python&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://talkpython.fm/episodes/show/509/gpu-programming-in-pure-python&quot;&gt;#509: GPU Programming in Pure Python&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://talkpython.fm/episodes/show/510/10-polars-tools-and-techniques-to-level-up-your-data-science&quot;&gt;#510: 10 Polars Tools and Techniques To Level Up Your Data Science&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://talkpython.fm/episodes/show/511/from-notebooks-to-production-data-science-systems&quot;&gt;#511: From Notebooks to Production Data Science Systems&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;-pybites-podcast&quot;&gt;🍕 Pybites Podcast&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.pybitespodcast.com/1501156/episodes/17226545-192-coding-smarter-not-harder-5-key-ways-to-succeed-as-a-developer&quot;&gt;#192: Coding smarter not harder - 5 key ways to succeed as a developer&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.pybitespodcast.com/1501156/episodes/17363363-193-why-coding-alone-sucks&quot;&gt;#193: Why coding alone sucks!&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;repositories&quot;&gt;Repositories&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/strands-agents/sdk-python&quot;&gt;strands-agents/sdk-python&lt;/a&gt; (Apache-2.0)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Strands Agents is an open source SDK introduced by AWS that simplifies the development of AI agents using a model-driven approach. It enables developers to build and run AI agents in a few lines of code, scaling from simple to complex use cases. Unlike other frameworks requiring complex workflows, Strands leverages the capabilities of advanced models to plan, chain thoughts, call tools, and reflect. You can start exploring the SDK on their &lt;a href=&quot;https://strandsagents.com/&quot;&gt;documentation&lt;/a&gt;.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/bytedance/deer-flow&quot;&gt;bytedance/deer-flow&lt;/a&gt; (MIT)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;code&gt;deer-flow&lt;/code&gt; is a &lt;em&gt;Deep Research&lt;/em&gt; framework by byte-dance team. It aims to combine language models with specialized tools for tasks like web search, crawling, and Python code execution. You can either host your own or try their online demo.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/google-gemini/gemini-cli&quot;&gt;gemini-cli&lt;/a&gt; (Apache-2.0)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Gemini CLI is Google’s answer to Anthropic’s Claude Code and OpenAI’s Codex, but with generous free-tier usage on Gemini-2.5-pro/flash at the moment.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/mongodb/kingfisher&quot;&gt;mongodb/kingfisher&lt;/a&gt; (Apache-2.0)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Originally an internal tool from Mondodb, Kingfisher is an open-source command-line secrets scanner/validator written in Rust which has various built-in rules and runs “blazingly fast”. It provides pre-built binaries for Windows, MacOS and Linux, and you can also build it yourself from the source.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/microsoft/edit&quot;&gt;microsoft/edit&lt;/a&gt; (MIT)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Written in Rust, &lt;code&gt;Edit&lt;/code&gt; is the promised open-source command line editor from Microsoft. It brings classic MS-DOS style UI to both Windows and Linux but also accommodates modern features.&lt;/p&gt;
&lt;h2 id=&quot;have-time-for-some-fun&quot;&gt;Have time for some fun?&lt;/h2&gt;
&lt;h3 id=&quot;call-of-ducy-black-ops-7-continues-the-stories-of-bo-2-and-bo-6&quot;&gt;Call of Ducy: Black Ops 7 continues the stories of BO 2 and BO 6&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://bnetcmsus-a.akamaihd.net/cms/blog_header/7m/7MFT7FOIH3I31749406406524.jpg&quot; alt=&quot;Call of Duty Black Ops 7 Reveal Image&quot;&gt;&lt;/p&gt;
&lt;p&gt;Two Black Ops games in a row! During Xbox Games Showcase 2025, Activision reveals the seventh game in the COD sub-franchise where players will fight as David Mason in futuristic world of year 2035. It is going to launch on PC (Steam, Battle.net, XBOX PC), Xbox Series/One and PlayStation 5/4.&lt;/p&gt;
&lt;h3 id=&quot;007-first-light-is-gonna-tell-the-origin-story-of-james-bond-in-2026&quot;&gt;007 First Light is gonna tell the origin story of James Bond in 2026&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.playstation.com/tachyon/2025/06/5d78650a856871c7fe6dc1d82c0039416452498d.jpg?resize=1088%2C612&amp;amp;crop_strategy=smart&amp;amp;zoom=1&quot; alt=&quot;007 First Light Video Game&quot;&gt;&lt;/p&gt;
&lt;p&gt;IO Interactive, the developer behind &lt;em&gt;Hitman 47&lt;/em&gt; series, announces during &lt;em&gt;State of Play&lt;/em&gt; that their 007 title “007 First Light”, “a thrilling narrative action-adventure game” in third person, is going to be published in 2026. It is expected to be available on all major platforms: PC (Steam / Epic), Xbox Series, PlayStation 5, as well as Nintendo Switch 2.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;As we wrap up this journey together, I want to take a moment to express my gratitude for your reading. If you’ve enjoyed what you just read and would like to help sustain this blog, consider &lt;a href=&quot;https://github.com/blueberry-py/blog/stargazers&quot;&gt;starring this blog on github&lt;/a&gt;, it would be great motivation for me to keep updating the blogs!&lt;/p&gt;
&lt;p&gt;Alright, that concludes the fourth issue of “This Month of Pythonistas”. Thank you again for reading my post. I hope you enjoy it or find something useful, and see you in July!&lt;/p&gt;
</description><pubDate>Mon, 30 Jun 2025 13:00:00 GMT</pubDate><category>python</category><category>python</category><category>cli</category><category>linux</category><category>podcast</category><category>news</category><author>Zeyang Lin</author></item><item><title>This Month for Pythonistas - May 2025</title><link>https://blueberry-py.github.io/blog/post/this-month-for-pythonistas-2025-05/</link><guid isPermaLink="true">https://blueberry-py.github.io/blog/post/this-month-for-pythonistas-2025-05/</guid><description>&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;python&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;from&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; datetime &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;import&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; date&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;print&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(date.today().year, date.today().month)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# 2025 5&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img alt=&quot;issue-2025-05&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1280&quot; height=&quot;720&quot; src=&quot;/blog/_astro/splash.DsyejeID_1PjEdg.webp&quot;&gt;&lt;/p&gt;
&lt;p&gt;Welcome back! I’m glad to see you back reading the third issue of my “This month for Pythonistas” series which curates the news, articles, tutorials and more Python stuff worth noting in this May. This May witnesses several conferences, Python 3.14 Beta 1 &amp;amp; 2, more tooling, and more &lt;em&gt;Agentic&lt;/em&gt; stuff.&lt;/p&gt;
&lt;p&gt;Before we continue, please note that this blog is synced across several platforms:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://blueberry-py.github.io/blog/post/this-month-for-pythonistas-2025-05/&quot;&gt;Github Pages&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://blueberrypy.netlify.app/post/this-month-for-pythonistas-2025-05/&quot;&gt;Netlify&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://blueberrypy.onrender.com/post/this-month-for-pythonistas-2025-05/&quot;&gt;Render&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Ready? Let’s get started!&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&quot;events--social&quot;&gt;Events &amp;amp; Social&lt;/h2&gt;
&lt;h3 id=&quot;pycon-us-2025&quot;&gt;PyCon US 2025&lt;/h3&gt;
&lt;p&gt;(Many of) the video recordings are available on PyCon US YouTube channel.&lt;/p&gt;
&lt;h3 id=&quot;microsoft-build-2025&quot;&gt;Microsoft Build 2025&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Github Copilot Chat Extension for VS Code is going open-source.&lt;/li&gt;
&lt;li&gt;Github Copilot coding agent is in public preview for Copilot Enterprise and Copilot Pro+ users.&lt;/li&gt;
&lt;li&gt;Github Models is integrated at repository level.&lt;/li&gt;
&lt;li&gt;Native MCP support is going to land in Windows 11.&lt;/li&gt;
&lt;li&gt;xAI’s Grok 3 and Grok 3 mini are available via Azure AI Foundry.&lt;/li&gt;
&lt;li&gt;Windows Subsystem for Linux (WSL) is fully open-sourse.&lt;/li&gt;
&lt;li&gt;A command line text editor called “Edit” is coming to Windows 11, and its source code would be available too.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;google-io-2025&quot;&gt;Google I/O 2025&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;New models - Veo 3, Imagen 4, and Flow - are announced.&lt;/li&gt;
&lt;li&gt;Gemma-3n is dedicated to mobile and edge device use cases.&lt;/li&gt;
&lt;li&gt;Project Mariner, Project Astra&lt;/li&gt;
&lt;li&gt;Jules, an asynchronous coding agent, is now in public preview.&lt;/li&gt;
&lt;li&gt;Gemini 2.5 Flash, the fastest version of Gemini, is coming this June.&lt;/li&gt;
&lt;li&gt;Gemini 2.5 is brought to Google Search, the “AI mode” is currently open to users in United States.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;announcing-the-pytorch-docathon-2025&quot;&gt;Announcing the PyTorch Docathon 2025&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://pytorch.org/blog/docathon-2025/&quot;&gt;This docathon&lt;/a&gt; is a hackathon-style event aimed at enhancing PyTorch documentation with the support of the community.&lt;/p&gt;
&lt;h3 id=&quot;python-documentary&quot;&gt;Python Documentary&lt;/h3&gt;
&lt;p&gt;A documentary about Python is coming. It will debut in July at EuroPython 2025 and will be available on YouTube as well.&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;bluesky-python-documentary&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1204&quot; height=&quot;1056&quot; src=&quot;/blog/_astro/bsky_post_py_docu.wpV5-4eM_WT98E.webp&quot;&gt;&lt;/p&gt;
&lt;h2 id=&quot;new-versions&quot;&gt;New versions&lt;/h2&gt;
&lt;h3 id=&quot;python-3140-beta-1-and-beta-2&quot;&gt;Python 3.14.0 beta 1 and beta 2&lt;/h3&gt;
&lt;p&gt;The first and second of four planned beta releases of 3.14 are here! Source code as well as binary distributions can be found &lt;a href=&quot;https://www.python.org/downloads/release/python-3140b1/&quot;&gt;here&lt;/a&gt; and &lt;a href=&quot;https://www.python.org/downloads/release/python-3140b2/&quot;&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&quot;wagtail-70-lts&quot;&gt;wagtail 7.0 LTS&lt;/h3&gt;
&lt;p&gt;This is a major update and the first ever LTS release of Wagtail, which aligns with Django 5.2 LTS.&lt;/p&gt;
&lt;p&gt;For more check their blog post &lt;a href=&quot;https://wagtail.org/blog/wagtail-70/&quot;&gt;Flying into a new era with Wagtail 7.0&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&quot;redis-py-62&quot;&gt;redis-py 6.2&lt;/h3&gt;
&lt;p&gt;This major release happened while Redis 8 is GA and the source code goes back to true open-source. Support for &lt;code&gt;HGETDEL&lt;/code&gt;, &lt;code&gt;HGETEX&lt;/code&gt;, and &lt;code&gt;HSETEX&lt;/code&gt; commands are added. &lt;code&gt;VectorSet&lt;/code&gt; commands are added as experimental features.&lt;/p&gt;
&lt;h2 id=&quot;tutorials&quot;&gt;Tutorials&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;DeepLearning.ai’s &lt;a href=&quot;https://www.deeplearning.ai/short-courses/llms-as-operating-systems-agent-memory/&quot;&gt;LLMs as Operating Systems: Agent Memory&lt;/a&gt; from Letta&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;Learn how to build agentic memory into your applications in this short course, LLMs as Operating Systems: Agent Memory, created in partnership with Letta, and taught by its founders Charles Packer and Sarah Wooders.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ul&gt;
&lt;li&gt;DeepLearning.ai’s &lt;a href=&quot;https://www.deeplearning.ai/short-courses/building-ai-voice-agents-for-production/&quot;&gt;Building AI Voice Agents for Production&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;In this course, you’ll learn how to build voice agents that listen, reason, and respond naturally. You’ll follow the architecture used to create Andrew Avatar, a collaborative project between DeepLearning.AI and RealAvatar that responds to users in Andrew Ng’s voice.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ul&gt;
&lt;li&gt;DeepLearning.ai’s &lt;a href=&quot;https://www.deeplearning.ai/short-courses/mcp-build-rich-context-ai-apps-with-anthropic/&quot;&gt;MCP: Build Rich-Context AI Apps with Anthropic&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;Explore how MCP standardizes access to tools and data for AI applications, its underlying architecture, and how it simplifies the integration of new tools and connections to external systems.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ul&gt;
&lt;li&gt;Deeplearning.ai’s &lt;a href=&quot;https://www.deeplearning.ai/short-courses/reinforcement-fine-tuning-llms-grpo/&quot;&gt;Reinforcement Fine-Tuning LLMs with GRPO&lt;/a&gt; from Predibase&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;In this course, you’ll take a technical deep dive into RFT with GRPO. You’ll learn how to build reward functions that you can use in the GRPO training process to guide an LLM toward better performance on multi-step reasoning tasks.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ul&gt;
&lt;li&gt;HuggingFace’s &lt;a href=&quot;https://huggingface.co/learn/mcp-course/unit0/introduction&quot;&gt;MCP Course&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;In this course, you will:&lt;/p&gt;
&lt;p&gt;📖 Study Model Context Protocol in theory, design, and practice.&lt;/p&gt;
&lt;p&gt;🧑‍💻 Learn to use established MCP SDKs and frameworks.&lt;/p&gt;
&lt;p&gt;💾 Share your projects and explore applications created by the community.&lt;/p&gt;
&lt;p&gt;🏆 Participate in challenges where you will evaluate your MCP implementations against other students’.&lt;/p&gt;
&lt;p&gt;🎓 Earn a certificate of completion by completing assignments.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ul&gt;
&lt;li&gt;RealPython’s &lt;a href=&quot;https://realpython.com/modern-web-automation-with-python-and-selenium/&quot;&gt;Modern Web Automation With Python and Selenium&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This tutorial introduces modern web automation using Python and Selenium, focusing on practical techniques for navigating and interacting with web pages. It explains how to navigate web pages, locate elements within the DOM, and interact with them through clicks, keystrokes, and form submissions.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;RealPython’s &lt;a href=&quot;https://realpython.com/python-uv/&quot;&gt;Managing Python Projects With uv: An All-in-One Solution&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;code&gt;uv&lt;/code&gt; is designed to streamline workflows by providing an all-in-one solution that integrates installation, package management, and environment setup. The guide covers how to install uv using a standalone installer or through other package managers, and demonstrates its use cases in managing complex projects.&lt;/p&gt;
&lt;h2 id=&quot;articles&quot;&gt;Articles&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://peps.python.org/pep-0773/&quot;&gt;PEP 773 – A Python Installation Manager for Windows&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;PEP 773 is &lt;strong&gt;accepted&lt;/strong&gt;. It proposes a new Python installation manager for Windows, called PyManager. The current installation methods for Python on Windows have several limitations and challenges, including mismatched user expectations and unreliability. PyManager aims to address these issues by providing a single, unified installation management tool that can handle multiple Python versions and provide a more streamlined user experience. It will be distributed through both the Windows Store and python.org as an MSIX package.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://peps.python.org/pep-0784/&quot;&gt;PEP 784 – Adding Zstandard to the standard library&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;PEP 784 is &lt;strong&gt;accepted&lt;/strong&gt;. It proposes adding a new module to the Python standard library for Zstandard compression, a widely adopted and highly efficient compression standard. It aims to provide a unified interface for compression modules, reduce user confusion, and enable future additions of new compression formats. The reference implementation is based on the pyzstd project and includes integration with &lt;code&gt;tarfile&lt;/code&gt;, &lt;code&gt;shutil&lt;/code&gt;, and &lt;code&gt;zipfile&lt;/code&gt; modules.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://snarky.ca/unravelling-t-strings/&quot;&gt;Unravelling t-strings&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;T-strings expose the parser used for f-strings, allowing introspection of the parts inside the curly braces. Brett demonstrates how to replicate f-string behavior using Python code to parse and format the components (value, conversion, and format spec) of t-strings. This parsing helps understand how expressions inside f-strings are evaluated and formatted internally.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.llamaindex.ai/blog/python-tooling-at-scale-llamaindex-s-monorepo-overhaul&quot;&gt;Python Tooling at Scale: LlamaIndex’s Monorepo Overhaul&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Llama-index managed to contain 650+ community packages in their monorepo. They migrated away from &lt;code&gt;Poetry&lt;/code&gt; and &lt;code&gt;Pants&lt;/code&gt; to &lt;code&gt;uv&lt;/code&gt; and &lt;code&gt;LlamaDev&lt;/code&gt; for faster, simpler development.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://blog.edward-li.com/tech/comparing-pyrefly-vs-ty/&quot;&gt;Pyrefly vs. ty: Comparing Python’s Two New Rust-Based Type Checkers&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Both &lt;code&gt;pyrefly&lt;/code&gt; and &lt;code&gt;ty&lt;/code&gt; are promising new type checkers that aim to improve the Python type checking experience. While they share some similarities, they have different design goals and philosophies. &lt;code&gt;ty&lt;/code&gt; takes a gradual approach to typing, while &lt;code&gt;pyrefly&lt;/code&gt; is more aggressive in type inference. As both tools are still in early alpha, it will be interesting to see how they evolve in the future.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.zachbellay.com/posts/djangocon-eu-2025/&quot;&gt;Takeaways from DjangoCon EU 2025&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The article summarizes key takeaways from DjangoCon EU 2025 in Dublin, highlighting the community’s enthusiasm and valuable technical insights. Topics include database management techniques such as row locking with select_for_update, moving to BigInt primary keys, and partitioning large tables for performance. It also covers optimization strategies like reducing PostgreSQL index sizes significantly by using partial indexes.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://pytorch.org/blog/pytorch-the-open-language-of-ai/&quot;&gt;PyTorch: The Open Language of AI&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;PyTorch has evolved from a framework focused on AI research to supporting production, deep AI compilation and has become foundational to thousands of projects and companies in the AI ecosystem. The PyTorch Foundation is expanding to be an umbrella organization and will now house some of the most popular and highly complementary projects making it easier for users to build AI at scale.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://labs.quansight.org/blog/free-threaded-one-year-recap&quot;&gt;The first year of free-threaded Python&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The first year of free-threaded Python has seen significant progress in enabling Python to fully utilize multicore CPUs and GPUs by removing the Global Interpreter Lock (GIL). Major packages and tools like NumPy, SciPy, Cython, and setuptools have been updated to support the free-threaded build. While many packages still require auditing and fixes for thread safety, the ecosystem has improved considerably.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://dev.indooroutdoor.io/asyncio-demystified-rebuilding-it-from-scratch-one-yield-at-a-time&quot;&gt;Asyncio Demystified: Rebuilding it From Scratch One Yield at a Time&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The article demystifies &lt;code&gt;asyncio&lt;/code&gt; by rebuilding it from scratch. It starts with a primer on generators and coroutines, explaining how they can pause and resume execution. The article builds a custom event loop, showcasing an echo server example. The goal is to understand how &lt;code&gt;asyncio&lt;/code&gt; works under the hood, removing the “magic” behind asynchronous programming in Python.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://blog.nilenso.com/blog/2025/05/12/mcp-explained-without-hype-or-fluff/&quot;&gt;MCP explained without hype or fluff&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The author shares a concrete example of an MCP server built for accessing CKAN open data, enabling AI applications to explore and analyze government datasets. Despite MCP’s evolving nature and some overhead, its adoption is strong, providing a standardized way to decouple AI clients from platform-specific tools and workflows, valuable for integrations requiring flexibility and breadth.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.reversinglabs.com/blog/mcp-powerful-ai-coding-risk&quot;&gt;MCP is a powerful new AI coding technology: Understand the risks&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;While MCP offers powerful capabilities, it poses significant security risks because it is not secure by default. Experts warn that deploying MCP in production environments without robust safeguards is risky. However, ongoing efforts from industry and security researchers aim to enhance MCP’s security, making it a promising but still maturing technology.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://raz.sh/blog/2025-05-02_a_critical_look_at_mcp&quot;&gt;A Critical Look at MCP&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The author argues that the protocol’s documentation is poorly written, confusing, and glosses over important aspects. The author also criticizes the use of Python and JavaScript for examples, and the complexity of the protocol’s multiple transport modes, including HTTP+SSE and “Streamable HTTP”. It is suggested that WebSockets would be a better choice for transport, and that the protocol’s flexibility introduces security concerns and complexity. The author also mentions alternative protocols, such as ACP and A2A.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.anthropic.com/news/claude-4&quot;&gt;Claude Opus 4 and Claude Sonnet 4&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Claude 4 Opus leads in complex, sustained coding tasks, excelling in memory usage and long-term focus, while Claude 4 Sonnet offers balanced performance and efficiency for everyday use, particularly powering GitHub Copilot. Both models support extended thinking with tool use, improved memory for handling local files, and parallel tool execution.&lt;/p&gt;
&lt;h2 id=&quot;podcasts&quot;&gt;Podcasts&lt;/h2&gt;
&lt;h3 id=&quot;-corepy&quot;&gt;🥝 core.py&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://open.spotify.com/episode/5ZTwjntjAM3230I86ylKgi&quot;&gt;Episode 22: Beta Frenzy&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;djangochat&quot;&gt;DjangoChat&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://djangochat.com/episodes/djangocon-europe-2025-recap&quot;&gt;DjangoCon Europe 2025 Recap&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;-realpython-podcast&quot;&gt;🐍 RealPython Podcast&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://realpython.com/podcasts/rpp/248/&quot;&gt;Episode 248: Experiments With Gen AI, Knowledge Graphs, Workflows, and Python&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://realpython.com/podcasts/rpp/249/&quot;&gt;Episode 249: Going Beyond requirements.txt With pylock.toml and PEP 751&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://realpython.com/podcasts/rpp/250/&quot;&gt;Episode 250: DjangoCon Europe 2025: Live Recording From Dublin&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://realpython.com/podcasts/rpp/251/&quot;&gt;Episode 251: Python Thread Safety &amp;amp; Managing Projects With uv&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;-python-bytes-podcast&quot;&gt;🥧 Python Bytes Podcast&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://pythonbytes.fm/episodes/show/431/nerd-gas&quot;&gt;#431 Nerd Gas&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://pythonbytes.fm/episodes/show/432/how-to-fix-your-computer&quot;&gt;#432 How To Fix Your Computer&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://pythonbytes.fm/episodes/show/433/dev-in-the-arena&quot;&gt;#433 Dev in the Arena&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;-talk-python-to-me&quot;&gt;🦜 Talk Python to me&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://talkpython.fm/episodes/show/504/developer-trends-in-2025&quot;&gt;#504: Developer Trends in 2025&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://talkpython.fm/episodes/show/505/t-strings-in-python-pep-750&quot;&gt;#505: t-strings in Python (PEP 750)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://talkpython.fm/episodes/show/506/ty-astrals-new-type-checker-formerly-red-knot&quot;&gt;#506: ty: Astral’s New Type Checker (Formerly Red-Knot)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;-pybites-podcast&quot;&gt;🍕 Pybites Podcast&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.pybitespodcast.com/1501156/episodes/17100578-189-the-year-of-oui-huy-nguyen-on-connection-community-and-showing-up&quot;&gt;#189: The Year of Oui: Huy Nguyen on Connection, Community and Showing Up&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.pybitespodcast.com/1501156/episodes/16636722-190-the-power-shift-flexa-s-data-driven-energy-revolution&quot;&gt;#190: The power shift - Flexa’s data-driven energy revolution&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.pybitespodcast.com/1501156/episodes/17202534-191-code-click-cloud-how-sebastian-ramirez-is-taking-fastapi-to-the-next-level&quot;&gt;#191: Code, click, cloud - how Sebastián Ramírez is taking FastAPI to the next level&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;repositories&quot;&gt;Repositories&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/facebook/pyrefly&quot;&gt;facebook/pyrefly&lt;/a&gt; (MIT)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;One of the tools I mentioned earlier. &lt;code&gt;pyrefly&lt;/code&gt; is Meta’s brand new type checker for Python at very ealy stage. Read more about it on &lt;a href=&quot;https://engineering.fb.com/2025/05/15/developer-tools/introducing-pyrefly-a-new-type-checker-and-ide-experience-for-python/&quot;&gt;Facebook Engineering&lt;/a&gt;.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/astral-sh/ty&quot;&gt;astral-sh/ty&lt;/a&gt; (MIT)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The other tool I mentioned earlier. Powered by Rust, &lt;code&gt;ty&lt;/code&gt; is Astral’s standalone static type checker for Python but developed as part of &lt;code&gt;ruff&lt;/code&gt;, previously known as “Red-Knot”. It comes with a command-line utility as well as a VS Code extension.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/microsoft/magentic-ui&quot;&gt;microsoft/magentic-ui&lt;/a&gt; (MIT)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Magentic-UI is a &lt;strong&gt;research prototype&lt;/strong&gt; of a human-centered interface powered by a multi-agent system that can browse and perform actions on the web, generate and execute code, and generate and analyze files. Magentic-UI is built using AutoGen and provides a platform to study human-agent interaction and experiment with web agents.&lt;/p&gt;
&lt;h2 id=&quot;have-time-for-some-fun&quot;&gt;Have time for some fun?&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Gears of War: Reloaded Comes to Xbox Series, PlayStation 5 and Steam this August&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&quot;https://xboxwire.thesourcemediaassets.com/sites/2/2025/05/GoW_Reloaded_Keyart_4K-97bf0e7a9de7dc68b771-scaled.jpg&quot; alt=&quot;gears-of-war-reloaded-announced&quot;&gt;&lt;/p&gt;
&lt;p&gt;This is a Remastered version of the first ever game in its franchise, featuring 4K/60FPS in the Campaign with HDR, Dolby Atmos, cross-platform play, etc. Those who own the digital version of Gears of War: Ultimate Edition would receive a free upgrade to Gears of War: Reloaded.&lt;/p&gt;
&lt;p&gt;Read more on &lt;a href=&quot;https://news.xbox.com/en-us/2025/05/05/gears-of-war-reloaded-release-date/&quot;&gt;xbox.com&lt;/a&gt;.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;As we wrap up this journey together, I want to take a moment to express my gratitude for your reading. If you’ve enjoyed what you just read and would like to help sustain this blog, consider &lt;a href=&quot;https://github.com/blueberry-py/blog/stargazers&quot;&gt;starring this blog on github&lt;/a&gt;, it would be great motivation for me to keep updating the blogs!&lt;/p&gt;
&lt;p&gt;Alright, that concludes the third issue of “This Month of Pythonistas”. Thank you again for reading my post. I hope you enjoy it or find something useful, and see you in June!&lt;/p&gt;
</description><pubDate>Fri, 30 May 2025 12:00:00 GMT</pubDate><category>python</category><category>python</category><category>cli</category><category>linux</category><category>podcast</category><category>news</category><author>Zeyang Lin</author></item><item><title>This Month for Pythonistas - April 2025</title><link>https://blueberry-py.github.io/blog/post/this-month-for-pythonistas-2025-04/</link><guid isPermaLink="true">https://blueberry-py.github.io/blog/post/this-month-for-pythonistas-2025-04/</guid><description>&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;python&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;from&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; datetime &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;import&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; date&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;print&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(date.today().year, date.today().month)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# 2025 4&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img alt=&quot;issue-2025-04&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;640&quot; height=&quot;360&quot; src=&quot;/blog/_astro/splash.DZWhiLiw_Z1b2V7X.webp&quot;&gt;&lt;/p&gt;
&lt;p&gt;Welcome back and I’m glad to see you back reading the second issue of my “This month for Pythonistas” series which curates the news, articles, tutorials and more Python stuff worth noting in this April.&lt;/p&gt;
&lt;p&gt;Before we continue, please note that this blog is synced across several platforms:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://blueberry-py.github.io/blog/post/this-month-for-pythonistas-2025-04/&quot;&gt;Github Pages&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://blueberrypy.netlify.app/post/this-month-for-pythonistas-2025-04/&quot;&gt;Netlify&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://blueberrypy.onrender.com/post/this-month-for-pythonistas-2025-04/&quot;&gt;Render&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Ready? Let’s get started!&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&quot;events--social&quot;&gt;Events &amp;amp; Social&lt;/h2&gt;
&lt;h3 id=&quot;djangocon-europe-2025&quot;&gt;DjangoCon Europe 2025&lt;/h3&gt;
&lt;p&gt;Dublin, Ireland is the host city of this year’s DjangoCon Europe, which is held from April 23rd to 27th, 2025.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://2025.djangocon.eu/&quot;&gt;djangocon europe website&lt;/a&gt;&lt;/p&gt;
&lt;h3 id=&quot;europython-2025&quot;&gt;EuroPython 2025&lt;/h3&gt;
&lt;p&gt;EuroPython has announced three more Keynote Speakers: Sebastián Ramírez (Creator os FastAPI, Typer, SQLModel, etc.), &lt;a href=&quot;https://www.linkedin.com/in/drbrettcannon/&quot;&gt;Brett Cannon&lt;/a&gt; (Python Core Developer), and &lt;a href=&quot;https://www.linkedin.com/in/petr-baudis-906a213/&quot;&gt;Petr Baudiš&lt;/a&gt; (co-founder and CTO of Rossum).&lt;/p&gt;
&lt;p&gt;Besides, EuroPython will have a booth at PyCon US this year.&lt;/p&gt;
&lt;h3 id=&quot;microsoft-turns-50&quot;&gt;Microsoft turns 50&lt;/h3&gt;
&lt;p&gt;Like it or not, Microsoft had remarkable influence over the past decades and is still making a big impact right at the moment. In &lt;a href=&quot;https://unlocked.microsoft.com/50th/&quot;&gt;this page&lt;/a&gt; it celebrates its 50th anniversary by looking back at some iconic moments from the history, sharing some stories, and giving out digital goodies.&lt;/p&gt;
&lt;h3 id=&quot;discord-server-for-free-threaded-python&quot;&gt;Discord server for free-threaded Python&lt;/h3&gt;
&lt;p&gt;There is a dedicated place to discuss free-threaded python on &lt;a href=&quot;https://discord.gg/rqgHCDqdRr&quot;&gt;Discord&lt;/a&gt; now.&lt;/p&gt;
&lt;h3 id=&quot;gvr-bdfl--april-fools-&quot;&gt;GvR BDFL (🤡 April Fools 🤡)&lt;/h3&gt;
&lt;p&gt;BREAKING! Guido van Rossum, the legendary creator of Python, has officially &lt;a href=&quot;https://www.youtube.com/watch?v=wgxBHuUOmjA&quot;&gt;reinstated himself as Benevolent Dictator for Life (BDFL)&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;GvR BDFL&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;800&quot; height=&quot;1003&quot; src=&quot;/blog/_astro/gvr_bdfl.IUZh_qOY_Z1Tkcm.webp&quot;&gt;&lt;/p&gt;
&lt;h2 id=&quot;new-versions&quot;&gt;New versions&lt;/h2&gt;
&lt;h3 id=&quot;python-3133--31210&quot;&gt;Python 3.13.3 &amp;amp; 3.12.10&lt;/h3&gt;
&lt;p&gt;It’s another month for Python version updates.&lt;/p&gt;
&lt;p&gt;Python 3.14 Alpha 7 is out, and the first beta release is expected soon.&lt;/p&gt;
&lt;p&gt;Python 3.13 and 3.12 receive bugfix updates:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.python.org/downloads/release/python-3133/&quot;&gt;Python 3.13.3 Downloads and Release Notes&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.python.org/downloads/release/python-31210/&quot;&gt;Python 3.12.10 Downloads and Release Notes&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The following versions receive only security-related fixes and no binary distributions are provided: 3.11.12, 3.10.17 and 3.9.22.&lt;/p&gt;
&lt;h3 id=&quot;visual-studio-code-1990&quot;&gt;Visual Studio Code 1.99.0&lt;/h3&gt;
&lt;p&gt;VS Code joins Claude Desktop and other “AI IDEs”, having &lt;a href=&quot;https://code.visualstudio.com/docs/copilot/chat/chat-agent-mode&quot;&gt;Agent Mode&lt;/a&gt; and &lt;a href=&quot;https://code.visualstudio.com/docs/copilot/chat/mcp-servers&quot;&gt;MCP servers support (Preview)&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;A new open-source and local MCP server is introduced, allowing integration with any LLM tool supporting MCP. Read the details in &lt;a href=&quot;https://github.blog/news-insights/product-news/github-copilot-agent-mode-activated/&quot;&gt;Vibe coding with GitHub Copilot: Agent mode and MCP support rolling out to all VS Code users&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Update: Agent Mode is now officially turned on for everyone.&lt;/p&gt;
&lt;h3 id=&quot;django-52-lts&quot;&gt;Django 5.2 LTS&lt;/h3&gt;
&lt;p&gt;This LTS version introduces new features (Automatic model imports in the shell, Composite primary keys, etc.) and deprecates some functionalities, and it will receive security updates for the next three years at least. Check its &lt;a href=&quot;https://docs.djangoproject.com/en/5.2/releases/5.2/&quot;&gt;release notes&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&quot;pytorch-27&quot;&gt;PyTorch 2.7&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://pytorch.org/blog/pytorch-2-7/&quot;&gt;This release&lt;/a&gt; introduces support for NVIDIA’s new Blackwell GPU architecture and ships pre-built wheels for CUDA 12.8. &lt;code&gt;TorchAudio&lt;/code&gt; is updated to &lt;code&gt;2.7.0&lt;/code&gt; and &lt;code&gt;TorchVision&lt;/code&gt; is &lt;code&gt;0.22.0&lt;/code&gt;.&lt;/p&gt;
&lt;h3 id=&quot;ubuntu-2504-fedora-42-mx-236-and-manjaro-250&quot;&gt;Ubuntu 25.04, Fedora 42, MX 23.6 and Manjaro 25.0&lt;/h3&gt;
&lt;p&gt;It seems like a big month for Linux distros since several popular distro have major/minor updates:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://lists.ubuntu.com/archives/ubuntu-announce/2025-April/000311.html&quot;&gt;Ubuntu 25.04 “Plucky Puffin”&lt;/a&gt; introduces Linux 6.14 kernel, GNOME 48, and offers 9 months of support.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://fedoramagazine.org/announcing-fedora-linux-42/&quot;&gt;Fedora 42&lt;/a&gt; promotes KDE Plasma variation to “Full Edition”.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://mxlinux.org/blog/mx-23-6-now-available/&quot;&gt;MX Linux&lt;/a&gt; is a regular refresh containing bugfixes, kernel updates, and application updates.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://forum.manjaro.org/t/manjaro-25-0-zetar-released/177008&quot;&gt;Manjaro 25.0 “Zetar”&lt;/a&gt; brings various updates to different desktop environment editions.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;tutorials&quot;&gt;Tutorials&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Deeplearning.ai’s &lt;a href=&quot;https://www.deeplearning.ai/short-courses/vibe-coding-101-with-replit/&quot;&gt;Vibe Coding 101 with Replit&lt;/a&gt; from replit&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Take your own discretion on “Vibe Coding” (there’s an article about it below), but here’s a hands-on tutorial on deeplearning.ai.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;You’ll use Replit’s cloud environment— with an integrated code editor, package manager, and deployment tools—to build and deploy two web applications with the help of an AI coding agent. Along the way, you’ll learn strategies for working effectively with agents and improve your development skills in the process.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ul&gt;
&lt;li&gt;Deeplearning.ai’s &lt;a href=&quot;https://www.deeplearning.ai/short-courses/getting-structured-llm-output/&quot;&gt;Getting Structured LLM Output&lt;/a&gt; from DotTxt&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;You’ll gain a fundamental understanding of structured outputs and learn efficient ways to generate outputs in your defined schema or format.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ul&gt;
&lt;li&gt;Deeplearning.ai’s &lt;a href=&quot;https://www.deeplearning.ai/short-courses/building-ai-browser-agents/&quot;&gt;Building AI Browser Agents&lt;/a&gt; from AGI Inc.&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;Learn the fundamentals of autonomous web agents, what they are, how they work, their limitations, and the decision-making strategies taken to optimize their performance.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ul&gt;
&lt;li&gt;Deeplearning.ai’s &lt;a href=&quot;https://www.deeplearning.ai/short-courses/building-code-agents-with-hugging-face-smolagents/&quot;&gt;Building Code Agents with Hugging Face smolagents&lt;/a&gt; from HuggingFace&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;Understand the architecture and benefits of code agents that write code to perform tasks, compare them to traditional tool-calling agents, and learn when to use each approach.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ul&gt;
&lt;li&gt;RealPython’s &lt;a href=&quot;https://realpython.com/python-duckdb/&quot;&gt;Introducing DuckDB&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;The tutorial will equip you with the practical knowledge necessary to get started with DuckDB, including its Online Analytical Processing (OLAP) features, which enable fast access to data through query optimization and buffering.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ul&gt;
&lt;li&gt;freeCodeCamp.org’s &lt;a href=&quot;https://www.youtube.com/watch?v=5avSMc79V-w&quot;&gt;Code DeepSeek V3 From Scratch in Python&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This is a nearly-4-hours Youtube video tutorial brought by freeCodeCamp.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;HuggingFace’s &lt;a href=&quot;https://huggingface.co/learn/agents-course&quot;&gt;Agents Course&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;A series of tutorials introducing various aspects of AI Agents.&lt;/p&gt;
&lt;h2 id=&quot;articles&quot;&gt;Articles&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://davepeck.org/2025/04/11/pythons-new-t-strings/&quot;&gt;Python’s new t-strings&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href=&quot;https://peps.python.org/pep-0750/&quot;&gt;PEP 750 – Template Strings&lt;/a&gt; is &lt;strong&gt;accepted&lt;/strong&gt;. This PEP introduces &lt;em&gt;template strings&lt;/em&gt; which are a generalization of &lt;em&gt;f-strings&lt;/em&gt;. Putting a &lt;code&gt;t&lt;/code&gt; before a string &lt;em&gt;template&lt;/em&gt; would keep it from being evaluated as a normal string but make it an instance of a new type &lt;code&gt;Template&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;In his blog, Dave introduces the motivation behind this PEP and shows how to play with it.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://peps.python.org/pep-0751/&quot;&gt;PEP 751 – A file format to record Python dependencies for installation reproducibility&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;PEP 751 is &lt;strong&gt;accepted&lt;/strong&gt;. This PEP proposes a standard for the format of a file recording the requirements/dependencies of a Python project (ie. a lock file but standardized, agreed across the whole community).&lt;/p&gt;
&lt;p&gt;Update:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;pip&lt;/code&gt; 25.1+ adds experimental &lt;code&gt;pip lock&lt;/code&gt; command:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;pip&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; lock&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; -r&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; .&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;\r&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;equirements.txt&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; --output&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; pylock.toml&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;uv&lt;/code&gt; 0.6.15+ adds support through &lt;code&gt;uv export&lt;/code&gt; command:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;uv&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; export&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; --format&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; pylock.toml&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; --output-file&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; pylock.toml&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;pdm&lt;/code&gt; 2.24+ also supports exporting to &lt;code&gt;pylock.toml&lt;/code&gt;:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;pdm&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; export&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; --format&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; pylock&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; --output&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; pylock.toml&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://thisdavej.com/share-python-scripts-like-a-pro-uv-and-pep-723-for-easy-deployment/&quot;&gt;Share Python Scripts Like a Pro: uv and PEP 723 for Easy Deployment&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;Sharing single-file Python scripts with external dependencies is now easy thanks to &lt;code&gt;uv&lt;/code&gt; and PEP 723, which enable embedding dependency metadata directly within scripts.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://pybit.es/articles/developing-and-testing-python-packages-with-uv/&quot;&gt;Case Study: Developing and Testing Python Packages with uv&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This article highlights the simplicity of initializing a project with &lt;code&gt;uv&lt;/code&gt;, which sets up essential files like &lt;code&gt;pyproject.toml&lt;/code&gt;, &lt;code&gt;README.md&lt;/code&gt;, and folder structures. This allows developers to manage dependencies effortlessly and set up virtual environments. It emphasizes the convenience of editable installations, enabling instant updates to package code without needing reinstallation.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://ai.meta.com/blog/llama-4-multimodal-intelligence/&quot;&gt;The Llama 4 herd: The beginning of a new era of natively multimodal AI innovation&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Meta has introduced Llama 4, its latest suite of multimodal AI models including “Llama 4 Scout” and “Llama 4 Maverick”, offering significant advancements in personalized AI experiences. Both models utilize a mixture-of-experts (MoE) architecture, allowing efficient use of parameters: Maverick has 17 billion active parameters with 128 experts, while Scout offers a remarkable context length of 10 million tokens. “Llama 4 Behemoth”, a larger model with 288 billion parameters, serves as a teacher for the others, enhancing their capabilities.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://developers.googleblog.com/en/agent-development-kit-easy-to-build-multi-agent-applications/&quot;&gt;Agent Development Kit: Making it easy to build multi-agent applications&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&quot;https://storage.googleapis.com/gweb-cloudblog-publish/images/Multi-agent_systems_with_Vertex_.max-2500x2500.jpg&quot; alt=&quot;google-vertex-ai-multi-agent&quot;&gt;&lt;/p&gt;
&lt;p&gt;Google brings its own agent-building solution by announcing open-source framework &lt;strong&gt;Agent Development Kit (ADK)&lt;/strong&gt; at &lt;a href=&quot;https://cloud.withgoogle.com/next/25&quot;&gt;Google Cloud NEXT 2025&lt;/a&gt;, additionally it introduces &lt;a href=&quot;https://developers.googleblog.com/en/a2a-a-new-era-of-agent-interoperability/&quot;&gt;Agent2Agent (A2A) protocol&lt;/a&gt;, &lt;a href=&quot;https://cloud.google.com/vertex-ai/generative-ai/docs/agent-engine/overview&quot;&gt;Agent Engine&lt;/a&gt; as well as &lt;a href=&quot;https://console.cloud.google.com/vertex-ai/agents/agent-garden&quot;&gt;Agent Garden&lt;/a&gt;.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://openai.com/index/gpt-4-1/&quot;&gt;Introducing GPT-4.1 in the API&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;GPT‑4.1, GPT‑4.1 mini, and GPT‑4.1 nano are available through OpenAI’s API service. These new models appear to focus mainly on coding and instruction following.&lt;/p&gt;
&lt;p&gt;Update: They are also available through Github Models.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://openai.com/index/introducing-o3-and-o4-mini/&quot;&gt;Introducing OpenAI o3 and o4-mini&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;OpenAI then release o3 and o4-mini of the o-series models, claiming they are their “smartest” models to date.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://martinfowler.com/articles/exploring-gen-ai.html#memo-13&quot;&gt;The role of developer skills in agentic coding&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This article discusses the role of developer skills in agentic coding with AI assistants. The author categorizes AI missteps into three impact radius: time to commit, team flow, and long-term maintainability. The article emphasizes the need for developer oversight, caution against “good enough” solutions, and the importance of code quality practices and team communication.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://read.highgrowthengineer.com/p/mcps-simply-explained&quot;&gt;MCP (Model Context Protocol): Simply explained in 5 minutes&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&quot;https://substackcdn.com/image/fetch/f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6de5b04a-5e6c-47cf-a81e-e332dd3570df_2906x990.png&quot; alt=&quot;mcp-diagram&quot;&gt;&lt;/p&gt;
&lt;p&gt;Model Context Protocol is a way for LLMs to integrate with external tools. It is useful as it makes LLMs act more like developers. Behind the scenes, providers create MCP-compliant wrappers. Resources for MCP are also provided.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://hardcoresoftware.learningbyshipping.com/p/230-mcp-its-hot-but-will-it-win&quot;&gt;MCP - It’s Hot, But Will It Win?&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;In the author’s point of view, while MCP is popular, its success is uncertain. Middleware like MCP often fails to live up to expectations. It may face issues such as monetization problems if widely adopted or exclusion by a key platform. Vendors may lose interest due to market realities.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://elenacross7.medium.com/%EF%B8%8F-the-s-in-mcp-stands-for-security-91407b33ed6b&quot;&gt;The “S” in MCP stands for Security&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Despite its benefits, such as standardized APIs and persistent sessions, MCP has significant security risks. These risks include potential side-channels into shells, secrets, or infrastructure when agents are connected to arbitrary servers without proper security measures. The author emphasizes the need for better security in MCP to prevent these vulnerabilities.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.newsletter.swirlai.com/p/mcp-vs-a2a-friends-or-foes&quot;&gt;MCP vs. A2A: Friends or Foes?&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;MCP standardizes how applications integrate with large language models (LLMs), while A2A facilitates communication between agents across different systems. Although MCP currently excels in establishing context for LLMs, it lacks essential features like security and task management, which A2A addresses. As both protocols evolve, their roles may intertwine, but A2A appears poised for dominance in inter-agent communication, potentially overshadowing MCP’s relevance in the future.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.blog/open-source/git/git-turns-20-a-qa-with-linus-torvalds/&quot;&gt;Git turns 20: A Q&amp;amp;A with Linus Torvalds&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&quot;https://github.blog/wp-content/uploads/2025/04/GitTurns20_BlogHeader_001-2.png?w=1600&quot; alt=&quot;git-turns-twenty&quot;&gt;&lt;/p&gt;
&lt;p&gt;To celebrate two decades of Git, the author sat down with Linus himself to revisit those early days, explore the key design decisions behind Git’s lasting success, and discuss how it forever changed software development. The full video interview is also included in the blog.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://nmn.gl/blog/dangers-vibe-coding&quot;&gt;Karpathy’s ‘Vibe Coding’ Movement Considered Harmful&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The author argues that Karpathy’s “vibe coding” is harmful. It leads to hidden costs, exponential technical debt, and security risks. A better approach is to use AI with a clear vision, break down AI-generated code, provide context, test thoroughly, and review code to maintain understanding.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://huggingface.co/blog/train-reranker&quot;&gt;Training and Finetuning Reranker Models with Sentence Transformers v4&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;In this blogpost, the author shows how to use sentence-transformers to finetune a reranker model that beats all existing options on exactly your data. This method can also train extremely strong new reranker models from scratch.&lt;/p&gt;
&lt;h2 id=&quot;podcasts&quot;&gt;Podcasts&lt;/h2&gt;
&lt;h3 id=&quot;-corepy&quot;&gt;🥝 core.py&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://open.spotify.com/episode/6UTlYsa61miMc9vwCaAyWm&quot;&gt;Episode 21: A Garbage Episode&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;-realpython-podcast&quot;&gt;🐍 RealPython Podcast&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://realpython.com/podcasts/rpp/245/&quot;&gt;Episode 245: GUIs &amp;amp; TUIs: Choosing a User Interface for Your Python Project&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://realpython.com/podcasts/rpp/246/&quot;&gt;Episode 246: Learning Intermediate Python With a Deep Dive Course&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://realpython.com/podcasts/rpp/247/&quot;&gt;Episode 247: Exploring DuckDB &amp;amp; Comparing Python Expressions vs Statements&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;-python-bytes-podcast&quot;&gt;🥧 Python Bytes Podcast&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://pythonbytes.fm/episodes/show/426/committing-to-formatted-markdown&quot;&gt;#426 Committing to Formatted Markdown&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://pythonbytes.fm/episodes/show/427/rise-of-the-python-lord&quot;&gt;#427 Rise of the Python Lord&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://pythonbytes.fm/episodes/show/428/how-old-is-your-python&quot;&gt;#428 How old is your Python?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://pythonbytes.fm/episodes/show/429/nitpicking-python&quot;&gt;#429 Nitpicking Python&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://pythonbytes.fm/episodes/show/430/or-you-go-to-jail&quot;&gt;#430 Or you go to jail&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;-talk-python-to-me&quot;&gt;🦜 Talk Python to me&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://talkpython.fm/episodes/show/499/beeware-and-the-state-of-python-on-mobile&quot;&gt;#499: BeeWare and the State of Python on Mobile&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://talkpython.fm/episodes/show/500/django-simple-deploy-and-other-devops-things&quot;&gt;#500: Django Simple Deploy and other DevOps Things&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://talkpython.fm/episodes/show/501/marimo-reactive-notebooks-for-python&quot;&gt;#501: Marimo - Reactive Notebooks for Python&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://talkpython.fm/episodes/show/502/django-ledger-accounting-with-python&quot;&gt;#502: Django Ledger: Accounting with Python&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://talkpython.fm/episodes/show/503/the-pyarrow-revolution&quot;&gt;#503: The PyArrow Revolution&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;-pybites-podcast&quot;&gt;🍕 Pybites Podcast&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.pybitespodcast.com/1501156/episodes/16903500-185-expanding-the-world-of-pybites-with-cohort-coaching-book-platforms-and-more&quot;&gt;#185: Expanding the world of Pybites with cohort coaching, book platforms and more!&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.pybitespodcast.com/1501156/episodes/16944372-186-rethinking-the-art-of-coding&quot;&gt;#186: Rethinking the art of coding&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.pybitespodcast.com/1501156/episodes/16974259-187-beyond-the-resume-how-to-stand-out-in-the-competitive-world-of-tech&quot;&gt;#187: Beyond the resume - how to stand out in the competitive world of tech&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.pybitespodcast.com/1501156/episodes/17013337-188-career-crossroads-navigating-the-path-to-job-fulfillment&quot;&gt;#188: Career crossroads - navigating the path to job fulfillment&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;repositories&quot;&gt;Repositories&lt;/h2&gt;
&lt;h3 id=&quot;googleadk-python-apache-20&quot;&gt;&lt;code&gt;google/adk-python&lt;/code&gt; (Apache-2.0)&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/google/adk-python&quot;&gt;source&lt;/a&gt;&lt;/p&gt;
&lt;h3 id=&quot;awslabsmcp-apache-20&quot;&gt;&lt;code&gt;awslabs/mcp&lt;/code&gt; (Apache-2.0)&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/awslabs/mcp&quot;&gt;source&lt;/a&gt;&lt;/p&gt;
&lt;h3 id=&quot;github-mcp-server-mit&quot;&gt;&lt;code&gt;github-mcp-server&lt;/code&gt; (MIT)&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://github.com/user-attachments/assets/a2926942-1c3d-4f95-bb73-861d8003aecb&quot; alt=&quot;github-mcp-server&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/github/github-mcp-server&quot;&gt;source&lt;/a&gt;&lt;/p&gt;
&lt;h3 id=&quot;internvl3-78b&quot;&gt;&lt;code&gt;InternVL3-78B&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://huggingface.co/OpenGVLab/InternVL3-78B&quot;&gt;source&lt;/a&gt;&lt;/p&gt;
&lt;h3 id=&quot;moonshotaikimi-vl-a3b-thinking&quot;&gt;&lt;code&gt;moonshotai/Kimi-VL-A3B-Thinking&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://huggingface.co/moonshotai/Kimi-VL-A3B-Thinking&quot;&gt;source&lt;/a&gt;&lt;/p&gt;
&lt;h3 id=&quot;thudmglm-z1-32b-0414&quot;&gt;&lt;code&gt;THUDM/GLM-Z1-32B-0414&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://huggingface.co/THUDM/GLM-Z1-32B-0414&quot;&gt;source&lt;/a&gt;&lt;/p&gt;
&lt;h3 id=&quot;qwen-3&quot;&gt;&lt;code&gt;Qwen 3&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://huggingface.co/Qwen/Qwen3-235B-A22B&quot;&gt;source&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&quot;have-time-for-some-fun&quot;&gt;Have time for some fun?&lt;/h2&gt;
&lt;h3 id=&quot;nintendo-switch-2-has-a-launch-date&quot;&gt;Nintendo Switch 2 has a launch date&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://assets-prd.ignimgs.com/2025/01/16/screenshot-161-1737034377908.png&quot; alt=&quot;nintendo-switch-2&quot;&gt;&lt;/p&gt;
&lt;p&gt;Nintendo reveals in their “Direct” livestream event that Switch 2 is available on June 5th, 2025 worldwide with starting price ~$449.99 outside Japan (multi-language version) and a much lower price inside Japan (Japanese-only version). Read more about it on their &lt;a href=&quot;https://www.nintendo.com/us/gaming-systems/switch-2/&quot;&gt;official website&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&quot;clair-obscur-expedition-33-sets-sail-on-april-24th&quot;&gt;Clair Obscur: Expedition 33 sets sail on April 24th&lt;/h3&gt;
&lt;p&gt;In this dark fantasy RPG inspired by JRPG and Soul-like games and made by a small French team “Sandfall Interactive”, players will explore the mysterious city of Lumière and engage in immersive turn-based battles with unique mechanics. After playing it for around 30 hours I must say I really enjoyed the visual style and the rewarding action part in the battles. Check their &lt;a href=&quot;https://www.expedition33.com/&quot;&gt;official website&lt;/a&gt; for more info.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;Alright, that concludes the second issue of “This Month of Pythonistas”. Thank you again for reading my post. I hope you enjoy it or find something useful, and see you in May!&lt;/p&gt;
</description><pubDate>Wed, 30 Apr 2025 07:00:00 GMT</pubDate><category>python</category><category>python</category><category>cli</category><category>linux</category><category>windows</category><category>news</category><author>Zeyang Lin</author></item><item><title>This Month for Pythonistas - March 2025</title><link>https://blueberry-py.github.io/blog/post/this-month-for-pythonistas-2025-03/</link><guid isPermaLink="true">https://blueberry-py.github.io/blog/post/this-month-for-pythonistas-2025-03/</guid><description>&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;python&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;from&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; datetime &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;import&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; date&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;print&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(date.today().year, date.today().month)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# 2025 3&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img alt=&quot;issue-2025-03&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;640&quot; height=&quot;360&quot; src=&quot;/blog/_astro/splash.CdmkBjaR_Z14zl9n.webp&quot;&gt;&lt;/p&gt;
&lt;p&gt;Welcome and thank you for reading &lt;strong&gt;This Month for Pythonistas&lt;/strong&gt;, a monthly update dedicated to Python developers, professionals, and hobbyists.&lt;/p&gt;
&lt;p&gt;In this &lt;em&gt;inaugural&lt;/em&gt; issue, I would like to compile a list of news, articles, repositories, and tools worth noting in March 2025, as well as other fun stuff that may not necessarily be bound to Python community.&lt;/p&gt;
&lt;p&gt;Before we continue, please note that this blog is synced across several platforms:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://blueberry-py.github.io/blog/post/this-month-for-pythonistas-2025-03/&quot;&gt;Github Pages&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://blueberrypy.netlify.app/post/this-month-for-pythonistas-2025-03/&quot;&gt;Netlify&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://blueberrypy.onrender.com/post/this-month-for-pythonistas-2025-03/&quot;&gt;Render&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Ready? Let’s get started!&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&quot;events--social&quot;&gt;Events &amp;amp; Social&lt;/h2&gt;
&lt;h3 id=&quot;europython-2025-updates&quot;&gt;EuroPython 2025 Updates&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://ep2025.europython.eu/&quot;&gt;EuroPython 2025&lt;/a&gt; stays in Prague, Czech Republic (which makes Prague the host city three years in a row!), and the ticket sales start this month.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.europython.eu/content/images/2025/03/savannah-2.svg&quot; alt=&quot;europython-2025-keynote-speaker&quot;&gt;&lt;/p&gt;
&lt;p&gt;Python Core Developer &lt;a href=&quot;https://www.linkedin.com/in/savannahostrowski/&quot;&gt;Savannah Ostrowski&lt;/a&gt; is going to be one of the keynote speakers this year.&lt;/p&gt;
&lt;p&gt;Get to know more in their &lt;a href=&quot;https://blog.europython.eu/keynote-ticket-sales-announcement/&quot;&gt;blog&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&quot;new-versions&quot;&gt;New versions&lt;/h2&gt;
&lt;h3 id=&quot;ipython-902&quot;&gt;&lt;code&gt;ipython&lt;/code&gt; 9.0.2&lt;/h3&gt;
&lt;p&gt;The first major version update in three years! Check it out on &lt;a href=&quot;https://pypi.org/project/ipython/9.0.2/&quot;&gt;pypi&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&quot;dify-v113&quot;&gt;&lt;code&gt;dify&lt;/code&gt; v1.1.3&lt;/h3&gt;
&lt;p&gt;This major update (v1) brings a plugin system, a new Agent node in workflow, “Extenstion”, “Dify Marketplace”, and more!&lt;/p&gt;
&lt;p&gt;Check this particular release on &lt;a href=&quot;https://github.com/langgenius/dify/releases/tag/1.1.3&quot;&gt;github&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&quot;tutorials&quot;&gt;Tutorials&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Deeplearning.ai’s &lt;a href=&quot;https://www.deeplearning.ai/short-courses/event-driven-agentic-document-workflows/&quot;&gt;Event-Driven Agentic Document Workflows&lt;/a&gt; from LlamaIndex&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;Build an event-driven agentic workflow that parses forms, retrieves relevant information from a source document using RAG, and returns answers to the form’s fields as structured outputs.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ul&gt;
&lt;li&gt;Deeplearning.ai’s &lt;a href=&quot;https://www.deeplearning.ai/short-courses/long-term-agentic-memory-with-langgraph/&quot;&gt;Long-Term Agentic Memory with LangGraph&lt;/a&gt; from LangChain&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;Build a personal email agent with routing, writing, scheduling tools to automatically ignore, respond to, or notify about incoming emails.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ul&gt;
&lt;li&gt;RealPython’s &lt;a href=&quot;https://realpython.com/langgraph-python/&quot;&gt;LangGraph: Build Stateful AI Agents in Python&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Here is another tutorial regarding &lt;code&gt;LangGraph&lt;/code&gt;.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Explore the full tutorial to gain hands-on experience with LangGraph, including setting up workflows and building a LangGraph agent that can autonomously parse emails, send emails, and interact with API services.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ul&gt;
&lt;li&gt;RealPython’s &lt;a href=&quot;https://realpython.com/instance-class-and-static-methods-demystified/&quot;&gt;Python’s Instance, Class, and Static Methods Demystified&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;Instance, class, and static methods each serve a distinct role in Python, and knowing when to use one over another is key to writing clean, maintainable code. Instance methods operate on individual objects using self, while class methods use cls to access class-level data. Static methods, on the other hand, provide organizational structure without relying on class or instance state.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ul&gt;
&lt;li&gt;RealPython’s &lt;a href=&quot;https://realpython.com/python-code-quality/&quot;&gt;Python Code Quality: Best Practices and Tools&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;In this tutorial, you’ll learn about code quality and the key factors that make Python code high-quality. You’ll explore effective strategies, powerful tools, and best practices to elevate your code to the next level.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;articles&quot;&gt;Articles&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://blog.nelhage.com/post/cpython-tail-call/&quot;&gt;Performance of the Python 3.14 tail-call interpreter&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The CPython project’s new tail-call interpreter initially showed a 10 - 15% performance boost. However, the author found this was mainly due to an LLVM 19 regression. When benchmarked against better baselines, the gain dropped to 1 - 5%. The LLVM 19 regression affected the bytecode interpreter’s optimization. Also, the “computed goto” approach might be unnecessary for modern Clang.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://openai.com/index/new-tools-for-building-agents/&quot;&gt;New tools for building agents&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;OpenAI introduces their new approach on building agents systems: the new Responses API which would replace Assistants API, a new Python SDK as a agents framework, and more.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://blog.google/technology/developers/gemma-3/&quot;&gt;Google’s Gemma 3&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&quot;https://storage.googleapis.com/gweb-uniblog-publish-prod/images/Gemma3_KeywordBlog_RD3_V01b.width-2200.format-webp.webp&quot; alt=&quot;gemma-3&quot;&gt;&lt;/p&gt;
&lt;p&gt;Latest iteration of Google’s open-weight LLM includes four sizes from small to medium: 1B, 4B, 12B, and 27B. Here’s the &lt;a href=&quot;https://storage.googleapis.com/deepmind-media/gemma/Gemma3Report.pdf&quot;&gt;technical report&lt;/a&gt;.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://mistral.ai/news/mistral-small-3-1&quot;&gt;Mistral Small 3.1&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Mistral releases its newest “small” (24B) multi-modal, multilingual LLM, claiming it “outperforms comparable models like Gemma 3 and GPT-4o Mini, while delivering inference speeds of 150 tokens per second”.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://cms.mistral.ai/assets/1977a3f1-eae3-4eed-b2c7-e1701c4692ed.png?width=1988&amp;amp;height=1050&quot; alt=&quot;mistral-small-3.1-performance&quot;&gt;&lt;/p&gt;
&lt;p&gt;Its “instruct” variation’s weight is obtainable from &lt;a href=&quot;https://huggingface.co/mistralai/Mistral-Small-3.1-24B-Instruct-2503&quot;&gt;HuggingFace&lt;/a&gt;.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://a16z.com/a-deep-dive-into-mcp-and-the-future-of-ai-tooling/&quot;&gt;A Deep Dive Into MCP and the Future of AI Tooling&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&quot;https://d1lamhf6l6yk6d.cloudfront.net/uploads/2025/03/250319-MCP-x2000.png&quot; alt=&quot;model-context-protocol&quot;&gt;&lt;/p&gt;
&lt;p&gt;This article delves into the Model Context Protocol (MCP), an open protocol aiming to standardize AI model interactions with tools. Inspired by LSP, MCP supports autonomous AI workflows and human-in-the-loop operations. It has various use cases in dev-centric workflows and net-new experiences. However, the MCP ecosystem is in its early stage, facing challenges like authentication, authorization, and server discoverability. If these issues are resolved, MCP could reshape AI-tool interactions, leading to new pricing models, hosting modes, and a shift in tool development and consumption.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.microsoft.com/en-us/research/blog/introducing-kblam-bringing-plug-and-play-external-knowledge-to-llms/&quot;&gt;Introducing KBLaM: Bringing plug-and-play external knowledge to LLMs&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&quot;https://www.microsoft.com/en-us/research/wp-content/uploads/2025/03/KBLaM-BlogHeroFeature-1400x788-1-1.png&quot; alt=&quot;kblam-diagram&quot;&gt;&lt;/p&gt;
&lt;p&gt;KBLaM is a new approach to integrate structured knowledge bases into pre-trained LLMs. Traditional methods like fine-tuning and RAG have drawbacks, and in-context learning has computational issues. KBLaM converts knowledge bases into continuous key-value vector pairs and uses rectangular attention for efficient integration. It’s scalable, with linear cost and dynamic updates. KBLaM also enhances interpretability and reliability, reducing hallucinations. It paves the way for more reliable AI systems in critical fields.&lt;/p&gt;
&lt;h2 id=&quot;podcasts&quot;&gt;Podcasts&lt;/h2&gt;
&lt;h3 id=&quot;-corepy&quot;&gt;🥝 core.py&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://open.spotify.com/episode/3SSIu0lvHD1jT8m23VSBFB&quot;&gt;Episode 19: Async hacks, unicorns and velociraptors&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://open.spotify.com/episode/4tB8m8DyUv6PDR1DvVJFKd&quot;&gt;Episode 20: Remote Code Execution By Design&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;-realpython-podcast&quot;&gt;🐍 RealPython Podcast&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://realpython.com/podcasts/rpp/241/&quot;&gt;Episode 241: Deciphering Python Jargon &amp;amp; Compiling Python 1.0&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://realpython.com/podcasts/rpp/242/&quot;&gt;Episode 242: Eric Matthes: Maybe Don’t Start With Unit Tests&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://realpython.com/podcasts/rpp/243/&quot;&gt;Episode 243: Manage Projects With pyproject.toml &amp;amp; Explore Polars LazyFrames&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://realpython.com/podcasts/rpp/244/&quot;&gt;Episode 244: A Decade of Automating the Boring Stuff With Python&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;-python-bytes-podcast&quot;&gt;🥧 Python Bytes Podcast&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://pythonbytes.fm/episodes/show/422/you-need-4-spaces&quot;&gt;#422 You need 4 spaces&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://pythonbytes.fm/episodes/show/423/traveling-the-python-universe&quot;&gt;#423 Traveling the Python Universe&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://pythonbytes.fm/episodes/show/424/we-will-test-in-production&quot;&gt;#424 We Will Test in Production&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://pythonbytes.fm/episodes/show/425/if-you-were-a-klingon-programmer&quot;&gt;#425 If You Were a Klingon Programmer&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;-talk-python-to-me&quot;&gt;🦜 Talk Python to me&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://talkpython.fm/episodes/show/496/scaf-complete-blueprint-for-new-python-kubernetes-projects&quot;&gt;#496: Scaf: Complete blueprint for new Python Kubernetes projects&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://talkpython.fm/episodes/show/497/outlier-detection-with-python&quot;&gt;#497: Outlier Detection with Python&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://talkpython.fm/episodes/show/498/algorithms-for-high-performance-terminal-apps&quot;&gt;#498: Algorithms for high performance terminal apps&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;-pybites-podcast&quot;&gt;🍕 Pybites Podcast&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.pybitespodcast.com/1501156/episodes/16730593-183-ai-s-silent-takeover-are-we-losing-our-programming-skills&quot;&gt;#183: AI’s silent takeover - are we losing our programming skills?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.pybitespodcast.com/1501156/episodes/16755254-184-the-pathway-to-success-how-an-open-mind-can-lead-to-your-dream-job&quot;&gt;#184: The pathway to success - how an open mind can lead to your dream job&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;tools&quot;&gt;Tools&lt;/h2&gt;
&lt;h3 id=&quot;warp-on-windows&quot;&gt;Warp on Windows&lt;/h3&gt;
&lt;p&gt;Warp is one of my favorite new toys in year 2024, and now it comes to Windows platform. Check their &lt;a href=&quot;https://www.warp.dev/blog/launching-warp-on-windows&quot;&gt;blog&lt;/a&gt;!&lt;/p&gt;
&lt;h3 id=&quot;cherry-studio-1110&quot;&gt;Cherry Studio 1.1.10&lt;/h3&gt;
&lt;p&gt;Cherry Studio catches quite a lot of eyes recently, and it just reaches 1.0 not too long ago. &lt;a href=&quot;https://cherry-ai.com/download&quot;&gt;official download&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&quot;repositories&quot;&gt;Repositories&lt;/h2&gt;
&lt;h3 id=&quot;lmstudio-python-mit&quot;&gt;&lt;code&gt;lmstudio-python&lt;/code&gt; (MIT)&lt;/h3&gt;
&lt;p&gt;I personally have been using &lt;a href=&quot;https://lmstudio.ai/&quot;&gt;LM Studio&lt;/a&gt; for roughly one year, and this &lt;code&gt;lmstudio-python&lt;/code&gt; (alongside lmstudio-js for JavaScript) is their official SDK with which you can easily manage the models, conversations and more using pure Python code. They have documentations too: &lt;a href=&quot;https://lmstudio.ai/docs/python&quot;&gt;docs&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The source code is hosted on &lt;a href=&quot;https://github.com/lmstudio-ai/lmstudio-python&quot;&gt;github&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&quot;openai-agents-python-mit&quot;&gt;&lt;code&gt;openai-agents-python&lt;/code&gt; (MIT)&lt;/h3&gt;
&lt;p&gt;OpenAI’s latest contribution to open-source includes this framework for creating multi-agent workflows. This is also among the new toys from OpenAI which I mentioned earlier in this issue.&lt;/p&gt;
&lt;p&gt;The source code is on &lt;a href=&quot;https://github.com/openai/openai-agents-python&quot;&gt;github&lt;/a&gt;, and the &lt;a href=&quot;https://openai.github.io/openai-agents-python/&quot;&gt;documentation&lt;/a&gt; too.&lt;/p&gt;
&lt;p&gt;Update: The Agents SDK has support for MCP, which means you can now &lt;a href=&quot;https://openai.github.io/openai-agents-python/mcp/&quot;&gt;connect MCP servers to Agents&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&quot;smolagents-apache-20&quot;&gt;&lt;code&gt;smolagents&lt;/code&gt; (Apache-2.0)&lt;/h3&gt;
&lt;p&gt;Another light-weight (“smol”) framework which helps you build AI agents, brought by the HuggingFace team.&lt;/p&gt;
&lt;p&gt;Here’s the &lt;a href=&quot;https://github.com/huggingface/smolagents&quot;&gt;repostitory&lt;/a&gt;&lt;/p&gt;
&lt;h3 id=&quot;deepseek-v3-0324&quot;&gt;&lt;code&gt;DeepSeek-V3-0324&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;The is an updated version of V3, released just this March. The weights can be found on &lt;a href=&quot;https://huggingface.co/deepseek-ai/DeepSeek-V3-0324&quot;&gt;HuggingFace&lt;/a&gt;&lt;/p&gt;
&lt;h3 id=&quot;qwen25-omni-7b&quot;&gt;&lt;code&gt;Qwen2.5-Omni-7B&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;Qwen team has released &lt;em&gt;their&lt;/em&gt; version of “omni” model on &lt;a href=&quot;https://huggingface.co/Qwen/Qwen2.5-Omni-7B&quot;&gt;HuggingFace&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&quot;have-time-for-some-fun&quot;&gt;Have time for some fun?&lt;/h2&gt;
&lt;h3 id=&quot;command--conquer-games-go-open-source&quot;&gt;Command &amp;amp; Conquer games go open-source&lt;/h3&gt;
&lt;p&gt;Despite their infamous and disastrous management on this beloved franchise, EA chose to open-source some of the classic C&amp;amp;C games on github, potentially enriching the Modding community support.&lt;/p&gt;
&lt;p&gt;Here are the repositories (Mostly C++, plus some C, Assembly and others; under GNU GPL v3):&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/electronicarts/CnC_Tiberian_Dawn&quot;&gt;Tiberian Dawn (1995)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/electronicarts/CnC_Red_Alert&quot;&gt;Red Alert (1996)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/electronicarts/CnC_Renegade&quot;&gt;Renegade (2002)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/electronicarts/CnC_Generals_Zero_Hour&quot;&gt;Generals (2003) and Generals: Zero Hour (2003)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;death-stranding-2-on-the-beach-finally-has-a-launch-date&quot;&gt;Death Stranding 2: On the Beach (finally) has a launch date&lt;/h3&gt;
&lt;p&gt;It would be on the shelves on June 26th (or 24th for Deluxe Edition owners), 2025 for Playstation only (… for a while at least), and the pre-order starts March 17th.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.playstation.com/tachyon/2025/03/39b76949d94b8c18a90f34664c1ff989b8afee67-scaled.jpg?fit=1024%2C576&amp;amp;zoom=1&quot; alt=&quot;death-stranding-2-digital-standard-edition&quot;&gt;&lt;/p&gt;
&lt;p&gt;The price starts from 69.99 USD, 79.99 EUR, 568 HKD or 8,980 JPY.&lt;/p&gt;
&lt;p&gt;More details can be found in this &lt;a href=&quot;https://blog.playstation.com/2025/03/09/death-stranding-2-on-the-beach-launches-june-26-collectors-edition-revealed/&quot;&gt;playstation blog&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&quot;starcraft-goes-to-tabletop&quot;&gt;StarCraft goes to tabletop&lt;/h3&gt;
&lt;p&gt;In their &lt;a href=&quot;https://archon-studio.com/blog/starcraft-tmg/starcraft-tabletop-miniatures-game-announcement&quot;&gt;blog&lt;/a&gt;, Archon Studio announced an official partnership with Blizzard Entertainment, launching a StarCraft tabletop miniatures game in 2026, followed by board games set in the StarCraft universe in 2027.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://archon-studio.com/files/scaled-thumbs/Blog/starcraft-tabletop-miniatures-game-announcement/SC%201x1%20announcement.png/1200_1200.webp&quot; alt=&quot;starcraft-miniatures&quot;&gt;&lt;/p&gt;
&lt;p&gt;More details, like miniature previews and gameplay mechanics, will be revealed later in 2025.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;Alright, that concludes the very first issue of “This Month of Pythonistas”. Thank you again for reading my post. I hope you enjoy it or find something useful, and see you in April!&lt;/p&gt;
</description><pubDate>Mon, 31 Mar 2025 07:00:00 GMT</pubDate><category>python</category><category>python</category><category>cli</category><category>linux</category><category>windows</category><category>news</category><author>Zeyang Lin</author></item><item><title>[one-liner] Install Ollama</title><link>https://blueberry-py.github.io/blog/post/one-liner-ollama/</link><guid isPermaLink="true">https://blueberry-py.github.io/blog/post/one-liner-ollama/</guid><description>&lt;h2 id=&quot;one-liner-series-ollama&quot;&gt;One-Liner series: Ollama&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://ollama.com/download&quot;&gt;source: ollama.com&lt;/a&gt;&lt;/p&gt;
&lt;h3 id=&quot;install-on-ubuntu&quot;&gt;Install on Ubuntu&lt;/h3&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;curl&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; -fsSL&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; https://ollama.com/install.sh&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; |&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; sudo&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; sh&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h4 id=&quot;install-a-specific-version&quot;&gt;Install a specific version&lt;/h4&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;curl&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; -fsSL&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; https://ollama.com/install.sh&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; |&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; OLLAMA_VERSION&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;0.2.5&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; sudo&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; sh&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h4 id=&quot;alternative-source-possibly-not-up-to-date-with-offical-release&quot;&gt;Alternative source (possibly not up-to-date with offical release)&lt;/h4&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;pip&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; install&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; modelscope&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;modelscope&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; download&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; --model=modelscope/ollama-linux&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; --local_dir&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; ./ollama-linux&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;cd&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; ollama-linux&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;chmod&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; +x&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; ./ollama-modelscope-install.sh&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;./ollama-modelscope-install.sh&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;`&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;update-on-ubuntu&quot;&gt;Update on Ubuntu&lt;/h3&gt;
&lt;p&gt;Run the same command as above&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;curl&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; -fsSL&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; https://ollama.com/install.sh&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; |&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; sudo&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; sh&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;uninstall-on-ubuntu&quot;&gt;Uninstall on Ubuntu&lt;/h3&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;sudo&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; systemctl&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; stop&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; ollama&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;sudo&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; systemctl&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; disable&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; ollama&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;sudo&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; rm&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; /etc/systemd/system/ollama.service&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;sudo&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; rm&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; $(&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;which&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; ollama&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;sudo&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; rm&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; -r&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; /usr/share/ollama&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;sudo&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; userdel&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; ollama&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;sudo&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; groupdel&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; ollama&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
</description><pubDate>Wed, 17 Jul 2024 05:33:41 GMT</pubDate><category>llm</category><category>AI</category><category>linux</category><category>ollama</category><category>AI</category><category>Llama</category><category>llm</category><category>linux</category><category>ubuntu</category><author>Zeyang Lin</author></item><item><title>UV is the latest attempt to rule All Python tools</title><link>https://blueberry-py.github.io/blog/post/uv-is-latest-attempt-to-rule-them-all/</link><guid isPermaLink="true">https://blueberry-py.github.io/blog/post/uv-is-latest-attempt-to-rule-them-all/</guid><description>&lt;p&gt;In short, &lt;a href=&quot;https://github.com/astral-sh/uv&quot;&gt;&lt;code&gt;uv&lt;/code&gt;&lt;/a&gt; is a command line tool written in &lt;a href=&quot;https://www.rust-lang.org/&quot;&gt;&lt;code&gt;Rust&lt;/code&gt;&lt;/a&gt; for &lt;code&gt;Python&lt;/code&gt; developers, which aims to be &lt;em&gt;“a comprehensive project and package manager that is extremely fast, reliable, and easy to use”&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;If you are still interested, I hope you can spend a couple of minutes so that I can give you a quick tour of it.&lt;/p&gt;
&lt;h2 id=&quot;quick-fact-sheet&quot;&gt;Quick fact sheet&lt;/h2&gt;
&lt;p&gt;language: Rust&lt;/p&gt;
&lt;p&gt;version: 0.1.13 (at the time of updating this post)&lt;/p&gt;
&lt;p&gt;repo: &lt;a href=&quot;https://github.com/astral-sh/uv&quot;&gt;github&lt;/a&gt; (6k stars)&lt;/p&gt;
&lt;p&gt;pypi: &lt;a href=&quot;https://pypi.org/project/uv/&quot;&gt;pypi&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;docs: N/A&lt;/p&gt;
&lt;p&gt;supported python versions: 3.8 through 3.12 (inclusive)&lt;/p&gt;
&lt;p&gt;supported os: Windows, Linux, MacOS&lt;/p&gt;
&lt;h2 id=&quot;drop-in-replacement-for-pip-and-more&quot;&gt;Drop-in replacement for pip and more&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;uv&lt;/code&gt; is from the creator of &lt;a href=&quot;https://github.com/astral-sh/ruff&quot;&gt;&lt;code&gt;ruff&lt;/code&gt;&lt;/a&gt;, &lt;a href=&quot;https://github.com/charliermarsh&quot;&gt;Charlie Marsh&lt;/a&gt; and &lt;a href=&quot;https://github.com/astral-sh/&quot;&gt;astralsh&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;ruff&lt;/code&gt;, the linting and formating tool written is Rust as well, has already gain fame and popularity during the past year or so, and I believe many of Python developers have been using it for quite a while.&lt;/p&gt;
&lt;p&gt;And &lt;code&gt;uv&lt;/code&gt; is no doubt their next step in improving the Python toolchain eco.&lt;/p&gt;
&lt;p&gt;Although you can easily install &lt;code&gt;uv&lt;/code&gt; using &lt;code&gt;pip&lt;/code&gt; or &lt;code&gt;pipx&lt;/code&gt; just like any other Python tool,
essentially it does not rely on your Python interpreter to be installed.&lt;/p&gt;
&lt;p&gt;It provides just the binary executable and you can get it easily by running the quick script following
the insructions in its git repo. And that’s it, no Python or Rust runtime required till this point.&lt;/p&gt;
&lt;p&gt;Creating a virtual environment is now as easy as &lt;code&gt;uv venv&lt;/code&gt;, though you now need at least one Python interpreter ready to make it work.&lt;/p&gt;
&lt;p&gt;The virtual env it creates is just a standard Python venv, except it does not include &lt;code&gt;pip&lt;/code&gt; by default (however if you need pip, you can let it be included by using an extra flag, or you could install it manually anytime after).&lt;/p&gt;
&lt;p&gt;Some of your daily commands can then be like (but faster):&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;uv&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; pip&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; install&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; -r&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; requirements.txt&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;uv&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; pip&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; install&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; black==&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;24.2.0&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;uv&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; pip&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; compile&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; pyprojects.toml&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; -o&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; requirements.txt&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;fast-in-deed&quot;&gt;Fast in deed&lt;/h2&gt;
&lt;p&gt;&lt;img alt=&quot;speed-comparison-1&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1136&quot; height=&quot;301&quot; src=&quot;/blog/_astro/image-01.ae05VlAD_1aBkXO.webp&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;speed-comparison-2&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1163&quot; height=&quot;275&quot; src=&quot;/blog/_astro/image-02.XSkMg7EH_2i5rLR.webp&quot;&gt;&lt;/p&gt;
&lt;p&gt;Just like &lt;code&gt;ruff&lt;/code&gt; is known as being an extremely fast linter, &lt;code&gt;uv&lt;/code&gt;’s speed is also impressive.&lt;/p&gt;
&lt;p&gt;Here is a short &lt;code&gt;requirements.txt&lt;/code&gt; from one of my repos:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;text&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;fastapi==0.109.2&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;pydantic[email]==2.6.1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;python-multipart==0.0.9&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;uvicorn[standard]==0.27.1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;coverage&amp;gt;=7.4.0&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;httpx&amp;gt;=0.26.0&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;memray&amp;gt;=1.11.0&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;pytest&amp;gt;=8.0.0&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;And I gave &lt;code&gt;uv&lt;/code&gt; a try using github actions. The result on &lt;code&gt;ubuntu-latest&lt;/code&gt; with Python 3.12 looks like this&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;text&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;&amp;gt; Run uv pip install -r requirements.dev.txt&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;Resolved 40 packages in 185ms&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;Downloaded 40 packages in 268ms&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;Installed 40 packages in 24ms&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt; + annotated-types==0.6.0&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt; + anyio==4.3.0&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt; + certifi==2024.2.2&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt; + click==8.1.7&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt; + coverage==7.4.2&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt; + dnspython==2.6.1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt; + email-validator==2.1.0.post1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt; + fastapi==0.109.2&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt; + h11==0.14.0&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt; + httpcore==1.0.3&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt; + httptools==0.6.1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt; + httpx==0.26.0&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt; + idna==3.6&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt; + iniconfig==2.0.0&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt; + jinja2==3.1.3&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt; + linkify-it-py==2.0.3&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt; + markdown-it-py==3.0.0&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt; + markupsafe==2.1.5&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt; + mdit-py-plugins==0.4.0&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt; + mdurl==0.1.2&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt; + memray==1.11.0&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt; + packaging==23.2&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt; + pluggy==1.4.0&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt; + pydantic==2.6.1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt; + pydantic-core==2.16.2&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt; + pygments==2.17.2&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt; + pytest==8.0.1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt; + python-dotenv==1.0.1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt; + python-multipart==0.0.9&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt; + pyyaml==6.0.1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt; + rich==13.7.0&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt; + sniffio==1.3.0&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt; + starlette==0.36.3&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt; + textual==0.52.1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt; + typing-extensions==4.9.0&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt; + uc-micro-py==1.0.3&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt; + uvicorn==0.27.1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt; + uvloop==0.19.0&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt; + watchfiles==0.21.0&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt; + websockets==12.0&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;As you can see, this process, including solving the dependencies, downloading them and installing them, took just &lt;strong&gt;less than half a second&lt;/strong&gt;!&lt;/p&gt;
&lt;h2 id=&quot;features-in-need&quot;&gt;Features in need&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;uv&lt;/code&gt;’s vision, according to the blog, is&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;a single binary that bootstraps your Python installation and gives you everything you need to be productive with Python, bundling not only pip, pip-tools, and virtualenv, but also pipx, tox, poetry, pyenv, ruff, and more.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;And appearantly at the current point, it is still quite far away from that.&lt;/p&gt;
&lt;p&gt;The only two major top-level sub-commands the cli currently supports are&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;venv&lt;/li&gt;
&lt;li&gt;pip&lt;/li&gt;
&lt;li&gt;cache&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;It thus can only create a virtual environment, install dependencies into it and outputs a “lock” file, etc.&lt;/p&gt;
&lt;p&gt;I want it to list installed packages, or run commands using the interpreter inside the virtual env, just like what &lt;code&gt;poetry&lt;/code&gt; is capable of right now.&lt;/p&gt;
&lt;p&gt;Not to mention that it cannot run tests, switch virtual environments or lint source files.&lt;/p&gt;
&lt;p&gt;But it’s still in its early age, and the pace is like one patch version every couple of days, isn’t it?&lt;/p&gt;
&lt;h2 id=&quot;what-about-rye&quot;&gt;What about Rye&lt;/h2&gt;
&lt;p&gt;The ambitions of &lt;code&gt;uv&lt;/code&gt; share a lot with those from &lt;code&gt;Rye&lt;/code&gt;, a tool (which happens to be written in Rust as well) created by Armin Ronacher, the creator of &lt;code&gt;Flask&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;What’s more, the team behind &lt;code&gt;uv&lt;/code&gt;, &lt;code&gt;astralsh&lt;/code&gt;, is actually taking over the dev work of &lt;code&gt;Rye&lt;/code&gt; according to their &lt;a href=&quot;https://astral.sh/blog/uv&quot;&gt;blog&lt;/a&gt;, and ultimately going to migrate &lt;code&gt;Rye&lt;/code&gt; to &lt;code&gt;uv&lt;/code&gt; in the future.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;We saw this as a rare opportunity to team up, and to avoid fragmenting the Python ecosystem. As such, in collaboration with Armin, we’re excited to be taking over Rye. Our goal is to evolve uv into a production-ready “Cargo for Python”, and to provide a smooth migration path from Rye to uv when the time is right.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;some-thoughts&quot;&gt;Some thoughts&lt;/h2&gt;
&lt;p&gt;The name &lt;code&gt;uv&lt;/code&gt; seems not relevant to &lt;a href=&quot;https://github.com/libuv/libuv&quot;&gt;&lt;code&gt;libuv&lt;/code&gt;&lt;/a&gt;, &lt;a href=&quot;https://github.com/MagicStack/uvloop&quot;&gt;&lt;code&gt;uvloop&lt;/code&gt;&lt;/a&gt; or &lt;a href=&quot;https://github.com/encode/uvicorn&quot;&gt;&lt;code&gt;uvicorn&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Maybe it’s short for “universal/ultimate/unified virtualenv manager”?&lt;/p&gt;
&lt;p&gt;The dedicated docs pages of &lt;code&gt;uv&lt;/code&gt; are not present at the time of writing, which is a pitty.&lt;/p&gt;
&lt;h2 id=&quot;references&quot;&gt;References&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://astral.sh/blog/uv&quot;&gt;uv: Python packaging in Rust&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/astral-sh/uv&quot;&gt;uv on Github&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description><pubDate>Wed, 21 Feb 2024 07:23:13 GMT</pubDate><category>rust</category><category>python</category><category>rust</category><category>python</category><category>pip</category><category>cli</category><category>linux</category><category>windows</category><author>Zeyang Lin</author></item><item><title>My First Hugo Blog</title><link>https://blueberry-py.github.io/blog/post/my-first-hugo-blog/</link><guid isPermaLink="true">https://blueberry-py.github.io/blog/post/my-first-hugo-blog/</guid><description>&lt;h2 id=&quot;introduction&quot;&gt;Introduction&lt;/h2&gt;
&lt;p&gt;This site is synced across:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://blueberry-py.github.io/blog/&quot;&gt;Github Pages&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://blueberrypy.netlify.app/&quot;&gt;Netlify&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://blueberrypy.onrender.com/&quot;&gt;Render&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://blueberrypy-blog.vercel.app/&quot;&gt;Vercel&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description><pubDate>Wed, 31 Jan 2024 07:32:01 GMT</pubDate><author/></item><item><title>MOJO Series #1: Install SDK on UBUNTU</title><link>https://blueberry-py.github.io/blog/post/mojo-series-01-sdk/</link><guid isPermaLink="true">https://blueberry-py.github.io/blog/post/mojo-series-01-sdk/</guid><description>&lt;p&gt;So, THAT 35000-times-faster-than-python language, mojo, released its SDK today. This means you can install Mojo
in your own environment and run mojo programs.&lt;/p&gt;
&lt;p&gt;And here in this post, I will show you how to do it on Ubuntu.&lt;/p&gt;
&lt;h1 id=&quot;system-requirements&quot;&gt;System Requirements&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;Ubuntu 20.04 and later&lt;/li&gt;
&lt;li&gt;x86-64 CPU and minimum 4 GB RAM&lt;/li&gt;
&lt;li&gt;Python 3.8 - 3.10&lt;/li&gt;
&lt;li&gt;g++ or clang++ compiler&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id=&quot;my-environment&quot;&gt;My environment&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;Kubuntu 22.04.3&lt;/li&gt;
&lt;li&gt;AMD CPU with 16GB RAM&lt;/li&gt;
&lt;li&gt;Python 3.10.12&lt;/li&gt;
&lt;li&gt;g++ 11.4.0&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id=&quot;install-steps&quot;&gt;Install steps&lt;/h1&gt;
&lt;h2 id=&quot;1-install-modular-cli&quot;&gt;1. Install Modular CLI&lt;/h2&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# switch to root first&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;sudo&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; -u&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; root&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; -i&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# then run the following command&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;apt-get&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; install&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; -y&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; apt-transport-https&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; &amp;amp;&amp;amp;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  keyring_location&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;/usr/share/keyrings/modular-installer-archive-keyring.gpg&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; &amp;amp;&amp;amp;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;  curl&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; -1sLf&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &apos;https://dl.modular.com/bBNWiLZX5igwHXeu/installer/gpg.0E4925737A3895AD.key&apos;&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; |&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;  gpg&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; --dearmor&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; &amp;gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; ${keyring_location} &amp;amp;&amp;amp;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;  curl&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; -1sLf&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &apos;https://dl.modular.com/bBNWiLZX5igwHXeu/installer/config.deb.txt?distro=debian&amp;amp;codename=wheezy&apos;&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; &amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; /etc/apt/sources.list.d/modular-installer.list&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; &amp;amp;&amp;amp;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;  apt-get&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; update&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; &amp;amp;&amp;amp;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;  apt-get&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; install&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; -y&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; modular&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# switch back to normal user&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;exit&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;2-verify-modular-is-installed&quot;&gt;2. Verify &lt;code&gt;modular&lt;/code&gt; is installed&lt;/h2&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;which&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; modular&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;/usr/bin/modular&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;3-install-mojo-sdk&quot;&gt;3. Install Mojo SDK&lt;/h2&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;modular&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; auth&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; &amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;YOUR&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; AUTH&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; KE&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;Y&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; &amp;amp;&amp;amp; &lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;modular&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; install&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; mojo&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;text&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;# Found release for https://packages.modular.com/mojo @ 0.2.1, installing to /home/******/.modular/pkg/packages.modular.com_mojo&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;# Downloads complete, setting configs...&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;# Configs complete, running post-install hooks...&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;..................&amp;lt;OMITTED&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;Successfully installed ansiwrap-0.8.4 attrs-23.1.0 certifi-2023.7.22 charset-normalizer-3.2.0 entrypoints-0.4 fastjsonschema-2.18.0 find_libpython-0.3.0 idna-3.4 jsonschema-4.19.0 jsonschema-specifications-2023.7.1 jupyter-core-5.3.1 jupyter_client-8.3.1 nbclient-0.8.0 nbformat-5.9.2 papermill-2.4.0 platformdirs-3.10.0 python-dateutil-2.8.2 pyzmq-25.1.1 referencing-0.30.2 requests-2.31.0 rpds-py-0.10.2 tenacity-8.2.3 textwrap3-0.9.2 tornado-6.3.3 tqdm-4.66.1 traitlets-5.9.0 urllib3-2.0.4&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;WARNING: Running pip as the &apos;root&apos; user can result in broken permissions and conflicting behaviour with the system package manager. It is recommended to use a virtual environment instead: https://pip.pypa.io/warnings/venv&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;Testing `MODULAR_HOME=/home/******/.modular`&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;* `/home/******/.modular/pkg/packages.modular.com_mojo/bin/mojo`...&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;TEST: `mojo --help`... OK&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;TEST: `mojo run --help`... OK&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;TEST: `mojo build test_mandelbrot.mojo`... OK&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;TEST: `mojo build test_python.mojo`... OK&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;TEST: `mojo demangle`... OK&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;TEST: `mojo format`... OK&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;TEST: `mojo package`... OK&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;TEST: `mojo test_mandelbrot.mojo`... OK&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;TEST: `mojo test_python.mojo`... OK&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;TEST: `mojo repl`... OK&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;🔥 Mojo installed! 🔥&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;Now run the following commands if you are using bash:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;echo &apos;export MODULAR_HOME=&quot;/home/******/.modular&quot;&apos; &amp;gt;&amp;gt; ~/.bashrc&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;echo &apos;export PATH=&quot;/home/******/.modular/pkg/packages.modular.com_mojo/bin:$PATH&quot;&apos; &amp;gt;&amp;gt; ~/.bashrc&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;source ~/.bashrc&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;If you are using ZSH, run the following commands:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;echo &apos;export MODULAR_HOME=&quot;/home/******/.modular&quot;&apos; &amp;gt;&amp;gt; ~/.zshrc&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;echo &apos;export PATH=&quot;/home/******/.modular/pkg/packages.modular.com_mojo/bin:$PATH&quot;&apos; &amp;gt;&amp;gt; ~/.zshrc&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;source ~/.zshrc&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;Then enter &apos;mojo&apos; to start the Mojo REPL.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;For tool help, enter &apos;mojo --help&apos;.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;For more docs, see https://docs.modular.com/mojo.&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;4-add-mojo-to-path&quot;&gt;4. Add mojo to PATH&lt;/h2&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# You must replace two &amp;lt;USERNAME&amp;gt; with your own username&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;echo&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &apos;export MODULAR_HOME=&quot;/home/&amp;lt;USERNAME&amp;gt;/.modular&quot;&apos;&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; &amp;gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; ~/.bashrc&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;echo&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &apos;export PATH=&quot;/home/&amp;lt;USERNAME&amp;gt;/.modular/pkg/packages.modular.com_mojo/bin:$PATH&quot;&apos;&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; &amp;gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; ~/.bashrc&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;source&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; ~/.bashrc&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Now verify &lt;code&gt;mojo&lt;/code&gt; command is accesible:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;which&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; mojo&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;/home/******/.modular/pkg/packages.modular.com_mojo/bin/mojo&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;5-mojo-repl&quot;&gt;5. Mojo REPL&lt;/h2&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;mojo&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;Welcome to Mojo! 🔥
Expressions are delimited by a blank line.
Type &lt;code&gt;:mojo help&lt;/code&gt; for further assistance.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h1 id=&quot;bonus-round-directory-structure&quot;&gt;Bonus Round: directory structure&lt;/h1&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;tree&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; $MODULAR_HOME&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;/home/******/.modular&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;├──&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; crashdb&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;│&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   ├──&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; attachments&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;│&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   ├──&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; completed&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;│&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   ├──&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; new&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;│&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   ├──&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; pending&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;│&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   └──&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; settings.dat&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;├──&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; modular.cfg&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;└──&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; pkg&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;    └──&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; packages.modular.com_mojo&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;        ├──&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; bin&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;        │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   ├──&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; lldb&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;        │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   ├──&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; lldb-argdumper&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;        │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   ├──&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; lldb-server&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;        │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   ├──&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; lldb-vscode&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;        │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   ├──&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; modular-crashpad-handler&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;        │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   ├──&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; mojo&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;        │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   └──&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; mojo-lsp-server&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;        ├──&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; installed.json&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;        ├──&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; jupyter&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;        │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   ├──&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; kernel&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;        │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   ├──&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; logo-64x64.png&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;        │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   ├──&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; logo.svg&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;        │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   └──&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; mojokernel.py&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;        │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   └──&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; manage_kernel.py&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;        ├──&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; lib&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;        │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   ├──&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; libKGENCompilerRTShared.so&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; -&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; /home/&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;******&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;/.modular/pkg/packages.modular.com_mojo/lib/libKGENCompilerRTShared.so.18git&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;        │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   ├──&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; libKGENCompilerRTShared.so.18git&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;        │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   ├──&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; libKGENCompilerRT-static.a&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;        │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   ├──&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; libLLCLRuntimeGlobals.so&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; -&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; /home/&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;******&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;/.modular/pkg/packages.modular.com_mojo/lib/libLLCLRuntimeGlobals.so.18git&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;        │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   ├──&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; libLLCLRuntimeGlobals.so.18git&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;        │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   ├──&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; liblldb.so&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; -&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; /home/&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;******&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;/.modular/pkg/packages.modular.com_mojo/lib/liblldb.so.18.0.0git&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;        │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   ├──&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; liblldb.so.18.0.0git&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;        │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   ├──&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; liblldb.so.18git&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; -&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; /home/&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;******&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;/.modular/pkg/packages.modular.com_mojo/lib/liblldb.so.18.0.0git&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;        │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   ├──&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; libMojoJupyter.so&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; -&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; /home/&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;******&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;/.modular/pkg/packages.modular.com_mojo/lib/libMojoJupyter.so.18git&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;        │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   ├──&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; libMojoJupyter.so.18git&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;        │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   ├──&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; libMojoLLDB.so&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; -&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; /home/&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;******&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;/.modular/pkg/packages.modular.com_mojo/lib/libMojoLLDB.so.18git&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;        │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   ├──&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; libMojoLLDB.so.18git&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;        │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   ├──&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; libMSupportGlobals.so&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; -&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; /home/&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;******&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;/.modular/pkg/packages.modular.com_mojo/lib/libMSupportGlobals.so.18git&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;        │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   ├──&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; libMSupportGlobals.so.18git&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;        │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   ├──&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; liborc_rt.a&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;        │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   ├──&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; lldb-visualizers&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;        │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   ├──&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; lldbDataFormatters.py&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;        │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   └──&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; mlirDataFormatters.py&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;        │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   ├──&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; mblack&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;        │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   ├──&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; base_library.zip&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;        │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   ├──&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; importlib_metadata-6.8.0.dist-info&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;        │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   ├──&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; INSTALLER&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;        │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   ├──&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; LICENSE&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;        │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   ├──&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; METADATA&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;        │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   ├──&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; RECORD&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;        │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   ├──&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; top_level.txt&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;        │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   └──&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; WHEEL&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;        │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   ├──&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; libbz2.so.1.0&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;        │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   ├──&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; libcrypto.so.1.1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;        │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   ├──&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; lib-dynload&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;        │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   ├──&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; _asyncio.cpython-38-x86_64-linux-gnu.so&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;        │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   ├──&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; _bz2.cpython-38-x86_64-linux-gnu.so&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;        │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   ├──&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; _codecs_cn.cpython-38-x86_64-linux-gnu.so&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;        │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   ├──&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; _codecs_hk.cpython-38-x86_64-linux-gnu.so&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;        │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   ├──&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; _codecs_iso2022.cpython-38-x86_64-linux-gnu.so&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;        │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   ├──&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; _codecs_jp.cpython-38-x86_64-linux-gnu.so&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;        │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   ├──&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; _codecs_kr.cpython-38-x86_64-linux-gnu.so&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;        │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   ├──&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; _codecs_tw.cpython-38-x86_64-linux-gnu.so&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;        │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   ├──&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; _contextvars.cpython-38-x86_64-linux-gnu.so&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;        │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   ├──&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; _ctypes.cpython-38-x86_64-linux-gnu.so&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;        │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   ├──&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; _decimal.cpython-38-x86_64-linux-gnu.so&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;        │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   ├──&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; _hashlib.cpython-38-x86_64-linux-gnu.so&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;        │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   ├──&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; _json.cpython-38-x86_64-linux-gnu.so&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;        │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   ├──&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; _lzma.cpython-38-x86_64-linux-gnu.so&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;        │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   ├──&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; mmap.cpython-38-x86_64-linux-gnu.so&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;        │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   ├──&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; _multibytecodec.cpython-38-x86_64-linux-gnu.so&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;        │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   ├──&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; _multiprocessing.cpython-38-x86_64-linux-gnu.so&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;        │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   ├──&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; _opcode.cpython-38-x86_64-linux-gnu.so&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;        │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   ├──&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; _posixshmem.cpython-38-x86_64-linux-gnu.so&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;        │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   ├──&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; _queue.cpython-38-x86_64-linux-gnu.so&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;        │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   ├──&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; resource.cpython-38-x86_64-linux-gnu.so&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;        │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   ├──&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; _ssl.cpython-38-x86_64-linux-gnu.so&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;        │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   ├──&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; termios.cpython-38-x86_64-linux-gnu.so&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;        │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   └──&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; _uuid.cpython-38-x86_64-linux-gnu.so&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;        │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   ├──&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; libexpat.so.1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;        │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   ├──&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; libffi.so.7&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;        │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   ├──&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; liblzma.so.5&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;        │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   ├──&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; libmpdec.so.2&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;        │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   ├──&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; libpython3.8.so.1.0&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;        │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   ├──&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; libssl.so.1.1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;        │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   ├──&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; libuuid.so.1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;        │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   ├──&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; libz.so.1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;        │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   ├──&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; mblack&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;        │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   └──&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; mblib2to3&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;        │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;       ├──&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; Grammar.txt&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;        │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;       ├──&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; __init__.py&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;        │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;       ├──&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; LICENSE&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;        │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;       ├──&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; PatternGrammar.txt&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;        │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;       ├──&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; pgen2&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;        │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;       │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   ├──&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; conv.py&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;        │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;       │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   ├──&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; driver.py&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;        │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;       │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   ├──&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; grammar.py&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;        │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;       │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   ├──&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; __init__.py&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;        │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;       │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   ├──&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; literals.py&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;        │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;       │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   ├──&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; parse.py&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;        │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;       │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   ├──&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; pgen.py&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;        │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;       │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   ├──&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; tokenize.py&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;        │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;       │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   └──&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; token.py&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;        │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;       ├──&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; pygram.py&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;        │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;       ├──&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; pytree.py&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;        │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;       └──&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; README&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;        │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   ├──&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; mojo&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;        │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   ├──&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; algorithm.mojopkg&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;        │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   ├──&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; autotune.mojopkg&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;        │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   ├──&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; base64.mojopkg&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;        │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   ├──&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; benchmark.mojopkg&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;        │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   ├──&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; builtin.mojopkg&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;        │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   ├──&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; complex.mojopkg&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;        │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   ├──&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; math.mojopkg&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;        │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   ├──&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; memory.mojopkg&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;        │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   ├──&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; os.mojopkg&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;        │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   ├──&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; python.mojopkg&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;        │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   ├──&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; random.mojopkg&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;        │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   ├──&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; runtime.mojopkg&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;        │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   ├──&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; sys.mojopkg&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;        │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   ├──&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; tensor.mojopkg&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;        │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   ├──&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; testing.mojopkg&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;        │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   ├──&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; time.mojopkg&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;        │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   └──&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; utils.mojopkg&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;        │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   └──&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; mojo-repl-entry-point&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;        ├──&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; licenses&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;        │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   ├──&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; LICENSE&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;        │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   └──&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; Third-Party-Notices&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;        ├──&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; modular.cfg&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;        ├──&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; root.json&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;        ├──&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; scripts&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;        │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   └──&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; post-install&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;        │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;       ├──&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; install-dependencies.sh&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;        │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;       ├──&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; pick_python.py&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;        │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;       ├──&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; requirements.txt&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;        │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;       └──&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; self-test.py&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;        ├──&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; share&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;        │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   └──&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; man&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;        │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;       └──&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; man1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;        │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;           ├──&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; mojo.1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;        │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;           ├──&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; mojo-build.1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;        │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;           ├──&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; mojo-demangle.1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;        │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;           ├──&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; mojo-doc.1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;        │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;           ├──&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; mojo-format.1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;        │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;           ├──&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; mojo-package.1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;        │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;           ├──&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; mojo-repl.1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;        │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;           └──&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; mojo-run.1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;        ├──&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; snapshot.json&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;        ├──&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; targets.json&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;        ├──&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; test&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;        │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   ├──&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; test_format.mojo&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;        │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   ├──&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; test_jupyter.ipynb&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;        │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   ├──&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; test_mandelbrot.mojo&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;        │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   ├──&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; test_package&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;        │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   └──&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; __init__.mojo&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;        │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   ├──&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; test_package_user.mojo&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;        │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   └──&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; test_python.mojo&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;        ├──&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; timestamp.json&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;        └──&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; VERSION&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;26&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; directories,&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 133&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; files&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h1 id=&quot;references&quot;&gt;References&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://developer.modular.com/download&quot;&gt;Modular Developer Console&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description><pubDate>Fri, 08 Sep 2023 10:00:00 GMT</pubDate><category>mojo</category><category>mojo</category><category>python</category><category>AI</category><category>ubuntu</category><category>linux</category><category>2023</category><author>Zeyang Lin</author></item><item><title>MOJO 系列 第一篇: 在 Ubuntu 环境下安装本地 SDK</title><link>https://blueberry-py.github.io/blog/post/mojo-series-01-sdk-zhcn/</link><guid isPermaLink="true">https://blueberry-py.github.io/blog/post/mojo-series-01-sdk-zhcn/</guid><description>&lt;p&gt;那个号称 &lt;strong&gt;比 Python 快 35000倍&lt;/strong&gt; 的 Mojo 语言，今天终于开放了 SDK 的下载。就是说，你可以在自己的本地环境安装 Mojo 并运行 Mojo 程序了。&lt;/p&gt;
&lt;p&gt;那么这篇文章是用来记录在 Ubuntu 环境下如何安装 SDK。&lt;/p&gt;
&lt;p&gt;首先来看看前置条件－－官方的系统需求&lt;/p&gt;
&lt;h1 id=&quot;system-requirements&quot;&gt;System Requirements&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;Ubuntu 20.04 and later&lt;/li&gt;
&lt;li&gt;x86-64 CPU and minimum 4 GB RAM&lt;/li&gt;
&lt;li&gt;Python 3.8 - 3.10&lt;/li&gt;
&lt;li&gt;g++ or clang++ compiler&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;并无苛刻之处，都2023年了这些应该都是基础配置了吧。（除非你不用 Ubuntu 系列的 Linux）&lt;/p&gt;
&lt;p&gt;那我自己的环境如下&lt;/p&gt;
&lt;h1 id=&quot;my-environment&quot;&gt;My environment&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;Kubuntu 22.04.3&lt;/li&gt;
&lt;li&gt;AMD CPU with 16GB RAM&lt;/li&gt;
&lt;li&gt;Python 3.10.12&lt;/li&gt;
&lt;li&gt;g++ 11.4.0&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;然后你需要在 Modular 网站（&lt;a href=&quot;https://developer.modular.com/download%EF%BC%89%E4%B8%8A%E9%9D%A2%E7%94%A8%E9%82%AE%E7%AE%B1%E6%B3%A8%E5%86%8C%E4%B8%80%E4%B8%AA%E5%B8%90%E5%8F%B7%EF%BC%8C%E6%9D%A5%E8%8E%B7%E5%BE%97%E4%BD%A0%E7%9A%84&quot;&gt;https://developer.modular.com/download）上面用邮箱注册一个帐号，来获得你的&lt;/a&gt; AUTHKEY 。这个 KEY 是后面步骤用来验证你的身份的。
图中的 &lt;code&gt;MODULAR_AUTH=&lt;/code&gt; 后面的部分就是你的 AUTHKEY。&lt;/p&gt;
&lt;p&gt;满足了官方需求后，下面就是一步一步安装了。需要注意的是你似乎是需要 &lt;del&gt;魔法&lt;/del&gt; 才能成功完成下面的步骤。&lt;/p&gt;
&lt;h1 id=&quot;安装步骤&quot;&gt;安装步骤&lt;/h1&gt;
&lt;h2 id=&quot;1-安装-modular-cli&quot;&gt;1. 安装 Modular CLI&lt;/h2&gt;
&lt;p&gt;Modular CLI 是安装 mojo 的前置条件&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# 首先切换到 root 用户：&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;sudo&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; -u&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; root&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; -i&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# 然后执行以下命令：&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;apt-get&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; install&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; -y&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; apt-transport-https&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; &amp;amp;&amp;amp;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  keyring_location&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;/usr/share/keyrings/modular-installer-archive-keyring.gpg&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; &amp;amp;&amp;amp;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;  curl&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; -1sLf&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &apos;https://dl.modular.com/bBNWiLZX5igwHXeu/installer/gpg.0E4925737A3895AD.key&apos;&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; |&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;  gpg&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; --dearmor&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; &amp;gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; ${keyring_location} &amp;amp;&amp;amp;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;  curl&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; -1sLf&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &apos;https://dl.modular.com/bBNWiLZX5igwHXeu/installer/config.deb.txt?distro=debian&amp;amp;codename=wheezy&apos;&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; &amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; /etc/apt/sources.list.d/modular-installer.list&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; &amp;amp;&amp;amp;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;  apt-get&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; update&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; &amp;amp;&amp;amp;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;  apt-get&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; install&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; -y&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; modular&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# 然后切换回你自己的普通用户：&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;exit&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;2验证-modular-已经安装&quot;&gt;2.验证 &lt;code&gt;modular&lt;/code&gt; 已经安装&lt;/h2&gt;
&lt;p&gt;在命令行执行：&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;which&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; modular&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;如果有下面的输出则表明&lt;code&gt;modular&lt;/code&gt;安装成功&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;/usr/bin/modular&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;如果没有任何输出，那你可能是需要 &lt;del&gt;魔法&lt;/del&gt; 了。&lt;/p&gt;
&lt;h2 id=&quot;3安装-mojo-sdk&quot;&gt;3.安装 Mojo SDK&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;modular&lt;/code&gt;安装好后，就可以安装&lt;code&gt;mojo&lt;/code&gt;了。&lt;/p&gt;
&lt;p&gt;在命令行执行：&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# 把下面的 &amp;lt;YOUR AUTH KEY&amp;gt; 替换成你自己的 key&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;modular&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; auth&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; &amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;YOUR&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; AUTH&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; KE&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;Y&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; &amp;amp;&amp;amp; &lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;modular&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; install&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; mojo&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;等待时间可能会比较久。。。
下面就是输出，可以看到它还会安装很多 python 库到系统的 python 环境里。。。&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;text&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;# Found release for https://packages.modular.com/mojo @ 0.2.1, installing to /home/******/.modular/pkg/packages.modular.com_mojo&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;# Downloads complete, setting configs...&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;# Configs complete, running post-install hooks...&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;&amp;lt; 中间省略掉 &amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;Successfully installed ansiwrap-0.8.4 attrs-23.1.0 certifi-2023.7.22 charset-normalizer-3.2.0 entrypoints-0.4 fastjsonschema-2.18.0 find_libpython-0.3.0 idna-3.4 jsonschema-4.19.0 jsonschema-specifications-2023.7.1 jupyter-core-5.3.1 jupyter_client-8.3.1 nbclient-0.8.0 nbformat-5.9.2 papermill-2.4.0 platformdirs-3.10.0 python-dateutil-2.8.2 pyzmq-25.1.1 referencing-0.30.2 requests-2.31.0 rpds-py-0.10.2 tenacity-8.2.3 textwrap3-0.9.2 tornado-6.3.3 tqdm-4.66.1 traitlets-5.9.0 urllib3-2.0.4&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;。。。。。。。&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;Testing `MODULAR_HOME=/home/******/.modular`&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;* `/home/******/.modular/pkg/packages.modular.com_mojo/bin/mojo`...&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;TEST: `mojo --help`... OK&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;TEST: `mojo run --help`... OK&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;TEST: `mojo build test_mandelbrot.mojo`... OK&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;TEST: `mojo build test_python.mojo`... OK&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;TEST: `mojo demangle`... OK&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;TEST: `mojo format`... OK&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;TEST: `mojo package`... OK&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;TEST: `mojo test_mandelbrot.mojo`... OK&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;TEST: `mojo test_python.mojo`... OK&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;TEST: `mojo repl`... OK&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;🔥 Mojo installed! 🔥&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;Now run the following commands if you are using bash:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;echo &apos;export MODULAR_HOME=&quot;/home/******/.modular&quot;&apos; &amp;gt;&amp;gt; ~/.bashrc&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;echo &apos;export PATH=&quot;/home/******/.modular/pkg/packages.modular.com_mojo/bin:$PATH&quot;&apos; &amp;gt;&amp;gt; ~/.bashrc&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;source ~/.bashrc&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;If you are using ZSH, run the following commands:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;echo &apos;export MODULAR_HOME=&quot;/home/******/.modular&quot;&apos; &amp;gt;&amp;gt; ~/.zshrc&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;echo &apos;export PATH=&quot;/home/******/.modular/pkg/packages.modular.com_mojo/bin:$PATH&quot;&apos; &amp;gt;&amp;gt; ~/.zshrc&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;source ~/.zshrc&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;Then enter &apos;mojo&apos; to start the Mojo REPL.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;For tool help, enter &apos;mojo --help&apos;.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;For more docs, see https://docs.modular.com/mojo.&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;4添加-mojo-到-path&quot;&gt;4.添加 &lt;code&gt;mojo&lt;/code&gt; 到 &lt;code&gt;PATH&lt;/code&gt;&lt;/h2&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# 把下面两个 &amp;lt;USERNAME&amp;gt; 替换成你自己的用户名&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;echo&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &apos;export MODULAR_HOME=&quot;/home/&amp;lt;USERNAME&amp;gt;/.modular&quot;&apos;&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; &amp;gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; ~/.bashrc&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;echo&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &apos;export PATH=&quot;/home/&amp;lt;USERNAME&amp;gt;/.modular/pkg/packages.modular.com_mojo/bin:$PATH&quot;&apos;&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; &amp;gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; ~/.bashrc&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# 重新加载 .bachrc 令改动生效&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;source&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; ~/.bashrc&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;现在验证 &lt;code&gt;mojo&lt;/code&gt; 命令是否已经能用了:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;which&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; mojo&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;若输出为下面内容则表示安装成功：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;/home/******/.modular/pkg/packages.modular.com_mojo/bin/mojo&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;5-体验-mojo-repl&quot;&gt;5. 体验 Mojo REPL&lt;/h2&gt;
&lt;p&gt;在命令行执行：&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;mojo&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;就进到了 mojo 的互动编程环境。熟悉 Python 或其它类似语言的小伙伴对这个一定不陌生。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Welcome to Mojo! 🔥
Expressions are delimited by a blank line.
Type &lt;code&gt;:mojo help&lt;/code&gt; for further assistance.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;那么至此 mojo 的基础开发环境就已经搭建好了，在下一篇文章中我会记录如何运行最基础的 “Hello world” 程序。&lt;/p&gt;
&lt;h1 id=&quot;bonus-round-看看-mojo-目录的文件夹结构&quot;&gt;Bonus Round: 看看 mojo 目录的文件夹结构&lt;/h1&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;tree&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; $MODULAR_HOME&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;/home/******/.modular&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;├──&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; crashdb&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;│&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   ├──&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; attachments&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;│&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   ├──&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; completed&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;│&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   ├──&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; new&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;│&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   ├──&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; pending&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;│&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   └──&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; settings.dat&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;├──&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; modular.cfg&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;└──&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; pkg&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;    └──&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; packages.modular.com_mojo&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;        ├──&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; bin&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;        │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   ├──&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; lldb&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;        │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   ├──&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; lldb-argdumper&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;        │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   ├──&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; lldb-server&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;        │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   ├──&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; lldb-vscode&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;        │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   ├──&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; modular-crashpad-handler&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;        │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   ├──&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; mojo&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;        │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   └──&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; mojo-lsp-server&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;        ├──&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; installed.json&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;        ├──&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; jupyter&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;        │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   ├──&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; kernel&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;        │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   ├──&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; logo-64x64.png&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;        │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   ├──&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; logo.svg&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;        │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   └──&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; mojokernel.py&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;        │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   └──&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; manage_kernel.py&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;        ├──&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; lib&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;        │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   ├──&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; libKGENCompilerRTShared.so&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; -&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; /home/&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;******&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;/.modular/pkg/packages.modular.com_mojo/lib/libKGENCompilerRTShared.so.18git&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;        │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   ├──&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; libKGENCompilerRTShared.so.18git&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;        │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   ├──&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; libKGENCompilerRT-static.a&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;        │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   ├──&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; libLLCLRuntimeGlobals.so&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; -&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; /home/&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;******&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;/.modular/pkg/packages.modular.com_mojo/lib/libLLCLRuntimeGlobals.so.18git&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;        │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   ├──&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; libLLCLRuntimeGlobals.so.18git&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;        │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   ├──&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; liblldb.so&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; -&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; /home/&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;******&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;/.modular/pkg/packages.modular.com_mojo/lib/liblldb.so.18.0.0git&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;        │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   ├──&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; liblldb.so.18.0.0git&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;        │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   ├──&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; liblldb.so.18git&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; -&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; /home/&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;******&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;/.modular/pkg/packages.modular.com_mojo/lib/liblldb.so.18.0.0git&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;        │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   ├──&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; libMojoJupyter.so&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; -&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; /home/&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;******&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;/.modular/pkg/packages.modular.com_mojo/lib/libMojoJupyter.so.18git&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;        │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   ├──&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; libMojoJupyter.so.18git&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;        │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   ├──&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; libMojoLLDB.so&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; -&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; /home/&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;******&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;/.modular/pkg/packages.modular.com_mojo/lib/libMojoLLDB.so.18git&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;        │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   ├──&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; libMojoLLDB.so.18git&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;        │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   ├──&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; libMSupportGlobals.so&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; -&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; /home/&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;******&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;/.modular/pkg/packages.modular.com_mojo/lib/libMSupportGlobals.so.18git&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;        │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   ├──&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; libMSupportGlobals.so.18git&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;        │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   ├──&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; liborc_rt.a&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;        │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   ├──&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; lldb-visualizers&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;        │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   ├──&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; lldbDataFormatters.py&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;        │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   └──&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; mlirDataFormatters.py&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;        │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   ├──&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; mblack&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;        │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   ├──&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; base_library.zip&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;        │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   ├──&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; importlib_metadata-6.8.0.dist-info&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;        │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   ├──&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; INSTALLER&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;        │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   ├──&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; LICENSE&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;        │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   ├──&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; METADATA&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;        │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   ├──&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; RECORD&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;        │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   ├──&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; top_level.txt&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;        │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   └──&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; WHEEL&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;        │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   ├──&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; libbz2.so.1.0&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;        │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   ├──&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; libcrypto.so.1.1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;        │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   ├──&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; lib-dynload&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;        │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   ├──&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; _asyncio.cpython-38-x86_64-linux-gnu.so&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;        │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   ├──&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; _bz2.cpython-38-x86_64-linux-gnu.so&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;        │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   ├──&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; _codecs_cn.cpython-38-x86_64-linux-gnu.so&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;        │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   ├──&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; _codecs_hk.cpython-38-x86_64-linux-gnu.so&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;        │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   ├──&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; _codecs_iso2022.cpython-38-x86_64-linux-gnu.so&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;        │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   ├──&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; _codecs_jp.cpython-38-x86_64-linux-gnu.so&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;        │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   ├──&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; _codecs_kr.cpython-38-x86_64-linux-gnu.so&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;        │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   ├──&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; _codecs_tw.cpython-38-x86_64-linux-gnu.so&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;        │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   ├──&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; _contextvars.cpython-38-x86_64-linux-gnu.so&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;        │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   ├──&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; _ctypes.cpython-38-x86_64-linux-gnu.so&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;        │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   ├──&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; _decimal.cpython-38-x86_64-linux-gnu.so&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;        │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   ├──&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; _hashlib.cpython-38-x86_64-linux-gnu.so&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;        │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   ├──&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; _json.cpython-38-x86_64-linux-gnu.so&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;        │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   ├──&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; _lzma.cpython-38-x86_64-linux-gnu.so&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;        │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   ├──&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; mmap.cpython-38-x86_64-linux-gnu.so&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;        │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   ├──&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; _multibytecodec.cpython-38-x86_64-linux-gnu.so&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;        │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   ├──&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; _multiprocessing.cpython-38-x86_64-linux-gnu.so&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;        │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   ├──&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; _opcode.cpython-38-x86_64-linux-gnu.so&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;        │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   ├──&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; _posixshmem.cpython-38-x86_64-linux-gnu.so&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;        │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   ├──&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; _queue.cpython-38-x86_64-linux-gnu.so&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;        │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   ├──&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; resource.cpython-38-x86_64-linux-gnu.so&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;        │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   ├──&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; _ssl.cpython-38-x86_64-linux-gnu.so&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;        │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   ├──&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; termios.cpython-38-x86_64-linux-gnu.so&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;        │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   └──&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; _uuid.cpython-38-x86_64-linux-gnu.so&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;        │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   ├──&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; libexpat.so.1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;        │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   ├──&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; libffi.so.7&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;        │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   ├──&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; liblzma.so.5&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;        │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   ├──&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; libmpdec.so.2&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;        │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   ├──&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; libpython3.8.so.1.0&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;        │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   ├──&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; libssl.so.1.1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;        │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   ├──&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; libuuid.so.1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;        │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   ├──&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; libz.so.1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;        │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   ├──&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; mblack&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;        │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   └──&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; mblib2to3&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;        │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;       ├──&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; Grammar.txt&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;        │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;       ├──&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; __init__.py&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;        │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;       ├──&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; LICENSE&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;        │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;       ├──&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; PatternGrammar.txt&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;        │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;       ├──&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; pgen2&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;        │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;       │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   ├──&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; conv.py&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;        │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;       │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   ├──&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; driver.py&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;        │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;       │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   ├──&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; grammar.py&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;        │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;       │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   ├──&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; __init__.py&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;        │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;       │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   ├──&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; literals.py&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;        │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;       │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   ├──&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; parse.py&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;        │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;       │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   ├──&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; pgen.py&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;        │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;       │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   ├──&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; tokenize.py&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;        │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;       │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   └──&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; token.py&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;        │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;       ├──&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; pygram.py&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;        │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;       ├──&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; pytree.py&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;        │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;       └──&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; README&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;        │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   ├──&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; mojo&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;        │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   ├──&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; algorithm.mojopkg&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;        │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   ├──&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; autotune.mojopkg&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;        │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   ├──&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; base64.mojopkg&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;        │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   ├──&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; benchmark.mojopkg&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;        │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   ├──&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; builtin.mojopkg&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;        │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   ├──&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; complex.mojopkg&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;        │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   ├──&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; math.mojopkg&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;        │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   ├──&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; memory.mojopkg&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;        │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   ├──&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; os.mojopkg&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;        │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   ├──&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; python.mojopkg&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;        │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   ├──&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; random.mojopkg&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;        │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   ├──&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; runtime.mojopkg&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;        │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   ├──&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; sys.mojopkg&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;        │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   ├──&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; tensor.mojopkg&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;        │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   ├──&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; testing.mojopkg&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;        │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   ├──&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; time.mojopkg&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;        │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   └──&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; utils.mojopkg&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;        │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   └──&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; mojo-repl-entry-point&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;        ├──&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; licenses&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;        │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   ├──&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; LICENSE&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;        │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   └──&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; Third-Party-Notices&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;        ├──&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; modular.cfg&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;        ├──&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; root.json&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;        ├──&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; scripts&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;        │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   └──&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; post-install&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;        │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;       ├──&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; install-dependencies.sh&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;        │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;       ├──&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; pick_python.py&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;        │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;       ├──&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; requirements.txt&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;        │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;       └──&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; self-test.py&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;        ├──&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; share&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;        │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   └──&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; man&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;        │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;       └──&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; man1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;        │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;           ├──&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; mojo.1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;        │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;           ├──&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; mojo-build.1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;        │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;           ├──&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; mojo-demangle.1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;        │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;           ├──&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; mojo-doc.1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;        │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;           ├──&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; mojo-format.1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;        │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;           ├──&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; mojo-package.1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;        │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;           ├──&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; mojo-repl.1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;        │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;           └──&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; mojo-run.1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;        ├──&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; snapshot.json&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;        ├──&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; targets.json&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;        ├──&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; test&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;        │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   ├──&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; test_format.mojo&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;        │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   ├──&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; test_jupyter.ipynb&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;        │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   ├──&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; test_mandelbrot.mojo&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;        │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   ├──&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; test_package&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;        │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   └──&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; __init__.mojo&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;        │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   ├──&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; test_package_user.mojo&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;        │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   └──&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; test_python.mojo&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;        ├──&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; timestamp.json&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;        └──&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; VERSION&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;26&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; directories,&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 133&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; files&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h1 id=&quot;本文参考了&quot;&gt;本文参考了&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://developer.modular.com/download&quot;&gt;Modular Developer Console&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description><pubDate>Fri, 08 Sep 2023 10:00:00 GMT</pubDate><category>mojo</category><category>mojo</category><category>python</category><category>AI</category><category>ubuntu</category><category>linux</category><category>2023</category><author>Zeyang Lin</author></item><item><title>[one-liner] Install Julia (juliaup)</title><link>https://blueberry-py.github.io/blog/post/one-liner-julia/</link><guid isPermaLink="true">https://blueberry-py.github.io/blog/post/one-liner-julia/</guid><description>&lt;h2 id=&quot;one-liner-series-juliaup&quot;&gt;One-Liner series: juliaup&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://julialang.org/downloads/#install_julia&quot;&gt;source: julialang.org&lt;/a&gt;&lt;/p&gt;
&lt;h3 id=&quot;install-on-ubuntu&quot;&gt;Install on Ubuntu&lt;/h3&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;curl&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; -fsSL&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; https://install.julialang.org&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; |&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; sh&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;update-on-ubuntu-via-release-channel&quot;&gt;Update on Ubuntu (via ‘release’ channel)&lt;/h3&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;juliaup&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; update&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; release&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
</description><pubDate>Tue, 16 May 2023 14:36:16 GMT</pubDate><category>julia</category><category>linux</category><category>julia</category><category>linux</category><category>ubuntu</category><author>Zeyang Lin</author></item><item><title>[one-liner] Install Rust (Rustup)</title><link>https://blueberry-py.github.io/blog/post/one-liner-rust/</link><guid isPermaLink="true">https://blueberry-py.github.io/blog/post/one-liner-rust/</guid><description>&lt;h2 id=&quot;one-liner-series-rustup&quot;&gt;One-Liner series: Rustup&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://rust-lang.org/learn/get-started/&quot;&gt;source: rust-lang.org&lt;/a&gt;&lt;/p&gt;
&lt;h3 id=&quot;install-on-ubuntu&quot;&gt;Install on Ubuntu&lt;/h3&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;curl&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; --proto&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &apos;=https&apos;&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; --tlsv1.2&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; -sSf&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; https://sh.rustup.rs&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; |&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; sh&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;update-on-ubuntu&quot;&gt;Update on Ubuntu&lt;/h3&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;rustup&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; update&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
</description><pubDate>Tue, 16 May 2023 14:24:06 GMT</pubDate><category>rust</category><category>linux</category><category>rust</category><category>linux</category><category>ubuntu</category><author>Zeyang Lin</author></item><item><title>Github 连接问题之 REMOTE HOST IDENTIFICATION HAS CHANGED!</title><link>https://blueberry-py.github.io/blog/post/github-remote-host-identification/</link><guid isPermaLink="true">https://blueberry-py.github.io/blog/post/github-remote-host-identification/</guid><description>&lt;h1 id=&quot;缘起&quot;&gt;缘起&lt;/h1&gt;
&lt;p&gt;今天在 git bash 命令行往 github push 代码的时候突然收到大大的警告信息，如下：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@ WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED! @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!
Someone could be eavesdropping on you right now (man-in-the-middle attack)!
It is also possible that a host key has just been changed.
The fingerprint for the RSA key sent by the remote host is
SHA256:uNiVztksCsDhcc0u9e8BujQXVUpKZIDTMczCvj3tD2s.
Please contact your system administrator.
Add correct host key in **************************** to get rid of this message.
Offending RSA key in ****************************:2
Host key for github.com has changed and you have requested strict checking.
Host key verification failed.
fatal: Could not read from remote repository.
Please make sure you have the correct access rights
and the repository exists.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;这个仓库是用 ssh 连接作为 remote 的。&lt;/p&gt;
&lt;h1 id=&quot;问题在哪&quot;&gt;问题在哪&lt;/h1&gt;
&lt;p&gt;遂 google 之，发现就在今天 github 的 blog 发了 &lt;a href=&quot;https://github.blog/2023-03-23-we-updated-our-rsa-ssh-host-key&quot;&gt;We updated our RSA SSH host key&lt;/a&gt;。&lt;/p&gt;
&lt;p&gt;原来github在今天下午1点左右把他们的 RSA SSH 主机 key 给换了。&lt;/p&gt;
&lt;p&gt;出现上面那个错误说明我在我的 ~/.ssh/known_hosts 里有过期的那个 key 的公钥。&lt;/p&gt;
&lt;h1 id=&quot;解决方法&quot;&gt;解决方法&lt;/h1&gt;
&lt;p&gt;blog中给出的解决方法很简单，把 &lt;code&gt;known_hosts&lt;/code&gt; 里的过期 key 删掉就行了：&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;$&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; ssh-keygen&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; -R&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; github.com&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;#Host github.com found: line 2&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;********&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;/.ssh/known_hosts updated.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;Original&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; contents&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; retained&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; as&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; **********&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;/.ssh/known_hosts.old&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;然后进行任意一项连接到 remote 的操作，比如 git fetch，就会提示把新的公钥添加到我的 &lt;code&gt;known_hosts&lt;/code&gt; 里，当然选 yes：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The authenticity of host ‘github.com (140.82.121.4)’ can’t be established.
ED25519 key fingerprint is SHA256:+DiY3wvvV6TuJJhbpZisF/zLDA0zPMSvHdkr4UvCOqU.
This key is not known by any other names.
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added ‘github.com’ (ED25519) to the list of known hosts.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;问题解决。&lt;/p&gt;
&lt;h1 id=&quot;后记&quot;&gt;后记&lt;/h1&gt;
&lt;p&gt;最新的公钥在 github docs 里就可以找到 &lt;a href=&quot;https://docs.github.com/en/authentication/keeping-your-account-and-data-secure/githubs-ssh-key-fingerprints&quot;&gt;GitHub’s SSH key fingerprints&lt;/a&gt; 。&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;github.com&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; ssh-ed25519&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; AAAAC3NzaC1lZDI1NTE5AAAAIOMqqnkVzrm0SdG6UOoqKLsabgH5C9okWi0dh2l9GKJl&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;github.com&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; ecdsa-sha2-nistp256&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBEmKSENjQEezOmxkZMy7opKgwFB9nkt5YRrYMjNuG5N87uRgg6CLrbo5wAdT/y6v0mKV0U2w0WZ2YB/++Tpockg=&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;github.com&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; ssh-rsa&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; AAAAB3NzaC1yc2EAAAADAQABAAABgQCj7ndNxQowgcQnjshcLrqPEiiphnt+VTTvDP6mHBL9j1aNUkY4Ue1gvwnGLVlOhGeYrnZaMgRK6+PKCUXaDbC7qtbW8gIkhL7aGCsOr/C56SJMy/BCZfxd1nWzAOxSDPgVsmerOBYfNqltV9/hWCqBywINIR+5dIg6JTJ72pcEpEjcYgXkE2YEFXV1JHnsKgbLWNlhScqb2UmyRkQyytRLtL+38TGxkxCflmO+5Z8CSSNY7GidjMIZ7Q4zMjA2n1nGrlTDkzwDCsw+wqFPGQA179cnfGWOWRVruj16z6XyvxvjJwbz0wQZ75XK5tKSb7FNyeIEs4TT4jk+S4dhPeAUC5y+bDYirYgM4GC7uEnztnZyaVWQ7B381AK4Qdrwt51ZqExKbQpTUNn+EjqoTwvqNj4kqx5QUCI0ThS/YkOxJCXmPUWZbhjpCg56i+2aB6CmK2JGhn57K5mj0MNdBXA4/WnwH6XoPWJzK5Nyu2zB3nAZp+S5hpQs+p1vN1/wsjk=&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;— 全文完 —&lt;/p&gt;
</description><pubDate>Fri, 24 Mar 2023 13:42:41 GMT</pubDate><category>git</category><category>github</category><category>ssh</category><category>git</category><category>bash</category><author>Zeyang Lin</author></item><item><title>[one-liner] Install Node.js and NPM</title><link>https://blueberry-py.github.io/blog/post/one-liner-nodejs/</link><guid isPermaLink="true">https://blueberry-py.github.io/blog/post/one-liner-nodejs/</guid><description>&lt;h2 id=&quot;one-liner-series-nodejs-and-npm&quot;&gt;One-Liner series: Node.js and NPM&lt;/h2&gt;
&lt;h3 id=&quot;option-1-deb-package-through-apt&quot;&gt;Option 1: DEB package through apt&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/nodesource/distributions/blob/master/README.md&quot;&gt;source: nodesource github&lt;/a&gt;&lt;/p&gt;
&lt;h4 id=&quot;install-on-ubuntu&quot;&gt;Install on Ubuntu&lt;/h4&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;curl&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; -fsSL&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; https://deb.nodesource.com/setup_24.x&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; |&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; sudo&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; -E&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; bash&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; -&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;sudo&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; apt&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; install&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; -y&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; nodejs&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h4 id=&quot;install-on-debian-as-root&quot;&gt;Install on Debian, as &lt;em&gt;root&lt;/em&gt;&lt;/h4&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;curl&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; -fsSL&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; https://deb.nodesource.com/setup_24.x&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; |&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; bash&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; -&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;apt&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; install&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; -y&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; nodejs&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;option-2-through-nvm-node-version-manager&quot;&gt;Option 2: Through NVM (Node Version Manager)&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://nodejs.org/en/download/package-manager&quot;&gt;source: nodejs.org&lt;/a&gt;&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# Install NVM&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;curl&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; -o-&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.3/install.sh&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; |&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; bash&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# Download and install Node.js&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;nvm&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; install&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 24&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
</description><pubDate>Sat, 07 May 2022 14:06:58 GMT</pubDate><category>nodejs</category><category>linux</category><category>nodejs</category><category>linux</category><category>javascript</category><category>ubuntu</category><category>debian</category><author>Zeyang Lin</author></item><item><title>[one-liner] Install minikube, kubectl and kustomize</title><link>https://blueberry-py.github.io/blog/post/one-liner-kubernetes/</link><guid isPermaLink="true">https://blueberry-py.github.io/blog/post/one-liner-kubernetes/</guid><description>&lt;h2 id=&quot;one-liner-series-minikube-kubectl-and-kustomize&quot;&gt;One-liner series: minikube, kubectl and kustomize&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;OS&lt;/th&gt;
&lt;th&gt;Shell&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Ubuntu 20.04 amd64&lt;/td&gt;
&lt;td&gt;Bash&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id=&quot;install-minikube&quot;&gt;Install minikube&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://minikube.sigs.k8s.io/docs/start/&quot;&gt;source&lt;/a&gt;&lt;/p&gt;
&lt;h4 id=&quot;as-binary&quot;&gt;As Binary&lt;/h4&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;curl&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; -LO&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;sudo&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; install&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; minikube-linux-amd64&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; /usr/local/bin/minikube&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; &amp;amp;&amp;amp; &lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;rm&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; minikube-linux-amd64&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h4 id=&quot;as-deb&quot;&gt;As DEB&lt;/h4&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;curl&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; -LO&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; https://storage.googleapis.com/minikube/releases/latest/minikube_latest_amd64.deb&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;sudo&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; dpkg&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; -i&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; minikube_latest_amd64.deb&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;install-kubectl&quot;&gt;Install kubectl&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://kubernetes.io/docs/tasks/tools/install-kubectl-linux/#install-kubectl-binary-with-curl-on-linux&quot;&gt;source&lt;/a&gt;&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;curl&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; -LO&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &quot;https://dl.k8s.io/release/$(&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;curl&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; -L&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; -s&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;sudo&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; install&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; -o&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; root&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; -g&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; root&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; -m&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 0755&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; kubectl&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; /usr/local/bin/kubectl&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;To download a specific version, replace the $(curl -L -s &lt;a href=&quot;https://dl.k8s.io/release/stable.txt&quot;&gt;https://dl.k8s.io/release/stable.txt&lt;/a&gt;) portion of the command with the specific version.
eg. v1.30.0: &lt;code&gt;curl -LO https://dl.k8s.io/release/v1.30.0/bin/linux/amd64/kubectl&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id=&quot;install-kustomize&quot;&gt;Install kustomize&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://kubectl.docs.kubernetes.io/installation/kustomize/binaries/&quot;&gt;source&lt;/a&gt;&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;curl&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; -s&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &quot;https://raw.githubusercontent.com/kubernetes-sigs/kustomize/master/hack/install_kustomize.sh&quot;&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;  |&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; bash&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;sudo&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; install&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; -o&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; root&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; -g&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; root&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; -m&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 0755&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; kustomize&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; /usr/local/bin/kustomize&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;hr&gt;
&lt;h3 id=&quot;setup-command-line-completion-for-minikube&quot;&gt;Setup command-line completion for minikube&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://minikube.sigs.k8s.io/docs/commands/completion/#minikube-completion-bash&quot;&gt;source&lt;/a&gt;&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;sudo&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; su&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; root&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; &amp;amp;&amp;amp; &lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;minikube&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; completion&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; bash&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; &amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; /etc/bash_completion.d/minikube&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;setup-command-line-completion-for-kubectl&quot;&gt;Setup command-line completion for kubectl&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://kubernetes.io/docs/tasks/tools/install-kubectl-linux/#enable-shell-autocompletion&quot;&gt;source&lt;/a&gt;&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;sudo&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; kubectl&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; completion&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; bash&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; &amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; /etc/bash_completion.d/kubectl&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;setup-command-line-completion-for-kustomize&quot;&gt;Setup command-line completion for kustomize&lt;/h3&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;sudo&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; kustomize&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; completion&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; bash&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; &amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; /etc/bash_completion.d/kustomize&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
</description><pubDate>Wed, 23 Jun 2021 09:33:22 GMT</pubDate><category>kubernetes</category><category>linux</category><category>kubernetes</category><category>linux</category><category>ubuntu</category><author>Zeyang Lin</author></item><item><title>[one-liner] Install Docker Engine community and docker-compose</title><link>https://blueberry-py.github.io/blog/post/one-liner-docker-engine/</link><guid isPermaLink="true">https://blueberry-py.github.io/blog/post/one-liner-docker-engine/</guid><description>&lt;h2 id=&quot;one-liner-series-docker-and-docker-compose&quot;&gt;One-Liner series: Docker and docker-compose&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;OS&lt;/th&gt;
&lt;th&gt;Shell&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Ubuntu Server 22.04 Jammy&lt;/td&gt;
&lt;td&gt;Bash&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id=&quot;install-docker-engine-community&quot;&gt;Install Docker Engine community&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://docs.docker.com/engine/install/ubuntu/#install-using-the-convenience-script&quot;&gt;source&lt;/a&gt;&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;curl&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; -fsSL&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; https://get.docker.com&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; -o&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; get-docker.sh&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; &amp;amp;&amp;amp; &lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;sudo&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; sh&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; ./get-docker.sh&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;docker-compose is now installed along with docker engine, and becomes&lt;/strong&gt; &lt;code&gt;docker compose&lt;/code&gt;.
&lt;strong&gt;However docker-compose can still be installed as a stand-alone binary&lt;/strong&gt;:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;sudo&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; curl&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; -SL&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; https://github.com/docker/compose/releases/download/v2.27.0/docker-compose-linux-x86_64&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; -o&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; /usr/local/bin/docker-compose&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
</description><pubDate>Wed, 23 Jun 2021 08:11:39 GMT</pubDate><category>docker</category><category>linux</category><category>docker</category><category>linux</category><category>ubuntu</category><author>Zeyang Lin</author></item><item><title>My Visual Studio Code extensions for python &amp; other development</title><link>https://blueberry-py.github.io/blog/post/my-vs-code-extensions/</link><guid isPermaLink="true">https://blueberry-py.github.io/blog/post/my-vs-code-extensions/</guid><description>&lt;h3 id=&quot;python&quot;&gt;Python&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;ms-python.python&lt;/code&gt;&lt;/p&gt;
&lt;h3 id=&quot;pylance&quot;&gt;Pylance&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;ms-python.vscode-pylance&lt;/code&gt;&lt;/p&gt;
&lt;h3 id=&quot;black-formatter&quot;&gt;Black Formatter&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;ms-python.black-formatter&lt;/code&gt;&lt;/p&gt;
&lt;h3 id=&quot;flake8&quot;&gt;Flake8&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;ms-python.flake8&lt;/code&gt;&lt;/p&gt;
&lt;h3 id=&quot;isort&quot;&gt;isort&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;ms-python.isort&lt;/code&gt;&lt;/p&gt;
&lt;h3 id=&quot;jupyter&quot;&gt;Jupyter&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;ms-toolsai.jupyter&lt;/code&gt;&lt;/p&gt;
&lt;h3 id=&quot;data-wrangler&quot;&gt;Data Wrangler&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;ms-toolsai.datawrangler&lt;/code&gt;&lt;/p&gt;
&lt;h3 id=&quot;mypy-type-checker&quot;&gt;Mypy Type Checker&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;ms-python.mypy-type-checker&lt;/code&gt;&lt;/p&gt;
&lt;h3 id=&quot;pylint&quot;&gt;Pylint&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;ms-python.pylint&lt;/code&gt;&lt;/p&gt;
&lt;h3 id=&quot;ruff&quot;&gt;Ruff&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;charliermarsh.ruff&lt;/code&gt;&lt;/p&gt;
&lt;h3 id=&quot;ty&quot;&gt;ty&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;astral-sh.ty&lt;/code&gt;&lt;/p&gt;
&lt;h3 id=&quot;autodocstring-vscode-python-docstring-generator&quot;&gt;autoDocstring: VSCode Python Docstring Generator&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;njpwerner.autodocstring&lt;/code&gt;&lt;/p&gt;
&lt;h3 id=&quot;python-indent&quot;&gt;Python Indent&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;kevinrose.vsc-python-indent&lt;/code&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;sublime-text-keymap-and-settings-importer&quot;&gt;Sublime Text Keymap and Settings Importer&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;ms-vscode.sublime-keybindings&lt;/code&gt;
&lt;strong&gt;note that&lt;/strong&gt; it automatically imports sublime key bindings after installation, although it also prompts you to explicitly import a sublime settings file (while could be ignored).&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;docker&quot;&gt;Docker&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;ms-azuretools.vscode-docker&lt;/code&gt;&lt;/p&gt;
&lt;h3 id=&quot;kubernetes&quot;&gt;Kubernetes&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;ms-kubernetes-tools.vscode-kubernetes-tools&lt;/code&gt;&lt;/p&gt;
&lt;h3 id=&quot;remote---ssh&quot;&gt;Remote - SSH&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;ms-vscode-remote.remote-ssh&lt;/code&gt;&lt;/p&gt;
&lt;h3 id=&quot;remote---containers&quot;&gt;Remote - Containers&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;ms-vscode-remote.remote-containers&lt;/code&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;gitlens&quot;&gt;GitLens&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;eamodio.gitlens&lt;/code&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;vscode-json&quot;&gt;vscode-json&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;andyyaldoo.vscode-json&lt;/code&gt;&lt;/p&gt;
&lt;h3 id=&quot;yaml&quot;&gt;YAML&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;redhat.vscode-yaml&lt;/code&gt;&lt;/p&gt;
&lt;h3 id=&quot;even-better-toml&quot;&gt;Even Better TOML&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;tamasfe.even-better-toml&lt;/code&gt;&lt;/p&gt;
&lt;h3 id=&quot;rainbow-csv&quot;&gt;Rainbow CSV&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;mechatroner.rainbow-csv&lt;/code&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;prettier---code-formatter&quot;&gt;Prettier - Code formatter&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;esbenp.prettier-vscode&lt;/code&gt;&lt;/p&gt;
&lt;h3 id=&quot;prettier-sql-vscode&quot;&gt;Prettier SQL VSCode&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;inferrinizzard.prettier-sql-vscode&lt;/code&gt;&lt;/p&gt;
&lt;h3 id=&quot;sql-formatter&quot;&gt;SQL Formatter&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;adpyke.vscode-sql-formatter&lt;/code&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;mojo&quot;&gt;Mojo&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;modular-mojotools.vscode-mojo&lt;/code&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;amazon-q&quot;&gt;Amazon Q&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;amazonwebservices.amazon-q-vscode&lt;/code&gt;&lt;/p&gt;
&lt;h3 id=&quot;baidu-comate&quot;&gt;Baidu Comate&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;baiducomate.comate&lt;/code&gt;&lt;/p&gt;
&lt;h3 id=&quot;cline&quot;&gt;Cline&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;saoudrizwan.claude-dev&lt;/code&gt;&lt;/p&gt;
&lt;h3 id=&quot;codegeex&quot;&gt;CodeGeeX&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;aminer.codegeex&lt;/code&gt;&lt;/p&gt;
&lt;h3 id=&quot;windsurf-plugin-formerly-codeium&quot;&gt;Windsurf Plugin (formerly Codeium)&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;codeium.codeium&lt;/code&gt;&lt;/p&gt;
&lt;h3 id=&quot;gemini-code-assist&quot;&gt;Gemini Code Assist&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;google.geminicodeassist&lt;/code&gt;&lt;/p&gt;
&lt;h3 id=&quot;google-cloud-code&quot;&gt;Google Cloud Code&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;googlecloudtools.cloudcode&lt;/code&gt;&lt;/p&gt;
&lt;h3 id=&quot;github-copilot&quot;&gt;Github Copilot&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;github.copilot&lt;/code&gt;&lt;/p&gt;
&lt;h3 id=&quot;github-copilot-chat&quot;&gt;Github Copilot Chat&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;github.copilot-chat&lt;/code&gt;&lt;/p&gt;
&lt;h3 id=&quot;iflycode&quot;&gt;iFlyCode&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;anhuizhuojiantechnology.iflycode&lt;/code&gt;&lt;/p&gt;
&lt;h3 id=&quot;tongyi-lingma&quot;&gt;TONGYI Lingma&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;alibaba-cloud.tongyi-lingma&lt;/code&gt;&lt;/p&gt;
&lt;h3 id=&quot;trae-aiformerly-marscode-coding-assistant&quot;&gt;Trae AI(formerly MarsCode): Coding Assistant&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;marscode.marscode-extension&lt;/code&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;hr&gt;
&lt;h3 id=&quot;github-theme&quot;&gt;GitHub Theme&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;github.github-vscode-theme&lt;/code&gt;&lt;/p&gt;
</description><pubDate>Mon, 31 May 2021 01:47:01 GMT</pubDate><category>python</category><category>python</category><category>vscode</category><category>IDE</category><category>git</category><category>ssh</category><category>AI</category><author>Zeyang Lin</author></item></channel></rss>