<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:cc="http://cyber.law.harvard.edu/rss/creativeCommonsRssModule.html">
    <channel>
        <title><![CDATA[Stories by 0xMarik on Medium]]></title>
        <description><![CDATA[Stories by 0xMarik on Medium]]></description>
        <link>https://medium.com/@bonsaiis-lessons?source=rss-2974105ef1ae------2</link>
        <image>
            <url>https://cdn-images-1.medium.com/proxy/1*TGH72Nnw24QL3iV9IOm4VA.png</url>
            <title>Stories by 0xMarik on Medium</title>
            <link>https://medium.com/@bonsaiis-lessons?source=rss-2974105ef1ae------2</link>
        </image>
        <generator>Medium</generator>
        <lastBuildDate>Thu, 05 Nov 2026 12:46:16 GMT</lastBuildDate>
        <atom:link href="https://medium.com/@bonsaiis-lessons/feed" rel="self" type="application/rss+xml"/>
        <webMaster><![CDATA[yourfriends@medium.com]]></webMaster>
        <atom:link href="http://medium.superfeedr.com" rel="hub"/>
        <item>
            <title><![CDATA[The Untrusted Certificate Attack: Breaking HTTPS on a Company Firewall]]></title>
            <link>https://bonsaiis-lessons.medium.com/the-untrusted-certificate-attack-breaking-https-on-a-company-firewall-c2bbe78f08bd?source=rss-2974105ef1ae------2</link>
            <guid isPermaLink="false">https://medium.com/p/c2bbe78f08bd</guid>
            <category><![CDATA[arp-spoofing]]></category>
            <category><![CDATA[ethical-hacking]]></category>
            <category><![CDATA[mitmproxy]]></category>
            <category><![CDATA[cybersecurity]]></category>
            <category><![CDATA[https]]></category>
            <dc:creator><![CDATA[0xMarik]]></dc:creator>
            <pubDate>Sat, 31 Oct 2026 13:18:54 GMT</pubDate>
            <atom:updated>2026-10-31T13:37:18.613Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*cZmywuYnW_FRelDg7v1NiA.png" /><figcaption>Thumbnail of dialog page of Firefox when it counter a self signed certificate</figcaption></figure><h3>An Untrusted Certificate Can Still Get You Breached</h3><p>We’re told the padlock means we’re safe — but what it actually confirms is that we’re talking to the right entity, the one whose name is on the certificate. HTTPS is encrypted, so whatever we send is only readable by us and whoever holds that certificate.</p><p>But encryption only protects a connection if you’re actually connected to the right server. All it takes to break that is one untrusted certificate the user clicks past — and the data in transit is still technically encrypted the whole time — it’s just encrypted to an attacker instead of the real server. The browser won’t show a padlock for a connection like that — not before the warning, and not after the user clicks past it either. It keeps marking the page as not secure for the rest of that session; clicking through only stops it from blocking the page, it doesn’t bring the padlock back.</p><p>In this lab, I position an attacker machine between a victim and a company firewall, exploit exactly that untrusted-certificate warning, and intercept a login to the firewall’s own admin dashboard — credentials and all.</p><blockquote><strong><em>This is a lab, not an invitation.</em></strong><em> Every step below was carried out against machines I own, on an isolated, host-only VMware network with no route to the internet or any production system. ARP spoofing and traffic interception against systems you don’t own or don’t have explicit written authorization to test are illegal in most jurisdictions, Morocco included. Build this to learn the mechanism and the defenses — not to point it at anything else.</em></blockquote><h3>How HTTPS Is Supposed to Work</h3><p>During a TLS handshake, the server presents its certificate to the client. The client checks whether it’s signed by a trusted Certificate Authority, that it hasn’t expired, and that its hostname matches the site being visited. If all three check out, the connection proceeds and data flows encrypted between the two parties.</p><p>The whole system rests on that first check — trust. The client isn’t verifying the server directly; it’s trusting that a CA already did. Break that chain of trust, and the protections built on top of it stop mattering.</p><h3>The Lab Setup</h3><p>To simulate a real company environment, the lab uses three machines:</p><ul><li><strong>Victim</strong> — a Windows machine, representing an employee</li><li><strong>Attacker</strong> — Kali Linux</li><li><strong>Server</strong> — a FortiGate firewall, specifically its web login portal</li></ul><p>All three sit on an isolated, host-only VMware network with no bridge to any other network. The first step is just reconnaissance — confirming each machine’s IP address on that segment.</p><h3>Step 1: Positioning the Attacker — ARP Spoofing</h3><p>To intercept traffic between the victim and the server, the attacker first needs to sit between them. ARP spoofing poisons both machines’ ARP tables: the victim is told the attacker’s MAC address belongs to the server, and the server is told the attacker’s MAC address belongs to the victim.</p><pre>sudo ettercap -T -q -i eth0 -M arp:remote /192.168.1.101// /192.168.1.100//</pre><ul><li>-T -q — text UI, quiet output</li><li>-i eth0 — the interface to attack from</li><li>-M arp:remote — launch ARP poisoning, with remote enabling interception of traffic routed through a gateway</li><li>The two /ip// arguments are the targets being poisoned against each other</li></ul><h3>Step 2: Letting Traffic Flow — IP Forwarding</h3><p>ARP spoofing alone breaks the connection rather than intercepting it — by default, the kernel drops packets addressed to an IP that isn’t its own, so without this next step the victim simply loses connectivity.</p><pre>echo 1 &gt; /proc/sys/net/ipv4/ip_forward</pre><p>This tells the kernel to forward packets it receives that aren’t addressed to itself, routing them to their real destination. The victim and server keep talking normally — every packet now just passes through the attacker first.</p><h3>Step 3: Terminating TLS — mitmweb</h3><p>Forwarding alone would just pass the victim’s traffic straight through, unmodified — still encrypted, so unreadable. To actually read HTTPS traffic, the attacker needs something that terminates TLS with the victim and opens a separate connection to the real server, relaying data between the two.</p><pre>mitmweb --mode transparent --showhost --ssl-insecure</pre><ul><li>--mode transparent — intercepts redirected traffic with no proxy configuration needed on the victim&#39;s side</li><li>--showhost — shows the original Host header rather than the proxy&#39;s own address</li><li>--ssl-insecure — skips verifying the real server&#39;s certificate on the upstream connection, needed here because the FortiGate&#39;s login portal ships with a self-signed certificate by default</li></ul><h3>Step 4: Redirecting the Traffic</h3><p>IP forwarding alone sends traffic straight past the attacker to the real server. Before that happens, port 443 traffic needs to be redirected into mitmweb’s listening port, so it stops at the proxy first.</p><pre>iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 443 -j REDIRECT --to-port 8080</pre><p>With this rule in place, TCP traffic arriving on port 443 is redirected to port 8080, where mitmweb is listening, before the kernel ever considers forwarding it onward.</p><h3>The Attack, From the Victim’s Side</h3><p>With everything running, the victim opens a browser and navigates to the firewall’s login IP. Because mitmweb is presenting its own certificate instead of the FortiGate’s — and that certificate isn’t trusted by the victim’s machine — the browser shows a warning page: untrusted certificate, possible wrong entity.</p><p>A user with no reason to be suspicious clicks through. From there, the login page loads normally, credentials are entered, and the dashboard opens — all while the attacker has already captured the credentials passing through the proxy, and can now log into the same firewall dashboard directly. A single login, on a connection the victim believed was secure, is enough to compromise the device meant to protect everything behind it.</p><h3>Red Flags a User Could Have Caught</h3><p>None of these are foolproof, and most require more attention than a routine login usually gets — but they’re worth knowing:</p><ol><li><strong>The certificate’s issuer.</strong> A proxy’s generated certificate can show telltale details, like “mitmproxy” as the issuing authority — though an attacker who clones the real certificate’s displayed fields can make this far less obvious at a glance. It won’t fix the underlying trust failure, just the field a human might read.</li><li><strong>A warning on a site you’ve visited safely before.</strong> Some browsers, Firefox notably, remember a previously accepted self-signed certificate’s public key; a warning reappearing on a site that didn’t show one before can mean the certificate changed.</li><li><strong>A different error than usual.</strong> If a site has always shown one kind of error — an expired cert, a hostname mismatch — and suddenly shows “untrusted certificate” instead, that’s a meaningfully different failure worth a second look.</li></ol><h3>What Actually Prevents This</h3><p>Red flags rely on a human noticing something they probably won’t. Two real fixes remove the decision from the user entirely:</p><ul><li><strong>Deploy a proper internal CA.</strong> When a company’s own certificate authority is installed and trusted on every host, every legitimate internal certificate verifies cleanly — and anything else is immediately flagged as untrusted, no judgment call required.</li><li><strong>Enable HSTS.</strong> HSTS has the server tell the browser, “only ever connect to me securely, for the next however many days.” Once a browser holds that instruction for a domain, it won’t just block plain HTTP — it refuses any HTTPS connection with certificate errors outright, no “proceed anyway” option at all. The warning dialog the victim clicked through in this lab simply never appears.</li></ul><h3>One Mistake We Made Too</h3><p>The same shortcut that made this attack possible is a vulnerability in its own right. --ssl-insecure told mitmweb to ignore the real server&#39;s certificate entirely — so if a second attacker were sitting between the lab&#39;s Kali machine and the real FortiGate, mitmweb would trust that attacker&#39;s certificate just as blindly, and we&#39;d become the victim in someone else&#39;s man-in-the-middle without knowing it.</p><p>The better practice is to download and verify the real server’s certificate once, then pin mitmweb to trust only that specific certificate:</p><pre>mitmweb --mode transparent --showhost --set ssl_verify_upstream_trusted_ca=/path/to/downloaded_cert.pem</pre><p>Even this isn’t airtight — if an attacker is already in the middle at the moment that certificate is downloaded, you’d be verifying their certificate instead of the real one. It’s the same trust-on-first-use weakness that shows up anywhere a credential is accepted with no independent way to confirm it. But it’s a meaningfully smaller attack surface than ignoring certificate errors by default — and a good reminder that even the tools built to demonstrate an attack can carry the same flaw they’re demonstrating.</p><p>Visit the full video at : <a href="https://youtu.be/7FYNN40fLxg">https://youtu.be/7FYNN40fLxg</a></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=c2bbe78f08bd" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Introducing Aresius: A Modern, Open-Source Interception Proxy for Web Security]]></title>
            <link>https://bonsaiis-lessons.medium.com/introducing-aresius-a-modern-open-source-interception-proxy-for-web-security-2788488e7473?source=rss-2974105ef1ae------2</link>
            <guid isPermaLink="false">https://medium.com/p/2788488e7473</guid>
            <category><![CDATA[ethical-hacking]]></category>
            <category><![CDATA[websecurity-testing]]></category>
            <category><![CDATA[pentesting]]></category>
            <category><![CDATA[aresius]]></category>
            <category><![CDATA[bug-bounty]]></category>
            <dc:creator><![CDATA[0xMarik]]></dc:creator>
            <pubDate>Sun, 13 Sep 2026 20:58:39 GMT</pubDate>
            <atom:updated>2026-09-13T20:58:39.814Z</atom:updated>
            <content:encoded><![CDATA[<h3>Rethinking the daily toolkit for security testing, research, and API exploration.</h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*HBsZ0mNdUmA6b84_dvWbcw.png" /><figcaption>A screen shot from Aresius</figcaption></figure><p>In modern web development and cybersecurity, few tools are as fundamental as the <strong>interception proxy</strong>. Whether you are a security researcher hunting for vulnerabilities, a penetration tester evaluating an enterprise platform, or a developer debugging complex API integrations, having complete visibility over HTTP and HTTPS traffic between client and server is indispensable.</p><p>Yet, despite being central to daily workflows, the software ecosystem around interception proxies has felt static for a long time. Many of the tools we rely on were designed decades ago, burdened by legacy architectures, complex interfaces, and feature sets locked behind paywalls.</p><p>I started building <strong>Aresius</strong> with a simple goal in mind: <strong>to create a modern, lightweight, and fully open-source desktop proxy that makes web inspection and security testing accessible, clean, and intuitive.</strong></p><p>Here is an overview of what Aresius is, the philosophy behind it, and how it aims to fit into your workflow.</p><h3>The Need for a Fresh Perspective</h3><p>Security testing should be focused on discovery and problem-solving, not fighting your tools. Over time, practitioners have encountered common friction points in existing solutions:</p><ol><li><strong>Heavy Footprint:</strong> Traditional desktop proxies are often demanding on system resources, making multitasking or running inside virtual machines slower than it needs to be.</li><li><strong>Artificial Barriers:</strong> Useful features like saving testing sessions or running automated payload tests without artificial rate limits are frequently restricted or difficult to configure.</li><li><strong>Cluttered User Experience:</strong> Decades of layered features often lead to dense, overwhelming user interfaces with a steep learning curve for newcomers and students.</li></ol><p>Aresius was born out of a desire for a clean slate — a standalone tool that provides the essential capabilities needed for everyday web testing, wrapped in a responsive, modern desktop experience.</p><h3>What is Aresius?</h3><p>At its core, <strong>Aresius is an HTTP/HTTPS interception proxy and testing workspace.</strong> It sits between your browser or application and the web server, allowing you to observe, inspect, tamper with, and analyze every transaction in real time.</p><p>Rather than trying to be an all-in-one kitchen sink, Aresius prioritizes speed, clarity, and the core workflows security researchers use every single day.</p><h3>Key Capabilities at a Glance</h3><h3>1. Seamless Traffic Interception</h3><p>Aresius captures outgoing requests and incoming responses on the fly. You can inspect headers, query parameters, cookies, and payloads with clarity, or pause requests in transit to modify data before it reaches the server. Certificate handling for secure HTTPS traffic is handled smoothly, getting you up and running within seconds.</p><h3>2. An Intuitive Request Replayer</h3><p>Testing web applications often involves minor, iterative modifications to see how an endpoint reacts. Aresius includes a dedicated Replayer that allows you to clone requests, tweak headers or body parameters, and send them repeatedly. A built-in side-by-side response comparison helps you instantly spot differences in status codes, headers, and reflected content.</p><h3>3. Fuzzing &amp; Input Testing</h3><p>Automated input testing is critical when searching for edge cases, injection points, or logic flaws. Aresius provides a built-in testing engine that sends multiple variations of a request using customizable payload lists, helping you quickly identify anomalous responses without artificial slowdowns.</p><h3>4. Workspace &amp; Session Persistence</h3><p>Losing your testing history at the end of a session is frustrating. Aresius allows you to save your entire workspace — including intercepted logs, replay tabs, and scope rules — into portable project files. You can close your laptop, return days later, and pick up right where you left off.</p><h3>5. Focused Scope &amp; Automation Rules</h3><p>Stay organized during targeted assessments. You can define in-scope and out-of-scope targets to filter out background noise, as well as set up automatic match-and-replace rules to modify specific headers or parameters dynamically.</p><h3>Built for Usability</h3><p>One of the guiding principles of Aresius is that powerful security tools do not have to feel clunky.</p><p>Aresius is designed as a native cross-platform application that launches instantly and respects your system’s resources. The interface is deliberately uncluttered, making it equally welcoming to:</p><ul><li><strong>Security Students &amp; Beginners</strong> practicing in labs and capture-the-flag (CTF) environments.</li><li><strong>Bug Bounty Hunters &amp; Pen Testers</strong> who want a fast, reliable tool for focused engagements.</li><li><strong>Developers &amp; QA Engineers</strong> debugging API behaviors and webhook integrations.</li></ul><h3>Committed to Open Source</h3><p>Aresius is <strong>100% free and open-source under the AGPLv3 license</strong>.</p><p>Security software thrives on community trust, transparency, and collaboration. By making Aresius open-source, the project ensures that anyone can inspect the code, suggest improvements, build extensions, and contribute to its evolution.</p><h3>Looking Ahead</h3><p>Aresius is an active, evolving project. The roadmap includes expanding automation capabilities, visual mapping of application logic flows, and exploring an extensible plugin ecosystem so the community can build custom workflows.</p><p>Whether you’re looking for an alternative to your current proxy, a dedicated tool for your learning labs, or an open-source project to contribute to, I invite you to explore Aresius.</p><ul><li><strong>Explore the Code &amp; Releases on GitHub:</strong> <a href="https://github.com/0xMarik/Aresius">github.com/0xMarik/Aresius</a></li><li><strong>Join the Discussion:</strong> <a href="https://reddit.com/r/aresius">r/aresius</a></li></ul><p><em>Feedback, ideas, and contributions are always welcome!</em></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=2788488e7473" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Game Of Life Now Speaks MCP: Let Your AI Build Your Routines, Schedules, and Goals]]></title>
            <link>https://bonsaiis-lessons.medium.com/game-of-life-now-speaks-mcp-let-your-ai-build-your-routines-schedules-and-goals-1839c17fdff6?source=rss-2974105ef1ae------2</link>
            <guid isPermaLink="false">https://medium.com/p/1839c17fdff6</guid>
            <category><![CDATA[habits]]></category>
            <category><![CDATA[productivity]]></category>
            <category><![CDATA[ai-agent]]></category>
            <category><![CDATA[mcp-server]]></category>
            <category><![CDATA[habit-tracker]]></category>
            <dc:creator><![CDATA[0xMarik]]></dc:creator>
            <pubDate>Sat, 12 Sep 2026 14:39:49 GMT</pubDate>
            <atom:updated>2026-09-12T14:42:42.123Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*zzwRhPInHAeT7OGEh1RsAQ.png" /><figcaption>A screen short from demo video</figcaption></figure><p><strong>A new integration that turns any MCP-compatible AI assistant into your personal Game Of Life planner.</strong></p><p>For a while now, Game Of Life has helped people turn their daily grind into something structured, motivating, and actually manageable — tasks, habits, goals, all in one place. But there was always one extra step: <em>you</em> still had to open the app and do the planning yourself.</p><p>That changes today.</p><h3>Introducing MCP Support</h3><p>We’ve integrated <strong>MCP (Model Context Protocol)</strong> directly into Game Of Life. In plain terms: your AI assistant can now talk to Game Of Life the same way it talks to you — and act on your behalf inside the app.</p><p>No copy-pasting. No switching tabs. No manually building out your week task by task.</p><p>You just tell your AI assistant what you want, and it handles the rest — inside Game Of Life.</p><h3>What This Looks Like in Practice</h3><p>In our demo video, we show the integration doing three things end-to-end:</p><ul><li><strong>Building a routine</strong> — the AI creates a structured routine with a specific schedule, slotting in the times and frequency that make sense for the goal at hand.</li><li><strong>Setting goals</strong> — the AI adds concrete goals directly into the app, no manual form-filling required.</li><li><strong>Doing it all through conversation</strong> — every step happens through natural back-and-forth with the assistant, not through menus and settings screens.</li></ul><p>The result: a fully planned routine and goal structure, built by AI, living inside the same Game Of Life app you already use to track your progress.</p><h3>Why This Matters</h3><p>Productivity tools have always asked users to do two jobs: figure out <em>what</em> they want to achieve, and then do the tedious work of <em>setting it all up</em>. MCP support removes that second job entirely.</p><p>This is part of a broader shift happening across software right now — apps aren’t just being <em>used</em> by AI assistants, they’re being <em>operated</em> by them. Game Of Life is one of the first habit and productivity tools to make that real, rather than theoretical.</p><h3>What’s Next</h3><p>This is the first step toward making Game Of Life fully AI-native. We’re already exploring deeper integrations — from adaptive routines that adjust themselves based on your progress, to AI-suggested goals based on patterns in your existing habits.</p><p>If you want to see the MCP integration in action, check out the full demo video <a href="https://www.youtube.com/watch?v=EtVrFa3jj-A">https://www.youtube.com/watch?v=EtVrFa3jj-A</a>.</p><iframe src="https://cdn.embedly.com/widgets/media.html?src=https%3A%2F%2Fwww.youtube.com%2Fembed%2FEtVrFa3jj-A%3Ffeature%3Doembed&amp;display_name=YouTube&amp;url=https%3A%2F%2Fwww.youtube.com%2Fwatch%3Fv%3DEtVrFa3jj-A&amp;image=https%3A%2F%2Fi.ytimg.com%2Fvi%2FEtVrFa3jj-A%2Fhqdefault.jpg&amp;type=text%2Fhtml&amp;schema=youtube" width="854" height="480" frameborder="0" scrolling="no"><a href="https://medium.com/media/c56e51bc4b22811235193a1ab7e66b06/href">https://medium.com/media/c56e51bc4b22811235193a1ab7e66b06/href</a></iframe><p>And if you’re curious about building with MCP yourself, or you’re an AI assistant developer looking to integrate with Game Of Life, reach out — we’d love to collaborate.</p><p><em>Game Of Life is available on </em><a href="https://gameoflife-next.vercel.app"><em>https://gameoflife-next.vercel.app </em></a><em>. Follow us for more updates as we continue building the AI-native future of productivity.</em></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=1839c17fdff6" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Higher Education Is Broken: Choosing Your Future Shouldn’t Be This Random]]></title>
            <link>https://bonsaiis-lessons.medium.com/higher-education-is-broken-choosing-your-future-shouldnt-be-this-random-f815c2c017a0?source=rss-2974105ef1ae------2</link>
            <guid isPermaLink="false">https://medium.com/p/f815c2c017a0</guid>
            <category><![CDATA[higher-education]]></category>
            <category><![CDATA[systeme-educatif]]></category>
            <category><![CDATA[advice]]></category>
            <category><![CDATA[education]]></category>
            <category><![CDATA[learning]]></category>
            <dc:creator><![CDATA[0xMarik]]></dc:creator>
            <pubDate>Mon, 29 Dec 2025 13:34:24 GMT</pubDate>
            <atom:updated>2025-12-29T13:34:24.381Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="A video shot from serveilllance camera shows a woman walking on stress and accidently get in a garage while it is closing" src="https://cdn-images-1.medium.com/max/1024/0*smhGkERx26wZmpeU.gif" /><figcaption>A video shot from surveillance camera shows a woman walking on stress and accidentally get in a garage while it is closing</figcaption></figure><p>This meme gives an idea about today’s article: it’s about how students select their major after high school.</p><p>other one</p><figure><img alt="a screen shot photo for Instagram choosing the song with text “In this step, I’m focusing on chosing the right part more carefully than I did with my major”" src="https://cdn-images-1.medium.com/max/1024/0*9GO1fadaNmqxv0Ts.png" /><figcaption>a screen shot photo for Instagram choosing the song with text “In this step, I’m focusing on choosing the right part more carefully than I did with my major”</figcaption></figure><p>Let be honest: choosing a part of a song in instagram is easier than choosing a major in college. the process of choosing a major in higher education is often chaotic and stressful. Many students find themselves lost in a sea of options students are less mature at the end of their hight school years, and they often lack the guidance and support needed to make informed decisions about their future. This article explores the challenges students face in selecting their majors and how these issues can lead to a sense of chaos in their educational journey.</p><h3>Introduction: A Life Path in Chaos</h3><p>Imagine your life path being chosen randomly, without guidance or support. After getting your bac, if you don’t hear about available schools, it’s like a whole path of life just disappears — maybe a path you could have loved. Many universities and educational services seem unaware — or maybe they just don’t care — that leaving students in this confusing period only adds more stress.</p><h3>Problems Students Face</h3><p><strong>1. Confusing and inconsistent application processes</strong><br> Every school posts its announcements on a different platform, demanding the same information in slightly different ways. JPEG here, PDF there, sometimes combined, sometimes separate, sometimes specific resolutions, sometimes specific sizes. Add in calculating grades and other requirements — it’s overwhelming.</p><p><strong>2. Platforms and security risks</strong><br> Some of these platforms have been hacked, leaking personal information. Imagine applying to your dream program and then having your personal data exposed. It’s terrifying and completely unnecessary.</p><p><strong>3. Priority and fairness issues</strong><br> There’s also “monopolization” — students who get 18/20 and 19/20 and occupy every spot, leaving others on waiting lists. Students end up unsure if they’ll get a chance at all.</p><p><strong>4. Poor communication</strong><br> Students often don’t even get a confirmation. Just a simple bot that says, “We hear you” would be helpful. Even better if it explains why an application was rejected — it would make things not just much less stressful but also more helpful.</p><p><strong>5. Exam scheduling conflicts</strong> Sometimes exams for different programs are scheduled on the same day. Students are forced to sacrifice one path for another. Why can’t they give students a chance at both?</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=f815c2c017a0" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Why 90% of Online Courses Go Unfinished (And How I Built a Solution)]]></title>
            <link>https://bonsaiis-lessons.medium.com/why-90-of-online-courses-go-unfinished-and-how-i-built-a-solution-a5663e2679e9?source=rss-2974105ef1ae------2</link>
            <guid isPermaLink="false">https://medium.com/p/a5663e2679e9</guid>
            <category><![CDATA[learning]]></category>
            <category><![CDATA[personal-development]]></category>
            <category><![CDATA[startup]]></category>
            <category><![CDATA[productivity]]></category>
            <category><![CDATA[habits]]></category>
            <dc:creator><![CDATA[0xMarik]]></dc:creator>
            <pubDate>Fri, 19 Dec 2025 20:31:34 GMT</pubDate>
            <atom:updated>2025-12-19T20:31:34.187Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*ZJgPmOPpMGSNI8OpKrHesg.png" /><figcaption>This image is generated by ChatGPT giving the impression of someone tired at the beginning of a run</figcaption></figure><p><strong>The Problem We All Know Too Well</strong></p><p>You buy a course. You’re excited. The first few lessons? Amazing. You’re learning, you’re motivated, you’re finally going to master Python or something.</p><p>Then… life happens.</p><p>A week passes. Then two. The course sits there, mocking you from your bookmarks. You’ve completed 3 out of 30 hours. Sound familiar?</p><p>Here’s the thing: it’s not about the quality of the course. It’s not even about your interest level. The modern world has fundamentally changed how we focus, and traditional online courses haven’t caught up.</p><p><strong>Why Finishing Courses Has Become Nearly Impossible</strong></p><p>The problem isn’t you — it’s the format. We’re trying to consume 30-hour courses in a world optimized for 30-second videos. Our attention spans haven’t gotten worse; our environment has gotten infinitely more distracting.</p><p>But there’s another issue nobody talks about: <strong>courses don’t fit into your actual life.</strong></p><p>Most platforms just give you a “Start Course” button and wish you luck. They don’t ask:</p><ul><li>When do you actually have time to learn?</li><li>What does your typical week look like?</li><li>Where does learning fit between work, family, and everything else?</li></ul><p>I’ve tried everything:</p><ul><li>Setting reminders (ignored them)</li><li>Blocking distracting websites (found new ones)</li><li>Telling friends about my goals (added pressure, didn’t help)</li><li>Downloading productivity apps (collected dust on my phone)</li></ul><p>None of it worked because they all missed the core issue: <strong>long-form learning needs structure, accountability, and a system that works <em>with</em> your actual schedule, not against it.</strong></p><p><strong>So I Built My Own Solution</strong></p><p>After abandoning my 5th course, I decided enough was enough. If I couldn’t find a platform that actually helped me finish courses, I’d build one.</p><p>Here’s what I created: a routine-based learning platform that transforms course completion from a test of willpower into a sustainable habit that fits your real life.</p><p><strong>How It Works:</strong></p><p><strong>Weekly Scheduling That Adapts to Your Life</strong> Before you even start, the platform asks: when can you actually do this? You design your learning week based on your reality — maybe Monday and Wednesday evenings, Saturday mornings, or whatever works for you. The course fits into your life, not the other way around.</p><p><strong>Routine-Based Learning</strong> Instead of facing a 30-hour mountain, you build a weekly learning routine. The platform tracks every scheduled session and turns consistency into your competitive advantage. You’re not trying to find time to learn; learning already has its time.</p><p><strong>Real-Time Progress Tracking</strong> See exactly how much time you’ve invested and how you’re tracking against your own schedule. No shame, no comparison to others — just you versus your plan.</p><p><strong>Streak System</strong> Hit your scheduled sessions? Your streak grows. Miss one? You see what’s at stake. The platform makes your progress visible and meaningful, all based on the schedule you created.</p><p><strong>Smart Skip System</strong> Life happens — meetings run late, kids get sick, emergencies pop up. You can skip scheduled sessions, but there’s a catch: skips are earned through coins you collect by checking off completed routines. This creates a natural balance: consistency gives you the flexibility you need when life gets chaotic.</p><p><strong>Built for Real Life</strong></p><p>This isn’t about grinding harder or “finding” more time. It’s about being honest with yourself upfront: <strong>“I can realistically dedicate Tuesday and Thursday evenings to this.”</strong></p><p>Then the platform holds you to that commitment while giving you the tools to adapt when necessary.</p><p>The platform doesn’t guilt you for being human. Instead, it gamifies consistency, makes progress tangible based on YOUR schedule, and gives you the flexibility to adapt without losing momentum.</p><p><strong>The Difference</strong></p><p>Traditional platforms: “Here’s 30 hours of content. Good luck!”</p><p>This platform: “When can you learn? Let’s build a weekly routine that actually works and track your commitment to it.”</p><p><strong>The Result</strong></p><p>I have completed more that 40 courses, Using the platform it helped also in my studies and my projects.</p><p><strong>Try It Yourself</strong></p><p>sign in with your google account and give it a shot: <a href="https://gameoflife.ma">https://gameoflife.ma</a></p><p>Because finishing what you start shouldn’t require finding time you don’t have.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=a5663e2679e9" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[That’s Not a Terminal — The Truth About Linux Terminals]]></title>
            <link>https://bonsaiis-lessons.medium.com/thats-not-a-terminal-the-truth-about-linux-terminals-306fef7ddafb?source=rss-2974105ef1ae------2</link>
            <guid isPermaLink="false">https://medium.com/p/306fef7ddafb</guid>
            <category><![CDATA[history]]></category>
            <category><![CDATA[linux-tutorial]]></category>
            <category><![CDATA[terminal]]></category>
            <category><![CDATA[linux]]></category>
            <category><![CDATA[unix]]></category>
            <dc:creator><![CDATA[0xMarik]]></dc:creator>
            <pubDate>Wed, 17 Dec 2025 12:53:14 GMT</pubDate>
            <atom:updated>2025-12-17T12:53:14.998Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="A screen shot of ubuntu terminal with an arrow pointing at a terminal saying “This is NOT a terminal”" src="https://cdn-images-1.medium.com/max/1024/1*bjcInorW1Ud0s9CEmXh3dw.jpeg" /><figcaption>Thumbnail image</figcaption></figure><h3>That’s Not a Terminal — The Truth About Linux Terminals</h3><p>What if I told you… this is not a terminal?<br>What you’re looking at is an emulator.<br>And the real terminal? It used to be a physical machine.</p><p><strong>Let me show you the real story behind what we still call ‘the terminal’ today.</strong></p><iframe src="https://cdn.embedly.com/widgets/media.html?src=https%3A%2F%2Fwww.youtube.com%2Fembed%2Fvm2yxjMZAtw%3Ffeature%3Doembed&amp;display_name=YouTube&amp;url=https%3A%2F%2Fwww.youtube.com%2Fwatch%3Fv%3Dvm2yxjMZAtw&amp;image=https%3A%2F%2Fi.ytimg.com%2Fvi%2Fvm2yxjMZAtw%2Fhqdefault.jpg&amp;type=text%2Fhtml&amp;schema=youtube" width="854" height="480" frameborder="0" scrolling="no"><a href="https://medium.com/media/44c08a5f71f5c9569f35f21d1483b5a6/href">https://medium.com/media/44c08a5f71f5c9569f35f21d1483b5a6/href</a></iframe><p>let’s go back in time. In 70s,</p><p>Computers were massive, expensive mainframes that cost millions of dollars. No one could afford a personal computer, so these mainframes had to be shared between multiple users.</p><figure><img alt="Two images of old mainframes huge that took space" src="https://cdn-images-1.medium.com/max/1024/1*F6Sc9bVasyC9-R2A3CGeSw.jpeg" /><figcaption>I photo of two old mainframe that were used in the 70s</figcaption></figure><p>The solution? <strong>Terminals</strong>. A terminal was a simple device — just a keyboard, a monitor, and a serial cable connection. No CPU, no RAM, no motherboard, no hard disk. Nothing.</p><p>Just an Input from the keyboard and Output to screen</p><figure><img alt="An illustration of a terminal with a keyboard that has two arrow one pointing to screen saying that is an output, and the other pointing to the keyboard saying the is Input" src="https://cdn-images-1.medium.com/max/1024/1*DStejt9v7Tz6mxZYAU0dLg.jpeg" /><figcaption>Illustration of a terminal</figcaption></figure><p>One famous example is the <strong>VT-100 terminal</strong></p><figure><img alt="A photo of an old terminal called VT-100" src="https://cdn-images-1.medium.com/max/1024/1*jp6-P1w6bm9rmvtyTBRc-A.jpeg" /><figcaption>A photo of VT-100</figcaption></figure><p>It would connect via serial cable to a central mainframe computer — like a VAX-11 — and that mainframe would do all the actual computing.</p><figure><img alt="A schema that represent 6 terminals each linked to a mainframe that connected to a mainframe" src="https://cdn-images-1.medium.com/max/1024/1*eSRf2SONskLnyh1LSZA--w.jpeg" /><figcaption>Terminals connected to a mainframe VAX-11</figcaption></figure><p>These devices were called ‘terminals’ because they were the terminal point — the endpoint — where users interacted with the computer</p><p>And something else a ‘TTY’, which you’ll see everywhere in Linux, stands for <strong>‘teletypewriter’</strong> — those were even older machines that literally printed output on paper before monitors existed!</p><figure><img alt="An old photo of an old teletypewriter machine" src="https://cdn-images-1.medium.com/max/1024/1*vqYGEBf5Z9bn-N1uqhOq0g.jpeg" /><figcaption>A photo of teletypewriter</figcaption></figure><p>So the terminal was just your window into the system. As this photo show how they worked.</p><figure><img alt="I video show two persons using mainframe one using terminals and other fixing something in the mainframe" src="https://cdn-images-1.medium.com/max/1024/1*GTSowVDW4s8D7Ubc0u51Kg.jpeg" /><figcaption>How it used to work with terminal</figcaption></figure><p>Even though physical terminals are obsolete today, the <strong>concept</strong> of terminals still exists in Linux. The Linux operating system has software that can communicate with terminal devices, and it offers ways to access that functionality both physically and virtually.</p><figure><img alt="A schema represent show an arrow to a physical console as the old way and the new way is using a software that point to a virtuale console whithin the system" src="https://cdn-images-1.medium.com/max/1024/1*FvdKScKmUnHpoqnEn0KYgA.jpeg" /><figcaption>Schema showing changing from physical console to virtual ones</figcaption></figure><p>Let me show you what’s actually running on a Linux system right now.</p><p><em>[Let’s press Ctrl + Alt + F3]</em></p><p>This screen is called a <strong>virtual console</strong>.</p><p>I’ll enter my username and password — and this is exactly how Linux systems were used years ago: no windows, no mouse, just pure text.</p><p>If I run the command tty, it tells me which terminal I’m connected to.<br>As you can see, I’m on <strong>tty3</strong>.</p><figure><img alt="A black screen showing the virtual console of a Ubuntu system" src="https://cdn-images-1.medium.com/max/1024/1*KV-aNWNxQZPvdg17qApviA.png" /><figcaption>A black screen showing the virtual console of a Ubuntu system</figcaption></figure><p>What’s interesting is that this isn’t a separate physical device.<br>There’s only one keyboard and one screen —</p><p>but Linux <strong>virtually splits them</strong> into multiple independent consoles.</p><p>These virtual consoles are <strong>text-mode login sessions built directly into the Linux kernel</strong>.</p><p>You can switch between them using <strong>Ctrl + Alt + F1 through F6</strong>, and each one runs independently in the background — even while a graphical desktop is active.</p><p>Before graphical environments existed, <strong>this was Linux and it still applied in version that don’t require a graphical environment like Ubuntu server</strong>.</p><p>Now let me open what you probably use every day:<br> a <strong>terminal emulator</strong>.</p><p>Let’s run the same command again: tty.</p><figure><img alt="Showing screenshot of an Ubuntu desktop with a terminal emulator opened and the command tty with the result /dev/pts/0" src="https://cdn-images-1.medium.com/max/1024/1*mDKgfOcNzo_gxp_vs2QS_g.png" /><figcaption>A terminal emulator file system</figcaption></figure><p>This time, instead of tty3 or tty4, we get something like <strong>/dev/pts/0</strong>.</p><p>This tells us we’re no longer on a virtual console.</p><p>What you’re looking at now is a <strong>terminal emulator</strong> — a graphical application that <strong>simulates a terminal in software</strong>.</p><p>If you check the application menu on some Linux distributions, you’ll literally see it named <strong>“Terminal Emulator.”</strong></p><figure><img alt="A screenshot of Kali desktop menu that shows the naming of terminal is terminal emulator" src="https://cdn-images-1.medium.com/max/1024/1*8rpAYrxa_k4HG-l38fWfFQ.png" /><figcaption>In Kali a terminal is named as Terminal Emulator</figcaption></figure><p>Now you know why.</p><figure><img alt="A screenshot of several terminal emulators" src="https://cdn-images-1.medium.com/max/1024/0*NVnvgnwLLOK5byCX" /><figcaption>A screenshot of several terminal emulators</figcaption></figure><p>These programs are emulating the behavior of <strong>old physical terminals</strong>,<br> but instead of real hardware, they use <strong>pseudo-terminals</strong>.</p><p>That’s what <strong>pts</strong> stands for: <strong>Pseudo-Terminal Slave</strong>.</p><p>Each terminal window you open gets its own device file:<br> /dev/pts/0,1,2, and so on.</p><p>So while it looks similar to a virtual console, it’s actually a <strong>GUI program talking to the kernel through a virtual device</strong>.</p><p>So what’s the relationship between virtual consoles and terminal emulators?</p><figure><img alt="A schema that represent where the virutal console are in the system as they are a part of the kernel, and the temrinal emulators as they are app on GUI" src="https://cdn-images-1.medium.com/max/1024/1*xU6jCXQPWf8M50yvaRupLA.jpeg" /><figcaption>Virtual console is a part of the Kernel and the Terminal emulator is a GUI app</figcaption></figure><p>They’re actually <strong>siblings</strong> — two different ways to achieve the same goal: giving you a text interface to communicate with Linux.</p><p><strong>Virtual consoles</strong> are implemented directly in the kernel. No GUI needed. They’re your emergency backup — if your graphical desktop crashes, you can always press <em>Ctrl+Alt+F2</em> and still access your system. You can see it a lot in servers version where GUI is not installed. Like Ubuntu server as we said before.</p><p><strong>Terminal emulators in the other hand</strong> are GUI applications that run inside your desktop environment. They’re more convenient for daily use, but if your GUI crashes, they go away too.</p><p>Here’s the beautiful part: <strong>from the shell’s perspective, it doesn’t matter!</strong> Whether you’re in virtual console or terminal emulator, the shell just sees a terminal device and works exactly the same way.</p><figure><img alt="A meme showing a astraunat saying earth as a file and saying “Wait it’s all File” and the other astraunaut saying “Always has been” pointing a gun to him" src="https://cdn-images-1.medium.com/max/1024/1*iM-1-Z9L7Gp3ctPgaoPCxA.jpeg" /><figcaption>Everything is a file</figcaption></figure><p>There’s a well-known concept in Linux: <strong>“Everything is a file.”</strong></p><p>That doesn’t just apply to regular files like documents or scripts — <br> it also applies to <strong>devices</strong>.</p><p>Keyboards, disks, screens… and <strong>terminals are no exception</strong>.</p><p>In Linux, terminals are represented as <strong>device files</strong>.</p><p>Virtual consoles appear as: <strong>/dev/tty1, /dev/tty2, and so on.</strong></p><p>Terminal emulators, on the other hand, use: <strong>/dev/pts/0, /dev/pts/1, etc.</strong></p><p>This file-based design is what makes Unix-like systems so powerful — programs don’t talk to hardware directly; they just <strong>read from and write to files</strong>.</p><figure><img alt="A schema that have two arrow the upper one has the user and an arrow to device and a X beside a Linux logo and the bottom one has an arrow from the user to a file saying read and write and then from file to device saying Kernel-managed and a Checked beside a Linux" src="https://cdn-images-1.medium.com/max/1024/1*lt6pG_DmcTaMAxH5MvQb5A.jpeg" /><figcaption>The right way to interact with devices</figcaption></figure><p>So next time you open a terminal, remember that you’re just <strong>interacting with these device files</strong>.</p><p>If you found this helpful, go subscribe to the channel <a href="https://www.youtube.com/@AsgardTech">https://www.youtube.com/@AsgardTech</a>, hit the like button, and drop a comment that you came from medium, see you in the next one.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=306fef7ddafb" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Understanding Linux Redirection: >, 2>, &>, and <]]></title>
            <link>https://bonsaiis-lessons.medium.com/understanding-linux-redirection-2-and-be98484d4f03?source=rss-2974105ef1ae------2</link>
            <guid isPermaLink="false">https://medium.com/p/be98484d4f03</guid>
            <category><![CDATA[linux-commands]]></category>
            <category><![CDATA[command-line]]></category>
            <category><![CDATA[linux]]></category>
            <category><![CDATA[coding]]></category>
            <category><![CDATA[unix]]></category>
            <dc:creator><![CDATA[0xMarik]]></dc:creator>
            <pubDate>Tue, 09 Dec 2025 13:24:07 GMT</pubDate>
            <atom:updated>2025-12-09T13:24:07.756Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="An image contains What’s the difference &gt; 2&gt; &amp;&gt; &lt;" src="https://cdn-images-1.medium.com/max/1024/1*6bawRF7aXbyaneSShJNLmg.jpeg" /><figcaption>Overview image</figcaption></figure><p>Hello everyone, have you ever wondered what these symbols — &gt;, 2&gt;, &amp;&gt;, and &lt; — are used for in Linux and Unix-like systems?</p><p>If not, this blog is for you.</p><p>We are going to explore how these <strong>redirection operators</strong> work in the Linux terminal.</p><iframe src="https://cdn.embedly.com/widgets/media.html?src=https%3A%2F%2Fwww.youtube.com%2Fembed%2FzWf23KKuDOo%3Ffeature%3Doembed&amp;display_name=YouTube&amp;url=https%3A%2F%2Fwww.youtube.com%2Fwatch%3Fv%3DzWf23KKuDOo&amp;image=https%3A%2F%2Fi.ytimg.com%2Fvi%2FzWf23KKuDOo%2Fhqdefault.jpg&amp;type=text%2Fhtml&amp;schema=youtube" width="854" height="480" frameborder="0" scrolling="no"><a href="https://medium.com/media/ab4e04124e6b4066cdb4e9c6f522075c/href">https://medium.com/media/ab4e04124e6b4066cdb4e9c6f522075c/href</a></iframe><h3>A Simple Example to Begin</h3><p>Take a look at these codes:</p><pre>#include&lt;stdio.h&gt;<br>int main() {<br>    printf(&quot;Hello, World!\n&quot;);<br>    return 0;<br>}</pre><pre>print(&quot;Hello, World!\n&quot;)</pre><p>We all run them at least once, and most people think: <em>“Yeah, it prints text to the terminal, right?”</em><br> Well… yes, but not exactly, because behind the scenes your program is <strong>not talking directly to the terminal</strong>, but through <strong>streams</strong>.</p><h3>What Are Streams?</h3><p>Before we dive into redirection, let’s understand streams. In Unix-like systems, every program has three standard streams:</p><h3>0 — Standard Input (stdin)</h3><p>Receives data from your keyboard or from other programs through pipes.</p><h3>1 — Standard Output (stdout)</h3><p>Where normal program output goes.</p><h3>2 — Standard Error (stderr)</h3><p>Used specifically for error messages and diagnostics.</p><p>These numbers (0, 1, 2) are called <strong>file descriptors</strong>, and they are the key to understanding redirection.</p><h3>Standard Input (stdin)</h3><p>In Python, you read from stdin using the input() function:</p><pre>name = input()</pre><p>In C, you use scanf:</p><pre>scanf(&quot;%s&quot;, name);</pre><h3>The shell gives us two main ways to provide input:</h3><ul><li><strong>Pipes (</strong><strong>|)</strong><br> Example:<br> cat ./file.txt | grep &quot;something&quot;<br> Sends the file contents to grep.</li><li><strong>Redirection </strong><strong>&lt;</strong><br> Example:<br> cat &lt; ./file.txt<br> Makes cat read from the file instead of the keyboard.</li></ul><h3>Standard Output (stdout)</h3><p>In Python, we use print():</p><pre>print(&quot;Enter a filename&quot;)</pre><p>In C, we use printf().</p><h3>Standard Error (stderr)</h3><p>Stderr is for errors and diagnostics.</p><ul><li>In Python:</li></ul><pre>import sys<br>print(&quot;Error happened!&quot;, file=sys.stderr)</pre><ul><li>In C:</li></ul><pre>fprintf(stderr, &quot;Error happened!&quot;);</pre><p>The key point is: <strong>stderr is separate from stdout</strong>, so you can redirect each of them differently.</p><h3>Why Streams Matter</h3><p>Because they are directly connected to the symbols:</p><p>&gt;, 2&gt;, &amp;&gt;</p><p>These are <strong>redirection operators</strong> that redirect output from the terminal to a file — but <strong>not all of them redirect the same stream</strong>.</p><h3>Redirection Operators Explained</h3><h3>1. &gt; or 1&gt; — Redirect stdout</h3><p>command &gt; output.txt<br> Redirects <strong>stdout</strong> (file descriptor 1).</p><h3>2. 2&gt; — Redirect stderr</h3><p>command 2&gt; errors.txt<br> Redirects <strong>stderr</strong> (file descriptor 2).</p><h3>3. &amp;&gt; — Redirect both stdout and stderr</h3><p>Redirects <strong>both streams</strong> into the same file.<br> Very useful for logging everything.</p><h3>Example Program</h3><pre>#include &lt;stdio.h&gt;<br>int main () {<br>    printf(&quot;Enter a file name:\n&quot;);         // goes to stdout<br>    fprintf(stderr, &quot;Error happened!&quot;);      // goes to stderr<br>    return 0;<br>}</pre><h3>Python version:</h3><pre>import sys<br><br>print(&quot;Enter a file name:&quot;)           # stdout<br>print(&quot;Error happened!&quot;, file=sys.stderr)   # stderr</pre><p>This prints:</p><ul><li><strong>“Enter a file name:”</strong> → stdout</li><li><strong>“Error happened!”</strong> → stderr</li></ul><p>When we run the program normally, <strong>both stdout and stderr appear on the terminal</strong>.</p><figure><img alt="A screenshot of terminal showing python and C programs executing a script to the terminal" src="https://cdn-images-1.medium.com/max/952/1*8L2tvn4VhotNlgtR64E1pQ.png" /><figcaption>A screenshot of terminal showing python and C programs executing a script to the terminal</figcaption></figure><p>Redirecting stdout:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/953/1*1k2mUUdZBoMIqYLlut483g.png" /><figcaption>A screenshot of terminal showing python and C programs executing a script that is redirected by &gt; to a file</figcaption></figure><p>Terminal shows only stderr.<br>File contains stdout.</p><p>Redirecting stderr:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/952/1*L7DKkYa7bEIjACanEjl5Mg.png" /><figcaption>A screenshot of terminal showing python and C programs executing a script that is redirected by 2&gt; to a file</figcaption></figure><p>Terminal shows only stdout.<br>File contains stderr.</p><p>Redirecting both:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/951/1*RdMCm4Ee5mmOdapEQ_KLBQ.png" /><figcaption>A screenshot of terminal showing python and C programs executing a script that is redirected by &amp;&gt; to a file</figcaption></figure><p>Terminal shows nothing.<br>File contains both stdout and stderr.</p><h3>Appending Instead of Overwriting (&gt;&gt;, 2&gt;&gt;, &amp;&gt;&gt;)</h3><p>There is something more to talk about: the symbols<br> &gt;&gt;, 2&gt;&gt;, &amp;&gt;&gt;.</p><p>They do the same as the previous operators, but instead of erasing the file, they <strong>append</strong> to the existing file.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/953/1*pZAFANwKzGB6XxsehUozsQ.png" /><figcaption>A screenshot that show what are in the files output1.txt, output2.txt and output3.txt</figcaption></figure><h3>Conclusion</h3><p>And that’s it!<br>This is all you need to know about redirecting streams in Linux.</p><p>If you found this helpful, go subscribe to the channel <a href="https://www.youtube.com/@AsgardTech">https://www.youtube.com/@AsgardTech</a>, hit the like button, and drop a comment.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=be98484d4f03" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[How AI Became My 24/7 Learning Companion (And Can Be Yours Too)]]></title>
            <link>https://bonsaiis-lessons.medium.com/how-ai-became-my-24-7-learning-companion-and-can-be-yours-too-aa2ecb0eb3d2?source=rss-2974105ef1ae------2</link>
            <guid isPermaLink="false">https://medium.com/p/aa2ecb0eb3d2</guid>
            <category><![CDATA[generative-ai-tools]]></category>
            <category><![CDATA[self-learning]]></category>
            <category><![CDATA[education]]></category>
            <category><![CDATA[self-improvement]]></category>
            <category><![CDATA[learning]]></category>
            <dc:creator><![CDATA[0xMarik]]></dc:creator>
            <pubDate>Thu, 16 Oct 2025 16:59:12 GMT</pubDate>
            <atom:updated>2025-10-16T16:59:12.502Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*8tjf0OJJMlwiftT9FtvVww.png" /><figcaption>From confusion to clarity — learning becomes easier with a little guidance.</figcaption></figure><p>Imagine having a tutor available 24/7, one who adapts to your exact learning style, answers your specific questions, and never gets impatient. This isn’t science fiction — it’s AI-powered self-learning, and it’s transforming how we acquire new skills.</p><p>As someone who’s spent countless hours learning independently, I’ve experienced the frustration of hitting a wall with no one to turn to. But over the past year, AI has fundamentally changed my approach to self-education. Here’s what I’ve learned.</p><h3>The Traditional Self-Learning Struggle</h3><p>Let’s be honest: traditional self-learning has always been challenging.</p><p>You find a promising video tutorial or course, dive in with enthusiasm, and then hit a roadblock. Maybe the instructor explains a concept too quickly, assuming knowledge you don’t have. Perhaps they use jargon without defining it. Or they skip steps that seem “obvious” but leave you completely lost.</p><p>The old approach? Pause the video, search Google for clarification, wade through Stack Overflow threads from 2015, and hope someone asked your exact question. Sometimes you find an answer. Often, you don’t.</p><p><strong>The core problem</strong>: Static resources can’t adapt to your unique knowledge gaps. A video designed for intermediate learners can’t magically adjust when a beginner watches it. A textbook can’t answer your specific “but why?” questions.</p><h3>Enter AI: Your Adaptive Learning Partner</h3><p>This is where AI tools, particularly Large Language Models (LLMs), become game-changers.</p><p>Think of traditional resources as a map — they show you the destination and the general route. AI is like a GPS that adapts to exactly where you are, recalculates when you take a wrong turn, and provides real-time guidance based on your current position. Both are valuable, but one responds to your specific situation in the moment.</p><h3>What Makes AI Different</h3><p><strong>Instant, personalized answers</strong>: Unlike posting on forums and hoping for replies, AI responds immediately to your specific question at your current level.</p><p><strong>Adaptive explanations</strong>: If the first explanation doesn’t click, ask for it differently: “Can you explain this using a cooking analogy?” or “I’m 15 years old, can you simplify this?”</p><p><strong>No judgment zone</strong>: Ask the “stupid” questions you’re embarrassed to post publicly. AI won’t judge your knowledge gaps.</p><h3>Practical Setup: AI Alongside Your Learning</h3><p>Here’s how I’ve optimized my learning environment, and you can too.</p><h3>The Browser Sidebar Approach</h3><p>Stop switching between tabs. Modern browsers like Firefox, Edge, and Chrome now offer AI sidebars that sit alongside your learning materials.</p><p><strong>How to set it up:</strong></p><ol><li>Open your browser settings</li><li>Look for “Sidebar” or “AI assistant” options</li><li>Choose your preferred AI tool (ChatGPT, Claude, Copilot, etc.)</li><li>Pin it to stay visible</li></ol><p>For Firefox users here is how I do it</p><figure><img alt="A screenshot inside Firefox browser shows the steps to show AI tab beside the PDF opened" src="https://cdn-images-1.medium.com/max/1024/1*LSIaQfkoRV30Ziu7sRF79A.png" /><figcaption>A screenshot inside Firefox browser shows the steps to show AI tab beside the PDF opened</figcaption></figure><ol><li>Active the side bar</li><li>Choose to open AI tab</li><li>Choose your preferred AI (ChatGPT, Claude, Copilot, etc.)</li></ol><p><strong>Why this works</strong>: When reading a PDF tutorial or watching a course video in your main window, you can instantly ask questions in the sidebar without losing your place. No context switching, no momentum lost.</p><p><strong>Pro tip</strong>: Open PDFs directly in your browser rather than a separate PDF reader. This keeps everything in one ecosystem, making it easier to copy sections into your AI prompts for context.</p><h3>The Art of Asking: Prompt Engineering Basics</h3><p>Here’s the truth: AI is only as helpful as the questions you ask. Generic questions get generic answers. Precise, contextualized questions get transformative responses.</p><h3>Bad Prompt vs. Good Prompt</h3><p>❌ <strong>Bad</strong>: “Explain recursion”</p><p>✅ <strong>Good</strong>: “I’m learning Python and understand loops. Can you explain recursion by comparing it to loops, then show me a simple example with line-by-line comments explaining what happens?”</p><p>See the difference? The second prompt provides:</p><ul><li>Your current knowledge level</li><li>A comparison framework</li><li>The specific format you want</li><li>Your learning style preference</li></ul><h3>The Context Game-Changer</h3><p>When you’re taking a course or following a specific curriculum, give AI that context:</p><p><strong>Example prompt structure:</strong></p><pre>I&#39;m taking a database course where we&#39;re learning SQL. <br>My professor emphasizes normalization and provided this <br>definition: [paste definition]. <br><br>I understand 1NF, but I&#39;m confused about 2NF. Can you:<br>1. Explain 2NF using my professor&#39;s framework<br>2. Show me an example table that violates 2NF<br>3. Show how to fix it<br>4. Explain why my professor&#39;s approach differs from <br>   other explanations I&#39;ve seen online</pre><p>This approach ensures your AI-assisted learning aligns with your coursework, which is crucial for exams and assignments.</p><h3>Different Questions, Different Answers</h3><p>Remember: there’s often more than one way to solve a problem or explain a concept. In academic settings, understanding your instructor’s preferred approach matters.</p><p>That’s why context is king. Tell the AI:</p><ul><li>What course you’re taking</li><li>What your instructor emphasizes</li><li>What you’ve already covered</li><li>Where specifically you’re stuck</li></ul><h3>My Real-World AI Learning Workflow</h3><p>Here’s exactly how I use AI in my daily learning:</p><p><strong>Morning learning session:</strong></p><ol><li>Open course material in main browser window</li><li>Activate AI sidebar (I use Claude, but any works)</li><li>Start with: “I’m learning [topic] today. I’ll share concepts as I go, and I might need clarification.”</li></ol><p><strong>During learning:</strong></p><ul><li>Highlight confusing passages → paste into AI → ask for clarification</li><li>See unfamiliar terms → quick definitions without breaking flow</li><li>Encounter complex diagrams → describe to AI → ask for step-by-step explanation</li></ul><p><strong>Pro tip for deep dives:</strong> When exploring a complex topic, start by giving AI the full context upfront: “I’m learning about [topic]. I’ll be asking you several questions about it today. Here’s what I already know: [brief summary]. Here’s what I’m trying to understand: [specific goal].” This “pin” ensures every follow-up question builds on your previous conversation, and the AI maintains awareness of your learning journey without you repeating yourself each time.</p><p>Here is an example from ClaudeAI</p><figure><img alt="A screen shot of side bar of ClaudeAi showing the pined discussion that are referred to Starred in ClaudeAi" src="https://cdn-images-1.medium.com/max/286/1*oeua97boPGQpPTqa3gQZ5g.png" /><figcaption>A screen shot of side bar of ClaudeAi showing the pined discussion that are referred to Starred in ClaudeAi</figcaption></figure><p><strong>After learning:</strong></p><ul><li>“Can you quiz me on what I just learned?”</li><li>“What are common misconceptions about this topic?”</li><li>“What should I learn next to build on this foundation?”</li></ul><h3>Beyond the Hype: Real Limitations to Consider</h3><p>Let’s be balanced here. AI isn’t perfect, and self-learning still requires effort.</p><p><strong>AI can occasionally be wrong</strong>: Always verify critical information, especially for topics like medicine, law, or financial advice.</p><p><strong>It’s not a replacement for practice</strong>: AI can explain how to code, but you still need to write code yourself to learn.</p><p><strong>Some topics need human guidance</strong>: Complex mathematics, creative arts, or hands-on skills often benefit from human mentorship alongside AI support.</p><p><strong>Access isn’t universal</strong>: Not everyone has reliable internet, capable devices, or can afford premium AI tools. We shouldn’t pretend these barriers don’t exist.</p><h3>The Learning Revolution Is Personal</h3><p>We’re living through a fundamental shift in how humans acquire knowledge. For the first time in history, personalized, adaptive education isn’t limited to those who can afford private tutors or attend elite institutions.</p><p>AI doesn’t replace the discipline and effort required to truly learn something. But it removes many of the artificial barriers — the waiting for answers, the mismatched teaching styles, the isolation of learning alone.</p><p>Your path to mastering new skills is now smoother, faster, and more adapted to exactly who you are and how you learn best.</p><h3>Your Turn: Start Today</h3><p>If you’re currently learning something — anything — try this experiment:</p><ol><li>Open your learning material</li><li>Activate an AI tool (most have free tiers)</li><li>Ask one specific, contextualized question about something you don’t fully understand</li><li>Notice how the personalized response differs from generic Google results</li></ol><p>The future of self-learning isn’t about AI replacing teachers or resources. It’s about AI filling the gaps, adapting to you, and ensuring that the only limit to what you can learn is your curiosity, not the availability of the right explanation at the right level at the right time.</p><p>What will you learn first?</p><p><em>Have you used AI in your self-learning journey? I’d love to hear your experiences and tips in the comments below.</em></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=aa2ecb0eb3d2" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[False Questions in Science: When Precision Fails the Question]]></title>
            <link>https://bonsaiis-lessons.medium.com/false-questions-in-science-when-precision-fails-the-question-812067034d92?source=rss-2974105ef1ae------2</link>
            <guid isPermaLink="false">https://medium.com/p/812067034d92</guid>
            <category><![CDATA[math]]></category>
            <category><![CDATA[logic]]></category>
            <category><![CDATA[education]]></category>
            <category><![CDATA[problem-solving]]></category>
            <category><![CDATA[puzzle]]></category>
            <dc:creator><![CDATA[0xMarik]]></dc:creator>
            <pubDate>Mon, 13 Oct 2025 15:16:41 GMT</pubDate>
            <atom:updated>2025-10-13T15:40:09.187Z</atom:updated>
            <content:encoded><![CDATA[<h3>A Warmup: The Impossible Triangle from In Our Prime</h3><p>Sometimes, a question looks simple — but hides an impossible premise.</p><p>In the Korean movie <em>In Our Prime</em>, a teacher draws a right-angled triangle with two identical legs. The height is given as 6, and the hypotenuse as 10. He asks the students to find the area.</p><p>Using the common formula:</p><p>Area = 1/2 × base × height = 30</p><p>The calculation seems straightforward, but the teacher says the answer is wrong.</p><p>Why?</p><p>Because the triangle described <strong>cannot exist</strong>.</p><p>A right-angled triangle’s hypotenuse is the diameter of its circumcircle. This means the height (the perpendicular from the right angle to the hypotenuse) acts as the radius of that circle.</p><p>If the hypotenuse is 10, the radius must be 5. The height being 6 is impossible geometrically.</p><p>This example reveals a <strong>false question</strong> — not because of a calculation error, but due to an <strong>impossible premise</strong>.</p><figure><img alt="Teacher draw the triangle (The question)" src="https://cdn-images-1.medium.com/max/1024/1*gJFRkWLwrQIZCHv8bmRORg.png" /><figcaption>Teacher draw the triangle (The question)</figcaption></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*DrQglBK0bR6EPavZhdcoXg.png" /><figcaption>Student try to solve triangle mathematical question</figcaption></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*fYsaJKxoZkpMcPr0JT-ZVw.png" /><figcaption>The teacher telling student that the triangle is false mathematically and so can’t be have an answer</figcaption></figure><blockquote><em>The third image says: “It is impossible to get a right answer from a wrong question.”</em></blockquote><blockquote><em>Of course this scene was captured to teach him how to study math but it is very good example for our case</em></blockquote><h3>Introduction</h3><p>In science and technology, precision is everything. But sometimes, the questions themselves lack precision or contain hidden assumptions, contradictions, or ambiguities. These are <strong>false questions</strong>: questions that are flawed by design, leading to confusion or unfair evaluation.</p><p>They may appear simple or straightforward, but they test not only knowledge but also the ability to spot inconsistencies.</p><h3>Example from CCNA Knowledge Test: The Subnet Mask Dilemma</h3><p>I recently came across a question in a CCNA (Cisco Certified Network Associate) knowledge assessment that perfectly illustrates this issue:</p><blockquote><em>“A site administrator manages a network that must accommodate 126 hosts. Which subnet mask would satisfy the number of hosts requested?”</em></blockquote><blockquote><em>A. 255.255.255.0</em></blockquote><blockquote><em>B. 255.255.255.128</em></blockquote><p>At first glance, both answers are technically valid:</p><ul><li><strong>255.255.255.0</strong> supports <strong>254 usable hosts</strong> — more than enough.</li><li><strong>255.255.255.128</strong> supports <strong>126 usable hosts</strong> — exactly what’s required.</li></ul><p>So what’s the right answer?</p><p>That depends on the <em>intended goal</em> of the question — which is not clearly stated.</p><ul><li>If the purpose is to test whether the student can pick the <strong>smallest subnet</strong> that fits exactly 126 hosts, then <strong>255.255.255.128</strong> is correct.</li><li>But if the purpose is to test whether the student is aware that networks often require <strong>room for growth</strong>, and that you should avoid maxing out a subnet, then <strong>255.255.255.0</strong> is the wiser choice.</li></ul><p>The <strong>real problem</strong> is that the question <strong>does not clarify its intent</strong>. There is no mention of:</p><ul><li>Planning for future hosts</li><li>Choosing the most efficient option</li><li>Avoiding subnet exhaustion</li></ul><p>So a student can think carefully, defend their reasoning — and still be marked wrong based on an <strong>unstated expectation</strong>.</p><p>This transforms a good teaching opportunity into a <strong>trap question</strong>.</p><h3>Why False Questions Are Harmful</h3><ul><li>They <strong>confuse learners</strong> and penalize those who think critically.</li><li>They promote <strong>guesswork</strong> rather than true understanding.</li><li>They can <strong>undermine confidence</strong> in assessments and educators.</li><li>They encourage <strong>rote memorization</strong> instead of logical analysis.</li></ul><h3>Common Characteristics of False Questions</h3><ul><li><strong>Ambiguous wording</strong> without clear constraints.</li><li><strong>Multiple correct answers</strong> without instruction to choose all that apply.</li><li><strong>Hidden or unstated assumptions</strong>.</li><li><strong>Logical or physical impossibilities</strong> within the question.</li><li><strong>Mixing incompatible categories or units</strong>.</li></ul><h3>How to Avoid or Fix False Questions</h3><ul><li>Clearly <strong>define requirements and constraints</strong>.</li><li>Avoid vague terms like “best,” “ideal,” or “suitable” without context.</li><li>Ensure <strong>internal consistency</strong> and real-world feasibility.</li><li>If multiple answers are valid, ask for <strong>all correct options</strong> or specify criteria.</li><li>Peer-review questions to spot ambiguities and logical flaws.</li></ul><h3>Conclusion</h3><p>Good questions lead to clarity and deeper understanding. False questions mislead, confuse, and frustrate.</p><p>Whether in geometry, networking, or any scientific discipline, precision in questioning is essential. Sometimes the best answer to a question is to recognize that the question itself is broken.</p><p><em>“Sometimes, the smartest answer is: This question is flawed.”</em></p><p>Give a look to my portfolio <a href="https://soufianeamimi.vercel.app">https://soufianeamimi.vercel.app</a></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=812067034d92" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Building a Powerful Open-Source SIEM with Wazuh, Fluent Bit, Graylog, and OpenSearch]]></title>
            <link>https://bonsaiis-lessons.medium.com/building-a-powerful-open-source-siem-with-wazuh-fluent-bit-graylog-and-opensearch-70494205a8a9?source=rss-2974105ef1ae------2</link>
            <guid isPermaLink="false">https://medium.com/p/70494205a8a9</guid>
            <category><![CDATA[information-security]]></category>
            <category><![CDATA[security-operation-center]]></category>
            <category><![CDATA[opensearch]]></category>
            <category><![CDATA[cybersecurity]]></category>
            <category><![CDATA[open-source]]></category>
            <dc:creator><![CDATA[0xMarik]]></dc:creator>
            <pubDate>Wed, 23 Jul 2025 21:34:24 GMT</pubDate>
            <atom:updated>2025-07-23T21:35:24.310Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*dhMH0nKprPyhDnm8spJhhQ.png" /><figcaption>Architecture</figcaption></figure><p>Security monitoring is no longer a luxury — it’s a necessity. But for many organizations, the cost and complexity of commercial SIEM solutions can be overwhelming.</p><p>That’s why I built a complete, <strong>open-source SIEM architecture</strong> using lightweight, modular, and community-supported tools: <strong>Wazuh</strong>, <strong>Fluent Bit</strong>, <strong>Graylog</strong>, and <strong>OpenSearch</strong>.</p><p>here is the documentation step by step to build this architecture<br><a href="https://opensource-siem-doc.vercel.app/">https://opensource-siem-doc.vercel.app/</a></p><h3>🧱 The Architecture at a Glance</h3><p>The flow is simple but powerful:</p><ol><li><strong>Wazuh</strong> collects logs and detects security events from endpoints.</li><li><strong>Fluent Bit</strong> forwards those alerts efficiently to the next stage.</li><li><strong>Graylog</strong> enriches and organizes the data.</li><li><strong>OpenSearch</strong> stores everything and makes it searchable.</li></ol><p>Each tool has a specific role and can be customized, scaled, or replaced independently.</p><h3>💡 Why This Stack?</h3><ul><li>✅ <strong>Free &amp; Open-Source</strong> — No licensing limits or hidden fees.</li><li>⚙️ <strong>Modular</strong> — Swap or update any part without breaking the system.</li><li>🔍 <strong>Detailed Visibility</strong> — Detect, enrich, and search logs in real time.</li><li>📈 <strong>Scalable</strong> — Handles large data volumes efficiently.</li></ul><h3>💭 Lessons Learned</h3><p>During this project, I ran into some configuration challenges — especially around data formatting in Graylog — but the flexibility of the stack allowed me to overcome them.</p><p>The key takeaway? <strong>Keep your architecture clean, modular, and well-documented.</strong></p><h3>🔚 Final Thoughts</h3><p>If you’re looking for a cost-effective and powerful SIEM solution, this stack is a great starting point. It gives you full control, strong detection capabilities, and solid performance — all without paying for a commercial license.</p><p>Whether you’re a student, a startup, or an enterprise team, open-source SIEM is more accessible than ever.</p><p><em>Thanks for reading. Feel free to reach out or share if you’re building something similar.</em> 🙌</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=70494205a8a9" width="1" height="1" alt="">]]></content:encoded>
        </item>
    </channel>
</rss>