ארכיון חודשי: אוקטובר 2012

Bero's Ecma Script Engine

Bero's Ecma Script Engine או BESEN בקיצור הוא מנוע שממש EmcaScript גרסה 5 בשפת פסקל מונחת עצמים.
המנוע משוחרר ברישיון AGPLv3 (בעבר היה LGPL) עם חריגה המאפשרת לקשר אל תוך קובץ הריצה את המנוע.

EmcaScript הוא למעשה השם של Javascript רק ללא "זכויות יוצרים" על השם.

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

המימוש מכיל:

  • תמיכה מלאה בתקן EmcaScript גרסה 5
  • מימוש ByteCode מבוסס על ECMA262 עבור מנוע Regex
  • מימוש garbage collector וכן סימון של מקומות לביצוע ניקוי
  • תמיכה בUnicode בפורמטים  UTF8/UCS2/UTF16/UCS4/UTF32
  • תמיכה במצב תאימויות שונות לשפה
  • מהדר ByteCode מובנה
  • קריאה לשגרות (subrotine) מבוססות חוטים
  • תמיכה בהרצת הוראות חוטים לפי מעבדים (אינטל 32 ו64 ביט, amd64 עם  just in time compiler. בתכנון גם תמיכה בהוראות של ARMv7).
  • קיפול קבועים
  • אופטימיזציות בסיסיות על בסיס עצים
  • התעלמות מקוד אשר לא בשימוש (dead code elimination)
  • Type inference (גם exact וגם speculative)
  • תמיכה במטמון פולימורפי במקום, מבוסס על מבנה אובייקט ותכונות של מזה מפתוח
  • אופטימיזציות עבור פעולות מיפוי עם hash
  • עצים מאוזנים (למשל עבור מיון מידע on the fly המקושר למידע בhash maps )
  • הוספה טבעית של מחלקות פסקל (תכונות לפי RTTI)

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

לפרטים נוספים ולקוד מקור

צפייה בעץ חלק שני

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

Program using VirtualTreeView

תוכנה בשם precisionhelper המשתמשת ברכיב

יש רכיב צד שלישי הנקרא VirtualTreeView אשר נכתב במקור לדלפי ומגיע כקוד פתוח (LGPL).
הרכיב לא ניתן לעבודה בברירת מחדל עם לזרוס), והוא עובר מספר שינויים על מנת לקבל תמיכה בלזרוס, כאשר השינויים נמצאים ב Lazarus-CCR.

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

שלום גנום שלוש

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

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

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

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

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

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

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

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

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

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

תובנות השוק מהרצאה שהעברתי

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

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

לאחר מכן, העברתי הרצאה על No(t only) SQL. בהרצאה העברתי הסבר מה זה בגדול אומר, איך מבינים בכלל מתי, ואיך הוא מתאים לנושא, התמקדתי בMongoDB ובRedis. שני מסדי נתונים אשר אני משתמש בהם.

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

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

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

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

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

או כפי שאברהם מאסלו אמר פעם – כאשר יש בידך פטיש, הכל נראה לך מסמר
אתה פשוט לא מסוגל להבין כי לפעמים יש שימוש גם למברג, שפכטל וכו' …

הוליווד פורצת

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

חלק כללי

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

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

Brute Force הוא שם המייצג גישה האומרת "בואו ננסה כל אפשרות ברשימה עד שנצליח או שנגמרו האפשרויות".

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

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

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

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

regular expression על קצה הפוסט – חלק שלישי

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

זוכרים את ההדגמה שלי של "Hello World" ?

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

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

Facebook do not understand their users

I've been using Facebook on and off since 2007, and have to say one thing:

Facebook do not understand their users, or how to make things right !

What does it mean, you probably ask yourself ?
Well here are some of the messages I keep on getting on Facebook in the past few months (Almost constantly): להמשיך לקרוא

regular expression על קצה הפוסט – חלק שני

בחלק הקודם הצגתי בקצרה מאוד מה זה Regular Expression.

אבל ממש לא סיימתי להציג את השפה עצמה.

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

regular expression על קצה הפוסט – חלק ראשון

עולם המתכנתים מתחלק לשלושה חלקים:

  1. אלו אשר משתמשים ב Regex‏
  2. אלו אשר שמעו על Regex‏
  3. אלו שחושבים שאני מקלל אותם כרגע

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

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

ישנן הרבה מימושים לשפה, כאשר כל מימוש מספק יכולות שונות – בעיקר תוספות למימוש הבסיסי ביותר. אחת הידועות ביותר נקראת Perl Compatible Regular Expression או PCRE בקיצור .אך התקן הבסיסי ביותר שיש עבור השפה, בכלל שייכת לPOSIX.

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

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

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

Hello World

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

^([\w]+)\s([\w]+)$

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