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

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

לולאות בתכנות פונקציונאלי

28/09/2018

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

המשך קריאה

ללמד אנשים אחרים

27/09/2018

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

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

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

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

שתי גישות, אותם קשיים

25/09/2018

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

אנגולר או ריאקט? מיקרו סרביסס או מונולית? אפליקציה או אתר? שרת ייעודי או Serverless?

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

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

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

https://forum.tocode.co.il/t/advent-of-code/782

פיצול פרויקט עם Git Filter Branch

24/09/2018
git

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

המשך קריאה

התחלתי לכתוב קוד רקורסיבי ב JavaScript ולא תאמינו מה קרה אחר כך (או: מה זה TCO)

23/09/2018

השבוע פרסמתי כאן השוואה בין קוד פרוצדורלי לקוד פונקציונאלי. הקוד היה כתוב ב Ruby ו Elixir וחלק מהקוראים חשבו שיהיה יותר מעניין לראות השוואה דומה בשפה שמכירים. אז הלכתי לכתוב את אותו הקוד ב JavaScript והתוצאה תעזור לנו להאיר עוד פינה בייחודיות של שפות פונקציונאליות.

המשך קריאה

איך למחוק קובץ לחלוטין מכל ההיסטוריה של גיט באמצעות git filter branch

22/09/2018
git

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

המשך קריאה

קוד פרוצדורלי וקוד פונקציונאלי נפגשו לצהריים

21/09/2018

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

המשך קריאה

פעולות אוטומטיות על קבצים עם Git Filters

20/09/2018
git

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

המשך קריאה

האופרטור % וקריאה אחרי סוף המערך

19/09/2018

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

https://forum.tocode.co.il/t/advent-of-code/778

במהלך הדיון על החידה הראשונה עלה הנושא של קריאה ממערך בצורה מעגלית - לדוגמא בהינתן המערך:

arr = [10, 20, 30, 40]

אנחנו יודעים שהערך באינדקס 0 הוא 10, באינדקס 1 הוא 20 וכן הלאה. אבל מה אם נתקדם 10 מקומות מתחילת המערך וכל פעם שנעבור את אינדקס 3 נחזור אחורה ונאפס את האינדקס... לאיזה ערך נגיע?

מסתבר שהאופרטור % עוזר לפתור מהר שאלות מסוג זה. האופרטור % מחזיר את שארית החלוקה לדוגמא:

5 % 2 == 1

בגלל שהכפולה של 2 שהכי קרובה ל-5 היא המספר 4 (זה הכי קרוב שנגיע ל-5), ונשאר עוד 1 שנקרא שארית. שיטה די מקובלת לרוץ בצורה מעגלית על מערך היא להסתכל על שארית החלוקה באורך המערך. לדוגמא המערך שלנו הוא באורך 4. לכן קל לשאול מה האיבר באינדקס 0 (זה 10) או באינדקס 2 (זה 30). אבל, מה האיבר באינדקס 4? באינדקס 10? באינדקס 12? כלומר מה יקרה כשתקדם במערך אחרי האורך שלו?

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

real_index = i % len(arr)

לדוגמא האינדקסים שכתבתי קודם:

arr[4 % len(arr)] == arr[0] == 10

arr[5 % len(arr)] == arr[1] == 20

arr[10 % len(arr)] == arr[2] == 30

arr[12 % len(arr)] == arr[0] == 10

שימוש באופרטור % הוא הרבה יותר מהיר מחישוב האינדקס בלולאה למשל ולכן נרצה להשתמש בו גם בתרגילים ב Advent Of Code אבל כמובן גם בחיים בכלל.

הנה דוגמא נוספת לאותו מנגנון הפעם בשפת JavaScript שבוחרת צבע מתוך מערך של צבעים בצורה מחזורית:

const colors = ['red', 'blue', 'green', 'white', 'yellow', 'brown', 'magenta', 'cyan', 'pink', 'orange'];
let idx = 0;

function changeColor() {
  idx = (idx + 1) % colors.length;
  document.body.style.backgroundColor = colors[idx];
}

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