קטגוריה: C

hell אל dll (בGo) – חלק ראשון

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

יצרתי באמצעות שפת C++‎ (וקצת C) איזשהו DLL המבצע קיצורי קוד עבורי שבכל דרך אחרת הייתי צריך לממש הרבה COM בשפת Go – כאב ראש עם הרבה boilerplate code של Vtbl ‏(Virtual Function Table) ומימוש Interfaceים שלמים, כולל ירושות שלהם מinterface אחרים.

אני מאוד אוהב את שפת Go אבל יש לי גם ביקורת קשה כלפיה – הביקורת העיקרית שלי (לצורך הפוסט כי יש לי יותר מביקורת מאחת) – הוא שמצד אחד ניסו לספק לי קוד "גבוה" שלא מעניין אותו מערכת ההפעלה, כאשר מהצד השני, רואים שהוא נבנה עבור Unix/Linux וכאשר אנו נמצאים במערכת הפעלה שונה כדוגמת Windows מערכת ההפעלה מרגישה שם כ second class citizen.

בעיה ראשונה – יש לי פונקציה בdll המוגדרת בגדול מאוד בחתימה כזו:

void GetBuffer(type_t * in, const char **buffer, const unsigned int * length);

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

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

הבעיה היא שבזמן טעינת DLL בזמן ריצה בצורה דינאמית עם LazyDLL (למשל) צריך להעביר פרמטרים וזה דורש מאיתנו להשתמש ב unsafe.Pointer בשילוב של טיפוס בשם uintptr.

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

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

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

...
outBuffer := make([]byte, 2 << 24)
var length uint
...
getBufferFunc.Call(
  uintptr(unsafe.Pointer(&MyType)),
  uintptr(unsafe.Pointer(&outBuffer)),
  uintptr(unsafe.Pointer(&length)),
)
...
saveToFile(outBuffer[:length])
...

בעצם "נזכרתי" כי מערך בC יכול להיות בעצם מצביע אשר אם אני מקבל את האורך שלו, אני יכול לקרוא רק את מה שאני צריך ולא צריך מעבר.

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

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

בקוד רגיל, ולא בהדגמה שכזו, חשוב גם לבדוק שגודל length אינו גדול יותר ‎ 2 << 24 לשם כך אפשר לבדוק את ה cap של ה slice ואין צורך לחשב מחדש.

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

תכנות בווינדוז – 2020-2021

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

מי שלא מכיר, הייתי בעבר מתכנת Windows, פיתחתי בעיקר עם VB/VBA ודלפי, כך שהזיכרון שלי על win api הדהים אותי שעדיין קיים ורלוונטי יחסית.

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

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

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

המערכת שאני כותב היא cross platform וכתובה ב Go. בלינוקס היה לי מאוד קל להתחבר לlibc כאשר אין לי binding או חבילה מוכנה בGo (ואין לי את הזמן ליצור את התמיכה בכל הapi set ואני צריך רק פונקציות וstruct מסוימים מאוד), אבל בווינדוז אני מוצא את עצמי עובד מאוד קשה מול COM או פשוט ליצור ב VS איזשהו DLL שאני כותב ב C/++ ‎ (משלב בין שניהם כי לא באמת רגיל לתכנת ב ++C).

התסכול הבא, היה לאבחן בעיות ותקלות. הנה בעיה מוזרה – כלל החומורת מכילות דריברים המספקים לי פידבק אודות מעשים מסויימים באמצעות Windows Messages.
אבל – חלק מהחומורת ו/או דריברים לא מעלים את ה events וחלקם כן.
יותר מזה, אין ב DC שום דבר המגביל זאת, וכן אין משהו שחוסם משהו.
אמנם יש דרכים כנראה לפי התיעוד להכריח את ווינדוז לעשות זאת, אבל זה משהו שאסור לי לעשות בשל רגולציות שונות עבור אותה מערכת (לפי מה שהוסבר לי) ולכן אם זה לא עובד אין לך תמיכה במערכת.

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

בזמן התמודדות הבעיות הבנתי למה לינוקס נוח עבורי כל כך, בזמן שפיתוח בWindows ממש לא (אפל איפשהו באמצע). בעיה מוזרה שהיתה לי – יוצר קובץ (בינארי ו/או טקסט) כותב אליו, עושה close ואולי אפילו flush לפני – מנסה לגשת אליו ממערכת אחרת והקובץ לא קיים, או בגודל 0.
הבעיה היתה שבעוד שה File Descriptor (או Handle בWindows) שוחרר, מערכת ההפעלה עדיין לא כתבה את המידע או כל המידע לקובץ בפועל. עד עכשיו אני לא יודע למה, וזה גם לא מתרחש כל הזמן.

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

עוד בעיה – יצרתי dll ב ++C (או חצי ++C וחצי C מבחינת התחביר), לדעתי ייצאתי (כלומר export) את כל הפונקציות שרציתי, אבל בפועל לא הצלחתי לעשות לכולן link. בלינוקס אני יכול עם objdump לראות מה ייצאתי בפועל, אבל בווינדוז? אני צריך כלי חיצוני שלא מגיע עם VS.

ניסיתי גם להדפיס למסך תוכן שהוא utf-8 לא הכל מוצג. עכשיו שאלות – האם זה פונטים? האם זה באג שלי?
הcmd לא כזה ברור אם הוא מסוגל להציג את זה בכלל (הבעיה היתה הגדרות locale של פונטים). למשל בלינוקס הרצה של טקסט מול od -x תעזור לי מאוד לראות ב hex האם מדובר בבעיה שלי או משהו אחר.

כאשר ניסיתי לעבוד ב VS עם breakpoints להבין את הבעיה למעלה הגעתי למצב שהווינדוז נתקע עם 100% cpu במשך 45 דקות. מה שקרה בסוף זה אתחול כפוי של מערכת ההפעלה כי שום דבר לא הגיב לי.
זה נמשך 45 דקות כי הייתי צריך להתמודד בין לבין עם משהו אחר אז השארתי את זה לרוץ בזמן שעברתי וכשחזרתי זה עדיין היה תקוע.

כאשר אני כותב מערכות לווינדוז, אני מרגיש כמו משהו זר שאיכשהו בכל זאת זה עובד, אבל בקסם, בעוד שלינוקס זורם לי מאוד למרות שאני עובד ב ‎(neo)vim, וטרמינל בעיקר במקום איזשהו IDE גדול.

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

זו כמובן התחושה שלי בנושא.

מה שונה ב רובי 2.1

לפני כחודשים שוחרר רובי 2.1, גרסת preview. הוא מכיל כל מיני שינויים, וגם ייצבו כמה תכונות חדשות אשר נכנסו ל2.0, אבל סומנו כ experimental, או במילים אחרות, לא יציבות.
כאשר אני מדבר כאן על רובי, אני מדבר על cRuby/MRI כלומר הגרסה של יוצר רובי, ולא מימושים אחרים כדוגמת jRuby או Rubinius.

להמשיך לקרוא

עוד יום שלישי ה13

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

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

זהירות, הקוד קצר מידי, בייחוד אם משווים לC

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

איך זה שהפלוס דולף ?

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

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

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

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

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

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

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

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

טוב אפסיק את הפוסט לפני שיהיה לי עוד segfault

עוד חוזר הדיון, שנזנח כך לשווא …

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

הוא התחיל בדוגמה בכך שבC אפשר לקבוע את רמת הביט של מספר, למשל:

typedef int7b int:7

ואם אתם אוהבי ממים, אז המשפט שהגיע מפי היה בסגנון "bitch please", או בגרסתו העברית – "כלבתא במטותא":

type
  int7b = 0..63;

רגע, אבל למה להתחיל מ0, למה שלא נתחיל מ5 במקום ?

type
  int7b = 5..68;

אתה יכול לעשות את זה ב C ? אה, לא, אוקי. ומה עם זה ?

type
  TMyRec = bitpacked record
    Value : int7b;
  end;

ולהבטיח כי הרשומה בהכרח תקבל דיחסה לפי ביטים ולא לפי גישה אחרת (יש מספר יכולות דיחסה בפסקל לרשומות) ? להמשיך לקרוא

וואוו איזה כלי מגניב

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

אחד הדברים שאני כל הזמן מגלה הוא, עד כמה הם אוהבים את סביבת העבודה שלהם, אבל כל הכלים שיש לסביבת העבודה שלהם, ובכן איך להגיד את זה בצורה לא משתחצנת – משעממים מאוד אנשים שהתרגלו לעבוד עם כלי בורלנד (שנמכרו לחברת אמברקדו). אין באמת משהו מעניין או מסעיר בכלי הפיתוח הללו. עבורי זה משהו די סטנדרטי ב12-15 שנה האחרונות. למעשה ב vim יש יותר כלים מעניינים מאשר אלו המגיעים עם MS Visual Studio.

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

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

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

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

פסקל ברברס

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

תודה לאורי ורן על האירוח.

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

nvidia widgets

NvWidget_MacOS_386nvidia שחררה לפני מספר שנים sdk להשתמש בAPI שהיא משחררת עבור שימוש ב OpenGL. בעקבות ה sdk, קם פרוייקט אשר יצר רכיבים גרפיים המשתמש ב API של nvidia.

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

לכידת אותות סוררים ביוניקס

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

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

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

הבעיה היא שהתעוד יחסית נורא בנושא כאשר מדובר בתכנות למי שהידע שלו בC אינו הכי חד או קיים בכלל.

למשל אם תכתבו בלינוקס : להמשיך לקרוא

Abbrevia

Abbrevia הוא סוג של toolkit עבור C++ Builder, Delphi, Kylix ו FPC/Lazarus אשר מספק רכיבים וספריות רבות לטיפול בפורמטי קיבוץ שונים כדוגמת ZIP, CAB, LZMA ואחרים.

הtoolkit הוא בעצם סדרת רכיבים בקוד פתוח, אשר חזרה להיות מפותחת אחרי קרוב לעשור, בה היא סתם שכבה בSourceForge. כמו כן, היא כיום עובדת במספר מערכות הפעלה כדוגמת Windows, Linux ו Mac OS-X.

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

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

חברת TurboPower היתה חברה כזו. החברה היתה מאוד מוכרת בעולם בשנות ה80 וה90 בעיקר. היא היתה חברה מאוד קטנה, אבל עם המון פיתוחים אשר שינו את עולם התכנות המקצועי לכל אלו אשר בחרו בדלפי או C++ Builder של בורלנד, ולפני כן גם ב Turbo Pascal ו Turbo C, וכן Borland Pascal ו Borland C.

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

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

החברה שיחררה את גרסה 5.0 עבור הספרייה והחלטתי לפרסם על זה כאן. תכנות מהנה.

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

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

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

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

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

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

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

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

אבידה גדולה לעולם הטכנולוגיה

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

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

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

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

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

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

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

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

סתם שתקבלו קצת קנה מידה

ריקוד המכונה

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

למשל בעולם האינטל/AMD יש לנו חיים מאוד קלים. אנחנו עובדים עם אינדיאנים קטנים (Little Endian). מי שמתעסק במעבדי ARM, עדיין עם חיים קלים, אינדיאנים קטנים והוראות מעבד ממש דומות, אבל לא זהות. ההתעסקות עם המעבד המתמטי של ARM ועוד כמה הוראות שונות לגמרי מאשר מעבדי Intel.

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

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

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

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

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

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

ההקדמה מאוד הזכירה לי את השיר של משינה בשם ריקוד המכונה, שהוא בעצם חיקוי (כמו כמעט כל השירים של הלקה) של השיר של madness בשם One Step Beyond.

אבולוציה של שפת תכנות

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

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

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

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

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

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

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

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

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

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

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

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

כללים לביצוע binding

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

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

typedef int card32

אומר שהגדרנו כרגע טיפוס בשם card32 והוא בעצם מסוג int.

אפשר לראות את זה גם בהגדרות משתנים:

int age

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

קישור ל Qt

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

מה זה תכנות מונחה עצמים ? להמשיך לקרוא

0.1+0.2 = ?

חידה קטנה: אם אני עושה בשפת מחשב (כולל מסדי נתונים) את החישוב הבא:

0.1+0.2

מה תהיה התוצאה ?

התשובה היא שזה תלוי.

במה זה תלוי ? ובכן זה תלוי במהדר/מפרש, וזה תלוי בסטנדרט שאותו מפרש/מהדר משתמש בו.

למעשה השפה היחידה עם 2 מהדרים שניסיתי שנתנה את התשובה 0.3 היתה פסקל על FPC (אין לי דלפי לנסות עליו).

מבחינת מסדי נתונים כל מה שניסיתי (שזה Firebird, MySQL, PosgreSQL) כולם נתנו תשובה זהה לFPC.

שאר השפות החליטו שמדובר בתוצאה של 0.30000000000000004

מהם שאר השפות ?

ובכן

C (gcc), Perl, Ruby, Python, Javascrupt (Firefox), PHP

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

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

ספרייה משותפת

אורי שאל אותי איך להשתמש בספרייה משותפת בלינוקס אשר נכתבה בFPC עם תוכנה שכתובה בC.

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

אז כמה דגשים קטנים:

להמשיך לקרוא

חוסר הבנה, או חוסר קריאה ?

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

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

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

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

השפה שמתאימה ל ?

אני כל הזמן שומע כמה C טובה, ושרק איתה אפשר לעשות פיתוח Embedded, ושזו כנראה השפה היחידה שנותנת אפשרות לשלוט בביטים עוד ברמת ההגדרה וכו'…

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

להמשיך לקרוא

שחרורים לאוויר העולם

אתמול לאחר עבודה מאומצת, שחררתי לאוויר העולם שניים מ"יצירותי" האחרונות:

  • קישור (binding) לספרייה libsndfile, כולל תוכנת ההדגמה המדוברת שלי.
  • קישור לספרייה fam (נבחן ע"י ביצוע gam למען האמת), כוללת כמה תוכנות ממש מעניינות כדוגמת אפשרות לבצע או קישור דינמי או קישור סטטי לספרייה, ו2 תוכניות הדגמה, האחת כתובה בC והשנייה בפסקל.

libsndfile

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

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

libfam

חיפשתי צורה יעילה לעשות monitor על קבצים שהשתנו בלינוקס (לצורך תוכנה), ולאחר מחקר גיליתי את File Alternate Monitor. הספרייה הזו במקור פותחה ע"י חברת SUN, וכיום יש לה כמה יורשים, כאשר היורש הכי נפוץ הוא GAM המוכר במרבית ההפצות בתור GAMIN. מבחינת ABI, הוא זהה לחלוטין לFAM, אבל הוא עובד על בסיס הגרעין.

היתה לי בעייה עם התוכנת הדגמה, וכל אירוע שהתרחש תמיד הוצג בתור "0", ולא הצלחתי להבין למה. אז כתבתי תוכנית בC לבדוק האם אני מפספס משהו, אשר עושה את אותו הדבר… הסתבר כי היה לי באג ברשומה של off by one, דבר ששיבש את כתובות הזכרון של כל שאר השדות ברשומה. אחרי שתיקנתי את הבעיה, הכל חזר לעבוד.

רק משום מה בעוד שהתוכנית C עבדה על 6% של מעבד, התוכנית פסקל עבדה על 100%. מוזר נכון ? הרי גם התוכנית C צריכה לתפוס 100% של המעבד 😛 אז מסתבר שהיה לי באג קטנטן בתוכנית C, פתרתי אותו, וזהו.

אה הסיבה ל100% CPU זה בגלל שזו לולאה אין סופית בלי משהו שיחכה באמצע… זה לפי תכנון או זה feature ולא bug 🙂

בכל מקרה, אתם מוזמנים להוריד ולהתרשם בעצמכם מקישוריות שעשיתי: http://ik.homelinux.org

כאשר שפת התכנות מהירה מידי למערכת

לפני כמה חודשים ניסיתי לכתוב מערכת של Progressive Dialer למערכת Asterisk. המערכת התממשקה עם מערכת click2call שבניתי, ובעצם היתה אמורה להוציא שיחה לנציג וללקוח כאשר הנציג מתפנה.

המערכות עצמן היו כתובות בין היתר גם בג'אווה. הבעיה היתה, שגם השרת click2call וגם השרת של הprogressive dialer שניהם היו מהירים מידי מול התגובות (Signals) של Asterisk. בעיה זו גרמה בין היתר לכמה התנהגויות ממש לא צפויות לרעה.
להמשיך לקרוא

הדרך ל Low Level רצופה בכלי עזר

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

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

בחירה טובה היא דבר יחסי

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

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

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

להמשיך לקרוא

כמה פעמים ספרת עד 10 …

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

להמשיך לקרוא

RAD זו לא רק סביבה

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

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

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

סיכום יום כיפור

יום שישי התחיל רע. בערך מהצהריים, משהו כמו שעתיים אחרי שHOT דיברו איתי ורצו לדעת מה אני חושב על השירות שלהם, היתה נפילה בתקשורת האינטרנט. וככה מ12 בצהריים בערך ועד 4 אחה"צ לא היה לי חיבור אינטרנט. בזמן לאחר מכן, שוב הבעייה חזרה וגם הפעם זה היה עניין של שעות, עד היום בסביבות 3 וחצי אחה"צ.
דבר זה די הסיר ממני את היכולת לתקן באגים שמצאתי בביצוע ה AGI שעשיתי. היות והאתר voip-info.org שהוא המקור למידע היחיד לא היה זמין מן הסתם. וככה במקום שהיום lnet תהיה עם ביצוע די נחמד של AGI, וביצוע שאני ממש לא אוהב של FastAGI, נשארתי די תקוע, ורק באגים של בעיות שלא דרשו דוקומנטציה נפתרו.

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

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

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

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

שחוסר קריאות = יותר עצמה

זה שטויות.

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

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

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

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

לראות שונה – תכנות

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

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

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

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

למען הפרוטקול, אני יודע לתכנת בהרבה שפות תכנות: משפות "נמוכות" כדוגמת assembly 16 ביט של x86, וכן גם הגרסה שמוגנת של 32ביט (או לפחות זוכר איך לעשות כמה דברים עם השפות האלו). אני גם יודע לגעת בC אם כי בצורה די בינונית, Java, Perl, Ruby, Bash כמובן שפסקל, ועוד… אני כמובן גם יודע שפות יעודיות כדוגמת nasl מבית nesus או SQL בהתאם למסד הנתונים והרשימה עוד ממשיכה.

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

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

כאשר אני רוצה לבנות קוד שיעבוד במהירות על טקסט, אני אעדיף את פרל. חוצמזה שאני מאוד אוהב את השפה, היא פשוט בנוייה לזה. אין כיום שום שפה אחרת שתיתן לי את מה שפרל נותנת (אל תזכירו את awk בבקשה).
אם אני רוצה לבנות אתר Web, אני אבחר או בRuby או בPerl. שוב, הם הכלים הכי טובים לדעתי לביצוע המשימה. לדוגמה PHP רק בגרסה 5 התחיל להתקרב למצב שניתן להשתמש בו בצורה טובה, אבל הוא עדיין רחוק מהמטרה. נראה כי Zend מסתובבים סביב המטרה, אבל לא מגיעים אליה… כרגע הם רק הקטינו את גודל המעגל.

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

לGUI, אני בוחר בLazarus, אשר הרבה יותר טובה מכל הכלים הקיימים כיום בשוק ללינוקס.

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

אז מה אתם אומרים ? האם אתם תבחרו כלי ושפה שתבצע לכם את המשימה הכי טוב שאפשר, או שתבחרו בכלי הכי פפולרי, גם אם הוא לא בהכרח יעשה את העבודה כמו שצריך בלי מאמץ כזה או אחר מצדכם ?

בלינוקס אין ווירוסים

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

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

אורי, חשוב לי להדגיש רק, כי אני לא תוקף אותך אישית, ואני רק לוקח את מה שכתבת בתור דוגמה.

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

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

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

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