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

דלפות זיכרון בשפות דינמיות

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

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

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

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

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

גם אנדרואיד בידנו

חברה אחת שיחררה אתמול Patch שכבר נכנס לsvn אשר מאפשר לעבוד בצורה טבעית עם FPC במערכות מבוססות Android באמצעות JNI.

אותו Patch נוסה על מספר של מכשירים מבוססי Android בניהם Milestone ו Droid של מוטורולה, HTC Desire, Nexus One, Samsung Galaxy S ועוד.

ה Patch שנכתב הוא עבור Android Dalvik VM אשר מפעיל עוד כמה דגלי ARM אשר לא נתמכו עד ל Patch ב FPC.

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

כתוב פעם אחת – קמפל לכל טלפון שאתה צריך 🙂

איך לגרום לשפה להיות חלק מהקישור בRails (ולהישאר בחיים)

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

אני החלטתי ללכת על קישור בצורה הבאה:

/he/home
/en/home

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

בקובץ routes.rb נוסיף את השורה בצורה הבאה:

map.home :home, :action => 'home', :controller => 'index', :path_prefix => '/:locale'

והנה ההסבר:

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

עכשיו ב controller הראשי (application_controller.rb) נכתוב את הקוד הבא:

before_filter :set_locale

def set_locale
  I18n.locale = (I18n.available_locales.include? params[:locale]) ? params[:locale] : I18n.default_locale
end

וזו כל הלוגיקה שיש לנו.

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

אני יצרתי גם helper נחמד שמקצר לי את האפשרות לתרגום:

def tp(text)
  I18n.t text.to_sym, :scope => [:pages, @page.to_sym] rescue text.to_s
end

ה helper כאמור נגיש ב view. וב view עצמו זה יראה ככה:

<%= link_to tp(:home), home_path(@lang) %>

וזה הכל 🙂

טעינה עצלה

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

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

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

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

table.where('a > 2');
table.like('c', '''%bla bla''');
table.join('table2', 't2', 't2.id', 'ta.id', '!=');

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

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

table.result('a')

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

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

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

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

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

typedef int card32

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

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

int age

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

אשליות …

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

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

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

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

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

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

ועל הגישה הזו נכתב פעם שיר ישראלי : "אשליות"

להיות יזם …

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

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

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

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

אח"כ אולי תצליחו להבין טוב יותר את השיר של מטאליקה: The Unforgiven

µ.dev

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

הסביבה משוחררת בקוד פתוח (GPLv3) וכוללת את הפיטצ'רים הבאים:

  • Syntax Highlight
  • דיבוג באמצעות pdb מהסביבה עצמה
  • ניהול פרוייקטים
  • שינוי theme עבודה

ועוד …

אפשר למצוא את תמונות המסך של הסביבה.

או פשוט תורידו ותפתחו 🙂

מה שאפשר לעשות עם stored procedures

MindTheBird יצרו תחרות עבור Stored Procedures מעניינים. ופרסמו את שמות הזוכים בתחרות עם ה Stored Procedure שהם יצרו.

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

הזוכים יצרו את ה SP הבאים:

ניתן למצוא את ה SP הזוכים בפוסט הבא של חדשות firebird.

מה זו סכמה במסדי נתונים ?

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

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

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

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

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

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

פיתוח אפליקציות סלולריות בצורה גרפית

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

אם זה זה נשמע לכם מוזר, אז כבר כיום אפשר ליצור אפליקציה אחת שתרוץ אצלכם בשולחן העבודה (בלינוקס, ווינדוז, מאק, יוניקס ועוד כמה מערכות הפעלה), בiPhone/iPad (אם נתעלם כרגע מההגבלה ההזויה של אפל על ידי מתן הורדת אפליקציה לא מ App Store), טלפונים מבוססי Windows CE/Mobile, אופן מוקו, ובטלפונים מבוססי Maemo 5 (קרי N900) והכל ללא שינוי הקוד שכתבתם !

כיום אפשר לפתח אפליקציה בצורה טבעית או ב FPC נקי או בעזרת Lazarus עבור Maemo 5 ושאר הפלטפורמות הטלפוניות שהזכרתי. לא מאמינים, אז הנה 2  תמונות המסך ששוחררו בנושא, גם שוחררו הקבצים הבאים (הראשון זה מה שצריך בשביל לקשר את האפליקציה, האחרון זה patch עבור לזרוס):

ואם תהיתם לגבי MeeGo, אז זו התשובה שקיבלתי כשאני שאלתי:

On Thursday 10 June 2010 22:03:29 ik wrote:
> Will it also work on MeeGo ?

That would require some work and a MeeGo device.
But this is a good base to more easily add MeeGo support.
I have no tried yet to install MeeGo on the N900,
anyhow MeeGo will not be officially supporting N900.
MeeGo probably will be Qt 4.7.

אם כי כמו שאני מבין כרגע, MeeGO זהה כרגע לחלוטין ל Maemo5 ומה שנכתב לי זה לעתיד הלא רחוק, כך שאפילו ל MeeGo כבר אפשר לפתח…

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

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

אבטחת מידע באסטריסק (ובכלל במערכות VoIP)

ניר סמיונוביץ' מנכ"ל חברת GreenfieldTech התראיין לאבי ויס מ The com על אבטחת מידע בכל הנוגע לאסטריסק ושירותי VoIP. ניר מדבר על אסטריסק היות וזו המרכזייה איתה הוא מתעסק קרוב לעשור, אך מרבית הדברים שהוא כתב, דווקא תקפים לכל מערכות הטלפוניה בכלל, ה VoIP בפרט, לינוקס ומערכות מחשב בכלל, כמו שניסיתי להציג במאמר ב Digital Whispers .

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

טיפ לעצמי: איך לסדר התקנת PostgreSQL כושלת

ניסיתי להתקין אצלי את PostgreSQL לניסויים על הלפטופ, אשר מריץ עליו Arch Linux. סקריפט הריצה ב rc.d אמור בפעם הראשונה ליצור ספרייות:

/var/lib/postgres/data

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

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

ההרשאות שהוא צריך הם כאלו:

משתמש וקבוצה של postgres, אבל הרשאות על ספריית data צריך להיות: 0700 – כלומר רק למשתמש יש את מלוא ההרשאות בספרייה, בעוד שלקבוצה או למשתמשים אחרים אין.

לאחר מכן, יש ליצור את הפתרון בצורה הבאה:

sudo su - postgres
[postgres@... ~]$ initdb -D /var/lib/postgres/data/

ואחרי שהוא יוצר בצורה מוצלחת את מה שצריך, אפשר להריץ את התסריט של rc.d.

פשוט כאב ראש המסדי נתונים הנפוצים האלו …

מלחמות לנטיל

אם אתם קוראים כמה שנים את הבלוג שלי, איכשהו השם למעלה נשמע לכם מוכר. אז במה מדובר ? ובכן LentilWars הוא משחק דו מימד המספק מסך אחד עם עד 5 שחקנים בתור סוכריות המזכירות M&M ונקראות Lentil. מטרת המשחק זה להרוג כמה שיותר פעמים את השחקנים האחרים כמובן, ומכאן השם שלו…

המשחק מאפשר לשחק נגד המחשב באמצעות AI או ברשת עם חברים, ומשתמש ב SDL ו OpenGL בשביל לממש את המשחק והוא חוצה פלטפורמות לכמה מערכות הפעלה בהם Linux, Windows ומאק.

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

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

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

את המשחק אפשר למצוא כאן.

הורדה של המשחק נמצאת כאן.

את קוד המקור הישר מה svn אפשר מצוא כאן.

קישור לדף המשחק ב The Happy Penguin ניתן למצוא כאן.

משחק מהנה.

SynEdit חלק ראשון

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

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

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

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

בנוסף לכך ש SynEdit עורך טקסט מעניין בפני עצמו, הוא מספק יכולות לעבוד עם צביעת תחביר בצורות שונות, כולל שילוב של כמה צביעות תחביר אשר יכול להיות בייחד (כדוגמת PHP עם CSS, ג'אווה סקריפט ו SQL באותו הקובץ), למרות שהם מגיעים כרכיבים עצמאיים. להמשיך לקרוא

dbus לטלפון

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

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

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

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

$ mdbus2 -s org.freesmartphone.ogsmd /org/freesmartphone/GSM/Device org.freesmartphone.GSM.SIM.RetrievePhonebook contacts 1 255

התוצאה היא כל רשימת הכתובות שיש לי ב SIM, כך שה SIM שלי תקין לגמרי.

השורה  אומרת לdbus להתחבר לכתובת של org.freesmartphone.ogsmd ואז לקבל את הפונקציות הקיימות מ /org/freesmartphone/GSM/Device ובסוף להפעיל את הפונקציה RetrivePhonebook עם 3 פרמטרים:

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

התוצאה היא רשימה של כל אנשי הקשר שנמצאים ב SIM. מגניב שאפשר לעשות הרבה פעולות ידניות לטלפון. נראה אותכם מדבגים ככה את ה iPhone 😛

לזרוס – התעוד המלא

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

  1. תעוד מלא עבור לזרוס לתכנות במגוון סביבות כדוגמת Linux, Windows ומאק (אבל לא רק)
  2. Disk On Key לאנשי Windows אשר מקבלים את סביבת העבודה מותקנת מראש על DoK בשביל עבודה מיידית.

ניתן לרכוש את הפריטים בקישור הבא.

זכוכית מגדלת ווירטואלית

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

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

הסביבה חוצה פלטפורמות ועובדת עם Windows, Linux, Unix ו MacOS X. היא משוחררת כקוד פתוח (רישיון GPL), ומאוד וותיקה (התחילו את העבודה עליה ב1999), אשר כל הזמן נמצאת עדיין בפיתוחים ושיפורים וכך גם בגרסת 3.4 אשר שוחררה לפני שבוע.

עד כאן לפינה השיווקית של תוכנות קוד פתוח להיום 🙂

הרצאה על JRuby

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

אם יש לכם שעה ו11 דקות להקדיש לזה, תוכלו לצפות בהרצאה.