en
Feedback
ToCode

ToCode

Open in Telegram

טיפים ×§×¦×Ø×™× ×œ×ž×Ŗ×›× ×Ŗ×™× ×ž××Ŗ ינון פרק

Show more
1 419
Subscribers
No data24 hours
+17 days
-430 days
Posts Archive
ToCode
1 419
ועוד מילה על העתיד šŸ˜‚ https://notes.zachmanson.com/copilot-edited-an-ad-into-my-pr/

ToCode
1 419
šŸ“Œ ומי יפתח את ×”×Ø×™××§×˜ הבא? ב 2011 ג'×•×Ø×“×Ÿ ווקי שם לב שהגישה הנוכחית ×œ×›×Ŗ×™×‘×Ŗ קוד JavaScript מובילה להמון ×˜×¢×•×™×•×Ŗ אנוש בפיתוח, ×˜×¢×•×™×•×Ŗ שהפכו לבאגים והפריעו ×œ×ž×©×Ŗ×ž×©×™×. עד אותו זמן הגישה ×”×ž×Ø×›×–×™×Ŗ בעולם פיתוח ווב ×”×™×Ŗ×” של טיפול ×‘××™×Ø×•×¢×™×. בגישה זו אנחנו ×ž×—×‘×Ø×™× "קוד" ל"אירוע" ×•××•×ž×Ø×™× "×›×©×ž×©×Ŗ×ž×© לוחׄ על כפתור X תעשה Y", או "כשהעכבר עובר מעל ×¤×Ø×™×˜ X תריׄ את הקוד Z". הבעיה ×”×™×Ŗ×” שככל שהיו יותר ××™×Ø×•×¢×™× וקטעי קוד שטיפלו בהם היה קשה להבין מה ×‘××ž×Ŗ קורה ×‘×ž×¢×Ø×›×Ŗ. כן אפשר היה ×œ×”×”×Ŗ×›×œ על כל קטע קוד שעושה משהו בנפרד ולהבין מה הוא עושה, אבל מה ×©×Ø×•××™× על המהך היה תוצאה של רצף ××™×Ø×•×¢×™×, ×›×œ×•×ž×Ø רצף קטעי קוד כאלה. לבני אדם היה קשה לדמיין את כל ×”×¦×™×Ø×•×¤×™× ×”××¤×©×Ø×™×™× של ××™×Ø×•×¢×™× וכך ×‘×ž×¢×Ø×›×•×Ŗ ×ž×•×Ø×›×‘×•×Ŗ פהפהנו מצבים. ג'×•×Ø×“×Ÿ ווקי הציע ×œ×©× ×•×Ŗ את המודל ×•×œ×”×¤×Ø×™×“ את העבודה לשני שלבים: קוד שמטפל באירוע יוכל רק ×œ×©× ×•×Ŗ מבני × ×Ŗ×•× ×™× ×‘×–×›×Ø×•×Ÿ, ×•×”×Ŗ×•×›×Ÿ שיוצג ×œ×ž×©×Ŗ×ž×©×™× יהיה פונקציה של ××•×Ŗ× מבני × ×Ŗ×•× ×™×. שינוי גישה זה הוליד את ×Ø×™××§×˜ ואיתה דור שלם של ×¤×Ø×™×™×ž×•×•×Ø×§×” ×œ×¤×™×Ŗ×•×— צד לקוח ושינוי גישה בכל התעשייה. שינוי הגישה של ×Ø×™××§×˜ לא יצר ×™×›×•×œ×•×Ŗ חדשות, לא יצר הוגי ××™× ×˜×Ø×§×¦×™×” חדשים, לא הגדיר APIs חדשים ×‘×¤×œ×˜×¤×•×Ø×ž×” - זה בהך הכל היה שינוי של האופן בו ×ž×¤×Ŗ×—×™× ×›×•×Ŗ×‘×™× קוד JavaScript ×‘×Ŗ×•×š דפדפן. ובכל זאת אי אפשר לדמיין את עולם ×”×¤×Ø×•× ×˜×× ×“ היום בלי ×Ø×™××§×˜ וכל הדור של ×¤×Ø×™×™×ž×•×•×Ø×§×” מבוההי ×§×•×ž×¤×•× × ×˜×•×Ŗ שנולד איתה. האם ג'×•×Ø×“×Ÿ היה יכול לשים לב לקושי הזה בלי ×œ×”×”×Ŗ×›×œ על הקוד? האם AI היה יכול לשים לב לקושי של ג'×•×Ø×“×Ÿ ולהמציא ×Ø×™××§×˜? ברור שלא. בלי ×œ×”×”×Ŗ×›×œ על הקוד אי אפשר ×œ×Ø××•×Ŗ את הכאב, ומנועי ה AI הנוכחיים ×›×•×Ŗ×‘×™× את מה שאנחנו מצפים שיכתבו. אבל את ×Ø×™××§×˜ אף אחד לא צפה. ×Ø×™××§×˜ היא לא קפיצת ×“×Ø×š יחידה ×‘×”×™×”×˜×•×Ø×™×” של פיתוח תוכנה, להיפך. כל שפת תכנות, כל ×¤×Ø×™×™×ž×•×•×Ø×§, כל פיתוח שמשנה את האופן שבני אדם ×›×•×Ŗ×‘×™× קוד ×ž×Ŗ××™× ×œ××•×Ŗ×• תיאור. איך אפשר להיבהל ×ž×”×Ŗ×—×‘×™×Ø של פרל אם אתה לא ×ž×”×Ŗ×›×œ על הקוד? איך אפשר ×œ×”×Ŗ×¢×¦×‘×Ÿ על מודל ניהול ×”×–×™×›×Ø×•×Ÿ של C++ בלי ×œ×”×”×Ŗ×›×œ על הקוד? אם רק בוטים ×™×”×Ŗ×›×œ×• על הקוד, מי יכתוב את ×”×Ø×™××§×˜ הבא? אני חושב שיש פה 3 תשובות אפשריות: 1. לא יהיה ×Ø×™××§×˜ הבא. בני אדם יפהיקו ×œ×”×”×Ŗ×›×œ על קוד ומחשבים ימשיכו עם הכלים הנוכחיים כי למי אכפת. 2. נגלה בינה ×ž×œ××›×•×Ŗ×™×Ŗ חכמה יותר מ LLM-ים והיא ×Ŗ×ž×¦×™× את הדור הבא של שפות תכנות. 3. נתעורר ונגלה שלכל טכנולוגיה יש ×ž×’×‘×œ×•×Ŗ. שיצירת ×”×ž×”×’×Ø×Ŗ בתוכה הטכנולוגיה עובדת היא חלק חשוב מהעבודה שלנו וכמו גווידו ואן ×Ø×•×”×•×, ג'×•×Ø×“×Ÿ ווקי, ×œ××Ø×™ וול, ×‘×Ø× ×“×Ÿ אייך ואינהוף ×ž×¤×Ŗ×—×™× לפנינו - גם אנחנו נרוויח מחשיבה יצירתית על קוד.

ToCode
1 419
šŸ“Œ קידוד עם AI משנה את הדר העבודה (וזה חלק מהקושי) הוהפתי ל langlets אפשרות ×œ×©×ž×•×Ø מילים באוצר מילים אישי ×œ×Ŗ×Ø×’×•×œ ומהך של ×Ŗ×Ø×’×•×œ המילים ×©×©×ž×Ø×Ŗ×™. וכשאני ××•×ž×Ø הוהפתי אני ×ž×Ŗ×›×•×•×Ÿ שביקשתי מקלוד להוהיף. גם עם AI וגם בלעדיו זה פיצ'ר שמחייב לא מעט ×”×—×œ×˜×•×Ŗ - גם בבהיה ×”× ×Ŗ×•× ×™× איך המילים האישיות ×™×™×©×ž×Ø×• וגם בקוד צד השרת איך ×œ×Ŗ×Ø×’×œ ××•×Ŗ×Ÿ. בשיחה עם קלוד התעכבתי על חלק ×ž×”×”×—×œ×˜×•×Ŗ האלה ובניתי תוכנית ×ž×”×•×“×Ø×Ŗ אבל ×œ×”×—×œ×˜×•×Ŗ אחרות לא הקדשתי המון ×Ŗ×©×•×ž×Ŗ לב ונתתי לקלוד ×œ×Ø×•×„ לבד. אין הפק שהתוצאה היא פיצ'ר עובד והרבה יותר ×ž×”×Ø ממה שהייתי כותב אותו לבד (אפילו שאני ×ž×›×™×Ø טוב את ×”×ž×¢×Ø×›×Ŗ ויודע בדיוק איזה קוד היה ×¦×Ø×™×š ×œ×›×Ŗ×•×‘). אחרי שעברתי על הקוד ראיתי שקלוד יצר קובׄ צד שרת חדש לטיפול ×‘××•×Ŗ× שיעורי חזרה אישיים. זה הקובׄ החדש: https://github.com/ynonp/langlets-rails/blob/main/app/controllers/review_lessons_controller.rb וזה הקובׄ ×”×ž×§×•×Ø×™ שטיפל ×‘×ž×©×Ŗ×ž×©×™× שפשוט ×Ŗ×Ø×’×œ×• את השיעור: https://github.com/ynonp/langlets-rails/blob/main/app/controllers/lessons_controller.rb וקל ×œ×Ø××•×Ŗ שיש המון קוד ×ž×©×•×Ŗ×£ בין שני הקבצים האלה. עכשיו ברור לי למה קלוד עשה את זה. יש המון קוד ×ž×©×•×Ŗ×£ אבל זה לא 100% ×ž×Ŗ××™×, פיתוח הפיצ'ר החדש ×•×”×Ŗ××ž×Ŗ הקוד הקיים ×”×™×Ŗ×” עלולה ×œ×©×‘×•×Ø ×“×‘×Ø×™× קיימים ואנחנו יודעים שהוכני קידוד עושים הכל כדי לא ×œ×©×‘×•×Ø קוד קיים. ההחלטה איך ×œ××Ø×’×Ÿ את קוד צד השרת, איזה חלק מהקוד של שני הקבצים ×¦×Ø×™×š ×œ×”×™×•×Ŗ ×ž×©×•×Ŗ×£ ואיזה חלק ×ž×•×¤×Ø×“ היא החלטה תכנותית ×ž×•×¦×Ø×™×Ŗ קשה, ×©×ž×¢×Ø×‘×Ŗ היכרות עם ×”×ž×¢×Ø×›×Ŗ וניחוש מה הולך ×œ×”×©×Ŗ× ×•×Ŗ בעתיד בצורה אחרת בין שני הקבצים ומה ×¦×Ø×™×š יהיה ×œ×”×©×Ŗ× ×•×Ŗ יחד. בעולם שלפני AI העדפתי להחליט את ×”×”×—×œ×˜×•×Ŗ האלה ×ž×Ø××© כדי ×œ×›×Ŗ×•×‘ כמה שפחות קוד. היום עם AI הדר העבודה השתנה, וזה חלק מהקושי. יש לי קוד עובד וה AI כבר החליט בשבילי שהוא יכלול מימוש כפול של מנגנונים זהים. עכשיו אני ×¦×Ø×™×š ×œ×§×—×Ŗ ×ž×¢×Ø×›×Ŗ שעובדת ×•×œ× ×§×•×Ŗ אותה - וזו עבודה שמעטים אוהבים ×œ×¢×©×•×Ŗ. בכל ×ž×§×Ø×” אפשר ×œ×”×™×¢×–×Ø בקלוד גם לצעד הבא. הנה כמה ×©××œ×•×Ŗ ×ž× ×—×•×Ŗ: 1. תאר מה עושה קובׄ א 2. תאר מה עושה קובׄ ב 3. ההבר מהם כל ×”×Ŗ×”×œ×™×›×™× שמבוצעים בפונקציה X בקובׄ א ובקובׄ ב, ואיזה מהם ×ž×©×•×Ŗ×¤×™× לשני הקבצים? 4. הדר מחדש את הקוד של פונקציה X ופצל אותו ×œ×¤×•× ×§×¦×™×•×Ŗ ×§×˜× ×•×Ŗ יותר כדי שנוכל ×œ×Ø××•×Ŗ מה התפקיד של כל חלק ×‘×¤×Ø×”×•×ž×Ŗ של עבודה עם קלוד היפרו לי ×©×ž×¤×Ŗ×—×™× ×¦×Ø×™×›×™× להשקיע יותר זמן ב Code Review כדי לוודא שקלוד לא עשה ×©×˜×•×™×•×Ŗ. אני חושב שנכון יותר להגיד ×©×ž×¤×Ŗ×—×™× ×¦×Ø×™×›×™× להשקיע יותר זמן זמן בניקוי ×•×‘×Ø×™×¤×§×˜×•×Ø אחרי שיש ×ž×¢×Ø×›×Ŗ עובדת כדי לשפר את מצב הקוד לקראת הפיצ'ר הבא.

ToCode
1 419
šŸ“Œ חדש ×‘×¤×™×™×Ŗ×•×Ÿ InterpreterPoolExecutor המודול concurrent.futures קיים ×‘×¤×™×™×Ŗ×•×Ÿ עוד ×ž×’×Ø×”×” 3.2 וכולל ממשק אחיד לביצוע ×¤×¢×•×œ×•×Ŗ במקביל. הנה דוגמה קצרה שהופרת ×ž×”×¤×Ø×™× ×Ø××©×•× ×™×™× בצורה ×ž×§×‘×™×œ×™×Ŗ ×‘××ž×¦×¢×•×Ŗ Executor, ×Ŗ×—×™×œ×” עם ×Ŗ×”×œ×™×›×•× ×™× ×•×œ××—×Ø מכן עם ×Ŗ×”×œ×™×›×™× מלאים:
from concurrent.futures import ProcessPoolExecutor, ThreadPoolExecutor, InterpreterPoolExecutor
import math
import time

def is_prime(n: int):
    for i in range(2, math.floor(math.sqrt(n)) + 1):
        if n % i == 0:
            return False

    return True

if __name__ == "__main__":
    t0 = time.time()
    with ThreadPoolExecutor(max_workers=4) as p:
        print(sum(p.map(is_prime, range(1_000_000))))
    t1 = time.time()

    with ProcessPoolExecutor(max_workers=4) as p:
        print(sum(p.map(is_prime, range(1_000_000))))
    t2 = time.time()

    print(f"Thread count took {t1-t0}")
    print(f"Process count took {t2 - t1}")
התוצאה כצפוי היא חישוב הרבה יותר ×ž×”×™×Ø ×‘××ž×¦×¢×•×Ŗ threads בגלל ×©×”×”×™× ×›×Ø×•×Ÿ הרבה יותר ×ž×”×™×Ø וגם יצירת threads הרבה יותר ×ž×”×™×Ø×” ×ž×™×¦×™×Ø×Ŗ Processes. אבל לשימוש ב threads יש שני חהרונות: 1. אין הפרדה בין האוביקטים - ×›×œ×•×ž×Ø קוד מכל threads יכול ×œ×’×©×Ŗ ולעדכן אוביקטים גלובאליים. 2. גרהאות רבות של ×¤×™×™×Ŗ×•×Ÿ ×ž×’×™×¢×•×Ŗ עם Global Interpreter Lock מה ×©××•×ž×Ø שכל פעולה של ×¤×™×™×Ŗ×•×Ÿ ×‘×Ŗ×•×š ה thread צריכה לנעול את אותו מנעול גלובאלי. גרהה 3.14 של ×¤×™×™×Ŗ×•×Ÿ הוהיפה ×¤×Ŗ×Ø×•×Ÿ ביניים שנקרא InterpreterPoolExecutor. מבצע זה יריׄ כל משימה ×‘×ž×¤×Ø×© ×¤×™×™×Ŗ×•×Ÿ עצמאי שרׄ ב thread נפרד, ×›×œ×•×ž×Ø במקום להפעיל fork ×•×œ×™×™×¦×Ø ×Ŗ×”×œ×™×š ×ž×¢×Ø×›×Ŗ הפעלה חדשה ×œ×ž×¤×Ø×© החדש הם ×ž×Ø×™×¦×™× את ×”×ž×¤×Ø×© באותו ×Ŗ×”×œ×™×š. התוצאה היא הפרדה מלאה בין ×ž×©×Ŗ× ×™× כי לכל ×ž×¤×Ø×© יש את ×”×ž×©×Ŗ× ×™× הגלובאליים שלו, הפרדה ×‘× ×¢×™×œ×•×Ŗ כי לכל ×ž×¤×Ø×© יש את ה GIL שלו ועדיין ריצה יותר ×ž×”×™×Ø×” כי אנחנו ×Ø×¦×™× ב threads במקום ב processes. כמה יותר ×ž×”×™×Ø? זה מה שלקח ×œ×”×¤×•×Ø ×ž×”×¤×Ø×™× ×Ø××©×•× ×™×™× אצלי על המק:
Thread count took 6.0312182903289795
Process count took 80.60068678855896
Interpreter count took 24.76494789123535
הך הכל הגיוני ונוח, ×›×œ×•×ž×Ø אם ThreadPoolExecutor פותר לכם את הבעיה ואין בעיות ×”×™× ×›×Ø×•×Ÿ או גישה למידע גלובאלי ×Ŗ×ž×©×™×›×• ×œ×”×©×Ŗ×ž×© בו הוא הכי ×ž×”×™×Ø לחישובים, אבל אם ×¢×‘×“×Ŗ× עם ProcessPoolExecutor אולי שווה ×œ×©×“×Ø×’ ל InterpreterPoolExecutor ולקבל את אותה התנהגות בביצועים טובים יותר.

ToCode
1 419
šŸ“Œ ×”×˜×¢×•×Ŗ של ×ž×¤×Ŗ×—×™× ×©×¢×•×‘×Ø×™× בין שפות כמה זמן ×‘××ž×Ŗ לוקח ×œ×¢×‘×•×Ø ×ž×¤×™×™×Ŗ×•×Ÿ ל Java? ×ž×¤×™×™×Ŗ×•×Ÿ ×œ×Ø×•×‘×™? האם הגיוני לגייה ×ž×¤×Ŗ×— עם נהיון ב Rust ×œ×¢×‘×•×“×Ŗ Java או להיפך? × ×Ŗ×—×™×œ במובן מאליו - לכל אחד ייקח זמן שונה, ×¤×Ø×™×™×ž×•×•×Ø×§×™× שונים בנויים אחרת ויכולים להשפיע על זמן הלמידה, יש פיצ'×Ø×™× מיוחדים בשפות ×ž×”×•×™×ž×•×Ŗ שקשה ללמוד אם ××Ŗ× באים משפה אחרת (כמו ניהול ×”×–×›×Ø×•×Ÿ של ראהט). אני רוצה ×œ×”×Ŗ×ž×§×“ כאן ×‘×ž×¤×Ŗ×—×™× ×©× ×©××Ø×™× באותו עולם לדוגמה ×ž×¤×Ŗ×— Django שעובר ל Rails או ×ž×¤×Ŗ×—×Ŗ Rails שעוברת ל Laravel. ×‘×ž×§×Ø×™× האלה ×œ×›××•×Ø×” ההבדל היחיד הוא השפה. היום עם ה AI מאוד קל ×œ×”×Ø×™×„ ×Ŗ×Ø×’×•× הימולטני, ×›×œ×•×ž×Ø לתאר ל AI מה שאני ×¦×Ø×™×š בשפה שאני ×ž×›×™×Ø מ Rails אולי אפילו עם ×“×•×’×ž×Ŗ קוד ×Ø×œ×•×•× ×˜×™×Ŗ ולהגיד לו ×œ×‘× ×•×Ŗ את זה ב Django. מה זה משנה אם השפה היא רובי או ×¤×™×™×Ŗ×•×Ÿ, מה שחשוב שיהיה עוד נתיב, למשוך מידע מבהיה ×”× ×Ŗ×•× ×™×, ×œ×”×Ø×™×„ ×Ŗ×”×œ×™×š ברקע או לשלוח אימייל אחרי ×¤×¢×•×œ×Ŗ ×ž×©×Ŗ×ž×©. אבל אותו ×Ŗ×Ø×’×•× הימולטני הוא ×”×˜×¢×•×Ŗ הכי גדולה של ×ž×¤×Ŗ×—×™× ×©×¢×•×‘×Ø×™× בין שפות. ההרגשה שזה "גג יומיים לימוד" ואפשר ×œ×”×™×•×Ŗ ×¤×Ø×•×“×•×§×˜×™×‘×™×™× ×’×•×Ø×ž×Ŗ לנו לשאוף מאוד נמוך בהיכרות עם השפה החדשה ולא ×œ××Ŗ×’×Ø את ה AI. בצורה כזאת אנחנו מקבלים פתרונות בהיהיים ואפילו לא מזהים שיש בעיה. יותר גרוע, בגלל השימוש הנרחב ×‘×Ŗ×Ø×’×•× הימולטני אנו ×ž×”×Ŗ×ž×›×™× על AI ואפילו לא ×¦×•×‘×Ø×™× ניהיון בשפה החדשה. ×”×¤×Ŗ×Ø×•×Ÿ אני חושב הוא לא בהכרח בשינוי ×©×™×˜×Ŗ העבודה אלא בשינוי נקודת המבט. ×‘×ž×¢×‘×Ø בין שפות אנחנו לא × ×©××Ø×™× באותה ×Ø×ž×Ŗ ×ž×™×•×ž× ×•×Ŗ שהיינו. זה ממש בהדר להגיד ×”×™×™×Ŗ×™ ×ž×¤×Ŗ×— ×¤×™×™×Ŗ×•×Ÿ מעולה ועכשיו אני ×ž×¤×Ŗ×— רובי ×ž×Ŗ×—×™×œ. ×›×ž×¤×Ŗ×— אני עדיין מאוד מיומן, ×ž×›×™×Ø את עולם ×”×Ŗ×•×›×Ÿ וקולט ×—×•×ž×Ø חדש ×ž×”×Ø. ×›×ž×¤×Ŗ×— רובי אני לא ×ž×›×™×Ø את האקוהיהטם מהפיק טוב, אני לא מבין את ה Best Practices של השפה או של ×”×¤×Ø×™×™×ž×•×•×Ø×§×” השונים, אני לא ×ž×›×™×Ø את התבניות ואת ×ž×§×Ø×™ הקצה. עדיין לא קראתי ×”×¤×Ø×™×, עדיין לא ראיתי הרצאות, עדיין לא × ×™×”×™×Ŗ×™ ×©×™×˜×•×Ŗ שונות, עדיין לא קראתי מהפיק קוד של ××—×Ø×™× ועדיין לא דיבגתי מהפיק בעיות ×ž×•×–×Ø×•×Ŗ. בתור ×ž×¤×Ŗ×— בשפה החדשה יש לי המון מה ללמוד ואני רק ארוויח אם אשקיע בזה במקביל לעבודה ×”×©×•×˜×¤×Ŗ. ×”×˜×¢×•×Ŗ של ×ž×¤×Ŗ×—×™× ×©×¢×•×‘×Ø×™× בין שפות היא אותה ×˜×¢×•×Ŗ ×©×ž×©××™×Ø×” ×ž×¤×Ŗ×—×™× בינוניים גם בשפה אחת - הבחירה ×œ×”×™×•×Ŗ יותר ×¤×Ø×•×“×•×§×˜×™×‘×™×™× ממקצועיים, להיים ×ž×”×Ø ולא ביהודיות, ×œ×™×™×¦×Ø גרהה אחת של קוד עובד במקום ×œ×”×Ŗ×œ×‘×˜ בין 5 גרהאות ×•×œ×‘×—×•×Ø את ×”×ž×Ŗ××™×ž×” ביותר ×œ×ž×§×Ø×” ההפציפי שלך. ללמוד ×œ×¢×‘×•×Ø בין שפות זה גם ללמוד להצטיין בשפה האחת.

ToCode
1 419
šŸ“Œ ×Ŗ×Ø×’×™×œ vue.js - מה שבור בקומפוננטה את הבאג הזה ×ž×¦××Ŗ×™ ×‘×ž×§×Ø×” בקוד ××ž×™×Ŗ×™ ×©×”×©×Ŗ×ž×© בגרהה ישנה של ההפריה ×•×ž××—×Ø והוא לקח לי איזה ×©×¢×Ŗ×™×™× מהחיים חשבתי שהוא מצדיק גם פוהט. ×¦×Ø×™×š להגיד ביושר שהאתגר היה להבין שיש בעיה בקומפוננטה חיצונית שבעצמה נטענה ×ž×Ŗ×•×š קומפוננטה חיצונית ×•××Ŗ× מקבלים פה רק את הצעד ×”××—×Ø×•×Ÿ של האתגר. מוכנים? הנה קוד ×§×•×ž×¤×•× × ×˜×Ŗ vue.js ×©××ž×•×Ø×” להציג קוד צבוע אבל ×ž×Ŗ×¢×œ×ž×Ŗ ×ž×¤×Ø×ž×˜×Ø השפה שאני ×ž×¢×‘×™×Ø לה ×•×Ŗ×ž×™×“ ×ž×Ø×™×¦×” זיהוי אוטומטי:
import { ref, h, computed, defineComponent, Plugin, watch } from 'vue'
import hljs from 'highlight.js/lib/core'
import { escapeHtml } from './lib/utils'

const component = defineComponent({
    props: {
        code: {
            type: String,
            required: true,
        },
        language: {
            type: String,
            default: '',
        },
        autodetect: {
            type: Boolean,
            default: true,
        },
        ignoreIllegals: {
            type: Boolean,
            default: true,
        },
    },
    setup(props) {
        const language = ref(props.language)
        watch(() => props.language, (newLanguage) => {
            language.value = newLanguage
        })

        const autodetect = computed(() => props.autodetect || !language.value)
        const cannotDetectLanguage = computed(() => !autodetect.value && !hljs.getLanguage(language.value))

        const className = computed((): string => {
            if (cannotDetectLanguage.value) {
                return ''
            } else {
                return `hljs ${language.value}`
            }
        })

        const highlightedCode = computed((): string => {
            // No idea what language to use, return raw code
            if (cannotDetectLanguage.value) {
                console.warn(`The language "${language.value}" you specified could not be found.`)
                return escapeHtml(props.code)
            }

            if (autodetect.value) {
                const result = hljs.highlightAuto(props.code)
                language.value = result.language ?? ''
                return result.value
            } else {
                const result = hljs.highlight(props.code, {
                    language: language.value,
                    ignoreIllegals: props.ignoreIllegals,
                })
                return result.value
            }
        })

        return {
            className,
            highlightedCode,
        }
    },
    render() {
        return h('pre', {}, [
            h('code', {
                class: this.className,
                innerHTML: this.highlightedCode,
            }),
        ])
    },
})

const plugin: Plugin & { component: typeof component } = {
    install(app) {
        app.component('highlightjs', component)
    },
    component,
}

export default plugin
×Ø×•××™× את הבעיה? התשובה בשורה 30:
const autodetect = computed(() => props.autodetect || !language.value)
הקוד ×ž×•×’×“×Ø לבצע זיהוי אוטומטי ×•×œ×”×Ŗ×¢×œ× ממאפיין השפה אם לא העברנו שפה (הגיוני) או אם המאפיין autodetect בעל ערך ××ž×Ŗ. החלק השני היה יכול ×œ×”×™×•×Ŗ הביר אלמלא ××ž×Ŗ ×”×™×Ŗ×” ברירת המחדל למאפיין זה:
autodetect: {
    type: Boolean,
    default: true,
},
×›×œ×•×ž×Ø אם אני לא ×ž×¢×‘×™×Ø ערך false בצורה ×ž×¤×•×Ø×©×Ŗ ×œ××•×Ŗ×• autodetect ברירת המחדל שלו היא ×œ×–×”×•×Ŗ לבד את השפה ×•×œ×”×Ŗ×¢×œ× ×ž×¢×Ø×š ה language שהעברתי. ההיבה שאני × ×Ŗ×§×¢×Ŗ×™ על ההיפור הזה יותר מדי זמן היא דף התיעוד של ההפריה שמציג את הדוגמה הבאה:
<div id="app">
    <!-- bind to a data property named `code` -->
    <highlightjs autodetect :code="code" />
    <!-- or literal code works as well -->
    <highlightjs language='javascript' code="var x = 5;" />
</div>
שכמובן עובדת רק בגלל ש highlightjs מצליח ×œ×–×”×•×Ŗ ××•×˜×•×ž×˜×™×Ŗ בדיוק את אותה שפת javascript ×©×ž×•×’×“×Ø×Ŗ ב language. עכשיו ×Ŗ×©××œ×• - אין לך איזה קלוד חכם בצוות שידע ×œ×”×”×‘×™×Ø בדיוק את הבאג הזה? נו, יש קלוד חכם והוא הצליח להציע המון רעיונות ×ž×§×•×Ø×™×™× ולא נכונים. ×ž×”×Ŗ×‘×Ø שגם הוא לא חשב שתיעוד יכול ×œ×”×˜×¢×•×Ŗ ובאגים יכולים ×œ×§×Ø×•×Ŗ בהפריות חיצוניות.

ToCode
1 419
šŸ“Œ מי שלא נפגע ×ž×˜×Ø×™×•×™ ×˜×Ø×™×•×™ הורק את ×”×¤×Ø×•×™×§×˜×™× שלכם כדי לבדוק שאין בעיות אבטחה. כמובן שכלי אבטחה הם ×ž×˜×Ø×” מאוד ×ž×¤×Ŗ×” ×œ×¤×•×Ø×¦×™× ×•×œ××—×Ø×•× ×” למדנו ×©×¤×•×Ø×¦×™× הצליחו להשיג את ×ž×¤×Ŗ×—×•×Ŗ הגישה של ×˜×Ø×™×•×™ ×•×œ×¤×Ø×”× בשמם גרהאות ×ž×–×•×™×¤×•×Ŗ. ×”×¤×Ø×˜×™× כאן: https://github.com/aquasecurity/trivy/security/advisories/GHSA-69fq-xp46-6x23 מה שמעניין בהיפור הוא לא מי שנפגע אלא מי שלא נפגע. ×ž×Ŗ×•×š הדיווח אנחנו לומדים שלא נפגעו מי ×©×”×©×Ŗ×ž×©×• ב trivy images referenced by digest - אבל מה זה ××•×ž×Ø? ולמה גרהאות ה digest היו חהינות? ×ž××’×Ø ×”×—×‘×™×œ×•×Ŗ של ×˜×Ø×™×•×™ מכיל את ×Ø×©×™×ž×Ŗ האימג'ים שהם ×¤×Ø×”×ž×• עם תגיות כמו canary, latest, 0.69.3 ותגיות ארוכות יותר ×©×ž×Ŗ×—×™×œ×•×Ŗ ב sha256 כמו sha256:b39e145284f15252b2135abe0e24509d7ad2459d28c18f014e478c6ca0aee533. כשאנחנו ×ž×Ø×™×¦×™× docker run aquasec/trivy אנחנו ×ž×Ø×™×¦×™× את הגרהה שיש עליה את ×”×Ŗ×’ latest. ואם נריׄ docker run aquasec/trivy:canary נריׄ את הגרהה ×”×ž×Ŗ×•×™×’×Ŗ canary. וכמו שבטח ×”×‘× ×Ŗ× אם נפעיל:
docker run ghcr.io/aquasecurity/trivy:sha256-bcc376de8d77cfe086a917230e818dc9f8528e3c852f7b1aff648949b6258d1c
נריׄ את הגרהה עם ×”×Ŗ×’ ×”××Ø×•×š. ×”×Ŗ×’×™× ×”××Ø×•×›×™× ×©×ž×Ŗ×—×™×œ×™× ב sha256 × ×§×Ø××™× digest. גיטהאב מחשב ××•×Ŗ× ××•×˜×•×ž×˜×™×Ŗ ×ž×Ŗ×•×š ×Ŗ×•×›×Ÿ החבילה ולא × ×™×Ŗ×Ÿ ×œ×™×¦×•×Ø ××•×Ŗ× בצורה יזומה. כל שאר התגיות נועדו ×œ×”×™×•×Ŗ "×ž×“×‘×§×•×Ŗ", ×›×œ×•×ž×Ø מזהים גמישים שאפשר להדביק על גרהה ואז להזיז ×œ×’×Ø×”×” אחרת. זה הגיוני כשחושבים על ×Ŗ×’ כמו latest - כל פעם שיש לנו גרהה עדכנית חדשה אנחנו מזיזים את latest ×œ×’×Ø×”×” החדשה. כך ברור ×©×”×Ŗ×•×§×¤×™× ×©×”×©×Ŗ×œ×˜×• על ×¤×Ø×˜×™ ההזדהות של ×˜×Ø×™×•×™ הצליחו ×‘×§×œ×•×Ŗ ×œ×¤×Ø×”× גרהאות זדוניות של ×”×ž×¢×Ø×›×Ŗ ולדחוף תגיות כמו latest, canary וגם v0.69.4. אפילו שגרהאות כאלה כבר היו ×§×™×™×ž×•×Ŗ, כל מה ×©×¦×Ø×™×š זה לדחוף עדכון ×œ×Ŗ×’×™× אלה כדי ×œ×“×Ø×•×” את ההימון. מצד שני לא משנה מה יעשו ×”×Ŗ×•×§×¤×™× הם לא יצליחו להזיז את הימוני ה digest כי בשביל זה ×¦×Ø×™×š ×œ×™×¦×•×Ø גרהה זדונית שתוכנה ×™×™×Ŗ×Ÿ את אותה תוצאת sha256 וזה כבר היפור הרבה יותר ×ž××Ŗ×’×Ø. לקחים? לא משהו גדול, רק עוד מבט על ×”×ž×Ø×—×§ בין ××‘×˜×—×Ŗ מידע ×œ× ×•×—×•×Ŗ שימוש. אני יודע ×©×‘×‘×œ×•×’×•×”×¤×™×Ø×”, ×‘×ž×“×Ø×™×›×™× ואפילו בצ'אט ×Ŗ×ž×™×“ נקבל את הגרהה הקלה לעיכול, אבל אל תשכחו ×©×‘×¤×Ø×•×“×§×©×Ÿ הרבה אנשים כן ×ž×©×Ŗ×ž×©×™× בגרהאות ×ž×§×•×‘×¢×•×Ŗ של ×”×Ŗ×œ×•×™×•×Ŗ שלהם, בדיוק בשביל להימנע מכאבי ראש כאלה.

ToCode
1 419
šŸ“Œ לפני חודש זה עבד כמה ×Ŗ×§×œ×•×Ŗ שתיקנתי ×œ×œ×§×•×—×•×Ŗ בתקופה האחרונה, כולן ×‘×§×˜×’×•×Ø×™×™×Ŗ "זה עבד לפני חודש ומאז לא נגענו"- 1. שינוי תשתית אצל הפק Third Party ×’×Ø× לקוד ×”×Ø×’×™×œ שלנו להפהיק לעבוד ודרש עדכון תוכנה מהצד שלנו כדי ×œ×”×Ŗ××™× למנגנון החדש. 2. דיהק גיבוי ×©× ×’×ž×Ø בו המקום ×’×Ø× ×œ×”×©×Ŗ×œ×©×œ×•×Ŗ ××™×Ø×•×¢×™× ×ž×¦×¢×Ø×Ŗ שבהופה ×ž×¢×Ø×›×Ŗ הפהיקה להגיב. 3. פג תוקף תעודה ×‘×—×Ŗ×™×ž×” ×¢×¦×ž×™×Ŗ שהופקה ×‘×ž×§×•×Ø ×œ×©× ×Ŗ×™×™×. כן גם ×©× ×Ŗ×™×™× עוברות בהוף, מה שהפיל את כל ×”×§×œ××”×˜×Ø. 4. ג'וב ×”×™× ×›×Ø×•×Ÿ בין בהיהי × ×Ŗ×•× ×™× ש"אני בטוח שהיה שם" פשוט נעלם. ×”×”×™× ×›×Ø×•×Ÿ הפהיק וממילא כולם כבר שכחו ×ž×”×Ø×¤×œ×™×§×” עד שמישהו היה ×¦×Ø×™×š דוח אנאליטיקה שיצא עם × ×Ŗ×•× ×™× לא נכונים. עכשיו יש היפור כאילו הוכנים חכמים ×Ŗ×›×£ הולכים ×œ×Ŗ×¤×•×” את כל ×ž×§×•×ž×•×Ŗ העבודה של מהנדהי תוכנה ואנשי ×¤×Ø×•×“×§×˜ שלא מבינים רק יכתבו ×¤×Ø×•×ž×¤×˜×™× כל היום. בכל אחד ×ž××Ø×‘×¢×Ŗ ×”××™×Ø×•×¢×™× ×‘×Ø×©×™×ž×” ה AI ×”×Ŗ×—×™×œ ×œ×”×™×•×Ŗ מועיל רק אחרי שהבנתי מה ×ž×§×•×Ø ×”×Ŗ×§×œ×”. בכל אחד ×ž×”××™×Ø×•×¢×™× אף מודל מהמודלים המובילים היום לא היה מהוגל ×œ×™×™×¦×Ø תוכנית פעולה כדי ×œ×”×•×Ø×™×“ את ההיכון ×œ×”×™×©× ×•×Ŗ ×Ŗ×§×œ×” כזו בפעם הבאה או לשפר את זמני התגובה שלנו כשזה קורה. צ'אט ג'יפיטי הגדיל ×œ×¢×©×•×Ŗ באחת השיחות ×ž×œ××•×Ŗ ×”×Ŗ×”×›×•×œ שהיו לי איתו והציע לי ×œ×”×Ŗ×™×™×¢×„ עם איש DevOps. לך תהביר לו שאתה ה DevOps. אם יש משהו שהפער בין מהנדהי תוכנה להוכני קידוד מלמד אותנו הוא שמהנדהי תוכנה לא הולכים לשום מקום. × .ב. ×“×‘×Ø×™× ×©× ×©×‘×Ø×™× ×¤×Ŗ××•× הם ×Ŗ×•×œ×“×” של בעיה ×‘×ž×¢×Ø×›×Ŗ. הם לא נשברו ×¤×Ŗ××•× זה ×Ŗ×ž×™×“ היה שבור אבל עכשיו רק שמנו לב לזה כי היה פיצוׄ. "איך הקוד הזה יישבר" היא עדיין השאלה הכי חשובה ×œ×ž×¤×Ŗ×—×™× על כל קוד שאנחנו ×›×•×Ŗ×‘×™×.

ToCode
1 419
#!/bin/bash
# npm-search.sh - Search npm for packages
# Usage: ./scripts/npm-search.sh <search-terms>

if [ $# -eq 0 ]; then
    echo "Usage: $0 <search-terms>"
    echo "Example: $0 date format manipulate"
    echo "         $0 csv parse stream"
    exit 1
fi

SEARCH_QUERY="$*"

echo "šŸ” Searching npm for: $SEARCH_QUERY"
echo "----------------------------------------"

npm search "$SEARCH_QUERY"
וזה הכל. עכשיו כשאני אבקש מקלוד קוד לממש פיצ'ר ×‘×¤×Ø×•×™×§×˜ ווב הוא יחפש קודם ב npm search אם ×§×™×™×ž×Ŗ חבילה ואם ימצא חבילה ×Ø×œ×•×•× ×˜×™×Ŗ הוא ×™×©×Ŗ×ž×© בה. הך הכל ההקיל ×ž×•×Ø×›×‘ משני הקבצים:
ynonp@ynons-MacBook-Air ~/.claude/skills/npm-search (main?) $ tree
.
ā”œā”€ā”€ scripts
│   └── npm-search.sh
└── SKILL.md

2 directories, 2 files
שיפור ×œ×¢×•×ž×Ŗ MCP? בהחלט: 1. קל יותר ×œ×›×Ŗ×™×‘×” - כל הטקהטים יושבים בקובׄ markdown ×ž×”×•×“×Ø במקום בתיאור של tool-ים. ×”×§×Ø×™×¤×˜×™× יכולים ×œ×”×™×›×Ŗ×‘ בכל שפה ואפילו אפשר לשלב ×ž×”×¤×Ø שפות. 2. חוהך מקום בחלון הקונטקהט - הטקהטים נטענים לפי דרישה ובצורה ×“×™× ×ž×™×Ŗ, וכמובן ××Ŗ× יכולים לטעון ××•×Ŗ× גם בצורה יזומה ×‘××ž×¦×¢×•×Ŗ פקודת / ושם ההקיל ×‘×ž×§×Ø×” שלנו /npm-search. אפשר למצוא עוד ×“×•×’×ž××•×Ŗ להקילים בריפו של ×× ×˜×Ø×•×¤×™×§ כאן: https://github.com/anthropics/skills או ×‘×ž××’×Ø ההקילים של קודקה: https://github.com/openai/skills/tree/main/skills/.curated אגב ×ž×‘×—×™× ×Ŗ ×Ø×× ×Ø×™× ××—×Ø×™× אז גם קופיילוט וגם opencode יקראו הקילז ×ž××•×Ŗ×” ×Ŗ×™×§×™×™×Ŗ ~/.claude/skills. קודקה יחפש ××•×Ŗ× ב ~/.codex/skills.

ToCode
1 419
šŸ“Œ מ MCP ל Skills ×ž×Ø×’×¢ ×”×ž×¦××Ŗ ×¤×Ø×•×˜×•×§×•×œ MCP הוא ×”×Ŗ×¤×©×˜ כאש בשדה קוצים. כל ×ž×•×¦×Ø, כל ×™×¦×Ø×Ÿ, כל API הרגיש שהוא חייב להפיׄ MCP כדי שכלי AI יוכלו ×œ×”×Ŗ×—×‘×Ø ×œ××•×Ŗ×• ×”×ž×•×¦×Ø. אז יש לנו MCP של ג'ירה בעזרתו המודל יכול ×œ×§×Ø×•× טיקטים, ו MCP של פיגמה בעזרתו המודל יכול ×œ×§×Ø×•× את העיצובים וגם MCP של ×¤×œ×™×™×Ø×™×™×˜ איתו אפשר לשלוט בדפדפן ועוד אינהוף אפשרויות. MCP הוא בהך הכל אוהף "כלים", ×›×œ×•×ž×Ø אוהף של פקודות שהמודל יכול להפעיל. לכל פקודה יש תיאור משלה ×•×“×Ø×š הפעלה משלה. ×“×•×’×ž××•×Ŗ ×œ×¤×§×•×“×•×Ŗ ×©×ž×’×™×¢×•×Ŗ מ MCP יהיו "קרא קובׄ ×ž×Ø×™×¤×• בגיט", "שכפל את הריפו ×”×ž×Ø×•×—×§", "הפעל דפדפן וגלוש ×œ×›×Ŗ×•×‘×Ŗ ×ž×”×•×™×ž×Ŗ", "החזר ×Ø×©×™×ž×” של האוביקטים ×‘×¤×Ø×™×™× מהוים". ×—×”×Ø×•×Ÿ אחד של MCP הוא שהרבה אנשים התקינו ××•×Ŗ× אבל מעט אנשים כתבו ××•×Ŗ×. זה היה יותר היפור תרבותי ×ž××©×Ø מגבלה ×˜×›× ×•×œ×•×’×™×Ŗ כי ×‘××ž×Ŗ שלא מהובך ×œ×›×Ŗ×•×‘ שרתי MCP אבל זה היה המצב. ×—×”×Ø×•×Ÿ שני של MCP היה שכל MCP שאני ×ž×Ŗ×§×™×Ÿ "תופה מקום" בחלון הקונטקהט של המודל ולכן ×‘×Ŗ×—×™×œ×Ŗ כל שיחה היינו ×¦×Ø×™×›×™× ×œ×‘×—×•×Ø באיזה שרתי MCP אנחנו מהכימים ×œ×”×©×Ŗ×ž×© בשיחה זו. מנגנון חלופי שצובר תאוצה ועוזר ×œ×¤×Ŗ×•×Ø בעיה דומה נקרא Skills. בניגוד ל MCP, ה Skill הוא ×ž×•×“×•×œ×Ø×™. המודל מקבל תיאור כללי של ה Skill ומחליט לבד אם לטעון אותו או לא, ×›×œ×•×ž×Ø ×˜×¢×™× ×Ŗ ה Skill היא ×”×¤×¢×œ×Ŗ כלי שהמודל יוזם. הבדל נוהף מ MCP הוא ש Skill הוא הרבה יותר חופשי - אני כותב את התיאור בקבצי Markdown ואת הקוד בקבצי ×”×§×Ø×™×¤×˜ באיזה ×¤×•×Ø×ž×˜ שאני בוחר. התוצאה היא שהרבה יותר קל ×œ×›×Ŗ×•×‘ Skill וגם ×œ×§×Ø×•× את הקוד שלו. דוגמה? בטח. בואו × ×™×Ŗ×Ÿ למודל שלנו אופציה לחפש ב npm ×—×‘×™×œ×•×Ŗ הרחבה. ה Skill ×ž×•×Ø×›×‘ בהך הכל מקובׄ הוראות ×•×ž×”×§×Ø×™×¤×˜ חיפוש ××•×Ŗ× אני שם בתיקייה עם שם מיוחד בתיקיית הבית. נפתח ×Ŗ×™×§×™×” חדשה ~/.claude/skills:
mkdir -p ~/.claude/skills/npm-search
×‘×Ŗ×•×š ×”×Ŗ×™×§×™×™×” אני יוצר קובׄ בשם SKILL.md עם ×”×Ŗ×•×›×Ÿ הבא:
  ---
  name: npm-search
  description: Use this skill whenever implementing a feature or adding functionality to a JavaScript/TypeScript/Node.js project. Before writing custom code, always run npm search to find existing libraries that can solve the problem. This prevents reinventing the wheel and leverages the npm ecosystem.
  ---
  
  # NPM Search Guide
  
  ## Overview
  
  Before implementing any feature in a JavaScript/TypeScript/Node.js project, search npm for existing libraries that can solve the problem. This ensures you leverage the ecosystem rather than reinventing the wheel.
  
  ## When to Search npm
  
  Use npm search before implementing:
  - Data processing or transformation utilities
  - HTTP clients or API helpers
  - Date/time manipulation
  - Validation libraries
  - Authentication/authorization
  - File handling (CSV, JSON, XML, PDF, etc.)
  - Database connectors
  - Testing utilities
  - UI components (for frontend projects)
  - Any common utility or pattern
  
  ## Running npm Search
  
  Use the provided script to search for packages:
  
  ```bash
  ./scripts/npm-search.sh <search-term>
Or run directly:
npm search <search-term>
šŸ“š Example Searches
# Looking for a date library
./scripts/npm-search.sh date format manipulate

# Looking for a validation library
./scripts/npm-search.sh schema validation zod joi

# Looking for an HTTP client
./scripts/npm-search.sh http client axios fetch

# Looking for a CSV parser
./scripts/npm-search.sh csv parse stream
āœ Evaluating Packages When reviewing search results, consider: 1. Downloads: Higher weekly downloads indicate community trust 2. Version: Recent versions suggest active maintenance 3. Description: Clear descriptions indicate well-documented packages 4. Dependencies: Fewer dependencies mean smaller bundle size āœ Installation Once you've identified a suitable package:
npm install <package-name>
# or
pnpm add <package-name>
# or
yarn add <package-name>
āœ Implementation After installation, read the package's README or documentation before using it. Look for: ⦁ Basic usage examples ⦁ Configuration options ⦁ Common patterns and best practices
נשים לב שרק החלק העליון של ×”×ž××Ø×§×“××•×Ÿ נטען כברירת מחדל לקלוד קוד. רק אם המודל יחליט לטעון את ההקיל הוא יקרא את הקובׄ המלא.

להיום אני יוצר ×”×§×Ø×™×¤×˜ בשם `scripts/npm-search.sh` ×‘×Ŗ×•×š אותה ×Ŗ×™×§×™×™×” עם ×”×Ŗ×•×›×Ÿ הבא:

```language-sh

ToCode
1 419
šŸ“Œ געגועים ×œ×”×¤×Ø×™×•×Ŗ קוד פתוח הפריות קוד פתוח ×Ŗ×ž×™×“ היוו מעין קרש קפיצה ×ž×”×™×Ø ×œ×¤×™×Ŗ×•×—. ×¦×Ø×™×š תיבת בחירה יפה עם חיפוש ובחירה ×ž×Ø×•×‘×”? יש קומפוננטה לזה. ×¦×Ø×™×š ×œ×”×•×Ø×™×“ קבצים ×ž×”××™× ×˜×Ø× ×˜ עם אופציה ×œ×”×–×“×”×•×Ŗ וטיפול בנהיונות ×—×•×–×Ø×™×? יש הפריה לזה. אני עדיין ×ž×©×Ŗ×ž×© בהפריות קוד פתוח, אבל הרבה פחות. ככל שיותר קוד נכתב על ידי הוכני קידוד ההוכן ×ž×©×Ŗ×ž×© בהפריות שהוא "×ž×›×™×Ø" או "מעדיף", ומקודד מאפה את ×”×Ø×›×™×‘×™× שהוא לא ×ž×›×™×Ø. שימוש בהפריית קוד פתוח ×‘×¤×Ø×•×™×§×˜ ××•×ž×Ø שהוכן הקידוד ×¦×Ø×™×š ×œ×”×Ŗ××ž×„ יותר בשביל ×œ×‘× ×•×Ŗ את הפיצ'ר הבא או לתקן באג. ככל שההפריה פחות ×ž×Ŗ×•×¢×“×Ŗ או ×¤×•×¤×•×œ×Ø×™×Ŗ להוכן יהיה יותר קשה לעבוד איתה וכל שינוי ידרוש העמהה של תיעוד ×Ø×œ×•×•× ×˜×™ ×œ×Ŗ×•×š חלון הקונטקהט. מה הפהדנו פה? אני לא בטוח. ×©×œ×—×Ŗ×™ את לאבבל ×œ×‘× ×•×Ŗ לי משחק ×Ŗ×Ø×’×•×œ צלילים ×‘×’×™×˜×Ø×”. זה כאן אם ××Ŗ× ×Ø×•×¦×™× ×œ× ×”×•×Ŗ. המעניין שם זה שאת צוואר ×”×’×™×˜×Ø×” לאבבל צייר לבד ×‘××ž×¦×¢×•×Ŗ SVG. בעולם הישן ציור צוואר ×’×™×˜×Ø×” ב SVG היה בעיניי האופציה האחרונה. קודם ×”×™×™×Ŗ×™ מחפש הפריית קוד פתוח ×•×‘×ž×§×Ø×” הגרוע ×ž×¦×™×™×Ø את זה ב HTML ו CSS. ההוכן יצר קומפוננטה של ×’×™×˜×Ø×” שנראית ממש אחלה ועובדת עבור המשחק לא פחות טוב מ react-fretboard או react-guitar, עם קוד ציור יפה ב SVG. אפשר ×œ×Ø××•×Ŗ את הקוד שלו כאן: https://github.com/ynonp/fret-play-learn/blob/main/src/components/GuitarFretboard.tsx המשחק היותר ×ž×©×ž×¢×•×Ŗ×™ בפרידה ×ž×”×¤×Ø×™×•×Ŗ קוד פתוח הוא השאלה "מי ×™×Ŗ×—×–×§ את זה?". גם כאן אין לי דעה חד ×ž×©×ž×¢×™×Ŗ. מצד אחד כשהעולם ×ž×©×Ŗ× ×” ×•×ž×Ŗ×’×œ×•×Ŗ בעיות אבטחה נוח שיש אנשים ××—×Ø×™× ×©×ž×Ŗ×—×–×§×™× את הפריית הקוד הפתוח האהובה עליי ומעלים גרהה חדשה וטובה יותר. מצד שני הרבה ×ž×”×©×“×Ø×•×’×™× בהפריות קוד פתוח הם תוהפת של פיצ'×Ø×™× שאני לא ×¦×Ø×™×š ויוצא שאני מבזבז זמן על ×”×Ŗ××ž×•×Ŗ לממשק של גרהה חדשה שבכלל לא ביקשתי. ×‘×™× ×Ŗ×™×™× ×“×•×’×ž×Ŗ הקומפוננטה של ×”×’×™×˜×Ø×” לימדה אותי שמאוד נוח כשההוכן בונה מאפה את הרכיב המדויק שאני ×¦×Ø×™×š. כן כדאי להקפיד לבקש מההוכן ×›×©×¦×Ø×™×š שישים לב כשיש קומפוננטה לשימוש חוזר ויבנה אותה בצד בתור קומפוננטה נפרדת. ×‘×¤×™×Ŗ×•×—×™× חדשים ובמצב ×Ŗ×›× ×•×Ÿ הוא יראה את זה לבד. בתיקוני באגים הרבה יותר קשה לו לשים לב.