ארכיון חודשי: נובמבר 2011

כמה עולה תכנה חופשית – תשובה לדורון

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

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

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

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

אם מדובר ב3,000 שרתים שכל שרת צריך משהו אחר כמות האנרגייה הנדרשת כאן גבוהה מאוד, ויכול להיות ש150,000 ש"ח לעסקה שנתית למעשה במחיר נמוך מאוד. ויכול להיות שיש לך שבלונה שאפשר ב4 דקות לסיים הכל ואז 400,000 ש"ח הוא מחיר מאוד גבוה, אבל כל עוד אי אפשר לדעת מה העבודה דורשת, הכיף העבודה וכו' … קשה מאוד לדעת האם מחיר מסויים או גבוה או נמוך. בייחוד בגופים כדוגמת חברות ביטוח.

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

"The greatest challenge to any thinker is stating the problem in a way that will allow a solution" — Bertrand Russell

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

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

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

שליחת הודעות עם d-bus

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

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

במהלך החיפוש, מצאתי ספרייה בשם libnotify אשר נכתבה במקור עבור Gnome אבל אינה חייבת את Gnome בשביל לעבוד, רק GTK ולא עבור מימושים גרפיים. אחרי שקראתי את הקוד של הספרייה (הוא די פשוט), התייאשתי מלנסות לממש את מערכת ההודעות בעצמי, והחלטתי במקום זאת לבצע binding ל libnotify ועכשיו אפשר למצא את libnotify-fpc למי שרוצה.

ד"א, לקח לי פחות זמן לממש את הbinding מאשר להבין למה המימוש שלי פשוט לא עובד.

ממשק גרפי לציטוטים חלק 2

display quotes

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

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

עוד שינויים גרפיים משמעותיים:הוספתי יכולת להעתיק את הציטוט ישירות ללוח הגזירים (Clipboard).  כמו כן, החלפתי את פקדי הכפתורים לBitBtn ומציג עכשיו איקונים (רק אם הסביבה מאפשרת להציג. כלומר אם בחרתם שלא יוצגו תמונות של כפתורים בסביבה הגרפית – KDE, Gnome וכו', אז הם לא יוצגו). האיקונים נלקחו באכזריות מאוסף Oxygen.

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

תכנונים לגרסה הבאה:

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

עוד רעיונות יתקבלו בברכה

ממשק גרפי לציטוטים

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

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

זהירות מחנויות ישראליות ברשת

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

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

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

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

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

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

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

עבודה עם /dev/random ו /dev/urandom

ישנם בעולם ה POSIX – בעיקר במערכות יוניקס 2 devices אשר מאפשרים לנו לקבל מספר כלשהו שיהיה בסיס לחישוב רנדומאלי (seed). ההבדל העיקרי בניהם הוא ש random הוא blocking, כלומר עד אשר לא אקבל תשובה אשאר "תקוע". בעוד ש urandom חוזר מייד, ולפעמים יביא מידע פחות איכותי (כלומר פחות רנדומאלי) לשימוש.

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

כתיבת watchdog פשוט עם רובי

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

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

עצור: עסקים קטנים בישראל

The first mistake in public business is the going into it
Ben Franklin

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

  • אני מחוייב לשלם ביטוח לאומי, אבל אני לא מבוטח בו
  • אני מחוייב לשלם הרבה מיסים על דברים, אבל המדינה לא מתחייבת לי שכל רכש שלי יהיה מוכר כהוצאה. יותר מזה, הוצאות כמו רכב מוכרות רק חלקית בלבד.
  • אין לי משרד, והרבה פגישות נעשות בבתי קפה – הוצאה שלא מוכרת על ידי הרשויות
  • אם מחר למרות חוזה חתום, שבו מתחייב לקוח לשלם לי על שוטף, והוא מחליט על דעת עצמו לשלם שוטף+90 (במקרה הטוב, במקרה הרע מחליט לא לשלם) אין חוק שמגן עלי, ולרוב בתי המשפט יכריחו את החייב לשלם (במקרה הטוב) רק חצי מהסכום (קרה ליותר מבעל עסק אחד שאני מכיר)
  • אם אני מרוויח 20,000 ש"ח בחודש (או פחות), לא אקבל שום הנחות במס.
  • אם ארוויח 200,000 כל חודש, אקבל הרבה הנחות במס. למעשה אוכל לנהל משא ומתן על גובה המס שאשלם
  • עסק יכול לשים ווטו ולהגיד כי רק אם אתן לו חשבונית מס הוא ישלם לי כסף. אין שום גורם שעוזר לי מול זה. זה אומר אבל שאני משלם מע"מ, למרות שלא נכנס לי אפילו אגורה אחת מהעסקה בפועל.

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

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

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

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

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

מוקדש כתמרור אזהרה

המחיר = חוויה ?

לפני מספר שבועות, הציעו לי לרכוש אפרטשייב "מדהים". לפני ששאלתי את המחיר, רציתי להריח אותו. כמעט הקאתי במקום, אז מייד אמרו לי "אבל זה אפטרשייב איכותי, הוא עולה 600 ש"ח". בחרתי בסוף באפטרשייב שעלה לי 80 ש"ח, אבל הריח לדעתי ממש טוב. מה שמדהים זה, שאנשים אומרים שאפשר לדעת את המחיר של האפטרשייב לפי הריח. אז זהו שאי אפשר. אני יכול למצוא אפטרשייב במחיר של 1,000 יורו, אבל ריח ביוב טוב יותר, ואני יכול למצוא ב50 ש"ח משהו שמריח טוב.

העניין הוא שהרבה מאוד אנשים מתרגמים את המחיר לאיכות. כלומר אם הם שילמו הרבה אז בהכרח הם קיבלו משהו איכותי יותר. בעולם ה"ריחות" זה השתרש ממש עמוק, ו"תודות" לאפל גם בעולם החפיצים. אני רואה חבר אשר מבין דבר ושניים בטכנולוגיה נופל בדיוק לבור הזה. הוא קיבל עסקה "משתלמת" מחברת סלולר. הוא ואשתו ידברו בניהם ב0 ש"ח בחודש, אבל רק אם הוא יקח אייפון. לפני שהיה לו איפון הוא שיחק איתו מספיק פעמים ותמיד אמר שהוא גרוע. אבל בגלל שעכשיו הוא שילם מספר רב של זוזים על מכשיר בינוני מטה, הוא פתאום מגלה "חוייה". הוא יושב מסביר לי כמה איפון יותר טוב. איך הוא מסביר ? "תראה כמה מהר התפריט זז". חצי שיחה הוא רק מגולל ימינה ושמאלה את האפליקציות שיש לו בשביל "להוכיח". הוא גם מראה לי תכנת פרקטלים שמצא ב"חינם אין כסף רק 0.99 אגורות" הסכום הוא כי אי אפשר לא למכור בחנויות האפל. אבל הוא מסביר שהמסך כל כך איכותי עד שאין צורך ב anti-aliasing עבור הגרפיקה. הדבר היחיד שאני מסכים איתו שהמסך של האיפון באמת איכותי, אבל זהו כאן אני מפסיק להסכים איתו… אח"כ הוא מסביר כי אפל שומרים טוב יותר על המשתמשים וכו' … (והבן אדם במקור משתמש לינוקס. לא סתם אובונטו, אלא ארצ', סלאק וכו'… ולפני זה היה איש סולאריס ואח"כ BSD הרבה שנים).

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

עד כמה המחיר משפיע עליכם לראות רק טוב על מוצר ?

לכתוב מחדש

Leaning Tower of Pisaהנה שאלה מאוד מטרידה: "למה אף פעם אין זמן לעשות דברים כמו שצריך, אבל תמיד יש זמן לעשות דברים מחדש ?"

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

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

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

אז מדוע אף פעם אין זמן לעשות דברים כמו שצריך, אבל יש זמן לעשות אותם מחדש ?

עוד שרתים לאוויר

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

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

אז הבעיה היא שאנשים כבר לא חושבים ומשקיעים בלכתוב מערכות טובות ויעילות (אולי למעט ארתיום ?), אלא אומרים "מה הבעיה, תמיד אפשר להוסיף עוד מכונה". ואז הופכים את המילה high availability לעוד מילת שיווק ריקה מתוכן.

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

ואז אנחנו מגיעים לתשתיות. שמעתי מהרבה מנהלי תשתיות בארץ את התשובה "אז מה אם מהווינדוז שלי אני יכול להפיק רק 80 בקשות בעוד שבלינוקס תוכל לספק לי 100 בקשות על אותה מערכת ? אז אני אוסיף עוד שרת". תארו לכם שבשביל 5 שרתי לינוקס אתם תהיו צריכים בגישה הזו 10 שרתי ווינדוז, ותעשו חישוב האם זה כלכלי ? או אם יש לכם 20 שרתי לינוקס, זה כבר 40 שרתי ווינדוז… תכפילו ב2 בשביל התוצאה ותראו האם המערכות שלכם מתאימות למה שאתם צריכים. כמובן שסיפקתי את ווינדוז כדוגמה חייה, אבל זה לא כל הסיפור, אלא רק ניסיון להסביר את הבעיה בצורה פשוטה.

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

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

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

ActiveRecord, ODBC and SQL Server

I was required to use MS SQL Server with my Ruby while my application is running on Linux.
I do not like such things, because like always, stuff goes wrong, and when the close golden gates of Microsoft closes on you, well – you are theirs, and they decide what will work, and who can play …

In order to make things work on Linux, I had first to install unixODBC and FreeTDS .After installing them I was required to configure them, and that's a bit of a pain …

The people who are responsible for your database must create a user name and password that belongs to the database and not to Windows itself. Make them test the connection by creating their own ODBC connection and make sure it worked for them. It's the only test I found to actually make them understand that they did things wrong, instead of blaming Linux etc…

When their work is done, make sure you know the SQL Server version (2000,2005 etc..) for making FreeTDS works properly. Then configure it like so: להמשיך לקרוא

ניתוח שורת פקודה ברובי

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

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

#!/usr/bin/env ruby
require 'optparse'

VERSION = '99.1b'

# default values for options ...
options = { :path => '', :number => 0, :uri => nil}

parse = OptionParser.new do|opt|
  opt.banner = 'Usage: my_app.rb  [option] [option]'
  opt.on('-v', '--version', 'Display the program version') do
    puts "my_app.rb v#{VERSION}"
  end
  opt.on('-p PATH', '--path=PATH', 'What path to use ?') do |path|
    option[:path] = path
  end
  opt.on('-n=NUM', '--number NUM', Fixnum, 'Use numbers only') do |num|
    option[:number] = num
  end
  opt.on('--uri URI', 'Mandatory field') do |uri|
    option[:uri] = uri
  end
  opt.on('-h', '--help', 'Display this screen') do
    puts opt
    exit
  end
end

begin
 parse.parse!
 raise OptionParser::MissingArgument if options[:uri].nil? # mandatory fields
rescue => e
  $stderr.puts "You did not supply proper values: #{e.message}"
end

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