<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Jait Ramadandi Jeke</title>
    <description>The latest articles on DEV Community by Jait Ramadandi Jeke (@jaitramadandij).</description>
    <link>https://dev.to/jaitramadandij</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F462188%2Fdf14b2fe-ab6d-4ed5-8dd5-05fad7745131.jpg</url>
      <title>DEV Community: Jait Ramadandi Jeke</title>
      <link>https://dev.to/jaitramadandij</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/jaitramadandij"/>
    <language>en</language>
    <item>
      <title>I spent three weeks sourcing 500 perfume bottles by hand. Then I built an agent to do the job.</title>
      <dc:creator>Jait Ramadandi Jeke</dc:creator>
      <pubDate>Mon, 31 Aug 2026 22:09:34 +0000</pubDate>
      <link>https://dev.to/jaitramadandij/i-spent-three-weeks-sourcing-500-perfume-bottles-by-hand-then-i-built-an-agent-to-do-the-job-51kn</link>
      <guid>https://dev.to/jaitramadandij/i-spent-three-weeks-sourcing-500-perfume-bottles-by-hand-then-i-built-an-agent-to-do-the-job-51kn</guid>
      <description>&lt;p&gt;&lt;em&gt;I wrote this post to enter the Google × Devpost **All Things Agentic&lt;/em&gt;*&lt;br&gt;
hackathon (&lt;a href="https://allthingsagentichackathon.devpost.com/" rel="noopener noreferrer"&gt;https://allthingsagentichackathon.devpost.com/&lt;/a&gt;). The project is &lt;a href="https://github.com/fillateo/SupplyMe" rel="noopener noreferrer"&gt;SupplyMe&lt;/a&gt;,&lt;br&gt;
submitted in the Taskmaster category*&lt;/p&gt;

&lt;p&gt;I wanted 500 units of a 50ml fragrance made in Indonesia, on a first-batch&lt;br&gt;
budget.&lt;/p&gt;

&lt;p&gt;Five hundred is a small order, and small orders are where the B2B marketplaces&lt;br&gt;
stop being useful to you. The factories I wanted were not listed on any of them.&lt;br&gt;
The ones that were listed sorted by ad spend, and every number on every profile&lt;br&gt;
was a form field somebody filled in once and never opened again.&lt;/p&gt;

&lt;p&gt;So I did the job by hand. Three weeks, 41 tabs, three languages. My spreadsheet&lt;br&gt;
had a column for minimum order quantity and nine of its rows said &lt;code&gt;?&lt;/code&gt;, because&lt;br&gt;
most factories never publish one. I sent the same eight questions to one&lt;br&gt;
supplier at a time and got answers to four of them.&lt;/p&gt;

&lt;p&gt;Then two suppliers listed the same major fragrance brand as a customer.&lt;/p&gt;

&lt;p&gt;I read both pages twice. They matched in every way that mattered to me: a logo,&lt;br&gt;
a sentence, no date, no contract, nobody else saying it. One of those companies&lt;br&gt;
was lying and I had no way in.&lt;/p&gt;
&lt;h2&gt;
  
  
  Sourcing information is disclosed, never published
&lt;/h2&gt;

&lt;p&gt;A factory tells you its real minimum inside a negotiation and tells the next&lt;br&gt;
buyer something else. No dataset holds that number. You learn it by asking, and&lt;br&gt;
you learn whether it holds by finding somebody other than the factory saying it.&lt;/p&gt;

&lt;p&gt;That is two different jobs. Read what a supplier publishes. Wait days for the&lt;br&gt;
answer to what it does not. A search engine does the first badly and the second&lt;br&gt;
not at all, and a chatbot stops existing the moment you close the tab.&lt;/p&gt;
&lt;h2&gt;
  
  
  What I built
&lt;/h2&gt;

&lt;p&gt;The thing I built is called SupplyMe. You type a product into it — &lt;em&gt;"500 × 50ml&lt;br&gt;
EDP, Indonesia, premium packaging, minimise first-batch risk"&lt;/em&gt; — and then you&lt;br&gt;
close the tab.&lt;/p&gt;

&lt;p&gt;It breaks that product into the supply chain it needs, searches for real&lt;br&gt;
manufacturers of each part, reads what they publish, and emails them what the&lt;br&gt;
web could not answer. Days later, when a factory replies, it notices that the&lt;br&gt;
price in the email is not the price on the website, puts both numbers back to&lt;br&gt;
the supplier in a single follow-up, and ranks whoever survives.&lt;/p&gt;

&lt;p&gt;Because a supplier can take three days to answer, nothing in the system waits in&lt;br&gt;
memory for one. Every step is a persisted event, so a reply can arrive long&lt;br&gt;
after the process that sent the email is gone and the mission still picks up&lt;br&gt;
where it left off. That is the part that makes it an agent rather than a&lt;br&gt;
conversation: it keeps working when you are not there.&lt;/p&gt;
&lt;h2&gt;
  
  
  What a claim is worth
&lt;/h2&gt;

&lt;p&gt;The first thing I built is the part that answers my week-one question, and it&lt;br&gt;
contains no model at all.&lt;/p&gt;

&lt;p&gt;Gemini reads a page and extracts claims, stamping each one with where it came&lt;br&gt;
from. A deterministic function turns those sources into a confidence — noisy-OR&lt;br&gt;
with geometric decay:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;CORROBORATION_DECAY&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;CONFIDENCE_CEILING&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;0.55&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.97&lt;/span&gt;
&lt;span class="n"&gt;confidence&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;min&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;math&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;prod&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;w&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;DECAY&lt;/span&gt;&lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nf"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="p"&gt;)),&lt;/span&gt; &lt;span class="n"&gt;CEILING&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The weights are the opinionated part:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Source&lt;/th&gt;
&lt;th&gt;Weight&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;The supplier's own email&lt;/td&gt;
&lt;td&gt;0.90&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;The brand's own website&lt;/td&gt;
&lt;td&gt;0.85&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;The supplier's website&lt;/td&gt;
&lt;td&gt;0.75&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;A Maps listing&lt;/td&gt;
&lt;td&gt;0.55&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;A directory listing&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;0.45&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;A bare search result&lt;/td&gt;
&lt;td&gt;0.30&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Decay makes the second corroborating source count for less than the first and&lt;br&gt;
the twentieth count for close to nothing, so twenty directory listings copying&lt;br&gt;
one press release land under the manufacturer's own spec sheet. That &lt;code&gt;0.45&lt;/code&gt; is&lt;br&gt;
the marketplace problem I started with, written down as a constant.&lt;/p&gt;

&lt;p&gt;One rule held the design together. Ask a model how confident it is and you get a&lt;br&gt;
number that moves when you rephrase the prompt. Compute it from source identity&lt;br&gt;
and you get one that moves when the evidence changes.&lt;/p&gt;

&lt;p&gt;Ranking follows the same rule: a weighted sum over price, minimum-order fit,&lt;br&gt;
capability, lead time, evidence strength and logistics, at 20/20/20/15/15/10.&lt;br&gt;
Tell a mission to minimise first-batch risk and weight slides off price and onto&lt;br&gt;
order-size fit. The agent that writes the recommendation receives a ranking it&lt;br&gt;
did not compute and cannot reorder — hand it that power and the scores turn into&lt;br&gt;
decoration.&lt;/p&gt;

&lt;p&gt;Drawing that line meant I never had to build explainability, because the&lt;br&gt;
explanation is the calculation. &lt;code&gt;MOQ 500 fits an order of 500&lt;/code&gt;.&lt;/p&gt;
&lt;h2&gt;
  
  
  Six of my seven agents did not need to be agents
&lt;/h2&gt;

&lt;p&gt;I started by wrapping everything in an &lt;code&gt;LlmAgent&lt;/code&gt;, because that is what the&lt;br&gt;
framework is for and it felt like cheating not to. Then I read the traces.&lt;/p&gt;

&lt;p&gt;Six of them made one call and returned. One prompt, one schema, one response, no&lt;br&gt;
branching, no tool choice. The workflow had already decided what happened next;&lt;br&gt;
the model was filling in a shape.&lt;/p&gt;

&lt;p&gt;The seventh looked like this against a real supplier:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;read_page   https://kemasan-wangi.example.com/
search_web  "PT Kemasan Wangi Nusantara Indonesia 50ml glass perfume bottle MOQ"
read_page   https://kemasan-wangi.example.com/produk/botol-parfum-50ml
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Nobody scripted that sequence. It landed on the homepage, could not find what it&lt;br&gt;
needed, searched for the phrase that would surface a product page, and went back&lt;br&gt;
for it. It returned &lt;code&gt;moq = 500&lt;/code&gt;, quoted from &lt;em&gt;"Minimum order: 500 pcs per&lt;br&gt;
desain"&lt;/em&gt;, and reported price and lead time as missing — which is what later&lt;br&gt;
makes the system email this factory.&lt;/p&gt;

&lt;p&gt;So research stayed an agent, with &lt;code&gt;search_web&lt;/code&gt;, &lt;code&gt;read_page&lt;/code&gt; and &lt;code&gt;query_maps&lt;/code&gt;,&lt;br&gt;
and the other six became single structured calls. A tool loop standing in for a&lt;br&gt;
structured call gets you a slower and less predictable structured call at&lt;br&gt;
roughly ten times the price. Working out where not to put an agent was the most&lt;br&gt;
useful hour I spent.&lt;/p&gt;

&lt;h2&gt;
  
  
  What it costs to run
&lt;/h2&gt;

&lt;p&gt;Measured from the API's own token counts, eight suppliers researched through to&lt;br&gt;
a full recommendation cost &lt;strong&gt;$0.29&lt;/strong&gt;, across 98 model calls and 562,287 input&lt;br&gt;
tokens. Twelve suppliers costs $0.78, and that is the number I plan against.&lt;/p&gt;

&lt;p&gt;Input tokens are nearly the whole bill, because one real supplier website runs&lt;br&gt;
to tens of thousands of tokens and the research agent reads several per&lt;br&gt;
supplier. Spend tracks how many suppliers you look at. How ambitious the brief&lt;br&gt;
is barely moves it.&lt;/p&gt;

&lt;p&gt;One saving worth stealing: reasoning tokens bill as output, and extraction does&lt;br&gt;
not need them. Reading a price out of an email gains nothing from a thinking&lt;br&gt;
budget. Capping it took the fast tier from 1,222 output tokens per call to 405.&lt;/p&gt;

&lt;h2&gt;
  
  
  Back to the two factories
&lt;/h2&gt;

&lt;p&gt;SupplyMe still cannot tell me which one lied, and I no longer think that was the&lt;br&gt;
right question. It reports one claim as corroborated by the brand's own site and&lt;br&gt;
a trade publication, and the other as the supplier's word with nothing behind&lt;br&gt;
it. Those two things arrive on my screen looking different, and I can click&lt;br&gt;
either one through to the sentence it came from. In week one I would have taken&lt;br&gt;
that over an answer.&lt;/p&gt;

&lt;h2&gt;
  
  
  Run it
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Source&lt;/strong&gt;: &lt;a href="https://github.com/fillateo/SupplyMe" rel="noopener noreferrer"&gt;https://github.com/fillateo/SupplyMe&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;You can try it with no credentials and no spend (mock)&lt;/strong&gt;: &lt;code&gt;MOCK=true docker compose up --build&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Built with Google ADK, Gemini 3.5 Flash on Vertex AI, Cloud Run, Firestore,&lt;br&gt;
Pub/Sub, Cloud Tasks, Cloud Scheduler, Secret Manager, Places, Gmail over SMTP&lt;br&gt;
and IMAP, FastAPI, Next.js and OpenTofu.&lt;/p&gt;




</description>
      <category>agents</category>
      <category>ai</category>
      <category>buildinpublic</category>
      <category>python</category>
    </item>
    <item>
      <title>Transforming an Old Laptop into a Local AI Chatbot with LLAMA3 and Open WebUI</title>
      <dc:creator>Jait Ramadandi Jeke</dc:creator>
      <pubDate>Sun, 22 Dec 2024 20:21:54 +0000</pubDate>
      <link>https://dev.to/jaitramadandij/transforming-an-old-laptop-into-a-local-ai-chatbot-with-llama3-and-open-webui-22kh</link>
      <guid>https://dev.to/jaitramadandij/transforming-an-old-laptop-into-a-local-ai-chatbot-with-llama3-and-open-webui-22kh</guid>
      <description>&lt;p&gt;In this post, I'll show you how I turned my old laptop, which I hadn't used in a while, into a local ChatGPT clone with just a few simple steps. Setting this up is straightforward and doesn’t require much effort. &lt;/p&gt;

&lt;h3&gt;
  
  
  Why Use a Local AI Chatbot?
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Privacy&lt;/strong&gt;: Your data stays local.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Customization&lt;/strong&gt;: Fine-tune the model to fit your needs.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Flexibility&lt;/strong&gt;: Use the AI as you see fit.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Steps to Set Up a Local AI Chatbot
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Run Open WebUI via Docker
&lt;/h3&gt;

&lt;p&gt;To make the installation easy, I'll use Docker to set up Open WebUI with bundled Ollama support.&lt;/p&gt;

&lt;p&gt;Run the following command on your computer:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker run &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="nt"&gt;-p&lt;/span&gt; 3000:8080 &lt;span class="nt"&gt;-v&lt;/span&gt; ollama:/root/.ollama &lt;span class="nt"&gt;-v&lt;/span&gt; open-webui:/app/backend/data &lt;span class="nt"&gt;--name&lt;/span&gt; open-webui &lt;span class="nt"&gt;--restart&lt;/span&gt; always ghcr.io/open-webui/open-webui:ollama
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This command will start Open WebUI. Once it's running, visit &lt;code&gt;http://localhost:3000&lt;/code&gt; in your browser and set up an admin user.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Install LLAMA3.2:1b
&lt;/h3&gt;

&lt;p&gt;For this example, I’m using the llama3.2:1b model, but you can choose any other large language model (LLM) available on the &lt;a href="https://ollama.com/search" rel="noopener noreferrer"&gt;Ollama site&lt;/a&gt;, depending on your needs.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;In the top-left corner of Open WebUI, type the name of the model you want to install.&lt;/li&gt;
&lt;li&gt;In my case, it’s llama3.2:1b.&lt;/li&gt;
&lt;li&gt;Click Pull "llama3.2:1b" from Ollama.com.&lt;/li&gt;
&lt;li&gt;Here’s an example of how it looks during the installation:&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fznfkuk57h0wmu3gy38j3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fznfkuk57h0wmu3gy38j3.png" alt="Image description" width="457" height="196"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fh0da86i4fcg7ym42mnun.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fh0da86i4fcg7ym42mnun.png" alt="Image description" width="613" height="320"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;That's it! You can access your LLM (Large Language Model) from another device with the same network, using a local IP address like this example:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjhvxwkdqh96cqputcq8t.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjhvxwkdqh96cqputcq8t.png" alt="Image description" width="800" height="233"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Once the model is installed, you can start using your local AI chatbot. Open WebUI supports multiple LLMs, so you can experiment with different models to find what works best for your needs.&lt;/p&gt;

&lt;h2&gt;
  
  
  What's next?
&lt;/h2&gt;

&lt;p&gt;I'm planned to fine-tune LLAMA on my own dataset. So, wish me luck ;v&lt;/p&gt;

&lt;h2&gt;
  
  
  References
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://ollama.com/search" rel="noopener noreferrer"&gt;https://ollama.com/search&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.openwebui.com/" rel="noopener noreferrer"&gt;https://docs.openwebui.com/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
    </item>
    <item>
      <title>2 Things That I Started to Think in Reverse</title>
      <dc:creator>Jait Ramadandi Jeke</dc:creator>
      <pubDate>Wed, 08 May 2024 05:09:52 +0000</pubDate>
      <link>https://dev.to/jaitramadandij/2-things-that-i-started-to-think-in-reverse-4h8o</link>
      <guid>https://dev.to/jaitramadandij/2-things-that-i-started-to-think-in-reverse-4h8o</guid>
      <description>&lt;p&gt;A year ago, I bought a book written by Paul Arden titled &lt;a href="https://www.goodreads.com/en/book/show/265525"&gt;"Whatever You Think, Think the Opposite"&lt;/a&gt;. It's a simple book that teaches you that sometimes you need to think the opposite of other people or common ideas. As time went by, I came up with three things that I started to think about in reverse, which I'm going to write about in this article.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Set Goals That are Intended to Fail
&lt;/h2&gt;

&lt;p&gt;Like many other folks, many times I set up a goal and it just didn't work out. Whether it's learning new things, building something, or my personal life, I started to wonder what was wrong with myself and began blaming myself for it. But now, I don't think the same way anymore.&lt;/p&gt;

&lt;p&gt;So, here is what I do. What if you set up a goal but intended it to fail? I know it sounds cliché, but that's what I do now. The idea is, you have a goal, and when it fails, you have to find out why it failed and quickly learn from it. If the goal works, I will be happy. But if it fails, that is okay too, since I intended that goal to fail. So I don't blame myself anymore and don't feel down about it.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fs8bwo8n1i8tmosie5qvy.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fs8bwo8n1i8tmosie5qvy.png" alt="Image description" width="800" height="600"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Being Productive is not all about adding something, but it's about removing something
&lt;/h2&gt;

&lt;p&gt;I used to think that being productive means I can deliver more in terms of work. And that is true. But there is one thing that I forget about. The key to becoming productive is about removing something from your life. Being able to say no to things that are not your main priority or not really important. Removing distractions such as social media and some bad habits that can waste your time.&lt;/p&gt;

&lt;p&gt;Being productive is not all about adding something to your life, but it's about removing things from your life. You can only do things that are right when you remove things that are wrong.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;In wrapping up, let's take a look at what I've learned from these two ideas.&lt;/p&gt;

&lt;p&gt;First off, we found out that setting goals with the expectation that they might fail isn't such a bad idea after all. Instead of seeing failure as a total disaster, we learned to see it as a chance to learn and grow. By embracing this mindset, we can shake off the fear of messing up and actually learn a ton from our mistakes.&lt;/p&gt;

&lt;p&gt;And secondly, being productive isn't just about cramming more stuff into our schedules. It's also about clearing out the distractions and things that aren't important, which are holding us back. By cutting out distractions and focusing on what really matters, we can make room for the things that truly light us up.&lt;/p&gt;

&lt;p&gt;So, in a nutshell, reverse thinking is all about flipping the script and trying out new ways of doing things. It's about embracing the unexpected and being open to unconventional ideas. And who knows? Maybe by thinking a little differently, we'll stumble upon some pretty cool solutions to life's challenges.&lt;/p&gt;

</description>
      <category>beginners</category>
      <category>programming</category>
      <category>productivity</category>
      <category>learning</category>
    </item>
    <item>
      <title>Why do we get frustrated when learning something?</title>
      <dc:creator>Jait Ramadandi Jeke</dc:creator>
      <pubDate>Sat, 16 Sep 2023 07:35:57 +0000</pubDate>
      <link>https://dev.to/jaitramadandij/why-do-we-get-frustrated-when-learning-something-2h43</link>
      <guid>https://dev.to/jaitramadandij/why-do-we-get-frustrated-when-learning-something-2h43</guid>
      <description>&lt;p&gt;When learning a new skill, we often reach a frustrating point, especially if you are a beginner, feeling that it's beyond our capabilities. We unconsciously give up before we actually quit. Boredom, panic, frustration, and insecurity are normal emotions in the process.&lt;/p&gt;

&lt;p&gt;If you don’t feel frustrated while learning something, maybe you’re not learning. So, when you’re practicing some skills and you feel frustrated, that’s your weakness. So congratulations! You just know what your weakness is. In that moment, you started working on what you weren’t good at.&lt;/p&gt;

&lt;h2&gt;
  
  
  Learning is a painful process.
&lt;/h2&gt;

&lt;p&gt;Pain is good for you. I know your tendency is to try to make it easy for yourself. Because at the end of the day, we are just human beings. We don’t like pain. So at some point, when you learn something and you feel it’s really easy to do and so much fun, you’re probably not learning. You’re trying to avoid your weaknesses.&lt;/p&gt;

&lt;h2&gt;
  
  
  The frustration is a sign of progress.
&lt;/h2&gt;

&lt;p&gt;Frustration is a signal that your mind is processing complexity and requires more practice. Trusting this will all happen, you will allow the natural learning process to move forward, and everything else will fall into place.&lt;/p&gt;

&lt;p&gt;So when you’re frustrated while learning, you don’t really know what you need to do. And that’s a signal on the way to a breakthrough. That moment you’re about to give up is where the magic happens. On the next day, all of the perfect solutions came to you. So, you only need to rest and chill a bit. Not quit.&lt;/p&gt;

&lt;h2&gt;
  
  
  Adopt the right mindset.
&lt;/h2&gt;

&lt;p&gt;If you go that far, you will know that pain and frustration are good things. Once you know that, you are able to wait for the breakthrough that will come because you don’t give up.&lt;/p&gt;

&lt;p&gt;You cannot change the topics that you’re learning to make them easier for you. But you can change your point of view. "Hmm, okay. This is my weakness; I need to work on it!". Adopting the right mindset is so important.&lt;/p&gt;

&lt;p&gt;So remember, when you have that frustration, you are on the right path. Don’t give up!&lt;/p&gt;

</description>
      <category>beginners</category>
      <category>discuss</category>
      <category>productivity</category>
      <category>learning</category>
    </item>
    <item>
      <title>Cara Membuat Output dari Query MongoDB Shell Menjadi Berwarna</title>
      <dc:creator>Jait Ramadandi Jeke</dc:creator>
      <pubDate>Sat, 28 Aug 2021 15:12:17 +0000</pubDate>
      <link>https://dev.to/jaitramadandij/cara-membuat-output-dari-query-mongodb-shell-menjadi-berwarna-4igk</link>
      <guid>https://dev.to/jaitramadandij/cara-membuat-output-dari-query-mongodb-shell-menjadi-berwarna-4igk</guid>
      <description>&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--0gCDDCxM--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/mf77bpednitct5b3v8v0.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--0gCDDCxM--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/mf77bpednitct5b3v8v0.png" alt="Alt Text" width="800" height="588"&gt;&lt;/a&gt;&lt;br&gt;
Halo guys! Kali ini saya akan sharing tentang bagaimana cara merubah output dari query MongoDB Shell menjadi berwarna agar lebih nyaman untuk dibaca. Untuk melakukan itu kita akan menggunakan sebuah shell extension yang bernama &lt;a href="https://github.com/TylerBrock/mongo-hacker"&gt;Mongo-Hacker&lt;/a&gt;. &lt;/p&gt;

&lt;p&gt;Untuk menginstallnya, kita hanya butuh 4 langkah berikut:&lt;/p&gt;

&lt;p&gt;Step 1: Clone repository dari Mongo-Hacker&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;git clone https://github.com/TylerBrock/mongo-hacker
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Step 2: Masuk kedalam folder mongo-hacker&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;cd mongo-hacker
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Step 3: Install package&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;make install
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Step 4: Bersikan folder&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;cd ..
rm -rdf mongo-hacker/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Selesai!&lt;/p&gt;

</description>
      <category>mongodb</category>
    </item>
  </channel>
</rss>
