<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" ><generator uri="https://jekyllrb.com/" version="3.10.0">Jekyll</generator><link href="https://rusydy.github.io/feed.xml" rel="self" type="application/atom+xml" /><link href="https://rusydy.github.io/" rel="alternate" type="text/html" /><updated>2025-12-01T09:43:35+00:00</updated><id>https://rusydy.github.io/feed.xml</id><title type="html">Simple Blog</title><subtitle>&lt;section&gt;
  &lt;p&gt;
    Hi, I&apos;m Rusydy Muhiddin.
  &lt;/p&gt;

  &lt;p&gt;
    A software engineer who loves to write about anything I find interesting.
  &lt;/p&gt;

  &lt;p&gt;
    more about me &lt;a href=&quot;about.html&quot;&gt;here&lt;/a&gt; and my resume &lt;a href=&quot;resume.html&quot;&gt;here&lt;/a&gt;.
  &lt;/p&gt;

  &lt;p&gt;
    if you want to connect, you can find me on &lt;a href=&quot;https://github.com/Rusydy&quot;&gt;GitHub&lt;/a&gt;, &lt;a href=&quot;https://linkedin.com/in/rusydy-muhiddin/&quot;&gt;LinkedIn&lt;/a&gt;, or just send me an &lt;a href=&quot;mailto:rusydymuhiddin@gmail.com&quot;&gt;email&lt;/a&gt;.
  &lt;/p&gt;

  &lt;p&gt;
    Anyways, you can adjust the theme by clicking the picture above.
  &lt;/p&gt;

  &lt;p&gt;
    Happy reading!
  &lt;/p&gt;
&lt;/section&gt;
</subtitle><author><name>Rusydy Muhiddin</name></author><entry><title type="html">Installing MySQL 5.7 Community Server on AlmaLinux 10</title><link href="https://rusydy.github.io/installing-mysql57-community-server-almalinux10.html" rel="alternate" type="text/html" title="Installing MySQL 5.7 Community Server on AlmaLinux 10" /><published>2025-11-13T00:00:00+00:00</published><updated>2025-11-13T00:00:00+00:00</updated><id>https://rusydy.github.io/installing-mysql57-community-server-almalinux10</id><content type="html" xml:base="https://rusydy.github.io/installing-mysql57-community-server-almalinux10.html"><![CDATA[<p>This guide provides step-by-step instructions for installing MySQL 5.7 Community Server on AlmaLinux 10.</p>

<h2 id="prerequisites">Prerequisites</h2>

<ul>
  <li>AlmaLinux 10 system with sudo privileges</li>
  <li>Internet connection for package downloads</li>
</ul>

<h2 id="installation-steps">Installation Steps</h2>

<h3 id="step-1-add-mysql-community-repository">Step 1: Add MySQL Community Repository</h3>

<p>Create the MySQL community repository configuration file:</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">sudo </span>vim /etc/yum.repos.d/mysql-community.repo
</code></pre></div></div>

<p>Add the following content to the file:</p>

<div class="language-ini highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nn">[mysql57-community]</span>
<span class="py">name</span><span class="p">=</span><span class="s">MySQL 5.7 Community Server</span>
<span class="py">baseurl</span><span class="p">=</span><span class="s">http://repo.mysql.com/yum/mysql-5.7-community/el/7/$basearch/</span>
<span class="py">enabled</span><span class="p">=</span><span class="s">1</span>
<span class="py">gpgcheck</span><span class="p">=</span><span class="s">0</span>

<span class="nn">[mysql-connectors-community]</span>
<span class="py">name</span><span class="p">=</span><span class="s">MySQL Connectors Community</span>
<span class="py">baseurl</span><span class="p">=</span><span class="s">http://repo.mysql.com/yum/mysql-connectors-community/el/7/$basearch/</span>
<span class="py">enabled</span><span class="p">=</span><span class="s">1</span>
<span class="py">gpgcheck</span><span class="p">=</span><span class="s">0</span>

<span class="nn">[mysql-tools-community]</span>
<span class="py">name</span><span class="p">=</span><span class="s">MySQL Tools Community</span>
<span class="py">baseurl</span><span class="p">=</span><span class="s">http://repo.mysql.com/yum/mysql-tools-community/el/7/$basearch/</span>
<span class="py">enabled</span><span class="p">=</span><span class="s">1</span>
<span class="py">gpgcheck</span><span class="p">=</span><span class="s">0</span>
</code></pre></div></div>

<h3 id="step-2-configure-repository-settings">Step 2: Configure Repository Settings</h3>

<p>Ensure MySQL 8.0 is disabled and MySQL 5.7 is enabled:</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c"># Disable MySQL 8.0 Community Repository</span>
<span class="nb">sudo </span>dnf config-manager <span class="nt">--disable</span> mysql80-community

<span class="c"># Enable MySQL 5.7 Community Repository</span>
<span class="nb">sudo </span>dnf config-manager <span class="nt">--enable</span> mysql57-community
</code></pre></div></div>

<h3 id="step-3-install-mysql-57-community-server">Step 3: Install MySQL 5.7 Community Server</h3>

<p>Install the MySQL server package:</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">sudo </span>dnf <span class="nb">install </span>mysql-community-server
</code></pre></div></div>

<h3 id="step-4-start-and-enable-mysql-service">Step 4: Start and Enable MySQL Service</h3>

<p>Start the MySQL service and enable it to start automatically on boot:</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">sudo </span>systemctl <span class="nb">enable</span> <span class="nt">--now</span> mysqld.service
</code></pre></div></div>

<p>Verify the service is running:</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">sudo </span>systemctl status mysqld.service
</code></pre></div></div>

<h3 id="step-5-retrieve-temporary-root-password">Step 5: Retrieve Temporary Root Password</h3>

<p>MySQL generates a temporary password for the root user during installation. Retrieve it using:</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">sudo grep</span> <span class="s1">'A temporary password'</span> /var/log/mysqld.log | <span class="nb">tail</span> <span class="nt">-1</span>
</code></pre></div></div>

<p><strong>Example output:</strong></p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>2025-11-12T12:16:18.004506Z 1 [Note] A temporary password is generated for root@localhost: EQ(9h)1AsZen
</code></pre></div></div>

<p><strong>Important:</strong> Make note of the password (in this example: <code class="language-plaintext highlighter-rouge">EQ(9h)1AsZen</code>) as you’ll need it for the next step.</p>

<h3 id="step-6-secure-mysql-installation">Step 6: Secure MySQL Installation</h3>

<p>Run the MySQL secure installation script to enhance security:</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">sudo </span>mysql_secure_installation
</code></pre></div></div>

<p>Follow the interactive prompts:</p>

<ol>
  <li><strong>Enter the temporary password</strong> you noted in the previous step</li>
  <li><strong>Set a new root password</strong> when prompted</li>
  <li><strong>Remove anonymous users:</strong> Select <code class="language-plaintext highlighter-rouge">Yes</code></li>
  <li><strong>Disallow root login remotely:</strong> Select <code class="language-plaintext highlighter-rouge">Yes</code></li>
  <li><strong>Remove test database:</strong> Select <code class="language-plaintext highlighter-rouge">Yes</code></li>
  <li><strong>Reload privilege tables:</strong> Select <code class="language-plaintext highlighter-rouge">Yes</code></li>
</ol>

<p><strong>Example interactive session:</strong></p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>Change the password for root ? (Press y|Y for Yes, any other key for No) : Yes

New password: [Enter your new secure password]
Re-enter new password: [Confirm your password]

Estimated strength of the password: 100
Do you wish to continue with the password provided?: Yes

Remove anonymous users?: Yes
Success.

Disallow root login remotely? : Yes
Success.

Remove test database and access to it? : Yes
 - Dropping test database...
Success.
 - Removing privileges on test database...
Success.

Reload privilege tables now? (Press y|Y for Yes) : Yes
Success.

All done!
</code></pre></div></div>

<h2 id="verification">Verification</h2>

<p>Test your MySQL installation by connecting to the server:</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>mysql <span class="nt">-u</span> root <span class="nt">-p</span>
</code></pre></div></div>

<p>Enter your new root password when prompted. If successful, you’ll see the MySQL prompt:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>mysql&gt;
</code></pre></div></div>

<p>To exit MySQL, type:</p>
<div class="language-sql highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">EXIT</span><span class="p">;</span>
</code></pre></div></div>

<h2 id="troubleshooting">Troubleshooting</h2>

<h3 id="common-issues">Common Issues</h3>

<ul>
  <li><strong>Service fails to start:</strong> Check system logs with <code class="language-plaintext highlighter-rouge">sudo journalctl -u mysqld.service</code></li>
  <li><strong>Cannot find temporary password:</strong> Ensure the service started properly and check <code class="language-plaintext highlighter-rouge">/var/log/mysqld.log</code></li>
  <li><strong>Repository conflicts:</strong> Verify repository configuration and ensure conflicting MySQL packages are not installed</li>
</ul>

<h3 id="useful-commands">Useful Commands</h3>

<ul>
  <li>Check MySQL version: <code class="language-plaintext highlighter-rouge">mysql --version</code></li>
  <li>View MySQL configuration: <code class="language-plaintext highlighter-rouge">sudo cat /etc/my.cnf</code></li>
  <li>Monitor MySQL logs: <code class="language-plaintext highlighter-rouge">sudo tail -f /var/log/mysqld.log</code></li>
</ul>

<h2 id="security-considerations">Security Considerations</h2>

<ul>
  <li>Always use strong passwords for database users</li>
  <li>Consider configuring firewall rules to restrict database access</li>
  <li>Regularly update MySQL to the latest 5.7.x version for security patches</li>
  <li>Backup your databases regularly</li>
</ul>

<h2 id="references">References</h2>

<ul>
  <li><a href="https://dev.mysql.com/doc/refman/5.7/en/">MySQL 5.7 Documentation</a></li>
  <li><a href="https://computingforgeeks.com/install-mysql-5-7-on-centos-rhel-linux/">Original Installation Guide</a></li>
</ul>]]></content><author><name>Rusydy Muhiddin</name></author><category term="tech" /><category term="postgres" /><summary type="html"><![CDATA[This guide provides step-by-step instructions for installing MySQL 5.7 Community Server on AlmaLinux 10.]]></summary></entry><entry><title type="html">The Suburban Dream vs. The Urban Reality: Pros and Cons of Buying a House in the Jakarta Suburbs</title><link href="https://rusydy.github.io/buying-house-in-suburbs-jakarta.html" rel="alternate" type="text/html" title="The Suburban Dream vs. The Urban Reality: Pros and Cons of Buying a House in the Jakarta Suburbs" /><published>2025-09-14T00:00:00+00:00</published><updated>2025-09-14T00:00:00+00:00</updated><id>https://rusydy.github.io/buying-house-in-suburbs-jakarta</id><content type="html" xml:base="https://rusydy.github.io/buying-house-in-suburbs-jakarta.html"><![CDATA[<p>For many of us navigating life in our 20s and 30s in Jakarta, the dream of owning a home often leads to a single, major crossroad: do you buy a compact apartment in the city, or a spacious house in the suburbs? The allure of the <em>pinggiran</em>—areas like BSD, Bintaro, Gading Serpong, or even Depok and Bekasi—is undeniable. But is the trade-off worth it?</p>

<p>After weighing this decision myself, I’ve compiled a list of the real-world pros and cons of trading city chaos for suburban calm.</p>

<h2 id="the-pros-the-allure-of-a-structured-life">The Pros: The Allure of a Structured Life</h2>

<p>The appeal of the suburbs often comes down to one word: predictability. In a city as wonderfully chaotic as Jakarta, a little bit of order can feel like the ultimate luxury.</p>

<h4 id="1-privacy-and-professional-conflict-resolution">1. Privacy and Professional Conflict Resolution</h4>

<p>In a typical Jakarta <em>gang</em> (alleyway), your life is an open book. In a suburban cluster, you can maintain your privacy. If a neighbour is too noisy or their car is blocking your gate, you don’t have to engage in a potentially awkward confrontation. A quick call to the estate management or the security post (<code class="language-plaintext highlighter-rouge">pos satpam</code>) handles the issue professionally.</p>

<h4 id="2-orderly-and-uninterrupted-streets">2. Orderly and Uninterrupted Streets</h4>

<p>This is a big one. You’ll never wake up to find the main road to your house blocked by a giant tent for a <em>hajatan</em> (wedding or celebration). The streets within the cluster are managed by the developer, ensuring they remain open and accessible for residents.</p>

<h4 id="3-enhanced-security-and-peace-of-mind">3. Enhanced Security and Peace of Mind</h4>

<p>Most suburban housing clusters operate with a one-gate system and have security patrols running 24/7. This provides a significant sense of safety, whether you’re at home, at work, or travelling. It’s a comfort that’s hard to put a price on.</p>

<h4 id="4-more-space-and-a-quieter-environment">4. More Space and a Quieter Environment</h4>

<p>This is perhaps the biggest draw. For the price of a small two-bedroom apartment in South Jakarta, you can often get a landed house with a small garden. The environment is also significantly quieter. You trade the constant symphony of horns and construction for the sound of birds in the morning and crickets at night. The air quality often feels better, too.</p>

<h4 id="5-organized-utilities-like-garbage-collection">5. Organized Utilities (Like Garbage Collection)</h4>

<p>Forget seeing piles of trash on street corners or smelling burnt plastic from neighbours burning their own garbage. Suburban townships have a dedicated, scheduled garbage collection system, leading to a cleaner and healthier living environment.</p>

<h4 id="6-a-support-system-for-modern-life">6. A Support System for Modern Life</h4>

<p>Little conveniences add up. Working from home and expecting a package? If you need to step out, you can simply inform security, and they’ll receive it for you. This simple service is a lifesaver in the age of e-commerce.</p>

<h2 id="the-cons-the-reality-of-the-commute-and-the-bubble">The Cons: The Reality of the Commute and the Bubble</h2>

<p>Of course, the suburban dream isn’t without its drawbacks. The trade-offs are real and can significantly impact your lifestyle.</p>

<h4 id="1-the-commute-is-a-major-commitment">1. The Commute is a Major Commitment</h4>

<p>Your one original con is the most critical one. Public transport integration is often poor. While the KRL Commuter Line is a lifeline, the “last mile” from the station to your house can be a hassle, often requiring a car or an online taxi. This means you are heavily reliant on a private vehicle, and you’ll spend a significant amount of your time, money (for fuel and tolls - <em>biaya tol</em>), and energy stuck in Jakarta’s infamous <em>macet</em> (traffic jams). A daily round trip can easily take 2-3 hours, which adds up to a significant chunk of your day.</p>

<h4 id="2-spontaneity-takes-a-back-seat">2. Spontaneity Takes a Back Seat</h4>

<p>Want to meet friends for a spontaneous dinner at a trendy new restaurant in SCBD? That’s not a quick trip anymore. It’s a planned expedition. Your social life might become more centered around the malls and cafes within your suburban bubble, and you might experience a bit of FOMO (Fear Of Missing Out) from the city’s vibrant, ever-changing scene.</p>

<h4 id="3-the-cookie-cutter-vibe-and-hidden-costs">3. The “Cookie-Cutter” Vibe and Hidden Costs</h4>

<p>While organized, some find suburban clusters to be sterile and lacking the unique character of older Jakarta neighbourhoods. You also have to factor in the monthly maintenance fee (<code class="language-plaintext highlighter-rouge">Iuran Pengelolaan Lingkungan</code> or IPL), which covers security, garbage, and facility upkeep. This is an additional, recurring cost on top of your mortgage.</p>

<h4 id="4-the-suburban-bubble">4. The Suburban Bubble</h4>

<p>It’s easy to get comfortable and never leave your township. With malls, schools, hospitals, and offices all within the same planned area, you might find yourself living in a bubble, disconnected from the wider pulse and diversity of the metropolis.</p>

<h3 id="conclusion-its-all-about-your-priorities">Conclusion: It’s All About Your Priorities</h3>

<p>Ultimately, the choice between city and suburb isn’t about which is “better,” but what’s right for <strong>you</strong> at your current stage of life.</p>

<p>If you crave space, security, and a quiet environment to potentially raise a family, and you can manage the commute, the suburbs are a fantastic option.</p>

<p>However, if your career and social life are deeply embedded in the city center, and you thrive on spontaneity and easy access to everything, the daily grind from the suburbs might wear you down.</p>

<p>It’s a classic trade-off: <strong>space and serenity vs. access and spontaneity.</strong></p>]]></content><author><name>Rusydy Muhiddin</name></author><category term="life-in-20s" /><category term="jakarta" /><summary type="html"><![CDATA[For many of us navigating life in our 20s and 30s in Jakarta, the dream of owning a home often leads to a single, major crossroad: do you buy a compact apartment in the city, or a spacious house in the suburbs? The allure of the pinggiran—areas like BSD, Bintaro, Gading Serpong, or even Depok and Bekasi—is undeniable. But is the trade-off worth it?]]></summary></entry><entry><title type="html">Simplify Your Stack: The Case for Postgres as a Full-Stack Platform</title><link href="https://rusydy.github.io/simplify-your-stack-postgres-full-stack-platform.html" rel="alternate" type="text/html" title="Simplify Your Stack: The Case for Postgres as a Full-Stack Platform" /><published>2025-07-30T00:00:00+00:00</published><updated>2025-07-30T00:00:00+00:00</updated><id>https://rusydy.github.io/simplify-your-stack-postgres-full-stack-platform</id><content type="html" xml:base="https://rusydy.github.io/simplify-your-stack-postgres-full-stack-platform.html"><![CDATA[<p>Modern web development often feels like a paradox. We have an unprecedented number of powerful tools, frameworks, and services at our disposal, yet building and deploying even a simple application has never felt more complex. The dream of a lean MVP can quickly devolve into a nightmare of juggling a dozen different services, each with its own pricing, configuration, and learning curve.</p>

<blockquote>
  <p>Your to-do list app now needs a seed round.</p>
</blockquote>

<p>But what if there was a way to escape this complexity? What if a single, reliable tool you already know could handle the work of many? It’s time to take another look at a boring, old friend: <strong>Postgres</strong>. The humble SQL database has secretly evolved into a full-stack powerhouse, a Swiss Army knife capable of simplifying your entire architecture.</p>

<h2 id="the-problem-the-sprawl-of-the-modern-tech-stack">The Problem: The Sprawl of the Modern Tech Stack</h2>

<p>To launch a modern application, the checklist of required services can be daunting. You’re told you need:</p>

<ul>
  <li>A primary database (like Postgres or MySQL).</li>
  <li>A NoSQL database for flexible data (like MongoDB).</li>
  <li>A caching layer for performance (like Redis).</li>
  <li>A separate service for background and scheduled jobs (cron jobs).</li>
  <li>A search engine for fast, fuzzy search (like Algolia or Elasticsearch).</li>
  <li>A vector database for AI and embeddings (like Pinecone).</li>
  <li>A real-time service for live data updates (like Firebase).</li>
  <li>Authentication, analytics, and monitoring tools.</li>
</ul>

<p>This fragmented approach introduces “JavaScript framework drama,” surprise invoices, and a web of dependencies just to get a basic product out the door.</p>

<h2 id="the-solution-the-postgres-all-in-one-ecosystem">The Solution: The Postgres All-in-One Ecosystem</h2>

<p>Postgres, through its robust core features and incredible extension ecosystem, can consolidate many of these functions directly within the database. Here’s how.</p>

<h3 id="1-nosql-flexibility-with-jsonb">1. NoSQL Flexibility with <code class="language-plaintext highlighter-rouge">JSONB</code></h3>

<p>Thought you needed a separate NoSQL database for unstructured data? Think again. Postgres’s <code class="language-plaintext highlighter-rouge">JSONB</code> data type allows you to store dynamic, schema-less JSON documents natively. You get the flexibility of NoSQL with the power of SQL queries to search and manipulate that data. It’s the best of both worlds: structure and chaos, living together.</p>

<h3 id="2-scheduled-jobs-with-pg_cron">2. Scheduled Jobs with <code class="language-plaintext highlighter-rouge">pg_cron</code></h3>

<p>Forget setting up a separate server or wrestling with Linux scripts for your background tasks. The <code class="language-plaintext highlighter-rouge">pg_cron</code> extension turns Postgres into a powerful job scheduler. You can schedule any SQL query to run every hour, every day, or at any custom interval.</p>

<div class="language-sql highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1">-- Run a cleanup job every Saturday at 3:30 AM</span>
<span class="k">SELECT</span> <span class="n">cron</span><span class="p">.</span><span class="n">schedule</span><span class="p">(</span><span class="s1">'30 3 * * 6'</span><span class="p">,</span> <span class="err">$$</span><span class="k">DELETE</span> <span class="k">FROM</span> <span class="n">events</span> <span class="k">WHERE</span> <span class="n">event_time</span> <span class="o">&lt;</span> <span class="n">now</span><span class="p">()</span> <span class="o">-</span> <span class="n">interval</span> <span class="s1">'1 week'</span><span class="err">$$</span><span class="p">);</span>
</code></pre></div></div>

<h3 id="3-high-speed-caching-with-unlogged-tables">3. High-Speed Caching with <code class="language-plaintext highlighter-rouge">UNLOGGED</code> Tables</h3>

<p>Need a cache like Redis for fast-changing, temporary data? Postgres has you covered. By creating <code class="language-plaintext highlighter-rouge">UNLOGGED</code> tables, you create tables that don’t write to the main transaction log (the Write-Ahead Log). This makes writes significantly faster. Since the data lives primarily in memory and doesn’t survive a crash, it’s perfect for session data, counters, or other throwaway cache information.</p>

<h3 id="4-ai-powered-vector-search-with-pgvector">4. AI-Powered Vector Search with <code class="language-plaintext highlighter-rouge">pgvector</code></h3>

<p>The AI revolution is here, and with it, the need for vector search. Instead of adding another specialized database to your stack, you can use the <code class="language-plaintext highlighter-rouge">pgvector</code> extension. It adds a true vector data type to Postgres, allowing you to store embeddings and perform nearest-neighbor searches—essential for RAG-style lookups, recommendations, and semantic search.</p>

<h3 id="5-advanced-full-text-search-with-tsvector">5. Advanced Full-Text Search with <code class="language-plaintext highlighter-rouge">tsvector</code></h3>

<p>Don’t pay for an external search service. Postgres has powerful, built-in full-text search capabilities using the <code class="language-plaintext highlighter-rouge">tsvector</code> and <code class="language-plaintext highlighter-rouge">tsquery</code> types. You can build your own sophisticated search engine that handles typos, ranks results, and understands language-specific rules, all without leaving your database.</p>

<h3 id="6-instant-graphql-apis-with-pg_graphql">6. Instant GraphQL APIs with <code class="language-plaintext highlighter-rouge">pg_graphql</code></h3>

<p>Want to expose your data via a GraphQL API without writing a dedicated backend server? The <code class="language-plaintext highlighter-rouge">pg_graphql</code> extension by Supabase introspects your database schema and turns it into a fully functional GraphQL API. You write SQL to define your tables and permissions, and you get structured, efficient queries in return.</p>

<h3 id="7-real-time-data-sync-with-electricsql">7. Real-Time Data Sync with ElectricSQL</h3>

<p>One of Firebase’s killer features is real-time data sync. But you can achieve this with Postgres too. Tools like <strong>ElectricSQL</strong> create a real-time, reactive layer on top of your existing Postgres database, keeping your front-end applications fresh without polling or complex WebSocket management.</p>

<h3 id="8-authentication-and-authorization-in-sql">8. Authentication and Authorization in SQL</h3>

<p>You can build a robust and secure authentication system entirely within Postgres.</p>

<ul>
  <li><strong>Hashing:</strong> Use the <code class="language-plaintext highlighter-rouge">pgcrypto</code> extension to securely hash and verify user passwords.</li>
  <li><strong>JWTs:</strong> Sign and verify JSON Web Tokens (JWTs) with extensions like <code class="language-plaintext highlighter-rouge">pgjwt</code>.</li>
  <li><strong>Permissions:</strong> Use Postgres’s powerful <strong>Row-Level Security (RLS)</strong> policies to ensure users can only see and modify their own data. This moves your most critical security logic right next to the data itself.</li>
</ul>

<h2 id="conclusion-its-time-to-simplify">Conclusion: It’s Time to Simplify</h2>

<p>With modern serverless platforms like <strong>Neon</strong> making it easier than ever to host, scale, and manage Postgres, the argument becomes even stronger.</p>

<p>By leveraging the rich ecosystem built on this one reliable database, you can have a cache, a job scheduler, a vector store, a search engine, a GraphQL server, real-time sync, auth, and analytics. All of this is built on a single, battle-tested foundation.</p>

<p>So next time you’re mapping out a new project, before you spin up six microservices and four SaaS tools, just smile and ask: <strong>“Why don’t we try Postgres first?”</strong></p>]]></content><author><name>Rusydy Muhiddin</name></author><category term="tech" /><category term="postgres" /><summary type="html"><![CDATA[Modern web development often feels like a paradox. We have an unprecedented number of powerful tools, frameworks, and services at our disposal, yet building and deploying even a simple application has never felt more complex. The dream of a lean MVP can quickly devolve into a nightmare of juggling a dozen different services, each with its own pricing, configuration, and learning curve.]]></summary></entry><entry><title type="html">Complete Guide to Annual Motorcycle Tax Renewal at Samsat - ENG</title><link href="https://rusydy.github.io/motorcycle-tax-renewal-guide-indonesia.html" rel="alternate" type="text/html" title="Complete Guide to Annual Motorcycle Tax Renewal at Samsat - ENG" /><published>2025-06-30T00:00:00+00:00</published><updated>2025-06-30T00:00:00+00:00</updated><id>https://rusydy.github.io/motorcycle-tax-renewal-guide-indonesia</id><content type="html" xml:base="https://rusydy.github.io/motorcycle-tax-renewal-guide-indonesia.html"><![CDATA[<p>Renewing your motorcycle’s annual tax is a mandatory obligation for every vehicle owner. To ensure the process runs smoothly without back-and-forth trips, it’s essential to prepare everything properly. Here’s a clear and easy-to-follow step-by-step guide based on general procedures at Samsat buildings. As of 2025, this guide still remains relevant, eventhough some procedures are claim to be online, but in reality, many Samsat offices still require in-person visits.</p>

<p>This guide conducted in Jakarta, Indonesia, and the procedures might slightly vary in different regions, but the overall flow should be similar. <strong>Be aware of possible changes in procedures due to updates in regulations or office policies, or corruption/bribery practices that might affect the process.</strong></p>

<hr />

<h3 id="stage-1-document-preparation--form-collection">Stage 1: Document Preparation &amp; Form Collection</h3>

<p>The first step is ensuring all required documents are complete. This is key to preventing any delays in your process.</p>

<p><strong>Required Documents to Bring:</strong></p>

<ul>
  <li><strong>Original ID Card (KTP)</strong> and 1 photocopy.</li>
  <li><strong>Original STNK</strong> (Vehicle Registration Certificate) and 1 photocopy.</li>
  <li><strong>Original BPKB</strong> (Vehicle Ownership Document) and 1 photocopy (for some Samsat offices or specific conditions, BPKB photocopy might be required, so it’s better to prepare it just in case).</li>
  <li><strong>TBPKP (Tax Payment Proof)</strong> or previous year’s tax receipt if available.</li>
</ul>

<p><strong>Process on 2nd Floor (1-Year Tax Validation):</strong></p>

<ol>
  <li><strong>Go to 2nd Floor</strong> of the Samsat Building.</li>
  <li><strong>Get SKP Form</strong> (Tax Assessment Letter). Usually available at the information counter or designated desk.</li>
  <li><strong>Fill out the Form</strong> with data matching your STNK.</li>
  <li><strong>Register at SKP Counter</strong>. Submit the completed form along with photocopies of ID card, STNK, and last year’s TBPKP/Tax Receipt.</li>
</ol>

<hr />

<h3 id="stage-2-payment-at-cashier">Stage 2: Payment at Cashier</h3>

<p>After your documents are verified, the next step is making the payment.</p>

<ol>
  <li><strong>Wait for Your Call</strong>. The officer will call your name according to the data on your STNK.</li>
  <li><strong>Go to Jasa Raharja Counter &amp; Cashier</strong>. After being called, you’ll receive an SKP (Tax Assessment Letter) containing the breakdown of total tax to be paid.</li>
  <li><strong>Make Payment</strong> at the designated cashier counter. Keep the payment receipt safe.</li>
</ol>

<hr />

<h3 id="stage-3-collection-of-validated-stnk">Stage 3: Collection of Validated STNK</h3>

<p>This is the final step in the annual tax renewal process.</p>

<ol>
  <li><strong>Wait for Final Call</strong>. After payment, wait again in front of the STNK delivery counter.</li>
  <li><strong>Collect New STNK</strong>. Your name will be called to collect the validated STNK (usually in the form of a validation stamp on the STNK sheet) along with the new TBPKP or new tax payment proof.</li>
  <li><strong>Done!</strong> Make sure you receive the original STNK and new TBPKP before leaving Samsat.</li>
</ol>

<hr />

<h3 id="important-notes">Important Notes</h3>

<ul>
  <li><strong>Arrive Early</strong>. To avoid long queues, try to come in the morning.</li>
  <li><strong>Bring Your Own Writing Tools</strong>. Bringing your own pen will speed up the form-filling process.</li>
  <li><strong>Double-check All Documents</strong>. Before leaving home, ensure no documents are left behind.</li>
  <li><strong>Procedures May Vary Slightly</strong>. Floor order or counter arrangements might vary at each Samsat office, but the general process flow will be the same.</li>
</ul>

<p>Hope this guide helps you renew your motorcycle’s annual tax more easily and quickly!</p>]]></content><author><name>Rusydy Muhiddin</name></author><category term="life-in-20s" /><category term="jakarta" /><summary type="html"><![CDATA[Renewing your motorcycle’s annual tax is a mandatory obligation for every vehicle owner. To ensure the process runs smoothly without back-and-forth trips, it’s essential to prepare everything properly. Here’s a clear and easy-to-follow step-by-step guide based on general procedures at Samsat buildings. As of 2025, this guide still remains relevant, eventhough some procedures are claim to be online, but in reality, many Samsat offices still require in-person visits.]]></summary></entry><entry><title type="html">Panduan Lengkap Perpanjangan Pajak Motor Tahunan di Samsat - IDN</title><link href="https://rusydy.github.io/motorcycle-tax-in-indonesia.html" rel="alternate" type="text/html" title="Panduan Lengkap Perpanjangan Pajak Motor Tahunan di Samsat - IDN" /><published>2025-06-30T00:00:00+00:00</published><updated>2025-06-30T00:00:00+00:00</updated><id>https://rusydy.github.io/motorcycle-tax-in-indonesia</id><content type="html" xml:base="https://rusydy.github.io/motorcycle-tax-in-indonesia.html"><![CDATA[<p>Memperpanjang pajak tahunan motor adalah kewajiban bagi setiap pemilik kendaraan. Agar prosesnya berjalan lancar tanpa bolak-balik, ada baiknya Anda mempersiapkan semuanya dengan baik. Berikut adalah panduan langkah demi langkah yang jelas dan mudah diikuti berdasarkan prosedur umum di Gedung Samsat. Per tahun 2025, panduan ini masih relevan, meskipun beberapa prosedur diklaim sudah online, namun kenyataannya banyak kantor Samsat yang masih mengharuskan kunjungan langsung.</p>

<p>Panduan ini dilakukan di Jakarta, Indonesia, dan prosedurnya mungkin sedikit berbeda di daerah lain, tetapi alur keseluruhannya seharusnya serupa. <strong>Perhatikan kemungkinan perubahan prosedur akibat pembaruan regulasi atau kebijakan kantor, atau praktik korupsi/suap yang mungkin mempengaruhi proses.</strong></p>

<hr />

<h3 id="tahap-1-persiapan-dokumen--pengambilan-formulir">Tahap 1: Persiapan Dokumen &amp; Pengambilan Formulir</h3>

<p>Langkah pertama adalah memastikan semua dokumen yang dibutuhkan sudah lengkap. Ini adalah kunci agar proses Anda tidak terhambat.</p>

<p><strong>Dokumen yang Wajib Dibawa:</strong></p>

<ul>
  <li><strong>KTP Asli</strong> dan 1 lembar fotokopi.</li>
  <li><strong>STNK Asli</strong> dan 1 lembar fotokopi.</li>
  <li><strong>BPKB Asli</strong> dan 1 lembar fotokopi (untuk beberapa Samsat atau kondisi tertentu, fotokopi BPKB mungkin diperlukan, sebaiknya siapkan untuk berjaga-jaga).</li>
  <li><strong>TBPKP (Tanda Bukti Pelunasan Kewajiban Pembayaran)</strong> atau Struk Pajak tahun sebelumnya jika ada.</li>
</ul>

<p><strong>Proses di Lantai 2 (Pengesahan Pajak 1 Tahun):</strong></p>

<ol>
  <li><strong>Naik ke Lantai 2</strong> Gedung Samsat.</li>
  <li><strong>Ambil Formulir SKP</strong> (Surat Ketetapan Pajak). Biasanya tersedia di loket informasi atau meja khusus.</li>
  <li><strong>Isi Formulir</strong> dengan data yang sesuai pada STNK Anda.</li>
  <li><strong>Daftar di Loket SKP</strong>. Serahkan formulir yang sudah diisi beserta fotokopi KTP, fotokopi STNK, dan TBPKP/Struk Pajak tahun lalu.</li>
</ol>

<hr />

<h3 id="tahap-2-pembayaran-di-kasir">Tahap 2: Pembayaran di Kasir</h3>

<p>Setelah berkas Anda diverifikasi, tahap selanjutnya adalah melakukan pembayaran.</p>

<ol>
  <li><strong>Tunggu Panggilan</strong>. Petugas akan memanggil nama Anda sesuai dengan data di STNK.</li>
  <li><strong>Menuju Loket Jasa Raharja &amp; Kasir</strong>. Setelah dipanggil, Anda akan menerima SKP (Surat Ketetapan Pajak) yang berisi rincian total pajak yang harus dibayarkan.</li>
  <li><strong>Lakukan Pembayaran</strong> di loket kasir yang ditunjuk. Simpan baik-baik bukti pembayarannya.</li>
</ol>

<hr />

<h3 id="tahap-3-pengambilan-stnk-yang-telah-disahkan">Tahap 3: Pengambilan STNK yang Telah Disahkan</h3>

<p>Ini adalah langkah terakhir dalam proses perpanjangan pajak tahunan.</p>

<ol>
  <li><strong>Tunggu Panggilan Akhir</strong>. Setelah membayar, tunggu kembali di depan loket penyerahan STNK.</li>
  <li><strong>Ambil STNK Baru</strong>. Nama Anda akan dipanggil untuk mengambil STNK yang telah disahkan (biasanya berupa stempel pengesahan pada lembar STNK) beserta TBPKP atau bukti lunas pajak yang baru.</li>
  <li><strong>Selesai!</strong> Pastikan Anda menerima STNK asli dan TBPKP baru sebelum meninggalkan Samsat.</li>
</ol>

<hr />

<h3 id="penting-untuk-diperhatikan">Penting untuk Diperhatikan</h3>

<ul>
  <li><strong>Datang Lebih Awal</strong>. Untuk menghindari antrean panjang, usahakan datang di pagi hari.</li>
  <li><strong>Bawa Alat Tulis Sendiri</strong>. Membawa pulpen sendiri akan mempercepat proses pengisian formulir.</li>
  <li><strong>Periksa Kembali Semua Dokumen</strong>. Sebelum berangkat, pastikan tidak ada dokumen yang tertinggal.</li>
  <li><strong>Prosedur Bisa Sedikit Berbeda</strong>. Urutan lantai atau loket mungkin bervariasi di setiap kantor Samsat, namun alur prosesnya secara umum akan sama.</li>
</ul>

<p>Semoga panduan ini membantu Anda dalam memperpanjang pajak motor tahunan dengan lebih mudah dan cepat!</p>]]></content><author><name>Rusydy Muhiddin</name></author><category term="life-in-20s" /><category term="jakarta" /><summary type="html"><![CDATA[Memperpanjang pajak tahunan motor adalah kewajiban bagi setiap pemilik kendaraan. Agar prosesnya berjalan lancar tanpa bolak-balik, ada baiknya Anda mempersiapkan semuanya dengan baik. Berikut adalah panduan langkah demi langkah yang jelas dan mudah diikuti berdasarkan prosedur umum di Gedung Samsat. Per tahun 2025, panduan ini masih relevan, meskipun beberapa prosedur diklaim sudah online, namun kenyataannya banyak kantor Samsat yang masih mengharuskan kunjungan langsung.]]></summary></entry><entry><title type="html">A Lesson from Buddha on Suffering, Mistakes, and Growth</title><link href="https://rusydy.github.io/a-lesson-from-buddha-on-suffering-mistakes-and-growth.html" rel="alternate" type="text/html" title="A Lesson from Buddha on Suffering, Mistakes, and Growth" /><published>2024-12-26T00:00:00+00:00</published><updated>2024-12-26T00:00:00+00:00</updated><id>https://rusydy.github.io/a-lesson-from-buddha-on-suffering-mistakes-and-growth</id><content type="html" xml:base="https://rusydy.github.io/a-lesson-from-buddha-on-suffering-mistakes-and-growth.html"><![CDATA[<p>I mess up at work. I often fail to understand the requirements, and I’m too slow to solve problems. My mistakes pile up, and it feels like everyone’s frustration with me grows heavier each day. People shout at me, and I’m left feeling stupid and inadequate. I’m deeply sorry for being this way—for failing so often and for falling short of the expectations placed on me.</p>

<p>But as I sit with these feelings, overwhelmed and lost, I wonder: <em>Is this all there is to me? Am I only my failures?</em></p>

<p>Buddha’s teachings offer a different perspective. They remind me that while suffering is a part of life, it is not the entirety of life. Mistakes, like all things, are impermanent. They do not define us but are stepping stones for growth if we allow them to be.</p>

<h2 id="embracing-suffering-the-reality-of-dukkha">Embracing Suffering: The Reality of Dukkha</h2>

<p>Buddha teaches us that life is inherently full of challenges. Mistakes at work, misunderstandings, and feelings of inadequacy are all part of the human experience. They’re not proof of stupidity or failure—they’re reminders of our shared humanity.</p>

<blockquote>
  <p>“Pain is inevitable, but suffering is optional.”</p>
</blockquote>

<p>Instead of resisting these moments, I’m trying to learn from them. Each frustration from my colleagues, each mistake I make, carries a lesson. It might be about clarity, communication, or patience—both with myself and with others.</p>

<h2 id="this-too-shall-pass-the-wisdom-of-anicca">This Too Shall Pass: The Wisdom of Anicca</h2>

<p>The heaviness I feel isn’t permanent. Just as joy fades, so too does sorrow. My current struggles at work will not last forever. There will be a time when the shouting stops, the mistakes diminish, and I find my footing.</p>

<blockquote>
  <p>“No matter how hard the past, you can always begin again.”</p>
</blockquote>

<p>When I hold onto this truth, it gives me strength to keep going. Each day is a new chance to improve, to understand, and to be understood.</p>

<h2 id="the-path-forward-kindness-and-effort">The Path Forward: Kindness and Effort</h2>

<p>Buddha also taught the importance of kindness—not just for others, but for ourselves. I’ve been harsh with myself, calling myself “stupid” and “slow.” But if I can treat others with patience, why not extend the same kindness to myself?</p>

<blockquote>
  <p>“You yourself, as much as anybody in the entire universe, deserve your love and affection.”</p>
</blockquote>

<p>At work, I’m trying to approach tasks differently. I ask more questions to clarify requirements, break problems into smaller parts, and seek feedback early. Progress feels slow, but each effort counts.</p>

<h2 id="the-takeaway">The Takeaway</h2>

<p>Buddha’s teachings remind me that I am not my mistakes. My worth isn’t tied to my job performance or how others perceive me. What matters is my willingness to learn, to improve, and to be gentle with myself in the process.</p>

<p>If you’re struggling, like me, remember: life is full of challenges, but you don’t have to face them alone. Mistakes are not the end of your story—they’re just the beginning of a new chapter.</p>]]></content><author><name>Rusydy Muhiddin</name></author><category term="human-behaviour" /><category term="buddhism" /><summary type="html"><![CDATA[I mess up at work. I often fail to understand the requirements, and I’m too slow to solve problems. My mistakes pile up, and it feels like everyone’s frustration with me grows heavier each day. People shout at me, and I’m left feeling stupid and inadequate. I’m deeply sorry for being this way—for failing so often and for falling short of the expectations placed on me.]]></summary></entry><entry><title type="html">IELTS Writing Task 2: Public vs. Private Advice</title><link href="https://rusydy.github.io/ielts-writing-task-2-public-vs-private-advice.html" rel="alternate" type="text/html" title="IELTS Writing Task 2: Public vs. Private Advice" /><published>2024-12-26T00:00:00+00:00</published><updated>2024-12-26T00:00:00+00:00</updated><id>https://rusydy.github.io/ielts-writing-task-2-public-vs-private-advice</id><content type="html" xml:base="https://rusydy.github.io/ielts-writing-task-2-public-vs-private-advice.html"><![CDATA[<p><img src="/assets/images/ielts-writing-task-2-public-vs-private-advice-1.jpg" alt="IELTS Writing Task 2: Public vs. Private Advice" /></p>

<p><strong>Some people believe that giving advice publicly is an effective way to address mistakes, while others argue that such an approach is disrespectful and counterproductive. Discuss both views and give your own opinion.</strong></p>

<p>Publicly giving advice is common in workplaces and educational settings. While some argue it encourages group learning and transparency, others believe it can cause embarrassment and harm relationships. In my view, offering advice privately is a more effective and respectful approach.</p>

<p>Advocates of public advice claim it promotes accountability and saves time. For instance, addressing an individual’s error in a team meeting can clarify misunderstandings for everyone and prevent similar mistakes in the future. Additionally, it fosters a culture of shared learning, where individuals benefit from others’ experiences. For example, a manager discussing a missed deadline openly may help the entire team understand the importance of time management.</p>

<p>However, public advice often leads to embarrassment, defensiveness, or even resentment. Being corrected in front of others can make individuals feel humiliated, which may undermine their confidence and motivation. For example, an employee criticized during a meeting might feel less willing to share ideas, damaging team dynamics. Furthermore, public feedback can strain relationships, as it might be perceived as overly critical or disrespectful.</p>

<p>In contrast, private advice respects the individual’s dignity and allows for constructive conversations. For instance, a teacher offering feedback one-on-one can personalize their advice, which often leads to better results. Similarly, in professional settings, private discussions enable employees to reflect on feedback without external pressure, strengthening trust and collaboration.</p>

<p>In conclusion, while public advice can be useful in promoting group learning, its drawbacks, such as embarrassment and strained relationships, often outweigh the benefits. Providing advice privately is a more respectful and effective approach, fostering personal growth and preserving positive relationships.</p>]]></content><author><name>Rusydy Muhiddin</name></author><category term="ielts" /><category term="writing" /><summary type="html"><![CDATA[]]></summary></entry><entry><title type="html">Setup PHP Version Management: shivammathur/homebrew-php</title><link href="https://rusydy.github.io/setup-php-version-management-shivammathur.html" rel="alternate" type="text/html" title="Setup PHP Version Management: shivammathur/homebrew-php" /><published>2024-12-24T00:00:00+00:00</published><updated>2024-12-24T00:00:00+00:00</updated><id>https://rusydy.github.io/setup-php-version-management-shivammathur</id><content type="html" xml:base="https://rusydy.github.io/setup-php-version-management-shivammathur.html"><![CDATA[<p>shivammathur/homebrew-php is a repository that provides PHP version management for macOS. It allows you to install multiple PHP versions and switch between them easily.</p>

<h2 id="installation">Installation</h2>

<p>In this topic, we will install shivammathur/homebrew-php on macOS.</p>

<h3 id="install-shivammathurhomebrew-php">Install shivammathur/homebrew-php</h3>

<blockquote>
  <p>[!NOTE]
Before installing shivammathur/homebrew-php, make sure you have installed Homebrew.
If you haven’t installed Homebrew yet, you can follow the instructions <a href="https://brew.sh/">here</a>.</p>
</blockquote>

<p>Add the shivammathur/homebrew-php tap:</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>brew tap shivammathur/php
</code></pre></div></div>

<h3 id="install-php">Install PHP</h3>

<p>Install the desired PHP version using Homebrew:</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c"># install PHP 8.4 for example</span>
brew <span class="nb">install </span>shivammathur/php/php@8.4

<span class="c"># after installation, you have to link the PHP version</span>
brew <span class="nb">link</span> <span class="nt">--overwrite</span> <span class="nt">--force</span> shivammathur/php/php@8.4

<span class="c"># check the PHP version</span>
php <span class="nt">-v</span> <span class="c"># should show PHP 8.4</span>
</code></pre></div></div>

<h3 id="switch-php-version">Switch PHP version</h3>

<p>To switch between PHP versions, you can use the <code class="language-plaintext highlighter-rouge">brew link</code> command:</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c"># install PHP 8.3 for example, if you haven't installed it yet</span>
brew <span class="nb">install </span>shivammathur/php/php@8.3

<span class="c"># switch to PHP 8.3</span>
brew <span class="nb">link</span> <span class="nt">--overwrite</span> <span class="nt">--force</span> shivammathur/php/php@8.3

<span class="c"># check the PHP version</span>
php <span class="nt">-v</span> <span class="c"># should show PHP 8.3</span>
</code></pre></div></div>

<h3 id="upgrade-php-version">Upgrade PHP version</h3>

<p>To upgrade to a newer PHP version, you can use the <code class="language-plaintext highlighter-rouge">brew upgrade</code> command:</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c"># upgrade to PHP 8.5</span>
brew upgrade shivammathur/php/php@8.5

<span class="c"># after upgrade, you have to link the PHP version</span>
brew <span class="nb">link</span> <span class="nt">--overwrite</span> <span class="nt">--force</span> shivammathur/php/php@8.5

<span class="c"># check the PHP version</span>
php <span class="nt">-v</span> <span class="c"># should show PHP 8.5</span>
</code></pre></div></div>

<h2 id="references">References</h2>

<ul>
  <li><a href="https://github.com/shivammathur/homebrew-php">shivammathur/homebrew-php</a>, accessed on 24th December 2024.</li>
</ul>]]></content><author><name>Rusydy Muhiddin</name></author><category term="tech" /><category term="python" /><summary type="html"><![CDATA[shivammathur/homebrew-php is a repository that provides PHP version management for macOS. It allows you to install multiple PHP versions and switch between them easily.]]></summary></entry><entry><title type="html">Setup Python Version Management: pyenv</title><link href="https://rusydy.github.io/setup-python-version-management-pyenv.html" rel="alternate" type="text/html" title="Setup Python Version Management: pyenv" /><published>2024-12-24T00:00:00+00:00</published><updated>2024-12-24T00:00:00+00:00</updated><id>https://rusydy.github.io/setup-python-version-management-pyenv</id><content type="html" xml:base="https://rusydy.github.io/setup-python-version-management-pyenv.html"><![CDATA[<p>Pyenv lets you easily switch between multiple versions of Python. It’s simple, unobtrusive, and follows the UNIX tradition of single-purpose tools that do one thing well.</p>

<h2 id="installation">Installation</h2>

<p>In this topic, we will install pyenv on macOS.</p>

<h3 id="install-pyenv">Install pyenv</h3>

<blockquote>
  <p>[!NOTE]
Before installing pyenv, make sure you have installed Homebrew.
If you haven’t installed Homebrew yet, you can follow the instructions <a href="https://brew.sh/">here</a>.</p>
</blockquote>

<p>Install pyenv using Homebrew:</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>brew update
brew <span class="nb">install </span>pyenv
</code></pre></div></div>

<h3 id="add-pyenv-to-zsh-profile">Add pyenv to zsh profile</h3>

<p>Add the following lines to your <code class="language-plaintext highlighter-rouge">~/.zshrc</code> file:</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">echo</span> <span class="s1">'export PYENV_ROOT="$HOME/.pyenv"'</span> <span class="o">&gt;&gt;</span> ~/.zshrc
<span class="nb">echo</span> <span class="s1">'[[ -d $PYENV_ROOT/bin ]] &amp;&amp; export PATH="$PYENV_ROOT/bin:$PATH"'</span> <span class="o">&gt;&gt;</span> ~/.zshrc
<span class="nb">echo</span> <span class="s1">'eval "$(pyenv init - zsh)"'</span> <span class="o">&gt;&gt;</span> ~/.zshrc
</code></pre></div></div>

<h2 id="usage">Usage</h2>

<h3 id="list-available-python-versions">List available Python versions</h3>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>pyenv <span class="nb">install</span> <span class="nt">--list</span>
</code></pre></div></div>

<h3 id="install-python">Install Python</h3>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>pyenv <span class="nb">install </span>3.12.8
</code></pre></div></div>

<h3 id="set-python-version-globally">Set Python version globally</h3>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>pyenv global 3.12.8
</code></pre></div></div>

<h3 id="set-python-version-locally">Set Python version locally</h3>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>pyenv <span class="nb">local </span>3.12.8
</code></pre></div></div>

<h3 id="uninstall-python">Uninstall Python</h3>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>pyenv uninstall 3.12.8
</code></pre></div></div>

<h3 id="list-installed-python-versions">List installed Python versions</h3>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>pyenv versions
</code></pre></div></div>

<h3 id="update-pyenv">Update pyenv</h3>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>brew upgrade pyenv
</code></pre></div></div>

<h2 id="pip">PIP</h2>

<h3 id="install-pip">Install PIP</h3>

<p>To install PIP, you do that via the <code class="language-plaintext highlighter-rouge">get-pip.py</code> script. The script automatically downloads and installs the current pip package for Python.</p>

<blockquote>
  <p>[!IMPORTANT]
Install pip via <code class="language-plaintext highlighter-rouge">get-pip.py</code> only with Python3 or later.
This method doesn’t work for earlier versions.</p>
</blockquote>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>curl https://bootstrap.pypa.io/get-pip.py <span class="nt">-o</span> get-pip.py
python get-pip.py
</code></pre></div></div>

<p>To verify the installation, run the following command:</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>pip <span class="nt">--version</span>
</code></pre></div></div>

<h2 id="references">References</h2>

<ul>
  <li><a href="https://realpython.com/intro-to-pyenv/#installing-pyenv">pyenv/pyenv: Simple Python version management</a>, accessed on 24th December 2024.</li>
  <li><a href="https://phoenixnap.com/kb/install-pip-mac">How to install pip on macOS</a>, accessed on 24th December 2024.</li>
</ul>]]></content><author><name>Rusydy Muhiddin</name></author><category term="tech" /><category term="python" /><summary type="html"><![CDATA[Pyenv lets you easily switch between multiple versions of Python. It’s simple, unobtrusive, and follows the UNIX tradition of single-purpose tools that do one thing well.]]></summary></entry><entry><title type="html">Handling Intensive Conversations in the Workplace: Subtle Influence and Conflict Resolution</title><link href="https://rusydy.github.io/workplace-conflict-mediation-strategy.html" rel="alternate" type="text/html" title="Handling Intensive Conversations in the Workplace: Subtle Influence and Conflict Resolution" /><published>2024-12-15T00:00:00+00:00</published><updated>2024-12-15T00:00:00+00:00</updated><id>https://rusydy.github.io/workplace-conflict-mediation-strategy</id><content type="html" xml:base="https://rusydy.github.io/workplace-conflict-mediation-strategy.html"><![CDATA[<h2 id="scenario-strategic-conflict-management">Scenario: Strategic Conflict Management</h2>

<p>Imagine you work as a software developer. Recently, during a team meeting, a disagreement arises between you and a coworker about the approach to implementing a critical feature. The conversation becomes tense, with raised voices and interruptions.</p>

<p>Sensing the situation, you pause the discussion and call for a separate meeting, but instead of framing it as a conflict, you suggest involving your manager to “align perspectives.” During this discussion, you subtly emphasize your contributions and your openness to compromise, positioning yourself as a team player while steering the conversation toward an outcome that aligns with your ideas. Your manager’s presence helps diffuse tension, but you also ensure that your voice is heard and valued.</p>

<h2 id="explanation-what-happened-here">Explanation: What Happened Here?</h2>

<h3 id="influence-through-structured-communication">Influence Through Structured Communication</h3>

<p>In this scenario, you adeptly used the opportunity to guide the conversation toward a favourable resolution while maintaining an image of collaboration and openness. This approach involves subtle tactics to shape perceptions and outcomes without appearing overbearing. By positioning the discussion as a mutual alignment effort, you avoid confrontation while subtly steering the narrative.</p>

<h3 id="the-psychology-behind-your-actions">The Psychology Behind Your Actions</h3>

<p>Your actions reflect key psychological strategies:</p>

<ol>
  <li><strong>Creating the Appearance of Neutrality:</strong>
    <ul>
      <li>By framing the manager’s involvement as a way to ensure fairness, you appear objective and focused on team success, which earns trust and deflects any perception of self-serving motives.</li>
    </ul>
  </li>
  <li><strong>Positioning Yourself Strategically:</strong>
    <ul>
      <li>Highlighting your willingness to compromise while emphasizing your contributions subtly strengthens your standing. Others see you as cooperative and solution-focused.</li>
    </ul>
  </li>
  <li><strong>Managing Perceptions:</strong>
    <ul>
      <li>Presenting the situation as a collective effort rather than a conflict helps shift the focus from disagreement to problem-solving, casting you in a favourable light.</li>
    </ul>
  </li>
</ol>

<h3 id="when-is-this-approach-appropriate">When Is This Approach Appropriate?</h3>

<p>Strategic influence works best under these conditions:</p>

<ol>
  <li><strong>High Stakes:</strong> When the outcome significantly affects your role or project.</li>
  <li><strong>Team Dynamics:</strong> When you need to maintain relationships while advocating for your perspective.</li>
  <li><strong>Power Balance:</strong> When navigating hierarchical structures or differing levels of influence within the team.</li>
</ol>

<p>However, overuse or misuse of this approach can risk appearing manipulative. It’s essential to pair strategy with genuine collaboration to maintain trust.</p>

<h2 id="strategies-to-subtly-influence-workplace-conversations">Strategies to Subtly Influence Workplace Conversations</h2>

<ol>
  <li><strong>Lead with Questions:</strong>
    <ul>
      <li>Ask open-ended questions that guide the discussion toward your desired outcome (e.g., “How do you see this approach affecting our timeline?”).</li>
    </ul>
  </li>
  <li><strong>Control the Narrative:</strong>
    <ul>
      <li>Frame the conversation in a way that emphasizes shared goals and minimizes discord (e.g., “Let’s find the best way to deliver value to the client.”).</li>
    </ul>
  </li>
  <li><strong>Leverage Authority Wisely:</strong>
    <ul>
      <li>Involve your manager not as a decision-maker but as a facilitator, ensuring your ideas are presented favourably without appearing overly assertive.</li>
    </ul>
  </li>
  <li><strong>Demonstrate Empathy:</strong>
    <ul>
      <li>Acknowledge your coworker’s points to disarm potential resistance, then build on them to support your perspective. For example, “I see your concern about the timeline, and I believe we can address it by…”</li>
    </ul>
  </li>
  <li><strong>Be Generous with Credit:</strong>
    <ul>
      <li>Recognize the contributions of others while subtly tying the success of the project to your involvement. This enhances your standing without creating conflict. For example, “I appreciate your insights, and I believe by combining our approaches, we can achieve a stronger outcome.”</li>
    </ul>
  </li>
</ol>

<h2 id="balancing-strategy-and-collaboration">Balancing Strategy and Collaboration</h2>

<p>Subtle influence is most effective when combined with genuine efforts to collaborate. Here’s how to balance:</p>

<ul>
  <li><strong>Focus on Mutual Gains:</strong> Frame your perspective as benefiting the team or project.</li>
  <li><strong>Cultivate Relationships:</strong> Build rapport with coworkers outside high-stakes discussions to create goodwill.</li>
  <li><strong>Be Transparent When Necessary:</strong> Strategic actions are most effective when grounded in integrity. Ensure your motives align with team goals.</li>
</ul>

<hr />

<h2 id="conclusion">Conclusion</h2>

<p>Incorporating subtle influence into workplace interactions can help navigate intensive conversations and achieve desired outcomes while maintaining trust and collaboration. By mastering these strategies, you can position yourself as a leader and problem-solver, fostering stronger relationships and professional growth.</p>]]></content><author><name>Rusydy Muhiddin</name></author><category term="human-behaviour" /><summary type="html"><![CDATA[Scenario: Strategic Conflict Management]]></summary></entry></feed>