<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Yonatan Karp-Rudin</title><link>https://yonatankarp.github.io/he/</link><description>Recent content on Yonatan Karp-Rudin</description><generator>Hugo</generator><language>he</language><lastBuildDate>Sun, 15 Mar 2026 00:00:00 +0100</lastBuildDate><atom:link href="https://yonatankarp.github.io/he/index.xml" rel="self" type="application/rss+xml"/><item><title>ff4j (contributor)</title><link>https://yonatankarp.github.io/he/projects/ff4j/</link><pubDate>Sun, 15 Mar 2026 00:00:00 +0100</pubDate><guid>https://yonatankarp.github.io/he/projects/ff4j/</guid><description>&lt;p&gt;כתיבת מיגרציית javax-to-jakarta. מוזג אך לא שוחרר על ידי המתחזקים &amp;ndash; המניע לבניית ff4k.&lt;/p&gt;</description></item><item><title>TaleKeeper</title><link>https://yonatankarp.github.io/he/projects/talekeeper/</link><pubDate>Sun, 01 Mar 2026 00:00:00 +0100</pubDate><guid>https://yonatankarp.github.io/he/projects/talekeeper/</guid><description>&lt;p&gt;מקליט סשנים TTRPG מבוסס AI עם תמלול חי, זיהוי דוברים וסיכומי סשנים. Python/FastAPI + Svelte 5.&lt;/p&gt;</description></item><item><title>sse-mcp-server</title><link>https://yonatankarp.github.io/he/projects/sse-mcp-server/</link><pubDate>Thu, 01 Jan 2026 00:00:00 +0100</pubDate><guid>https://yonatankarp.github.io/he/projects/sse-mcp-server/</guid><description>&lt;p&gt;שרת SSE MCP מבוסס Kotlin לביצוע כלים בסוכני AI (Flowise).&lt;/p&gt;</description></item><item><title>ff4k</title><link>https://yonatankarp.github.io/he/projects/ff4k/</link><pubDate>Mon, 01 Dec 2025 00:00:00 +0100</pubDate><guid>https://yonatankarp.github.io/he/projects/ff4k/</guid><description>&lt;p&gt;ספריית feature flags ל-Kotlin Multiplatform עם תצורת DSL, מספר בסיסי נתונים (JDBC, R2DBC, SQLite) והפצת קונטקסט בטוחה עם coroutines.&lt;/p&gt;</description></item><item><title>Staff Software Engineer - Payments</title><link>https://yonatankarp.github.io/he/experience/billie-staff-payments/</link><pubDate>Wed, 01 Oct 2025 00:00:00 +0100</pubDate><guid>https://yonatankarp.github.io/he/experience/billie-staff-payments/</guid><description>&lt;p&gt;הקמתי את ה-Compliance Service כ-domain חדש &amp;ndash; transaction monitoring, screening ו-sanctions checks. כתבתי את ה-tech spec, הגדרתי APIs והובלתי את האינטגרציה עם ComplyAdvantage. בניתי cronjob monitoring tool ב-Backstage. חבר בצוות הארכיטקטורה.&lt;/p&gt;</description></item><item><title>Staff Software Engineer - Risk</title><link>https://yonatankarp.github.io/he/experience/billie-staff-risk/</link><pubDate>Tue, 01 Apr 2025 00:00:00 +0100</pubDate><guid>https://yonatankarp.github.io/he/experience/billie-staff-risk/</guid><description>&lt;p&gt;הובלתי יוזמות ארכיטקטורה &amp;ndash; API-first design, שיפור CI pipelines ואימוץ AI. מיגרציה מ-Spring Boot 3 ל-4 כולל contributions ל-openapi-generator.&lt;/p&gt;</description></item><item><title>XKCD: מטאיל לתמונה - לראות את התמונה המלאה</title><link>https://yonatankarp.github.io/he/blog/xkcd-from-tile-to-picture/</link><pubDate>Wed, 26 Jun 2024 00:00:00 +0100</pubDate><guid>https://yonatankarp.github.io/he/blog/xkcd-from-tile-to-picture/</guid><description>&lt;h2 id="מבוא"&gt;מבוא&lt;/h2&gt;
&lt;p&gt;אם יש דבר אחד שאני יכול לומר על עצמי, זה שאני אוהב אתגרים שקשורים לתכנות. הם לא חייבים להיות משמעותיים או אפילו שימושיים, אבל אני נהנה מהאתגר. לכן כשראיתי את ההודעה הזו ב-LinkedIn שלי, הייתי חייב לקחת על עצמי את האתגר!&lt;/p&gt;
&lt;p&gt;&lt;img src="https://yonatankarp.github.io/images/blog/kb-linkedin-message-1024x685.png" alt=""&gt;&lt;/p&gt;
&lt;p&gt;אם אתם לא מכירים את XKCD, הנה מה שויקיפדיה אומרת עליו:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;xkcd, sometimes styled XKCD, is a webcomic created in 2005 by American author Randall Munroe. The comic&amp;rsquo;s tagline describes it as &amp;ldquo;a webcomic of romance, sarcasm, math, and language&amp;rdquo;. Munroe states on the comic&amp;rsquo;s website that the name of the comic is not an initialism but &amp;ldquo;just a word with no phonetic pronunciation&amp;rdquo;.&lt;/p&gt;</description></item><item><title>איך לתקן קונפיגורציות שגויות ב-RedisTemplate</title><link>https://yonatankarp.github.io/he/blog/fix-misconfigurations-redistemplate/</link><pubDate>Wed, 05 Jun 2024 00:00:00 +0100</pubDate><guid>https://yonatankarp.github.io/he/blog/fix-misconfigurations-redistemplate/</guid><description>&lt;h2 id="מבוא"&gt;מבוא&lt;/h2&gt;
&lt;p&gt;הסיפור שלנו מתחיל עם עמית ואני שמנסים לדבג בעיה בפרויקט שלנו כמה שעות. היינו צריכים לשלוף ערך מ-Redis, אבל בכל פעם שהשירות רץ, הערך שחזר היה &lt;code&gt;null&lt;/code&gt;. למרות המאמצים שלנו, לא מצאנו פתרון באינטרנט, ולמרות הכל — הקוד שלנו היה מכוסה בטסטים שכולם עברו!&lt;/p&gt;
&lt;p&gt;במאמר הזה נחקור בעיה נפוצה כשמשתמשים ב-&lt;code&gt;RedisTemplate&lt;/code&gt; באפליקציות Spring. נדגים איך קונפיגורציות שגויות יכולות לגרום לכך שהטסטים עוברים אבל שליפת הנתונים הנכונים נכשלת. בנוסף, נראה איך לקנפג &lt;code&gt;RedisTemplate&lt;/code&gt; בצורה נכונה כדי להימנע מהבעיה.&lt;/p&gt;</description></item><item><title>poor-life-choices</title><link>https://yonatankarp.github.io/he/projects/poor-life-choices/</link><pubDate>Mon, 01 Jan 2024 00:00:00 +0100</pubDate><guid>https://yonatankarp.github.io/he/projects/poor-life-choices/</guid><description>&lt;p&gt;אפליקציית שיתוף מיד לחברים. JavaScript/React, פעיל ב-Vercel.&lt;/p&gt;</description></item><item><title>Senior Software Engineer - Risk</title><link>https://yonatankarp.github.io/he/experience/billie-senior-risk/</link><pubDate>Wed, 01 Nov 2023 00:00:00 +0100</pubDate><guid>https://yonatankarp.github.io/he/experience/billie-senior-risk/</guid><description>&lt;p&gt;בניית מערכות risk ו-compliance עבור פלטפורמת B2B BNPL. פיתוח core services לניתוח אשראי ועיבוד עסקאות.&lt;/p&gt;</description></item><item><title>Observability בפעולה: איך להשתמש ב-OpenTelemetry</title><link>https://yonatankarp.github.io/he/blog/observability-in-action-opentelemetry/</link><pubDate>Tue, 17 Oct 2023 00:00:00 +0100</pubDate><guid>https://yonatankarp.github.io/he/blog/observability-in-action-opentelemetry/</guid><description>&lt;h2 id="מבוא"&gt;מבוא&lt;/h2&gt;
&lt;p&gt;במאמר הזה נצלול לתוך השלבים של הוספת observability לקוד שלכם באמצעות OpenTelemetry. קודם, נפתח ספרייה שמושכת נתונים מ-remote API. אחרי זה, נבנה שירות שמשתמש בספרייה הזו לשליפה ושמירה של הנתונים במסד נתונים.&lt;/p&gt;
&lt;p&gt;תוך כדי, נשלב OpenTelemetry ב-Kotlin backend service שלנו, ונדגים את ההתנהגות בסביבה שדומה לפרודקשן. אחרי שהשירות יהיה מצויד ב-instrumentation, נוסיף לו filter שדוחה בקשות גדולות מדי. גם ה-filter הזה יהיה עם instrumentation.&lt;/p&gt;
&lt;p&gt;כל דוגמאות הקוד לסדרה הזו זמינות ב-GitHub:&lt;/p&gt;</description></item><item><title>Konsist (contributor)</title><link>https://yonatankarp.github.io/he/projects/konsist/</link><pubDate>Sun, 01 Oct 2023 00:00:00 +0100</pubDate><guid>https://yonatankarp.github.io/he/projects/konsist/</guid><description>&lt;p&gt;שיפורי צינור CI, אימות קטעי קוד ותיקוני טיפול ב-null עבור מנתח הקוד הסטטי ל-Kotlin. 3 PRs שמוזגו.&lt;/p&gt;</description></item><item><title>openapi-generator (contributor)</title><link>https://yonatankarp.github.io/he/projects/openapi-generator/</link><pubDate>Tue, 01 Aug 2023 00:00:00 +0100</pubDate><guid>https://yonatankarp.github.io/he/projects/openapi-generator/</guid><description>&lt;p&gt;הוספת תמיכה ב-Spring Boot 4 ו-Jackson 3 עבור מחולל Kotlin Spring. 10 PRs כולל תיקונים לתבניות Retrofit ו-Jackson.&lt;/p&gt;</description></item><item><title>xkcd-click-and-drag</title><link>https://yonatankarp.github.io/he/projects/xkcd-click-and-drag/</link><pubDate>Thu, 01 Jun 2023 00:00:00 +0100</pubDate><guid>https://yonatankarp.github.io/he/projects/xkcd-click-and-drag/</guid><description>&lt;p&gt;שחזור תמונה מלאה של קומיקס XKCD המפורסם #1110 באמצעות Kotlin.&lt;/p&gt;</description></item><item><title>[שאלות ראיון] Concurrency לעומת Parallelism: פענוח האשליה של הבו-זמניות</title><link>https://yonatankarp.github.io/he/blog/interview-questions-concurrency-parallelism/</link><pubDate>Sat, 11 Mar 2023 00:00:00 +0100</pubDate><guid>https://yonatankarp.github.io/he/blog/interview-questions-concurrency-parallelism/</guid><description>&lt;blockquote&gt;
&lt;p&gt;TL;DR - מה ההבדלים בין תכנות concurrent לתכנות parallel?&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;אחד הפוסטים המוצלחים שלי עד כה הוא הסבר מפורט על שאלת הראיון האהובה עלי (ראו &lt;a href="https://yonatankarp.com/how-does-hashmap-work-in-java"&gt;How does HashMap work in Java?&lt;/a&gt; לפרטים נוספים). לכן החלטתי ליצור סדרה של פוסטים שמפרקים שאלות נוספות. כל השאלות שיוענו בסדרה הזו שימשו בתהליך הגיוס של המעסיק הנוכחי שלי.&lt;/p&gt;
&lt;p&gt;בפוסט של היום נתמקד ב-concurrent ו-parallel programming. אז בלי יותר דברי פתיחה, בואו נתחיל!&lt;/p&gt;
&lt;h2 id="ההבדל-בין-concurrency-ל-parallelism"&gt;ההבדל בין Concurrency ל-Parallelism&lt;/h2&gt;
&lt;p&gt;למרות ש-concurrency ו-parallelism קשורים זה לזה, הם בהחלט לא אותו דבר. יש הרבה הגדרות ל-concurrency ול-parallelism. ההגדרה האישית האהובה עלי היא:&lt;/p&gt;</description></item><item><title>פתרון בעיות מהחיים: לקחים מעקרונות ההנדסה שלי</title><link>https://yonatankarp.github.io/he/blog/real-life-problem-solving-engineering-principles/</link><pubDate>Sun, 05 Mar 2023 00:00:00 +0100</pubDate><guid>https://yonatankarp.github.io/he/blog/real-life-problem-solving-engineering-principles/</guid><description>&lt;p&gt;המעסיק שלי הודיע לפני כמה חודשים שכל עובד שעובד שלוש שנים ומעלה זכאי ל-sabbatical — חופשה בתשלום מלא למשך חודש לפי בחירתו. מאחר שאשתי ואני צברנו מספר ניכר של ימי חופשה, החלטנו לצאת למסע של חודשיים לאסיה — יעד שתמיד רצינו לבקר בו. בפוסט הזה אתאר צעד אחר צעד איך יישמתי שיטות מעבודת היומיום שלי כמהנדס תוכנה לפתרון בעיות מהחיים.&lt;/p&gt;
&lt;h2 id="עיקרון-1-בסוף-משהו-תמיד-יישבר-בפרודקשן"&gt;עיקרון 1: בסוף משהו תמיד יישבר בפרודקשן&lt;/h2&gt;
&lt;p&gt;&lt;img src="https://yonatankarp.github.io/images/blog/hashnode-c18a7372-0e12-4dca-83a9-050981c9752f.jpeg" alt="Eventually, something will break"&gt;&lt;/p&gt;</description></item><item><title>exekutor</title><link>https://yonatankarp.github.io/he/projects/exekutor/</link><pubDate>Sun, 01 Jan 2023 00:00:00 +0100</pubDate><guid>https://yonatankarp.github.io/he/projects/exekutor/</guid><description>&lt;p&gt;דמו ארכיטקטורת תוסף ב-Kotlin. מדגים תבניות עיצוב יישומים מורחבות.&lt;/p&gt;</description></item><item><title>איך לבנות Domain Gateway עם OpenApi</title><link>https://yonatankarp.github.io/he/blog/build-domain-gateway-openapi/</link><pubDate>Wed, 14 Dec 2022 00:00:00 +0100</pubDate><guid>https://yonatankarp.github.io/he/blog/build-domain-gateway-openapi/</guid><description>&lt;div class="editors-note"&gt;
&lt;p&gt;&lt;strong&gt;TL;DR:&lt;/strong&gt; המאמר הזה מסביר מה זה domain gateway, איך לבנות אחד ולמה תרצו אותו.&lt;/p&gt;
&lt;/div&gt;
&lt;h2 id="מה-זה-domain-gateway"&gt;מה זה Domain Gateway?&lt;/h2&gt;
&lt;p&gt;domain gateway הוא מקרה פרטי של ה-API gateway pattern. האתר &lt;a href="https://java-design-patterns.com/patterns/api-gateway/"&gt;java-design-patterns&lt;/a&gt; מגדיר את ה-gateway pattern כך:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;With the Microservices pattern, a client may need data from multiple different microservices. If the client called each microservice directly, that could contribute to longer load times, since the client would have to make a network request for each microservice called. Moreover, having the client call each microservice directly ties the client to that microservice – if the internal implementations of the microservices change (for example, if two microservices are combined sometime in the future) or if the location (host and port) of a microservice changes, then every client that makes use of those microservices must be updated. The intent of the API Gateway pattern is to alleviate some of these issues. In the API Gateway pattern, an additional entity (the API Gateway) is placed between the client and the microservices. The job of the API Gateway is to aggregate the calls to the microservices. Rather than the client calling each microservice individually, the client calls the API Gateway a single time. The API Gateway then calls each of the microservices that the client needs.&lt;/p&gt;</description></item><item><title>איך להשתמש ב-OpenApi לבניית RESTful API חזק</title><link>https://yonatankarp.github.io/he/blog/openapi-robust-restful-api/</link><pubDate>Sun, 04 Dec 2022 00:00:00 +0100</pubDate><guid>https://yonatankarp.github.io/he/blog/openapi-robust-restful-api/</guid><description>&lt;div class="editors-note"&gt;
&lt;p&gt;&lt;strong&gt;הערת עורך:&lt;/strong&gt; הפוסט הזה נכתב על ידי במקור ופורסם בבלוג של SumUp. אבל הרבה השתנה מאז. אני כבר לא עובד ב-SumUp, OpenAPI שחרר שתי גרסאות major, ל-Spring Boot היה release major, ואפילו ל-Gradle היו כמה releases major. לא רק זאת, כישורי הכתיבה שלי השתפרו דרמטית מאז, ולאורך זמן מצאתי כמה טעויות קטנות במאמר המקורי. מאחר שהמאמר המקורי הוא אחד המוצלחים שלי, החלטתי לכתוב אותו מחדש ולפרסם גרסה מעודכנת.&lt;/p&gt;
&lt;/div&gt;
&lt;h2 id="מבוא"&gt;מבוא&lt;/h2&gt;
&lt;h3 id="restful-api--הצד-המכוער"&gt;RESTful API — הצד המכוער&lt;/h3&gt;
&lt;p&gt;כמהנדסת/מהנדס backend, פיתחתי APIs רבים ב-REST במהלך הקריירה שלי. אחת הבעיות הכי מעצבנות שנתקלתי בה שוב ושוב הייתה חוסר בשילוב חלק בין ה-backend לבין הלקוחות. שגיאות כתיב ב-URLs, חוסר עקביות ב-JSON (camel case לעומת snake case), העברת ערכים מהסוג הלא נכון (לדוגמה, string במקום integer) ועוד טעויות דומות קרו לי הרבה פעמים.&lt;/p&gt;</description></item><item><title>איך HashMap עובד ב-Java?</title><link>https://yonatankarp.github.io/he/blog/how-hashmap-works-java/</link><pubDate>Fri, 02 Dec 2022 00:00:00 +0100</pubDate><guid>https://yonatankarp.github.io/he/blog/how-hashmap-works-java/</guid><description>&lt;p&gt;בתור מראיין, אני הרבה פעמים שואל על איך HashMap עובד ב-Java. זה עוזר לי להעריך את ההבנה של המועמד במבני נתונים, ב-JVM internals ובגישה שלהם לפתרון בעיות. נתקלתי בהרבה מועמדים — ג&amp;rsquo;וניורים, מידים וסניורים — שלא הצליחו לענות על השאלה הזו נכון. אז החלטתי לשתף את התשובה עם כולם.&lt;/p&gt;
&lt;p&gt;במאמר הזה אני אסביר את שאלת ה-HashMap צעד אחר צעד.&lt;/p&gt;
&lt;h3 id="מה-החוזה-בין-הפונקציות-equals-ו-hashcode-ב-java"&gt;מה החוזה בין הפונקציות &lt;code&gt;equals()&lt;/code&gt; ו-&lt;code&gt;hashCode()&lt;/code&gt; ב-Java?&lt;/h3&gt;
&lt;p&gt;&lt;img src="https://yonatankarp.github.io/images/blog/medium-1*o-EXRh62Vv1wF6hGc8enkg.jpeg" alt=""&gt;&lt;/p&gt;
&lt;p&gt;ב-Java, כל האובייקטים יורשים את הפונקציות &lt;code&gt;equals()&lt;/code&gt; ו-&lt;code&gt;hashCode()&lt;/code&gt; מקלאס &lt;code&gt;Object&lt;/code&gt;. לפי הדוקומנטציה של &lt;code&gt;equals()&lt;/code&gt;, יש צורך לעקוף גם את המתודה &lt;code&gt;hashCode()&lt;/code&gt;. זה מבטיח שאובייקטים שווים יהיו בעלי hash codes שווים.&lt;/p&gt;</description></item><item><title>איך לשבור HashMap בפחות מדקה</title><link>https://yonatankarp.github.io/he/blog/break-hashmap-less-than-a-minute/</link><pubDate>Fri, 02 Dec 2022 00:00:00 +0100</pubDate><guid>https://yonatankarp.github.io/he/blog/break-hashmap-less-than-a-minute/</guid><description>&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;TL;DR:&lt;/strong&gt; אף פעם אל תשתמשו באובייקטים mutable כמפתחות ב-HashMap!&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;אחרי שכתבתי את המאמר &lt;a href="https://yonatankarp.com/how-does-hashmap-work-in-java"&gt;&lt;strong&gt;How does HashMap work in Java?&lt;/strong&gt;&lt;/a&gt;, כמה אנשים הציעו נושאים נוספים הקשורים ל-HashMap. בגלל זה החלטתי ליצור סדרה קצרה של מאמרים על הנושא.&lt;/p&gt;
&lt;p&gt;במאמר של היום נדבר על JVM HashMaps ועל איך קל לשבור אותם אם לא משתמשים בהם בזהירות. חשוב לציין שלמרות שנתמקד בעולם ה-JVM, אותם עקרונות חלים על רוב שפות התכנות המודרניות.&lt;/p&gt;
&lt;p&gt;במאמר הזה אני אספק מימוש ב-Java ואסביר את שורש הבעיה. אני גם אציע פתרונות לבעיות שאני מציג.&lt;/p&gt;</description></item><item><title>יצירת Spring Boot App Banner מותאם אישית</title><link>https://yonatankarp.github.io/he/blog/custom-spring-boot-banner/</link><pubDate>Fri, 02 Dec 2022 00:00:00 +0100</pubDate><guid>https://yonatankarp.github.io/he/blog/custom-spring-boot-banner/</guid><description>&lt;p&gt;היום אני רוצה לשתף אתכם בפיצ&amp;rsquo;ר כיפי של Spring. הוא לא חדש או קריטי, אבל הוא בהחלט מהנה!&lt;/p&gt;
&lt;p&gt;בדרך כלל, כשמפעילים את אפליקציית Spring Boot, רואים banner סטנדרטי ב-logs כזה:&lt;/p&gt;
&lt;p&gt;&lt;img src="https://yonatankarp.github.io/images/blog/medium-1*qhCPGhoCfVHDiV_8C2w-IQ.png" alt="Spring Boot Banner"&gt;&lt;/p&gt;
&lt;p&gt;אבל האם אי פעם חשבתם להחליף את ה-Spring banner ב-banner מותאם אישית? אם כן, המאמר הזה בשבילכם!&lt;/p&gt;
&lt;p&gt;כדי להתחיל, בואו נגש ל-&lt;a href="https://patorjk.com/"&gt;https://patorjk.com/&lt;/a&gt; — אתר שעוזר לנו ליצור טקסט מותאם אישית. אפשר להכניס את הטקסט הרצוי ל-log ולבחור מתוך מגוון גופנים. לדוגמה:&lt;/p&gt;</description></item><item><title>Beat The Machine</title><link>https://yonatankarp.github.io/he/projects/beat-the-machine/</link><pubDate>Sat, 01 Oct 2022 00:00:00 +0100</pubDate><guid>https://yonatankarp.github.io/he/projects/beat-the-machine/</guid><description>&lt;p&gt;משחק ניחושים מבוסס AI שבו שחקנים מזהים הנחיות שבהן נעשה שימוש ליצירת תמונות.&lt;/p&gt;</description></item><item><title>kotlin-design-patterns</title><link>https://yonatankarp.github.io/he/projects/kotlin-design-patterns/</link><pubDate>Sat, 01 Oct 2022 00:00:00 +0100</pubDate><guid>https://yonatankarp.github.io/he/projects/kotlin-design-patterns/</guid><description>&lt;p&gt;תבניות עיצוב תוכנה ממומשות ב-Kotlin אידיומטי. מתוחזק באופן פעיל עם אתר תיעוד MkDocs.&lt;/p&gt;</description></item><item><title>java-design-patterns (contributor)</title><link>https://yonatankarp.github.io/he/projects/java-design-patterns/</link><pubDate>Thu, 01 Sep 2022 00:00:00 +0100</pubDate><guid>https://yonatankarp.github.io/he/projects/java-design-patterns/</guid><description>&lt;p&gt;עיצוב מחדש של מימוש תבנית ה-Prototype.&lt;/p&gt;</description></item><item><title>איך להזריק כמה מימושים ב-Spring Framework</title><link>https://yonatankarp.github.io/he/blog/inject-multiple-implementations-spring/</link><pubDate>Fri, 11 Feb 2022 00:00:00 +0100</pubDate><guid>https://yonatankarp.github.io/he/blog/inject-multiple-implementations-spring/</guid><description>&lt;p&gt;לא מזמן היה לי דיון עם אחד מהעמיתים שלי במהלך code review. דיברנו על גביש נסתר ב-Spring (וגם ב-frameworks אחרים כמו Micronaut) שיכול לפשט את הקוד שלנו.&lt;/p&gt;
&lt;p&gt;בואו נחשוב על משימה: פיתוח מערכת ברכות בוקר טוב שתומכת בעברית ובאנגלית. המערכת צריכה לברך אותנו בכל אחת מהשפות האלה.&lt;/p&gt;
&lt;p&gt;נתחיל עם המימוש הפשוט על ידי הגדרת ה-greeters:&lt;/p&gt;
&lt;div class="highlight-wrapper"&gt;
 &lt;button class="copy-code-btn" type="button" aria-label="Copy code to clipboard"&gt;
 &lt;svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"&gt;
 &lt;rect x="9" y="9" width="13" height="13" rx="2" ry="2"&gt;&lt;/rect&gt;
 &lt;path d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"&gt;&lt;/path&gt;
 &lt;/svg&gt;
 &lt;span class="copy-text"&gt;Copy&lt;/span&gt;
 &lt;/button&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-Kotlin" data-lang="Kotlin"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;HebrewGreeter&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;fun&lt;/span&gt; &lt;span class="nf"&gt;sayGoodMorning&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;בוקר טוב&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;EnglishGreeter&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;fun&lt;/span&gt; &lt;span class="nf"&gt;sayGoodMorning&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;Good morning&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;עכשיו ניצור קלאס שמחזיק את ה-greeters ומפעיל אותם:&lt;/p&gt;</description></item><item><title>4 סיבות למה Amazon Keyspaces בעייתי!</title><link>https://yonatankarp.github.io/he/blog/amazon-keyspaces-problematic/</link><pubDate>Thu, 30 Dec 2021 00:00:00 +0100</pubDate><guid>https://yonatankarp.github.io/he/blog/amazon-keyspaces-problematic/</guid><description>&lt;p&gt;לפני בערך שנה, הצוות שלי ואני קיבלנו משימה לבנות מערכת עם ביצועים גבוהים שמסוגלת להתמודד עם נפח בקשות גדול. אחרי שחשבנו על זה טוב, בחרנו ב-Cassandra כמסד הנתונים שלנו.&lt;/p&gt;
&lt;p&gt;כשהגיע הזמן להוציא את המערכת לפרודקשן, בדקנו שלוש אפשרויות עיקריות:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="https://cassandra.apache.org/_/index.html"&gt;&lt;strong&gt;Self-hosted Cassandra&lt;/strong&gt;&lt;/a&gt;: פסלנו את זה בגלל הצורך בתחזוקת חומרה.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="https://www.datastax.com/"&gt;&lt;strong&gt;DataStax&lt;/strong&gt;&lt;/a&gt;: ה-&amp;ldquo;Confluence-Kafka&amp;rdquo; של Cassandra — מימוש מלא בענן שמנוהל על ידי צוות DataStax.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="https://aws.amazon.com/keyspaces/"&gt;&lt;strong&gt;Amazon Keyspaces&lt;/strong&gt;&lt;/a&gt;: הגרסה של אמזון לשפת CQL של Cassandra.&lt;/p&gt;</description></item><item><title>בנו Twitter Bot משלכם עם Kotlin</title><link>https://yonatankarp.github.io/he/blog/build-twitter-bot-kotlin/</link><pubDate>Wed, 15 Dec 2021 00:00:00 +0100</pubDate><guid>https://yonatankarp.github.io/he/blog/build-twitter-bot-kotlin/</guid><description>&lt;p&gt;קראתי מאמר מצוין של &lt;a href="https://medium.com/u/f864d52751a7"&gt;Martin Erlic&lt;/a&gt; בשם &amp;ldquo;&lt;a href="https://medium.com/@SeloSlav/how-to-make-a-scary-russian-twitter-bot-with-java-b7b62768a3ac"&gt;How To Make a Scary Russian Twitter Bot With Java&lt;/a&gt;&amp;rdquo; ורציתי לעדכן אותו עם Kotlin.&lt;/p&gt;
&lt;p&gt;בניגוד למאמר המקורי, אני אשתמש ב-Kotlin — שפת JVM חדשה ומודרנית יותר — ו-Gradle כמערכת ה-build.&lt;/p&gt;
&lt;p&gt;כדי לבנות את ה-bot, עקבו אחרי השלבים הפשוטים האלה:&lt;/p&gt;
&lt;h3 id="שלב-1--יצירת-twitter-application"&gt;שלב 1 — יצירת Twitter Application&lt;/h3&gt;
&lt;p&gt;השלב הראשון הוא ליצור &lt;a href="https://apps.twitter.com/"&gt;Twitter Application&lt;/a&gt; עם חשבון המשתמש שאיתו רוצים לבצע את בקשות ה-API. על ידי יצירת ה-Twitter application, נקבל את ה-API key וה-API secret שבהם נשתמש מאוחר יותר לאימות ה-bot שלנו עם Twitter.&lt;/p&gt;</description></item><item><title>Backend Developer</title><link>https://yonatankarp.github.io/he/experience/sumup/</link><pubDate>Sat, 01 Jun 2019 00:00:00 +0100</pubDate><guid>https://yonatankarp.github.io/he/experience/sumup/</guid><description>&lt;p&gt;בניית platform libraries, מיגרציה של legacy data ויצירת service templates. 4.5 שנים על מערכות פינטק ב-scale.&lt;/p&gt;</description></item><item><title>Backend Developer</title><link>https://yonatankarp.github.io/he/experience/nice/</link><pubDate>Fri, 01 Dec 2017 00:00:00 +0100</pubDate><guid>https://yonatankarp.github.io/he/experience/nice/</guid><description>&lt;p&gt;פיתוח enterprise contact centers ומערכות business analytics.&lt;/p&gt;</description></item><item><title>Emma's Inferno</title><link>https://yonatankarp.github.io/he/projects/emmas-inferno/</link><pubDate>Fri, 01 Jan 2016 00:00:00 +0100</pubDate><guid>https://yonatankarp.github.io/he/projects/emmas-inferno/</guid><description>&lt;p&gt;פאזל-פלטפורמר אטמוספרי החוקר נושאי מוסר. פרויקט סיום לימודים באוניברסיטה.&lt;/p&gt;</description></item><item><title>Larry the Last Zombie</title><link>https://yonatankarp.github.io/he/projects/larry-the-last-zombie/</link><pubDate>Sun, 01 Nov 2015 00:00:00 +0100</pubDate><guid>https://yonatankarp.github.io/he/projects/larry-the-last-zombie/</guid><description>&lt;p&gt;משחק הגנת מגדל. פרויקט קבוצתי באוניברסיטת רייכמן.&lt;/p&gt;</description></item><item><title>Jacob's Choice</title><link>https://yonatankarp.github.io/he/projects/jacobs-choice/</link><pubDate>Thu, 01 Oct 2015 00:00:00 +0100</pubDate><guid>https://yonatankarp.github.io/he/projects/jacobs-choice/</guid><description>&lt;p&gt;משחק הרפתקאות אימה. זכה במקום ה-3 בפרסי GameIS 2015.&lt;/p&gt;</description></item><item><title>Junior C++/C# Developer</title><link>https://yonatankarp.github.io/he/experience/inuitive/</link><pubDate>Fri, 01 Aug 2014 00:00:00 +0100</pubDate><guid>https://yonatankarp.github.io/he/experience/inuitive/</guid><description>&lt;p&gt;פיתוח computer vision hardware, כיול שבבים ועיבוד תמונה real-time.&lt;/p&gt;</description></item><item><title>אוניברסיטת רייכמן</title><link>https://yonatankarp.github.io/he/education/reichman/</link><pubDate>Sat, 01 Sep 2012 00:00:00 +0100</pubDate><guid>https://yonatankarp.github.io/he/education/reichman/</guid><description/></item><item><title>בית</title><link>https://yonatankarp.github.io/he/home/home/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://yonatankarp.github.io/he/home/home/</guid><description>&lt;section id="showcase" class="rad-showcase rad-showcase--index rad-animation-group rad-fade-down"&gt;
 &lt;div&gt;
 

 &lt;div class="showcase-section row flex-column-reverse flex-md-row rad-fade-down rad-waiting rad-animate"&gt;
 &lt;div class="col-12 col-sm-12 col-md-6 col-lg-6 col-xl-6"&gt;
 &lt;h1 class="display-1"&gt;
 יונתן קרפ-רודין
 &lt;/h1&gt;
 &lt;h2 class="display-5"&gt;
 &lt;span&gt;Staff Software Engineer&lt;/span&gt;
 &lt;/h2&gt;
 &lt;div class="lead"&gt;
 Staff Software Engineer בברלין, בונה מערכות payments ו-compliance ב-Billie. יותר מ-12 שנות ניסיון ב-embedded, backend מבוזר ו-fintech.
 &lt;/div&gt;
 
 &lt;/div&gt;
 &lt;div class="col-12 col-sm-12 col-md-6 col-lg-6 col-xl-6 profile-image"&gt;
 










 
 



 
 


 &lt;picture class=""&gt;
 
 

 &lt;source srcset="https://yonatankarp.github.io/images/showcase/showcase_hu_ae8e5ea82e51a6e6.webp 1x, https://yonatankarp.github.io/images/showcase/showcase_hu_1331b758f568a9f0.webp 2x" type="image/webp" /&gt;
 &lt;source srcset="https://yonatankarp.github.io/images/showcase/showcase_hu_cdcfbed3ffb37df8.png 1x, https://yonatankarp.github.io/images/showcase/showcase_hu_b6a5de1032e704e2.png 2x" type="image/png"&gt;

 &lt;img
 width="200"
 height="200"
 class="lozad img-responsive "
 data-src="https://yonatankarp.github.io/images/showcase/showcase_hu_cdcfbed3ffb37df8.png"
 alt=''
 src="data:image/gif;base64,R0lGODlhBwACAIAAAP///wAAACH5BAEAAAEALAAAAAAHAAIAAAIDjI9YADs="
 loading="lazy"
 decoding="async"
 /&gt;
 &lt;/picture&gt;




 &lt;/div&gt;
 &lt;div class="col-12 inner-content"&gt;
 





&lt;div class="container"&gt;
 &lt;div class="row platform-links shortcode"&gt;
 &lt;div class="col-12"&gt;
 
 
 &lt;a
 href="https://github.com/yonatankarp"
 target="_blank"
 rel="noopener noreferrer"
 aria-label="square-github"
 &gt;&lt;i class="icon-square-github"&gt;&lt;/i&gt;
 &lt;/a&gt;

 
 
 &lt;a
 href="https://www.linkedin.com/in/yonatankarp/"
 target="_blank"
 rel="noopener noreferrer"
 aria-label="linkedin"
 &gt;&lt;i class="icon-linkedin"&gt;&lt;/i&gt;
 &lt;/a&gt;

 
 
 &lt;a
 href="https://twitter.com/yonvata"
 target="_blank"
 rel="noopener noreferrer"
 aria-label="x-twitter"
 &gt;&lt;i class="icon-x-twitter"&gt;&lt;/i&gt;
 &lt;/a&gt;

&lt;/div&gt;
 &lt;/div&gt;
&lt;/div&gt;



 &lt;/div&gt;
 

 &lt;/div&gt;


 &lt;div class="row platform-links"&gt;
 &lt;div class="col-12"&gt;&lt;/div&gt;
 &lt;/div&gt;
 &lt;/div&gt;
 
&lt;/section&gt;
















&lt;section id="about" class="section rad-animation-group pb-0"&gt;
 &lt;div class="rad-fade-down"&gt;
 &lt;div class="row d-flex flex-column-reverse flex-md-row"&gt;
 &lt;div class="about__profile-picture col-12 col-md-6"&gt;
 










 
 



 
 


 &lt;picture class=""&gt;
 
 

 &lt;source srcset="https://yonatankarp.github.io/images/about/user-picture_hu_4533ed6509764c60.webp 1x, https://yonatankarp.github.io/images/about/user-picture_hu_19f885611eb5acdf.webp 2x" type="image/webp" /&gt;
 &lt;source srcset="https://yonatankarp.github.io/images/about/user-picture_hu_a9ef667d52088856.png 1x, https://yonatankarp.github.io/images/about/user-picture_hu_837d0eaf4efc356f.png 2x" type="image/png"&gt;

 &lt;img
 width="256"
 height="256"
 class="lozad img-responsive image-left-overflow"
 data-src="https://yonatankarp.github.io/images/about/user-picture_hu_a9ef667d52088856.png"
 alt=''
 src="data:image/gif;base64,R0lGODlhBwACAIAAAP///wAAACH5BAEAAAEALAAAAAAHAAIAAAIDjI9YADs="
 loading="lazy"
 decoding="async"
 /&gt;
 &lt;/picture&gt;

 &lt;/div&gt;
 &lt;div class="col-12 col-md-6 my-auto"&gt;
 &lt;h2&gt;אודות&lt;/h2&gt;
 &lt;div class="about-me content"&gt;
 Staff Software Engineer בברלין, בונה מערכות payments ו-compliance ב-Billie.&lt;br/&gt;&lt;br/&gt;יש לי 12+ שנות ניסיון על כל הספקטרום -- ממערכות embedded וכיול שבבים (C++/C#) ועד distributed backend platforms (Kotlin/Java/Spring Boot). עבדתי ב-computer vision hardware, מרכזי שירות ארגוניים, fintech payments ו-B2B lending.&lt;br/&gt;&lt;br/&gt;ב-Billie אני אחראי על ה-Compliance Service שמכסה transaction monitoring ו-screening, חלק מצוות הארכיטקטורה, ומוביל יוזמות כמו API-first design, שיפור CI pipelines ואימוץ AI. לפני זה הייתי 4.5 שנים ב-SumUp -- בניתי platform libraries, העברתי legacy data ויצרתי service templates.&lt;br/&gt;&lt;br/&gt;אני כותב על Kotlin ו-backend engineering ב-&lt;a href='https://kotlinbackend.com'&gt;kotlinbackend.com&lt;/a&gt;, תורם לפרויקטי open source כמו openapi-generator, ומתחזק את &lt;a href='https://github.com/yonatankarp/ff4k'&gt;ff4k&lt;/a&gt; -- ספריית feature flags ל-Kotlin Multiplatform.
 &lt;/div&gt;
 
 &lt;a href="https://yonatankarp.github.io/he/skills" target="_blank" class="btn btn-primary mt-3"&gt;
 &lt;i class=""&gt;&lt;/i&gt;
 למיומנויות שלי
 &lt;/a&gt;
 
 &lt;/div&gt;
 &lt;/div&gt;
 &lt;/div&gt;
&lt;/section&gt;




&lt;section
 id="education"
 class="section section--border-bottom rad-animation-group"
&gt;
 &lt;div class="container-education"&gt;
 &lt;div class="row rad-fade-down"&gt;
 &lt;div class="col-12"&gt;
 &lt;h2&gt;השכלה&lt;/h2&gt;
 &lt;div class="row pt-2 pt-md-4"&gt;
 
 &lt;div class="col-12 col-sm-6 mb-4 mb-sm-0"&gt;
 &lt;div class="education"&gt;
 &lt;div class="education__date"&gt;2012-2016&lt;/div&gt;
 &lt;div class="education__title"&gt;אוניברסיטת רייכמן&lt;/div&gt;
 &lt;div class="education__degree"&gt;B.Sc. מדעי המחשב&lt;/div&gt;
 &lt;/div&gt;
 &lt;/div&gt;
 
 &lt;/div&gt;
 &lt;/div&gt;
 &lt;/div&gt;
 &lt;/div&gt;
&lt;/section&gt;










&lt;section id="experience-list-shortcode" class="section-experience section section--border-bottom rad-animation-group flex-grow-1 "&gt;
 &lt;div class="row flex-column-reverse flex-md-row rad-fade-down"&gt;
 &lt;div class="experience-list col-12 mt-5 mt-sm-0"&gt;
 
 &lt;h2 class="section__title mb-4"&gt;ניסיון&lt;/h2&gt;
 
 
 

 

 
 &lt;div class="experience row"&gt;
 &lt;div class="experience__header col-12 col-md-3 d-flex align-items-start"&gt;
 
 
 &lt;div class="experience__meta"&gt;
 &lt;div class="experience__date"&gt;אוק&amp;#39; 2025 - היום&lt;/div&gt;
 &lt;div class="experience__title"&gt;Staff Software Engineer&lt;/div&gt;
 &lt;div class="experience__company"&gt;Billie. &lt;span class="experience__location"&gt;
 ברלין, גרמניה&lt;/span&gt;&lt;/div&gt;
 &lt;/div&gt;
 &lt;/div&gt;
 &lt;div class="experience__description d-print-block col-12 col-md-9 mt-3 mt-md-0"&gt;
 &lt;h1&gt;Staff Software Engineer - Payments&lt;/h1&gt;
 &lt;p&gt;הקמתי את ה-Compliance Service כ-domain חדש &amp;ndash; transaction monitoring, screening ו-sanctions checks. כתבתי את ה-tech spec, הגדרתי APIs והובלתי את האינטגרציה עם ComplyAdvantage. בניתי cronjob monitoring tool ב-Backstage. חבר בצוות הארכיטקטורה.&lt;/p&gt;</description></item><item><title>חיפוש</title><link>https://yonatankarp.github.io/he/search/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://yonatankarp.github.io/he/search/</guid><description>search</description></item><item><title>כותרת תחתונה</title><link>https://yonatankarp.github.io/he/footer/footer/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://yonatankarp.github.io/he/footer/footer/</guid><description>&lt;section id="contact" class="section section--contact pt-0"&gt;
 &lt;div class="container"&gt;
 &lt;div class="contact w-100"&gt;
 &lt;h2&gt;צרו קשר&lt;/h2&gt;

 &lt;div class="row pt-2"&gt;
 &lt;div class="col-12 col-lg-7"&gt;
 &lt;form action="" method="" class="contact__form"&gt;
 &lt;div class="row"&gt;
 &lt;div class="col-12 col-sm-6"&gt;
 &lt;input type="text" name="full_name" class="form-control" placeholder="ישראל ישראלי"&gt;
 &lt;/div&gt;
 &lt;div class="col-12 col-sm-6"&gt;
 &lt;input type="email" name="email" class="form-control" placeholder="israel@example.com"&gt;
 &lt;/div&gt;
 &lt;/div&gt;
 &lt;div class="row pt-4"&gt;
 &lt;div class="col-12"&gt;
 &lt;input type="tel" name="phone" class="form-control" &gt;
 &lt;/div&gt;
 &lt;/div&gt;
 &lt;div class="row pt-4"&gt;
 &lt;div class="col-12"&gt;
 &lt;textarea name="message" class="form-control" rows="2" placeholder="היי, אשמח ליצור קשר!"&gt;&lt;/textarea&gt;
 &lt;/div&gt;
 &lt;/div&gt;
 &lt;div class="row pt-4"&gt;
 &lt;div class="col-12"&gt;
 &lt;button type="submit" class="btn btn-primary"&gt;שליחה&lt;/button&gt;
 &lt;/div&gt;
 &lt;/div&gt;
 &lt;/form&gt;
 &lt;/div&gt;
 &lt;div class="col-12 col-lg-5 contact__info"&gt;
 

 
 &lt;h3&gt;אימייל&lt;/h3&gt;
 &lt;span&gt;&lt;a href='mailto:yonvata@gmail.com'&gt;yonvata@gmail.com&lt;/a&gt;&lt;/span&gt;
 
 
 
 &lt;h3&gt;מיקום&lt;/h3&gt;
 &lt;span&gt;ברלין, גרמניה&lt;/span&gt;
 
 &lt;/div&gt;
 &lt;/div&gt;
 &lt;/div&gt;
 &lt;/div&gt;
&lt;/section&gt;</description></item></channel></rss>