<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:cc="http://cyber.law.harvard.edu/rss/creativeCommonsRssModule.html">
    <channel>
        <title><![CDATA[Fhinkel - Medium]]></title>
        <description><![CDATA[Node.js and JavaScript - Medium]]></description>
        <link>https://medium.com/fhinkel?source=rss----c922b1002fdf---4</link>
        <image>
            <url>https://cdn-images-1.medium.com/proxy/1*TGH72Nnw24QL3iV9IOm4VA.png</url>
            <title>Fhinkel - Medium</title>
            <link>https://medium.com/fhinkel?source=rss----c922b1002fdf---4</link>
        </image>
        <generator>Medium</generator>
        <lastBuildDate>Sat, 14 Nov 2026 01:55:14 GMT</lastBuildDate>
        <atom:link href="https://medium.com/feed/fhinkel" rel="self" type="application/rss+xml"/>
        <webMaster><![CDATA[yourfriends@medium.com]]></webMaster>
        <atom:link href="http://medium.superfeedr.com/" rel="hub"/>
        <item>
            <title><![CDATA[Python Packaging in 2025: Introducing uv, A Speedy New Contender ]]></title>
            <link>https://medium.com/fhinkel/python-packaging-in-2025-introducing-uv-a-speedy-new-contender-cbf408726687?source=rss----c922b1002fdf---4</link>
            <guid isPermaLink="false">https://medium.com/p/cbf408726687</guid>
            <category><![CDATA[package-management]]></category>
            <category><![CDATA[python]]></category>
            <category><![CDATA[python-programming]]></category>
            <dc:creator><![CDATA[Franziska Hinkelmann]]></dc:creator>
            <pubDate>Tue, 29 Apr 2025 18:37:20 GMT</pubDate>
            <atom:updated>2025-04-29T18:37:20.794Z</atom:updated>
            <content:encoded><![CDATA[<p>The Python ecosystem is vibrant and powerful, but let’s be honest: managing dependencies, environments, and packaging workflows can sometimes feel like wrangling snakes. We developers often juggle a collection of tools — <em>pip</em> for installing, <em>venv</em> or <em>virtualenv</em> for isolation, <em>pip-tools</em> for locking, <em>pipx</em> for running tools, <em>pyenv</em> for managing Python versions, and perhaps <em>twine</em> for publishing. While each serves its purpose, the combination can lead to complexity and slowdowns.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*FWudKP3Vd6-hgzC-sTNjVQ.png" /></figure><p>Enter <em>uv</em>, a project from Astral, launched in 2025 and written in Rust. This post explores what <em>uv</em> brings to the table and why it’s a tool worth watching.</p><h3>What’s the Big Deal? Speed &amp; The uv Philosophy</h3><p>Two core tenets define <em>uv</em>’s appeal: speed and a philosophy of unification.</p><h3>The Need for Speed (Seriously, It’s Fast!) ⚡️</h3><p>One of <em>uv</em>’s most attention-grabbing claims is its speed — reported to be 10 to 100 times faster than <em>pip</em> and related tools, especially with a “warm” cache (meaning dependencies have been downloaded previously). This isn’t just marketing hype; it stems from deliberate design choices.</p><p>Built in Rust, <em>uv</em> leverages performance advantages inherent in the language. It employs techniques like parallel downloads and efficient dependency resolution to minimize waiting times. A key architectural element is its advanced caching mechanism. Instead of just storing downloaded package archives (like zip files), <em>uv</em> unpacks these archives directly into a global cache upon download. When a package like NumPy is needed in multiple virtual environments, <em>uv</em> doesn’t repeatedly copy files. Instead, it creates hard links or reflinks (depending on the filesystem) from the virtual environment back to the single cached copy. This approach is not only significantly faster for subsequent installs but also remarkably disk-space efficient, reducing the redundant storage common in traditional workflows. If you work on large projects or in environments where quick setup is crucial (like CI/CD pipelines), these speed gains can translate into substantial time savings.</p><h3>One Tool to Rule Them All? unifying the Workflow 🛠️</h3><p>Beyond sheer speed, <em>uv</em> aims to consolidate the functionality of numerous separate tools into a single, cohesive command-line interface. The goal is to replace the common combination of <em>pip</em>, <em>pip-tools</em>, <em>virtualenv</em>, <em>pipx</em>, <em>pyenv</em>, and even <em>twine</em>.</p><p>This unification offers several potential benefits. It reduces the number of tools a developer needs to learn, install, and manage. It promotes a more consistent workflow across different aspects of project management, from initial setup and dependency handling to running tools and managing Python versions themselves. This simplification can lower the cognitive load and reduce the friction often associated with Python environment and package management.</p><h3>Under the Hood: Project Management with pyproject.toml and uv.lock 🗂️</h3><p>For managing projects, <em>uv</em> adopts modern Python standards, primarily using the <em>pyproject.toml</em> file. Similar to tools like Poetry or PDM, <em>pyproject.toml</em> serves as the central configuration file where you define core project metadata and direct dependencies.</p><p>When dependencies are resolved, <em>uv</em> generates a <em>uv.lock</em> file. This lock file captures the exact versions of all packages in the dependency tree (including transitive dependencies), ensuring <strong>reproducible builds across different machines and environments</strong>. A key feature is that <em>uv.lock</em> is cross-platform, storing information needed to reconstruct the environment consistently regardless of the operating system or Python version (within the project’s constraints). This contrasts with traditional <em>requirements.txt</em> files generated by <em>pip freeze</em>, which are often environment-specific. The combination of <em>pyproject.toml</em> for defining intent and <em>uv.lock</em> for ensuring reproducibility forms the backbone of <em>uv</em>’s project management capabilities. Furthermore, <em>uv</em> supports Cargo-style workspaces, enabling more scalable management of monorepos or projects composed of multiple related packages.</p><h3>Beyond Installation: uv’s Expanding Capabilities</h3><p>While fast installation and locking are major draws, <em>uv</em>’s capabilities extend further, integrating tasks often handled by separate utilities.</p><h3>Comprehensive Project Management</h3><p><em>uv</em> provides a complete workflow for managing Python projects. The process typically starts with <em>uv init &lt;project-name&gt;</em>, which sets up a basic project structure including a <em>pyproject.toml</em> file. Dependencies are added using <em>uv add &lt;package-name&gt;</em>, which updates <em>pyproject.toml</em>, resolves dependencies, writes to <em>uv.lock</em>, and installs the package into a local virtual environment (usually <em>.venv</em>), creating the environment if it doesn’t exist.</p><p>The <em>uv sync</em> command ensures the virtual environment accurately reflects the state defined in <em>uv.lock</em>. To execute code within the project’s managed environment, <em>uv run &lt;command&gt;</em> can be used, automatically handling environment activation. This integrated approach streamlines the common cycle of defining, installing, and running project dependencies. <em>uv</em> also includes commands for building and publishing packages.</p><h3>Even More Tricks: Scripts, Tools, and Python Versions</h3><p><em>uv</em> incorporates several other helpful features:</p><ul><li><strong>Running Single-File Scripts:</strong> For simple scripts, <em>uv</em> offers a way to manage dependencies without a full project setup. Developers can add inline metadata comments (<em># /// script</em>) within the Python file to declare dependencies (e.g., <em># /// requires = [“requests”]</em>). Running the script with <em>uv run example.py</em> causes <em>uv</em> to automatically create a temporary, isolated environment, install the declared dependencies, and execute the script. This is particularly useful for utility scripts or quick experiments.</li><li><strong>Executing Tools with <em>uvx</em>:</strong> Similar to <em>npx</em> in Node.js or <em>pipx</em> in Python, <em>uv</em> provides <em>uvx</em> (an alias for uv tool run) to execute command-line tools distributed as Python packages in ephemeral environments. For instance, running <em>uvx black .</em> will download <em>black</em> (if needed), run it in a temporary environment, and then discard the environment. This avoids polluting the global or project environment with tools only needed occasionally.5 Specific versions or extras can be requested (e.g., <em>uvx ruff@0.3.0 check</em> or <em>uvx — from ‘mypy[reports]’ mypy</em>). Tools can also be installed persistently into a shared location (isolated from projects) using <em>uv tool install &lt;package-name&gt;</em>.</li><li><strong>Managing Python Versions:</strong> <em>uv</em> steps into the territory of tools like <em>pyenv</em> by offering capabilities to install and manage Python versions. The command <em>uv python install &lt;version&gt;</em> fetches and installs specified CPython versions (using builds from the python-build-standalone project) or even alternative implementations like PyPy (<em>uv python install pypy@3.10</em>). <em>uv python list</em> shows available and installed versions. While uv-installed Pythons aren’t automatically added to the global PATH by default (though this is in preview), they can be easily used for creating environments (<em>uv venv --python 3.11</em>) or running commands (<em>uv run --python 3.12 python script.py</em>). Crucially, <em>uv</em> can automatically download and install a required Python version if it’s not found when needed by a command, simplifying setup. Project-specific Python versions can also be pinned using a <em>.python-version</em> file.</li></ul><p>These additional features underscore <em>uv</em>’s ambition to be a truly comprehensive tool, addressing multiple facets of the Python development lifecycle within a single interface.</p><h3>Getting Started: Practical uv Examples</h3><p>Reading about features is one thing; seeing them in action is another. Here are some practical examples to illustrate how <em>uv</em> can be used.</p><h3>Super Simple Setup</h3><p>Installation is designed to be straightforward.</p><ul><li><strong>On macOS and Linux:</strong><br><em>curl -LsSf </em><a href="https://astral.sh/uv/install.sh"><em>https://astral.sh/uv/install.sh</em></a><em> | sh</em></li><li><strong>On Windows (using PowerShell as Administrator):</strong><br><em>powershell -ExecutionPolicy ByPass -c “irm </em><a href="https://astral.sh/uv/install.ps1"><em>https://astral.sh/uv/install.ps1</em></a><em> | iex”</em></li></ul><p>Alternative methods like Homebrew (<em>brew install uv</em>) are also available. After installation, verify it with <em>uv --version</em>.</p><h3>Zooming into 2025: Why uv Isn’t Just a Shooting Star</h3><p>The problems <em>uv</em> aims to solve — slow installations, complex tooling, and environment inconsistencies — are likely to become <em>more</em> acute by 2025. As projects grow larger, incorporate more complex dependencies (especially in fields like AI/ML), and rely on faster, more efficient CI/CD pipelines, the need for speed and reliability in packaging tools will only increase. <em>uv</em>’s core strengths directly address these anticipated future needs. Its potential to significantly simplify and accelerate common Python development workflows positions it well for continued relevance and potentially widespread adoption in the coming years.</p><h3>Conclusion: Ready to Give the Python Workflow a Turbo Boost?</h3><p>If you are a Python developer looking to streamline your workflows and boost productivity, <em>uv</em> is undoubtedly a tool to investigate. Consider trying its <em>pip</em>-compatible interface in an existing project for an instant speed boost, or initialize a new project with <em>uv init</em> to explore its full potential. The journey towards a faster, simpler Python development experience might just start with <em>uv</em>.</p><p><strong>Further Resources:</strong></p><ul><li><strong>Official Documentation:</strong> <a href="https://docs.astral.sh/uv/">https://docs.astral.sh/uv/</a></li><li><strong>GitHub Repository:</strong> <a href="https://github.com/astral-sh/uv">https://github.com/astral-sh/uv</a></li></ul><p><em>Help others find this article by clapping.</em></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=cbf408726687" width="1" height="1" alt=""><hr><p><a href="https://medium.com/fhinkel/python-packaging-in-2025-introducing-uv-a-speedy-new-contender-cbf408726687">Python Packaging in 2025: Introducing uv, A Speedy New Contender 🚀</a> was originally published in <a href="https://medium.com/fhinkel">Fhinkel</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Google’s A2A Protocol: Enabling the Conversation Between AI Agents]]></title>
            <link>https://medium.com/fhinkel/googles-a2a-protocol-enabling-the-conversation-between-ai-agents-55202b16fa20?source=rss----c922b1002fdf---4</link>
            <guid isPermaLink="false">https://medium.com/p/55202b16fa20</guid>
            <category><![CDATA[multiagent-system]]></category>
            <category><![CDATA[ai-agent]]></category>
            <category><![CDATA[genai]]></category>
            <category><![CDATA[interoperability]]></category>
            <dc:creator><![CDATA[Franziska Hinkelmann]]></dc:creator>
            <pubDate>Thu, 24 Apr 2025 12:45:55 GMT</pubDate>
            <atom:updated>2025-04-24T12:45:55.418Z</atom:updated>
            <content:encoded><![CDATA[<p>The landscape of Artificial Intelligence is rapidly evolving. We’re moving beyond monolithic AI systems towards a future populated by specialized AI “agents,” each excelling at specific tasks like summarizing documents, generating images, booking travel, or analyzing financial data. However, while these individual agents become increasingly capable, a significant hurdle remains: they often operate in silos, unable to effectively communicate or collaborate with one another. This lack of interoperability creates friction, necessitates complex and brittle custom integrations, and ultimately limits the potential of multi-agent AI systems, especially within enterprise environments where seamless workflows across different platforms are crucial. Industry experts anticipate that a vast majority (70%) of businesses deploying AI today expect to use agentic architectures soon, highlighting the urgent need for a solution.</p><blockquote>A standardized way for AI agents, regardless of the framework they’re built on or the vendor who created them, to discover each other, communicate securely, exchange information, and coordinate actions.</blockquote><p>The absence of a common communication standard acts as a major bottleneck. Building custom “glue code” between every pair of agents is inefficient, doesn’t scale, and breaks easily when components are updated. This mirrors the early days of the internet before standardized protocols like HTTP enabled seamless web communication. Without a standard, we risk creating fragmented “mini-internets” of AI agents unable to harness collective intelligence.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*xZKVUTuIi53It4XezHvbPA.png" /></figure><p>Enter Google’s Agent-to-Agent (A2A) protocol. Launched in April 2025 with backing from over 50 technology and service partners, A2A is an open protocol designed to be a “universal handshake” or the “HTTP for AI agents”. It aims to provide a standardized way for AI agents, regardless of the framework they’re built on or the vendor who created them, to discover each other, communicate securely, exchange information, and coordinate actions.</p><h3>What is Google’s A2A Protocol? Diving into the Core Concepts</h3><p>At its heart, Google’s A2A is a specification — a set of rules and formats — defining how independent AI agents interact at a messaging level. It’s designed explicitly for agent-to-agent communication, enabling collaboration between autonomous, potentially “opaque” agents (meaning their internal workings don’t need to be exposed) built using different technologies.</p><p>The overarching goal is to establish a common language, breaking down the communication silos that currently hinder multi-agent systems. By providing this standard, we aim to democratize advanced agent interactions and, crucially, enable true multi-agent scenarios where <strong>agents collaborate as peers</strong>, rather than simply being treated as callable “tools” by a central orchestrator.</p><p>We designed A2A around five key principles :</p><ol><li><strong>Embrace agentic capabilities</strong>: The protocol focuses on allowing agents to interact using their natural, often unstructured modalities (like text, potentially evolving to voice or video), preserving their autonomy even if they don’t share memory or internal tools.</li><li><strong>Build on existing standards</strong>: A2A leverages familiar web technologies like HTTP/HTTPS, JSON-RPC, and Server-Sent Events (SSE). This pragmatic choice significantly lowers the barrier to adoption for developers and allows easier integration into existing enterprise IT infrastructure, avoiding the need to learn entirely new transport mechanisms.</li><li><strong>Secure by default</strong>: Enterprise-grade security is a core tenet, with support for authentication and authorization mechanisms comparable to OpenAPI standards.</li><li><strong>Support for long-running tasks</strong>: A2A is designed to handle interactions that might take minutes, hours, or even days, potentially involving human-in-the-loop scenarios, providing mechanisms for status updates and feedback.</li><li><strong>Modality agnostic</strong>: Recognizing that agent interactions aren’t limited to text, A2A supports various data types, including audio and video streaming.</li></ol><h3>Technical Deep Dive: How A2A Works</h3><p>A2A employs a client-server architecture. An “A2A Client” (which could be an application or another agent) initiates requests, formulating tasks it needs help with. An “A2A Server” (a remote agent exposing an A2A endpoint) receives these requests and acts upon them. An agent can act as both a client and a server depending on the interaction. The protocol allows these agents to remain “opaque,” meaning they collaborate based on declared capabilities without revealing their internal implementation details.</p><p>The protocol is built around several core components:</p><ul><li><strong>Agent Card</strong>: This is a public JSON metadata file, typically found at /.well-known/agent.json relative to the agent&#39;s base URL. It serves as a digital business card, allowing agents to discover each other and understand their capabilities. Key fields include the agent&#39;s name, description, endpoint URL, protocol version, authentication requirements, capability flags (like support for streaming or push notifications), and a list of specific skills offered.</li><li><strong>Task</strong>: The central unit of work or conversation within A2A. Each task has a unique ID generated by the client and progresses through a defined lifecycle with states like submitted, working, input-required, completed, failed, canceled, and unknown. This stateful task abstraction is fundamental to managing potentially complex, long-running, and interactive collaborations, distinguishing A2A from simple, stateless API calls and enabling more sophisticated delegation scenarios.</li><li><strong>Message</strong>: Represents a single turn in the conversation between the client (role: “user”) and the server agent (role: “agent”). Messages contain one or more Parts.</li><li><strong>Part</strong>: The basic unit of content within a Message or Artifact. A2A defines standard part types: TextPart for plain text, FilePart for binary data (either inline base64-encoded bytes or a URI pointing to the file), and DataPart for structured JSON data (e.g., for forms).</li><li><strong>Artifact</strong>: Represents the final outputs or deliverables generated by the agent during a task, such as generated files or structured data results. Artifacts also contain Parts.</li></ul><p>The typical communication flow involves:</p><ol><li><strong>Discovery</strong>: The client agent fetches the remote agent’s Agent Card from its well-known URL to learn its capabilities and endpoint.</li><li><strong>Initiation</strong>: The client generates a unique Task ID and sends an initial message to the server agent’s endpoint using either the tasks/send or tasks/sendSubscribe method.</li><li><strong>Processing</strong>:</li></ol><ul><li>For tasks/send (synchronous), the server processes the task and returns the final Task object, including any artifacts, in the HTTP response. This is suitable for quick tasks.</li><li>For tasks/sendSubscribe (streaming), the server keeps the connection open and sends real-time updates back to the client using Server-Sent Events (SSE). These events can be TaskStatusUpdateEvent (indicating changes in the task&#39;s state) or TaskArtifactUpdateEvent (delivering partial or complete results). This is ideal for long-running tasks or interactive sessions.</li></ul><p>4. <strong>Interaction (Optional)</strong>: If a task enters the input-required state, the server agent is waiting for more information. The client can send subsequent messages using the same Task ID via tasks/send or tasks/sendSubscribe to provide the needed input.</p><p>5.<strong> Push Notifications (Optional)</strong>: Servers supporting this capability can proactively send task updates to a webhook URL provided by the client (configured via tasks/pushNotification/set), avoiding the need for the client to maintain an open connection or poll for updates.</p><p>Under the hood, A2A relies on standard HTTP/HTTPS (HTTPS is required for production deployments) as the transport layer, JSON-RPC 2.0 for structuring requests and responses, and Server-Sent Events (SSE) for streaming capabilities. Security is handled through standard enterprise-grade authentication and authorization methods (specified in the Agent Card), with TLS encryption being mandatory for secure communication. Detailed structures for the JSON objects like AgentCard, Task, Message, Part, and Artifact are defined in the official JSON specification.</p><h3>A2A vs. The World: Comparisons with Other Frameworks</h3><p>How does A2A stack up against existing approaches for connecting AI systems?</p><p><strong>Traditional AI Integration (REST/GraphQL APIs)</strong></p><p>Before protocols like A2A, integrating different AI services typically involved creating custom REST or GraphQL APIs for each component. This leads to an “API explosion,” where developers must manage numerous unique endpoints, each with its own request/response structure. This approach creates tight coupling — systems become directly dependent on the specific interfaces of the services they call, making the overall architecture brittle. Swapping out a model or adding a step often requires significant code changes and risks breaking existing integrations.</p><p>A2A aims to solve this by providing a standardized messaging layer. Instead of custom endpoints, agents communicate using a shared schema and protocol. This promotes modularity (agents can be developed independently) and loose coupling, making the system more scalable and resilient to change. A2A facilitates a more adaptive, context-aware interaction model compared to the rigid request-response pattern of traditional APIs.</p><p><strong>Anthropic’s Model Context Protocol (MCP)</strong></p><p>Perhaps the most discussed comparison is with Anthropic’s Model Context Protocol (MCP). A2A is <em>complementary</em> to MCP, we like to say “A2A ❤️ MCP”.</p><p>The protocols serve distinct roles:</p><ul><li><strong>MCP</strong> focuses on <strong>Agent-to-Tool/Resource</strong> communication. It provides a standard way for an AI model (or agent) to access external tools, APIs, databases, or other resources, often involving structured inputs and outputs. Think of it as standardizing how an agent uses its tools.</li><li><strong>A2A</strong> focuses on <strong>Agent-to-Agent</strong> collaboration. It standardizes how independent, autonomous agents discover each other and engage in potentially dynamic, multi-turn, and multimodal conversations to achieve a shared goal. Think of it as standardizing how agents talk <em>to each other</em>.</li></ul><p>A common analogy used is that MCP provides the “wrench” (tool access), while A2A facilitates the “dialogue between mechanics” (agent collaboration). A travel agent might use A2A to coordinate with separate flight and hotel booking agents, and those agents might internally use MCP to interact with the actual booking APIs or databases.</p><p>Both protocols aim to help developers build complex AI applications leveraging multiple components. The line between a sophisticated “tool” and a simple “agent” can be blurry. Could MCP, with its ability to stream responses, be adapted for agent-like communication? Could A2A be used to interact with agents that primarily act as wrappers around tools? Ultimately, developer preference and which protocol proves simpler and more effective in practice may determine the outcome.</p><p><strong>gRPC-based Multi-Agent Systems</strong></p><p>Before A2A, some multi-agent systems used frameworks like gRPC for communication. gRPC is known for high performance, leveraging protocol buffers for efficient serialization. A2A, relying on HTTP and JSON-RPC/SSE, might offer easier integration with standard web infrastructure and simpler firewall traversal. More importantly, A2A provides not just a transport mechanism but a specific <em>application-level protocol</em> defining agent discovery (Agent Cards), task lifecycles, standardized message parts, etc., aimed at facilitating agentic collaboration beyond basic RPC calls. While gRPC focuses on efficient RPC, A2A focuses on standardizing the <em>semantics</em> of agent interaction across different implementations.</p><p><strong>Workflow Orchestration (e.g., AWS Step Functions)</strong></p><p>Workflow orchestration tools like AWS Step Functions excel at defining and executing structured workflows, often involving sequences of serverless functions or managed services. They typically involve a central definition of states and transitions. A2A, in contrast, is designed for potentially more dynamic and decentralized communication <em>between</em> autonomous agents. The interaction flow in A2A isn’t necessarily predefined in a central workflow but emerges from the agents discovering capabilities and collaborating on tasks. While distinct, they aren’t mutually exclusive; an agent whose internal logic is orchestrated by Step Functions could still use A2A to communicate with external agents. A2A provides the <em>protocol</em> for interaction, whereas Step Functions provides the <em>service</em> for executing a defined workflow.</p><h3>Developer Resources and Community</h3><p>Here’s a list of resources to help developers get started with A2A:</p><ul><li><a href="http://google.github.io/A2A/"><strong>Official Documentation</strong></a>: includes technical documentation, key topic explanations (like A2A vs. MCP, discovery, security), and the JSON specification.</li><li><a href="https://github.com/google/A2A"><strong>GitHub Repository</strong></a>: specification source, documentation, and official code samples.</li><li>GitHub Issues (for bugs and protocol suggestions) and Discussions (for general questions and ideas) on the repository. Broader developer forums on Reddit, such as <a href="https://www.reddit.com/r/AI_Agents/">r/AI_Agents</a>.</li></ul><h3>Conclusion: The Road Ahead for Agent Collaboration</h3><p>Google’s Agent2Agent protocol represents a significant and ambitious effort to establish a much-needed standard for interoperability in the rapidly expanding world of AI agents. By providing an open, common language built on familiar web standards, A2A aims to break down the silos that currently limit the potential of multi-agent systems, particularly within complex enterprise environments.</p><p>The potential benefits are substantial: unlocking synergistic effects where specialized agents collaborate dynamically, simplifying the integration of diverse AI capabilities into cohesive workflows, reducing custom development overhead, and fostering innovation through a more open and composable ecosystem. Visions of agent marketplaces and plug-and-play AI components become more tangible with such a standard.</p><p>A2A offers developers and enterprises a compelling vision and a concrete set of tools to start building the next generation of interconnected AI systems. The ongoing evolution and adoption of A2A will be a critical space to watch in the coming years.</p><p><em>If you found this helpful, show your appreciation by clapping.</em></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=55202b16fa20" width="1" height="1" alt=""><hr><p><a href="https://medium.com/fhinkel/googles-a2a-protocol-enabling-the-conversation-between-ai-agents-55202b16fa20">Google’s A2A Protocol: Enabling the Conversation Between AI Agents</a> was originally published in <a href="https://medium.com/fhinkel">Fhinkel</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[How I learned to love the terminal]]></title>
            <link>https://medium.com/fhinkel/how-i-learned-to-love-the-terminal-e13e05f7bac1?source=rss----c922b1002fdf---4</link>
            <guid isPermaLink="false">https://medium.com/p/e13e05f7bac1</guid>
            <category><![CDATA[terminal]]></category>
            <category><![CDATA[programming]]></category>
            <category><![CDATA[beginner]]></category>
            <category><![CDATA[linux]]></category>
            <category><![CDATA[bash]]></category>
            <dc:creator><![CDATA[Franziska Hinkelmann]]></dc:creator>
            <pubDate>Thu, 14 Nov 2019 21:18:33 GMT</pubDate>
            <atom:updated>2019-11-14T21:13:37.067Z</atom:updated>
            <content:encoded><![CDATA[<h4><em>An introduction to the command line</em></h4><p>Knowing your way around the commnand line has many benefits. With a bit of practice, you can accomplish many tasks much faster on the command line than using any other tool.</p><p>The command line is almost always available, unlike some GUI tools that must be installed. You can save frequently-used commands as aliases and save time. Your bash history will save your bacon at least once when you forget how to do something. When you ssh into a remote machine, such as your work station or a virtual machine in the cloud, you can use the command line instead of a slow GUI.</p><p>Here are some tips that’ll make working on the command line much easier.</p><h3>Shortcuts instead of typing full commands</h3><p>Use the <strong>arrow up</strong> and <strong>arrow down</strong> keys to iterate over the last used commands.</p><p>Use <strong>tab completion</strong> to complete commands, directories and files, and even some parameters. Start typing one or two characters of a command. Then hit tab twice. If that gives you several options, type a few more letters and then hit tab again. You should never type out a full filename. Use tab aggressivly. It’s muscle memory you need to build if you want to be fast on the command line.</p><p>If you remember part of a command, but not necessarily the beginning, you can search for that command using <strong>reverse-i-search</strong>. To use reverse-i-search, press Ctrl+R, then start typing the command. If there are commands that match what you’ve typed, you’ll see a suggestion. You can keep typing to further refine your search results or press Ctrl+R again to cycle through the commands that match your search query in reverse order.</p><h3>Navigate around</h3><p>Use cd .. to navigate up one directory. Use cd to jump to your home directory. This is the same as cd ~/. Use cd / to jump to the root directory and cd - to go back to the last directory.</p><p>Jump to the beginning and end of the line with <strong>Ctrl A</strong> and <strong>Ctrl E</strong>. You can move word by word with <strong>option arrow left</strong> and <strong>option arrow right</strong>.</p><p>When you realize that you’re typing the wrong command, use <strong>Ctrl C</strong> to start over. This is faster than deleting the command character by character.</p><h3>Hidden config files</h3><p>To see hidden files, i.e., filenames that start with a dot, use ls -la. Check out the hidden .gitconfig in your home directory. Or edit the .gitignore file in a git project to exclude files from source control. You can configure a lot of tools via a dot file. Many follow the convention of the config file name ending in rc (&quot;run command&quot;), like .npmrc for npm config settings.</p><h3>Configure your terminal</h3><p>The config file .bash_profile determines how your terminal, more specifically bash, behaves¹. The .bash_profile file is in your home directory (~/) . In this file you can do things like</p><ul><li>specify shortcuts with alias</li><li>configure your prompt</li><li>set environment variables.</li></ul><h3>Git on the command line</h3><p>If you use git on the command line, there are a few tricks to make your life easier. You can enable tab completion for git and configure custom shortcuts like git co for git checkout. For me, the most important feature is to always see what branch I&#39;m on.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/880/0*jrRk1bkdPxXahFdb.png" /></figure><p>My bash shows the current directory and the branch I’m on if I’m in a git directory. I configure this behavior in my .bash_profile with the following lines:</p><pre># The next line enables git autocompletion<br>. ~/.git-completion.bash</pre><pre># The next lines configures a fancy prompt<br>. ~/.git-prompt.sh<br>export GIT_PS1_SHOWDIRTYSTATE=1<br>export PS1=&#39;\[\e[35m\]\w$(__git_ps1 &quot; (%s)&quot;)\$\[\e[0m\] &#39;</pre><p>Download the scripts from the git source code mirror and follow the instructions: <a href="https://github.com/git/git/blob/master/contrib/completion/git-prompt.sh">.git-prompt.sh</a> and <a href="https://github.com/git/git/blob/master/contrib/completion/git-completion.bash">.git-completion.bash</a>. You can customize the color of the prompt. I use different colors on different machines to easily see what machine I’m ssh’ed into.</p><h3>Most importantly</h3><p>Be adventurous. Don’t let the terminal intimidate you! Once you know some basics, it’s easy to work efficiently with the command line. Search <a href="https://stackoverflow.com/questions/tagged/command-line">StackOverflow</a> for tips to make things even easier. Read through other people’s config files (mine are <a href="https://github.com/fhinkel/configs">here</a>). Go explore and try a few things. Lots of tips are really helpful, you just need to find those that work for you.</p><p>¹ .bash_profile is the default config for bash on MacOS. On Linux, use .bashrc.</p><p><em>Many thanks to Amy Unruh, Sofia Leon, ErinMcKean, Sandra Friesen, and Sarah Clark for their thoughtful reviews and comments.</em></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=e13e05f7bac1" width="1" height="1" alt=""><hr><p><a href="https://medium.com/fhinkel/how-i-learned-to-love-the-terminal-e13e05f7bac1">How I learned to love the terminal</a> was originally published in <a href="https://medium.com/fhinkel">Fhinkel</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[The Curious Case of Double Dashes]]></title>
            <link>https://medium.com/fhinkel/the-curious-case-of-double-dashes-b5e7711698f?source=rss----c922b1002fdf---4</link>
            <guid isPermaLink="false">https://medium.com/p/b5e7711698f</guid>
            <category><![CDATA[shell]]></category>
            <category><![CDATA[bash]]></category>
            <category><![CDATA[npm-scripts]]></category>
            <category><![CDATA[javascript]]></category>
            <category><![CDATA[npm]]></category>
            <dc:creator><![CDATA[Franziska Hinkelmann]]></dc:creator>
            <pubDate>Thu, 17 Jan 2019 16:46:34 GMT</pubDate>
            <atom:updated>2019-01-17T16:46:34.144Z</atom:updated>
            <content:encoded><![CDATA[<h4>Bare -- in bash commands</h4><p>Why do we sometimes use bare double dashes in commands like git checkout -- file.txt? Isn’t git checkout file.txt just as good?</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*oGkGoqkiSpf2nfO53Q2GkA.jpeg" /></figure><p><strong>Bare double dashes signify the end of options</strong>. Anything after -- is a parameter. For example in git, you can checkout a file named master:</p><pre>git checkout master     # Checkout the master branch<br>git checkout -- master  # Checkout the file named master</pre><p>In proper documentation, we see git checkout -- file.txt when git checkout file.txt would work, too. <strong>-- safeguards against checking out branches when files have the same name as branches.</strong></p><h4>POSIX.1–2017 standard</h4><blockquote>12.2 <a href="http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap12.html">Utility Syntax Guidelines</a></blockquote><blockquote>Guideline 10:</blockquote><blockquote>The first -- argument that is not an option-argument should be accepted as a delimiter indicating the end of options. Any following arguments should be treated as operands, even if they begin with the ‘-’ character.</blockquote><h4>Use case: rm</h4><p>When you need to delete an oddly named filed like -file.txt, rm treats -f as an option. Use bare double dashes to delete the file. This works for many bash commands that work with files like cat, mv, or touch.</p><pre>rm -file.txt          # rm: illegal option -- l<br>rm -- -file.txt </pre><h4>Use case: grep</h4><p>You can use double dashes in grep when the search term starts with a dash:</p><pre>grep -- -v *</pre><p>This searches for the string ‘-v’ rather than interpreting it as the option for inverse matches.</p><h4>Use case: npm scripts</h4><p>Double dashes are incredibly useful for npm scripts. Anything after the double dashes is not an option of npm, but a parameter for the script that npm executes.</p><p>If we want to fix linter errors, we do not need to look up which linter is specified in package.json. As long as the linter understands --fix, we simply run</p><pre>npm run lint -- --fix</pre><h3>Franziska Hinkelmann, Ph.D. on Twitter</h3><p>TIL, you can pass parameters with -- to an npm script, like `npm run lint -- --fix` 🤯</p><h4>What can you do with --?</h4><p>I hope this shed some light on why we sometimes have bare double dashes in our commands. Where do you use --? I would love to hear your tips in the comment section.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=b5e7711698f" width="1" height="1" alt=""><hr><p><a href="https://medium.com/fhinkel/the-curious-case-of-double-dashes-b5e7711698f">The Curious Case of Double Dashes</a> was originally published in <a href="https://medium.com/fhinkel">Fhinkel</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[V8 Internals: How Small is a “Small Integer?”]]></title>
            <link>https://medium.com/fhinkel/v8-internals-how-small-is-a-small-integer-e0badc18b6da?source=rss----c922b1002fdf---4</link>
            <guid isPermaLink="false">https://medium.com/p/e0badc18b6da</guid>
            <category><![CDATA[compilers]]></category>
            <category><![CDATA[cpp]]></category>
            <category><![CDATA[programming]]></category>
            <category><![CDATA[computer-science]]></category>
            <category><![CDATA[v8]]></category>
            <dc:creator><![CDATA[Franziska Hinkelmann]]></dc:creator>
            <pubDate>Mon, 03 Sep 2018 13:54:43 GMT</pubDate>
            <atom:updated>2018-10-25T10:19:33.593Z</atom:updated>
            <content:encoded><![CDATA[<h4>When binary is useful outside of a coding interview</h4><p><em>This article is </em><a href="https://medium.com/@justjavac/v8-internals-how-small-is-a-small-integer-ba5e17a3ae5f"><em>available in Chinese</em></a><em>.</em></p><p><a href="https://github.com/v8/v8/wiki">V8</a> is Google’s open source JavaScript engine. Chrome, Node.js, and many other applications embed V8. If you have heard any <a href="https://www.youtube.com/watch?time_continue=1616&amp;v=PM38nnInUOI">talks</a> about V8 or read any <a href="https://medium.com/@fhinkel/understanding-v8s-bytecode-317d46c94775">blogposts</a>, you have surely heard about <strong>Smis</strong>, <strong>small integers</strong>. This article digs into V8’s source code to discover how large Smis actually are.</p><p>JavaScript, by specification, does not know about integers (with the exception of recently introduced <a href="https://developers.google.com/web/updates/2018/05/bigint">BigInts</a>). It only knows IEEE doubles. But many operations are based on integers, just think of for loops. All JavaScript engines have a special representation for integers. V8 has so called Smis, small integers.</p><p>The range for Smis on 64-bit platforms is -2³¹ to 2³¹-1 (2³¹≈ 2*10⁹). That might not be immediately obvious when you look at V8’s source code. kSmiMinValue and kSmiMaxValue are defined in <a href="https://github.com/v8/v8/blob/a9e3d9c7ec1345085c861af76e508d9591634530/include/v8.h#L253">include/v8.h</a> as follows:</p><pre>static const int kSmiMinValue = <br>  (static_cast&lt;unsigned int&gt;(-1)) &lt;&lt; (kSmiValueSize — 1);</pre><pre>static const int kSmiMaxValue = -(kSmiMinValue + 1);</pre><p>How is that equal to -2³¹ and 2³¹-1? Let’s dissect the C++ code into smaller chunks.</p><h4>Left Shift</h4><p>&lt;&lt; is a bitwise left shift. Left shift means that we shift the binary representation of a number to the left by filling up the right side with zeros. For example, 5 &lt;&lt; 3 = 40.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*5tI21l6OtEfjG2jo83SOnA.jpeg" /><figcaption>5 &lt;&lt; 3 = 40</figcaption></figure><p>You might notice that left shift for positive numbers is the same as multiplication by 2.</p><h4>Static Cast to an Unsigned Integer</h4><pre>static_cast&lt;unsigned int&gt;(-1)</pre><p>What happens when we cast a negative value to an unsigned integer, i.e., a positive number? The bits stay the same but the value is interpreted differently. Casting to an unsigned integer allows us to use left shift because it is only defined for positive numbers in C++.</p><p>What is the binary representation of -1? In <a href="https://en.wikipedia.org/wiki/Two%27s_complement">Two’s complement</a>, -1 is represented as (111...111)_2 because 2⁶³-2⁶²-2⁶¹- … -2²-2¹–1 = 1.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*XE6gIxvfhujGmWiFx65wAA.jpeg" /><figcaption>Three-bit signed integer in <a href="https://en.wikipedia.org/wiki/Two&#39;s_complement">two’s complement</a> representation.</figcaption></figure><h4>Putting it All Together</h4><p>If you follow the <a href="https://github.com/v8/v8/blob/a9e3d9c7ec1345085c861af76e508d9591634530/include/v8.h#L225">definitions</a> in V8’s source code, you will find that kSmiValueSize is defined as 32 on 64-bit machines, resulting in:</p><pre>kSmiMinValue =(static_cast&lt;unsigned int&gt;(-1)) &lt;&lt; (kSmiValueSize — 1)<br>             = (111...111)_2 &lt;&lt; (32-1) <br>             = (111...111)_2 &lt;&lt; 31<br>             = (11...1100...00)_2  // 31 zeros<br>             = -2^31</pre><p>Now we use this result in the initial definition of kMaxValue.</p><pre>int kSmiMaxValue = -(kSmiMinValue + 1);</pre><p>That is easy, kSmiMaxValue = -(-2^31+1) = 2^31-1. The range for Smis in V8 on 64-bit platforms is [-2³¹, 2³¹-1].</p><h4>32-Bit Platforms</h4><p>On 32-bit platforms, kSmiValueSize = 31. So we shift by 30, and end up with kMinValue = -2^30. Note, 2³⁰≈ 10⁹.</p><p>Why is the range for Smis one bit smaller on 32-bit platforms? <a href="https://github.com/v8/v8/blob/a9e3d9c7ec1345085c861af76e508d9591634530/include/v8.h#L177">Internally</a>, V8 tags all JavaScript values as either Smis or heap objects using the least significant bit. If it is1, it is a pointer. If the least significant bit is a 0, it is a Smi. That means that 32-bit integers can use only 31 bits for the Smi value, because one bit is used as the tag.</p><blockquote>V8 tags all values as either Smis or heap pointers using the least significant bit.</blockquote><p>Smis are not as small as you might have thought, but they easily fit into a 32-bit or 64-bit integer together with their encoding bit.</p><blockquote>Bonus question: Given a non-empty array of integers, every element appears twice except for one. Find that single one. Can you use binary representation for a linear time, constant space solution?</blockquote><p>I like to use a <a href="http://geni.us/xEAH5B">dotted Leuchturm1917</a> and <a href="http://geni.us/VCuvX">Pigma Microns</a> for my notes.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=e0badc18b6da" width="1" height="1" alt=""><hr><p><a href="https://medium.com/fhinkel/v8-internals-how-small-is-a-small-integer-e0badc18b6da">V8 Internals: How Small is a “Small Integer?”</a> was originally published in <a href="https://medium.com/fhinkel">Fhinkel</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[☕️ My Holiday Reading List]]></title>
            <link>https://medium.com/fhinkel/%EF%B8%8F-my-holiday-reading-list-39317d3cce70?source=rss----c922b1002fdf---4</link>
            <guid isPermaLink="false">https://medium.com/p/39317d3cce70</guid>
            <category><![CDATA[iot]]></category>
            <category><![CDATA[tech]]></category>
            <category><![CDATA[algorithms]]></category>
            <category><![CDATA[data-visualization]]></category>
            <category><![CDATA[programming]]></category>
            <dc:creator><![CDATA[Franziska Hinkelmann]]></dc:creator>
            <pubDate>Wed, 13 Dec 2017 14:15:19 GMT</pubDate>
            <atom:updated>2017-12-19T08:54:54.667Z</atom:updated>
            <content:encoded><![CDATA[<h4>List of Lovely Tech Blogs</h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*1_blr_8lUrFGs-_fcosCGQ.jpeg" /></figure><p>Nothing to do over the holidays? Read these inspiring blogs about software development. Listed in alphabetical order.</p><h4>Amy Nguyen</h4><p><a href="http://blog.amynguyen.net/">amy nguyen | writing, computer science, feminism, and excessive introspection</a></p><p><a href="https://medium.com/u/20de112d6654">Amy Nguyen</a> writes about software engineering, e.g., how she <em>hacked </em>Ticketmaster with DevTools to get Taylor Swift tickets, interviewing, and speaking at tech conferences: <a href="http://blog.amynguyen.net/">blog.amynguyen.net</a></p><h3>Erica Sadun</h3><p><a href="http://ericasadun.com/">Erica Sadun</a></p><p>Author of <a href="http://geni.us/V7NNBDG">Swift Style</a>, <a href="https://twitter.com/ericasadun">Erica Sadun</a> writes about Swift and news from the Apple ecosystem. Check her out at <a href="http://ericasadun.com/">ericasadun.com</a>.</p><h3>Jessie Frazelle</h3><p><a href="http://blog.jessfraz.com/">Jessie Frazelle&#39;s Blog</a></p><p><a href="https://medium.com/u/a85f20c37193">Jessie Frazelle</a> writes about containers and Linux and anything cool. Have a look at her blog at <a href="http://blog.jessfraz.com/">blog.jessfraz.com</a>.</p><h3>Julia Evans</h3><p><a href="https://twitter.com/b0rk">Julia Evans</a> writes about Linux and <em>How to teach technical concepts with cartoons.</em> If anybody knows how to do that, it’s her, because she has published eight zines about systems and debugging tools. Read her posts at <a href="https://jvns.ca/">jvns.ca</a>.</p><h3>⚡Julia Evans⚡ on Twitter</h3><p>how to be a wizard programmer</p><h3>Kara Carrell</h3><p><a href="https://kara.codes/">Kara.Codes</a></p><p><a href="https://medium.com/u/3f772b0787aa">Kara Carrell</a> is a web developer who makes the prettiest slides. She has a series of <em>Today I Learned</em> posts on her blog <a href="https://kara.codes/til/">https://kara.codes</a> with topics ranging from hexadecimal to REST to chown. Totally fun to read.</p><h3><strong>Preethi Kasireddy</strong></h3><p><a href="https://medium.com/@preethikasireddy">Preethi Kasireddy - Medium</a></p><p><a href="https://medium.com/u/d446dafbe292">Preethi Kasireddy</a> is a Blockchain Engineer and her writing is entertaining and so personal. Check out her Medium posts about the blockchain and career advice.</p><h3>Sarah Drasner</h3><p><a href="https://sarahdrasnerdesign.com/">Sarah Drasner&#39;s bomb site</a></p><p><a href="https://medium.com/u/c2509fce86ff">Sarah Drasner</a> is an authority on all things Vue.js and SVG. She’s a member of the Vue.js core team and author of <a href="http://geni.us/Flkc">SVG Animations</a>. Check out the posts under <em>Writing</em> on her <a href="http://sarahdrasnerdesign.com/">website</a> that link to her articles in <a href="https://css-tricks.com/author/sdrasner/">CSS-Tricks</a> and other publications.</p><h3>Shirley Wu</h3><p><a href="http://medium.com/@sxywu">Shirley Wu - Medium</a></p><p><a href="https://medium.com/u/4607b4069d83">Shirley Wu</a> makes the prettiest data visualizations. Just have a look at her beautiful <a href="http://bl.ocks.org/sxywu/raw/d612c6c653fb8b4d7ff3d422be164a5d/">Film Flowers</a>. Oh, and do you know her <a href="https://www.youtube.com/channel/UC4yYE5Qo1cOMeeALjvRDxYw">#shirleychats</a> on YouTube?</p><h3>Suz Hinton</h3><p><a href="http://meow.noopkat.com/">meow machine</a></p><p><a href="https://medium.com/u/89a233b79704">Suz Hinton</a> aka <a href="https://twitter.com/noopkat">Noopkat</a> writes about hardware hacking with Node.js and she is so kind to share some of her work setup. Confession: I just ordered something she recommends on Amazon. I adore her live coding <a href="https://www.twitch.tv/noopkat">stream on Twitch</a>.</p><h3>Vaidehi Joshi</h3><p><a href="http://www.vaidehi.com/">www.vaidehi.com</a></p><p><a href="https://medium.com/u/8f55993c973e">Vaidehi Joshi</a> started her journey as a software engineer three years ago. She writes the series <a href="https://medium.com/basecs">BaseCS</a> where she explains computer science concepts in a very approachable way. If you want to brush up on trees, dynamics programming, or Dijkstra, you should definitely check out her blog <a href="http://www.vaidehi.com/">www.vaidehi.com</a>.</p><blockquote>Enjoy reading and Happy Holidays! ⛄️</blockquote><h4>Here is a <a href="https://twitter.com/fhinkel/lists/blog-authors/members">Twitter list</a> so you can easily follow all ten authors.</h4><h4>Check out <a href="http://fhinkel.rocks/">my blog</a> for more things V8 and Node.js ✨🐢🚀✨</h4><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=39317d3cce70" width="1" height="1" alt=""><hr><p><a href="https://medium.com/fhinkel/%EF%B8%8F-my-holiday-reading-list-39317d3cce70">🎁☕️👓 My Holiday Reading List</a> was originally published in <a href="https://medium.com/fhinkel">Fhinkel</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[New in VS Code: Inline Change Review]]></title>
            <link>https://medium.com/fhinkel/new-in-vs-code-inline-change-review-d43df04ea264?source=rss----c922b1002fdf---4</link>
            <guid isPermaLink="false">https://medium.com/p/d43df04ea264</guid>
            <category><![CDATA[javascript]]></category>
            <category><![CDATA[vscode]]></category>
            <category><![CDATA[webstorm]]></category>
            <category><![CDATA[git]]></category>
            <dc:creator><![CDATA[Franziska Hinkelmann]]></dc:creator>
            <pubDate>Sun, 26 Nov 2017 13:24:26 GMT</pubDate>
            <atom:updated>2017-12-19T08:55:18.636Z</atom:updated>
            <content:encoded><![CDATA[<h4>Expandable Git annotations in the gutter like in WebStorm 🎉</h4><p>Since VS Code <a href="https://code.visualstudio.com/updates/v1_18">1.18</a>, you can expand the little Git <a href="https://code.visualstudio.com/docs/editor/versioncontrol#_gutter-indicators">annotations in the gutter</a> like in WebStorm. They show the diff inline in the editor and make individual reverts easy.</p><p>The Git annotations in the gutter are subtle yet helpful. <strong>They instantly draw my eyes to the lines that I changed.</strong> Together with the inline view of the diff and the revert button, they are invaluable to me.</p><p>I need the inline change review when I delete too many lines or type in the wrong window. I need it when I make multiple changes and realize one of them doesn’t work. I need it when I refactor and want to compare to the previous version. I’m so happy this feature is in <a href="https://code.visualstudio.com/updates/v1_18#_inline-change-review">VS Code now</a> ❤️. I could do all of this on the command line, but inline is clearer because I don’t have to adjust to a different view or sort through all the other changes.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/724/1*svHpYnE3CPyZ6HajAXb7QQ.png" /><figcaption>Annotations that show Git changes. Blue means changed, green added, and red deleted lines.</figcaption></figure><p>A blue bar in the gutter indicates that the line was changed. For new lines, the bar is green. A little red triangle symbolizes deleted lines.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/720/1*9ACdd-yopp80ufoNKFrorw.png" /><figcaption>The annotations in the gutter expand! Click on an annotation in the gutter to see the changes. You can also revert right there if you need to.</figcaption></figure><p>Click on a gutter annotation to see the changes. I often find this more convenient than looking at the diff in other views. There is a revert button next to every change. In many cases, clicking the button is much quicker than using git checkout --patch (tough git commit -p is one of my favorite tools).</p><p>If you are switching over from WebStorm to VS Code, <a href="https://medium.com/u/3b15b3b516eb">Asim Hussain</a> has a <a href="https://medium.com/@jawache/from-webstorm-to-vs-code-bd01ccc92aaf">video with great tips for converts</a>.</p><h4>Check out <a href="http://fhinkel.rocks/">my blog</a> for more things V8 and Node.js ✨🐢🚀✨</h4><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=d43df04ea264" width="1" height="1" alt=""><hr><p><a href="https://medium.com/fhinkel/new-in-vs-code-inline-change-review-d43df04ea264">New in VS Code: Inline Change Review</a> was originally published in <a href="https://medium.com/fhinkel">Fhinkel</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Co-Working and Coffee Shops in Munich for Digital Nomads]]></title>
            <link>https://medium.com/fhinkel/co-working-and-coffee-shops-in-munich-for-digital-nomads-31b7f8d0b8bc?source=rss----c922b1002fdf---4</link>
            <guid isPermaLink="false">https://medium.com/p/31b7f8d0b8bc</guid>
            <category><![CDATA[münchen]]></category>
            <category><![CDATA[remote-working]]></category>
            <category><![CDATA[coworking]]></category>
            <category><![CDATA[munich]]></category>
            <category><![CDATA[digital-nomads]]></category>
            <dc:creator><![CDATA[Franziska Hinkelmann]]></dc:creator>
            <pubDate>Sun, 19 Nov 2017 22:38:18 GMT</pubDate>
            <atom:updated>2017-12-19T08:55:45.588Z</atom:updated>
            <content:encoded><![CDATA[<h4>A few places where I’ve worked comfortably</h4><p>It’s hard to find places in Munich where you can take out your laptop and work for a while. Here are my finds. I hope this helps you if you visit Munich or if you’re a local like me and want a change of scenery.</p><blockquote>“Papa, was machen die Leute da?”</blockquote><blockquote>“Die spielen Büro.” — Father and son in German coffee shop.</blockquote><h3><a href="http://lostweekend.de/coffeeshop/">Lost Weekend</a></h3><p>Vegan coffee shop located next to the <a href="https://www.google.de/maps/place/Lost+Weekend/@48.1491142,11.5774775,17z/data=!3m1!4b1!4m5!3m4!1s0x479e75eca7d75897:0xe88cd9652ff5ec58!8m2!3d48.1491106!4d11.5796715">subway station <em>Universität</em></a> in Maxvorstadt. Mostly students, working by themselves or on group assignments. Usually quite busy, be prepared to share your table. Free wifi and lots of power plugs. Selection of cakes and vegan sandwiches. Delicious soy milk latte!</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*PpAtrcgSmtQeQin15ywqmQ.jpeg" /></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*LoKWvKEfwO2T0lGYppM4Dg.jpeg" /><figcaption>Lost Weekend</figcaption></figure><h3><a href="http://www.muenchner-stadtbibliothek.de/bibliotheken/stadtbib-am-gasteig/">Stadtbibliothek am Gasteig (Library)</a></h3><p>Very quiet. Good wifi. They have armchairs hidden between the bookshelves and lots of desks and larger tables. I’d say most people there are students. As far as I know it’s OK to bring drinks into the library. I’ve seen lots of bottles and snack boxes on the tables. There’s a coffee shop downstairs or you can bring your own.</p><figure><a href="http://www.muenchner-stadtbibliothek.de/bibliotheken/stadtbib-am-gasteig/"><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*-V0MR2-XJJnDLBO4v1Y7dQ.jpeg" /></a><figcaption><a href="http://www.muenchner-stadtbibliothek.de/bibliotheken/stadtbib-am-gasteig/">Stadtbibliothek am Gasteig</a></figcaption></figure><p>Free for anybody. Just walk in, there are no id checks or anything like that. No bag check either. Centrally located at the <a href="https://www.google.de/maps/dir/&#39;&#39;/maps+bibliothek+am+gasteig/@48.1309837,11.5207883,12z/data=!3m1!4b1!4m8!4m7!1m0!1m5!1m1!1s0x479ddf7dc27d6083:0x774d063166283537!2m2!1d11.590828!2d48.131005">S-Bahn station <em>Rosenheimer Platz</em></a>, follow the signs underground for <em>Gasteig</em>. The library entrance is on the second floor of the main building. Downstairs, they sell concert tickets and there’s a coffee shop. Take the escalators upstairs. Open on weekdays from 10 am — 7 pm and on Saturdays from 11 am — 4 pm. Closed on Sundays.</p><h3><a href="https://cafe-lotti.lotti-muenchen.de/">Café Lotti</a></h3><p>It’s pink and the audience is 90% female. It’s also quite busy, but there’s a hidden nook in the back with two sofas. Every time I’ve been there we were lucky and the sofas were free. You’re so hidden back there that you have to go to the counter and order. They have wifi, coffee, and tasty cakes.</p><figure><a href="https://cafe-lotti.lotti-muenchen.de/"><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*mpo05hcTxxJq71Kkw6pPbg.jpeg" /></a><figcaption><a href="https://cafe-lotti.lotti-muenchen.de/">Café Lotti</a></figcaption></figure><h3><a href="http://www.black-bean.de/muenchner-freiheit/">Black Bean at Münchner Freiheit</a></h3><p>I’ve worked here a few times but the wifi didn’t work and the coffee isn’t great. The <a href="https://www.google.de/maps/place/Black+Bean/@48.1628003,11.5864283,19z/data=!4m5!3m4!1s0x479e75b83e5c1f03:0x85d2fd6eba3e8321!8m2!3d48.1626183!4d11.5872335?hl=en">location</a> is convenient though and the seats comfortable.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/283/1*ClhhfAl8Wp9N_H80jnoqdQ.jpeg" /><figcaption><a href="http://www.black-bean.de/muenchner-freiheit/">Black Bean at Münchner Freiheit</a></figcaption></figure><p>My favorite place is definitely the <a href="http://www.muenchner-stadtbibliothek.de/bibliotheken/stadtbib-am-gasteig/">library</a>. Can’t beat being around so many books. Only drawback, it’s closed on Sundays.</p><p><strong>Can you recommend any other places in Munich? Please tell me in the comments I would love to check them out. Thank you 🙏.</strong></p><figure><a href="https://drive.google.com/open?id=1UUKNS0liINsnx3m4BMZQZGDs8TR3REdJ&amp;usp=sharing"><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*h104urNKHauVLmfkgQil0Q.png" /></a><figcaption><a href="https://drive.google.com/open?id=1UUKNS0liINsnx3m4BMZQZGDs8TR3REdJ&amp;usp=sharing">Google Maps</a></figcaption></figure><h4>Check out <a href="http://fhinkel.rocks/">my blog</a> for more things V8 and Node.js ✨🐢🚀✨</h4><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=31b7f8d0b8bc" width="1" height="1" alt=""><hr><p><a href="https://medium.com/fhinkel/co-working-and-coffee-shops-in-munich-for-digital-nomads-31b7f8d0b8bc">Co-Working and Coffee Shops in Munich for Digital Nomads</a> was originally published in <a href="https://medium.com/fhinkel">Fhinkel</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Confused about Stack and Heap?]]></title>
            <link>https://medium.com/fhinkel/confused-about-stack-and-heap-2cf3e6adb771?source=rss----c922b1002fdf---4</link>
            <guid isPermaLink="false">https://medium.com/p/2cf3e6adb771</guid>
            <category><![CDATA[data-structures]]></category>
            <category><![CDATA[memory-management]]></category>
            <category><![CDATA[computer-science]]></category>
            <category><![CDATA[programming]]></category>
            <dc:creator><![CDATA[Franziska Hinkelmann]]></dc:creator>
            <pubDate>Mon, 30 Oct 2017 17:10:49 GMT</pubDate>
            <atom:updated>2017-12-19T08:56:09.511Z</atom:updated>
            <content:encoded><![CDATA[<p>Confession, I’ve always had a hard time keeping stack and heap apart. Yes, I’ve read about memory management and then memorized that objects allocated with new go on the heap. But I had to briefly think about whether the location is stack or heap. Kind of like I have to think about East and West. But what does <em>allocate on the heap</em> mean? Why is it different from the stack? And why does it even matter?</p><p>In Java or C#, value types (primitives) are stored on the stack, reference types on the heap. Memory allocation in terms of stack and heap is not specified in the <a href="https://isocpp.org/std/the-standard">C++ standard</a>. Instead, the standard distinguishes <em>automatic</em> and <em>dynamic s</em>torage duration. Local variables have automatic storage duration and compilers store them on the stack. Objects with dynamic memory allocation (created with new) are stored on the free store, conventionally referred to as the heap. In languages that are not garbage-collected, objects on the heap lead to memory leaks if they are not freed.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*j2yvsVDI_HIsMg-UuePFfg.jpeg" /><figcaption>Stacked on top of each other, or an unordered heap. Easy concepts.</figcaption></figure><p>When can we allocate <strong>objects on the stack</strong>? One important detail is that <strong>the stack for storing objects is the same as the run-time call stack</strong>. The run-time stack, consisting of stack frames, is responsible for program execution and function calls. A stack frame contains all the data for one function call: its parameters, the return address, and its local variables. Stack-allocated objects are part of these local variables. The return address determines which code is executed after the function returns.</p><p>The stack frame only exists during the execution time of a function, and so do the objects on the stack frame. That has the advantage that we do not need to worry about memory leaks caused by stack-allocated objects — but the objects are also not available anymore once we return from the function.</p><p>Only objects of fixed size known at compile time can be allocated on the stack*. This way we know the size of a stack frame at compile time, and can access objects on the stack with fixed offsets relative to the stack pointer.</p><figure><a href="http://geni.us/ySGa"><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*W7L7JN5q4p7w2E7HbBYS3g.jpeg" /></a><figcaption>General stack frame structure on x86–64 architecture for function P that calls function Q.</figcaption></figure><p>When can we allocate <strong>objects on the heap</strong>? You can think of the heap as extra storage completely independent of the run-time stack. It’s memory with no particular layout. Independent of program execution, we can ask for memory in this heap. When we allocate memory, the system makes sure that nothing else can use that same memory and invalidate our data. Objects on the heap live on after we exit the function that allocated the memory. This is good — but now it’s our responsibility to free memory on the heap, or we end up with memory leaks. In garbage-collected languages, the garbage collector frees memory on the heap and prevents memory leaks.</p><blockquote>Stack and heap in the context of memory management have always been nebulous concepts to me. Understanding the run-time stack finally made it click.</blockquote><p>Stack and heap became clear to me when I read <a href="http://geni.us/ySGa">Computer Systems: A Programmer’s Perspective (3rd Edition)</a>. Now it seems kind of obvious, but once you understand something it’s always obvious.</p><figure><a href="http://geni.us/ySGa"><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*NqaJtE6yL-C1yt6w5GnhTA.jpeg" /></a><figcaption><a href="http://geni.us/ySGa">Computer Systems: A Programmer’s Perspective (3rd Edition)</a></figcaption></figure><p>The book has several chapters on machine-level representation of programs. These chapters are about assembly code. One has a subsection <em>The Run-Time Stack</em>.</p><p>That section explains how passing control between functions affects the run-time stack. It details where parameters and return values are stored so they’re available in the called or calling function. Allocating and deallocating memory is simply decrementing and incrementing the stack pointer by an appropriate amount. If you’re interested and want to know more, the book is really helpful.</p><p><strong>Learned something? Clap your 👏 to say “thanks!” and help others find this article.</strong></p><p>(*) <em>Only objects of fixed size known at compile time can be allocated on the stack</em>. Except for funny things like <a href="https://en.wikipedia.org/wiki/Variable-length_array">Variable-Length Arrays</a> in C99. GCC allocates them on the stack.</p><h4>Check out <a href="http://fhinkel.rocks/">my blog</a> for more things V8 and Node.js ✨🐢🚀✨</h4><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=2cf3e6adb771" width="1" height="1" alt=""><hr><p><a href="https://medium.com/fhinkel/confused-about-stack-and-heap-2cf3e6adb771">Confused about Stack and Heap?</a> was originally published in <a href="https://medium.com/fhinkel">Fhinkel</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Runtime type information for JavaScript]]></title>
            <link>https://medium.com/fhinkel/runtime-type-information-for-javascript-b134faac3c0a?source=rss----c922b1002fdf---4</link>
            <guid isPermaLink="false">https://medium.com/p/b134faac3c0a</guid>
            <category><![CDATA[v8]]></category>
            <category><![CDATA[nodejs]]></category>
            <category><![CDATA[javascript]]></category>
            <category><![CDATA[compilers]]></category>
            <category><![CDATA[typescript]]></category>
            <dc:creator><![CDATA[Franziska Hinkelmann]]></dc:creator>
            <pubDate>Sun, 17 Sep 2017 12:10:52 GMT</pubDate>
            <atom:updated>2017-12-19T08:56:30.648Z</atom:updated>
            <content:encoded><![CDATA[<h4>Chrome V8 can now collect type information at runtime</h4><p>Get types like string, number, null, or custom classes at runtime. V8 can now collect type information. V8 is Google’s open source JavaScript engine. Chrome, Node.js, and many other applications use V8. This type profiler is built into the engine, the information is not statically inferred.</p><p>JavaScript is a dynamically typed language. But most code is written with fixed types in mind. When debugging JavaScript, it is helpful to know the types of variables and parameters at runtime. It is often hard to infer types for complex code. Type profiling provides this information at runtime.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*CLdktAPyagGXXZQYUS5UtA.png" /><figcaption><a href="https://github.com/fhinkel/type-profile">https://github.com/fhinkel/type-profile</a></figcaption></figure><pre>function foo(x) {<br>    if (x &lt; 2) {<br>      return 42;<br>    }<br>    return &quot;What are the return types of foo?&quot;;<br>  }</pre><p>The static definition of foo() does not hold any information about the parameters with which foo is called. In this simple case, we can deduct the return types, number and string. For more complex cases that is often impossible, though. But at runtime, it is clear with which types foo is being called. Runtime type information collects exactly this information.</p><p>Type profiling is implemented in V8 and can be used via the <strong>V8 inspector protocol</strong>. If you get <a href="https://github.com/v8/node">Node.js with the newest V8</a>, you can test it yourself. In a few weeks a newer V8 will land in Node and type profile will be available in regular Node releases.</p><p><strong>One of the intended use cases is to auto-generate JSDoc, TypeScript, or Flow annotations</strong>. As type profiling is available via <a href="https://nodejs.org/api/inspector.html">Node’s inspector</a>, you can build your own tools with it to fit your needs. <a href="https://github.com/fhinkel/type-profile">Here’s</a> a demo to show some basic usage.</p><blockquote>I look forward to all the tools the community will come up with that use type profile.</blockquote><p>I look forward to all the tools the community will come up with that use type profile. I’m sure there are many use cases that I haven’t even considered yet. If you are already working on a prototype, please share!</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*kQJFkhyIssD9BcM3gUmV5Q.png" /><figcaption>foo() has only been called with Objects, it always returned strings.</figcaption></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*YAuPg1EOrygd-uY1dmg3Dw.png" /><figcaption>foo() has been called with strings and Rectangles. It always returns strings.</figcaption></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*_x14DUSJ8WYtQIBwVwQaGA.png" /><figcaption>foo() has returned strings and numbers.</figcaption></figure><p><strong>Excited about runtime type profile in JavaScript? Clap your 👏 to say “thanks!” and help others find this article.</strong></p><h4>Check out <a href="http://fhinkel.rocks/">my blog</a> for more things V8 and Node.js ✨🐢🚀✨</h4><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=b134faac3c0a" width="1" height="1" alt=""><hr><p><a href="https://medium.com/fhinkel/runtime-type-information-for-javascript-b134faac3c0a">Runtime type information for JavaScript</a> was originally published in <a href="https://medium.com/fhinkel">Fhinkel</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
    </channel>
</rss>