uz
Feedback
ToCode

ToCode

Kanalga Telegram’da o‘tish

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

Ko'proq ko'rsatish
1 421
Obunachilar
+324 soatlar
+17 kunlar
+230 kunlar
Postlar arxiv
ToCode
1 420
סדרת SQL בסיסי - פוסט 4 - בסיס נתונים רלציוני ראינו בתרגיל שבעזרת טבלאות ואקסל אנחנו יכולים לגלות פרטים חדשים על המידע שלנו, אבל באותו זמן ראינו גם שזה לא תמיד פשוט. אנחנו גם יכולים לדמיין שאם היה עלינו לעבוד עם מספר טבלאות במקביל החיפוש באקסל היה הופך להרבה יותר מסובך. קצת תיאוריה בסיס נתונים רלציוני הוא שם גנרי לקבוצת תוכנות שתפקידן לנהל נתונים בצורה של טבלאות וקשר בין טבלאות. בסיסי הנתונים הרלציוניים המפורסמים ביותר הם: Oracle, PostgreSQL, MySQL, MS SQL Server אבל יש עוד המון. אנחנו נעבוד בקורס עם בסיס נתונים רלציוני קטן בשם SQLite, שהכח שלו הוא בדיוק זה שהוא מאוד קטן - הוא אינו דורש התקנות או שרתים חזקים ולכן נוכל לעבוד איתו אונליין. השפה בה בסיס נתונים רלציוני מדבר נקראת SQL. שפה זו פותחה במקור ב IBM בשנות ה 70 והפכה לתקן בשם Database Language SQL, כשהגירסה החדשה ביותר של התקן נכון לכתיבת קורס זה פורסמה ב 2023. כל בסיסי הנתונים מדברים SQL לפי התקן (לפחות משתדלים). עדיין קיימים הבדלים גדולים בין בסיסי הנתונים בעיקר במנגנוני הניהול שלהם, איך הם שומרים את הנתונים, איך משפרים את מהירות שליפת הנתונים, איך לגבות אותם, מה חוזק השרתים שהם צריכים כדי לעבוד טוב ועוד המון פרמטרים שבקורס זה לא יעניינו אותנו. אנחנו נתמקד ב SQL ובפרט באותו חלק של SQL שמוגדר בתקן ומשותף לכל בסיסי הנתונים. מסיבה זו כל הפקודות שנראה כאן על SQLite יעבדו כמו שהן על כל בסיס נתונים אחר. בסיס הנתונים הראשון שלנו הכנסו לאתר: https://sqlime.org ושם לחצו על הלינק "Demo database". לינק זה יוצר בסיס נתונים לדוגמה שמורכב משתי טבלאות. לאחר מכן לחצו על הכפתור tables כדי לראות את רשימת שתי טבלאות הדוגמה: 1. employees 2. expenses לחצו על המילה employees כדי לראות את מבנה הטבלה. התוצאה היא רשימת העמודות: 1. id 2. name 3. city 4. department 5. salary אבל איפה הנתונים עצמם? השאילתה הראשונה שלנו בתיבת השאילתה כתבו את הטקסט:
SELECT id, name, city FROM employees;
לא חייבים להקפיד על אותיות קטנות וגדולות, וגם אפשר לוותר על הנקודה פסיק בסוף. התוצאה נראית כך:
id name city
11 Diane London
12 Bob London
21 Emma London
22 Grace Berlin
23 Henry London
24 Irene Berlin
25 Frank Berlin
31 Cindy Berlin
32 Dave London
33 Alice Berlin
הפקודה שרשמנו נקראת שאילתת SQL. בעוד שבאקסל ראינו את כל הנתונים בטבלה אחת על המסך, בבסיס נתונים הנחת העבודה היא שיש המון נתונים ולכן אנחנו צריכים לבקש ספציפית את הנתונים שאנחנו רוצים כדי לראות מידע. בואו נפרק את השאילתה כדי לראות את החלקים שלה: 1. הפקודה SELECT אומרת לבסיס הנתונים שאנחנו רוצים לקבל מידע. בהמשך הקורס נלמד עוד פקודות שנוכל לשלוח לבסיס הנתונים. 2. אחרי הפקודה SELECT אני רושם את רשימת העמודות שאני רוצה לקבל. אני יודע את שמות העמודות כי ראיתי את מבנה הטבלה קודם בעזרת כפתור tables, וכן באופן כללי בסיס נתונים מצפה שתדעו איזה עמודות יש בכל טבלה ואיזה טבלאות יש. 3. הפקודה FROM מפרידה בין רשימת העמודות לשם הטבלה - במקרה שלנו employees. עכשיו אתם 1. שנו את רשימת העמודות בשאילתה שכתבנו יחד וודאו שאתם מצליחים לקבל עמודות נוספות. 2. בדקו איזה עמודות יש בטבלה השנייה בבסיס הנתונים והציגו את השורות שלה על המסך. 3. החליפו את רשימת העמודות בסימן הבודד * באחת השאילתות ובדקו מה קורה.

ToCode
1 420
סידרת SQL בסיסי - פוסט 3 - תרגול היכרות עם נתונים טיולים לפריז זה נחמד אבל בעולם האמיתי אנחנו צריכים לנהל נתונים הרבה יותר גדולים. מה זה נתונים גדולים? באתר data.gov.il נוכל למצוא כמה דוגמאות לקבצי נתונים יותר גדולים ולקבל הצצה למידע שמערכות מחשב מנהלות. רשימת טיסות הורידו את טבלת הטיסות מהקישור הזה: https://data.gov.il/dataset/flydata ניתן להוריד את המאגר כקובץ CSV או לצפות אונליין. אני ממליץ על צפייה אונליין בגלל שקידוד הקובץ ב CSV יכול לסבך. אם בכל זאת אתם רוצים להוריד את ה CSV תוכלו לפתוח אותו באקסל וכדאי לראות את העברית תצטרכו לשנות את הקידוד ל UTF-8. כאן יש הסבר איך לעשות את זה: https://support.microsoft.com/en-gb/office/opening-csv-utf-8-files-correctly-in-excel-8a935af5-3416-4edd-ba7e-3dfd2bc4a032 אחרי שהורדתם או צפיתם אונליין בקובץ נסו לענות על השאלות: 1. כמה טיסות המריאו אתמול בשעה המתוכננת? 2. מהן כל חברות התעופה שהמריאו או נחתו אתמול בישראל? 3. מהי המדינה אליה יצאו הכי הרבה טיסות אתמול? 4. כמה טיסות יצאו מטרמינל 3? כמה מטרמינל 1? 5. איזה חברות תעופה טסות מטרמינל 1? איזה מטרמינל 3? איזה משני הטרמינלים? סניפי בנקים הורידו את קובץ סניפי הבנקים מהקישור הזה: https://data.gov.il/dataset/branches הפעם כבר יש לנו את המידע כקובץ אקסל אז פתחו אותו באקסל ונסו לענות על השאלות: 1. לאיזה בנק יש הכי הרבה סניפים? 2. באיזה עיר יש הכי הרבה סניפי בנקים? 3. מהם כל הטלפונים של סניפי בנק דיסקונט בתל אביב? 4. באיזה ימים כל סניפי הבנקים פתוחים? 5. באיזה ערים יש סניף של יובנק?

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

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

ToCode
1 420
התו הכפול הראשון - תרגיל 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 420
הטיסה התבטלה? לפחות נשחק עם פנדה הממשלה מפרסמת כל יום רשימה של טיסות שהמריאו, נחתו או התבטלו בקישור: 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 420
מה השתנה "אי שפיות היא לעשות את אותו הדבר שוב ושוב, ולצפות לתוצאות שונות". או לפחות ככה אומרים בציטוט מפורסם. אבל המשמעות שלו קצת יותר עדינה. כשאנחנו עושים משהו שוב ושוב אנחנו משתנים. אנחנו נהיים טובים יותר באותו דבר. לפעמים (כמו בספורט) זה ממש שינוי גופני. אני מהמר שגם במוח אימון יוצר שינוי פיזי. "לעשות את אותו הדבר שוב ושוב" זה לא באמת מצב אפשרי. עצם העשייה של אותו הדבר משנה אותך. בתחילת הדרך פרילאנסרים רבים ישאלו "איך אני מוצא לקוחות", למרות שהם עושים הכל נכון. שנתיים אחר כך כשיש להם לקוחות יגיע פרילאנסר צעיר לשאול אותם "מה עושים? איך מוצאים לקוחות?", אבל שום תשובה לא תשמח אותו. הפרילאנסר הצעיר והוותיק עושים את אותם דברים אבל מגיעים לתוצאות שונות. זה בדיוק כמו שהספורטאי יגיד לחברו הלא מתאמן "אתה רק צריך לרוץ יותר מהר". לעשות את אותו הדבר שוב ושוב זה בדיוק ההגדרה של "אימון". ואימון מביא לשיפור בפרמטרים, שגם אם אנחנו לא רואים אותם מביאים בסוף לתוצאות טובות יותר.