<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>בלוג on Yonatan Karp-Rudin</title><link>https://yonatankarp.github.io/he/blog/</link><description>Recent content in בלוג on Yonatan Karp-Rudin</description><generator>Hugo</generator><language>he</language><lastBuildDate>Wed, 26 Jun 2024 00:00:00 +0100</lastBuildDate><atom:link href="https://yonatankarp.github.io/he/blog/index.xml" rel="self" type="application/rss+xml"/><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>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>[שאלות ראיון] 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>איך לבנות 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>איך להזריק כמה מימושים ב-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></channel></rss>