שלום אורח התחבר

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

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

הזינו את כתובת המייל וקבלו את הפוסט היומי בכל בוקר אליכם לתיבה:

מחר אעביר כאן וובינר על Design Patterns בפייתון ואחת התבניות שאדבר עליה היא Singleton. בוובינר אני רוצה יותר להתמקד במשמעות ובשימושיות של כל תבנית ולכן כאן בפוסט אנסה לחקור יותר לעומק את האפשרויות השונות לבנייתה.

המשך קריאה...

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

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

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

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

מתכנתים רבים מגיעים ללמוד גיט ומחפשים איך לבצע בגיט את ה-3 פקודות שהם מכירים ממערכת ניהול הגירסאות הקודמת שלהם או דרך Tutorials של "למד את עצמך גיט בעשרים דקות". זה עובד אבל רק חלקית. כשאתם לומדים תוך כדי עבודה ומדלגים על הבסיס התיאורטי וה Best Practices יהיו דברים חשובים שתחמיצו ויהיו דברים שוליים שתקחו יותר מדי ללב.

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

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

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

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

https://www.tocode.co.il/bundles/git

נתראה שם, ינון

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

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

המשך קריאה...

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

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

קובץ בדיקות אוטומטיות ב Python מכיל מחלקה היורשת מ unittest.TestCase. הנה דוגמא לקובץ עם הבדיקה הכי פשוטה שהצלחתי לחשוב עליה:

import unittest

class MyTestCase(unittest.TestCase):
    def test_something(self):
        self.assertEqual(True, True)


if __name__ == '__main__':
    unittest.main()

הרצה של הקובץ מציגה את הפלט:

.
----------------------------------------------------------------------
Ran 1 test in 0.000s

OK

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

import unittest

class MyTestCase(unittest.TestCase):
    def test_something(self):
        self.assertEqual(True, False)


if __name__ == '__main__':
    unittest.main()

שימו לב ששיניתי את המילה True ל False בשורת ה assertEqual וכעת הפלט נראה כך:

F
======================================================================
FAIL: test_something (__main__.MyTestCase)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "simpletest.py", line 5, in test_something
    self.assertEqual(True, False)
AssertionError: True != False

----------------------------------------------------------------------
Ran 1 test in 0.000s

FAILED (failures=1)

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

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

הקוד הבא למשל ייכנס לדף רשימת הפוסטים בבלוג וידפיס על המסך את כותרת הדף:

from selenium import webdriver

driver = webdriver.Firefox()
driver.get('https://www.tocode.co.il/blog')
print(driver.title)

driver.close()

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

import unittest
from selenium import webdriver

class MyTestCase(unittest.TestCase):
    def setUp(self):
        self.driver = webdriver.Firefox()

    def tearDown(self):
        self.driver.close()

    def test_something(self):
        self.driver.get('https://www.tocode.co.il/')
        course_links = self.driver.find_elements_by_css_selector('.nm-block a[href^="/bundles/"]')

        self.assertEqual(4, len(course_links))


if __name__ == '__main__':
    unittest.main()

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

https://zoom.us/meeting/register/3abdb0d0b6f403b7c5b9141539e44ee6

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

בפוסט זה אתאר בקצרה את פלאסק דרך כתיבת מספר תוכניות ונראה מה צריך כדי לבנות Backend API איתו.

המשך קריאה...

הצמיחה של פייתון בשנים האחרונות היא לא פחות ממדהימה. החברים ב Stack Overflow טוענים שב 2018 פייתון היא השפה ששאלות לגביה מקבלות יותר צפיות מכל שפה אחרת. גם כאן בארץ אני רואה יותר ויותר לקוחות שלי בתעשיה בוחרים ב Python לפרויקטים או ממירים קוד קיים אליה.

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

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

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

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

סילבוס מלא, פרטים נוספים וכפתור הצטרפות נמצאים כולם בקישור:

https://www.tocode.co.il/bundles/advanced-python3

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

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

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

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

text = 'I am :the:      walrus'
text.split(': ')
['I am :the', '     walrus']

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

import re
text = 'I am :the:      walrus'
re.split('(: )', text)
 ['I am :the', ': ', '     walrus']

וכן ראיתם נכון - בגלל ששמתי את הנקודותיים והווח בתוך סוגריים פייתון שמר אותם כאיבר נוסף ברשימת התוצאה. בלי הסוגריים התוצאה תהיה זהה ל str#split.

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

import re
text = 'I am :the:      walrus'
re.split('(?<=:) ', text)

# or if you don't need the spaces before the walrus
re.split('(?<=:) +', text)
['I am :the:', 'walrus']

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

  1. הצצה קדימה - Positive Lookahead מסומן באמצעות (?=foo). חיפוש המקום בקלט שאחריו מופיעה המילה foo.

  2. הצצה אחורה - Positive Lookbehind מסומן באמצעות (?<=foo). חיפוש המקום בקלט שלפניו מופיעה המילה foo.

  3. הצצה קדימה שלילית -Negative Lookahead מסומן באמצעות (?!foo). חיפוש מקום בקלט שאחריו לא מופיעה המילה foo.

  4. הצצה אחורה שלילית - Negative Lookbehind מסומן באמצעות (?<!foo) חיפוש המקום בקלט שלפניו לא מופיעה המילה foo.

לדוגמאות נוספות על Lookahead ו Lookbehind שווה להעיף מבט בקישור כאן:

href='http://www.rexegg.com/regex-lookaround

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

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

המשך קריאה...

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

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

המשך קריאה...