ארכיון חודשי: דצמבר 2012

Brook Framework

Brook Framework הוא שם לא הכי ברור עבור framework לפיתוח אתרי ווב דינאמיים באמצעות פסקל מונחת עצמים, המשוחררת תחת LGPL 2.brook-framework_hello-world

הסביבה מזכירה מאוד את הרעיון של framework כדוגמת dancer של פרל, וPadrino ברובי.

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

  • נהול ניתובים – כל הפעולות מתבצעות לפי ניתובים
  • יכולת עבודה עם פריימוורקים נוספים, המספקים תוספות לעבודה עם ווב
  • תמיכה מובנת בJSON ופעולות שונות עליו
  • תמיכה בפעולות REST והפרדת העבודה לפי סוג הבקשה
  • אינטגרציה עבור Lazarus
  • תמיכה בכתיבת תוספים עבור הframework

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

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

יחסית קל ופשוט מאוד ליצור ניתובים דינאמיים, וסביבת CGI טבעית לשרתי ווב כדוגמת אפצ'י, אך לא רק.
במידה ומשתמשים בלזרוס, אז בחירה ב Simple CGI application, זה כל מה שנדרש עבור Hello World, אך במידה ולא, יש צורך ליצור שלושה קבצים.
קובץ אחד הוא בעצם ה"תוכנה" שלנו, שהיא הcgi. קובץ נוסף הוא ברוקר שלנו שיודע לדבר עם שרת HTTP, והקובץ השלישי זו בעצם התוכנית שלנו. כמובן שניתן להוסיף עוד קבצים/מחלקות לפי הצורך.

אפשר להשוות זאת למשל לסינטרה, בה קובץ הראשון הוא כדוגמת config.ru, הקובץ השני הוא Rack והשלישי זה המודול של סינטרה.

הרעיון הוא שכל מחלקה אחראית על נתיב מסויים (path info), ממש כמו ב Rails למשל, ואנו רושמים את הנתיב בחלק הinitialization של היחידה:

...
initialization
  TMyClassHandler.register('/info/:user');
end.

המחלקה בעצם רשמה את עצמה לנתיב של info – כלומר http://example.com/info/ik

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

אתם מוזמנים לבדוק ואף לתרום חזרה לפרוייקט.

עוף בתנור – משל

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

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

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

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

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

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

תרבות החינם

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

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

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

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

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

כך שהאם אתם באמת חושבים שאתם מקבלים משהו "בחינם" ?

where have all the music gone ?

I used to be a Pandora user, but due to issues with the Music labelling cartel, it was forced to close it's service outside of the U.S. Australia and New-Zealand.
So I moved to Last.fm that offered me to pay a fee and listen to music. Until I got the following Email: להמשיך לקרוא

שקר הטסט

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

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

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

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

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

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

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

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

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

שימוש שגוי בזמן המתכנת

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

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

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

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

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

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

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

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

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

טעינת קובץ csv ברובי

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

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

הטעינה הפשוטה ביותר היא כזו:

require 'csv'
CSV.foreach('path/to/file.csv') do |row|
  # use row here...
end

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

כמה זה 2 מגה מתוך 4 גיגה ?

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

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

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

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

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

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

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

לאחר חצי שעה שבה ראיתי כי המחשב פשוט ממשיך להציג לי את נורת הדיסק פועלת, ניסיתי להגיע לטרמינל (CTRL+ALT+F1), ובכן זה עבד, אבל כל פעולה לקחה מספר דקות, ומהרגע שכתבתי את המשתמש root בשביל לבצע login ועד הרגע בו login ביקש סיסמה, עברו כחמש דקות. ואז עוד כחמש דקות עד שהוא נכנס לטרמינל, והבנתי כי זו לא הדרך להמשיך.
אז השתמשתי בקסם של SysRq, וגם זה לקח מספר דקות להשפיע.

מה שמצחיק הוא, שדווקא ב C זה היה יכול להיות ברור הרבה יותר כי אגיע למצב הזה, אבל פסקל לא מתעסקת בתפל, אז היה קל מידי להגיע למצב הזהשעשיתי לעצמי DoS רציני 🙂

ב Brainfuck זה לא היה קורה (ללא פואטנה את האמת 🙂 )