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

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

צעד ראשון עם TypeScript

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

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

המשך קריאה

מימוש זכור אותי באתרים

18/01/2019

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

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

המשך קריאה

ה Crackme הראשון שלי

17/01/2019

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

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

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

קוד ה Assembly של התוכנית:

a.out[0x100000ed0] <+0>:   pushq  %rbp
a.out[0x100000ed1] <+1>:   movq   %rsp, %rbp
a.out[0x100000ed4] <+4>:   subq   $0x30, %rsp
a.out[0x100000ed8] <+8>:   leaq   0xad(%rip), %rax          ; "What's the password?\n"
a.out[0x100000edf] <+15>:  movl   $0x0, -0x4(%rbp)
a.out[0x100000ee6] <+22>:  movl   %edi, -0x8(%rbp)
a.out[0x100000ee9] <+25>:  movq   %rsi, -0x10(%rbp)
a.out[0x100000eed] <+29>:  movl   $0x0, -0x14(%rbp)
a.out[0x100000ef4] <+36>:  movq   %rax, %rdi
a.out[0x100000ef7] <+39>:  movb   $0x0, %al
a.out[0x100000ef9] <+41>:  callq  0x100000f5c               ; symbol stub for: printf
a.out[0x100000efe] <+46>:  leaq   0x9d(%rip), %rdi          ; "%d"
a.out[0x100000f05] <+53>:  leaq   -0x14(%rbp), %rsi
a.out[0x100000f09] <+57>:  movl   %eax, -0x1c(%rbp)
a.out[0x100000f0c] <+60>:  movb   $0x0, %al
a.out[0x100000f0e] <+62>:  callq  0x100000f62               ; symbol stub for: scanf
a.out[0x100000f13] <+67>:  movl   %eax, -0x18(%rbp)
a.out[0x100000f16] <+70>:  cmpl   $0x1, -0x18(%rbp)
a.out[0x100000f1a] <+74>:  jne    0x100000f52               ; <+130>
a.out[0x100000f20] <+80>:  movl   $0x7, %eax
a.out[0x100000f25] <+85>:  movl   -0x14(%rbp), %ecx
a.out[0x100000f28] <+88>:  movl   %eax, -0x20(%rbp)
a.out[0x100000f2b] <+91>:  movl   %ecx, %eax
a.out[0x100000f2d] <+93>:  cltd   
a.out[0x100000f2e] <+94>:  movl   -0x20(%rbp), %ecx
a.out[0x100000f31] <+97>:  idivl  %ecx
a.out[0x100000f33] <+99>:  cmpl   $0x0, %edx
a.out[0x100000f36] <+102>: jne    0x100000f4d               ; <+125>
a.out[0x100000f3c] <+108>: leaq   0x62(%rip), %rdi          ; "Correct!\n"
a.out[0x100000f43] <+115>: movb   $0x0, %al
a.out[0x100000f45] <+117>: callq  0x100000f5c               ; symbol stub for: printf
a.out[0x100000f4a] <+122>: movl   %eax, -0x24(%rbp)
a.out[0x100000f4d] <+125>: jmp    0x100000f52               ; <+130>
a.out[0x100000f52] <+130>: movl   -0x4(%rbp), %eax
a.out[0x100000f55] <+133>: addq   $0x30, %rsp
a.out[0x100000f59] <+137>: popq   %rbp
a.out[0x100000f5a] <+138>: retq   

וקובץ ה Executable בגירסת מק זמין להורדה מכאן: https://www.tocode.co.il/system/ex1

וכמובן אם בא לכם לשחק עם קראקמיס יותר מקצועיים יש אוסף נחמד בקישור כאן: https://crackmes.one/lasts

עכשיו אתם יודעים

16/01/2019

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

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

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

ועכשיו שאתם יודעים על הבעיה אולי כדאי לתקשר אותה טוב יותר ללקוח. ואולי כדאי למצוא את האומץ לתקן אותה.

דף קיצורים ל Python ו Selenium

15/01/2019

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

המשך קריאה

הרכיב הכי חשוב בדיבור מול קהל

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

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

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

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

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

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

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

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

כוונות טובות (מתורגם)

13/01/2019

אתם כנראה מכירים בן אדם או שניים שמאחרים. תמיד.

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

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

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

אז מה הסיבה לאיחורים?

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

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

האלטרנטיבה היא פשוטה להבנה אך קשה לביצוע- פשוט אומרים לא.

תגידו את זה בלי להתרגש ובלי להילחץ. ״אני מצטערת, נגמר הזמן״.

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

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

וגם הזמן אם תבחרי בכך.

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

והכי גרוע- אתם כל הזמן לחוצים.

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

צריך ללכת. זמננו תם.

...

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

אגב1 המקור כאן:

https://seths.blog/2019/01/good-intentions-how-to-be-on-time/

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

איך להתחיל פרויקט React ו Webpack מאפס על המכונה שלכם

12/01/2019

עם השידרוג ל Webpack 4 גם כל ההגדרות של הכלי הפכו הרבה יותר פשוטות והיום בהרבה פרויקטים כבר לא צריך להתחיל עם משהו גדול כמו create-react-app ואפשר יחסית בקלות לבנות לעצמכם קובץ הגדרות Webpack שיגדל יחד עם הפרויקט שלכם.

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

המשך קריאה

פייק ניוז

11/01/2019

מי מהיר יותר- אנגולר או React? ומה יותר בטוח- קוד פתוח או קוד סגור? ומה, לא שמעתם ש MySQL כבר מת, וכולם עברו ל Mongo?

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

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

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

רגעים

10/01/2019

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

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

הם לא.

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