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

משל המערה

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

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

אפלטון

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

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

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

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

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

מומלץ להקשיב לשיר הבא כאשר קוראים את הסיפור.

הפוסט מוגש כחומר למחשבה…

הרחבת מחלקות בזמן ריצה

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

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

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

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

אחד היתרונות בהרחבה שכזו, היא היכולת להרחיב גם מחלקות ש"נאטמו" (sealed class), כך שבכל זאת הם יוכלו לקבל הרחבה כלשהי.

אז כיצד התחביר של class helpers נראה ? להמשיך לקרוא

האם המפתחות שלכם יעילים ?

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

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

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

Firebird SQL מספק לנו יכולת של הבנת יעילות של מפתח על ידי יצירת סטטיסטיקה על כל מפתח שנוצר במסד הנתונים (הוא לא מסד הנתונים היחיד שעושה את זה, גם PostgreSQL ו MS-SQL עושים את זה עד כמה שאני יודע). כל מפתח מקבל שם ייחודי שאפשר למצוא אותו בטבלה בשם RDB$INDICES.

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

SET STATISTICS INDEX index_name;

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

ואם רוצים לעשות את זה עבור כל המפתחות בפעם אחת, אפשר פשוט ליצור בלוק ריצה כזה (או כ stored procedure): להמשיך לקרוא

ניהול חריגות גמיש

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

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

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

לשם השוואה, בשפת Java אנחנו עושים חריגות בצורה הבאה: להמשיך לקרוא

Strawberry Perl תומך ב DBD-Interbase

מריוס פופה פרסם סרטון ווידאו (מאוד מצחיק לדעתי :)) וגם הסבר בFirebirdnews כיצד אפשר להשתמש בגרסאות הפיתוח האחרונות של DBD-Interbase בייחד עם Strawberry Perl, כך אפשר להנות גם מעבודה עם Firebird גם בWindows כאשר משתמשים בגרסה הזו של פרל ל windows.

עזרה בהקמת חברת הזנק חדשה

טוף זהו הגיעו מים עד נפש, ואני חושב שהגיע הזמן לעשות משהו בנידון.

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

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

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

ppRuby

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

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

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

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

בעיית Stack Overflow ב Asterisk עם SIP

שוחרר היום Advisory של חברת Digium אודות Stack Overflow במימוש של SIP במרכזיית Asterisk.

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

במקרה הזה, הבעיה היא במימוש ה URI אשר יוצרים עבור SIP. כך  ניתן באמצעות שימוש ב CallerID לעקוף את גבול ולהריץ קוד "זדוני".

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

  • 1.4.38.1
  • 1.4.39.1
  • 1.6.1.21
  • 1.6.2.15.1
  • 1.6.2.16.1
  • 1.8.1.2
  • 1.8.2.1

אם לא ניתן לשדרג, אז הנה טריק בנושא:

exten => s,1,Set(CALLERID(num)=${CALLERID(num):0:40})
exten => s,n,Set(CALLERID(name)=${CALLERID(name):0:40})

ובכל זאת מומלץ לשדרג כאשר ניתן את המרכזייה.

להריח את הפרחים

יסמין הוא פרוייקט קוד פתוח המספק תמיכה בBDD עבור שפת Javascript.

הרעיון הוא כמו עם Cucumber לספק כלי בדיקה באמצעות BDD. עם תחביר המזכיר יותר את rspec.

אז איך נראה תחביר של בדיקות שכזה ב Javascript אתם בטח שואלים, או סתם סקרנים לדעת:

describe("Jasmine", function() {
  it("makes testing JavaScript awesome!", function() {
    expect(yourCode).toBeLotsBetter();
  });
});

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

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

סליחה באיזה חודש עברי אנחנו ?

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

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

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

THebMonths = (
  hmTishri, hmCheshvan, hmKislev, hmTevet, hmShvat, hmAdar,
  hmNisan,  hmIyyar,    hmSivan,  hmTamuz, hmAv,    hmElul,
  hmAdarI,  hmAdarII
);

ומאוד פשוט עכשיו להבין על איזה חודש מדובר, היות וכל מה שצריך לעשות זה:

THebMonths(h.HebMonth)

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

בעקבות זה, דיברתי עם קובי והספרייה תעבור כמה שינויים קרובים שספריית וזה הוספת Enum במקום קוד "סטטי" (או יותר נכון קבוע) של הערכים, ואני מתכוון לעזור לד"ר בעבודה הזו בשפת המקור -> C (ראו הוזהרתם).

לכתוב תוכנית טבעית בAndroid ללא ג'אווה ולהישאר בחיים

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

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

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

אז יש כיום (החל מ2.3 עד כמה שאני מבין) תמיכה באנדרואיד לפתח ב2 צורות כאשר מדובר בקוד חיצוני:

  1. שימוש ב JNI ולטעון ספריות משותפות (קבצי so).
  2. למממש את ה API של אנדרואיד בשפה שלכם, ולרוץ בצורה כמעט לגמרי נקייה מג'אווה.

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

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

להכריח תהליך לרוץ על מעבד בודד

אני סובל הרבה מבעייה של cisco vpn אשר לפעמים תוקע לי את המערכת, ופורסם פוסט בנושא של נתנאל שיין.

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

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

  1. מסיכה של מעבדים (קראו על כך בתעוד להסבר נרחב יותר)
  2. אינדקסים של מעבדים

כך שאם אני מעוניין נגיד להריץ פקודה עם מעבד אחד בלבד:

$ taskset -c 0 ls

וכך אני מריץ את התוכנה ls על מעבד מספר 0 בלבד.

Precision Language Suite

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

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

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

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

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

תגיד משהו השתנה מאז ?

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

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

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