ארכיון חודשי: יולי 2010

VPN מכל מיני צבעים

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

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

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

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

ruby.eql? rails # false

אני מתכנת בשפת רובי מסוף 2006, ולאחרונה גיליתי שהיכולות רובי שלי עלו לפחות 4 רמות מהפעם האחרונה שבעצם שמתי לב ליכולות רובי שלי.

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

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

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

150.hours

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

סליחה מתי להתחיל ?

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

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

  • כאמור התחביר – קל מידי להתבלבל בתחביר ולגרום למשהו לקום בזמן לא נכון
  • קשה עד כמעט בלתי אפשרי לדבג בעיות באמצעותו
  • הוא לא יודע לתת מענה לזמנים פחות מדקה (אם צריך שכל 3 שניות נקבל את השינוי מהבורסה למשל, הוא לא מתאים עבורינו)
  • לא ניתן לבצע התנייה שפעולה מסויימת תפעל פעם ב5 דקות אבל רק אם פעולה אחרת הסתיימה (יש דרכים לעשות את זה, אבל cron לא תומך בזה, זה הכל חצוני)
  • לפעמים הסביבה שלנו (כלומר משתני הסביבה, נתיבים וכו') שונים לגמרי ב cron מאשר בשורת הפקודה ואנחנו מגלים שדברים לא עובדים

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

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

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

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

למשל בכלי אחד אפשר לעשות את הפעולה הבאה:

require 'stalker'
handler { |job| Stalker.enqueue(job) }

every 1.hour, 'apis.poll'
every 1.day,  'reports.email', :at => '00:00'

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

זה לא נועד להחליף את cron, אלא להיכנס לתוקף מתי שcron אינו מתאים עבורינו. ואם אתם חוששים מביצועים, אז צריך להבין כי stalker עוזר לנו בכך שהוא מבצע פעולות בצורה מקבילה. הפתרון זמנים הזה ד"א נקרא clockwork.

וזה מה שיש לפינק פלויד להגיד בנושא.

Google Chromium – Rediscovering the web

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

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

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

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

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

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

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

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

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

הרבה מאוד מהסיסמאות ש"נפרצו" היו תאריכי לידה, שמות משתמשים, מקומות, מילים שקיימות במילון רגיל, משחקי אותיות של:

q1w2e3r4t5y6u7i8o9p0

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

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

גילוי סוג הקובץ ברובי

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

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

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

דוגמא לשימוש ב ruby-filemagic אפשר למצוא כאן.

מה כתובת ה IP איתה אני יוצא מהמחשב שלי החוצה ?

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

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

require 'socket'

def local_ip
  orig, Socket.do_not_reverse_lookup = Socket.do_not_reverse_lookup, true  # turn off reverse DNS resolution temporarily

  UDPSocket.open do |s|
    s.connect '64.233.187.99', 1
    s.addr.last
  end
ensure
  Socket.do_not_reverse_lookup = orig
end

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

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

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

על רובוטים ואנשים …

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

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

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

  1. מכשירים "חכמים" לעסקים
  2. מכשירים "רגילים" למשתמש הפרטי

להמשיך לקרוא

מעשה במשל …

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

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

החזיר השלישי לקח לו מראות בשביל שיסנוורו את הזאב, אך הזאב ניפץ את המראות באמצעות אלה ואכל את החזיר השלישי …

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

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

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

מוגש כחומר למחשבה.