ToCode
1.36K subscribers
1.84K links
טיפים קצרים למתכנתים מאת ינון פרק
Download Telegram
# כלל אצבע לזיהוי הודעת קומיט גרועה

"תיקון לצבעים"

"תיקון שגיאת כתיב"

"תיקוני UI"

"התחלתי לכתוב CSS"

"הוספתי בדיקות"

"שיפורים"

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

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

"תיקנתי את צבע הכותרת הראשית לפי ההערות מהמעצב. כרטיס ג'ירה עם העיצוב #121"

"תיקון מספר שגיאות כתיב בעמוד אודות"

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

"בעקבות דיווח של משתמשים שלא הצליחו להירשם הוספתי בדיקה שנכשלת שמתאימה לדיווח".

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

"תיקון לצבעים"

"תיקון שגיאת כתיב"

"תיקוני UI"

"התחלתי לכתוב CSS"

"הוספתי בדיקות"

"שיפורים"

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

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

"תיקנתי את צבע הכותרת הראשית לפי ההערות מהמעצב. כרטיס ג'ירה עם העיצוב #121"

"תיקון מספר שגיאות כתיב בעמוד אודות"

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

"בעקבות דיווח של משתמשים שלא הצליחו להירשם הוספתי בדיקה שנכשלת שמתאימה לדיווח".

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

"תיקון לצבעים"

"תיקון שגיאת כתיב"

"תיקוני UI"

"התחלתי לכתוב CSS"

"הוספתי בדיקות"

"שיפורים"

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

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

"תיקנתי את צבע הכותרת הראשית לפי ההערות מהמעצב. כרטיס ג'ירה עם העיצוב #121"

"תיקון מספר שגיאות כתיב בעמוד אודות"

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

"בעקבות דיווח של משתמשים שלא הצליחו להירשם הוספתי בדיקה שנכשלת שמתאימה לדיווח".

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

"תיקון לצבעים"

"תיקון שגיאת כתיב"

"תיקוני UI"

"התחלתי לכתוב CSS"

"הוספתי בדיקות"

"שיפורים"

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

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

"תיקנתי את צבע הכותרת הראשית לפי ההערות מהמעצב. כרטיס ג'ירה עם העיצוב #121"

"תיקון מספר שגיאות כתיב בעמוד אודות"

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

"בעקבות דיווח של משתמשים שלא הצליחו להירשם הוספתי בדיקה שנכשלת שמתאימה לדיווח".

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

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

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

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

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

language-python
import requests
import telepot
import re

def daily_post_url():
response = requests.get(
'https://www.tocode.co.il/blog',
headers={'Accept': 'application/json'},
)
json_response = response.json()

return json_response['blog']['posts'][0]['href']

def post_content(url):
response = requests.get("https://www.tocode.co.il" + url + '/md')
return response.text

def split_body_to_messages(body):
output = re.findall(r"(.{1,4096}\b)", body, re.S)
return output

url = daily_post_url()
body = post_content(url)

chat_id = "@tocodeil"
bot = telepot.Bot('my-secret-token')
bot.sendMessage(chat_id, "https://www.tocode.co.il" + url, disable_web_page_preview=None)

for msg in split_body_to_messages(body):
bot.sendMessage(chat_id, body)


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

1. קוד פשוט וקצר בהרבה (31 שורות לעומת מעל 700 בבוט הישן).

2. רץ בתור סקריפט מ cron ולא צריך להישאר כל הזמן באוויר.

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

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

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

הפקודה ifconfig היא מיושנת ויש לה כמה מגבלות שלעולם לא יתוקנו, ולכן הפקודה המודרנית והמומלצת לשימוש היא ip. בשביל למצוא כתובת ip של מכונה אני יכול להפעיל:

```language-sh
$ ip addr show
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: enp0s1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
link/ether 52:54:00:1f:e8:4c brd ff:ff:ff:ff:ff:ff
inet 192.168.64.4/24 brd 192.168.64.255 scope global dynamic enp0s1
valid_lft 56632sec preferred_lft 56632sec
inet6 fd5e:dcce:7fd0:a7fb:5054:ff:fe1f:e84c/64 scope global dynamic mngtmpaddr noprefixroute
valid_lft 2591997sec preferred_lft 604797sec
inet6 fe80::5054:ff:fe1f:e84c/64 scope link
valid_lft forever preferred_lft forever
3: br-20cce5ed46b0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default
link/ether 02:42:2a:b6:7a:9c brd ff:ff:ff:ff:ff:ff
inet 172.20.0.1/16 brd 172.20.255.255 scope global br-20cce5ed46b0
valid_lft forever preferred_lft forever
4: br-9946704f08d6: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default
link/ether 02:42:c3:91:58:ec brd ff:ff:ff:ff:ff:ff
inet 172.18.0.1/16 brd 172.18.255.255 scope global br-9946704f08d6
valid_lft forever preferred_lft forever
5: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default
link/ether 02:42:4d:37:b0:5c brd ff:ff:ff:ff:ff:ff
inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
valid_lft forever preferred_lft forever
```

וכמו עם ifconfig גם פה אני יכול לסנן את כל הבלאגן:

```language-sh
$ ip addr show | grep -w inet
inet 127.0.0.1/8 scope host lo
inet 192.168.64.4/24 brd 192.168.64.255 scope global dynamic enp0s1
inet 172.20.0.1/16 brd 172.20.255.255 scope global br-20cce5ed46b0
inet 172.18.0.1/16 brd 172.18.255.255 scope global br-9946704f08d6
inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
```

אפשר גם להפעיל ולכבות איתה ממשקי רשת, אבל המתג שאני אהבתי הוא בכלל האות n, שמציגה את כל השכנים ברשת מפרוטוקול arp:

```language-sh
$ ip n
192.168.64.1 dev enp0s1 lladdr 52:ed:3c:d3:64:64 REACHABLE
fd5e:dcce:7fd0:a7fb:10c8:64d2:15b:ca05 dev enp0s1 lladdr 52:ed:3c:d3:64:64 router STALE
fe80::50ed:3cff:fed3:6464 dev enp0s1 lladdr 52:ed:3c:d3:64:64 router STALE
```

דף התיעוד הוא כאן:
[https://linux.die.net/man/8/ip](https://linux.die.net/man/8/ip)

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

```language-sh
$ alias ifconfig="ip addr show"
```

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

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

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

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

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

1. לכתוב סקריפטים קטנים בפייתון או ב bash, אפילו שאנחנו כותבים קוד ב Java.

2. להמשיך לעבוד בלינוקס על הלפטופ, אפילו שבמקום החדש מותר לעבוד גם ב Windows.

3. לבנות ממשקים או אפליקציות קטנות לדברים "שוליים" כמו ממשק שמראה למי בחברה יש יום הולדת החודש.

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

אז נכון אם לקחתם 5 שנים לטיול מסביב לעולם אין טעם להמשיך לשלם את העלות החודשית של שימור הידע; אבל אם אתם כבר פה ועדיין כותבים קוד, אולי שווה לשים את השעה ביום כדי להשאיר עוד דלת פתוחה ליום סגריר
סליחה על כל החפירות, עשיתי כמה תיקונים בבוט
תקראו על הכל בפוסט מחר
# שלב 2
לפני כמה ימים סיפרתי פה איך שרבטתי בוט טלגרם בפייתון כדי להחליף את הבוט שהיה לנו באליקסיר, בגלל שהישן הפסיק לעבוד ועדכון כל התלויות של האליקסיר לא נראה לי שווה את ההשקעה. על הדרך מחקתי 90% מהקוד של הבוט.

ואז התחילו הבעיות:

1. הבוט החדש לא הצליח לפצל הודעות ארוכות כמו שצריך

2. הבוט החדש לא שלח הודעות Markdown אלא טקסט רגיל, ולכן דוגמאות הקוד הופיעו שבורות בערוץ.

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

1. את הקוד כתבתי ישירות על שרת ה Production ב vi.

2. את הטוקן של טלגרם כתבתי Hard Coded בתוך הסקריפט.

3. על Source Control או בדיקות לא היה מה לדבר.

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

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

1. להעביר את הקוד לגיט מסודר.

2. להוסיף בדיקות ל flows החשובים או לפחות לאלה שהיו שבורים.

3. לבנות מנגנון Deploy מסודר שישתמש ב CI (במקום להעתיק קבצים עם rsync).

4. להעביר החוצה סודות למשתני סביבה.

וזה בדיוק היה שלב 2 בפיתוח הבוט, שאולי חלקכם שמתם לב אליו בפירסומים והמחיקות שעשיתי במהלך אתמול. הקוד המעודכן של הבוט עלה לגיטהאב ואתם מוזמנים לקרוא אותו כאן:
https://github.com/ynonp/blog-to-telegram

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

תוספת שניה לקוד היא הקובץ .github/workflows שמעלה מכונה שמתקינה את כל התלויות ומריצה את התוכנית פעם ביום בשעה שמונה בבוקר. אני מקווה שהמעבר ל Github Action יגרום לסקריפט להיות יותר יציב ולא להישבר גם אם השרת עמוס או שודרג. זה ה Workflow:

# This workflow will install Python dependencies, run tests and lint with a single version of Python
# For more information see: https://help.github.com/actions/language-and-framework-guides/using-python-with-github-actions

name: publish-daily-post-to-telegram

on:
workflow_dispatch:
schedule:
- cron: "0 8 * * *"


permissions:
contents: read

jobs:
publish:

runs-on: ubuntu-latest

steps:
- uses: actions/checkout@v3
- name: Set up Python 3.10
uses: actions/setup-python@v3
with:
python-version: "3.10"
- name: Install dependencies
run: |
python -m pip install --upgrade pip
if [ -f requirements.txt ]; then pip install -r requirements.txt; fi
- name: run
env:
TELEGRAM_TOKEN: ${{ secrets.TELEGRAM_TOKEN }}
run: |
python blog_to_telegram/publish_daily_post.py


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

כמובן ששלב שני הוא לא סוף הדרך. נשאר עוד:

1. להוסיף Workflow שכל פעם שדוחפים קוד חדש יריץ אוטומטית את כל הבדיקות.

2. להוסיף בדיקות (כרגע יש רק בדיקות למנגנון פיצול ההודעות).

3. להוסיף קובץ Readme ותיעוד בתוך הקוד.

אבל זה יחכה לבאג הבא או ל Pull Request מכם. מה שיבוא קודם.
נ.ב. בינתיים ה action רץ רק ידנית ולא דרך ה cron שמוגדר שם… אם למישהו/י יש רעיון למה אשמח לכל עזרה
# קוד יותר חשוב
בין הסוגים של קוד שאנחנו כותבים:

1. קוד שגורם לדברים לעבוד מהר יותר

2. קוד שפותר באג ללקוח

3. קוד שחוסך עבודה למתכנתת שכתבה אותו

4. קוד שמוסיף פיצ'ר שכל הלקוחות רואים

5. קוד שמוסיף פיצ'ר שרק חלק מהלקוחות רואים

6. קוד שגורם לדברים להיראות יפה יותר

7. טקסט שמסביר מה קוד שכתבתי עושה

8. קוד שמשפר את החוויה כשיש מצב שגיאה

9. קוד שבודק קוד אחר

10. קוד שמשפר את החיים של מתכנתים אחרים בצוות

11. קוד שעוזר לי להבין רעיונות חדשים

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

איזון בקוד יוצר מערכות יציבות יותר ומתכנתים שמחים יותר.