<?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[David Wampamba]]></title><description><![CDATA[David is a passionate teens and youths trainer, STEAM evangelist, employment advocate, entrepreneur and Acumen Fellow who is seeking opportunities to be a coding instructor in digital schools.]]></description><link>https://blog.davidofug.com</link><generator>RSS for Node</generator><lastBuildDate>Sat, 12 Sep 2026 01:43:01 GMT</lastBuildDate><atom:link href="https://blog.davidofug.com/rss.xml" rel="self" type="application/rss+xml"/><language><![CDATA[en]]></language><ttl>60</ttl><item><title><![CDATA[Standards of a properly designed website and scoring Rubric.]]></title><description><![CDATA[Download
A properly designed website should be usable, accessible, fast, and consistent. At a minimum, it should help visitors find what they need quickly, work well on mobile, and follow web standard]]></description><link>https://blog.davidofug.com/standards-of-a-properly-designed-website-and-scoring-rubric</link><guid isPermaLink="true">https://blog.davidofug.com/standards-of-a-properly-designed-website-and-scoring-rubric</guid><dc:creator><![CDATA[David Wampamba]]></dc:creator><pubDate>Wed, 05 Aug 2026 15:54:45 GMT</pubDate><content:encoded><![CDATA[<p><a href="https://docs.google.com/document/d/1lk6ngfzFXkhYhaGIkQp_5jVFGUVigxKQ/edit?usp=drive_link&amp;ouid=110480693423187024039&amp;rtpof=true&amp;sd=true">Download</a></p>
<p>A properly designed website should be <strong>usable, accessible, fast, and consistent</strong>. At a minimum, it should help visitors find what they need quickly, work well on mobile, and follow web standards for HTML, CSS, and JavaScript, along with accessibility guidelines like WCAG.</p>
<p><strong>Core standards</strong></p>
<p><strong>· Valid, semantic code:</strong> clean HTML, CSS, and JavaScript that browsers can interpret reliably.</p>
<p><strong>· Accessibility:</strong> keyboard navigation, alt text, good color contrast, proper headings, and form labels.</p>
<p><strong>· Responsive design:</strong> layouts that adapt well to phones, tablets, and desktops.</p>
<p><strong>· Performance:</strong> fast loading pages and optimized assets.</p>
<p><strong>· Clear structure:</strong> consistent navigation, visual hierarchy, and obvious calls to action.</p>
<p><strong>Good UX signs</strong></p>
<p>· Users can understand the site quickly without much explanation.</p>
<p>· Important information is easy to find.</p>
<p>· The design is visually consistent across pages.</p>
<p>· Content is readable, concise, and relevant.</p>
<p>· Contact or next-step actions are easy to locate.</p>
<p><strong>Practical checklist</strong></p>
<p>· Use one clear primary purpose per page.</p>
<p>· Keep navigation simple and predictable.</p>
<p>· Make buttons and links obvious.</p>
<p>· Test on mobile and multiple browsers.</p>
<p>· Check accessibility with tools like Axe or WAVE.</p>
<p>· Include SEO basics like page titles, meta descriptions, and descriptive URLs.</p>
<p>Use this rubric to score a website from 1 to 5 in each category, where 1 = poor and 5 = excellent. A strong website should score at least 4 in the most important categories: usability, accessibility, mobile responsiveness, and performance.</p>
<table style="min-width:100px"><colgroup><col style="min-width:25px"></col><col style="min-width:25px"></col><col style="min-width:25px"></col><col style="min-width:25px"></col></colgroup><tbody><tr><td><p><strong>Category</strong></p></td><td><p><strong>1</strong></p></td><td><p><strong>3</strong></p></td><td><p><strong>5</strong></p></td></tr><tr><td><p><strong>Purpose and clarity</strong></p></td><td><p>Unclear purpose, confusing messaging</p></td><td><p>Main purpose is somewhat clear</p></td><td><p>Purpose is immediately obvious, messaging is focused</p></td></tr><tr><td><p><strong>Navigation</strong></p></td><td><p>Hard to find pages, inconsistent menu</p></td><td><p>Usable but not always intuitive</p></td><td><p>Simple, predictable, and easy to scan</p></td></tr><tr><td><p><strong>Visual design</strong></p></td><td><p>Cluttered, inconsistent, or outdated</p></td><td><p>Acceptable but uneven</p></td><td><p>Clean, balanced, consistent, and professional</p></td></tr><tr><td><p><strong>Responsiveness</strong></p></td><td><p>Breaks or looks bad on mobile</p></td><td><p>Works on most screens with minor issues</p></td><td><p>Adapts smoothly to all common screen sizes</p></td></tr><tr><td><p><strong>Accessibility</strong></p></td><td><p>Missing basics like alt text or labels</p></td><td><p>Partial accessibility support</p></td><td><p>Keyboard-friendly, well-labeled, good contrast, semantic structure</p></td></tr><tr><td><p><strong>Performance</strong></p></td><td><p>Slow loading, heavy pages</p></td><td><p>Moderately fast but not optimized</p></td><td><p>Fast, optimized, and efficient</p></td></tr><tr><td><p><strong>Content quality</strong></p></td><td><p>Hard to read or too much filler</p></td><td><p>Useful but not polished</p></td><td><p>Clear, concise, relevant, and easy to scan</p></td></tr><tr><td><p><strong>Calls to action</strong></p></td><td><p>No clear next step</p></td><td><p>CTAs exist but are weak</p></td><td><p>CTAs are obvious and well placed</p></td></tr><tr><td><p><strong>Trust and credibility</strong></p></td><td><p>Looks untrustworthy or incomplete</p></td><td><p>Some trust signals present</p></td><td><p>Strong credibility cues: contact info, policies, proof, consistency</p></td></tr><tr><td><p><strong>SEO basics</strong></p></td><td><p>Missing titles/descriptions or poor structure</p></td><td><p>Some SEO basics in place</p></td><td><p>Good page titles, meta descriptions, headings, and clean URLs</p></td></tr></tbody></table>

<p><strong>Scoring guide</strong></p>
<p>· 45–50: Excellent, production-ready.</p>
<p>· 35–44: Good, but needs refinement.</p>
<p>· 25–34: Average, with important issues to fix.</p>
<p>· Below 25: Weak, major redesign needed.</p>
<p><a href="https://docs.google.com/document/d/1lk6ngfzFXkhYhaGIkQp_5jVFGUVigxKQ/edit?usp=drive_link&amp;ouid=110480693423187024039&amp;rtpof=true&amp;sd=true">Download</a></p>
]]></content:encoded></item><item><title><![CDATA[Navigating the Startup Symphony: Understanding Key Roles in Building a Thriving Company]]></title><description><![CDATA[Dedicated to Daniel Kisseka – the visionary Founder & CEO of Veridian Bioharvest and newly appointed IEDF Africa Head of Agriculture. Your journey from transforming uncultivated lands into thriving farms to championing smallholder empowerment across ...]]></description><link>https://blog.davidofug.com/navigating-the-startup-symphony-understanding-key-roles-in-building-a-thriving-company</link><guid isPermaLink="true">https://blog.davidofug.com/navigating-the-startup-symphony-understanding-key-roles-in-building-a-thriving-company</guid><category><![CDATA[Governance]]></category><category><![CDATA[Culture]]></category><category><![CDATA[leadership]]></category><category><![CDATA[agriculture]]></category><category><![CDATA[climate change]]></category><dc:creator><![CDATA[David Wampamba]]></dc:creator><pubDate>Thu, 04 Dec 2025 11:01:32 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1764845835873/abbf3b41-d788-4ca9-b15b-dbd1f0db65f6.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><em>Dedicated to Daniel Kisseka – the visionary Founder &amp; CEO of Veridian Bioharvest and newly appointed IEDF Africa Head of Agriculture. Your journey from transforming uncultivated lands into thriving farms to championing smallholder empowerment across the continent inspires us all. May these insights fuel your mission to revolutionize African agriculture, one seed at a time.</em></p>
<p>In the bustling world of startups, where ideas sprout like seedlings in fertile soil, success isn't just about the product or the passion—it's about the people who nurture the vision into reality. As an entrepreneur, I've often marveled at how a well-orchestrated team can turn a fledgling idea into a global force. Drawing from the highs and lows of building ventures in dynamic sectors like agrotech, let's demystify the core roles that keep the engine running: advisors, shareholders, directors, and co-founders. Each plays a unique note in the symphony of growth, and understanding their harmony—and hierarchy—can be the difference between wilting under pressure and blooming into abundance.</p>
<h2 id="heading-the-guiding-lights-advisors">The Guiding Lights: Advisors</h2>
<p>Picture advisors as the seasoned farmers who've weathered droughts and floods, sharing their wisdom without tilling your fields themselves. These are the mentors who bring specialized expertise to the table—be it market strategy for scaling sustainable crops or regulatory know-how for eco-friendly certifications. Advisors offer strategic guidance and informal mentorship, often in exchange for a sliver of equity or consulting fees, but they steer clear of the daily grind.</p>
<p>In Daniel Kisseka's world at Veridian Bioharvest, an advisor might be a soil scientist or a supply chain guru from the Acumen network, whispering insights on resilient seed varieties during quarterly check-ins. Their role? To illuminate blind spots, validate pivots, and connect you to untapped resources. Without formal authority, their influence blooms through trust and timely advice, making them invaluable for bootstrapped innovators eyeing exponential growth.</p>
<h2 id="heading-the-roots-of-ownership-shareholders">The Roots of Ownership: Shareholders</h2>
<p>At the heart of any company lie the shareholders—the true owners who plant their stakes and reap the harvests. These individuals or entities hold equity, granting them rights to dividends, voting power on pivotal decisions like mergers or expansions, and a slice of the pie if the venture sells. They're the silent (or vocal) investors betting on your vision, from angel backers funding your first greenhouse to venture capitalists scaling your operations continent-wide.</p>
<p>For a founder like Daniel, shareholders in Veridian might include impact investors passionate about food security in Africa. Their involvement ensures accountability; after all, they're not just cheering from the sidelines—they own a piece of the soil. Yet, their power is collective, exercised through votes at annual meetings, reminding us that a startup's foundation is as strong as the belief it inspires in others.</p>
<h2 id="heading-the-stewards-of-strategy-directors">The Stewards of Strategy: Directors</h2>
<p>Enter the board of directors: the vigilant overseers who prune the branches to ensure healthy growth. Comprising a mix of insiders (like co-founders) and independents, directors form the governance backbone. They approve high-level strategies, appoint and evaluate executives, monitor financial health, and uphold legal compliance—all while fiduciary duty binds them to act in the shareholders' best interests.</p>
<p>In an agrotech startup, directors might scrutinize expansion plans into new African markets, weighing risks like climate variability against opportunities in smallholder cooperatives. Their meetings are where bold dreams meet pragmatic reality checks, fostering resilience. For leaders like Daniel, a strong board isn't a hurdle—it's a compass, guiding Veridian through regulatory mazes and ethical dilemmas toward sustainable impact.</p>
<h2 id="heading-the-original-dreamers-co-founders">The Original Dreamers: Co-Founders</h2>
<p>No startup story is complete without the co-founders—the passionate pioneers who dig the first furrow. These are the collaborators who co-create the vision, from ideation sketches over late-night coffee to prototyping the first bioharvested yield. Holding substantial equity, they often step into executive shoes, driving operations, fundraising, and culture in the chaotic early days.</p>
<p>Daniel Kisseka embodies this spirit as Veridian's CEO, blending his Acumen Fellowship insights with on-the-ground grit to empower farmers. Co-founders are the heartbeat, wearing multiple hats and sharing the scars of iteration. Their bond? A shared North Star, turning "what if" into "watch this." But beware: clear roles from day one prevent the weeds of conflict from choking progress.</p>
<h2 id="heading-the-hierarchy-who-calls-the-shots">The Hierarchy: Who Calls the Shots?</h2>
<p>So, how does this cast harmonize in the grand structure? At the apex sit the <strong>shareholders</strong>, the ultimate owners who elect the <strong>board of directors</strong> to safeguard their interests. The board, in turn, appoints and oversees the <strong>executive team</strong>—often led by co-founders—who handle day-to-day execution. <strong>Advisors</strong> float above the fray, offering counsel directly to executives or the board without wielding formal power.</p>
<p>Visualize it like a thriving farm ecosystem:</p>
<div class="hn-table">
<table>
<thead>
<tr>
<td>Level</td><td>Role</td><td>Authority</td><td>Focus</td></tr>
</thead>
<tbody>
<tr>
<td><strong>Top: Owners</strong></td><td>Shareholders</td><td>Elect board; vote on major decisions</td><td>Long-term value &amp; returns</td></tr>
<tr>
<td><strong>Governance</strong></td><td>Directors (Board)</td><td>Appoint executives; approve strategy</td><td>Oversight &amp; compliance</td></tr>
<tr>
<td><strong>Execution</strong></td><td>Co-Founders/Executives</td><td>Daily operations &amp; innovation</td><td>Growth &amp; delivery</td></tr>
<tr>
<td><strong>Support</strong></td><td>Advisors</td><td>Informal guidance</td><td>Expertise &amp; networks</td></tr>
</tbody>
</table>
</div><p>This pyramid isn't rigid—co-founders might sit on the board, and advisors could evolve into shareholders. But respecting the flow prevents chaos, ensuring decisions cascade from ownership vision to operational vigor.</p>
<h2 id="heading-final-thoughts-planting-seeds-for-tomorrow">Final Thoughts: Planting Seeds for Tomorrow</h2>
<p>Building a company is akin to regenerative agriculture: it demands patience, diverse inputs, and a keen eye for balance. Whether you're Daniel Kisseka scaling Veridian's impact or just sowing your first startup seed, embracing these roles unlocks collective genius. As Africa's agrotech renaissance unfolds—fueled by leaders tackling food security and climate resilience—remember: the best harvests come from teams that till, trust, and thrive together.</p>
<p>What's your take? Have you navigated these roles in your venture? Drop a comment below—I'd love to hear your stories. And Daniel, here's to you: may your fields forever yield abundance.</p>
]]></content:encoded></item><item><title><![CDATA[The Silent Struggles of Co-Founders in African Startups – And How to Overcome Them]]></title><description><![CDATA[Starting a business in Africa is often painted as a brave and exciting journey. And it truly is. But behind the energy and ambition, many ventures quietly face challenges because of the dynamics between founders and co-founders.
Before we dive in, le...]]></description><link>https://blog.davidofug.com/the-silent-struggles-of-co-founders-in-african-startups-and-how-to-overcome-them</link><guid isPermaLink="true">https://blog.davidofug.com/the-silent-struggles-of-co-founders-in-african-startups-and-how-to-overcome-them</guid><category><![CDATA[HealthyFounders]]></category><category><![CDATA[leadership]]></category><category><![CDATA[Collaboration]]></category><category><![CDATA[growth mindset,]]></category><category><![CDATA[teamwork]]></category><category><![CDATA[Resilience]]></category><category><![CDATA[mentalhealth]]></category><category><![CDATA[worklifebalance]]></category><dc:creator><![CDATA[David Wampamba]]></dc:creator><pubDate>Fri, 26 Sep 2025 06:06:36 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1758865895219/62635cd8-06c8-4ffa-8f2d-594eb11652ae.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Starting a business in Africa is often painted as a brave and exciting journey. And it truly is. But behind the energy and ambition, many ventures quietly face challenges because of the dynamics between founders and co-founders.</p>
<p>Before we dive in, let’s get our basics right.</p>
<h3 id="heading-who-is-a-founder-vs-a-co-founder"><strong>Who is a Founder vs. a Co-Founder?</strong></h3>
<ul>
<li><p><strong>Founder</strong>: The person who first conceives the idea and takes the initial steps to bring it to life. A founder is the spark—the one who says, “Let’s build this.”</p>
</li>
<li><p><strong>Co-Founder</strong>: Someone who joins the founder early on to share responsibility, skills, and vision. A co-founder strengthens the spark and helps the flame grow into a fire.</p>
</li>
</ul>
<p>Both are crucial. But the traits that make them effective are slightly different:</p>
<ul>
<li><p>Founders need <strong>vision, courage, resilience, and a knack for rallying others</strong>.</p>
</li>
<li><p>Co-founders need <strong>commitment, complementary skills, adaptability, and reliability</strong>.</p>
</li>
</ul>
<p>When these traits align, ventures thrive. When they don’t, the journey becomes painfully heavy for those carrying the most weight.</p>
<h3 id="heading-the-common-struggles-co-founders-face"><strong>The Common Struggles Co-Founders Face</strong></h3>
<ol>
<li><p><strong>Delayed Communication in WhatsApp Groups</strong></p>
<p> Many African startups coordinate via WhatsApp groups. But when some co-founders take days to respond—or don’t respond at all—critical decisions stall. This delay slows progress and leaves motivated members feeling stranded.</p>
</li>
<li><p><strong>Skill Gaps in Tech-Centric Ventures</strong></p>
<p> In tech-driven startups, it’s common to have co-founders who are passionate but not technically skilled. The result? A heavy burden falls on the few who understand the technical side.</p>
</li>
<li><p><strong>Limited Gadgets and Financial Contribution</strong></p>
<p> Not every co-founder can afford a reliable laptop, smartphone, or even internet. Without these tools, participation becomes limited, which again increases the load on those who are better equipped.</p>
</li>
<li><p><strong>Burnout and Mental Wellness Strain</strong></p>
<p> When only one or two people consistently show up with discipline and tools, they end up overworked. This doesn’t just slow down the venture—it affects mental health, motivation, and even personal wellbeing.</p>
</li>
</ol>
<h3 id="heading-graceful-ways-to-overcome-these-challenges"><strong>Graceful Ways to Overcome These Challenges</strong></h3>
<h4 id="heading-for-early-stage-ventures-less-than-1-year-old"><strong>For Early-Stage Ventures (Less than 1 Year Old)</strong></h4>
<ul>
<li><p><strong>Set clear communication habits</strong>: Agree on response times (e.g., within 24 hours on WhatsApp). Use tools like Trello, Slack, or Google Docs to document tasks so work isn’t buried in chats.</p>
</li>
<li><p><strong>Focus on capacity-building</strong>: If your co-founders lack technical skills, encourage small steps—like taking short free courses on digital literacy or project management.</p>
</li>
<li><p><strong>Start with what you have</strong>: Pool resources for basic gadgets or consider shared community hubs/co-working spaces that provide internet and computers.</p>
</li>
<li><p><strong>Check in on mental wellness</strong>: Make regular, honest check-ins part of your culture. Ask: “How are you coping?” as often as “How is the project?”</p>
</li>
</ul>
<h4 id="heading-for-established-ventures-5-years-old"><strong>For Established Ventures (5+ Years Old)</strong></h4>
<ul>
<li><p><strong>Formalize roles and accountability</strong>: Move beyond informal WhatsApp chats. Use formal communication channels and set clear performance expectations.</p>
</li>
<li><p><strong>Invest in continuous learning</strong>: Established ventures should set aside budget for training—whether technical or leadership. Growth should be shared, not carried by a few.</p>
</li>
<li><p><strong>Balance workloads</strong>: Rotate responsibilities so no single co-founder bears all the pressure. If one is the tech backbone, others can step up in fundraising, partnerships, or operations.</p>
</li>
<li><p><strong>Prioritize wellness programs</strong>: Consider counseling support, wellness retreats, or mental health breaks. Strong ventures depend on strong minds.</p>
</li>
</ul>
<h2 id="heading-5-red-flags-to-watch-for-when-choosing-a-co-founder"><strong>🚩 5 Red Flags to Watch for When Choosing a Co-Founder</strong></h2>
<p>Choosing a co-founder is like choosing a long-term partner. The wrong match can slow you down or even sink the venture. Before you fully commit, here are <strong>five red flags</strong> to look out for:</p>
<ol>
<li><p><strong>Poor Communication Habits</strong></p>
<p> If someone takes days to reply to small messages, imagine how they’ll handle urgent decisions. Consistent delays in early conversations signal future frustrations.</p>
</li>
<li><p><strong>Mismatch in Commitment</strong></p>
<p> Some people are passionate in words but absent in action. If they keep postponing meetings, miss deadlines, or “forget” agreed tasks during the early days, don’t expect miracles later.</p>
</li>
<li><p><strong>No Appetite for Learning</strong></p>
<p> In a tech-driven venture, you don’t need everyone to code—but you do need curiosity. A co-founder unwilling to learn the basics or adapt to new tools may become dead weight as the venture grows.</p>
</li>
<li><p><strong>Overreliance on Resources</strong></p>
<p> “I’ll only start when I get a new laptop” or “I don’t have money right now” are excuses that stall progress. Resourcefulness matters more than resources in the beginning. A true co-founder finds a way to contribute with what they have.</p>
</li>
<li><p><strong>Values Misalignment</strong></p>
<p> Skills can be taught, but values are deep-rooted. If someone doesn’t share your views on integrity, discipline, or long-term vision, conflict is almost guaranteed.</p>
</li>
</ol>
<h3 id="heading-quick-test-before-committing"><strong>✅ Quick Test Before Committing</strong></h3>
<p>Instead of jumping straight into a legal partnership, <strong>try a mini project first</strong>—a two-week campaign, a short product demo, or a pilot with customers. Observe how your potential co-founder shows up: Are they reliable? Do they communicate? Do they adapt?</p>
<p>That small experiment can save you years of frustration.</p>
<h3 id="heading-concluding-remarks"><strong>Concluding Remarks</strong></h3>
<p>Co-founding is supposed to lighten the load, not make it heavier. The truth is, many African ventures are slowed down not because of lack of ideas, but because of imbalanced co-founder dynamics.</p>
<p>Could the solution lie in being <strong>intentional with communication, skill-building, resource-sharing, and wellness practices?</strong> Whether your venture is just beginning or has been running for years, strengthening your co-founder relationships may be the very thing that keeps your dream alive.</p>
]]></content:encoded></item><item><title><![CDATA[Mastering SQL for Beginners: A Human-Centered Guide to Databases, Security, and Visualisation]]></title><description><![CDATA[Introduction
If you're dreaming of becoming a web developer, data analyst, mobile app developer, or just someone who wants to understand the backbone of most digital systems, learning SQL is a must. SQL—Structured Query Language—is the language we us...]]></description><link>https://blog.davidofug.com/mastering-sql-for-beginners-a-human-centered-guide-to-databases-security-and-visualisation</link><guid isPermaLink="true">https://blog.davidofug.com/mastering-sql-for-beginners-a-human-centered-guide-to-databases-security-and-visualisation</guid><dc:creator><![CDATA[David Wampamba]]></dc:creator><pubDate>Mon, 28 Apr 2025 21:00:11 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/unsplash/hpjSkU2UYSU/upload/v1657013942564/E-kxxfYhb.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h2 id="heading-introduction">Introduction</h2>
<p>If you're dreaming of becoming a web developer, data analyst, mobile app developer, or just someone who wants to understand the backbone of most digital systems, <strong>learning SQL is a must</strong>. SQL—Structured Query Language—is the language we use to <strong>store, retrieve, update, and secure data</strong> in most modern software systems.</p>
<p>In this guide, I’ll take you on a journey through SQL with <strong>clear examples</strong>, real-world use cases, <strong>secure practices</strong>, and <strong>visual tools</strong> to help you learn, grow, and build.</p>
<h2 id="heading-why-learning-sql-is-important">Why Learning SQL Is Important</h2>
<ul>
<li><p>It powers everything from <strong>websites</strong> and <strong>banking systems</strong> to <strong>social networks</strong> and <strong>hospital records</strong>.</p>
</li>
<li><p>It is essential for <strong>data analytics</strong>, <strong>machine learning</strong>, and <strong>database administration</strong>.</p>
</li>
<li><p>It’s used in nearly every <strong>career that handles data</strong>, including frontend/backend development.</p>
</li>
</ul>
<p>Whether you’re a complete beginner or transitioning from another career, SQL is your friend.</p>
<h2 id="heading-what-is-sql">What is SQL?</h2>
<p>SQL stands for <strong>Structured Query Language</strong>. It’s a specialized programming language for <strong>managing and interacting with data</strong> stored in <strong>Relational Database Management Systems (RDBMS)</strong>.</p>
<p>SQL can:</p>
<ul>
<li><p>Create and delete databases and tables</p>
</li>
<li><p>Insert, update, and delete records</p>
</li>
<li><p>Retrieve specific data from large datasets</p>
</li>
<li><p>Manage users and permissions</p>
</li>
<li><p>Encrypt and secure sensitive information</p>
</li>
</ul>
<hr />
<h2 id="heading-what-are-sql-commands">What Are SQL Commands?</h2>
<p>SQL commands are instructions used to <strong>perform tasks</strong> in a database. They fall into five main categories:</p>
<h3 id="heading-categories-of-sql-commands">Categories of SQL Commands</h3>
<ol>
<li><p><strong>DDL – Data Definition Language</strong></p>
<ul>
<li><p><code>CREATE</code>, <code>ALTER</code>, <code>DROP</code></p>
</li>
<li><p>For creating/modifying database structures</p>
</li>
</ul>
</li>
<li><p><strong>DML – Data Manipulation Language</strong></p>
<ul>
<li><p><code>INSERT</code>, <code>UPDATE</code>, <code>DELETE</code></p>
</li>
<li><p>For modifying data</p>
</li>
</ul>
</li>
<li><p><strong>DQL – Data Query Language</strong></p>
<ul>
<li><p><code>SELECT</code></p>
</li>
<li><p>For querying data</p>
</li>
</ul>
</li>
<li><p><strong>DCL – Data Control Language</strong></p>
<ul>
<li><p><code>GRANT</code>, <code>REVOKE</code></p>
</li>
<li><p>For access control</p>
</li>
</ul>
</li>
<li><p><strong>DTL – Data Transaction Language</strong></p>
<ul>
<li><p><code>BEGIN</code>, <code>COMMIT</code>, <code>ROLLBACK</code></p>
</li>
<li><p>For handling database transactions</p>
</li>
</ul>
</li>
</ol>
<h2 id="heading-use-case-managing-a-user-database">Use Case: Managing a User Database</h2>
<p>Let’s assume you’re building a system to manage users and their login credentials. you’ll:</p>
<ul>
<li><p>Create a <code>users</code> table</p>
</li>
<li><p>Store names, emails, and <strong>encrypted passwords</strong></p>
</li>
<li><p>Query and visualize the data</p>
</li>
</ul>
<h3 id="heading-creating-the-database-amp-table">Creating the Database &amp; Table</h3>
<pre><code class="lang-sql"><span class="hljs-keyword">CREATE</span> <span class="hljs-keyword">DATABASE</span> app_users;

<span class="hljs-keyword">USE</span> app_users;

<span class="hljs-keyword">CREATE</span> <span class="hljs-keyword">TABLE</span> <span class="hljs-keyword">users</span> (
  <span class="hljs-keyword">id</span> <span class="hljs-built_in">INT</span> AUTO_INCREMENT PRIMARY <span class="hljs-keyword">KEY</span>,
  <span class="hljs-keyword">name</span> <span class="hljs-built_in">VARCHAR</span>(<span class="hljs-number">100</span>),
  email <span class="hljs-built_in">VARCHAR</span>(<span class="hljs-number">150</span>) <span class="hljs-keyword">UNIQUE</span>,
  <span class="hljs-keyword">password</span> <span class="hljs-built_in">TEXT</span>
);
</code></pre>
<h2 id="heading-sql-comments">SQL Comments</h2>
<p>Use comments to explain code:</p>
<ul>
<li><p><code>-- Single-line comment</code></p>
</li>
<li><p><code>/* Multi-line comment */</code></p>
</li>
</ul>
<p>Comments help future you (and others) understand what’s going on.</p>
<h2 id="heading-data-aggregation-in-sql">Data Aggregation in SQL</h2>
<p>Aggregation functions help summarize large datasets:</p>
<pre><code class="lang-sql"><span class="hljs-keyword">SELECT</span> <span class="hljs-keyword">COUNT</span>(*) <span class="hljs-keyword">FROM</span> <span class="hljs-keyword">users</span>;          <span class="hljs-comment">-- Total users</span>
<span class="hljs-keyword">SELECT</span> <span class="hljs-keyword">AVG</span>(age) <span class="hljs-keyword">FROM</span> <span class="hljs-keyword">users</span>;          <span class="hljs-comment">-- Average age</span>
<span class="hljs-keyword">SELECT</span> <span class="hljs-keyword">MIN</span>(age), <span class="hljs-keyword">MAX</span>(age) <span class="hljs-keyword">FROM</span> <span class="hljs-keyword">users</span>; <span class="hljs-comment">-- Age range</span>
<span class="hljs-keyword">SELECT</span> <span class="hljs-keyword">SUM</span>(revenue) <span class="hljs-keyword">FROM</span> sales;      <span class="hljs-comment">-- Total revenue</span>
</code></pre>
<p>Common aggregator functions:</p>
<ul>
<li><p><code>COUNT()</code></p>
</li>
<li><p><code>SUM()</code></p>
</li>
<li><p><code>AVG()</code></p>
</li>
<li><p><code>MIN()</code> / <code>MAX()</code></p>
</li>
<li><p><code>GROUP BY</code> for categorization</p>
</li>
</ul>
<h2 id="heading-preventing-duplicate-data">Preventing Duplicate Data</h2>
<p>Use constraints like <code>UNIQUE</code> on emails:</p>
<pre><code class="lang-sql"><span class="hljs-keyword">CREATE</span> <span class="hljs-keyword">TABLE</span> <span class="hljs-keyword">users</span> (
  <span class="hljs-keyword">id</span> <span class="hljs-built_in">INT</span> AUTO_INCREMENT PRIMARY <span class="hljs-keyword">KEY</span>,
  email <span class="hljs-built_in">VARCHAR</span>(<span class="hljs-number">255</span>) <span class="hljs-keyword">UNIQUE</span>
);
</code></pre>
<p>Use <code>DISTINCT</code> in queries:</p>
<pre><code class="lang-sql"><span class="hljs-keyword">SELECT</span> <span class="hljs-keyword">DISTINCT</span> email <span class="hljs-keyword">FROM</span> <span class="hljs-keyword">users</span>;
</code></pre>
<h2 id="heading-data-types-amp-optimization">Data Types &amp; Optimization</h2>
<p>Common SQL Data Types:</p>
<ul>
<li><code>INT</code>, <code>FLOAT</code>, <code>VARCHAR(n)</code>, <code>TEXT</code>, <code>BOOLEAN</code>, <code>DATE</code>, <code>TIMESTAMP</code></li>
</ul>
<p>Optimization tips:</p>
<ul>
<li><p>Index columns used in <code>WHERE</code> or <code>JOIN</code></p>
</li>
<li><p>Normalize your tables</p>
</li>
<li><p>Use appropriate data types (e.g., <code>TINYINT</code> vs <code>INT</code>)</p>
</li>
<li><p>Avoid <code>SELECT *</code> in production</p>
</li>
</ul>
<h2 id="heading-relational-databases-amp-popular-tools">Relational Databases &amp; Popular Tools</h2>
<h3 id="heading-what-are-relational-databases">What are Relational Databases?</h3>
<p>They organize data into <strong>tables with rows and columns</strong>. Tables can relate to one another using <strong>foreign keys</strong>.</p>
<h3 id="heading-popular-rdbms-tools">Popular RDBMS tools:</h3>
<ul>
<li><p><strong>MySQL</strong> <em>(free)</em></p>
</li>
<li><p><strong>PostgreSQL</strong> <em>(free, powerful)</em></p>
</li>
<li><p><strong>MariaDB</strong> <em>(MySQL fork)</em></p>
</li>
<li><p><strong>SQLite</strong> <em>(lightweight, local)</em></p>
</li>
<li><p><strong>Oracle DB</strong> <em>(enterprise)</em></p>
</li>
<li><p><strong>SQL Server</strong> <em>(by Microsoft)</em></p>
</li>
</ul>
<h3 id="heading-setup-references">Setup References</h3>
<ul>
<li><p><a target="_blank" href="https://dev.mysql.com/doc/refman/8.0/en/installing.html">MySQL Install</a></p>
</li>
<li><p><a target="_blank" href="https://www.postgresql.org/download/">PostgreSQL Install</a></p>
</li>
<li><p><a target="_blank" href="https://www.sqlite.org/download.html">SQLite Download</a></p>
</li>
</ul>
<h2 id="heading-encryption-storing-passwords-securely">Encryption: Storing Passwords Securely</h2>
<h3 id="heading-1-in-php">1. In <strong>PHP</strong>:</h3>
<pre><code class="lang-php">$password = password_hash(<span class="hljs-string">"mypassword"</span>, PASSWORD_BCRYPT);
</code></pre>
<h3 id="heading-2-in-python">2. In <strong>Python</strong>:</h3>
<pre><code class="lang-python"><span class="hljs-keyword">import</span> bcrypt
hashed = bcrypt.hashpw(<span class="hljs-string">b"mypassword"</span>, bcrypt.gensalt())
</code></pre>
<h3 id="heading-3-in-c">3. In <strong>C++</strong>:</h3>
<p>Use a library like OpenSSL</p>
<pre><code class="lang-cpp"><span class="hljs-meta">#<span class="hljs-meta-keyword">include</span> <span class="hljs-meta-string">&lt;openssl/sha.h&gt;</span></span>
<span class="hljs-comment">// Use SHA-256 or bcrypt bindings</span>
</code></pre>
<h3 id="heading-4-in-c">4. In <strong>C</strong>:</h3>
<p>Same approach with OpenSSL</p>
<pre><code class="lang-c"><span class="hljs-comment">// Compile with -lssl -lcrypto and follow OpenSSL docs</span>
</code></pre>
<p>In your SQL table, store the encrypted string in a <code>TEXT</code> column.</p>
<h2 id="heading-sql-security-best-practices">SQL Security Best Practices</h2>
<ul>
<li><p><strong>Use parameterized queries</strong> to avoid SQL injection.</p>
</li>
<li><p><strong>Don’t store plain text passwords</strong>.</p>
</li>
<li><p><strong>Limit user privileges</strong> using <code>GRANT</code>.</p>
</li>
<li><p><strong>Audit logs</strong> and monitor user activity.</p>
</li>
</ul>
<h2 id="heading-visualizing-sql-data-with-electronjs">Visualizing SQL Data (with Electron.js)</h2>
<p>You can visualize SQL data in an Electron app using Node.js and chart libraries.</p>
<h3 id="heading-basic-flow">Basic Flow:</h3>
<ul>
<li><p>Use <code>sqlite3</code> or <code>mysql</code> in Node.js</p>
</li>
<li><p>Fetch data via SQL queries</p>
</li>
<li><p>Render charts with <code>Chart.js</code>, <code>D3.js</code>, or <code>Recharts</code></p>
</li>
</ul>
<h3 id="heading-example">Example:</h3>
<pre><code class="lang-javascript"><span class="hljs-keyword">const</span> sqlite3 = <span class="hljs-built_in">require</span>(<span class="hljs-string">'sqlite3'</span>);
<span class="hljs-keyword">const</span> db = <span class="hljs-keyword">new</span> sqlite3.Database(<span class="hljs-string">'data.db'</span>);

db.all(<span class="hljs-string">"SELECT age, COUNT(*) as count FROM users GROUP BY age"</span>, [], <span class="hljs-function">(<span class="hljs-params">err, rows</span>) =&gt;</span> {
  <span class="hljs-comment">// Pass rows to Chart.js for rendering</span>
});
</code></pre>
<h2 id="heading-how-to-practice-sql-easily">How to Practice SQL Easily</h2>
<p>Use these free online platforms:</p>
<ul>
<li><p><a target="_blank" href="https://sqliteonline.com/">SQLiteOnline</a></p>
</li>
<li><p><a target="_blank" href="https://www.db-fiddle.com/">DB Fiddle</a></p>
</li>
<li><p><a target="_blank" href="https://mode.com/sql-editor">Mode SQL Editor</a></p>
</li>
</ul>
<p>Use the demo data or upload your own.</p>
<h2 id="heading-recommended-sql-certifications">Recommended SQL Certifications</h2>
<ul>
<li><p><strong>IBM Data Analyst Professional Certificate</strong> (Coursera)</p>
</li>
<li><p><strong>Google Data Analytics Certificate</strong> (Coursera)</p>
</li>
<li><p><strong>Microsoft: Querying Data with SQL</strong></p>
</li>
<li><p><strong>Oracle Database SQL Certified Associate</strong></p>
</li>
</ul>
<p>These add credibility and improve job chances.</p>
<h2 id="heading-final-thoughts">Final Thoughts</h2>
<p>SQL is much more than a query language—it’s your <strong>gateway to understanding data</strong>, <strong>building secure applications</strong>, and <strong>unlocking career opportunities</strong> in tech.</p>
<p>From securing user passwords, to summarizing millions of rows with just one line of code, to building a beautiful dashboard in Electron.js—SQL helps bring your ideas to life.</p>
<p>Start with one command. Stay consistent. You’ll be amazed where it takes you</p>
]]></content:encoded></item><item><title><![CDATA[Why should you learn PHP in 2025?]]></title><description><![CDATA[Widely used: PHP is a popular and widely used programming language that powers the back-end functionality of millions of websites. It means that there is a sizable need for PHP developers and that there are numerous resources available for learning a...]]></description><link>https://blog.davidofug.com/why-should-you-learn-php-in-2025</link><guid isPermaLink="true">https://blog.davidofug.com/why-should-you-learn-php-in-2025</guid><category><![CDATA[PHP]]></category><category><![CDATA[software development]]></category><category><![CDATA[payment]]></category><category><![CDATA[salary]]></category><category><![CDATA[learning]]></category><dc:creator><![CDATA[David Wampamba]]></dc:creator><pubDate>Tue, 22 Apr 2025 22:22:32 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1671314747286/VKt1aXmrT.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><strong>Widely used:</strong> PHP is a popular and widely used programming language that powers the back-end functionality of millions of websites. It means that there is a sizable need for PHP developers and that there are numerous resources available for learning and using the language.</p>
<p><strong>Easy to learn:</strong> PHP is simple to learn, especially for programmers with previous experience in other programming languages.</p>
<p><strong>Web development:</strong> PHP is frequently used for this purpose and is especially effective when building dynamic, interactive websites. A wide variety of web applications, from straightforward static websites to intricate web-based systems, can be built using it.</p>
<p><strong>Server-side programming:</strong> PHP is a server-side language, which means that rather than being executed in the user's web browser, it is done so on the server. This enables PHP to carry out operations like interacting with servers and databases, producing dynamic content, and managing user input.</p>
<p><strong>Open-source:</strong> PHP is a free and open-source language that is available for use and distribution. Because of this, it might be a sensible option for web development projects.</p>
<p><strong>Good salary:</strong> A PHP developer's average pay can vary depending on their location, industry, level of experience, and job title. The median annual salary for a PHP developer in the United States is $75,000, according to data from Glassdoor. Nevertheless, depending on the particular job and employer, this can range from $50,000 to $110,000 or more.</p>
<p>These are some of the reasons I think you should learn PHP in 2025. Let me know if it helps in the comment section below.</p>
]]></content:encoded></item><item><title><![CDATA[How to Set Up and Use WordPress Coding Standards (WPCS) with MAMP on Windows, macOS, and Ubuntu]]></title><description><![CDATA[If you're building themes or plugins in WordPress and want your code to be clean, secure, and professional, then understanding and using WordPress Coding Standards (WPCS) is a must. In this guide, we'll break down what WPCS is, why it's essential, an...]]></description><link>https://blog.davidofug.com/how-to-set-up-and-use-wordpress-coding-standards-wpcs-with-mamp-on-windows-macos-and-ubuntu</link><guid isPermaLink="true">https://blog.davidofug.com/how-to-set-up-and-use-wordpress-coding-standards-wpcs-with-mamp-on-windows-macos-and-ubuntu</guid><category><![CDATA[Wordpress Coding Standards]]></category><category><![CDATA[PHP_CodeSniffer]]></category><category><![CDATA[WPCS]]></category><category><![CDATA[Developer Career Tips]]></category><category><![CDATA[PHPCS]]></category><category><![CDATA[webdev]]></category><category><![CDATA[Web Development]]></category><category><![CDATA[Web development tools]]></category><category><![CDATA[composer]]></category><category><![CDATA[PhpStorm]]></category><category><![CDATA[PHP]]></category><category><![CDATA[mamp]]></category><dc:creator><![CDATA[David Wampamba]]></dc:creator><pubDate>Sun, 20 Apr 2025 22:58:21 GMT</pubDate><content:encoded><![CDATA[<p>If you're building themes or plugins in WordPress and want your code to be clean, secure, and professional, then understanding and using WordPress Coding Standards (WPCS) is a must. In this guide, we'll break down what WPCS is, why it's essential, and how to set it up on your local development environment—whether you're using Windows, macOS, or Ubuntu.</p>
<p>We'll also show you how it integrates with MAMP and how it can improve your development workflow and even your job prospects.</p>
<h3 id="heading-what-is-wpcs">What is WPCS?</h3>
<p>WPCS stands for WordPress Coding Standards. It's a set of guidelines and rules created to ensure that code written for WordPress is consistent, readable, and secure. These rules apply to PHP, JavaScript, HTML, and CSS in your WordPress projects.</p>
<p>To enforce these rules, developers use a tool called PHP_CodeSniffer (PHPCS). WPCS works as a collection of sniffs (rules) for PHPCS to scan your code and flag anything that doesn't comply with WordPress best practices.</p>
<h3 id="heading-why-should-you-use-wpcs">Why Should You Use WPCS?</h3>
<ul>
<li><p><strong>Code Quality</strong>: It helps you write cleaner, more maintainable code.</p>
</li>
<li><p><strong>Security</strong>: It catches common mistakes that can lead to vulnerabilities.</p>
</li>
<li><p><strong>Consistency</strong>: When working with teams or contributing to open-source, consistent code matters.</p>
</li>
<li><p><strong>Professionalism</strong>: Hiring managers and companies look for developers who follow industry standards.</p>
</li>
</ul>
<p>Whether you're working solo or contributing to WordPress core, WPCS helps you build trust and reputation.</p>
<h2 id="heading-how-to-set-up-wpcs-with-mamp-all-platforms">How to Set Up WPCS with MAMP (All Platforms)</h2>
<p>Before we dive into OS-specific instructions, here are the tools you need:</p>
<ul>
<li><p>PHP (should be installed or accessible via terminal)</p>
</li>
<li><p>Composer (a PHP package manager)</p>
</li>
<li><p>PHP_CodeSniffer (PHPCS)</p>
</li>
<li><p>WordPress Coding Standards (WPCS)</p>
</li>
</ul>
<h3 id="heading-step-1-check-your-php-installation">Step 1: Check Your PHP Installation</h3>
<p>Make sure PHP is accessible from your terminal. Open your terminal or command prompt and run:</p>
<pre><code class="lang-bash">php -v
</code></pre>
<p>If PHP is not recognized, you may need to add it to your system PATH.</p>
<h3 id="heading-step-2-install-composer">Step 2: Install Composer</h3>
<p>If you don’t already have Composer installed, go to <a target="_blank" href="https://getcomposer.org/download/">getcomposer.org</a> and install it for your system.</p>
<p>Once installed, verify:</p>
<pre><code class="lang-bash">composer -V
</code></pre>
<h2 id="heading-platform-specific-operating-system-specific-instructions">Platform-Specific /Operating System-Specific Instructions</h2>
<h3 id="heading-for-macos-users">For <strong>macOS</strong> Users</h3>
<ol>
<li><p><strong>Ensure MAMP’s PHP is in your PATH</strong> (if needed):</p>
<pre><code class="lang-bash"> <span class="hljs-built_in">export</span> PATH=<span class="hljs-string">"/Applications/MAMP/bin/php/php8.x.x/bin:<span class="hljs-variable">$PATH</span>"</span>
</code></pre>
<p> (Replace with your actual PHP version path.)</p>
</li>
<li><p><strong>Install PHPCS globally:</strong></p>
<pre><code class="lang-bash"> composer global require squizlabs/php_codesniffer
</code></pre>
</li>
<li><p><strong>Install WPCS:</strong></p>
<pre><code class="lang-bash"> composer create-project wp-coding-standards/wpcs --no-dev
</code></pre>
</li>
<li><p><strong>Link WPCS to PHPCS:</strong></p>
<pre><code class="lang-bash"> phpcs --config-set installed_paths ~/.composer/vendor/wp-coding-standards/wpcs
 phpcs -i
</code></pre>
</li>
<li><p><strong>Run WPCS:</strong></p>
<pre><code class="lang-bash"> phpcs --standard=WordPress path/to/your/theme-or-plugin
</code></pre>
</li>
</ol>
<h3 id="heading-for-windows-users">For <strong>Windows</strong> Users</h3>
<ol>
<li><p><strong>Ensure PHP is added to your Environment Variables</strong></p>
<ul>
<li>Navigate to MAMP\bin\php\php8.x.x and add that path to your system PATH.</li>
</ul>
</li>
<li><p><strong>Install Composer for Windows</strong></p>
<ul>
<li>Download the Composer setup file and install globally.</li>
</ul>
</li>
<li><p><strong>Open Command Prompt or PowerShell and run:</strong></p>
<pre><code class="lang-bash"> composer global require squizlabs/php_codesniffer
 composer create-project wp-coding-standards/wpcs --no-dev
</code></pre>
</li>
<li><p><strong>Configure PHPCS to use WPCS:</strong></p>
<pre><code class="lang-bash"> phpcs --config-set installed_paths %USERPROFILE%\AppData\Roaming\Composer\vendor\wp-coding-standards\wpcs
 phpcs -i
</code></pre>
</li>
<li><p><strong>Run WPCS on your project:</strong></p>
<pre><code class="lang-bash"> phpcs --standard=WordPress path\to\your\theme-or-plugin
</code></pre>
</li>
</ol>
<h3 id="heading-for-ubuntulinux-users">For <strong>Ubuntu/Linux</strong> Users</h3>
<ol>
<li><p><strong>Install PHP and Composer if not already installed:</strong></p>
<pre><code class="lang-bash"> sudo apt update
 sudo apt install php php-cli unzip curl
 curl -sS https://getcomposer.org/installer | php
 sudo mv composer.phar /usr/<span class="hljs-built_in">local</span>/bin/composer
</code></pre>
</li>
<li><p><strong>Install PHPCS and WPCS:</strong></p>
<pre><code class="lang-bash"> composer global require squizlabs/php_codesniffer
 composer create-project wp-coding-standards/wpcs --no-dev
</code></pre>
</li>
<li><p><strong>Link WPCS to PHPCS:</strong></p>
<pre><code class="lang-bash"> phpcs --config-set installed_paths ~/.config/composer/vendor/wp-coding-standards/wpcs
 phpcs -i
</code></pre>
</li>
<li><p><strong>Run PHPCS with WPCS:</strong></p>
<pre><code class="lang-bash"> phpcs --standard=WordPress /var/www/html/your-theme-or-plugin
</code></pre>
</li>
</ol>
<h2 id="heading-bonus-auto-fix-some-errors">Bonus: Auto-fix Some Errors</h2>
<p>Some coding issues can be automatically fixed:</p>
<pre><code class="lang-bash">phpcbf --standard=WordPress path/to/your/theme-or-plugin
</code></pre>
<h2 id="heading-how-wpcs-fits-in-your-workflow">How WPCS Fits in Your Workflow</h2>
<ul>
<li><p>Use it in your <strong>CI/CD pipeline</strong> for quality checks.</p>
</li>
<li><p>Use it in <strong>VS Code</strong> with the PHPCS extension.</p>
</li>
<li><p>Use it when <strong>contributing to open-source</strong> projects like WooCommerce or WordPress Core.</p>
</li>
</ul>
<h2 id="heading-frequently-asked-questions-faq">Frequently Asked Questions (FAQ)</h2>
<p><strong>Q: Can I use WPCS without MAMP?</strong><br />A: Yes. MAMP is just your server stack. WPCS only needs PHP and Composer accessible from your terminal.</p>
<p><strong>Q: Will WPCS slow down my coding?</strong><br />A: At first, a little. But it saves time later by catching bugs early and avoiding code rewrites.</p>
<p><strong>Q: Can WPCS help me get hired?</strong><br />A: Definitely. Many companies require knowledge of WordPress Coding Standards. It also proves you write clean, secure, and professional code.</p>
<p><strong>Q: Is there a way to integrate WPCS into my code editor?</strong><br />A: Yes. You can install the PHPCS extension in editors like VS Code or PhpStorm.</p>
<h2 id="heading-final-thoughts">Final Thoughts</h2>
<p>If you're serious about WordPress development, learning to use WordPress Coding Standards is a no-brainer. It keeps your code clean, boosts your chances of getting hired, and prepares you to work on large and professional projects.</p>
<p>Once you set it up, it becomes a reliable part of your development flow. Whether you're just starting out or building client websites, WPCS is a quiet but powerful tool to help you grow as a developer.</p>
<p>Do you need a guide to help you set it up in your code editor or CI pipeline? Stay tuned!</p>
]]></content:encoded></item><item><title><![CDATA[How to update Openssl on MacOS]]></title><description><![CDATA[Does your MacBook have an unsupported version of OpenSSL? In this small article, I’ll show you how you can install the supported version in simple steps in the terminal.

Verify the installed version

Uninstall the old version

Install the new versio...]]></description><link>https://blog.davidofug.com/how-to-update-openssl-on-macos</link><guid isPermaLink="true">https://blog.davidofug.com/how-to-update-openssl-on-macos</guid><category><![CDATA[openssl]]></category><category><![CDATA[macOS Tips]]></category><category><![CDATA[macOS]]></category><dc:creator><![CDATA[David Wampamba]]></dc:creator><pubDate>Thu, 19 Dec 2024 08:39:54 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1734597489931/2f65138f-7b5c-432c-99f8-28af25716c76.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Does your MacBook have an unsupported version of OpenSSL? In this small article, I’ll show you how you can install the supported version in simple steps in the terminal.</p>
<ol>
<li><p>Verify the installed version</p>
</li>
<li><p>Uninstall the old version</p>
</li>
<li><p>Install the new version</p>
</li>
<li><p>Update the path</p>
</li>
<li><p>Reload the shell</p>
</li>
<li><p>Verify</p>
</li>
</ol>
<p>To uninstall and install OpenSSL, you will need to use the terminal app. And you need administrator privileges in order to be successful. So open the terminal app and follow the steps below.</p>
<ol>
<li><h2 id="heading-verify-the-installed-version">Verify the installed version</h2>
</li>
</ol>
<pre><code class="lang-bash">$ openssl version
</code></pre>
<ol start="2">
<li><h2 id="heading-uninstall-unsupported-version">Uninstall unsupported version</h2>
</li>
</ol>
<pre><code class="lang-bash">$ brew uninstall openssl@1.1
</code></pre>
<p>Optionally, you might have to run an extra command in order to remove remnants or uninstall the unwanted OpenSSL version completely.</p>
<pre><code class="lang-bash">$ rm -rf /opt/homebrew/etc/openssl@1.0
</code></pre>
<ol start="3">
<li><h1 id="heading-install-the-current-supported-version">Install the current supported version</h1>
</li>
</ol>
<pre><code class="lang-bash">$ brew install openssl@3
</code></pre>
<ol start="4">
<li><h1 id="heading-update-your-path-to-use-the-new-version">Update your PATH to use the new version</h1>
</li>
</ol>
<pre><code class="lang-bash">$ <span class="hljs-built_in">echo</span> <span class="hljs-string">'export PATH="/usr/local/opt/openssl@3/bin:$PATH"'</span> &gt;&gt; ~/.zshrc
<span class="hljs-comment"># Or if using bash:</span>
<span class="hljs-comment"># $echo 'export PATH="/usr/local/opt/openssl@3/bin:$PATH"' &gt;&gt; ~/.bashrc</span>
<span class="hljs-comment"># Update compiler flags for building software that uses OpenSSL</span>
$ <span class="hljs-built_in">export</span> LDFLAGS=<span class="hljs-string">"-L/usr/local/opt/openssl@3/lib"</span>
$ <span class="hljs-built_in">export</span> CPPFLAGS=<span class="hljs-string">"-I/usr/local/opt/openssl@3/include"</span>
$ <span class="hljs-built_in">export</span> PKG_CONFIG_PATH=<span class="hljs-string">"/usr/local/opt/openssl@3/lib/pkgconfig"</span>
</code></pre>
<ol start="5">
<li><h1 id="heading-reload-your-shell-configuration">Reload your shell configuration</h1>
</li>
</ol>
<pre><code class="lang-bash">$ <span class="hljs-built_in">source</span> ~/.zshrc
<span class="hljs-comment"># or source ~/.bashrc if using bash</span>
</code></pre>
<ol start="6">
<li><h1 id="heading-verify-the-installation">Verify the installation</h1>
</li>
</ol>
<pre><code class="lang-bash">$ openssl version
</code></pre>
<p>If all is well, you will see something like this.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1734596807502/7b06172c-44ce-449b-b517-1b9810246ddb.png" alt class="image--center mx-auto" /></p>
]]></content:encoded></item><item><title><![CDATA[Self-host multiple Strapi apps on one VPS: A step-by-step guide demonstrating how to setup strap on a VPS.]]></title><description><![CDATA[How it all started and why
Have you been in a situation where you’re using a headless CMS like Strapi? Most times because you wanted to avoid the hustle of building your own Content Management System so that you could go to the market faster?
I was i...]]></description><link>https://blog.davidofug.com/learn-to-deploy-strapi-on-any-virtual-private-server-host-multiple-strapi-apps-on-a-single-vps</link><guid isPermaLink="true">https://blog.davidofug.com/learn-to-deploy-strapi-on-any-virtual-private-server-host-multiple-strapi-apps-on-a-single-vps</guid><category><![CDATA[Strapi]]></category><category><![CDATA[headless cms]]></category><category><![CDATA[vps]]></category><dc:creator><![CDATA[David Wampamba]]></dc:creator><pubDate>Tue, 05 Mar 2024 21:22:39 GMT</pubDate><content:encoded><![CDATA[<h2 id="heading-how-it-all-started-and-why">How it all started and why</h2>
<p>Have you been in a situation where you’re using a headless CMS like Strapi? Most times because you wanted to avoid the hustle of building your own Content Management System so that you could go to the market faster?</p>
<p>I was in a similar situation.</p>
<p>At my startup, we were building our mobile app, https://cutt.ly/insightify to empower developers with the latest opportunities in tech. But we were extremely on a low budget and development team so small. This is when I discovered Strapi, Amplication and I was already a WordPress guru. I liked the out-of-box REST API Strapi provides and proceeded to learning it.</p>
<p>After a few weeks, I gained the needed confidence in it and setup a custom backend on it. But, the next step was to deploy and make it consumable by the frontend so that our ReactNative developer could go ahead to integrate in our mobile app.  </p>
<p>Little did I know that I would fail to deploy it on familiar services like Vercel and Netlify.  </p>
<p>In this tutorial, I am happy to share a step-by-step guide showing you how I was able to deploy Strapi on a Compute Engine (CE) on Google Cloud Platform (GCP) but same as VPS in the context of other server providers.  </p>
<p>As you read along you’ll gain more understanding of Strapi, a Headless CMS, and VPS. Most importantly you learn how to deploy Strapi on your own VPS, save a tone of hours and costs. Before concluding I propose 3 options you can try out to the deployment.<br />Are you ready? Let's dive in.</p>
<h2 id="heading-what-is-strapi">What is Strapi?</h2>
<p>Strapi is a headless CMS built in JavaScript particularly in Node.js and the React. It is open-source. It is among the most popular headless CMSs by the time of this writing in 2024. Sometimes it is referred to as a low-code REST API builder.</p>
<h2 id="heading-why-developers-choose-strapi">Why Developers choose Strapi?</h2>
<ol>
<li><p>It generates a REST API out-of-the-box for your content, thus making your content accessible through versatile endpoints. In case you want to work with GraphQL there is a free GraphQL extension you can install and have fun.</p>
</li>
<li><p>Like other headless Content Management Systems, Strapi provides a fully-fledged administration UI saving developers thousands of hours.</p>
</li>
<li><p>Strapi has a robust and growing plugin ecosystem, giving developers confidence that whatever isn’t in Strapi out-of-box could be achieved by installing an additional free plugin.</p>
</li>
<li><p>Strapi can easily be deployed on Strapi Cloud and for teams which have a budget this doesn’t only save them time but it gives them confidence knowing that they’re relying on the service provided by the Strapi developers themselves therefore fast technical support could be around the corner may anything go wrong.</p>
</li>
<li><p>Strapi is highly customisable through the 3rd-party plugins, controllers, routes and UI. You can customise the API to behave in any way you want to fit your unique needs.</p>
</li>
</ol>
<h2 id="heading-what-is-a-headless-cms">What is a Headless CMS?</h2>
<p>A headless CMS is a web app that provides an administration user interface for managing content. It may also enable administrators to customise content types, custom fields, users, and layouts to suit their unique business needs.  </p>
<p>It also provides an out-of-box API to allow content consumption via endpoints so that frontends of various natures can rely on it.</p>
<h2 id="heading-how-to-install-strapi">How to install Strapi</h2>
<p>You need two environments to have a working instance of Strapi. That is (1) the <strong><em>production</em></strong> and (2) the <strong><em>development</em></strong> environment.</p>
<h3 id="heading-1-the-production-environment">(1) The Production environment</h3>
<ol>
<li><p>Get a VPS from a provider of your choice. A VPS could be an EC2 instance on AWS or Compute Engine on GCP or Node on Linode or Droplet on Digital Ocean. They’re just many different words used to refer to the same thing.</p>
<p> For cost effectiveness my favourite VPS provider is contabo.com. I have used them for more than 5 years and I don’t have major complaints. They are affordable and reliable.</p>
<h3 id="heading-vps-requirements">VPS Requirements</h3>
<p> I recommend that the VPS meets these following requirements.</p>
<ul>
<li>RAM: 4GB</li>
</ul>
</li>
</ol>
<ul>
<li>CPU: 2 vCPUs</li>
</ul>
<ul>
<li>Storage: 10GB</li>
</ul>
<ul>
<li>IP: Public IPv4</li>
</ul>
<ol start="2">
<li><p>After getting the VPS, assign a static public IP address. This will enable users to access the Strapi Instance. You can also connect a domain name to it to make things more easier for your team members and yourself.</p>
</li>
<li><p>Access the VPS via SSH and setup the necessary tools in order to provide a secure and functional production environment that power your Strapi apps, static websites and normal node apps.</p>
<h3 id="heading-these-are-the-8-tools-you-should-setup-on-your-vps">These are the 8 tools you should setup on your VPS.</h3>
<ol>
<li><p><strong>Operating System:</strong> Ubuntu server 22.04 LTS</p>
</li>
<li><p><strong>Version control:</strong> Git</p>
</li>
<li><p><strong>Runtime environment:</strong> Node.js 18.0.0</p>
</li>
<li><p><strong>Web server:</strong> latest Nginx</p>
</li>
<li><p><strong>Firewall:</strong> UFW</p>
</li>
<li><p><strong>HTTP Security:</strong> Letsencrypt for generating FREE SSL</p>
</li>
<li><p><strong>Node Process Manager:</strong> PM2 or Forever (I recommend PM2)</p>
</li>
<li><p><strong>Database:</strong> Postgres or MySQL (I recommend Postgres)</p>
</li>
</ol>
</li>
</ol>
<p><em>Make sure that you install and configure all the above 8 tools on your chosen VPS.</em></p>
<h3 id="heading-2-developer-environment">(2) Developer environment</h3>
<p>The developer environment could be on your computer or any other where you intend to test configure and test Strapi before taking it to your production VPS.</p>
<p>Here your basic needs are; a running version of Node.js 18.0.0 and Git</p>
<h3 id="heading-development-environment">Development environment</h3>
<ol>
<li><p>Download Strapi to your local machine.</p>
</li>
<li><p>Then cd into the strapi directory</p>
</li>
<li><p>Install the necessary node dependences by executing <code>npm install</code></p>
</li>
<li><p>Run Strapi and start using it on your developer environment by executing the following command <code>npm run develop</code></p>
</li>
<li><p>Strapi will require you to create a super admin account and login</p>
</li>
</ol>
<h3 id="heading-deployment-steps">Deployment steps</h3>
<ol>
<li><p>Connect Strapi to Github.</p>
<ol>
<li><p>Create Github repo for the project</p>
</li>
<li><p>Connect Github repo to the local Strapi repo</p>
</li>
</ol>
</li>
<li><p>Create the desired content types</p>
</li>
<li><p>If needed create and attach custom fields to your content types</p>
</li>
<li><p>Commit changes and push to Github</p>
</li>
<li><p>SSH into my VPS. Open the terminal on your computer and execute <code>ssh username@vpsIPAddress -p port number</code> e.g <code>ssh root@257.XXX.XXX.XXX -p 2222</code></p>
</li>
<li><p>If you want to use a friendly domain while accessing your Strapi deployment, go ahead and map the domain name to the VPS. You can accomplish this by purchasing a domain name from any domain provider and pointing it to the IP address of the VPS.</p>
</li>
<li><p>Add a domain name to the VPS</p>
</li>
<li><p>Create a server block for this domain</p>
</li>
<li><p>Create a Postgres database and credentials</p>
</li>
<li><p>cd to domain name directory</p>
</li>
<li><p>Pull from Github</p>
</li>
<li><p>Copy <code>.env.example</code> to <code>.env</code> and open the file for editing, usually by executing <code>sudo nano .env</code></p>
</li>
<li><p>Set values to the PORT, DATABASE_NAME, DATABASE_USERNAME, DATABASE_CLIENT and DATABASE_PASSWORD variables in the environment file. Additionally, generate the necessary tokens and secrets and set them too. Save your changes.</p>
</li>
<li><p>Excute <code>npm install</code></p>
</li>
<li><p>Execute <code>NODE_ENV=production npm run build</code> this will execute database migrations and build the static Strapi admin for you.</p>
</li>
<li><p>Then execute <code>pm2 start npm --name "my-app-name" -- run start</code></p>
</li>
</ol>
<p><strong>Note:</strong> Replace my-app-name with the appropriate name for your project.</p>
<ol start="17">
<li><p>Visit the domain in the browser.</p>
</li>
<li><p>Sign up for a super admin account in the production environment.</p>
</li>
</ol>
<p>Login, and you will find all your content types and fields readily available from the local to the production environment. If there is some content you want to migrate from local to production, install the Export/Import plugin.</p>
<p>Now you can setup the API tokens that will be used to authenticate the frontends.</p>
<p>To use your Strapi API, use API consumers like Postman, Insomnia, or even command-line programs like CURL. Then access the <a target="_blank" href="http://domain.com/api/%7Bendpoint%7D">https://{domain.com}/api/{endpoint</a>}</p>
<p>Replace {domain.com} and {endpoint} with your domain and endpoints.</p>
<h2 id="heading-how-do-you-update-your-strapi-deployment">How do you update your Strapi deployment?</h2>
<p>Now that you have succeeded at setting up web server and deployed Strapi on your VPS or Compute, let's look at how you can update this deployment. In this section I will show you both manual and automated way of updating your Strapi deployments.</p>
<p>I have the assumption that like me, your workflow is from development environment machine you push to Github then pull to the VPS but not the other way round.</p>
<h3 id="heading-manual-update-deployment">Manual Update Deployment</h3>
<ol>
<li><p>Create an ssh key on your server and add it your Github account. Open Github and log in, then go to settings and choose SSH and GPG keys.</p>
</li>
<li><p>Login to your VPS using the root user account <code>ssh root@domain.tld -p XXXX</code> Replace domain.tld and XXX with the actual domain and ssh port number, respectively. Then provide the password to be logged in.</p>
</li>
<li><p>Stop the particular Strapi instance you want to update. Use <code>pm2 list</code> to find out the names and ids of the Strapi instance then use <code>pm2 stop id|name</code> to stop the instance.</p>
</li>
<li><p>Navigate to the linux user who owns the project the strapi project in your web server. E.g <code>sudo su username</code> and provide the password of <code>username</code> if prompted.</p>
</li>
<li><p>Navigate to strapi project directory. <code>cd /var/www/domain.ltd/public_html</code></p>
<p> <strong>Note</strong>: Replace <code>domain.tld</code> with the actual domain name of your Strapi project.</p>
</li>
<li><p>Pull updates from your repository. <code>git pull origin main</code></p>
</li>
<li><p>If your update needs to make changes to the node_modules, you can run <code>npm install</code> and sometimes <code>npm install --force</code></p>
</li>
<li><p>Make a build to perform the migrations and UI updates necessary to Strapi. E.g <code>NODE_ENV=production npm run build</code></p>
</li>
<li><p>Now switch back to the root user. <code>sudo su -</code> and provide the password when prompted.</p>
</li>
<li><p>Finally, start or restart Strapi by executing <code>pm2 start id|name</code> where <code>id</code> should be replaced with the actual process id in PM2 and <code>name</code> should be replaced with the actual process name in PM2. To know the <code>id</code> and <code>name</code> just execute <code>pm2 list</code> in the right user context.</p>
</li>
</ol>
<h3 id="heading-automate-the-deployment">Automate the Deployment</h3>
<p>If you’ve reached this far, I think you’ve deployed Strapi successfully. But you are wondering should I be deploying manually whenever the team makes changes on Strapi?</p>
<p>I will suggest you look at the following three options</p>
<ul>
<li><p>Using Coolify which turns a VPS into a Vercel or Netlify alternative but can host both backend and frontend apps.</p>
</li>
<li><p>Implementing github actions</p>
</li>
<li><p>Implementing a bash script and use `crontab` to automate the entire process.</p>
</li>
</ul>
<h3 id="heading-conclusion">Conclusion</h3>
<p>In this short post, we’ve learned what Strapi, and headless cms are, why developers choose Strapi, and how to setup Strapi on a VPS and your computer. We’ve also discovered the three options that can help you automate the deployment process. You can now build APIs without writing a line of code.</p>
<p>Was this helpful? Do you have any questions? Let me know in the comment section below.</p>
<p>Follow me <a target="_blank" href="https://twitter.com/davidofug">@davidofug</a></p>
]]></content:encoded></item><item><title><![CDATA[SECURE your WordPress with these plugins: Sit back and watch your website perform.]]></title><description><![CDATA[Sometimes using WordPress plugins like WordFence and Sucuri can be ideal, but they can only do so much. Or sometimes they are too much for a simple job such as protecting your WordPress login, Password reset, sign-up, and WooCommerce Login and sign-u...]]></description><link>https://blog.davidofug.com/secure-your-wordpress-with-these-plugins-sit-back-and-watch-your-website-perform</link><guid isPermaLink="true">https://blog.davidofug.com/secure-your-wordpress-with-these-plugins-sit-back-and-watch-your-website-perform</guid><category><![CDATA[Security]]></category><category><![CDATA[WordPress]]></category><category><![CDATA[wordpress plugins]]></category><dc:creator><![CDATA[David Wampamba]]></dc:creator><pubDate>Sat, 05 Aug 2023 07:55:40 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1691220842930/fb5eb7db-87f6-46d2-8495-01376b0fd1fe.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Sometimes using WordPress plugins like WordFence and Sucuri can be ideal, but they can only do so much. Or sometimes they are too much for a simple job such as protecting your WordPress login, Password reset, sign-up, and WooCommerce Login and sign-up pages.</p>
<p>In this article, I will share a list of five Free or Freemium WordPress plugins that you can use to secure different types of WordPress websites for free.</p>
<p>Most of the plugins will add a Google Recaptcha to the different WordPress forms, including but not limited to the login, Password reset, and Sign-up pages.</p>
<p>Each plugin's WordPress repository link has been shared below the plugin name to help you find out more details before deciding which one to use.</p>
<p>The plugins are organized at random, not in order of importance or preference. I suggest you check out each and make an informed choice on which WordPress security plugin to use.</p>
<h2 id="heading-5-plugins-to-secure-wordpress-websites-and-blogs">5 Plugins to secure WordPress websites and blogs.</h2>
<h3 id="heading-1-captcha-4wp"><strong>1. CAPTCHA 4WP</strong></h3>
<p><a target="_blank" href="https://wordpress.org/plugins/advanced-nocaptcha-recaptcha/">https://wordpress.org/plugins/advanced-nocaptcha-recaptcha/</a></p>
<h3 id="heading-2-wp-2fa"><strong>2. WP 2FA</strong></h3>
<p><a target="_blank" href="https://wordpress.org/plugins/wp-2fa/">https://wordpress.org/plugins/wp-2fa/</a></p>
<h3 id="heading-3-recaptcha-for-woocommerce"><strong>3. reCAPTCHA for WooCommerce</strong></h3>
<p><a target="_blank" href="https://wordpress.org/plugins/recaptcha-woo/">https://wordpress.org/plugins/recaptcha-woo/</a></p>
<h3 id="heading-4-simple-cloudflare-turnstile"><strong>4. Simple Cloudflare Turnstile</strong></h3>
<p><a target="_blank" href="https://wordpress.org/plugins/simple-cloudflare-turnstile/">https://wordpress.org/plugins/simple-cloudflare-turnstile/</a></p>
<h3 id="heading-5-advanced-google-recaptcha"><strong>5. Advanced Google reCAPTCHA</strong></h3>
<p><a target="_blank" href="https://wordpress.org/plugins/advanced-google-recaptcha/">https://wordpress.org/plugins/advanced-google-recaptcha/</a></p>
<h2 id="heading-conclusion-secure-your-wordpress-with-these-plugins">Conclusion: SECURE your WordPress with these plugins.</h2>
<p>In brief, the above recommendations can be used on different types of WordPress sites including News blogs, e-commerce sites, personal websites, and organisation and business WordPress websites.</p>
<p>To choose a plugin to use, you may consider looking at the rating, reviews, publish and update dates, supported versions, features, ease of use, and cost.</p>
<p>Has this been helpful?</p>
<p>Join the conversation. Add your views below.</p>
]]></content:encoded></item><item><title><![CDATA[How I switched the domain names of Laravel Apps hosted on the Google Cloud Platform: Learn and Save time]]></title><description><![CDATA[At a certain company, we developed a B2B web application and a mobile application. The web application also serves as the REST API to integrate the mobile app. The web application was developed using Laravel. And we deployed this web application on a...]]></description><link>https://blog.davidofug.com/how-i-switched-the-domain-names-of-laravel-apps-hosted-on-the-google-cloud-platform-learn-and-save-time</link><guid isPermaLink="true">https://blog.davidofug.com/how-i-switched-the-domain-names-of-laravel-apps-hosted-on-the-google-cloud-platform-learn-and-save-time</guid><category><![CDATA[Laravel]]></category><category><![CDATA[Cloud]]></category><dc:creator><![CDATA[David Wampamba]]></dc:creator><pubDate>Thu, 03 Aug 2023 10:05:24 GMT</pubDate><content:encoded><![CDATA[<p>At a certain company, we developed a B2B web application and a mobile application. The web application also serves as the REST API to integrate the mobile app. The web application was developed using Laravel. And we deployed this web application on a Compute engine (CE) in the Google Cloud Platform (GCP).</p>
<p>So recently, we developed a new major version, code-named version 2, of the web application and the API. To put version 2 to the test, we published it to the public through a subdomain such as v2.patasente.me and we left the older version accessible via patasente.me</p>
<p>Fortunately, the users have liked version two of the system; hence, there is a need to change domain names so that the newer major version will be on patasente.me, whereas the older version will be on v1.patasente.me I have two systems:</p>
<h2 id="heading-steps-i-will-most-likely-take-to-achieve-the-goal">Steps I will most likely take to achieve the goal.</h2>
<p>I believe the following are the steps that I will have to perform to ensure that we server the newer version through a patasente.me and the older version through a v1.patasente.me sub-domain with minimal or no downtime at all.</p>
<ol>
<li><p>First of all, I want to avoid as much downtime as possible. I want the system to be accessible throughout the process. The good thing is that both the old and new versions store and access data in the same database. That means if a user is using an old version or a new version, we are not worried about Data loss and synchronisation.</p>
</li>
<li><p>Create v1.patasente.me sub-domain at the domain registrar and point it to the public IP address of GCP CE instance. To do this, I will have to login to our godaddy.com account and choose the patasente.me domain name, then go to DNS and add a new A record. Since the value of the A record is the public IP address of the CE instance, I can access this from the GCP Instances listing page.</p>
</li>
<li><p>Access the CE instance via SSH. I will use the GCP's web based SSH to avoid extra steps of setting SSH client and keys.</p>
</li>
<li><p>Rename the web directory from patasente.me to v1.patasent.me and ensure that the file permissions and ownership are intact otherwise reset them.</p>
</li>
<li><p>Rename the web directory from v2.patasente.me to patasente.me and ensure that the file permissions and ownership are intact otherwise reset them.</p>
</li>
<li><p>Rename /etc/apache/sites-available/patasente.me.conf to /etc/apache/sites-available/v1.patasente.me.conf</p>
</li>
<li><p>Edit and set webroot in /etc/apache/v1.patasente.me.conf to /var/www/domains/v1.patasente.me</p>
</li>
<li><p>Disable v2.patasente.me in apache</p>
</li>
<li><p>Enable v1.patasente.me in apache</p>
</li>
<li><p>Restart Apache, and if everything is good, proceed to the next steps.</p>
</li>
<li><p>Generate an SSL certificate for v1.patasente.me domain</p>
</li>
<li><p>Delete the v2.patasente.me SSL certificates to declutter the CE Instance of unnecessary files and avoid errors at the point of renewing SSL certificates.</p>
</li>
</ol>
]]></content:encoded></item><item><title><![CDATA[Keep track of money spent on individuals that you work with to build projects and generate invoices for FREE.]]></title><description><![CDATA[Distributa: Appwrite Hashnode Hackathon
Team Details

David Wampamba @davidofug

David Anyuru @davidanyuru


Description of Project
The current invoice generator apps do not allow to keep track of project income and the amounts spent on stakeholders ...]]></description><link>https://blog.davidofug.com/keep-track-of-money-spent-on-individuals-that-you-work-with-to-build-projects-and-generate-invoices-for-free</link><guid isPermaLink="true">https://blog.davidofug.com/keep-track-of-money-spent-on-individuals-that-you-work-with-to-build-projects-and-generate-invoices-for-free</guid><category><![CDATA[Appwrite Hackathon]]></category><category><![CDATA[Appwrite]]></category><dc:creator><![CDATA[David Wampamba]]></dc:creator><pubDate>Tue, 13 Jun 2023 09:19:05 GMT</pubDate><content:encoded><![CDATA[<h1 id="heading-distributa-appwritehttpsappwriteio-hashnodehttpshashnodecom-hackathon">Distributa: <a target="_blank" href="https://appwrite.io">Appwrite</a> <a target="_blank" href="https://hashnode.com">Hashnode</a> Hackathon</h1>
<h2 id="heading-team-details">Team Details</h2>
<ul>
<li><p>David Wampamba @davidofug</p>
</li>
<li><p>David Anyuru @davidanyuru</p>
</li>
</ul>
<h2 id="heading-description-of-project">Description of Project</h2>
<p>The current invoice generator apps do not allow to keep track of project income and the amounts spent on stakeholders who have been paid to work on the project.</p>
<p>Distributa is an open-source project that solves this challenge by allowing you to record project income, the name of the individual and the portion that has been paid or is planned to be paid to individual.</p>
<p>Also allows to generate and download PDF invoices for free using an interface which is not cluttered with ads.</p>
<p>You will be able your work history without any worry about subscription fees from us.</p>
<h2 id="heading-tech-stack">Tech Stack</h2>
<p>We are going to benefit from FREE Appwrite cloud's (https://appwrite.io) authentication, database, storage and cloud functions to enable user sign up and sign in. On top of that, we are utilizing Appwrite cloud's to store data and provide history access to distributed amounts and invoices for FREE.</p>
<p>Appwrite cloud</p>
<ul>
<li><p>Authentication</p>
</li>
<li><p>Database</p>
</li>
<li><p>Storage</p>
</li>
<li><p>Cloud functions</p>
</li>
</ul>
<p>Vercel</p>
<p>React.js</p>
<p>TailwindCSS</p>
<h2 id="heading-challenges-we-faced">Challenges We Faced</h2>
<ul>
<li><p>In general, our biggest challenge is that we are new to building open-source projects, which makes it difficult to attract developers to develop the project faster and push it to users.</p>
</li>
<li><p>We need a faster and more affordable technology to work with instead of conventional technologies, which require managing and hosting a database and API and being responsible for authentication ourselves.</p>
</li>
</ul>
<h2 id="heading-public-code-repo">Public Code Repo</h2>
<p><a target="_blank" href="https://github.com/davidofug/distributa">https://github.com/davidofug/distributa</a></p>
<h2 id="heading-demo-link">Demo Link</h2>
<p><a target="_blank" href="https://youtu.be/2DP0PHjuX8I">https://youtu.be/2DP0PHjuX8I</a></p>
]]></content:encoded></item><item><title><![CDATA[5 FREE resources that got me into technical writing: Get ahead with 5]]></title><description><![CDATA[Many individuals asked me to help them become technical writers after I tweeted about my first payment.
While I may not be able to attend to each one individually, I am sharing the resources you need in this post.
1. Technical Writing For Beginners
h...]]></description><link>https://blog.davidofug.com/5-free-resources-that-got-me-into-technical-writing-get-ahead-with-5</link><guid isPermaLink="true">https://blog.davidofug.com/5-free-resources-that-got-me-into-technical-writing-get-ahead-with-5</guid><category><![CDATA[technology]]></category><category><![CDATA[technical writer]]></category><category><![CDATA[writing]]></category><category><![CDATA[Developer]]></category><category><![CDATA[Google]]></category><dc:creator><![CDATA[David Wampamba]]></dc:creator><pubDate>Tue, 21 Mar 2023 08:38:57 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/stock/unsplash/npxXWgQ33ZQ/upload/8780161715801a6c870239c2f8bc79c7.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Many individuals asked me to help them become technical writers after I tweeted about my first payment.</p>
<p>While I may not be able to attend to each one individually, I am sharing the resources you need in this post.</p>
<h2 id="heading-1-technical-writing-for-beginners">1. Technical Writing For Beginners</h2>
<p><a target="_blank" href="https://thegreatbonniee.gumroad.com/l/techwritingforbeginners">https://thegreatbonniee.gumroad.com/l/techwritingforbeginners</a></p>
<p>Learn what is Technical Writing, How to get started and the writing process I use to write Technical Articles that clients want.</p>
<h2 id="heading-2-technical-writing-course">2. Technical Writing Course</h2>
<p><a target="_blank" href="https://developers.google.com/tech-writing">https://developers.google.com/tech-writing</a></p>
<p>Every engineer is also a writer.</p>
<p>This collection of courses and learning resources aims to improve your technical documentation. Learn how to plan and author technical documents. You can also learn about the role of technical writers at Google.</p>
<h2 id="heading-3-how-googles-technical-writing-course-helped-me-become-a-better-writer">3. How Google's Technical Writing Course Helped Me Become a Better Writer</h2>
<p><a target="_blank" href="https://www.freecodecamp.org/news/what-google-taught-me-about-technical-writting/">https://www.freecodecamp.org/news/what-google-taught-me-about-technical-writting/</a></p>
<p>Google has a technical writing course that I recently completed and highly enjoyed. It takes roughly 4 hours and has some exercises along the way so you can test yourself.</p>
<p>I'm going to briefly explain what I learned from completing the course, and I'll summarize the best bits so you can get a good overview of what's covered.</p>
<p>We'll go over some grammar rules and linguistics for the English language, but I'll explain everything upfront so we're all on the same page. The only thing you need to complete the course is "a little writing proficiency in English," but "you don't have to be a strong writer."</p>
<h2 id="heading-4-five-steps-to-becoming-a-technical-writer">4. Five steps to becoming a technical writer</h2>
<p><a target="_blank" href="https://www.benjamindada.com/become-technical-writer/">https://www.benjamindada.com/become-technical-writer/</a></p>
<p>If you enjoy writing and have a knack for condensing complex information, a career in technical writing might be for you. As a software developer, starting a career in technical writing (by the side) might be a beneficial decision for your career.</p>
<h2 id="heading-5technical-writing-fundamentals">5.Technical Writing Fundamentals</h2>
<p><a target="_blank" href="https://about.gitlab.com/handbook/product/ux/technical-writing/fundamentals/">https://about.gitlab.com/handbook/product/ux/technical-writing/fundamentals/</a></p>
<p>The Technical Writing Fundamentals course is available to help both GitLab and community contributors write and edit documentation for the product. This course provides direction on grammar and topic design.</p>
<p>This class is <strong>not required</strong> to contribute to <a target="_blank" href="http://docs.gitlab.com">docs.gitlab.com</a>. Everybody can contribute!</p>
<h2 id="heading-6-remote-work-amp-internships-for-developers-designers-and-technical-writers">6. Remote Work &amp; Internships for Developers, Designers and Technical Writers.</h2>
<p>(Not FREE but affordable and worth your money)</p>
<p><a target="_blank" href="https://mbaziiraronald.gumroad.com/l/lamzm">https://mbaziiraronald.gumroad.com/l/lamzm</a></p>
<p>In this collection, you are going to find:</p>
<ul>
<li><p>100+ platforms to find remote jobs and gigs for Developers, Designers, and Technical Writers.</p>
</li>
<li><p>Pay offered by each platform per article/piece for Technical Writing gigs. Additions and Lifetime Updates to the Collection.</p>
</li>
</ul>
<h2 id="heading-conclusion">Conclusion</h2>
<p>In conclusion, there are many ways to earn in technology. And certainly, technical writing is one of the proven ways. However, it should be noted that it requires effort.</p>
<p>In this post, we've looked at the 5. Okay, six useful resources that helped me get into technical writing. I hope it helps you as well.</p>
]]></content:encoded></item><item><title><![CDATA[Unlock Your Linux Potential: 10 Essential Commands Every Developer Needs to Know]]></title><description><![CDATA[If you don't know how to use commands or have never used them before, you must use the Terminal program on your computer.
Introduction

Type the command on the terminal program. Then press Enter on your keyboard to see the output.

Command output can...]]></description><link>https://blog.davidofug.com/unlock-your-linux-potential-10-essential-commands-every-developer-needs-to-know</link><guid isPermaLink="true">https://blog.davidofug.com/unlock-your-linux-potential-10-essential-commands-every-developer-needs-to-know</guid><category><![CDATA[Linux]]></category><category><![CDATA[linux for beginners]]></category><category><![CDATA[Web Development]]></category><dc:creator><![CDATA[David Wampamba]]></dc:creator><pubDate>Mon, 13 Mar 2023 13:43:09 GMT</pubDate><content:encoded><![CDATA[<p>If you don't know how to use commands or have never used them before, you must use the Terminal program on your computer.</p>
<h2 id="heading-introduction">Introduction</h2>
<ul>
<li><p>Type the command on the terminal program. Then press Enter on your keyboard to see the output.</p>
</li>
<li><p>Command output can be modified by flags(options)</p>
</li>
<li><p>The word directory also refers to a folder</p>
</li>
<li><p>Commands are case-sensitive</p>
</li>
<li><p>Commands may require more user privileges</p>
</li>
</ul>
<h2 id="heading-the-commands">The commands</h2>
<ol>
<li><strong>cd Change Directory</strong></li>
</ol>
<p>Use this to switch the current working directory.</p>
<p><strong>Example</strong></p>
<pre><code class="lang-bash"><span class="hljs-built_in">cd</span> path/to/folder/
</code></pre>
<ol>
<li><strong>pwd (Print Working Directory)</strong></li>
</ol>
<p>Use this to see the current working directory</p>
<p><strong>Example</strong></p>
<pre><code class="lang-bash"><span class="hljs-built_in">pwd</span>
</code></pre>
<ol>
<li><strong>mkdir (Make a directory)</strong></li>
</ol>
<p>Use this to Create a new directory at the path</p>
<p><strong>Example</strong></p>
<pre><code class="lang-bash">mkdir sample-folder
</code></pre>
<ol>
<li><strong>ls (List)</strong></li>
</ol>
<p>Use this to list the items in a directory.</p>
<p><strong>Examples</strong></p>
<ol>
<li><pre><code class="lang-bash">  ls /path/to/directory
</code></pre>
</li>
<li><pre><code class="lang-bash">  ls -al /path/to/directory (This option will show you more details such as permissions)
</code></pre>
</li>
<li><p><strong>rm (Remove a directory)</strong></p>
</li>
</ol>
<p>Use this to delete a file or directory.</p>
<p><strong>Examples:</strong></p>
<ol>
<li><pre><code class="lang-bash">  rm path/to/file
</code></pre>
</li>
<li><pre><code class="lang-bash">  rm -r path/to/directory (Will remove the directory and its sub contents)
</code></pre>
</li>
<li><pre><code class="lang-bash">  rm -f path/to/file (will remove the file without prompting you to confirm)
</code></pre>
</li>
<li><p><strong>cp (Copy)</strong></p>
</li>
</ol>
<p>Use this to copy files and folders from one path to another and have multiple copies of the file.</p>
<p><strong>Quickstart Syntax:</strong></p>
<p>cp source destination</p>
<p><strong>Example</strong></p>
<pre><code class="lang-bash">cp path/to/<span class="hljs-built_in">source</span> path/to/destination
</code></pre>
<ol>
<li><strong>mv (Move)</strong></li>
</ol>
<p>Use this to move files from one path to another.<br />Since this one doesn't leave you with multiple copies of the file, it can be referred to as Rename command.</p>
<p><strong>Quickstart Syntax:</strong></p>
<p>mv source destination</p>
<p><strong>Example</strong></p>
<pre><code class="lang-bash">mv my-file.txt new-file.txt
</code></pre>
<ol>
<li><strong>ssh</strong></li>
</ol>
<p>Use this to log in to other UNIX systems on the internet and your local network.</p>
<p>This command requires you to provide a password for the user on the machine you're connecting to.</p>
<p><strong>Examples</strong></p>
<ol>
<li><pre><code class="lang-bash">  ssh username@ip
</code></pre>
</li>
<li><pre><code class="lang-bash">  ssh username@hostname -p 2223
</code></pre>
</li>
</ol>
<p>The -p is a flag that modifies the ssh command so that it can accept a custom port number.</p>
<p>Usually, servers are configured with custom ssh port numbers and the default 22 port will not work. In that case, you need to know the custom port number to connect to the server or computer you want to connect to.</p>
<p><strong>Troubleshooting</strong></p>
<p>Make sure the firewall of the remote machine allows external traffic for the ssh command on the port you specified.</p>
<ol>
<li><strong>nano</strong></li>
</ol>
<p>Use this to edit files on UNIX systems.</p>
<p><strong>Example</strong></p>
<pre><code class="lang-bash">nano myfile.txt
</code></pre>
<p>This will create myfile.txt if it doesn't exist and open it for editing.</p>
<p>Otherwise, it will open it for editing.</p>
<p>Press Control + O and Enter on the keyboard to save changes. Then Control + X to exit the nano</p>
<ol>
<li><strong>scp</strong></li>
</ol>
<p>Use this to transfer large files securely between computers.</p>
<p>It requires authentication.</p>
<p><strong>Examples</strong></p>
<ol>
<li>Upload file</li>
</ol>
<pre><code class="lang-bash">scp file.txt username@hostname:/remote/directory/
</code></pre>
<ol>
<li>Download file</li>
</ol>
<pre><code class="lang-bash">scp username@hostname:/remote/directory/file.txt .
</code></pre>
<ol>
<li>Transfer directory</li>
</ol>
<pre><code class="lang-bash">scp -r /path/to/<span class="hljs-built_in">local</span>/directory/ username@remotehost:/path/to/remote/directory/
</code></pre>
<p><strong><em>Note:</em></strong> -r in the above command. It is a flag that changes the scp command so that all the files in the directory can be uploaded.</p>
<h2 id="heading-conclusion"><strong>Conclusion</strong></h2>
<p>As you can see, commands can help you in many ways. Whether you want to manipulate files, and directories, or perform network tasks. Learning commands can also be helpful to automate certain tasks.</p>
<p>The 10 Commands we've looked at are:-</p>
<p>1. cd</p>
<p>2. pwd</p>
<p>3. mkdir</p>
<p>4. ls</p>
<p>5. rm</p>
<p>6. cp</p>
<p>7. mv</p>
<p>8. ssh</p>
<p>9. nano</p>
<p>10. scp</p>
<p>That's the end. For any questions, kindly leave them in the comment section or DM me via Twitter @davidofug</p>
]]></content:encoded></item><item><title><![CDATA[Maximize Your Efficiency in Visual Studio Code with These Productive Shortcuts.]]></title><description><![CDATA[With these productivity-boosting shortcuts, you can unleash the full power of Visual Studio Code. Whether you're a seasoned developer or just getting started, these VSCode tips will help you work faster and more efficiently. These shortcuts will stre...]]></description><link>https://blog.davidofug.com/maximize-your-efficiency-in-visual-studio-code-with-these-productive-shortcuts</link><guid isPermaLink="true">https://blog.davidofug.com/maximize-your-efficiency-in-visual-studio-code-with-these-productive-shortcuts</guid><category><![CDATA[vscodeshortcuts]]></category><category><![CDATA[Tips for Developers]]></category><category><![CDATA[Productivity Boosting]]></category><dc:creator><![CDATA[David Wampamba]]></dc:creator><pubDate>Wed, 08 Feb 2023 14:52:27 GMT</pubDate><content:encoded><![CDATA[<p>With these productivity-boosting shortcuts, you can unleash the full power of Visual Studio Code. Whether you're a seasoned developer or just getting started, these VSCode tips will help you work faster and more efficiently. These shortcuts will streamline your workflow and help you get more done in less time, from navigating the editor to managing your code. With this guide, you'll be able to work in VSCode smarter, not harder.</p>
<p>Let's dive into them.</p>
<ol>
<li><h3 id="heading-shrink-a-selection">Shrink a selection</h3>
</li>
</ol>
<p>Shift + Control + left arrow</p>
<ol>
<li><h3 id="heading-expand-a-selection">Expand a selection</h3>
</li>
</ol>
<p>Shift + Control + right arrow</p>
<ol>
<li><h3 id="heading-duplicate-the-current-line">Duplicate the current line</h3>
</li>
</ol>
<p>Command + D</p>
<ol>
<li><h3 id="heading-multiple-vertical-cursors">Multiple vertical cursors</h3>
</li>
</ol>
<p>Options + Command + Shift + Arrow down or Arrow up</p>
<ol>
<li><h3 id="heading-move-the-line-up-and-down">Move the line up and down</h3>
</li>
</ol>
<p>Options + Shift + Arrow down or Arrow up</p>
<ol>
<li><h3 id="heading-fold-a-block-of-code">Fold a block of code</h3>
</li>
</ol>
<p>Options + Command + [</p>
<ol>
<li><h3 id="heading-unfold-a-block-of-code">UnFold a block of code</h3>
</li>
</ol>
<p>Options + Command + ]</p>
<ol>
<li><h3 id="heading-toggle-terminal">Toggle Terminal</h3>
</li>
</ol>
<p>Command + J</p>
<ol>
<li><h3 id="heading-jump-to-the-start-or-end-of-the-line">Jump to the start or end of the line</h3>
</li>
</ol>
<p>Command + arrow right or arrow left</p>
<ol>
<li><h3 id="heading-select-the-whole-line">Select the whole line</h3>
</li>
</ol>
<p>Shift + Command and arrow right or left</p>
<ol>
<li><h3 id="heading-open-command-pallets">Open command pallets</h3>
</li>
</ol>
<p>Control + Shift + P</p>
<ol>
<li><h3 id="heading-focus-file-window">Focus File window</h3>
</li>
</ol>
<p>Command + Shift + E</p>
<ol>
<li><h3 id="heading-change-the-file-tab">Change the file tab</h3>
</li>
</ol>
<p>Control + Tab</p>
<ol>
<li><h3 id="heading-select-all-occurrences">Select all occurrences</h3>
</li>
</ol>
<p>Command + Control + G</p>
<ol>
<li><h3 id="heading-search-and-replace-in-all-open-files">Search and Replace in all open files</h3>
</li>
</ol>
<p>Command + Shift + H</p>
<ol>
<li><h3 id="heading-close-an-open-file">Close an open file</h3>
</li>
</ol>
<p>Command + W</p>
<ol>
<li><h3 id="heading-open-files-without-the-sidebar">Open files without the sidebar</h3>
</li>
</ol>
<p>Command + P</p>
<ul>
<li><p>Type part of the name of the file in the search.</p>
</li>
<li><p>Press Enter to open it.</p>
</li>
<li><p>Are many filenames returned? Don't panic.</p>
</li>
<li><p>Use the keyboard up and down arrow keys to select a desired file. Press Enter to open it.</p>
</li>
</ul>
<h2 id="heading-the-end">The end</h2>
<p>Did you like the shortcuts?</p>
<p>Follow @davidofug for more free content like this.</p>
]]></content:encoded></item><item><title><![CDATA[CSS Roadmap: Learn CSS from beginner to advanced]]></title><description><![CDATA[Introduction
This Roadmap will walk you through the process of learning CSS, from the fundamentals to advanced concepts. CSS (Cascading Style Sheets) is a tool for controlling the layout and appearance of web pages. It is a necessary skill for any we...]]></description><link>https://blog.davidofug.com/css-roadmap-learn-css-from-beginner-to-advanced</link><guid isPermaLink="true">https://blog.davidofug.com/css-roadmap-learn-css-from-beginner-to-advanced</guid><category><![CDATA[CSS]]></category><category><![CDATA[CSS Frameworks]]></category><dc:creator><![CDATA[David Wampamba]]></dc:creator><pubDate>Mon, 23 Jan 2023 12:03:14 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/stock/unsplash/USp4Gzr-Hdw/upload/87efd7ebc255b3799c54b1594189205a.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h2 id="heading-introduction">Introduction</h2>
<p>This Roadmap will walk you through the process of learning CSS, from the fundamentals to advanced concepts. CSS (Cascading Style Sheets) is a tool for controlling the layout and appearance of web pages. It is a necessary skill for any web developer or designer because it enables you to create visually appealing, responsive, and interactive web pages. This Roadmap is divided into three levels, Beginners, Intermediate and Advanced.</p>
<p>Beginning with the fundamentals of CSS syntax and selectors and progressing to more advanced topics like responsive design, CSS animations, and optimization techniques.</p>
<h2 id="heading-beginners">Beginners</h2>
<h3 id="heading-1-begin-with-the-fundamentals">1. <strong>Begin with the fundamentals</strong></h3>
<p>Discover CSS syntax, selectors, and properties. Learn how to link a CSS stylesheet to an HTML document and how to style various HTML elements.</p>
<h3 id="heading-2-understand-layouts">2. <strong>Understand layouts</strong></h3>
<p>Learn the box model concepts and how to use CSS to control the layout of elements on a page, including positioning and display properties.</p>
<h3 id="heading-3-learn-css-grid-and-flexbox">3. <strong>Learn CSS Grid and Flexbox</strong></h3>
<p>Understand how to use the CSS Grid and Flexbox layout systems to create flexible and responsive grid-based layouts.</p>
<h3 id="heading-4-learn-about-design">4. <strong>Learn about design</strong></h3>
<p>Discover how to use CSS to manipulate the appearance of elements such as colours, fonts, and backgrounds.</p>
<h3 id="heading-5-learn-more-about-responsive-design">5. <strong>Learn more about responsive design</strong></h3>
<p>Learn how to use CSS media queries to create responsive designs that adjust to various screen sizes and resolutions.</p>
<h3 id="heading-6-practice">6. <strong>Practice</strong></h3>
<p>Build small projects like a simple website, landing page or blog. This will help you to apply what you learn, and understand how different CSS properties and techniques work together.</p>
<h2 id="heading-intermediate">Intermediate</h2>
<h3 id="heading-1-learn-css-frameworks">1. <strong>Learn CSS frameworks</strong></h3>
<p>Learn how to use CSS frameworks like Bootstrap, TailwindCSS and Foundation to create responsive designs quickly.</p>
<h3 id="heading-2-learn-about-preprocessor">2. <strong>Learn about preprocessor</strong></h3>
<p>Learn how to write more efficient and maintainable CSS code by using preprocessors such as Sass and Less.</p>
<h3 id="heading-3-learn-css-animations">3. <strong>Learn CSS animations</strong></h3>
<p>Learn how to add motion and interactivity to your designs by using CSS transitions and animations.</p>
<h3 id="heading-4-learn-browser-compatibility">4. <strong>Learn Browser Compatibility</strong></h3>
<p>Learn about browser compatibility issues and how to use browser prefixes and fallbacks to ensure your CSS works across multiple browsers.</p>
<p>Advanced</p>
<h2 id="heading-advanced">Advanced</h2>
<h3 id="heading-1-examine-advanced-topics">1. <strong>Examine advanced topics</strong></h3>
<p>CSS variables, pseudo-classes and pseudo-elements, and the CSS: before and: after pseudo-elements are among the more advanced CSS topics covered.</p>
<h3 id="heading-2-discover-css-optimization-techniques">2. <strong>Discover CSS optimization techniques</strong></h3>
<p>Learn how to optimize your CSS code for speed and performance.</p>
<h3 id="heading-3-css-debugging-and-troubleshooting">3. <strong>CSS debugging and troubleshooting</strong></h3>
<p>Learn how to use browser developer tools and other debugging techniques to debug and troubleshoot issues with your CSS code.</p>
<h3 id="heading-4-css-accessibility">4. <strong>CSS Accessibility</strong></h3>
<p>Learn how to use CSS to create accessible and user-friendly designs, including semantic HTML, ARIA roles, and responsive design.</p>
<h3 id="heading-5-discover-the-best-css-practices-and-methodologies">5. <strong>Discover the best CSS practices and methodologies</strong></h3>
<p>Learn how to use popular methodologies such as BEM, SMACSS, and ITCSS to write more organized and maintainable CSS code.</p>
<h3 id="heading-6-css-testing-and-quality-assurance">6. <strong>CSS testing and quality assurance</strong></h3>
<p>Discover the tools and techniques available for testing and validating your CSS code, such as browser testing, and code linting.</p>
<h3 id="heading-7-css-and-seo">7. <strong>CSS and SEO</strong></h3>
<p>Discover how CSS and web design can impact search engine optimization (SEO) and how to create SEO-friendly designs.</p>
<h2 id="heading-conclusion">Conclusion</h2>
<p>Finally, learning CSS is an essential skill for any web developer or designer. Following this Roadmap will provide you with a thorough understanding of CSS, from the fundamentals to advanced concepts.</p>
<p>Let me know your thoughts in the comments below.</p>
]]></content:encoded></item><item><title><![CDATA[PHP Variable Scope]]></title><description><![CDATA[The scope of a variable in PHP is the context in which it is defined and accessible. In other words, it determines where a variable can be used in the code and whether it is accessible.
In PHP, there are two types of variable scope:
① Local scope
② G...]]></description><link>https://blog.davidofug.com/php-variable-scope</link><guid isPermaLink="true">https://blog.davidofug.com/php-variable-scope</guid><category><![CDATA[PHP]]></category><category><![CDATA[variables]]></category><category><![CDATA[Scope]]></category><category><![CDATA[Programming Tips]]></category><dc:creator><![CDATA[David Wampamba]]></dc:creator><pubDate>Sat, 17 Dec 2022 21:19:19 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1671311856757/XlvR0pZTc.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>The scope of a variable in PHP is the context in which it is defined and accessible. In other words, it determines where a variable can be used in the code and whether it is accessible.</p>
<p>In PHP, there are two types of variable scope:</p>
<p>① <strong>Local scope</strong></p>
<p>② <strong>Global scope</strong></p>
<p><strong>Local scope</strong> means that a variable defined within a function or block of code is only accessible within that function or block of code.</p>
<p>A variable defined outside of a function or block of code has a <strong>global scope</strong> and can be accessed from anywhere in the code.</p>
<p>The <strong><em>global</em></strong> keyword in PHP also allows you to access variables from the global scope within a function or block of code. This allows you to use a variable defined in the global scope within a function or block of code without having to pass it as an argument to the function.</p>
<p>Want an example of how variable scope works in PHP? Here you go.</p>
<pre><code class="lang-php"><span class="hljs-meta">&lt;?php</span>
<span class="hljs-comment">// Global scope</span>
$city_global = <span class="hljs-string">'Kampala'</span>;

<span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">myFunction</span>(<span class="hljs-params"></span>) </span>{
  <span class="hljs-comment">// Local scope</span>
  $city_local = <span class="hljs-string">'Lagos'</span>;

  <span class="hljs-keyword">echo</span> $city_local; <span class="hljs-comment">// Outputs Lagos</span>
  <span class="hljs-keyword">echo</span> $city_global; <span class="hljs-comment">// Outputs Kampala (accessing a variable from the global scope)</span>
}

myFunction();

<span class="hljs-keyword">echo</span> $city_local; <span class="hljs-comment">// Undefined variable error</span>
</code></pre>
<p>$city_global is defined in the global scope in this example and is accessible from within the myFunction function. $city_local is defined in the myFunction function and is only accessible within it. If you try to access $city_local outside of the function, an undefined variable error will occur.</p>
<pre><code class="lang-plaintext">   global scope
  ------------
  |          |
  | function |
  |          |
  ------------
     local scope
</code></pre>
<p>In this example, the <code>global scope</code> represents the main program or script that is running. The <code>function</code> represents a function defined within the program. The <code>local scope</code> represents variables that are defined within the function and are only accessible within that function.</p>
<p>Variables defined in the <code>global scope</code> are accessible to all functions and can be accessed and modified by them. Variables defined in the <code>local scope</code> are only accessible within the function in which they are defined, and they cannot be accessed or modified by functions outside of that function.</p>
<p>I hope this helps! Please let me know if you have any further questions in the comments below.</p>
]]></content:encoded></item><item><title><![CDATA[An Introduction to PHP]]></title><description><![CDATA[PHP (Hypertext Preprocessor) is a widely used server-side scripting language for web development.
It is an open-source language for creating dynamic and interactive websites.
PHP code is typically embedded in HTML pages and executed on the server rat...]]></description><link>https://blog.davidofug.com/an-introduction-to-php</link><guid isPermaLink="true">https://blog.davidofug.com/an-introduction-to-php</guid><category><![CDATA[PHP]]></category><category><![CDATA[programming languages]]></category><category><![CDATA[syntax]]></category><dc:creator><![CDATA[David Wampamba]]></dc:creator><pubDate>Tue, 13 Dec 2022 21:27:31 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1671312342427/CKHqYuQr8.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>PHP (Hypertext Preprocessor) is a widely used server-side scripting language for web development.</p>
<p>It is an open-source language for creating dynamic and interactive websites.</p>
<p>PHP code is typically embedded in HTML pages and executed on the server rather than in the web browser of the user.</p>
<p>This enables PHP to perform tasks such as database reading and writing, dynamic content generation, and user input handling.</p>
<p>PHP's support for a variety of databases and servers, including MySQL, Oracle, and Apache, is one of its most important features.</p>
<p>It also has a large developer community and a wealth of online resources, making it a popular and accessible choice for web development.</p>
<p>PHP syntax is similar to that of other programming languages, with variables, loops, and conditional statements.</p>
<p>It also has a large number of built-in functions for tasks like string manipulation, arithmetic operations, and file manipulation.</p>
]]></content:encoded></item><item><title><![CDATA[What to consider before self-hosting Supabase]]></title><description><![CDATA[What is supabase?

If you've used Firebase before, simply consider Supabase as the open-source alternative to Firebase.
That means you can actually set up a supabase instance on your computer or server.
If you want to host Supabase on your server the...]]></description><link>https://blog.davidofug.com/what-to-consider-before-self-hosting-supabase</link><guid isPermaLink="true">https://blog.davidofug.com/what-to-consider-before-self-hosting-supabase</guid><category><![CDATA[supabase]]></category><category><![CDATA[Firebase]]></category><category><![CDATA[hosting]]></category><dc:creator><![CDATA[David Wampamba]]></dc:creator><pubDate>Wed, 09 Nov 2022 09:09:24 GMT</pubDate><content:encoded><![CDATA[<p><strong>What is supabase?
</strong></p>
<p>If you've used Firebase before, simply consider Supabase as the open-source alternative to Firebase.</p>
<p>That means you can actually set up a supabase instance on your computer or server.</p>
<p>If you want to host Supabase on your server there are some things you should consider first before deciding whether to continue with the option.</p>
<p><strong>① Supabase UI 
</strong></p>
<p>Which is known as a Studio. In the cloud, this enables the management of projects in Supabase.
In self-host environments, the studio doesn't give that user experience. Setting up Supabase projects in a self-host environment requires Linux knowledge.</p>
<p><strong>② Logging into the Studio
</strong></p>
<p>The studio in the cloud allows you to sign in with GitHub.</p>
<p>In the self-hosted environment, you have to set up Basic Auth which might be bothering to set up, especially because you have to set up Basic Auth per self-hosted project.</p>
<p><strong>③ Storage
</strong></p>
<p>The supabase cloud service gives you access to storage buckets but it's not a similar thing in the self-hosted supabase environment.</p>
<p><strong>How to set up self-hosted Supabase
</strong></p>
<p>Here is the link to the resource that helped me find success after trying many others and failing. <a target="_blank" href="https://www.safyah.com/blog/self-hosting-supabase-on-ubuntu-and-digital-ocean">Click here</a></p>
<p><strong>Conclusion
</strong></p>
<p>Hope this information has been helpful.</p>
]]></content:encoded></item><item><title><![CDATA[Struggling to Get Better at Coding?]]></title><description><![CDATA[If we are living, grow we must.
But how we grow matters. As we come of age different circumstances occur. We must be willing to confront them if we are to live than just survive.
One way to achieve this is by developing your willingness.
So often as ...]]></description><link>https://blog.davidofug.com/struggling-to-get-better-at-coding</link><guid isPermaLink="true">https://blog.davidofug.com/struggling-to-get-better-at-coding</guid><category><![CDATA[reading]]></category><category><![CDATA[Developer]]></category><category><![CDATA[writing]]></category><dc:creator><![CDATA[David Wampamba]]></dc:creator><pubDate>Tue, 11 Oct 2022 07:39:09 GMT</pubDate><content:encoded><![CDATA[<p>If we are living, grow we must.</p>
<p>But how we grow matters. As we come of age different circumstances occur. We must be willing to confront them if we are to live than just survive.
One way to achieve this is by developing your willingness.
So often as we are learning to code, we’re fixated on learning to code but forget or lose focus on a few other aspects of life that would actually be of great value to the coding career.
In this issue, I want to share something that has helped me in my coding career.</p>
<h2 id="heading-reading"><strong>Reading</strong></h2>
<p>It empowers, inspires, and encourages among other things. In fact, for me, if it wasn’t for reading I wouldn’t realise my potential. I had a short stint of formal education than most people.</p>
<p>Through reading, I have gained wealth in terms of coding knowledge. As a result, I’m able to coach/mentor beginners and average developers to reach their full coding potential.</p>
<p>See, being a good coder is exciting but not as much as being a good coder earning sustainable income and in good health shape.</p>
<p>Over the years, I have read tens of thousands of technical articles, coding tutorials and HowTo guides. I consumed information about a range of topics from general computing to computer networking, cloud engineering, databases, web development, domain names, security, programming, AI, and blockchain to numerous technologies.</p>
<p>This was a blessing as well as a disadvantage.
In terms of disadvantages; I ended up building self-doubt and a lack of concentration. I couldn’t get off in Web Development as much as I desired.
I was all over the place. I was doing something right but wrongly, perhaps.</p>
<p><strong>## What have I discovered?</strong></p>
<p>For the 10+ years I have been coding, I’ve discovered to get better at Product coding one has to practice a life of balance.</p>
<p>You can choose different parts of life to focus on including but not limited to Love, Entertainment, Travel, Faith, Spiritual, Community, Education, Health, Finance, Sports, Family, Business and many others.</p>
<p>In 2016, I got an opportunity to attend Unleash Dreams. A program which focuses on personal growth and life transformation, it’s when I first encountered this concept of life balance. The same is emphasised by rich people like Bill Gates, Richard Branson, and Warren Buffet among others.</p>
<h2 id="heading-how-does-reading-help"><strong>How does reading help?</strong></h2>
<p>Without reading you can’t gain knowledge. Without knowledge, you can’t construct values upon which to shape the direction of your life, without direction you can’t focus on your passions, without passion you can’t be an influential citizen of society.
Speaking of which, your reading had better be diverse – encompassing the aspects of life you’ve identified to be the centre of your life. At Unleash Dreams we were recommended to identify a maximum of eight areas to focus on. We were also to self-evaluate and allocate an equal amount of time to each of these areas. It sounds difficult, isn’t it? If so, then the fewer areas of focus you identify the better but at least not less than three. You’re in charge.
I recommend that the least you can do in a period of 24 hours is to read something relating to all the areas of focus in your life.
This content may or may not be about self-help, self-hope, personal growth, finance, communication/presentation, promotion/marketing and branding, sports, fitness, health, family, love, travel, problem-solving, art, comics books, blogs, news articles etc.</p>
<p><strong>## What if you don’t like reading?</strong></p>
<p>What if you’re one of these people;-</p>
<ul>
<li>They don’t like reading</li>
<li>They don’t have time to read</li>
<li>They don’t know where to start</li>
<li>They don’t have books</li>
<li>They’re demotivated.</li>
<li>They get bored and never complete reading a book or a news article.</li>
</ul>
<p><strong><em>What if you tried to;-</em></strong></p>
<p>Putting in an effort and trying the suggestions below is helping me go from not reading a single book in many years of life to reading one book of 100 pages in one week if I decide to read for 5 to 15 minutes per day.
Considering that I didn’t like reading long-form content when I was young, I find this incredible.</p>
<ol>
<li>Get audiobooks and listen to them while you’re coding or having a break</li>
<li>Watch videos about interesting books</li>
<li>Join a group of readers – this is incredible for many reasons including but not limited to consistency, completing books, getting started on your own, support from the community, and networking.</li>
<li>Investing in a dictionary to help you understand the meaning of complex words found in books.</li>
<li>You grabbed the smallest book about an interesting topic and read it from end to finish.</li>
<li>Give yourself gifts whenever you complete reading a book.</li>
<li>Start with the Bible – the way the Bible is read is in form of a book/author: chapter and starting verse to ending verse. That means you can read short-form content for a long period of time and slowly get your system used to reading.</li>
</ol>
<h2 id="heading-what-are-some-of-the-benefits-of-reading-to-a-developer">What are some of the Benefits of Reading to a developer?</h2>
<ol>
<li>First and foremost, it will help you improve Product coding and shipping software.</li>
<li>Improve empathy and compassion levels</li>
<li>Improve your knowledge</li>
<li>Discover your passion and purpose</li>
<li>Helps you take action</li>
<li>Helps you complete what you started</li>
<li>Helps you make money</li>
<li>Helps you connect with like-minded people</li>
<li>Helps you learn and develop new skills</li>
<li>Helps discover ways of approaching life situations</li>
<li>Overall it is an activity that helps you develop habits</li>
</ol>
<p>Do you have some thoughts about the same? Let me know by submitting your comment below.</p>
]]></content:encoded></item><item><title><![CDATA[The simplest method for fetching a remote branch in Git.]]></title><description><![CDATA[Assume you're a team member and a developer sends you a Pull Request to merge.
The developer creates their own branches to ensure proper code tracking and code quality.
These branches will generate Pull Requests, which must be merged into the main br...]]></description><link>https://blog.davidofug.com/the-simplest-method-for-fetching-a-remote-branch-in-git</link><guid isPermaLink="true">https://blog.davidofug.com/the-simplest-method-for-fetching-a-remote-branch-in-git</guid><category><![CDATA[GitHub]]></category><category><![CDATA[#codenewbies]]></category><category><![CDATA[code review]]></category><dc:creator><![CDATA[David Wampamba]]></dc:creator><pubDate>Tue, 13 Sep 2022 12:39:57 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/unsplash/EUzk9BIEq6M/upload/v1662911451028/06Ies58ee.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Assume you're a team member and a developer sends you a Pull Request to merge.</p>
<p>The developer creates their own branches to ensure proper code tracking and code quality.</p>
<p>These branches will generate Pull Requests, which must be merged into the main branch.</p>
<p>You don't want to merge code if you're not sure if it works. To test the code, run it in an environment that is not accessible to your product's users.</p>
<p>Apart from being a Control Version System, git has some amazing features, one of which is the Fetch. That is precisely the purpose of this resource. I'll show you the simplest methods for fetching branches from remote git.</p>
<p>Let's dive in.</p>
<p>The <code>git switch</code> command is a new command to Git. The command, as the name implies, will switch to a specified local branch. Continue reading to find out more.</p>
<p><strong><em>Syntax</em></strong> </p>
<p>git switch [branch_name]</p>
<p><strong><em>Example</em></strong></p>
<p>Assuming the local branch is bar, you would</p>
<pre><code>git <span class="hljs-keyword">switch</span> bar
</code></pre><p>Something to note about the git switch is that it will fetch updates of the remote branch and save you a lot of typing time.</p>
<p>However, if the branch does not exist in the local repository, make use of two commands.</p>
<pre><code>git <span class="hljs-keyword">fetch</span>
</code></pre><pre><code>git <span class="hljs-keyword">switch</span> bar
</code></pre><p>An alternative and largely trusted method of fetching a specific branch from the remote repo is.</p>
<ol>
<li>git fetch [remote_repo_name] [remote_branch]:[local_branch]</li>
<li>git checkout [local_branch]</li>
</ol>
<p><strong><em>Example</em></strong></p>
<p>Assuming;-</p>
<ul>
<li>Remote repository alias is <strong>origin</strong></li>
<li>Remote branch name is <strong>foo</strong></li>
<li>Local branch name is <strong>bar</strong></li>
</ul>
<p>The procedure will be like the one below.</p>
<pre><code>git <span class="hljs-keyword">fetch</span> origin foo:bar
</code></pre><pre><code><span class="hljs-attribute">git</span> checkout bar
</code></pre><p>Let me know what you think about this tip. Share your thoughts in the comment section below.</p>
]]></content:encoded></item></channel></rss>