<?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 Adel Müürsepp on Medium]]></title>
        <description><![CDATA[Stories by Adel Müürsepp on Medium]]></description>
        <link>https://medium.com/@adel-muursepp?source=rss-8ef233249879------2</link>
        <image>
            <url>https://cdn-images-1.medium.com/fit/c/150/150/1*D3FK1eJvMu5KaiKxrq5b4g@2x.jpeg</url>
            <title>Stories by Adel Müürsepp on Medium</title>
            <link>https://medium.com/@adel-muursepp?source=rss-8ef233249879------2</link>
        </image>
        <generator>Medium</generator>
        <lastBuildDate>Sat, 14 Nov 2026 05:01:13 GMT</lastBuildDate>
        <atom:link href="https://medium.com/@adel-muursepp/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[(File) systems for AI – ponderings from FAST’26 conference]]></title>
            <link>https://adel-muursepp.medium.com/file-systems-for-ai-ponderings-from-fast26-conference-0c2ddcd4f82b?source=rss-8ef233249879------2</link>
            <guid isPermaLink="false">https://medium.com/p/0c2ddcd4f82b</guid>
            <category><![CDATA[filesystem]]></category>
            <category><![CDATA[system]]></category>
            <category><![CDATA[ai]]></category>
            <dc:creator><![CDATA[Adel Müürsepp]]></dc:creator>
            <pubDate>Wed, 25 Feb 2026 07:04:32 GMT</pubDate>
            <atom:updated>2026-02-25T07:04:32.916Z</atom:updated>
            <content:encoded><![CDATA[<p>FAST 2026 is the 24th USENIX File and Storage Technologies conference held this year in Santa Clara, CA. It feels slightly strange because it combines the “heavy” systems of Computer Science that CMU, U of Berkeley and University of Wisconsin, Madison are known for with the flashy big tech systems design for scale.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/600/0*DizMJ114KU9rrzCS.png" /><figcaption>FAST 2026 logo</figcaption></figure><p>First, the atmosphere differs significantly from the rushed and crowded, more AI focused conferences like MLSys, which took place in the same location a half a year ago. This is your friendly quirky group of engineers, such as Christopher Haster presenting about maintaining community backed littlefs project and the OS legends giving their thoughts on the systems. People are approachable, happy to chat and like thinking deeply about efficient code (and just that).</p><p>Then there are the high energy big tech engineers from Netflix, Jane Street, Apple and Google thinking about the system design of their streaming services and ingesting data feeds. It is a big visual contrast when an Apple team presents their presentation with the aesthetically pleasing slides after the plain research presentations.</p><p>Also very noteworthy is the strong presence of research from Chinese universities, such as Shanghai Jiao Tong University, Tsinghua and others. Many papers have the affiliation to Alibaba or Huawei with clever implementations.</p><p>The most interesting to me was the AI and LLMs section. As opposed to thinking of data movement on the memory hierarchy of the GPU, as I do when writing kernels, the file system focus was more on the efficient loading of the data to the RAM. Think page tables, testing of different cache eviction policies and designing computation aware prefetching.</p><p>To bring an example which covers 3 papers let’s say you are serving thousands of simultaneous users chatting with AI, each mid-conversation. Every user has accumulated a history of turns. Each turn produced key and value tensors that the model needs to attend over when generating the next response. Those tensors do not fit in GPU memory. Therefore, cache which sits between SSD/disk and efficient DRAM (and then even more efficient on chip memory) needs to hold multiple key and values data. Moving this data in the memory hierarchy efficiently is the entire problem.</p><p><a href="https://www.usenix.org/system/files/fast26-hu-shipeng.pdf">Bidaw</a>, from Tsinghua University, starts from a simple observation. In a real multi-round conversation workload of over one million rounds, the time a user takes before sending their next message is strongly correlated with how long the model’s previous response was. Longer answer, more reading time, longer gap before the next request. The Spearman correlation between answer length and the gap was between 0.94 and 0.98 across different hours of the day and different load conditions. This is a strong enough signal to act on.</p><p>When a long response goes out, Bidaw marks that user’s KV tensors as safe to evict to SSD because the next request is not coming soon. When a short response goes out, their KVs stay in host memory. On the compute side, Bidaw also splits incoming requests into two queues: a ready queue for requests whose KVs are already in host memory, and a preparing queue for those needing SSD loads. The GPU only draws from the ready queue, so a single user with a large KV tensor on SSD cannot block dozens of users whose histories load in milliseconds. The result is a 3.58x reduction in response latency and 1.83x throughput improvement.</p><p><a href="https://www.usenix.org/system/files/fast26-liu-yang.pdf">CacheSlide</a>, from Shanghai Jiao Tong University, targets agent-based LLMs where the prompt is a mix of fixed segments and dynamically updated segments. Fixed segments are things like the system instructions or the full history of a reasoning chain that does not change between turns. Dynamic segments are things like the latest tool call result or a new user message that gets inserted somewhere in the middle. Most of the prompt is identical turn to turn, so you want to reuse the KV cache for the fixed parts rather than recomputing them from scratch every time.</p><p>The KV cache is the stored record of how each token in the prompt relates to every other token, specifically the key and value matrices computed during the attention mechanism. Attention is the process by which the model figures out which previous tokens are relevant when generating the next one. Computing it for a long prompt is expensive, which is why caching it matters.</p><p>The problem is positional encoding. Every token in a transformer gets a tag indicating where it sits in the sequence, so the model knows token 50 comes before token 51. The dominant scheme, called RoPE, gives each token a unique absolute index and encodes position as a rotation applied to the key and query vectors. This means the cached representation of a token at position 200 is mathematically different from the same token at position 300. When the dynamic segment in the middle of the prompt grows by 100 tokens, every fixed segment after it shifts by 100 positions. The cached keys no longer match what you would get if you recomputed from scratch. Measured as cosine similarity between cached and recomputed keys, the match drops by over 90 percent after a 1000-token shift. The cache is effectively stale before you can use it.</p><p>CacheSlide switches to a different positional encoding called CoPE, which assigns indices to semantic boundaries rather than individual tokens. Adjacent tokens can share a position index. Because fewer indices change when a segment shifts, the same 1000-token shift causes only a 28 percent drop in similarity rather than 90 percent. The fixed segments still know roughly where they are relative to each other, and the cached keys remain close enough to the real ones to be reusable.</p><p>To correct the remaining gap, CacheSlide uses a mechanism called Weighted Correction Attention. At the first transformer layer, it does a full recompute and measures which tokens have the largest discrepancy between their cached key and their freshly computed key. It selects the top 26 percent most drifted tokens and, in all subsequent layers, recomputes only those tokens rather than the full prompt. The recomputed values are blended with the cached values using weights proportional to how large the discrepancy was. Every four layers it checks whether the selected tokens have converged, swapping out ones that are now close enough and replacing them with the next most drifted candidates from the remaining pool. This restores the attention between fixed and updated segments while touching only a fraction of the total computation. Latency drops 3.1 to 4.3 times across tested models and agent benchmarks.</p><p><a href="https://www.usenix.org/conference/fast26/presentation/zheng">SolidAttention</a> takes the complementary approach: rather than optimizing how KV tensors are stored and retrieved, it asks which ones need to be stored at all. Attention is naturally sparse. When generating the next token, many prior tokens receive near-zero attention weight and their KV tensors contribute almost nothing to the output. SolidAttention identifies low-importance blocks from the attention patterns themselves, evicting them to SSD or dropping them entirely. At 128k-token context lengths, this cuts KV memory footprint by up to 98 percent and improves inference speed by up to 3.1 times.</p><p>What unites all three papers is a refusal to treat the AI system as a black box sitting on top of commodity storage. Bidaw finds a signal in response length that standard eviction policies cannot see. CacheSlide measures the sensitivity of positional encodings to absolute shifts and designs around the measurement. SolidAttention reads the attention weight distribution and evicts based on what the model actually uses. Each one is doing careful empirical systems work: find the bottleneck, measure it precisely, build around what the data reveals.</p><p>There is something quietly striking about all of this. The people who spent careers thinking about page replacement algorithms, SSD write amplification, and I/O scheduling are now the ones making AI assistants faster. The memory hierarchy did not go away. It just got a new and very demanding workload. FAST has always been the conference where people care about what actually happens when software meets hardware. Cache eviction policy, dirty page management, I/O-aware scheduling, these are not glamorous problems. But this year they are the problems standing between a user and a responsive AI system. The researchers presenting in Santa Clara are not chasing a trend. They are doing what this community has always done: finding the inefficiency that everyone else missed because they were not looking closely enough at the I/O.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=0c2ddcd4f82b" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Google Summer of Code 2025 with Google DeepMind & Promptfoo]]></title>
            <link>https://adel-muursepp.medium.com/google-summer-of-code-2025-with-google-deepmind-promptfoo-47f48917af06?source=rss-8ef233249879------2</link>
            <guid isPermaLink="false">https://medium.com/p/47f48917af06</guid>
            <category><![CDATA[google-summer-of-code]]></category>
            <category><![CDATA[promptfoo]]></category>
            <category><![CDATA[llm-evaluation]]></category>
            <category><![CDATA[open-source]]></category>
            <category><![CDATA[google-deepmind]]></category>
            <dc:creator><![CDATA[Adel Müürsepp]]></dc:creator>
            <pubDate>Mon, 01 Sep 2025 16:15:21 GMT</pubDate>
            <atom:updated>2025-09-01T18:01:12.352Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/600/0*KrtZSYSwKwgfI2Yq" /></figure><p>I had the opportunity to participate in the Google Summer of Code 2025 under the mentorship of Google DeepMind and working closely with the AI evaluation startup Promptfoo. Here is my summary of my work, experience and learnings gathered.</p><h3>The Problem: Evaluation &amp; Documentation Lagging Behind Innovation</h3><p>The models are evolving faster than our ability to properly evaluate them. When Google released Gemini 2.5 with native audio generation, Veo 3 video capabilities, and advanced built-in tools, the evaluation ecosystem struggled to keep up.</p><p>Evaluation frameworks like Weights &amp; Biases and Promptfoo had basic Gemini support, but lacked comprehensive examples of how to evaluate audio generation quality, or test multimodal reasoning across different modalities. The documentation was sparse, examples were simple, and developers were left figuring things out on their own.</p><h3>The project goal: Evaluating &amp; Documenting Gemini models</h3><p>My work for the summer included tackling the documentation gap on the evaluations. I got to work closely with Promptfoo, an AI evaluation startup in Series A phase, which provides a framework for AI evaluations and red-teaming. Working with a startup in a early stage was very insightful as I got to see how adapting to the latest innovations in the AI space required being nimble and fast in pushing code to production.</p><p>I primarily worked on the Promptfoo codebase to enable multimodal features, particularly on the audio side, as well as enabling displaying images in the evaluations. In addition to this I spent time showcasing new features like tools in the guides.</p><p>Here are the features I have been working on:</p><h4>Audio Evaluation Infrastructure</h4><p>The first real challenge was getting audio outputs to work properly in Promptfoo. Unlike text evaluation where you can easily compare strings, audio evaluation requires completely different infrastructure.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*NUuhoZMaCpu9ELUY" /><figcaption>New view for audio output for Google Live API evaluations</figcaption></figure><p>I had to:</p><ul><li>Implement audio output rendering in the UI (building on previous work for Bedrock’s Nova Sonic)</li><li>Add support for transcription metadata to enable text-based evaluation of audio content</li><li>Create examples for voice customization, affective dialog, and multi-language generation</li></ul><p>The tricky part? Google’s Live API doesn’t support audio output when the input is an audio clip rather than real-time communication. After debugging WebSocket connections for way too long, I realized this was an API limitation, not a bug in my code.</p><ul><li><a href="https://github.com/promptfoo/promptfoo/pull/4280">PR for audio as output evaluations</a></li><li><a href="https://github.com/promptfoo/promptfoo/pull/4729">PR for audio docs</a></li></ul><h4>Multimodal Understanding at Scale</h4><p>Next up was image understanding. This sounds straightforward until you realize that different Google providers (AI Studio, Vertex, Live API) handle binary image data differently, and Promptfoo’s existing image handling wasn’t designed for Google’s response format.</p><p>I ended up creating a unified image handling system that works across all Google providers:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*lQG73vRg-MhDUzI0" /><figcaption>New view for the image understanding for Google providers</figcaption></figure><p>This was a very complex task as it required me to track the different response structures and change the existing response types, while maintaining the existing features.</p><p>My choice of the image for testing included the Promptfoo mascot red panda which earned me the following comment from the CTO in PR review:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/535/1*gSuieyweCCcozVmYvpRsAA.png" /></figure><p>The real breakthrough came when I tested support for complex image understanding tasks — not just “what’s in this image” but “compare these architectural styles” or “identify safety hazards in this construction site photo.” I added extensive documentation and contributed to the Google provider with examples on how to compare the images.</p><ul><li><a href="https://github.com/promptfoo/promptfoo/pull/4767">PR for the image understanding response restructuring</a></li><li><a href="https://github.com/promptfoo/promptfoo/pull/4923">PR for further documentation on images</a></li><li><a href="https://github.com/promptfoo/promptfoo/blob/15e5271f09a81dc7ee945a50a693f9484cf6cf88/examples/google-aistudio-gemini/promptfooconfig.image.yaml">The image comparison example added from the PR</a></li><li><a href="https://www.promptfoo.dev/docs/providers/google/">Google provider documentation on Promptfoo site</a></li></ul><h4>Tool Integration Deep Dive</h4><p>Gemini’s built-in tools (code execution, search grounding, URL context) are impressive, but evaluating them properly required rethinking how tool outputs are handled in evaluation frameworks.</p><p>For code execution evaluation, I created examples that test not just whether code runs, but whether it produces correct analytical insights.</p><ul><li><a href="https://github.com/promptfoo/promptfoo/pull/4923">PR for tools documentation and guides</a></li><li><a href="https://github.com/promptfoo/promptfoo/blob/15e5271f09a81dc7ee945a50a693f9484cf6cf88/examples/google-aistudio-tools/promptfooconfig.codeexecution.yaml">The code execution example added from the PR</a></li><li><a href="https://github.com/promptfoo/promptfoo/blob/15e5271f09a81dc7ee945a50a693f9484cf6cf88/examples/google-aistudio-tools/promptfooconfig.urlcontext.yaml">The URL context tool example added from the PR</a></li><li><a href="https://www.promptfoo.dev/docs/providers/google/">Updated Google provider documentation on Promptfoo site including tools use</a></li></ul><h4>Tutorial for Promptfoo with a Guided Use Case</h4><p>In addition to the Promptfoo documentation, I had an idea to create a more guided version with a use case on how to use Promptfoo framework for evaluating Gemini models. Many users in the Discord community mentioned that it would be very useful to see a end-to-end workflow of setting up the framework, specifying the models and writing evaluation test cases.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*qS9o_ZG1O0-dbfMU8oy2ow.png" /><figcaption>Simple use case of setting up evaluations for a language learning app</figcaption></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*x1P_Mm5Hpl2M2rg92o5JXA.png" /><figcaption>The language app used Gemini models for analyzing the image and user responses — but we should evaluate for the best models with Promptfoo!</figcaption></figure><p>In the guided project a real use case is presented in the form of a language learning app, as well as a challenge: what is the most optimal model to choose for the app in terms of latency, correctness and the tone? Is the current chosen model Gemini 2.5 Flash the correct choice or are there better, more optimal choices for the use case?</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*0DTGsvXw_NWr9yHoGljZSg.png" /><figcaption>Example evaluation: both Gemini 2.5 and Gemini 2.5 Flash Lite pass correctness tests but Gemini 2.5 Flash is above the latency threshold</figcaption></figure><p>After doing evaluations the guided project introduces the users to the complexities of choosing the right models and the drawbacks of each choice. Choosing a more intelligent model might seem like the best choice, but it has bigger latency. However, by choosing the smaller model how do we guarantee that it can handle more complex edge cases (adhering to the JSON format in response and handling multiple languages)?</p><ul><li><a href="https://github.com/adelmuursepp/promptfoo-demo-evals">Link to the guided project</a></li><li><a href="https://multilingo-app-production.up.railway.app/">Link to the sample app used for the use case</a></li></ul><p>Work to be done: the guided project serves as a piece of documentation currently but should be added to the content plan for Promptfoo. This way the guided project can be reused at the entry level workshops. I will also record the video of the walkthrough to be posted on Youtube as a tutorial.</p><h4>Troubleshooting Community Issues</h4><p>Another fun part of the GSoC experience was troubleshooting users’ issues reporting in the Discord community and in GitHub Issues.</p><ul><li><a href="https://github.com/promptfoo/promptfoo/pull/4200">Fixing an issue related to Gemini MCP integration</a></li><li><a href="https://github.com/promptfoo/promptfoo/pull/4152">Fixing an issue in the evaluations UI</a></li><li><a href="https://github.com/promptfoo/promptfoo/issues/4031">Discussing with the user and advising on an alternative solution</a></li></ul><h4>The Response Format Nightmare</h4><p>Here’s something that doesn’t make it into most technical blog posts — sometimes the biggest challenges are the boring ones. Google’s providers return responses in inconsistent formats:</p><ul><li>Sometimes just text: &quot;Hello, how can I help?&quot;</li><li>Sometimes structured: [{&quot;text&quot;: &quot;Hello, how can I help?&quot;}]</li><li>Sometimes with metadata: {&quot;text&quot;: &quot;...&quot;, &quot;toolCalls&quot;: [...], &quot;metadata&quot;: {...}}</li></ul><p>This inconsistency breaks UI components, makes evaluation unpredictable, and generally causes headaches. I’m currently working on a comprehensive refactoring to normalize these responses while maintaining backward compatibility.</p><h3>Technical Lessons Learned</h3><h4>API Documentation vs Reality</h4><p>Google’s documentation is generally solid, but bleeding-edge features often have undocumented limitations. The audio output issue I mentioned earlier cost me a week of debugging because the limitation wasn’t clearly documented.</p><p><strong>Lesson</strong>: When working with experimental APIs, budget extra time for discovery and be prepared to adjust scope based on actual capabilities. In addition go ahead and make sure to read the underlying package code: in this case Google GenAI package to understand the issues.</p><h4>Evaluation Framework Design</h4><p>Building evaluation frameworks that work across multiple modalities requires careful abstraction. You need to handle text, images, audio, and structured data uniformly while preserving the unique characteristics of each modality.</p><p><strong>Lesson</strong>: Design your evaluation interfaces to be modality-agnostic from the start. Adding multimodal support retroactively is much harder.</p><h4>Open Source Collaboration</h4><p>Working with the Promptfoo team taught me a lot about maintaining open source projects at scale. Every change needs to consider backward compatibility, performance impact, and maintainability.</p><p><strong>Lesson</strong>: Small, focused PRs are the way to go. Large refactoring attempts often get stuck in review cycles.</p><h3>What’s Next</h3><p>As GSoC 2025 wraps up, I’m focusing on three key areas:</p><ol><li><strong>Response format standardization</strong> — Completing the refactoring to handle Google’s various response formats uniformly</li><li><strong>Red-teaming integrations — </strong>using Gemini models for red-teaming</li><li><strong>Support for multi-turn image generation — </strong>coding the support for keeping track of the edited images and viewing the history of the conversation</li><li><strong>New models </strong>— Adding documentation for new models and image generation, such as Nano Banana!</li></ol><h3>The Bigger Picture</h3><p>This project sits at the intersection of two important trends in AI: the rapid advancement of multimodal capabilities and the growing need for systematic evaluation. As AI models become more capable, our evaluation methods need to evolve to match.</p><p>The work I’ve done with Promptfoo and Gemini is just one piece of this puzzle, but it’s an important one. By making advanced AI evaluation more accessible, we’re helping ensure that the AI systems being deployed in the real world are thoroughly tested and reliable.</p><p>If you’re working on AI evaluation, multimodal systems, or just curious about the latest developments in AI tooling, I’d love to hear from you. The code and examples from this project will be available in the Promptfoo repository, and I’m always happy to discuss the technical details.</p><h4>Important Links</h4><ul><li><a href="https://docs.google.com/document/d/1R-5yXZTZnEOFyGBbOZSSfNHOimbcwUjuL6jEArhAyUY/edit?resourcekey=0-qSHehcI0aWF2tElnVrKBnA&amp;tab=t.0#heading=h.g2a7fwsr0iv">Link to proposal outlining the project scope and milestones</a></li></ul><p><em>This work was completed as part of Google Summer of Code 2025 with Google DeepMind and the Promptfoo team. Special thanks to Paige Bailey, Michael D’Angelo and the entire Promptfoo team for their guidance and support throughout the project.</em></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=47f48917af06" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Why Regression Testing LLMs is Essential: A Practical Guide with Promptfoo]]></title>
            <link>https://adel-muursepp.medium.com/why-regression-testing-llms-is-essential-a-practical-guide-with-promptfoo-7b39b636bf91?source=rss-8ef233249879------2</link>
            <guid isPermaLink="false">https://medium.com/p/7b39b636bf91</guid>
            <category><![CDATA[llm]]></category>
            <category><![CDATA[llm-evaluation]]></category>
            <category><![CDATA[promptfoo]]></category>
            <dc:creator><![CDATA[Adel Müürsepp]]></dc:creator>
            <pubDate>Tue, 22 Oct 2024 18:43:20 GMT</pubDate>
            <atom:updated>2024-10-22T18:43:20.534Z</atom:updated>
            <content:encoded><![CDATA[<p>The world of <strong>Large Language Models (LLMs)</strong> is moving faster than ever. New releases, upgraded features, and shifting costs keep developers on their toes. Working with LLMs can feel like trying to hit a moving target — but that’s also what makes it exciting. With every new model, you unlock new possibilities… <em>and potentially new bugs.</em> That’s why <strong>evaluating and regression testing</strong> your LLMs is no longer optional — it’s essential.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*T1cyGw-KPRSeCI7vKncJUQ.jpeg" /><figcaption>With so many new models, be wise in the LLM choices for your applications</figcaption></figure><p>In this article, we’ll explore <strong>why LLM testing matters</strong>, how to <strong>make smart decisions when adopting new models</strong>, and introduce you to <a href="https://www.promptfoo.dev/"><strong>promptfoo</strong></a>, a lightweight tool for testing LLMs with minimal fuss. Whether you’re building an AI-powered app or just curious about what goes on behind the scenes, this practical guide will show you how to keep things running smoothly in a fast-changing landscape.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*1NYH_6yYKMzuwKMCLL6jYg.png" /><figcaption>Promptfoo dashboard for test results</figcaption></figure><h3>Why Should You Evaluate and Regression Test LLMs?</h3><p>Imagine this: You’ve built a fantastic language-learning app powered by Llama 3.1. Your users love it, everything works, and life is good. Then Llama 3.2 is released, promising better performance and lower costs. Should you switch? Maybe. But what if the new model makes subtle mistakes, like losing the humor in a prompt or returning data in the wrong format? Even minor glitches can <strong>derail your user experience</strong> and create <strong>headaches down the line</strong>.</p><p><strong>Here’s the challenge:</strong> You can’t predict how each new model will behave just by looking at the release notes. That’s where <strong>regression testing</strong> comes in. It ensures your app’s core functionality stays intact as you introduce new models or tweak prompts.</p><ul><li><strong>Catch Hidden Errors</strong>: Tiny changes — like a missing punctuation mark — can cause unexpected failures in complex workflows.</li><li><strong>Optimize for Cost and Performance</strong>: Not every new model is worth adopting, especially if it sacrifices quality for speed.</li><li><strong>Stay Consistent</strong>: LLM-based apps rely on predictable outputs. One unpredictable response can break the entire process.</li></ul><h3>Enter Promptfoo: The Go-To Tool for LLM Regression Testing and Red-Teaming</h3><p><a href="https://www.promptfoo.dev/">Promptfoo </a>is a <strong>simple yet powerful tool for evaluating LLMs currently used by 30 000+ developers</strong>, helping you compare multiple models, monitor their performance, and catch issues before they reach users. Whether you need to <strong>validate new models</strong>, <strong>check output consistency</strong>, or <strong>optimize costs</strong>, promptfoo makes the whole process painless.</p><p>There are a few other tools as well, such as DeepEval, Ragas, MLFlow, Deepchecks and others. However, these tools generally lack the functionality, wide adoption or are geared more towards training/fine-tuning the models.</p><p>Think of it as your <strong>safety net</strong> when everything’s changing — whether it’s a new release, pricing update, or prompt adjustment. And the best part? You can run <strong>side-by-side tests</strong> for different models to see exactly how they perform under real-world conditions.</p><h3>Scenario: Evaluating a New Model Release</h3><p>Let’s say Meta just released <strong>Llama 3.2</strong>, and you want to know if it’s worth the switch from <strong>Llama 3.1</strong>. <strong>Llama 3.1 </strong>you used was <strong>8B</strong> parameters, however <strong>Llama 3.2 </strong>only has <strong>3B</strong> or <strong>11B</strong> parameter options. Should you switch to <strong>Llama 3.2 3B?</strong></p><p>Spoiler: newer isn’t always better! Smaller models might respond faster and save costs, but <strong>can they handle complex feedback</strong> as effectively as the larger versions?</p><h3>How to Set Up Regression Tests with Promptfoo</h3><p>Open your project where you have implemented LLMs through calling APIs like OpenAI, Anthropic, WatsonX, etc.</p><ol><li><strong>Initialize Promptfoo</strong>:</li></ol><pre>npx promptfoo@latest init</pre><p>You should see options like this:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*ho2C25M78_FqHwXhzeAqNw.png" /><figcaption>Choose which provider’s models you wish to test</figcaption></figure><p>This generates a sample test file promptfooconfig.yamlthat you can run to evaluate the models with some sample tests.</p><p><strong>2. Configure Both Models</strong>: Add <strong>Llama 3.1</strong> and <strong>Llama 3.2</strong> to your promptfooconfig.yaml file for side-by-side comparison.</p><pre>providers:<br>  - &quot;watsonx:meta-llama/llama-3-2-3b-instruct&quot;<br>  - &quot;watsonx:meta-llama/llama-3-1-8b-instruct&quot;</pre><p>By default, the file will have OpenAI models. If wish to run OpenAI models, be sure to have <a href="https://platform.openai.com/docs/quickstart">exported API key</a>:</p><p>export OPENAI_API_KEY=&quot;your_api_key_here&quot;</p><p>If you wish to run models by other provider, be sure to check the available options on <a href="https://github.com/promptfoo/promptfoo">Promptfoo GitHub</a>. To use WatsonX models export the following:</p><p>export WATSONX_AI_API_KEY=&quot;your_api_key_here&quot;</p><p>You can get the API key by logging into <a href="https://www.ibm.com/cloud">IBM cloud</a>. Click on Manage. Then click on Access (IAM).</p><p>export WATSONX_AI_PROJECT_ID=&quot;your_project_id&quot;</p><p>You can find a WatsonX Project ID logging into <a href="https://dataplatform.cloud.ibm.com/wx/home?context=wx&amp;adoper=\251210_1_L1">WatsonX</a> and opening a Prompt Lab.</p><p><strong>3. Run the Tests</strong>:</p><pre>npx promptfoo@latest eval</pre><p><strong>4. View the Results</strong> in Your Browser:</p><pre>npx promptfoo@latest view</pre><p><strong>5. Evaluate the LLMs Performance</strong></p><ul><li><strong>Output Quality</strong>: Are responses detailed and relevant?</li><li><strong>Latency</strong>: Is the new model faster or slower?</li><li><strong>Cost Efficiency</strong>: How much more (or less) will this model cost you?</li></ul><p>For instance, our tests showed that <strong>Llama 3.2 was 4.4 times cheaper</strong> but struggled with nuanced language feedback compared to Llama 3.1. In this case, <strong>sticking with the larger model might make sense for critical use cases</strong>, even if it costs more.</p><h3>How to Make Regression Testing a Habit</h3><p>Here’s the thing: <strong>LLMs evolve fast</strong>, and you need a way to stay ahead. <strong>Automating your regression tests</strong> ensures your app stays reliable even as models and prompts change. Tools like <strong>GitHub Actions</strong> make it easy to integrate promptfoo into your CI/CD pipeline, so tests run automatically whenever you update your code.</p><h3>Pro Tips for Effective LLM Testing</h3><ol><li><strong>Automate Testing with GitHub Actions</strong>: Schedule tests to run after every deployment.</li><li><strong>Monitor for Model Drift</strong>: Keep an eye on subtle changes when models get retrained or upgraded.</li><li><strong>Evaluate Multiple Metrics</strong>: Look beyond accuracy — check latency, format consistency, and cost too.</li><li><strong>Modularize Your Code</strong>: Keep LLM logic separate from core functionality, so switching models won’t break your app.</li></ol><h3>Conclusion: Stay Agile in a Fast-Changing Landscape</h3><p>Working with LLMs means <strong>embracing change</strong> — but with the right tools, you can <strong>stay ahead of the curve</strong>. Whether you’re testing a new release, refining prompts, or optimizing costs, <strong>promptfoo gives you the confidence</strong> to roll with every update.</p><p>By building <strong>continuous regression testing into your workflow</strong>, you’ll be ready to adopt the best models without worrying about hidden pitfalls. Remember: <strong>Every new model is an opportunity</strong>, but only if you test it right.</p><p>Stay agile, stay curious, and <strong>embrace every change as an opportunity</strong>. With <strong>promptfoo</strong> in your toolkit, you’ll be ready for whatever comes next. Happy testing! 🎉</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=7b39b636bf91" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Train own object detection model using ImageAI on Azure ML]]></title>
            <link>https://adel-muursepp.medium.com/train-own-object-detection-model-using-imageai-on-azure-ml-4d7e2e9e282c?source=rss-8ef233249879------2</link>
            <guid isPermaLink="false">https://medium.com/p/4d7e2e9e282c</guid>
            <category><![CDATA[imageai]]></category>
            <category><![CDATA[azure-machine-learning]]></category>
            <category><![CDATA[object-detection]]></category>
            <dc:creator><![CDATA[Adel Müürsepp]]></dc:creator>
            <pubDate>Sun, 18 Feb 2024 16:41:16 GMT</pubDate>
            <atom:updated>2024-04-25T18:23:10.152Z</atom:updated>
            <content:encoded><![CDATA[<p>I was working on a hackathon project to detect the ripeness of the fruits. Wishing to make it more interactive and allow for multiple predictions to be identified on the same screen, I was looking into creating my own object detection model.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/560/1*wHnFTFWuTOl4GR4znoTpUg.png" /><figcaption>The result: somewhat working object detection for an overripe strawberry</figcaption></figure><p>I followed the guide by Moses Olafenwa: <a href="https://medium.com/deepquestai/train-object-detection-ai-with-6-lines-of-code-6d087063f6ff">Train object detection AI with 6 lines of code</a> where he uses the ImageAI library and labels own training images.</p><p>Some notes: Google colab in his tutorial gave me an error because the runtime in Google Colab by default is 3.10 and installing the needed scipy version gave me issues. Running the model in Jupyter Notebook stops the kernel, so I started a notebook on Azure ML and imported my training and validation data there.</p><p>Log into <a href="https://ml.azure.com/">Azure Machine Learning studio</a> and create a new workspace.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*Wdl9ZAr0yp33a8Shg--uDw.png" /><figcaption>Create a workspace on Azure ML</figcaption></figure><p>In the workspace in Notebooks create a new notebook.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/444/1*errbvRNGXK8ViYqv3GNjWQ.png" /></figure><p>Then label the data following <a href="https://medium.com/deepquestai/train-object-detection-ai-with-6-lines-of-code-6d087063f6ff">Train object detection ai with 6 lines of code</a> tutorial and organize them into train and validation set. I used some photos from <a href="https://www.kaggle.com/datasets/raghavrpotdar/fresh-and-stale-images-of-fruits-and-vegetables">Kaggle Fresh and Stale Images of Fruits and Vegetables dataset</a> and included photos from the internet.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*Wrwkc1GCtUNCWsJqHvRcfA.png" /><figcaption>Labeling images with labelImg</figcaption></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*pAfHjJ7kPu_LOIYF2pomXQ.png" /><figcaption>Uploaded training and validation data with the notebook on Azure ML (follow the labeling instructions on Moses Olafenwa tutorial)</figcaption></figure><p>In the notebook install the pretrained model and the libraries. Note that I started my notebook with Python 3.8 and installed earlier Tensorflow packages that would work with the earlier imageai library.</p><pre>!wget https://github.com/OlafenwaMoses/ImageAI/releases/download/essential-v4/pretrained-yolov3.h5</pre><pre># Install the libraries<br>!pip install tensorflow==2.4.0<br>!pip install keras==2.4.3<br>!pip install numpy==1.19.3 pillow==7.0.0 scipy==1.4.1 h5py==2.10.0 matplotlib==3.3.2 opencv-python keras-resnet==0.2.0</pre><pre># Install the earlier version of imageai<br>!pip install imageai==2.1.6</pre><p>Train the model using your data:</p><pre>from imageai.Detection.Custom import DetectionModelTrainer<br><br>trainer = DetectionModelTrainer()<br>trainer.setModelTypeAsYOLOv3()<br>trainer.setDataDirectory(data_directory=&quot;./final_data&quot;)<br>trainer.setTrainConfig(object_names_array=[&quot;raw-strawberry&quot;, &quot;ripe-strawberry&quot;, &quot;ripe-1-strawberry&quot;, &quot;ripe-3-strawberry&quot;, &quot;overripe-1-strawberry&quot;, &quot;overripe-3-strawberry&quot;], batch_size=4, num_experiments=1400, train_from_pretrained_model=&quot;./pretrained-yolov3.h5&quot;)<br>trainer.trainModel()</pre><p>Test your model:</p><pre>from imageai.Detection.Custom import CustomObjectDetection<br><br>detector = CustomObjectDetection()<br>detector.setModelTypeAsYOLOv3()<br>detector.setModelPath(&quot;./final_data/models/detection_model-ex-060--loss-0014.903.h5&quot;)<br>detector.setJsonPath(&quot;./final_data/json/detection_config.json&quot;)<br>detector.loadModel()<br><br>detections = detector.detectObjectsFromImage(input_image=&quot;./rotten_strawberry_300.jpg&quot;, output_image_path=&quot;./rotten_strawberry_300_output.jpg&quot;, minimum_percentage_probability=65)<br>print(detections)<br>for detection in detections:<br>    print(detection[&quot;name&quot;], &quot; : &quot;, detection[&quot;percentage_probability&quot;], &quot; : &quot;, detection[&quot;box_points&quot;])</pre><p>Currently my trained model does not work equally well for all the classes and definitely requires a lot more training images. However, for a hackathon project of 24 hours it was sufficient. In addition, my Azure subscription currently does not support GPU compute, so my next steps would be to get better compute for the training.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=4d7e2e9e282c" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Riigieksami kirjandite teemad aasta kaupa]]></title>
            <link>https://adel-muursepp.medium.com/riigieksami-kirjandite-teemad-aasta-kaupa-b16baeabf842?source=rss-8ef233249879------2</link>
            <guid isPermaLink="false">https://medium.com/p/b16baeabf842</guid>
            <dc:creator><![CDATA[Adel Müürsepp]]></dc:creator>
            <pubDate>Sat, 27 Mar 2021 11:45:07 GMT</pubDate>
            <atom:updated>2024-04-25T18:24:24.307Z</atom:updated>
            <content:encoded><![CDATA[<p>Siin on kokku kogutud aasta kaupa kirjandite teemad. Teemad on võetud Innove kodulehelt</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*sdYAIFnGy6w6oMBs" /></figure><h4>2015</h4><p>Kirjuta umbes 400-sõnaline arutlev kirjand, milles analüüsid Eesti elu käsitlemist nüüdisaja kirjanduses ja/või filmikunstis. Pealkirjasta kirjand.</p><p>Kirjuta umbes 400-sõnaline arutlev kirjand, milles analüüsid Eesti rahvastiku vähenemisest ja paiknemisest tingitud probleeme. Arutle ka selle üle, mida on probleemide lahendamiseks ette võetud ning kui tulemuslikud on lahendused olnud. Too näiteid tänapäeva Eesti oludest ja/või ajakirjandusest. Pealkirjasta kirjand. Kirjuta umbes 400-sõnaline arutlev kirjand, milles analüüsid Eesti rahvastiku vähenemisest ja paiknemisest tingitud probleeme. Arutle ka selle üle, mida on probleemide lahendamiseks ette võetud ning kui tulemuslikud on lahendused olnud. Too näiteid tänapäeva Eesti oludest ja/või ajakirjandusest. Pealkirjasta kirjand.</p><p>Kirjuta umbes 400-sõnaline arutlev kirjand, milles analüüsid riikidevahelisi suhteid nüüdisaegses maailmas. Arutle ka selle üle, kuidas võivad riikidevahelised suhted mõjutada kodanike elu. Too näiteid ajakirjandusest ja/või tänapäeva ühiskonnast. Pealkirjasta kirjand.</p><p>Kirjuta umbes 400-sõnaline arutlev kirjand, milles analüüsid tänapäeva teaduse ja tehnika arendamisega kaasnevaid eetilisi probleeme. Arutle ka selle üle, kas teadlaste tegevusel peaks olema piirid. Too näiteid populaarteadusest ja/või kirjandusest ja/või filmikunstist. Pealkirjasta kirjand.</p><h4>2016</h4><p>Kirjuta umbes 400-sõnaline arutlev kirjand, milles analüüsid, mis tähendus on asjadel inimeste jaoks ja kuidas asjadega seotud eelarvamused nende käitumist mõjutavad. Too näiteid ajakirjandusest ja/või kirjandusest ja/või filmikunstist. Pealkirjasta kirjand.</p><p>Kirjuta umbes 400-sõnaline arutlev kirjand, milles analüüsid inimeste suhtumist aususesse ja petmisesse ning kuidas see suunab nende otsuseid. Too näiteid kirjandusest ja/või ühiskonnaelu valdkondadest. Pealkirjasta kirjand.</p><p>Kirjuta umbes 400-sõnaline kirjand, milles arutled hariduse ja vabaduse seoste üle. Too näiteid nüüdisaja ühiskonnast ja/või ajaloost ja/või kirjandusest. Pealkirjasta kirjand.</p><p>Kirjuta umbes 400-sõnaline arutlev kirjand, milles käsitled inimese ja elukeskkonna vastastikust mõju (nii positiivset kui ka negatiivset). Too näiteid kirjandusest ja/või teadusmaailmast ja/või igapäevaelust. Pealkirjasta kirjand.</p><h4>2017</h4><p>Kirjuta umbes 400-sõnaline arutlev kirjand, milles käsitled ilukirjanduse mõju tänapäeva ühiskonnas ning analüüsid, kas ilukirjandus on eluliselt vajalik nähtus. Pealkirjasta kirjand.</p><p>Kirjuta umbes 400-sõnaline arutlev kirjand, milles analüüsid, kuidas muudab tehnoloogia areng tööturgu ja/või õppimisvõimalusi ning mis on selle positiivsed ja negatiivsed küljed. Too näiteid ilukirjandusest ja/või ajakirjandusest ja/või ühiskonnaelu valdkondadest. Pealkirjasta kirjand.</p><p>Kirjuta umbes 400-sõnaline arutlev kirjand, milles analüüsid, kuidas mõjutavad stereotüübid tänapäeval arvamust soorollidest ja missugused muutused on toimunud inimeste arusaamades viimase sajandi jooksul. Too näiteid draama- ja/või filmikunstist ja/või kirjandusest ja/või Eesti ühiskonnast. Pealkirjasta kirjand.</p><p>Kirjuta umbes 400-sõnaline arutlev kirjand, milles analüüsid, mis tagajärjed võivad olla, kui inimesed alahindavad ohte ja ülehindavad võimalusi, mida on kaasa toonud informatsioonist küllastatud ja sotsiaalmeediast mõjutatud maailm. Too näiteid ilukirjandusest ja/või Eesti ühiskonnast ja/või maailmast. Pealkirjasta kirjand.</p><h4>2018</h4><p>Kirjuta umbes 400-sõnaline arutlev kirjand, milles analüüsid, kui kerge või raske on inimestel iseendaks jääda kiiresti muutuvas maailmas. Too näiteid ilukirjandusest ja/või draama- ja/või filmikunstist. Pealkirjasta kirjand.</p><p>Kirjuta umbes 400-sõnaline arutlev kirjand, milles analüüsid, kuidas kultuur ning majandus üksteist mõjutavad. Too näiteid ajaloost ja/või tänapäeva ühiskonnast. Pealkirjasta kirjand.</p><p>Kirjuta umbes 400-sõnaline arutlev kirjand, milles käsitled põhjuseid, miks inimesed tänapäeval rändavad ja/või endale uut elupaika otsivad. Too näiteid Eestist ja/või mujalt maailmast ja/või rännuraamatutest-reisikirjadest ja/või filmikunstist. Pealkirjasta kirjand.</p><p>Kirjuta umbes 400-sõnaline arutlev kirjand, milles analüüsid, kuidas noorte keelekasutus mõjutab eesti keele tulevikku. Too näiteid haridusest ja/või kultuurist ja/või meediast. Pealkirjasta kirjand.</p><h4>2019</h4><p>Kirjuta umbes 400-sõnaline kirjand, milles arutled, kas kirjaniku eluloo tundmine on tema teoste mõistmise seisukohalt vajalik. Too näiteid mineviku ja/või tänapäeva ühiskonnast ja/või kirjandusest ja/või filmikunstist. Pealkirjasta kirjand.</p><p>Kirjuta umbes 400-sõnaline kirjand, milles käsitled probleeme, millega Eesti ühiskonnal lähitulevikus tegeleda tuleb, ja arutled, kuidas sinu põlvkond saaks aidata neid probleeme lahendada. Too näiteid Eesti ühiskonnast ja/või meediast ja/või uuemast Eesti kirjandusest. Pealkirjasta kirjand.</p><p>Kirjuta umbes 400-sõnaline kirjand, milles arutled, kas avalikus ruumis eksponeeritud kunsti on vaja ja kuidas see inimesi mõjutab. Too näiteid Eesti ja/või maailma (kunsti)ajaloost ja/või tänapäeva elust. Pealkirjasta kirjand.</p><p>Kirjuta umbes 400-sõnaline kirjand, milles arutled, milliseid kahjulikke kõrvalmõjusid tehnika areng tänapäeva inimese vaimsele ja füüsilisele tervisele kaasa toob. Too näiteid tänapäeva elust ja/või meediast ja/või ilukirjandusest ja/või filmikunstist. Pealkirjasta kirjand.</p><h4>2020</h4><p>Kirjuta umbes 400-sõnaline arutlev kirjand, milles analüüsid, miks on üksikisikule tähtis hoida sidet minevikuga. Too näiteid ilukirjandusest ja/või filmikunstist ja/või ajaloost ja/või tänapäevast. Pealkirjasta kirjand.</p><p>Kirjuta umbes 400-sõnaline arutlev kirjand, milles analüüsid, miks on huumorit vaja nii ühiskonnale kui ka üksikisikule. Too näiteid ilukirjandusest ja/või draama- ja/või filmikunstist ja/või meediast. Pealkirjasta kirjand.</p><p>Kirjuta umbes 400-sõnaline arutlev kirjand, milles analüüsid edu olemust ning edukuse positiivseid ja negatiivseid külgi. Too näiteid ilukirjandusest ja/või filmikunstist ja/või meediast ja/või ühiskonnaelust. Pealkirjasta kirjand.</p><p>Kirjuta umbes 400-sõnaline arutlev kirjand, milles analüüsid põhjusi, miks on toitumise ja/või eluviisi teema muutunud aktuaalseks. Too näiteid ühiskonnast ja/või meediast ja/või populaarteadusest. Pealkirjasta kirjand.</p><p>Allikas: <a href="https://innovesa.sharepoint.com/sites/SA_Innove_testide_keskus/Shared%20Documents/Forms/AllItems.aspx?originalPath=aHR0cHM6Ly9pbm5vdmVzYS5zaGFyZXBvaW50LmNvbS86Zjovcy9TQV9Jbm5vdmVfdGVzdGlkZV9rZXNrdXMvRWdJdlI2TEc2dU5QaFhPdkVvd2dZY3NCSWtUemVaTjd3TlhMNnlyN1ZUTWtndz9ydGltZT1fN2VueUJMeDJFZw&amp;viewid=d485cc14%2D3553%2D49f3%2Da6e6%2Dedc0a7da7f9f&amp;id=%2Fsites%2FSA%5FInnove%5Ftestide%5Fkeskus%2FShared%20Documents%2FRiigieksamid%2FEesti%20keel">Harno testide keskus</a></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=b16baeabf842" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Simply, how do I clone a git repo?]]></title>
            <link>https://levelup.gitconnected.com/simply-how-do-i-clone-a-git-repo-f823ab3b805c?source=rss-8ef233249879------2</link>
            <guid isPermaLink="false">https://medium.com/p/f823ab3b805c</guid>
            <category><![CDATA[coding]]></category>
            <category><![CDATA[github]]></category>
            <category><![CDATA[git]]></category>
            <category><![CDATA[beginner]]></category>
            <category><![CDATA[programming]]></category>
            <dc:creator><![CDATA[Adel Müürsepp]]></dc:creator>
            <pubDate>Mon, 04 May 2020 13:01:52 GMT</pubDate>
            <atom:updated>2024-04-25T18:25:01.293Z</atom:updated>
            <content:encoded><![CDATA[<p>So many tutorials, so many commands. I just want to download a friend’s code and play around with it.</p><p><strong>Can somebody please tell the steps to download a repository without my terminal showing crazy error alien language?</strong></p><p>Here are simple steps you need to put in your terminal to land a repo from Github to your computer.</p><p>I have also outlined all steps you need for pushing code in the same or your own repo.</p><h3>Steps to clone a project</h3><h4>Getting the link</h4><ul><li>Go to the project on github</li><li>Click on the green button for cloning</li><li>Copy the link</li></ul><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*EKeAQycP5-jVR9PXsWaOmw.png" /></figure><h4>Terminal</h4><ul><li>Open Terminal. Hit Cmd + Spacebar, type in Terminal</li><li>Go to the location where you want to download the code. For this use cd &lt;here insert folder name&gt; command. If you feel lost, just skip this step</li></ul><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*1exPXkr5cl8xNWma76dLHw.png" /></figure><h4>Cloning</h4><ul><li>In your chosen location type to Terminal: git clone &lt;paste link here&gt;</li><li>You are done!</li></ul><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*hg2uH-3HocV9z5KhF2u0RQ.png" /></figure><h3>Steps to push code to Github 🌎</h3><p>This is a bit harder but if you follow the steps, you won’t have any errors.</p><h4>Changing code</h4><ul><li>Open Pycharm (if you have another editor, use your own)</li><li>Click on ‘Open’ and find the file on your computer. It should be in the same named folder as the github repository</li><li>Write something inside, that you would like to change</li><li>When done, save the file. For this press <em>command</em> + S</li><li>The file is changed!</li></ul><h4>Terminal</h4><ul><li>Open Terminal</li><li>Find the file folder. For this use cd &lt;folder name here&gt; command in the Terminal. It is the same one where you cloned it.</li><li>In the right folder (it should be named the same as github repo), use command ls - you should see your file there</li></ul><h4>Git add</h4><ul><li>You can type git status to see if the file was changed - but this is not necessary</li><li>In terminal, type git add &lt;file name here&gt;</li><li>You can again type git status to see if the file was added - but this is not necessary</li></ul><h4>Git commit</h4><ul><li>You can type git status for some information</li><li>In terminal, type git commit -m&#39;insert a message here about your change&#39;</li><li>You can type git status for some information</li></ul><h4>Git push</h4><ul><li>In terminal, type git push</li><li>You have pushed the code!! 🥳🎉</li></ul><h4>Github</h4><ul><li>Go to github.com</li><li>Look at how beautiful your code looks on the internet! 💕</li></ul><p>Note: Unless it is your repo, the owner will have to accept your change. If you see errors about this, don’t panic! Ask the owner to add you as collaborator.</p><p>This is the basic survival kit for Github. Now go and share your code with the world!</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=f823ab3b805c" width="1" height="1" alt=""><hr><p><a href="https://levelup.gitconnected.com/simply-how-do-i-clone-a-git-repo-f823ab3b805c">Simply, how do I clone a git repo?</a> was originally published in <a href="https://levelup.gitconnected.com/">Level Up Coding</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[How do I even learn Python?]]></title>
            <link>https://adel-muursepp.medium.com/how-do-i-even-learn-python-da45ac6f38ae?source=rss-8ef233249879------2</link>
            <guid isPermaLink="false">https://medium.com/p/da45ac6f38ae</guid>
            <category><![CDATA[beginner]]></category>
            <category><![CDATA[programming]]></category>
            <category><![CDATA[python-programming]]></category>
            <category><![CDATA[python]]></category>
            <category><![CDATA[pycharm]]></category>
            <dc:creator><![CDATA[Adel Müürsepp]]></dc:creator>
            <pubDate>Wed, 29 Apr 2020 15:44:16 GMT</pubDate>
            <atom:updated>2026-01-03T11:53:17.241Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*joLvZCC0FygcziXce-4hHg.jpeg" /><figcaption>Python is a great first language for data science and web dev!</figcaption></figure><p>Programming is the magic power of 21st century — yes, yes, we already know it.</p><h4>But how exactly do I start learning it?</h4><p>Here’s how you should think of coding and how you will be successful.</p><p>This is the absolute best way I have learned from studying code formally in school, in the boot camp and as a programming teacher at the Le Wagon bootcamp.</p><h4><strong>Mindset</strong></h4><p>When people begin to learn programming they don’t exactly know if coding is this crazy mysterious thing hackers do or rather if the mantra “Everyone can code” is true.</p><p>So how hard is it?</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*_oRrihN7eBxYZ4143pWqMg.jpeg" /><figcaption>No, coding doesn’t look like this. When I was a teenager, however, this was my understanding of it.</figcaption></figure><p>Truth is, programming is about problem solving. <strong>You have a problem</strong> or task, and <strong>you have to find what detail/logic is wrong</strong>. It is kind of like solving sudokus.</p><p>It is about as much effort as learning to play tennis decently and as hard as writing essays. It is doable. However, if you are afraid of the racket and practice tennis once a week, you will not be successful at it.</p><p>Takeaway: your grandma won’t probably learn to play tennis very well and code programs. However, if you learn, you will 🧑‍💻</p><h4><strong>Time management</strong></h4><p>Alright, you are up to some working? How long and when then?</p><p>Creating a time schedule is probably just too much. Just try to do half an hour each day, then an hour each day next month. Think of it as accustoming yourself to the habit of cleaning — you don’t have a time schedule for cleaning, you just do it a little each day.</p><p>However the progress will be very noticeable 👍</p><h4>Motivation</h4><p>They say you can learn to code alone. Or on Udemy.</p><p>Sorry to break it to you. It is so very very hard to do. Tutorial hell is real. It is a term for when you go through the entire tutorial and understand you did not actually learn anything at all.</p><p>Taking online courses is great for learning the syntax, introducing you to new languages/frameworks. But most often than not you will be learning a very irrelevant topic (as justify about 10 Udemy courses I never finished) or you just simply don’t understand the <strong>idea </strong>of what you’re learning.</p><p>The best way is to find a coding buddy, or take a coding boot camp. I was teaching coding at the Le Wagon coding bootcamp. It is in person and very useful but I think you can very well do affordable ones at home. Your goal shall be to take any <strong>project focused </strong>bootcamp type of course. Learn Django and CRUD. Or data science basics. Then stop with the theory.</p><p><strong>It is then important you use your creativity. </strong>Pick a problem and start thinking how to implement new features. For example, I set myself a challenge on building an apartment listing website:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*1iMmMyhuvod366y3XU4_0A.png" /><figcaption>Imagine me whiteboarding features and designs like in Social Network 😄</figcaption></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/950/1*9HAr_3Lr8Ce_wUGYEcOAJQ.png" /><figcaption>A simple challenge turned it into a mountain of coding… Most importantly, it was driven by my own curiosity</figcaption></figure><p>This type of challenge mindset made my brain remember all the CRUD basics and deeply remember web dev basics. Try to have the mindset of <strong>“I wonder how far I can take my project on my own?”</strong> After all, if you get stuck, you can always consult AI :)</p><p>Additionally, here are some best tips for beginners:</p><h4>Tips for learning to code</h4><p>Those are not necessary but all useful👍✨</p><ul><li>Stay curious. Coding requires discipline in the beginning. It seems like regular boring work at times. But actually it is the best possible work you could have- you are learning about how our entire world is put on internet and building apps like none of your friends are able to. Get interested and google everything that you want to ask, try to know more than is needed — this way you are not only remembering text, but understanding what you are building. Some of my favourite googlings: <a href="https://developers.google.com/web/updates/2018/09/inside-browser-part1">What is browser?</a>, <a href="http://www.steves-internet-guide.com/http-basics/">How internet works?</a></li><li>Try to read Medium articles about coding (maybe every day?). Medium is the place where you can catch up with trends in the code world and sound smart when talking to professional developers 😉 Try out little tutorials about terminal for example. As I do Data Science, I follow Towards Data Science thread.</li><li>Keep away from AI! Learn on your own, think deeply. Yes, it is hard to keep in mind all the syntax always. But try to become a master of one language and take it as far as you can on your own.</li><li>Think how you can make flash cards for yourself easily — coding is like a language, you need to memorize words to be able to speak it. I would personally do 50 flash cards <strong>every day</strong>. And then review them. Although paper works, I think Flash Cards Go is a decent app as well 👈 Particularly, in the beginning simply memorize terminal commands, basic syntax of Python.</li><li>Learn to type using all ten fingers just right and practise typing as much as possible (It is a good motivation for dull work on Word 🤓). <a href="http://keybr.com/">Keybr</a> is the absolute best for practise. Another thing you can do, is to make your keys different color for each finger. As I didn’t want to do it, I drawed a colorful keyboard on paper and practiced on it 💁‍♀️</li><li>Know how to find all the symbols on keyboard. Keyboard map works well, but know how to use Keyboard Viewer.</li><li>Learn basic Spectacle short cuts so you can fit multiple screens easily and be a more efficient coder💪 Install Spectacle for Mac: <a href="https://www.spectacleapp.com/">Spectacle</a></li><li>If you can, use Chrome. If you want, remember a couple short cuts that you like using in Chrome. Inspect everything using Chrome Developer Tools!</li><li>Post a question on Stack Overflow. Stack Overflow and its coding community will be your best friend for the time. It is nice to get used to it and know how to find answers. (For example I got my whole project fixed by a random dude 💕) Stack overflow: <a href="https://stackoverflow.com/">Stack Overflow link</a></li><li>If you <strong>really</strong> love using a mouse with computer, you can do it. It is not common though, better and faster is to navigate with shortcuts than clicking on pages.</li></ul><h4>Main takeaways:</h4><p>Find some coding buddies 👬</p><p>Stay curious and try doing it every day</p><p>I believe in you. It is hard work, and hard work pays off, right?</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=da45ac6f38ae" width="1" height="1" alt="">]]></content:encoded>
        </item>
    </channel>
</rss>