uk
Feedback
ToCode

ToCode

Відкрити в Telegram

טיפים קצרים למתכנתים מאת ינון פרק

Показати більше
1 419
Підписники
+124 години
-17 днів
-530 день
Архів дописів
ToCode
1 419
סידרת SQL בסיסי - פוסט 1 - מידע מובנה אחרי המתנה מורטת עצבים עליתי על טיסה ובזמן שאתם קוראים את זה אני מתחיל טיול בצפון צרפת. בשביל שלא תתגעגעו יותר מדי וכמו שעשיתי גם בחופשים קודמים אני משאיר אתכם עם סידרה של 21 פוסטים בפירסום אוטומטי שכתבתי מראש בנושא SQL בסיסי. סידרה זו תהיה בסיס לקורס וידאו שאני בונה על SQL ומתכנן להקליט כשאחזור. הטיול הגדול למחשבים וגם לאנשים הרבה יותר קל לעבוד עם נתונים כשהם מאורגנים, ואולי הדרך הכי פופולרית לארגן נתונים היא טבלה. נתחיל את הקורס בהשוואה בין נתונים מאורגנים לנתונים גולמיים ונראה למה כדאי לנו לארגן את הנתונים שלנו במבנים. בתור דוגמה נניח שאנחנו מתכננים טיול לפריז. אנחנו רוצים לבלות שם 5 ימים בתור משפחה עם ילדים ולהספיק לראות את כל האתרים. בשביל לתכנן את המסלול אני הולך ל Chat GPT ומבקש:
Plan me a 5 day vacation in Paris with my young Children. Describe the itinerary for each day, the attractions to visit and restaurants we can find in the area. Select a hotel for us.
זאת התשובה שקיבלתי:
Here's a 5-day itinerary for your family vacation in Paris, considering the interests and comfort of young children:

Day 1: Arrival & Introduction to Paris  
Hotel Check-In:  
Hotel Options:  
- Hôtel Le Bristol Paris: A luxury hotel with family-friendly amenities, including a kids' club and swimming pool.  
- Novotel Paris Les Halles: Centrally located with family rooms and easy access to major attractions.  

Afternoon:  
- Louvre Museum: Start with the iconic Louvre. The museum offers family tours and interactive activities. Focus on highlights like the Mona Lisa and the Egyptian collection.  

Dinner:  
- Le Café Marly: Located near the Louvre, it offers French cuisine with a view of the pyramid.

Day 2: Eiffel Tower & Seine River Cruise  
Morning:  
- Eiffel Tower: Visit the Eiffel Tower, with options to go up to the second floor or the summit. The surrounding Champ de Mars park is perfect for children to play.  

Lunch:  
- Café de l'Homme: Offers stunning views of the Eiffel Tower with a menu suitable for families.  

Afternoon:  
- Seine River Cruise: A relaxing boat tour along the Seine, providing a unique perspective of Parisian landmarks.  

Dinner:  
- Le Relais de l'Entrecôte: Famous for its steak frites and family-friendly atmosphere.

Day 3: Disneyland Paris  
All-Day:  
- Disneyland Paris: A magical day at Disneyland, perfect for children. Explore both Disneyland Park and Walt Disney Studios Park.  

Dinner:  
- Agrabah Café: Inside Disneyland, offering Mediterranean cuisine in a themed setting.

Day 4: Cultural Exploration & Gardens  
Morning:  
- Musée d'Orsay: Explore the museum's impressive collection of Impressionist art. The museum offers activities and workshops for children.  

Lunch:  
- Le Petit Cler: A charming café near the Musée d'Orsay with a variety of French dishes.  

Afternoon:  
- Jardin des Tuileries: Relax in this beautiful garden, which has a playground and carousel for children.  

Dinner:  
- Angelina: A historic tea house known for its hot chocolate and pastries.

Day 5: Montmartre & Departure  
Morning:  
- Montmartre: Visit the charming neighborhood of Montmartre, including the Sacré-Cœur Basilica. Take a funicular ride up the hill for a panoramic view.  

Lunch:  
- La Maison Rose: A picturesque café in Montmartre offering classic French dishes.  

Afternoon:  
- Le Mur des Je t'aime (I Love You Wall): A unique spot with "I love you" written in various languages, perfect for family photos.  

Departure:  
- Return to the hotel to collect your belongings and head to the airport.

This itinerary balances must-see attractions with activities that young children will enjoy, providing a mix of cultural experiences, outdoor fun, and relaxation.

ToCode
1 419
חדש בפיירפוקס - תמיכה בפאפטיר פיירפוקס 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.

ToCode
1 419
טיפ גיט: איפה היה הבראנץ לפני X זמן רוב הזמן אנחנו עובדים בגיט עם קומיטים ומספרי קומיטים, וזה קל ונוח אם אנחנו יודעים בדיוק על מה אנחנו מדברים. אבל יש מצבים שאנחנו יודעים "מתי" ולא "מה", ובשבילם הטיפ היום. כתיב השטרודל של גיט מאפשר לנו לדבר על קומיט במונחים של זמן. זה נראה ככה:
git log main@{10.minutes.ago}
ומראה את הלוג החל מהקומיט שהכי קרוב ללפני עשר דקות. וכן אפשר להשתמש בכתיב הזה גם בפקודות אחרות למשל כדי להראות את פרטי הקומיט והשינויים נפעיל:
git show main@{10.minutes.ago}
או בשביל להראות תוכן מלא של קובץ:
git show main@{2.days.ago}:main.py

ToCode
1 419
איך לראות הרצאות מקצועיות באינטרנט (או: הפומו עובד נגדך) כל ההרצאות מ React Conf עלו לרשת לפני כמה זמן. אפשר למצוא אותן בקישור כאן: https://conf.react.dev/talks הנה הבעיה: 1. אי אפשר לשמוע הכל כי אין זמן. 2. רוב המידע בהרצאות האלה לא יהיה שימושי מחר בבוקר. 3. אין דרך טובה לדעת מראש איזה הרצאה תדבר אליי. מה עושים? אפשר לבחור הרצאות לפי הדובר וללכת לשמוע שוב את קנט דודס, דן אברמוב וריאן פלורנס. נקציב לזה יום ונוכל לסמן וי. אפשר למצוא AI שיקשיב ויתקצר בשבילנו את כל ההרצאות. נוכל לקבל את עיקרי הדברים ולסמן וי. אפשר להתחיל להסתכל על כל הרצאה, לדלג (זה וידאו) לקטעים שנראים מעניינים ולנסות להקשיב רק לפואנטה. שלוש דקות מהרצאה כפול 24 הרצאות אומר שתוך קצת יותר משעה אני מבין בגדול מה יש בכל אחת ויכול לסמן וי. אבל לדעתי הדרך הכי טובה היא לפזר את ההאזנה על פני שבועות וחודשים. לשמור את הלינק וכל פעם שיש עשר דקות פנויות (כלים, בדרך למקום, כמה דקות לפני השינה) שומעים עוד קטע. בסוף אולי נסיים את הכל, אולי נסיים חלק ואולי עד שנגיע להקשיב זה כבר לא יהיה רלוונטי. בצורה כזאת נתרגל לשמוע דברים לאט, נתרגל להקשיב, נתרגל לתת למידע זמן ולא לחפש רק "למה זה דומה". לא מדובר בלסמן וי, אלא בללמוד ולקבל רעיונות חדשים. וזה לוקח זמן.

ToCode
1 419
התו הכפול הראשון - תרגיל Shell ראיתי את התרגיל הזה במקום אחר עם שפת תכנות אמיתית וחשבתי שיהיה נחמד לנסות אותו ב Shell. האתגר שלנו היום הוא למצוא את התו הראשון שמופיע יותר מפעם אחת במחרוזת. פיתרון יש מיליון דרכים לפתור אתגרים כאלה, אני בחרתי לנסות עם כמה שפחות דברים מתוחכמים ולכן אני נשאר עם sed, cat, sort, uniq, tr, grep ו cut. אני מתחיל עם הדפסת המחרוזת, למשל:
echo helloo
יש פה שני תווים כפולים, גם l וגם o, ה l הוא הראשון שמופיע פעמיים. בשביל שיהיה נוח לעבוד על המידע נפרק אותו קודם כל לשורות:
$ echo helloo | sed 's/./&\n/g'
h
e
l
l
o
o
נוסיף לפני כל שורה את המספר שלה, וכך נוכל לזכור מי הופיע מתי:
$ echo helloo | sed 's/./&\n/g' | cat -n | tr -d ' '
1       h
2       e
3       l
4       l
5       o
6       o
7
עכשיו נסדר אותם לפי התו ונספור כמה פעמים כל תו מופיע:
$ echo helloo | sed 's/./&\n/g' | cat -n | tr -d ' ' | sort -k 2| uniq -c -f 1
   1 7
   1 2  e
   1 1  h
   2 3  l
   2 5  o
נציג רק את השורות שמכילות תו שהופיע יותר מפעם אחת:
$ echo helloo | sed 's/./&\n/g' | cat -n | tr -d ' ' | sort -k 2| uniq -c -f 1 | egrep -v '^\s+1'
   2 3  l
   2 5  o
נסדר אותן לפי סדר ההופעה המקורי שלהן:
$ echo helloo | sed 's/./&\n/g' | cat -n | tr -d ' ' | sort -k 2| uniq -c -f 1| egrep -v '^\s+1'| sort -k 2
   2 3  l
   2 5  o
ולבסוף נציג את רק את השורה הראשונה, וגם בה רק את התו עצמו:
$ echo helloo | sed 's/./&\n/g' | cat -n | tr -d ' ' | sort -k 2| uniq -c -f 1| egrep -v '^\s+1'| sort -k 2 | head -1 | tr -d ' ' | cut -f 2
יש לכם רעיונות נוספים (ובלי טבלת Hash כדי שיהיה מעניין)? אל תתביישו לשתף בתגובות.

ToCode
1 419
הטיסה התבטלה? לפחות נשחק עם פנדה הממשלה מפרסמת כל יום רשימה של טיסות שהמריאו, נחתו או התבטלו בקישור: https://data.gov.il/dataset/flydata עכשיו אוגוסט ואני יודע שכולנו במתח לגלות איזה טיסה יוצאת ואיזה חברה נשארת בקפריסין, ואיזו דרך טובה יותר לגלות את זה מאשר פייתון? בואו נראה את הטבלה ואז נחקור אותה עם קצת קוד פנדס. מבנה המידע הורדתי את הקובץ וקודם כל הדפסתי את השורות הראשונות ואת שמות העמודות כדי להבין מה עושים עם זה:
import pandas as pd

filename = "/Users/ynonp/Downloads/data/flights.csv"

if __name__ == "__main__":
    df = pd.read_csv(filename)
    print(df.columns)
    print(df.head())
והתוצאה:
Index(['CHOPER', 'CHFLTN', 'CHOPERD', 'CHSTOL', 'CHPTOL', 'CHAORD', 'CHLOC1',
       'CHLOC1D', 'CHLOC1TH', 'CHLOC1T', 'CHLOC1CH', 'CHLOCCT', 'CHTERM',
       'CHCINT', 'CHCKZN', 'CHRMINE', 'CHRMINH'],
      dtype='object')
  CHOPER CHFLTN           CHOPERD  ... CHCKZN   CHRMINE CHRMINH
0     W6   2325           WIZZAIR  ...    NaN  CANCELED  מבוטלת
1     A3    926  AEGEAN  AIRLINES  ...    NaN  CANCELED  מבוטלת
2     W6   2097           WIZZAIR  ...    NaN  CANCELED  מבוטלת
3     W4   3258    WIZZ AIR MALTA  ...      A  CANCELED  מבוטלת
4     XR    613   CORENDON EUROPE  ...      A  DEPARTED  המריאה
אנחנו רואים את העמודות החשובות - CHOPERD הוא שם חברת התעופה ו CHRMINH מראה מה קרה עם הטיסה. בשביל לגלות כמה טיסות בוטלו מתוך כמות הטיסות נוכל להדפיס:
    # Total flights
    print(len(df))

    # Cancelled flights
    print(len(df[df["CHRMINH"] == "מבוטלת"]))
בשביל לגלות את שמות כל חברות התעופה שביטלו איזושהי טיסה נכתוב:
    # names of all airlines with cancelled flights
    print(df[df["CHRMINH"] == "מבוטלת"]["CHOPERD"].unique())
והכי מעניין, בשביל לגלות איזה חברות תעופה ביטלו את כל הטיסות שלהן נקבץ את הנתונים לפי חברת תעופה ואז נדפיס רק את אלה שכל הטיסות שלהן בוטלו:
    # names of all airlines that cancelled all their flights
    for _id, group in df.groupby('CHOPERD'):
        if (group["CHRMINH"] == "מבוטלת").all():
            print(group["CHOPERD"].iloc[0])

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

ToCode
1 419
פשוט תנו לי מספר שורה הפונקציה 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 יודע לענות על כל השאלות האלה וממילא המידע גם זמין בחינם ברשת. החוכמה היא לשים לב ולחפש.

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

ToCode
1 419
public/assets/turbo.min-cd3ce4205eaa3eb1f80c30fedaf47bccb15a7668eb53b1cb1a5e0dda16009d4d.js
בקובץ app/views/layout.html.erb השורה הבאה טוענת קובץ js שנבנה דרך מנגנון זה:
<%= javascript_include_tag "application", "data-turbo-track": "reload", type: "module" %>