הבלוג של ינון פרק

טיפים קצרים וחדשות למתכנתים

איך לקרוא קובץ CSV למערך של מפות ב Clojure

06/09/2020

בתיעוד על ספריית העבודה עם CSV של Clojure מצאתי את קטע הקוד הבא, שהופך קובץ CSV למערך של מפות:

(defn csv-data->maps [csv-data]
  (map zipmap
       (->> (first csv-data)
            repeat)
      (rest csv-data)))

הקטע משתמש במספר קסמים של Clojure ומשקף הרבה מהדברים היפים בשפה. בואו נפרק אותו כדי להבין איך זה עובד.

המשך קריאה

פייתון, פסיק ושגיאות לא הגיוניות

05/09/2020

אפילו שפות תכנות שמתיימרות להיות נחמדות עלולות לדקור אתכם מאחור כשאתם לא מסתכלים (ואז לצחוק כשאתם שוכבים מדממים על הריצפה). הנה פייתון באקט של חוסר התחשבות מוחלט:

def first_letter(text):
    return text[0]

text = "I can see a mountain",
print(first_letter(text))

הצלחתם לנחש מה הקוד מדפיס? נריץ ונבדוק אם צדקנו:

$ python3 ouch.py 
I can see a mountain

את כל הטקסט??? פייתון...

הבעיה היא כמובן הפסיק בסוף שורת ההשמה:

text = "I can see a mountain",

הפסיק הזה גורם לפייתון להבין ש text הוא למעשה tuple של איבר אחד, והאיבר הראשון (והיחיד) ב tuple הוא המחרוזת שלנו. כשהעברנו את ה tuple לפונקציה first_letter היא הדפיסה את האיבר הראשון מה tuple, כלומר את כל הטקסט.

וזאת אולי הסיבה המרכזית שכדאי להוסיף Type Hints לקוד שלכם. הכתיב הבא:

def first_letter(text: str):
    return text[0]

text = "I can see a mountain",
print(first_letter(text))

כבר נותן לפייתון את כל הכלים לזהות שאנחנו מעבירים משהו אחר ממה שהתכוונו ואף להודיע לנו (כשנבקש כמובן) על הטעות:

$ python3 -m mypy ouch.py
ouch.py:5: error: Argument 1 to "first_letter" has incompatible type "Tuple[str]"; expected "str"
Found 1 error in 1 file (checked 1 source file)

(מאיפה לומדים על Type Hints אתם שואלים? נו, תשמחו לשמוע שכבר בניתי קורס וידאו בדיוק על זה ועל עוד המון פיצ'רים מדליקים של פייתון שיחסכו לכם זמן בפיתוח קוד בעולם האמיתי. הוא נקרא פייתון מתקדם וכולל אינספור טיפים לפיתוח פייתון לאנשים שכבר יודעים את הבסיס).

להתאמן בבית

04/09/2020

הרבה מדברים על הפער בין הלימודים לניסיון ועל כמה זה קשה להתקבל לעבודה כשאין לך ניסיון מעשי. אני מתחיל לחשוב שהדיבור הזה כבר לא משקף את המציאות ואני מתחיל לראות מתכנתים טובים שמצליחים לשבור את המעגל לגמרי לבד עם הכלים המודרניים שיש היום ברשת.

מבחינת חומרה שירותים מבוססי ענן מאפשרים לנו לבנות קלאסטרים של מכונות, להתקין עליהם כלי ניהול אוטומטיים כמו Kubernetes ולהרים רשת בדיוק כמו שיש בחברות הגדולות ואפילו טובה יותר ממה שיש בהרבה חברות בינוניות וקטנות.

מבחית תוכנה בעזרת docker ו docker-compose אנחנו יכולים בשתי לחיצות להרים אצלנו על המכונה סביבות עבודה מורכבות כולל Load Balancers, בסיסי נתונים מכל הסוגים וטופולוגיות רשת מתוחכמות. אני יכול לבנות אפליקציית ווב ב Python ולהתאמן על העלאה לפרודקשן בסביבה זהה למה שאמצא בתעשיה.

מבחינת המחשב עצמו המעבר לענן והפתיחה של העננים הציבוריים הביאו לכך שאין יותר שרתים גדולים שיושבים במרתף של החברה או בחדר שרתים. מה שיש בעבודה זה בדיוק מה שיש לך גישה אליו מהבית. גם תחנות הקצה של רוב המתכנתים היום זהות: הלפטופ שתקנה ב KSP הוא בדיוק מה שיהיה לך בעבודה במשרד.

מבחינת כלי פיתוח גיטהאב וגיטלאב מספקים מנגנוני CI/CD חינמיים לגמרי כך שאפשר לבנות Pipeline לתוכנה שבניתם בבית שיהיה טוב כמו ה Pipelines שתמצאו בתעשיה.

מבחינת Data יש לגוגל מנוע חיפוש על Data Sets עם מעל 25 מיליון סטים של מידע מכל הסוגים כדי שתוכלו לנתח מידע או לבנות אלגוריתמים כמו שהיו עושים בחברות גדולות. אתם כבר לא צריכים לעבוד בחברה גדולה בשביל להתאמן על ניתוח כמויות כאלה של מידע.

כל הכלים כבר כאן וכל הידע כבר מזמן כאן. אף פעם לא היה כל כך קל לצבור ניסיון מעשי רלוונטי לבד לגמרי ומהבית. שנתחיל לעבוד?

תתחילו בלחפש את השאלות

03/09/2020

היום בעשר אעביר וובינר על הקמת סביבת עבודה למתכנתים במערכת הפעלה Linux. ותשמעו להראות איך בונים סביבת עבודה טובה על Linux בשעה זה לא פשוט: יש הרבה יותר מדי אפשרויות, הרבה יותר מדי כלים והרבה יותר מדי קונפיגורציות לכל כלי.

אחרי חמש דקות ברדיט הייתי בטוח שאני מבטל את הוובינר. אין דרך בעולם שאצליח לדבר על כל הכלים המדליקים, או אפילו על כל הדברים המטורפים שאפשר לעשות עם כלי בודד.

ובדיוק כשעמדתי להתייאש לקחתי כוס קפה נוספת ונזכרתי בכלל הכי חשוב בלימודים: התשובה הרבה פחות חשובה מהשאלה. ואנשי פיתוח טובים הם לא אנשים שמכירים את כל התשובות, אלא אנשים שיודעים למצוא שאלות מעניינות ולחפש עליהן מידע.

יוטיוב מלא במדריכי "איך לבנות אפליקציית React ו Node.JS מאפס", "איך לכתוב פאקמן ב Python" או "איך להתקין ולהגדיר את ה vimrc המושלם". כשאתם חדשים לגמרי לנושא אלה בדיוק סוג המדריכים שתרצו לצפות בהם. אני מוצא שכמעט תמיד ברגע שאני מצליח לכתוב תוכניות פשוטות אני אלמד הרבה יותר טוב אם אשבור את הראש על שאלות מעניינות או אחפש בעצמי את הסטאפ המושלם.

והוובינר? הוא ייקח את אותו הכיוון: נתחיל מאפס ונראה איך לחפש כלים מעניינים, איך לבדוק אותם ומה חשוב לנו בסביבת העבודה. תבואו, יהיה כיף (וכנראה יעסיק אתכם הרבה מעבר לשעה שלנו יחד).

כלי טוב מדי

02/09/2020

אנחנו יודעים שקל יותר להבריג בורג עם מברג מאשר עם פטיש, ובשביל לקדוח בקיר עדיף שתהיה לכם מקדחה ביד, אבל אנלוגיית הכלים לא תמיד עובדת כשיש לנו כלים יותר טובים ופחות טובים.

ביוניקס מאוד קל לראות את זה כשמסתכלים על פקודות כמו cut ו awk. לכאורה אין שום היגיון להשתמש ב cut: כל מה ש cut יודעת לעשות, awk יודעת לעשות טוב יותר.

וזאת בדיוק הסיבה ללמוד להשתמש ב cut.

או ניקח דוגמא משפות תכנות: כל מה שאפשר לכתוב עם map אפשר לכתוב עם לולאת for. ועדיין אם יש לי רשימה של מספרים ואני רוצה לחשב את סכום הריבועים שלהם אני אעדיף לכתוב:

const numbers = [1, 2, 3, 4];
const plus = (a, b) => a + b;
const square = x => x * x;
const result = numbers.map(square).reduce(plus);
console.log(result);

על פני:

const numbers = [1, 2, 3, 4];
let result = 0;

for (let i=0; i < numbers.length; i++) {
  result += numbers[i] * numbers[i];
}

console.log(result);

ובדיוק מהסיבה הזאת אני מעדיף את const על פני let.

בכתיבת קוד אנחנו רוצים לבחור את הכלי שיש לו הכי פחות אפשרויות שעדיין פותר טוב את הבעיה. עם כלי כזה יש פחות תקלות, פחות מקרי קצה שלא חשבנו עליהם ופחות הזדמנויות לבעיות אבטחה.

הכלי הטוב מדי מביא איתו יותר עומס ומסתיר את הדבר שבאמת רצינו לעשות.

טיפ יוניקס - מחיקת תיקיה עם מינוס בשם שלה

01/09/2020

לריילס יש כלי שורת פקודה מעולה שמאפשר ליצור פרויקטים וקבצים חדשים דרך שורת הפקודה (כן אני יודע שהיום לכולם כבר יש כזה. עדיין ריילס היו שם קודם). בכל מקרה בשביל ליצור יישום ריילס חדש אנחנו פשוט רושמים משורת הפקודה:

rails new hello-world

וזה ייצור יישום חדש בשם HelloWorld. אבל אנחנו לא עוצרים כאן: לריילס יש המון מתגים איתם אנחנו בוחרים איזה יישום בדיוק ייווצר ומה יהיו היכולות שלו. בשביל לראות את כולם נקליד:

rails new --help

וכאן מתחילות הבעיות.

באחת ההפעלות במקום לכתוב את השורה מלמעלה טעיתי בסדר האותיות ויצאה לי הפקודה:

rails new --hlep

התוצאה? ריילס יצר אפליקציה חדשה עם השם המופלא --hlep, וכן שני המינוסים בהתחלה היו חלק משם התיקיה. ברשימת התיקיות זה נראה כך:

$ ls -l

drwxrwxr-x 2 ynon ynon 4096 Aug 31 20:57 --hlep

אין בעיה חשבתי אני יודע rm פשוט אמחק את התיקיה ואנסה שוב. אבל יוניקס חשב אחרת:

$ rm -rf --hlep

rm: unrecognized option '--hlep'
Try 'rm ./--hlep' to remove the file '--hlep'.
Try 'rm --help' for more information.

הבעיה שהפקודה rm (כמו גם הרבה פקודות יוניקס אחרות) היתה בטוחה ש --hlep הוא בעצם אחד המתגים ולא שם הקובץ ולא הבינה מה אני רוצה ממנה.

הפיתרון כמו תמיד הוא פשוט כשמכירים: המתג המיוחד -- מסמן לכל פקודה יוניקס את "הסוף" של רשימת המתגים, כך שכל מה שמגיע אחריו יהיה שם הקובץ עליו צריך לעבוד. ומחיקת התיקיה? זה היה בסך הכל:

$ rm -rf -- --hlep

צעדים ראשונים עם react-testing-library

31/08/2020

ספריית react-testing-library היא היום הדרך המקובלת לכתוב בדיקות ליישומי ריאקט. קוד rtl נוצר כל פעם שאנחנו בונים אפליקציה חדשה עם create-react-app וגם הסקריפטים הדרושים להריץ אותו. בואו נראה איך להתחיל להשתמש בספריה כדי לכתוב בדיקות ולמה זה כדאי.

המשך קריאה

כמה טיפים מדליקים לשימוש בפקודה date

הפקודה date היא האולר השוויצרי של המרות תאריכים. היא תעזור לנו להשתתף בכנסים ואירועי תרבות מכל העולם (כי תמיד נוכל לזהות באיזה שעה הם מתקיימים בשעון המקומי שלנו) ולבצע חישובים עם זמנים בלי לעזוב את שורת הפקודה. הנה כמה מהשימושים שאני אוהב ל date:

המשך קריאה

לינוקס: עשר שנים אחרי

29/08/2020

לפני שבוע וחצי בערך חזרתי ללינוקס אחרי פרידה של כעשר שנים לטובת ארץ התפוח. החזרה ללינוקס היתה משמחת, ובגדול רוב מה שאני צריך בסביבת העבודה כבר מוגדר ועובד. אלה הרשמים המרכזיים על הדברים שהשתנו ואלה שנשארו אותו דבר, לא לפי שום סדר:

אני מאוד אוהב בלינוקס שהיא מכריחה אותך להבין דברים לפני שהם עובדים. במעבר מ Time Machine ל Bacula למדתי כל כל הרבה על מדיניות גיבויים ושחזורים, כתיבה מקבילית, מדיניות שמירת גיבויים ועוד המון המון דברים שלא הייתי חולם להגיע אליהם אם הכל היה "פשוט עובד". אז וגם היום, בלינוקס כשדברים לא עובדים זה בדרך כלל באשמתך ואחרי שתלמד מספיק בסוף זה יעבוד. יש גם צד שני לסיפור הזה כמובן והוא שאתה מבלה הרבה יותר זמן בהגדרות וקונפיגורציה של המערכת וכל מיני כלים בה. אישית אני אוהב את זה.

נקודה ראשונה של שינוי לטובה מצאתי בצמצום הפער בין הפצות. אני לא בטוח איך זה קרה אבל אני כמעט לא מרגיש שאני עובד על Ubuntu. אני יכול להסתכל ב Arch Wiki או בתשובות מ SO על כל הפצה אחרת והעצות עובדות כמעט בלי שינויים גם באובונטו.

שינוי נוסף לטובה הוא תאימות החומרה ותאימות באופן כללי. נכון, מבחינת חומרה קניתי מחשב שנבדק לעבוד עם לינוקס וידעתי שאני הולך על בטוח, אבל עכשיו כל מיני התקני USB שאני מחבר עובדים מיד, המסך החיצוני התחיל להציג מיד כשחיברתי אותו ובאיזושהי דרך קסומה גם X ידע להשתמש בו כמו שצריך ובלי שום הגדרות הצלחתי להזיז חלונות בין המסך של הלפטופ למסך החיצוני. בקיצור חומרה עובדת. לא זכרתי את זה ככה ואני מאוד מרוצה.

מה שעדיין קשוח בלינוקס זה שחסרות גירסאות רישמיות של האפליקציות: ווטסאפ, בייסקמפ, טודואיסט ועוד עשרות אפליקציות Cross Platform שהייתי רגיל להפעיל על המק לא זמינות או שמופעלות דרך בילדים מחתרתיים. לא אהבתי גם את Snap Store של אובונטו שיוצרת לי המון Mount Points על המכונה ואני לא מבין בשביל מה. מצד שני יש סטים, יש זום, יש סלאק, יש ספוטיפיי, יש דיסקורד, יש טלגרם ועוד לא מעט תוכנות אחרות.

גם הקונפליקט שהיה פעם בין KDE ל Gnome נראה שנעלם. יש לי היום יישומי Gtk וגם יישומי Qt על המכונה וממילא למנהל החלונות שלי (i3) נראה שלא אכפת מכלום.

לינוקס השתנתה בעשר השנים האחרונות ולדעתי מאוד לטובה. קל מאוד למצוא תשובות לרוב השאלות, הרבה תוכנות זמינות גם בגירסאות לינוקס ורוב הדברים שאתם צריכים עובדים ישר מהקופסה. שבוע וחצי בפנים אפשר בקלות להגיד שאם חיפשתם הזדמנות להתקין ולעבוד על Linux, אף פעם לא היה זמן טוב יותר מעכשיו.

ונסיים בפירסומת קטנה - אם יש לכם Linux או שאתם עובדים בסביבת יוניקס בעבודה ורוצים לשפר את הפרודוקטיביות משורת הפקודה תשמחו לשמוע שביום חמישי אעביר וובינר בדיוק על זה ובו אראה איך להתקין, להגדיר ולעבוד עם כלי שורת פקודה מרכזיים ביניהם zsh, vim ו tmux. פרטים והרשמה בקישור: https://www.tocode.co.il/workshops/102