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

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

סידרת SQL בסיסי - פוסט 1 - מידע מובנה

10/08/2024

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

המשך קריאה

חדש בפיירפוקס - תמיכה בפאפטיר

09/08/2024

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

npm add puppeteer

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

npx puppeteer browsers install firefox

(גם אם יש לכם כבר פיירפוקס על המחשב).

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

// file: demo.mjs

import puppeteer from "puppeteer";

const browser = await puppeteer.launch({
  browser: "firefox",
  headless: true,
});

const page = await browser.newPage();
page.on('console', msg => {
  console.log(`[console] ${msg.type()}: ${msg.text()}`);
});
await page.goto('https://www.duckduckgo.com');
await page.type('input[name=q]', 'firefox');
await page.click('button[type=submit]');
await page.waitForSelector('a[data-testid=result-title-a]');

const titles = await page.$$eval('a[data-testid=result-title-a]', elements => {
  return elements.map(element => element.textContent.trim());
});
console.log(titles);
await browser.close();

שימו לב לסיומת הקובץ mjs כדי ש node לא יתלונן על ה import-ים.

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

טיפ גיט: איפה היה הבראנץ לפני X זמן

08/08/2024

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

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

git log main@{10.minutes.ago}

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

git show main@{10.minutes.ago}

או בשביל להראות תוכן מלא של קובץ:

git show main@{2.days.ago}:main.py

איך לראות הרצאות מקצועיות באינטרנט (או: הפומו עובד נגדך)

07/08/2024

כל ההרצאות מ React Conf עלו לרשת לפני כמה זמן. אפשר למצוא אותן בקישור כאן: https://conf.react.dev/talks

הנה הבעיה:

  1. אי אפשר לשמוע הכל כי אין זמן.

  2. רוב המידע בהרצאות האלה לא יהיה שימושי מחר בבוקר.

  3. אין דרך טובה לדעת מראש איזה הרצאה תדבר אליי.

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

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

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

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

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

הטיסה התבטלה? לפחות נשחק עם פנדה

05/08/2024

הממשלה מפרסמת כל יום רשימה של טיסות שהמריאו, נחתו או התבטלו בקישור: https://data.gov.il/dataset/flydata

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

המשך קריאה

מה השתנה

04/08/2024

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

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

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

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

פשוט תנו לי מספר שורה

03/08/2024

הפונקציה ROW_NUMBER של SQL מוסיפה מספרי שורות לתוצאות שאילתות, כך לפחות לפי שמה. אבל מספיק לנסות להריץ את השאילתה הבאה כדי להבין שיש פה משהו יותר עמוק:

SELECT *, ROW_NUMBER() from employees;

תגובת בסיס הנתונים תהיה משהו כמו:

SQLite3Error: SQLITE_ERROR: sqlite3 result code 1: misuse of window function ROW_NUMBER()

מה זה? למה misuse? ומה זה אומר window function? איזה חלון יש פה?

קל מאוד ללכת ל ChatGPT כדי שיתקן את השאילתה. הוא יחזיר את זה:

SELECT *, ROW_NUMBER() OVER (ORDER BY id) AS row_num FROM employees;

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

ה Issue בגיטהאב שפתר לי את כל הבעיות

02/08/2024

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

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

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

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