<?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"><channel><title><![CDATA[Techbend's blog]]></title><description><![CDATA[Techbend dives into the age of technological singularity, where AI meets human potential. Discover the future of tech and its transformative power.]]></description><link>https://blog.techbend.dev</link><image><url>https://cdn.hashnode.com/uploads/logos/60114b552426ce4197072eb6/0bc051cd-b277-4cea-beea-50fd2521f6e1.jpg</url><title>Techbend&apos;s blog</title><link>https://blog.techbend.dev</link></image><generator>RSS for Node</generator><lastBuildDate>Wed, 22 Apr 2026 22:45:42 GMT</lastBuildDate><atom:link href="https://blog.techbend.dev/rss.xml" rel="self" type="application/rss+xml"/><language><![CDATA[en]]></language><ttl>60</ttl><item><title><![CDATA[Discovering the Future of Innovation: Introducing the Venture Grid]]></title><description><![CDATA[Over the years, my journey through the innovation landscape has been nothing short of exhilarating. From working in cutting-edge innovation labs to collaborating closely with venture capitalists, venture builders, and factories, I’ve seen the power o...]]></description><link>https://blog.techbend.dev/discovering-the-future-of-innovation-introducing-the-venture-grid</link><guid isPermaLink="true">https://blog.techbend.dev/discovering-the-future-of-innovation-introducing-the-venture-grid</guid><category><![CDATA[Venture Capital]]></category><category><![CDATA[Startups]]></category><category><![CDATA[Investment]]></category><category><![CDATA[community]]></category><dc:creator><![CDATA[Ali Tavallaie]]></dc:creator><pubDate>Tue, 20 Aug 2024 22:27:59 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1724192776708/16657d2c-0416-4dab-ac87-2e855fdca061.webp" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Over the years, my journey through the innovation landscape has been nothing short of exhilarating. From working in cutting-edge innovation labs to collaborating closely with venture capitalists, venture builders, and factories, I’ve seen the power of ideas in action. I’ve participated in hackathons that sparked new ways of thinking, mentored startups in need of guidance, and returned to projects years after they were initially set aside, only to breathe new life into them with the tools, technologies, and insights that weren’t available before.</p>
<p>These experiences have shaped my understanding of what true innovation looks like. It’s not just about the initial spark of a brilliant idea—though that’s important—but about the entire ecosystem that supports and nurtures that idea into something world-changing. It’s about the collaboration between different actors, the willingness to revisit and reinvent, and the open exchange of resources, knowledge, and opportunities.</p>
<p>And now, after years of refining this approach, I’ve found what I believe to be the utopia of innovation: <strong>Venture Grid</strong>.</p>
<h3 id="heading-what-is-venture-grid"><strong>What is Venture Grid?</strong></h3>
<p><strong>Venture Grid</strong> is more than just a concept; it’s a revolutionary approach to how we build and scale businesses. It’s a dynamic, interconnected ecosystem where the boundaries between innovation, incubation, funding, and growth strategy blur, creating a fluid environment where ventures can thrive.</p>
<p>In the <strong>Venture Grid</strong>, every actor—whether it’s a startup, an established company, a venture capitalist, or an innovation lab—loses their traditional boundaries and collaborates in a seamless, risk-taking environment. Here, ideas that once struggled alone find new life through strategic mergers. Failed startups are not abandoned but reimagined, combined with other ventures, or infused with fresh innovations sourced through open challenges and collaboration.</p>
<h3 id="heading-why-venture-grid"><strong>Why Venture Grid?</strong></h3>
<p>Through my work with venture builders and factories, I’ve seen firsthand the challenges of scaling innovative ideas. Often, brilliant concepts fall short because they don’t have the right resources at the right time or because they can’t pivot fast enough to meet changing market demands. <strong>Venture Grid</strong> changes that by creating a space where:</p>
<ul>
<li><p><strong>Synergies Are Discovered:</strong> Ventures within the grid collaborate, merge, and evolve. A failed tech startup might combine with a logistics firm to create something entirely new, stronger, and more viable.</p>
</li>
<li><p><strong>Open Innovation Thrives:</strong> External ideas and technologies are welcomed into the grid, where they can be rapidly tested, refined, and scaled. This open approach breaks down silos and ensures that the grid is constantly infused with new possibilities.</p>
</li>
<li><p><strong>Resources Are Shared:</strong> The grid’s structure reduces the cost of scaling by providing shared services, from legal support to advanced technological infrastructure. This makes it easier for ventures to grow without the burden of excessive overhead.</p>
</li>
<li><p><strong>Continuous Learning and Adaptation:</strong> In the <strong>Venture Grid</strong>, we never stop learning. Mentorship, training, and access to the latest technologies are integral parts of the grid, ensuring that every actor can adapt and thrive in a rapidly changing world.</p>
</li>
</ul>
<h3 id="heading-my-journey-to-the-venture-grid"><strong>My Journey to the Venture Grid</strong></h3>
<p>My journey to this concept has been a path of discovery. I’ve watched ideas evolve, pivot, and sometimes fail, only to be reborn stronger. I’ve seen the incredible things that happen when resources are pooled, when risks are shared, and when the walls between different parts of the innovation process come down. It’s in these moments that I realized the potential of a truly interconnected ecosystem.</p>
<p><strong>Venture Grid</strong> is the realization of this potential. It’s where I’ve seen ideas that were once isolated and struggling find their perfect complement in another venture. It’s where I’ve witnessed the power of open innovation—how an idea from one corner of the world can transform a business on the other side of the grid. And it’s where I believe the future of innovation lies.</p>
<h3 id="heading-a-call-to-action"><strong>A Call to Action</strong></h3>
<p>I invite you to explore the <strong>Venture Grid</strong> with me. Let’s challenge the traditional boundaries of innovation, embrace collaboration, and take risks that push us into new territories. Whether you’re a startup looking to grow, a company seeking to innovate, or an investor searching for the next big thing, there’s a place for you in the grid.</p>
<p>Together, we can create a new world of innovation where ideas don’t just survive—they thrive, evolve, and change the world.  </p>
<p><strong>Welcome to the Venture Grid.</strong></p>
<p><strong>I am Ali, a Grid Smith.</strong></p>
]]></content:encoded></item><item><title><![CDATA[Finally Updating Pychartjs: Making It Framework-Agnostic and Compatible with All Python Web Frameworks]]></title><description><![CDATA[After years of taking over the maintenance of pychartjs, I'm excited to finally have the time to bring some much-needed updates to the project. It's been a journey, but I'm proud to say that pychartjs is now framework-agnostic and fully compatible wi...]]></description><link>https://blog.techbend.dev/finally-updating-pychartjs-making-it-framework-agnostic-and-compatible-with-all-python-web-frameworks</link><guid isPermaLink="true">https://blog.techbend.dev/finally-updating-pychartjs-making-it-framework-agnostic-and-compatible-with-all-python-web-frameworks</guid><category><![CDATA[charts]]></category><category><![CDATA[chartjs]]></category><category><![CDATA[Python]]></category><category><![CDATA[Python 3]]></category><dc:creator><![CDATA[Ali Tavallaie]]></dc:creator><pubDate>Mon, 19 Aug 2024 00:58:05 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1724028964110/9f0e3bae-eeb6-485c-bf3b-4b618f0a4ff8.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>After years of taking over the maintenance of <a target="_blank" href="https://github.com/tavallaie/pychartjs"><code>pychartjs</code></a>, I'm excited to finally have the time to bring some much-needed updates to the project. It's been a journey, but I'm proud to say that <a target="_blank" href="https://github.com/tavallaie/pychartjs"><code>pychartjs</code></a> is now framework-agnostic and fully compatible with all major Python web frameworks, complete with render options that make it incredibly flexible for developers.</p>
<h2 id="heading-the-journey-back-to-pychartjs">The Journey Back to Pychartjs</h2>
<p>Several years ago, I inherited <a target="_blank" href="https://github.com/tavallaie/pychartjs"><code>pychartjs</code></a>—a Python library designed to generate dynamic charts using Chart.js. While the library had a strong foundation, it had become outdated over time, and I knew it needed a refresh to stay relevant in the rapidly evolving Python ecosystem. With the growing demand for versatile and modern tools, I decided it was time to bring <a target="_blank" href="https://github.com/tavallaie/pychartjs"><code>pychartjs</code></a> up to date and make it more flexible for developers across various frameworks.</p>
<h2 id="heading-whats-new-in-pychartjs">What’s New in Pychartjs</h2>
<h3 id="heading-1-framework-agnostic-design">1. <strong>Framework-Agnostic Design</strong></h3>
<p>One of the major changes I’ve implemented is making <a target="_blank" href="https://github.com/tavallaie/pychartjs"><code>pychartjs</code></a> framework-agnostic. No longer confined to a specific web framework, <a target="_blank" href="https://github.com/tavallaie/pychartjs"><code>pychartjs</code></a> can now be integrated seamlessly into any Python web framework—whether it's Django, Flask, FastAPI, Robyn, or any other WSGI/ASGI framework. This opens up the library to a much broader audience and allows developers to choose the framework that best suits their needs without sacrificing charting capabilities.</p>
<h3 id="heading-2-flexible-render-options">2. <strong>Flexible Render Options</strong></h3>
<p>Another key feature of the update is the introduction of flexible render options. With the new rendering capabilities, developers can customize how charts are generated and displayed within their web applications. Whether you need to render charts dynamically based on context variables or generate static charts for reports, <a target="_blank" href="https://github.com/tavallaie/pychartjs"><code>pychartjs</code></a> now provides the tools to do so with ease.</p>
<h3 id="heading-3-seamless-integration-with-any-python-web-framework">3. <strong>Seamless Integration with Any Python Web Framework</strong></h3>
<p>Understanding the diverse needs of the Python web development community, I've updated <a target="_blank" href="https://github.com/tavallaie/pychartjs"><code>pychartjs</code></a> to integrate smoothly with any Python web framework. Whether you're using traditional frameworks like Django or Flask, or newer, faster options like FastAPI and Robyn, <a target="_blank" href="https://github.com/tavallaie/pychartjs"><code>pychartjs</code></a> is designed to fit right in. Its framework-agnostic approach means you can use it with any HTML rendering engine, such as Jinja, Mako, or your framework's built-in options.</p>
<h4 id="heading-robyn-and-beyond"><strong>Robyn and Beyond</strong></h4>
<p>Robyn, a relatively new but fast-growing web framework, is fully supported by <a target="_blank" href="https://github.com/tavallaie/pychartjs"><code>pychartjs</code></a>. You can easily create and render charts directly in your Robyn routes, and because <a target="_blank" href="https://github.com/tavallaie/pychartjs"><code>pychartjs</code></a> is framework-agnostic, it adapts well to any WSGI or ASGI framework.</p>
<p>Here’s how you can quickly set up a simple Robyn application with <a target="_blank" href="https://github.com/tavallaie/pychartjs"><code>pychartjs</code></a>:</p>
<pre><code class="lang-bash">from robyn import Robyn
from pychartjs.charts import Chart
from pychartjs.datasets import Dataset
from pychartjs.enums import ChartType
from robyn.templating import JinjaTemplate

app = Robyn(__file__)

template = JinjaTemplate(<span class="hljs-string">"templates"</span>)

@app.get(<span class="hljs-string">"/"</span>)
async def get_chart(request):
    dataset = Dataset(
        label=<span class="hljs-string">"Sales Data"</span>,
        data=[10, 20, 30, 40, 50],
        backgroundColor=<span class="hljs-string">"rgba(75, 192, 192, 0.2)"</span>,
        borderColor=<span class="hljs-string">"rgba(75, 192, 192, 1)"</span>,
        borderWidth=1,
    )
    chart = Chart(
        chart_type=ChartType.LINE,
        datasets=[dataset],
        labels=[<span class="hljs-string">"January"</span>, <span class="hljs-string">"February"</span>, <span class="hljs-string">"March"</span>, <span class="hljs-string">"April"</span>, <span class="hljs-string">"May"</span>]
    )
    charts_html = chart.render()
    <span class="hljs-built_in">return</span> template.render_template(<span class="hljs-string">"index.html"</span>, charts_html=charts_html)

<span class="hljs-keyword">if</span> __name__ == <span class="hljs-string">"__main__"</span>:
    app.start(port=8080)
</code></pre>
<h3 id="heading-flexibility-with-html-rendering-options">Flexibility with HTML Rendering Options</h3>
<p>One of the strengths of the updated <a target="_blank" href="https://github.com/tavallaie/pychartjs">pychartjs</a> is its compatibility with a wide range of HTML rendering engines. Whether you're using Jinja in Flask, Django templates, or any other templating system, <a target="_blank" href="https://github.com/tavallaie/pychartjs"><code>pychartjs</code></a> fits seamlessly into your workflow. You can inject the rendered chart HTML into your templates, allowing for dynamic and interactive data visualizations in your web pages.</p>
<h2 id="heading-how-to-get-started">How to Get Started</h2>
<p>Getting started with the new and improved <a target="_blank" href="https://github.com/tavallaie/pychartjs"><code>pychartjs</code></a> is straightforward:</p>
<ol>
<li><p><strong>Install</strong> <a target="_blank" href="https://github.com/tavallaie/pychartjs"><code>pychartjs</code></a> using Poetry:</p>
<pre><code class="lang-bash"> poetry add pychartjs
</code></pre>
<p> <a target="_blank" href="https://github.com/tavallaie/pychartjs">Or,</a> if you're <a target="_blank" href="https://github.com/tavallaie/pychartjs">using pip</a>:</p>
<pre><code class="lang-bash"> pip install pychartjs
</code></pre>
</li>
<li><p><strong>Integrate with Your Framework:</strong></p>
<p> Use <a target="_blank" href="https://github.com/tavallaie/pychartjs"><code>pychartjs</code></a> in your preferred Python web framework by creating and rendering charts directly in your views or routes.</p>
<p> For example, in a Robyn app, you can render the charts directly into your HTML templates, as shown in the example above.</p>
</li>
<li><p><strong>Customize Your Charts:</strong></p>
<p> With flexible rendering options, you can now tailor your charts to meet the specific needs of your application. Whether it’s context-aware rendering, custom styles, or integrating with dynamic data sources, <a target="_blank" href="https://github.com/tavallaie/pychartjs"><code>pychartjs</code></a> offers the flexibility to create exactly what you need.</p>
</li>
</ol>
<h2 id="heading-looking-ahead">Looking Ahead</h2>
<p>This update is just the beginning. As <a target="_blank" href="https://github.com/tavallaie/pychartjs"><code>pychartjs</code></a> continues to evolve, I’m looking forward to seeing how the Python community will leverage its new capabilities. Whether you’re building data dashboards, integrating charts into web apps, or generating reports, <a target="_blank" href="https://github.com/tavallaie/pychartjs"><code>pychartjs</code></a> is here to make charting simple, flexible, and powerful.</p>
<p>Thank you to everyone who has supported <a target="_blank" href="https://github.com/tavallaie/pychartjs"><code>pychartjs</code></a> over the years. Your feedback and contributions have been invaluable in shaping this release. I’m excited to see what you all build with the new <a target="_blank" href="https://github.com/tavallaie/pychartjs"><code>pychartjs</code></a>.</p>
]]></content:encoded></item><item><title><![CDATA[Creating Transmutate: A Tool for Easier gRPC and Proto Files in Python]]></title><description><![CDATA[Introduction
Recently, I worked on a project that needed many gRPC functions. If you've used gRPC, you know it helps different software programs talk to each other efficiently. However, making Proto files for every Python dataclass was taking a lot o...]]></description><link>https://blog.techbend.dev/creating-transmutate-a-tool-for-easier-grpc-and-proto-files-in-python</link><guid isPermaLink="true">https://blog.techbend.dev/creating-transmutate-a-tool-for-easier-grpc-and-proto-files-in-python</guid><category><![CDATA[gRPC]]></category><category><![CDATA[Python 3]]></category><category><![CDATA[GitHub]]></category><category><![CDATA[Open Source]]></category><dc:creator><![CDATA[Ali Tavallaie]]></dc:creator><pubDate>Mon, 05 Aug 2024 17:53:46 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1722880346579/61086857-bbe3-4627-8cd8-105c972361b6.webp" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h3 id="heading-introduction">Introduction</h3>
<p>Recently, I worked on a project that needed many <strong>gRPC functions</strong>. If you've used gRPC, you know it helps different software programs talk to each other efficiently. However, making Proto files for every Python dataclass was taking a lot of time and effort.</p>
<p>I needed to find a way to do this faster, so I built a Python library called <strong>Transmutate</strong>. This library helps create Proto files automatically from Python dataclasses. It also helps check if data is correct and makes working with gRPC easier.</p>
<h3 id="heading-the-problem-with-proto-files">The Problem with Proto Files</h3>
<p>When using gRPC, we have to create Proto files. These files describe the data that the programs send to each other. Here are some problems I faced:</p>
<ol>
<li><p><strong>Writing Proto Files</strong>: Manually writing Proto files for each dataclass was boring and easy to make mistakes.</p>
</li>
<li><p><strong>Keeping Things in Sync</strong>: When I changed the Python dataclass, I had to remember to update the Proto file, which sometimes I forgot to do.</p>
</li>
<li><p><strong>Data Validation</strong>: I needed to make sure that the data followed certain rules, like checking if an email address was correct.</p>
</li>
</ol>
<h3 id="heading-how-transmutate-solves-these-problems">How Transmutate Solves These Problems</h3>
<p><strong>Transmutate</strong> automates a lot of these tasks. Here’s how it helps:</p>
<h4 id="heading-1-automatic-proto-generation">1. Automatic Proto Generation</h4>
<p>With Transmutate, you don't have to write Proto files manually. The library generates them for you from your Python dataclasses.</p>
<p>Here's a simple example:</p>
<pre><code class="lang-bash">from transmutate.base_model import BaseModel
from typing import List

class Person(BaseModel):
    name: str
    age: int
    email: str
    phone_numbers: List[str]

<span class="hljs-comment"># Generate Proto message</span>
proto_definition = Person().to_proto()
<span class="hljs-built_in">print</span>(proto_definition)
</code></pre>
<p>This will automatically create a Proto message like this:</p>
<pre><code class="lang-bash">message Person {
  string name = 1;
  int32 age = 2;
  string email = 3;
  repeated string phone_numbers = 4;
}
</code></pre>
<h4 id="heading-2-built-in-field-validation">2. Built-In Field Validation</h4>
<p>Transmutate allows you to add checks to make sure the data is valid. You can write functions that check each field. Here's an example:</p>
<pre><code class="lang-bash">class Person(BaseModel):
    name: str
    age: int
    email: str

    def validation_age(self):
        <span class="hljs-keyword">if</span> not (0 &lt;= self.age &lt;= 120):
            raise ValueError(<span class="hljs-string">"Age must be between 0 and 120."</span>)

    def validation_email(self):
        <span class="hljs-keyword">if</span> <span class="hljs-string">"@"</span> not <span class="hljs-keyword">in</span> self.email:
            raise ValueError(<span class="hljs-string">"Invalid email address."</span>)
</code></pre>
<p>In this example, the library will automatically run these checks when creating a <code>Person</code> object.</p>
<h4 id="heading-3-easy-grpc-service-creation">3. Easy gRPC Service Creation</h4>
<p>Transmutate also helps create gRPC service definitions quickly. Here’s how you can define a service:</p>
<pre><code class="lang-bash">from transmutate import Service, RpcType

class TestService(Service):
    name = <span class="hljs-string">"TestService"</span>
    types = [RpcType.UNARY]
    request_dataclass = Person
    response_dataclass = AnotherMessage

service_definition = TestService().generate_service_definition()
<span class="hljs-built_in">print</span>(service_definition)
</code></pre>
<p>This generates a gRPC service definition without you having to write it manually.</p>
<h3 id="heading-why-use-transmutate">Why Use Transmutate?</h3>
<p>Here are some reasons why <strong>Transmutate</strong> is useful:</p>
<ul>
<li><p><strong>Save Time</strong>: You spend less time writing Proto files and more time on real work.</p>
</li>
<li><p><strong>Reduce Errors</strong>: Automatic generation of Proto files reduces mistakes.</p>
</li>
<li><p><strong>Simple to Use</strong>: It works with existing Python code and is easy to add to your projects.</p>
</li>
<li><p><strong>Automatic Validation</strong>: Built-in checks ensure your data is correct.</p>
</li>
</ul>
<p>Creating <strong>Transmutate</strong> helped me handle gRPC functions more easily. Instead of spending hours writing and managing Proto files, I can now focus on building features and solving problems.</p>
<p>You can find <strong>Transmutate</strong> on <a target="_blank" href="https://github.com/tavallaie/transmutate">GitHub</a>. Feel free to check it out, and if you find it helpful, please consider starring the repository or contributing to the project. Your feedback is welcome, and I hope this library makes your work with gRPC easier, just as it did for me.</p>
]]></content:encoded></item><item><title><![CDATA[The Power of Code Reviews: Appreciating Team Contributions with Git Add Co-Author]]></title><description><![CDATA[I wanted to share some thoughts on the importance of code reviews, appreciating your teammates, and this cool tool I found called Git Add Co-Author that makes giving credit where it’s due super easy. A few weeks ago, I wrote a blog post titled "Contr...]]></description><link>https://blog.techbend.dev/the-power-of-code-reviews-appreciating-team-contributions-with-git-add-co-author</link><guid isPermaLink="true">https://blog.techbend.dev/the-power-of-code-reviews-appreciating-team-contributions-with-git-add-co-author</guid><category><![CDATA[Python]]></category><category><![CDATA[Python 3]]></category><category><![CDATA[GitHub]]></category><category><![CDATA[Open Source]]></category><dc:creator><![CDATA[Ali Tavallaie]]></dc:creator><pubDate>Mon, 29 Jul 2024 22:57:23 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/stock/unsplash/LZWBZriL2rs/upload/ecaa350248463917f551d3f452f850e8.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>I wanted to share some thoughts on the importance of code reviews, appreciating your teammates, and this cool tool I found called Git Add Co-Author that makes giving credit where it’s due super easy. A few weeks ago, I wrote a blog post titled <a target="_blank" href="https://blog.techbend.io/contribution-beyond-coding">"Contribution Beyond Coding"</a>, where I talked about how important it is to recognize contributions beyond just writing code. Things like design, testing, writing documentation, and participating in discussions are all crucial to the success of a project. Tools like Git Add Co-Author help make sure these contributions are visible and appreciated.</p>
<h3 id="heading-why-code-reviews-matter">Why Code Reviews Matter</h3>
<p>Code reviews are a big deal in software development. They’re not just about finding bugs or making sure the code works. Here’s why they’re so awesome:</p>
<ul>
<li><p><strong>Sharing Knowledge</strong>: When we review each other’s code, we learn new techniques and best practices. It’s like a mini-lesson every time.</p>
</li>
<li><p><strong>Improving Quality</strong>: More eyes on the code mean more chances to catch mistakes or think of better ways to do things.</p>
</li>
<li><p><strong>Keeping Things Consistent</strong>: It helps ensure everyone’s coding in the same style and following the same architecture, which makes the codebase cleaner and easier to maintain.</p>
</li>
</ul>
<h3 id="heading-appreciating-your-teammates">Appreciating Your Teammates</h3>
<p>One of the best parts about code reviews is that it’s a chance to recognize the hard work of your teammates. Here’s how to do it right:</p>
<ul>
<li><p><strong>Start with Positivity</strong>: Always kick off your feedback with what you liked about the code. It sets a good tone and makes your teammates feel valued.</p>
</li>
<li><p><strong>Be Constructive</strong>: When you point out issues or suggest changes, do it in a way that’s helpful and encouraging. Focus on how to improve, not just what’s wrong.</p>
</li>
<li><p><strong>Recognize Effort</strong>: Sometimes, the effort to solve a tough problem deserves a shout-out, even if the solution needs a bit more work.</p>
</li>
</ul>
<h3 id="heading-peer-programming-and-its-benefits">Peer Programming and Its Benefits</h3>
<p>Peer programming, also known as pair programming, is when two developers work together on one workstation. One writes the code while the other reviews each line as it’s written. This technique not only improves code quality but also enhances collaboration and learning.</p>
<ul>
<li><p><strong>Real-Time Feedback</strong>: Issues can be identified and resolved immediately.</p>
</li>
<li><p><strong>Enhanced Learning</strong>: Both developers can learn from each other’s techniques and perspectives.</p>
</li>
<li><p><strong>Increased Engagement</strong>: Working together keeps both developers engaged and focused.</p>
</li>
</ul>
<h3 id="heading-discovering-git-add-co-author">Discovering Git Add Co-Author</h3>
<p>I recently found this neat tool on GitHub called <a target="_blank" href="https://github.com/sansyrox/git-add-co-author">Git Add Co-Author</a>. It’s a game-changer for making sure everyone gets credit in commits. Here’s how you can use it:</p>
<ol>
<li><p><strong>Install It</strong>:</p>
<pre><code class="lang-bash"> pip install git-add-co-author
</code></pre>
<p> Then configure it with your GitHub token:</p>
<pre><code class="lang-bash"> python -m git_add_co_author --token &lt;your_token&gt;
</code></pre>
</li>
<li><p><strong>Add a Co-Author</strong>: To add a co-author, just run:</p>
<pre><code class="lang-bash"> python -m git_add_co_author --username &lt;co_author_username&gt;
</code></pre>
<p> Or add their name and email directly (if you don't have GitHub token):</p>
<pre><code class="lang-bash"> python -m git_add_co_author --name <span class="hljs-string">"John Doe"</span> --email <span class="hljs-string">"john.doe@example.com"</span>
</code></pre>
</li>
</ol>
<p>This way, the commit history shows everyone who contributed, which is awesome for open-source projects or pair programming sessions.</p>
<h3 id="heading-wrapping-up">Wrapping Up</h3>
<p>Code reviews are vital for learning, improving code quality, and keeping everything consistent. They’re also a great opportunity to show appreciation for your teammates’ hard work. Using tools like "<a target="_blank" href="https://github.com/sansyrox/git-add-co-author">Git Add Co-Author</a>" makes it easy to give credit to everyone involved, enhancing team spirit and collaboration. If you want to dive deeper into appreciating contributions, check out my <a target="_blank" href="https://blog.techbend.io/contribution-beyond-coding">blog post</a>.</p>
]]></content:encoded></item><item><title><![CDATA[I am Nominating Myself for PSF Board of Directors]]></title><description><![CDATA[Hello everyone,
I hope you are doing well. I want to share some important news with you. I am nominating myself for the position of Director on the Board of the Python Software Foundation (PSF).
My Statement
Here is my official statement for the PSF ...]]></description><link>https://blog.techbend.dev/i-am-nominating-myself-for-psf-board-of-directors</link><guid isPermaLink="true">https://blog.techbend.dev/i-am-nominating-myself-for-psf-board-of-directors</guid><category><![CDATA[Open Source]]></category><category><![CDATA[Python]]></category><category><![CDATA[Python 3]]></category><category><![CDATA[community]]></category><dc:creator><![CDATA[Ali Tavallaie]]></dc:creator><pubDate>Wed, 19 Jun 2024 21:09:33 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/stock/unsplash/1SLDCdUZAcM/upload/91a595cf33e927f9b2333e45cc49be05.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Hello everyone,</p>
<p>I hope you are doing well. I want to share some important news with you. I am nominating myself for the position of Director on the Board of the Python Software Foundation (PSF).</p>
<h2 id="heading-my-statement">My Statement</h2>
<p>Here is my official statement for the PSF Board of Directors nomination:</p>
<hr />
<p>I am honored to nominate myself for the position of Director on the Board of the Python Software Foundation (PSF). With extensive experience in Python development and a deep commitment to community engagement, I believe I can contribute significantly to the Foundation’s mission.</p>
<h3 id="heading-background-and-experience">Background and Experience</h3>
<p>I have been an active member of the Python community for over a decade, with experience ranging from standalone applications to backend systems and AI solutions. For the past few years, I have served as one of the managing committee members of TehPug, a 10-year-old community that participates in organizing PyCon in Iran. Our monthly meetings attract nearly 200 participants. Unfortunately, due to the situation in Iran, we do not have the same level of international activity or communication as communities in European countries. We aim to change this for the sake of knowledge and experience sharing. You can view my contributions on the <a target="_blank" href="https://wiki.python.org/moin/AliTavallaie">Python Wiki</a>.</p>
<p>My daily work involves using Python, and I have hosted numerous talks, meetups, and workshops aimed at empowering non-programmers, such as non-CS students, professionals in finance and accounting, and mechanical engineers, to use Python for automating repetitive tasks. These efforts not only expand the reach of Python but also equip individuals with valuable skills.</p>
<p>In addition to my technical contributions, I have actively worked to expand the Python community in regions with limited access to technology. I have led initiatives to introduce Python programming to underserved populations, providing them with the tools and knowledge to improve their career prospects. This includes organizing educational events and setting up community support systems in areas with poor internet access.</p>
<h3 id="heading-statement-of-concerns">Statement of Concerns</h3>
<p>My primary motivation for seeking a position on the PSF Board of Directors is to bring attention to the challenges faced by underrepresented and underserved communities within the Python ecosystem.</p>
<ol>
<li><p><strong>Access to Education</strong>: There are significant barriers to education for girls in Afghanistan. The denial of educational opportunities for these girls is a grave concern that needs to be addressed.</p>
</li>
<li><p><strong>Internet Access</strong>: In countries like Iran, many people do not have reliable internet access due to both technical limitations and wide censorship, which severely limits their ability to learn and contribute to the Python community. The PSF can work with PyPI mirror providers to improve access in the MENA region, provide more offline shareable materials in local languages, and support local Python groups that may need OFAC licenses, making these accessible with the help of the PSF.</p>
</li>
<li><p><strong>Support for Persian-speaking Communities</strong>: There is a notable absence of PyLadies chapters and Python support for Persian-speaking girls in Iran, Afghanistan, and other Persian-speaking countries.</p>
</li>
<li><p><strong>Community Building in Arabic-speaking Countries</strong>: Even in relatively stable countries like Oman, there is a lack of a strong Python community, which I believe is partly due to cultural barriers.</p>
</li>
</ol>
<h3 id="heading-commitment-to-advocacy">Commitment to Advocacy</h3>
<p>My candidacy is driven by a commitment to tell the stories of these underserved communities. It is not about whether I am elected or not; what is important is that the voices of these communities are heard. I want to highlight the impact that strong, inclusive communities can have in enabling individuals to find new opportunities and overcome societal barriers.</p>
<h3 id="heading-conclusion">Conclusion</h3>
<p>I am excited about the possibility of serving on the PSF Board of Directors and contributing to the Foundation’s efforts to create a more inclusive and supportive Python community. Thank you for considering my nomination.</p>
<hr />
<h2 id="heading-ofac-license-application">OFAC License Application</h2>
<p>I also want to share that I have applied for an OFAC license. This license will allow me to organize technology conferences, meetups, workshops, and other non-academic educational activities in countries with restrictions. However, I have not yet received an answer from OFAC.</p>
<p>Thank you for reading. Let's work together to make the Python community better for everyone.</p>
<p>Best regards</p>
]]></content:encoded></item><item><title><![CDATA[Python3.12 Upgrade: Setting Up Virtualenvwrapper]]></title><description><![CDATA[The Surprise Challenge
Recently, I decided to upgrade my system to Ubuntu 24.04. I enjoy keeping my setup current, and I wanted to take advantage of the latest features and improvements. Everything seemed to be going well until I hit a snag. I use vi...]]></description><link>https://blog.techbend.dev/python312-upgrade-setting-up-virtualenvwrapper</link><guid isPermaLink="true">https://blog.techbend.dev/python312-upgrade-setting-up-virtualenvwrapper</guid><category><![CDATA[Python]]></category><category><![CDATA[Python 3]]></category><category><![CDATA[virtualenvwrapper]]></category><category><![CDATA[Ubuntu]]></category><category><![CDATA[Ubuntu 24.04]]></category><category><![CDATA[Developer]]></category><category><![CDATA[Developer Tools]]></category><dc:creator><![CDATA[Ali Tavallaie]]></dc:creator><pubDate>Wed, 12 Jun 2024 16:44:58 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1718210252646/649234f1-c0b5-464e-94ff-521bfac3b299.webp" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h3 id="heading-the-surprise-challenge">The Surprise Challenge</h3>
<p>Recently, I decided to upgrade my system to Ubuntu 24.04. I enjoy keeping my setup current, and I wanted to take advantage of the latest features and improvements. Everything seemed to be going well until I hit a snag. I use <code>virtualenvwrapper</code> to manage my Python environments, but after the upgrade, it stopped working. I kept getting this error:</p>
<pre><code class="lang-bash">/usr/bin/python3: Error <span class="hljs-keyword">while</span> finding module specification <span class="hljs-keyword">for</span> <span class="hljs-string">'virtualenvwrapper.hook_loader'</span> (ModuleNotFoundError: No module named <span class="hljs-string">'virtualenvwrapper'</span>)
virtualenvwrapper.sh: There was a problem running the initialization hooks.

If Python could not import the module virtualenvwrapper.hook_loader,
check that virtualenvwrapper has been installed <span class="hljs-keyword">for</span> VIRTUALENVWRAPPER_PYTHON=/usr/bin/python3 and that PATH is <span class="hljs-built_in">set</span> properly.
</code></pre>
<h3 id="heading-digging-into-the-problem">Digging into the Problem</h3>
<p>This was a new problem for me. I discovered that Python 3.12, which comes with Ubuntu 24.04, has stricter rules about installing packages globally. This change is designed to prevent conflicts and maintain system stability by keeping the system's Python environment clean. However, it also means you can't just use <code>pip</code> to install things globally like before. Instead, you have to use virtual environments for package management.</p>
<p>I initially tried using <code>pipx</code> to install <code>virtualenvwrapper</code>, but I ran into another issue. The <code>virtualenvwrapper</code> installed via <code>pipx</code> wasn’t accessible in my <code>.zshrc</code> configuration. It seems <code>pipx</code> is great for some standalone applications, but it doesn't play well with tools like <code>virtualenvwrapper</code> that need to be sourced in a shell configuration file.</p>
<h3 id="heading-finding-the-solution">Finding the Solution</h3>
<p>To fix this, I decided to install <code>virtualenvwrapper</code> in its own virtual environment. Here’s how I did it:</p>
<h4 id="heading-step-1-create-a-virtual-environment">Step 1: Create a Virtual Environment</h4>
<p>First, I created a new virtual environment to keep things isolated.</p>
<pre><code class="lang-bash">python3 -m venv ~/.virtualenvs/venv
</code></pre>
<p>This command made a new virtual environment in the <code>~/.virtualenvs/venv</code> directory.</p>
<h4 id="heading-step-2-activate-the-virtual-environment">Step 2: Activate the Virtual Environment</h4>
<p>Next, I activated the virtual environment.</p>
<pre><code class="lang-bash"><span class="hljs-built_in">source</span> ~/.virtualenvs/venv/bin/activate
</code></pre>
<p>The shell prompt changed, showing I was now working inside the <code>venv</code> environment.</p>
<h4 id="heading-step-3-install-virtualenvwrapper">Step 3: Install <code>virtualenvwrapper</code></h4>
<p>With the virtual environment activated, I installed <code>virtualenvwrapper</code>.</p>
<pre><code class="lang-bash">pip install virtualenvwrapper
</code></pre>
<p><strong>Why Do This in a Virtual Environment?</strong></p>
<ol>
<li><p><strong>Avoid Conflicts</strong>: Python 3.12 doesn’t let you install packages globally to avoid messing up the system’s packages. Using a virtual environment keeps everything separate.</p>
</li>
<li><p><strong>Isolation</strong>: By installing in a virtual environment, <code>virtualenvwrapper</code> gets its own set of dependencies, with no interference from other projects.</p>
</li>
<li><p><strong>Easy Management</strong>: If something breaks, you can just delete the virtual environment and start over, without affecting the system Python or other projects.</p>
</li>
</ol>
<h4 id="heading-step-4-set-up-my-shell">Step 4: Set Up My Shell</h4>
<p>Next, I needed to tell my shell to use this new setup. I edited my <code>.zshrc</code> file (it could be <code>.bashrc</code> if you use bash).</p>
<h5 id="heading-edit-zshrc">Edit <code>.zshrc</code></h5>
<p>I opened my shell configuration file in a text editor:</p>
<pre><code class="lang-bash">nano ~/.zshrc
</code></pre>
<p>I added these lines:</p>
<pre><code class="lang-bash"><span class="hljs-built_in">export</span> WORKON_HOME=<span class="hljs-variable">$HOME</span>/.virtualenvs
<span class="hljs-built_in">export</span> VIRTUALENVWRAPPER_PYTHON=<span class="hljs-variable">$HOME</span>/.virtualenvs/venv/bin/python
<span class="hljs-built_in">export</span> VIRTUALENVWRAPPER_VIRTUALENV=<span class="hljs-variable">$HOME</span>/.virtualenvs/venv/bin/virtualenv
<span class="hljs-built_in">source</span> <span class="hljs-variable">$HOME</span>/.virtualenvs/venv/bin/virtualenvwrapper.sh
</code></pre>
<p><strong>What Do These Lines Do?</strong></p>
<ul>
<li><p><code>export WORKON_HOME=$HOME/.virtualenvs</code>: This sets the directory where <code>virtualenvwrapper</code> will keep all my virtual environments.</p>
</li>
<li><p><code>export VIRTUALENVWRAPPER_PYTHON=$HOME/.virtualenvs/venv/bin/python</code>: This tells <code>virtualenvwrapper</code> to use the Python from my virtual environment.</p>
</li>
<li><p><code>export VIRTUALENVWRAPPER_VIRTUALENV=$HOME/.virtualenvs/venv/bin/virtualenv</code>: This points to the <code>virtualenv</code> executable in my virtual environment.</p>
</li>
<li><p><code>source $HOME/.virtualenvs/venv/bin/</code><a target="_blank" href="http://virtualenvwrapper.sh"><code>virtualenvwrapper.sh</code></a>: This initializes <code>virtualenvwrapper</code> so I can use its commands.</p>
</li>
</ul>
<h5 id="heading-save-and-exit">Save and Exit</h5>
<p>In <code>nano</code>, I saved the file by pressing <code>Ctrl+O</code> and then <code>Enter</code>, and exited with <code>Ctrl+X</code>.</p>
<h4 id="heading-step-5-reload-my-shell-configuration">Step 5: Reload My Shell Configuration</h4>
<p>To apply the changes, I reloaded my shell configuration:</p>
<pre><code class="lang-bash"><span class="hljs-built_in">source</span> ~/.zshrc
</code></pre>
<h4 id="heading-step-6-check-the-installation">Step 6: Check the Installation</h4>
<p>Finally, I checked to see if everything was set up correctly:</p>
<pre><code class="lang-bash"><span class="hljs-built_in">which</span> mkvirtualenv
</code></pre>
<p>This command showed the path to the <code>mkvirtualenv</code> script in my virtual environment, confirming that everything was working.</p>
<h3 id="heading-wrapping-it-up">Wrapping It Up</h3>
<p>Upgrading to Ubuntu 24.04 brought a little challenge with <code>virtualenvwrapper</code>, but I learned a lot by solving it. By using a dedicated virtual environment, I kept my system clean and my projects organized. If you run into the same issue, I hope this guide helps you out. Happy coding!</p>
]]></content:encoded></item><item><title><![CDATA[Contribution Beyond Coding]]></title><description><![CDATA[Today, a friend sent me a message with a screenshot from GitHub. It showed my name, Ali Tavallaie, listed as a contributor to the Taiga project. Seeing my name there was a surprise and made me feel proud. My friend’s message made me realize that my c...]]></description><link>https://blog.techbend.dev/contribution-beyond-coding</link><guid isPermaLink="true">https://blog.techbend.dev/contribution-beyond-coding</guid><category><![CDATA[Open Source]]></category><category><![CDATA[translation]]></category><category><![CDATA[Python 3]]></category><category><![CDATA[contribution to open source]]></category><dc:creator><![CDATA[Ali Tavallaie]]></dc:creator><pubDate>Wed, 05 Jun 2024 18:05:10 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1717610586052/fefa101c-4d84-453d-b1f0-33ff08502e0b.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Today, a friend sent me a message with a screenshot from GitHub. It showed my name, Ali Tavallaie, listed as a contributor to the Taiga project. Seeing my name there was a surprise and made me feel proud. My friend’s message made me realize that my contribution, even though it wasn’t coding, was important.</p>
<p>I discovered Taiga, an open source project management tool, while browsing GitHub in 2019. As someone who enjoys open source, I’m always looking for ways to help out. I noticed that Taiga lacked a Persian translation. Although my main work involves coding, I saw this as a chance to contribute in a different way. <strong>I reached out to the Taiga team, offering to translate the project into Persian, and they welcomed my help.</strong></p>
<p>The task of translating Taiga was challenging. I needed to understand the software well and ensure that the translations were accurate and clear. It wasn’t just about converting words from English to Persian; it was about making sure the translation was contextually appropriate and easy to understand for Persian-speaking users. <strong>I worked on translating the interface and documentation, though I didn’t complete the entire translation.</strong></p>
<p>My translation work helped Persian-speaking users access and use Taiga more easily. <strong>I tried to make it easier for everyone</strong> who preferred to use software in Persian. It felt good to know that my effort could help others, even in a small way.</p>
<p>Seeing my name listed with other contributors like Amirhoshang Hoseinpour Dehkordi and Vahid Dayyani was heartwarming. <strong><em>It showed that contributions to open source come in many forms, not just coding</em></strong>. Translating, writing documentation, and other tasks are all important.</p>
<p>Working on Taiga taught me that open source projects need various skills. Writing, translating, designing, and testing are all crucial. Every contribution, big or small, helps make the project better and more accessible.</p>
<p>I want to encourage everyone to contribute to open source projects, even if you don’t write code. Open source is not just about programming; it's about creating a community where everyone’s skills are valued. Your skills, whether in translating, writing, designing, or testing, are valuable and can make a huge difference. Translating helps break down language barriers and makes the software accessible to more people. Writing documentation ensures that users and developers can understand and use the software effectively. Designing improves the user interface and experience, making the software more intuitive and user-friendly. Testing helps find and fix bugs, ensuring that the software works well for everyone.</p>
<p>Open source projects thrive on the diversity of contributions from many different people. Each contribution, no matter how small, helps to build and improve the project. By contributing your unique skills, you help create a richer, more inclusive community. Your efforts can inspire others to join in and contribute their skills as well. So, don’t hesitate to get involved. Your contributions are needed and appreciated. Together, we can make a significant impact and create something truly amazing.</p>
<p>Reflecting on my work with Taiga, I feel proud to be part of a community that values all kinds of contributions. My experience shows that open source is about more than just coding. It’s about collaboration and making technology better for everyone.</p>
<p>So, if you’re interested in an open source project, don’t hesitate to contribute. <strong>Your skills and efforts are needed and appreciated.</strong> You can make a difference, just like I did.</p>
<p>Remember, in the world of open source, every contribution matters. Together, we can create amazing things.</p>
]]></content:encoded></item><item><title><![CDATA[DevDock: Easy Management for Development Containers]]></title><description><![CDATA[I want to share a little adventure I’ve been on - creating a tool called DevDock. But first, let me tell you why I started this project and how it makes life easier for developers like you and me.
The Problem
In our small tech team, we often used Doc...]]></description><link>https://blog.techbend.dev/devdock-easy-management-for-development-containers</link><guid isPermaLink="true">https://blog.techbend.dev/devdock-easy-management-for-development-containers</guid><category><![CDATA[Python]]></category><category><![CDATA[Developer]]></category><category><![CDATA[Devops]]></category><category><![CDATA[Docker]]></category><category><![CDATA[containers]]></category><category><![CDATA[Open Source]]></category><category><![CDATA[GitHub]]></category><dc:creator><![CDATA[Ali Tavallaie]]></dc:creator><pubDate>Sat, 01 Jun 2024 21:01:59 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/stock/unsplash/sWOvgOOFk1g/upload/7b8e59c4258bdc04074ece2743329c5c.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>I want to share a little adventure I’ve been on - creating a tool called <a target="_blank" href="https://github.com/tavallaie/devdock">DevDock</a>. But first, let me tell you why I started this project and how it makes life easier for developers like you and me.</p>
<h3 id="heading-the-problem">The Problem</h3>
<p>In our small tech team, we often used Docker images and containers to streamline our development process. However, each time we started a new project or needed to make some tweaks, it was a hassle. We spent a lot of time modifying Docker Compose files or running containers with specific settings. It felt like a never-ending cycle of repetitive tasks, and it was frustrating.</p>
<h3 id="heading-the-idea">The Idea</h3>
<p>One day, while working late on a project, I was stuck in a loop of updating Docker Compose files and rerunning containers. I thought, "There has to be a better way to do this." That’s when the light bulb went off. What if we could have a tool that made managing these environments as easy as snapping your fingers? A tool that could handle all these tweaks and configurations effortlessly. And that’s how the idea of DevDock was born – a tool to put these tasks right at our fingertips.</p>
<h3 id="heading-what-is-a-dev-container">What is a Dev Container?</h3>
<p>Think of a dev container as a magic box. You put all your tools, libraries, and dependencies in it, and it keeps them safe and sound. When you open the box, everything is ready to use. It’s like having a personal chef who knows exactly how you like your meals.</p>
<h3 id="heading-why-use-dev-containers">Why Use Dev Containers?</h3>
<p>But why should we use dev containers? Let me tell you:</p>
<ol>
<li><p><strong>Consistency</strong>: No more “It works on my machine!” Everyone on the team has the same setup.</p>
</li>
<li><p><strong>Portability</strong>: Move your project to any computer, and it will work the same.</p>
</li>
<li><p><strong>Efficiency</strong>: Saves time and reduces frustration.</p>
</li>
</ol>
<h3 id="heading-storing-configurations">Storing Configurations</h3>
<p>As we began using dev containers, another realization struck me: having dev containers wasn’t enough. We needed a way to save our ideal setups so that we could recreate them effortlessly. Imagine if you could take a snapshot of your perfectly organized kitchen and set it up exactly the same way anywhere you go. That’s what storing configurations does for dev containers. It keeps your settings, dependencies, and tools saved, ensuring you can set up your development environment quickly and consistently every time.</p>
<h3 id="heading-the-birth-of-devdock">The Birth of DevDock</h3>
<p>With this realization, I started working on DevDock. My goal was simple: make it easy to create, manage, and store configurations for development containers. Unlike some IDE-specific solutions like what Visual Studio Code offers, I wanted DevDock to be IDE-independent. This way, developers using any code editor or IDE could benefit from a smooth, consistent development environment. I spent days coding, testing, and fixing bugs. There were challenging moments, but I kept going, motivated by the thought of making life easier for my fellow developers.</p>
<h3 id="heading-features-of-devdock">Features of DevDock</h3>
<ol>
<li><p><strong>Create Containers</strong>: Easily create containers with all the tools and dependencies you need.</p>
</li>
<li><p><strong>Store Configurations</strong>: DevDock stores your configurations in a simple YAML file. This means you can recreate your environment anytime, anywhere.</p>
</li>
<li><p><strong>Manage Volumes</strong>: Need to save data inside your container? No problem! DevDock helps you manage volumes too.</p>
</li>
<li><p><strong>Support for Docker Compose</strong>: If you have a complex setup with multiple services, DevDock supports Docker Compose, making it easy to manage.</p>
</li>
<li><p><strong>IDE Independence</strong>: Unlike VS Code’s built-in dev containers, DevDock works with any IDE or code editor.</p>
</li>
</ol>
<h3 id="heading-using-devdock">Using DevDock</h3>
<p>Using DevDock is super simple. Here’s how you can start your own journey with DevDock:</p>
<ol>
<li><p><strong>Install DevDock</strong>:</p>
<pre><code class="lang-bash"> pip install devdock
</code></pre>
</li>
<li><p><strong>Create a Container from an Image</strong>:</p>
<pre><code class="lang-bash"> devdock mkdevcontainer --image python:3.9 --name my-python-container --volumes /host/path1:/container/path1,/host/path2:/container/path2
</code></pre>
<p> Imagine you need a Python environment for a new project. With DevDock, you can create a container with Python 3.9 and map your local directories to the container effortlessly.</p>
</li>
<li><p><strong>Run Services from a Docker Compose File</strong>:</p>
<pre><code class="lang-bash"> devdock mkdevcontainer -f docker-compose.yaml --name my-compose --volume-mappings web:/host/path1:/var/www,web:/host/path2:/var/<span class="hljs-built_in">log</span>/nginx,redis:/host/redis1:/data,db:/host/db1:/var/lib/postgresql/data
</code></pre>
<p> Suppose you have a web project that also needs Redis and a PostgreSQL database. Using DevDock, you can specify your Docker Compose file and add volume mappings for each service, making the setup process a breeze.</p>
</li>
<li><p><strong>Activate a Configuration</strong>:</p>
<pre><code class="lang-bash"> devdock workon my-compose
</code></pre>
<p> Once your environment is set up, you can activate it with a single command. DevDock will start all the services defined in your configuration, so you can get to work immediately.</p>
</li>
<li><p><strong>Activate Specific Services</strong>:</p>
<pre><code class="lang-bash"> devdock workon my-compose --services web
</code></pre>
<p> If you only need to work on the web service, DevDock can activate just that service along with its dependencies, saving you resources and startup time.</p>
</li>
<li><p><strong>Run a Command Inside a Specific Service</strong>:</p>
<pre><code class="lang-bash"> devdock run my-compose --service web <span class="hljs-string">"echo Hello, World!"</span>
</code></pre>
<p> Need to run a command inside the web service? DevDock makes it simple. Just specify the service and the command, and DevDock takes care of the rest.</p>
</li>
<li><p><strong>Enter Shell Inside a Specific Service</strong>:</p>
<pre><code class="lang-bash"> devdock shell my-compose --service web
</code></pre>
<p> For more interactive work, you can enter a shell inside any service. This is great for debugging or making quick changes.</p>
</li>
<li><p><strong>Remove a Configuration</strong>:</p>
<pre><code class="lang-bash"> devdock rmdev my-compose
</code></pre>
<p> When you're done with a project, you can clean up easily. DevDock removes all the containers and configurations associated with your project, keeping your system tidy.</p>
</li>
</ol>
<h3 id="heading-join-the-adventure">Join the Adventure</h3>
<p>Creating DevDock has been an incredible journey. It started with a simple idea and grew into a tool that can help developers everywhere. Now, with DevDock, you can manage your dev containers with ease, save your configurations, and never worry about setting up your environment again.</p>
<p>If you’re a developer looking for a smoother workflow, give DevDock a try. I promise, it will make your coding life a lot easier. And who knows, you might just fall in love with it as much as I did.</p>
<p>I would love your feedback and contributions. If you have any ideas, suggestions, or find any issues, please visit our GitHub repository. Your contributions will help make DevDock even better.</p>
<p><strong>GitHub Repository</strong>: <a target="_blank" href="https://github.com/tavallaie/devdock">DevDock GitHub Repository</a></p>
<p>If you have any questions or need help, feel free to reach out. I’m always happy to help fellow developers.</p>
]]></content:encoded></item><item><title><![CDATA[Overcoming the Hazm Compatibility Challenge with Python 3.12]]></title><description><![CDATA[Today, my coworker Mahdi and I tackled a significant challenge with the Hazm Python package while working with Python 3.12. The issue arose when we discovered that Hazm was incompatible with the new version of Python. A collaborator from Hazm confirm...]]></description><link>https://blog.techbend.dev/overcoming-the-hazm-compatibility-challenge-with-python-312</link><guid isPermaLink="true">https://blog.techbend.dev/overcoming-the-hazm-compatibility-challenge-with-python-312</guid><category><![CDATA[Python 3]]></category><category><![CDATA[python-poetry]]></category><category><![CDATA[GitHub]]></category><category><![CDATA[Open Source]]></category><category><![CDATA[nltk]]></category><dc:creator><![CDATA[Ali Tavallaie]]></dc:creator><pubDate>Sun, 26 May 2024 21:55:16 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1716760130008/6dd0a934-5cab-4cd9-a804-11ae9be35882.webp" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Today, my coworker Mahdi and I tackled a significant challenge with the Hazm Python package while working with Python 3.12. The issue arose when we discovered that Hazm was incompatible with the new version of Python. A collaborator from Hazm confirmed that the problem couldn't be resolved until Gensim released a new package. You can read the discussion here: <a target="_blank" href="https://github.com/roshan-research/hazm/issues/322#issuecomment-1959231453">Hazm Issue #322</a>.</p>
<h2 id="heading-reproducing-the-bug">Reproducing the Bug</h2>
<p>To solve the issue, we first needed to reproduce the bug. Here are the steps we took:</p>
<ol>
<li><p><strong>Install Hazm on Python 3.12</strong>: We started by trying to install Hazm in a Python 3.12 environment using the following command:</p>
<pre><code class="lang-bash"> pip install hazm
</code></pre>
<p> <strong>Identify the Compatibility Issue</strong>: During installation, we encountered an error related to the deprecated <code>triu</code> function from SciPy, which Gensim used. The error message pointed us directly to the problem with the <code>triu</code> function.</p>
</li>
<li><p><strong>Investigate Dependencies</strong>: We examined Hazm's dependencies and found that it relied on Gensim. To confirm that Gensim was the source of the problem, we tried installing Gensim separately and encountered the same error.</p>
</li>
</ol>
<p><strong>Review Gensim's Repository</strong>: Determined to find a solution, we checked the <a target="_blank" href="https://github.com/piskvorky/gensim/">Gensim GitHub repository</a>. We noticed that the development branch was 25 commits ahead of the latest release tag. The latest release had an issue with the deprecated <code>triu</code> function from SciPy, which Gensim used. Fortunately, we found that this problem was fixed in a commit on the development branch.</p>
<h2 id="heading-our-approach-to-solving-the-issue">Our Approach to Solving the Issue</h2>
<p>To address this issue, we used Poetry, a tool for dependency management and packaging in Python. Poetry allows installation from a specific commit, which was crucial because we needed the latest changes from the development branch of Gensim, not the stable release.</p>
<h3 id="heading-steps-we-took">Steps We Took:</h3>
<ol>
<li><p><strong>Use Poetry for Installation</strong>: We used Poetry to install Gensim from the specific commit where the issue was resolved. We add the package manually in <code>pyproject.toml</code>:</p>
<pre><code class="lang-bash"> gensim={git = <span class="hljs-string">"https://github.com/piskvorky/gensim.git"</span>, rev =<span class="hljs-string">"commit-hash"</span>}
</code></pre>
<p> Replace <code>&lt;commit-hash&gt;</code> with the actual commit hash where the issue was fixed.</p>
</li>
<li><p><strong>Test the Solution</strong>: We tested the new setup, and it worked perfectly with Python 3.12.</p>
</li>
<li><p><strong>Contribute Back</strong>: We made a pull request to the Hazm repository to share our solution with the community. You can see our commits here: <a target="_blank" href="https://github.com/roshan-research/hazm/pull/338/commits">Hazm Pull Request #338</a>.</p>
</li>
</ol>
<h2 id="heading-temporary-solution-for-hazm-users">Temporary Solution for Hazm Users</h2>
<p>Until our pull request is merged into the main Hazm repository and published on PyPI, users can use the same approach we used for Gensim. This means installing Hazm from Mahdi's repository using either pip or Poetry.</p>
<h3 id="heading-installing-hazm-from-mahdis-repository">Installing Hazm from Mahdi's Repository</h3>
<p>You can follow these steps to install Hazm from the specific branch that includes our fix.</p>
<h4 id="heading-using-pip">Using pip</h4>
<ol>
<li><p>Open your terminal or command prompt.</p>
</li>
<li><p>Run the following command:</p>
<pre><code class="lang-bash"> pip install git+https://github.com/mahdisharifloo/hazm.git@master
</code></pre>
</li>
</ol>
<p>This command tells pip to install Hazm directly from Mahdi's GitHub repository from the <code>master</code> branch.</p>
<h4 id="heading-using-poetry">Using Poetry</h4>
<ol>
<li><p>Open your terminal or command prompt.</p>
</li>
<li><p>Navigate to your project directory.</p>
</li>
<li><p>Add the Hazm package from Mahdi's repository with the following command:</p>
<pre><code class="lang-bash"> poetry add git+https://github.com/mahdisharifloo/hazm.git
</code></pre>
</li>
</ol>
<p>This command instructs Poetry to add Hazm to your project's dependencies, pulling it directly from the specified repository and branch.</p>
<h2 id="heading-conclusion">Conclusion</h2>
<p>By following these steps, we were able to fix the compatibility issue with Hazm and Python 3.12. We hope our solution will help others facing the same problem.</p>
<p>Our experience has taught us the importance of being proactive and contributing back to the open-source community. By sharing our solution, we aim to help others who might encounter similar issues.</p>
<p>Until our changes are merged into the official Hazm repository and a new version is released on PyPI, users can follow our example to use the fixed version of Hazm from Mahdi's repository.</p>
<p>We look forward to seeing our contribution help improve Hazm for everyone in the community.</p>
<p>For more details, you can see the comparison and commits related to our fix here: <a target="_blank" href="https://github.com/roshan-research/hazm/compare/master...mahdisharifloo:hazm:master">Comparison and Commits</a>.</p>
<p>We hope this guide helps you navigate similar issues and contributes to smoother development experiences.</p>
]]></content:encoded></item><item><title><![CDATA[It Started with a Typo: My Journey to Becoming a Contributor in PGMQ]]></title><description><![CDATA[This story is based on true events and shows how anyone can become an open-source contributor with a little help from maintainers.
I was casually exploring GitHub when I stumbled upon PGMQ, a project using PostgreSQL for message queuing. I found a ty...]]></description><link>https://blog.techbend.dev/it-started-with-a-typo-pgmq</link><guid isPermaLink="true">https://blog.techbend.dev/it-started-with-a-typo-pgmq</guid><category><![CDATA[Python]]></category><category><![CDATA[Python 3]]></category><category><![CDATA[PostgreSQL]]></category><category><![CDATA[Open Source]]></category><dc:creator><![CDATA[Ali Tavallaie]]></dc:creator><pubDate>Thu, 23 May 2024 23:42:05 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1716507661902/d9681d04-ba7c-4743-9b9b-617a3c312a1e.webp" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>This story is based on true events and shows how anyone can become an open-source contributor with a little help from maintainers.</p>
<p>I was casually exploring GitHub when I stumbled upon PGMQ, a project using PostgreSQL for message queuing. I found a typo in the README and thought, "Why not fix it?" So, I forked the repo, corrected the typo, and submitted my first pull request. To my surprise, it got merged! Feeling like a hero, I decided to dive deeper.</p>
<p>Encouraged by my first success, I explored the codebase more. I noticed PGMQueue lacked support for environment variables. Thinking it was a simple task, I added the <code>python-dotenv</code> library and submitted another pull request <a target="_blank" href="https://github.com/tembo-io/pgmq/pull/222">(PR #222)</a>. Then came the feedback. One collaborator wasn't a fan of auto-loading environment files and suggested reading environment variables directly. Another contributor liked the idea but recommended avoiding the dependency on <code>python-dotenv</code>.</p>
<p>After much discussion and feedback, I removed <code>python-dotenv</code> and changed the implementation to use environment variables if provided. Additionally, we decided to use <code>unittest</code> instead of <code>pytest</code> for consistency. I rewrote all the tests, learning a lot along the way.</p>
<p>In another instance, I updated the development dependencies in the <code>pyproject.toml</code> file, only to receive feedback that I had removed some necessary ones. After some tweaks and running <code>poetry lock --no-update</code>, everything was sorted out.</p>
<p>We also revised the README to avoid using <code>python-dotenv</code>, making the setup simpler and cleaner. Despite the challenges, these experiences were full of insights and learning opportunities.</p>
<p>Feeling more confident, I tackled more significant features. One ongoing project is adding support for metrics to the Python library <a target="_blank" href="https://github.com/tembo-io/pgmq/pull/227">(PR #227)</a>. This should help users gain better insights into their queue operations.</p>
<p>Looking back, it's funny how a small typo led me to contribute to a project I really enjoy. Each task, no matter how simple, taught me something valuable. If you're thinking about contributing to open source, just go for it! Every little step counts.</p>
<p>For more details, check out my contributions: <a target="_blank" href="https://github.com/tembo-io/pgmq/pull/214">PR #214</a>, <a target="_blank" href="https://github.com/tembo-io/pgmq/pull/222">PR #222</a>, and <a target="_blank" href="https://github.com/tembo-io/pgmq/pull/227">PR #227</a>.</p>
]]></content:encoded></item><item><title><![CDATA[Code Magic with Typer and Jinja2 at TehPug!]]></title><description><![CDATA[On 05/16/2024, I had an unexpected chance to sprinkle some coding magic at TehPug! Even with a broken hand, nothing could stop me from sharing some cool tricks with the community.
At work, I dive into Django projects all the time. Recently, I found o...]]></description><link>https://blog.techbend.dev/code-magic-with-typer-and-jinja2-at-tehpug</link><guid isPermaLink="true">https://blog.techbend.dev/code-magic-with-typer-and-jinja2-at-tehpug</guid><category><![CDATA[Python]]></category><category><![CDATA[codegeneration]]></category><category><![CDATA[automation]]></category><dc:creator><![CDATA[Ali Tavallaie]]></dc:creator><pubDate>Thu, 16 May 2024 22:49:06 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1715899670594/253d2865-902a-47af-800f-a8e5b4853779.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>On 05/16/2024, I had an unexpected chance to sprinkle some coding magic at TehPug! Even with a broken hand, nothing could stop me from sharing some cool tricks with the community.</p>
<p>At work, I dive into Django projects all the time. Recently, I found out that Typer and Jinja2 are total game-changers. These tools help me whip up serializers, views, and routes super fast. During the talk, I showed how these simple functions can handle all the boring, repetitive tasks, leaving us with more time for the fun and challenging parts of coding.</p>
<p>I kicked off the talk by showcasing my little libraries on PyPI. I explained how each step in contributing to the community counts and encouraged everyone to publish their code, no matter how small it might seem. Sharing my journey from being a new contributor a few years ago to now was an important part of the talk. I wanted to show that anyone can be part of this amazing community with persistence and passion.</p>
<p>Then, I dove into the core of my presentation: my code generator. I explained how this tool, built with Typer and Jinja2, automates the creation of Django serializers, views, and routes. By leveraging these libraries, the generator streamlines the development process, allowing us to focus on more complex tasks.</p>
<p>The best part was seeing everyone’s excitement and curiosity. It was great to answer your questions and see how these tools can be applied to your projects. I hope you all walked away with some fresh ideas and inspiration.</p>
<p>Despite the unexpected nature of the talk and my broken hand, it was a fantastic experience. Your enthusiasm and support made it all worth it. I can't wait for the next meetup to share more tips and tricks. Until then, keep coding and having fun!</p>
]]></content:encoded></item><item><title><![CDATA[This Django is Chained: The Case Against Clean Architecture in Django/DRF Projects]]></title><description><![CDATA[Introduction
Clean Architecture is a respected design pattern used by many seasoned developers to organize complex projects into clear, distinct layers. Each layer serves a specific function, which can greatly enhance project structure and maintainab...]]></description><link>https://blog.techbend.dev/this-django-is-chained</link><guid isPermaLink="true">https://blog.techbend.dev/this-django-is-chained</guid><category><![CDATA[Python]]></category><category><![CDATA[Django]]></category><category><![CDATA[Clean Architecture]]></category><dc:creator><![CDATA[Ali Tavallaie]]></dc:creator><pubDate>Sat, 11 May 2024 20:16:54 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1715458304144/2ff0cc2c-2e6c-4f9c-86a0-413de2b39165.webp" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h2 id="heading-introduction"><strong>Introduction</strong></h2>
<p>Clean Architecture is a respected design pattern used by many seasoned developers to organize complex projects into clear, distinct layers. Each layer serves a specific function, which can greatly enhance project structure and maintainability in certain contexts. However, it also introduces complexity that may not always be necessary, especially in more straightforward applications.</p>
<p>In contrast, Django, a popular Python framework for building websites, champions a simpler, more integrated approach guided by the "Zen of Python" — a set of principles formulated by Tim Peters that emphasize readability and simplicity. One key tenet from this set, "Simple is better than complex," aligns closely with Django's philosophy.</p>
<p>Throughout this post, we'll explore scenarios where Django's straightforward methodology provides all the functionality needed without the additional layers proposed by Clean Architecture. While Clean Architecture has its merits, particularly in complex systems, Django's design is intended to streamline development and make the process more accessible and efficient. We will delve into how Django’s built-in tools often suffice for many web projects, making it a practical choice for developers who value simplicity and speed. Let’s explore the strengths of keeping things simple with Django.</p>
<h2 id="heading-1-contrasting-philosophies"><strong>1. Contrasting Philosophies</strong></h2>
<p>let's look at how the ideas behind Clean Architecture clash with the simple and clear principles of the "Zen of Python."</p>
<h3 id="heading-complexity-vs-simplicity"><strong>Complexity vs. Simplicity</strong></h3>
<p>The "Zen of Python" tells us that "Simple is better than complex." This means that when we write our code, it's better to keep it easy to understand and manage. However, Clean Architecture does the opposite by breaking the project into many different layers. Each layer has its role, which might sound organized, but it actually makes things more complex than necessary. For example, in a Django project, we could usually write a feature with fewer steps and less confusion if we skip the extra layers that Clean Architecture suggests.</p>
<h3 id="heading-explicit-vs-implicit"><strong>Explicit vs. Implicit</strong></h3>
<p>Another important idea from the "Zen of Python" is "Explicit is better than implicit." This means our code should clearly show what it does. Clean Architecture, with its many layers, often hides the details of how things work. This can make it hard to understand the code because you can't see directly what it is doing. In Django, it's usually better to have code that shows clearly and directly what happens, which helps anyone who reads or works with it.</p>
<p>By comparing these philosophies, we can see that Django's straightforward approach often makes more sense than adding the complexity of Clean Architecture. Keeping things simple and clear helps us maintain and develop projects more effectively.</p>
<h2 id="heading-2-the-pythonic-way-embracing-djangos-strengths"><strong>2. The Pythonic Way: Embracing Django’s Strengths</strong></h2>
<p>In this part, we'll focus on how Django's features support a simpler and more straightforward way of coding, which is very much in line with Python's principles.</p>
<h3 id="heading-orm-and-model-managers"><strong>ORM and Model Managers</strong></h3>
<p>One of Python's key ideas is "Flat is better than nested." This means that having a simple, one-level structure is better than a complicated multi-level setup. Django’s Object-Relational Mapping (ORM) system follows this idea very well. It allows us to work with database information easily and clearly, without needing to set up many layers of code. Clean Architecture, on the other hand, often involves creating several nested layers to handle data, which can make the process slower and harder to manage. By keeping the structure flat, Django makes it much easier for us to see and control what our code does.</p>
<h3 id="heading-built-in-functionalities"><strong>Built-in Functionalities</strong></h3>
<p>Another Python principle says, "If the implementation is easy to explain, it may be a good idea." Django lives up to this by providing built-in tools that are simple to use and explain. For example, Django's admin site lets us manage data in our database visually and straightforwardly, without complex setup. Similarly, Django's middleware and authentication systems are designed to be easy to add and understand. These features show how Django keeps things practical and user-friendly, avoiding unnecessary complications that could make the work harder.</p>
<p>By using Django's strengths, we can keep our projects clear and manageable, respecting Python's guidelines for simplicity and clarity. This approach not only makes our code better but also makes our life as developers easier.</p>
<h2 id="heading-3-the-burden-of-overengineering"><strong>3. The Burden of Overengineering</strong></h2>
<p>Overengineering means making a project more complicated than it needs to be, which can lead to several problems. Let’s look at how using Clean Architecture in Django projects can create extra challenges.</p>
<h3 id="heading-setup-and-maintenance-challenges"><strong>Setup and Maintenance Challenges</strong></h3>
<p>The "Zen of Python" tells us, "Complex is better than complicated." This means we should aim for solutions that might be a bit sophisticated but still straightforward rather than solutions that are just unnecessarily confusing. Setting up Clean Architecture in Django often leads to this unnecessary confusion. It requires us to create many separate layers and components, which can be hard to set up and keep running smoothly. This setup doesn’t just make the initial development slower but also makes future changes and maintenance harder because there are more pieces to update and more potential for mistakes.</p>
<h3 id="heading-performance-and-scalability-issues"><strong>Performance and Scalability Issues</strong></h3>
<p>Python’s philosophy also includes "In the face of ambiguity, refuse the temptation to guess." This is about avoiding uncertain situations where you might not know the best course of action. Clean Architecture, with its multiple abstraction layers, can introduce uncertainty about where performance issues might occur. Because the system is divided into many layers, it’s not always clear which layer is causing a slowdown or problem, making it hard to optimize and scale the system efficiently. This guessing game can lead to poor performance and scalability, which are critical aspects of any web application.</p>
<p>By avoiding overcomplicated designs like those often seen with Clean Architecture, we can keep our Django projects more manageable, performant, and scalable. Keeping things simpler helps us maintain clarity, which is crucial for successful development and operation.</p>
<h2 id="heading-4-practical-implications-and-developer-experience"><strong>4. Practical Implications and Developer Experience</strong></h2>
<p>Let’s talk about how Clean Architecture influences the day-to-day work of developers and adds complexity to coding tasks.</p>
<h3 id="heading-development-friction-and-onboarding"><strong>Development Friction and Onboarding</strong></h3>
<p>One important idea from the "Zen of Python" is "Readability counts." This means code should be easy to read and understand. Clean Architecture can make code more complicated, which is tough for new developers. When the code is hard to follow, it takes more time for newcomers to figure out where things are and how they work. This can slow down their ability to contribute and extend the time needed to get projects done.</p>
<h3 id="heading-overloaded-views-and-serialization"><strong>Overloaded Views and Serialization</strong></h3>
<p>"Sparse is better than dense" is another guideline from Python. It suggests that code should not be too packed with information. This keeps it easy to read and manage. However, in Django projects using Clean Architecture, views and serializers tend to have too much going on. They handle too many tasks and contain too much information, which makes the code hard to work through. This can lead to mistakes and make it challenging for developers to update or improve the code.</p>
<p>By making our Django projects simpler and more organized, we make sure that the code is user-friendly and easy to handle. This not only makes work faster but also leads to better software overall.</p>
<h2 id="heading-5-when-djangos-simplicity-triumphs"><strong>5. When Django’s Simplicity Triumphs</strong></h2>
<p>Let’s explore why Django’s straightforward approach is often the best choice for many projects.</p>
<h3 id="heading-real-world-use-cases"><strong>Real-World Use Cases</strong></h3>
<p>The "Zen of Python" has a principle: "Special cases aren't special enough to break the rules." This means that we should not change our usual methods just because something might seem like a unique situation. In many real-world projects, Django’s standard setup is more than enough. Most of the time, the extra layers and complexity of Clean Architecture are not needed. Django’s simpler approach fits well with many types of projects, making it unnecessary to complicate things with a specialized structure like Clean Architecture.</p>
<h3 id="heading-simplicity-as-a-strategic-advantage"><strong>Simplicity as a Strategic Advantage</strong></h3>
<p>Another Python guideline is "Although practicality beats purity." This suggests that what works in real situations is more important than perfect theories. Django’s built-in tools and straightforward structures work very well and are easy to use. They help us get things done efficiently and effectively. Choosing these simple, practical solutions over the complicated and often theoretical approach of Clean Architecture can be a strategic advantage. It helps keep projects manageable and reduces the risk of problems caused by unnecessary complexity.</p>
<p>By sticking to Django’s simple and direct methods, we can handle most project needs effectively. This approach not only saves time but also keeps our projects strong and flexible.</p>
<h2 id="heading-conclusion"><strong>Conclusion</strong></h2>
<p>In conclusion, this discussion highlights that Django's inherent simplicity and its alignment with Python's core philosophies often make it the superior choice for web development projects. By adhering to principles like "Simple is better than complex" and "Readability counts," Django not only fosters a more straightforward development process but also enhances maintainability and scalability.</p>
<p>As developers, we face numerous decisions that impact the practical outcomes of our projects. Embracing Django’s built-in functionalities and straightforward architecture can help us avoid the pitfalls of overengineering. This simplicity is not just about ease of use—it’s about making our software robust and accessible, especially for those who will maintain and evolve our codebases in the future.</p>
<p>I encourage everyone to share your thoughts and experiences on using Django and Clean Architecture. Have you found that Django’s simpler approach benefits your projects? Or have there been instances where a more complex architecture like Clean Architecture was necessary? Your insights can help others in the community weigh the practical benefits of simplicity against the demands of architectural complexity in their own projects. Let’s discuss and learn from each other’s experiences to find the best paths forward in our development practices.</p>
]]></content:encoded></item><item><title><![CDATA[Meet ezkernel: Making Jupyter Kernel Management Effortless]]></title><description><![CDATA[In the world of data science and programming, Jupyter notebooks stand out as a versatile and powerful tool, allowing users to blend code, output, and documentation seamlessly. A key feature of Jupyter is its support for multiple kernels, enabling cod...]]></description><link>https://blog.techbend.dev/meet-ezkernel-making-jupyter-kernel-management-effortless</link><guid isPermaLink="true">https://blog.techbend.dev/meet-ezkernel-making-jupyter-kernel-management-effortless</guid><category><![CDATA[Python]]></category><category><![CDATA[Jupyter Notebook ]]></category><category><![CDATA[ipykernel]]></category><category><![CDATA[Programming Blogs]]></category><dc:creator><![CDATA[Ali Tavallaie]]></dc:creator><pubDate>Sat, 09 Mar 2024 20:45:04 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1710016974014/9bf81e0b-bc74-45e4-bbaf-40f9666eda54.webp" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>In the world of data science and programming, Jupyter notebooks stand out as a versatile and powerful tool, allowing users to blend code, output, and documentation seamlessly. A key feature of Jupyter is its support for multiple kernels, enabling code execution in various programming languages and environments. While this flexibility is invaluable, managing these kernels—adding, removing, or renaming them—often felt more cumbersome than it needed to be.</p>
<p>That's where the idea for <code>ezkernel</code> (short for "easykernel") came from. As someone who frequently toggles between different Jupyter kernels, I wanted a simpler, more straightforward way to manage them—something that didn't disrupt the flow of my work. <code>ezkernel</code> is designed to be that friendly tool in your toolkit, making kernel management as easy as a few simple commands.</p>
<h2 id="heading-the-genesis-of-ezkernel"><strong>The Genesis of ezkernel</strong></h2>
<p>The journey to <code>ezkernel</code> began with a common frustration: the constant need to look up commands or navigate through Jupyter's interface just to manage kernels. Whether it was adding a kernel for a new project, cleaning up old kernels, or renaming kernels for clarity, each task seemed to require more steps than necessary.</p>
<p><code>ezkernel</code> aims to streamline these tasks, embodying the principle that tooling should make our lives easier, not more complicated. It's built for those moments when you think, "There has to be an easier way to do this."</p>
<h2 id="heading-core-features-of-ezkernel"><strong>Core Features of ezkernel</strong></h2>
<p><code>ezkernel</code> focuses on three key functionalities, all accessible through an intuitive command-line interface:</p>
<ul>
<li><p><strong>Add Kernels Quickly</strong>: Add new kernels with a single command, specifying just the name and an optional display name.</p>
</li>
<li><p><strong>Remove Kernels Easily</strong>: Clean up your workspace by removing unnecessary kernels without hassle.</p>
</li>
<li><p><strong>Rename Kernels for Clarity</strong>: Update kernel names to reflect their current use or environment, helping you stay organized.</p>
</li>
</ul>
<h2 id="heading-getting-started"><strong>Getting Started</strong></h2>
<p>Getting up and running with <code>ezkernel</code> is straightforward. Install it via pip with:</p>
<pre><code class="lang-bash"> pip install ezkernel
</code></pre>
<h3 id="heading-adding-a-kernel"><strong>Adding a Kernel</strong></h3>
<p>To add a new kernel, simply use:</p>
<pre><code class="lang-bash">ezkernel add my_kernel --display-name <span class="hljs-string">"My Kernel"</span>
</code></pre>
<h3 id="heading-removing-a-kernel"><strong>Removing a Kernel</strong></h3>
<p>To remove a kernel, the command is just as simple:</p>
<pre><code class="lang-bash">ezkernel remove my_kernel
</code></pre>
<h3 id="heading-renaming-a-kernel"><strong>Renaming a Kernel</strong></h3>
<p>And renaming a kernel is equally straightforward:</p>
<pre><code class="lang-bash">ezkernel rename old_name new_name
</code></pre>
<h2 id="heading-the-philosophy-behind-ezkernel"><strong>The Philosophy Behind ezkernel</strong></h2>
<p><code>ezkernel</code> was born out of a desire to reduce friction and make the daily tasks of developers and data scientists a bit more pleasant. It's a testament to the idea that sometimes, small tools can make a big difference in our workflow and productivity. By focusing on ease of use and simplicity, <code>ezkernel</code> invites more people to work efficiently with Jupyter, regardless of their level of expertise.</p>
<h2 id="heading-in-conclusion"><strong>In Conclusion</strong></h2>
<p>If you've ever found yourself interrupted by the need to manage Jupyter kernels, <code>ezkernel</code> is for you. It's a small tool with a simple mission: to make kernel management effortless, letting you focus on the more important and exciting aspects of your work.</p>
<p>Try <code>ezkernel</code> today, and experience a smoother, more intuitive way to manage your Jupyter kernels. Here's to making our work with Jupyter notebooks just a little bit easier!</p>
]]></content:encoded></item><item><title><![CDATA[My Personal Dive into Git & GitFlow]]></title><description><![CDATA[Hey everyone,
I'm excited to share a project that's been my companion during many late nights and early mornings: "A Comprehensive Guide to Git & GitFlow." This isn't just a book; it's a reflection of my journey with Git, the challenges, the triumphs...]]></description><link>https://blog.techbend.dev/my-personal-dive-into-git-gitflow</link><guid isPermaLink="true">https://blog.techbend.dev/my-personal-dive-into-git-gitflow</guid><category><![CDATA[Git]]></category><category><![CDATA[GitHub]]></category><category><![CDATA[GitLab]]></category><category><![CDATA[Git, GitHub, Version Control, Linux, Git Commands, GitHub Repositories, Cheat Sheet, Git Branching, Git Workflow, Collaboration, Git History, Git Commit, Git Merge, Git Rebase, Git Pull Request, Git Fork, Git Stash, Git Remote, Git Ignore, Git Hooks, GitHub Issues, GitHub Actions, GitHub Pages, GitHub Security, Git for Beginners, Advanced Git Techniques, GitHub Collaboration, Git Integration, Git Flow, Git Best Practices.]]></category><dc:creator><![CDATA[Ali Tavallaie]]></dc:creator><pubDate>Fri, 27 Oct 2023 23:00:25 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/stock/unsplash/wX2L8L-fGeA/upload/e398c430649782fca05d76ff08eb76e2.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Hey everyone,</p>
<p>I'm excited to share a project that's been my companion during many late nights and early mornings: "A Comprehensive Guide to Git &amp; GitFlow." This isn't just a book; it's a reflection of my journey with Git, the challenges, the triumphs, and everything in between.</p>
<p><strong>Why This Book?</strong><br />Every challenge I faced, every "Eureka!" moment I had with Git, I jotted down. I wanted to share those insights, hoping they might make someone else's journey a bit smoother.</p>
<p><strong>What's Inside?</strong><br />From the basics for those just starting, to the deeper dives for the seasoned coders, it's all in there. It's my Git journey, and I hope it helps guide yours.</p>
<p><strong>Check It Out on GitBook:</strong><br />I chose <a target="_blank" href="http://gitbook.com">GitBook</a> for its simplicity. Dive in <a target="_blank" href="https://book.techbend.io/v/git-and-gitflow">here</a>.</p>
<p><strong>Your Thoughts?</strong><br />I'd love to hear your feedback, thoughts, or any Git stories you'd like to share.</p>
<p>Thanks for being a part of this journey with me. Happy coding!</p>
]]></content:encoded></item><item><title><![CDATA[Welcome to Techbend]]></title><description><![CDATA[In this age of technological singularity, where machines and human intelligence converge, "Techbend" gains a profound significance. Merging "technology" and "bend", the term embodies:

The Inflection ]]></description><link>https://blog.techbend.dev/welcome-to-techbend</link><guid isPermaLink="true">https://blog.techbend.dev/welcome-to-techbend</guid><category><![CDATA[AI]]></category><category><![CDATA[Artificial Intelligence]]></category><category><![CDATA[emergingtechnology]]></category><dc:creator><![CDATA[Ali Tavallaie]]></dc:creator><pubDate>Thu, 26 Oct 2023 09:24:37 GMT</pubDate><enclosure url="https://cdn.hashnode.com/uploads/covers/60114b552426ce4197072eb6/74857343-4ef8-4581-97c9-d312d0228119.jpg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>In this age of technological singularity, where machines and human intelligence converge, "Techbend" gains a profound significance. Merging "technology" and "bend", the term embodies:</p>
<ol>
<li><p><strong>The Inflection Point</strong>: As we approach the singularity, technology doesn't just progress; it bends, twists, and reshapes at an unprecedented pace. "Techbend" captures that exhilarating moment when technological advancements are no longer linear but exponential, opening doors to possibilities beyond our wildest imaginations.</p>
</li>
<li><p><strong>Harmonizing Entities</strong>: In this era, humans and machines are not distinct but intertwined. "Techbend" symbolizes this seamless fusion, where technology bends to complement human potential, leading to a unified, enhanced existence.</p>
</li>
</ol>
<p>At the heart of it, "Techbend" is a testament to the transformative power of technology in an age where boundaries blur, and the unimaginable becomes reality.</p>
]]></content:encoded></item></channel></rss>