ארכיון חודשי: ינואר 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();
  });
});

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

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