סיבוכיות המערך ביעילות חלק ראשון

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

יצרתי "לקוח" ב Lazarus עבור עבודה עם xml-rpc, כאשר אני יכול לערוך את הXML עם צביעת התחביר וכמובן לקבל את התשובה שגם היא צבועה. כל זה גם מכיל log כמובן של כל דבר שהתרחש. והכי חשוב, זה כתוב בצורה מותאמת להיות cross platform.

כל הדבר הזה לקח שעה וחצי של תכנות (הייתי צריך להיזכר איך כותבים תוכנה גרפית רצינית, ולחשוב בצורה חוצה פלטפורמות זה לא דבר קל למי שלא רגיל). התוצאה היא 300 שורות קוד אשר אני כתבתי שנותנות לי את כל התוצאה הזו (בנוסף לעוד כמה תכונות נוספות שלי די מקלות על החיים, ולמרות שהן פשוטות מאוד, התכנון שלהם לקח הרבה אנרגייה). הבעיה היא ששעתיים וחצי טיפלתי בבעיות כמו חוסר תמיכה של gdb ב"חברים" (members) של FPC, אם זה במחלקות או ברשומות דחוסות (בפסקל כל הרשומות דחוסות, רק צריך להגיד למהדר איך לדחוס). היו גם כמה באגים נוספים שמצאתי בספריית lnet שתיקנתי ושלחתי patch שהתקבל ונכנס ל svn. ועוד כמה באגים שאני צריך ללמוד אותם יותר לעומק בשביל לדעת איך לדווח עליהם נכון.

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

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

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

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

7 מחשבות על “סיבוכיות המערך ביעילות חלק ראשון

  1. dude

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

  2. ik_5

    הנה הדגמה של הבעיה שניסיתי לפתור:
    יש לי מערך שמכיל את השמת הבאים:
    syslog, messages, scrollkeeper, user
    עכשיו ב /var/log/ יש לך עוד הרבה מאוד לוגים שונים ומשונים. אתה רוצה לקחת רק את הלוגים שנמצאים במערך, על כל הגלגולים שלהם למשל:
    syslog
    syslog.1
    messages.100
    וכו'…
    אבל להתעלם למשל מ X.org כי הוא לא רלוונטי. הבעיה היא שהרשימה הזו לא מגיעה ממך …

    בקשר לפסקל. אני לא רק אוהב את השפה, היא שפה מאוד פרודקטיבית. יש באגים בדברים מאוד ספציפיים. בכל דבר יש באגים. אבל הבעיה העיקרית שהיתה לי היא gdb והחוסר יכולת שלו לתמוך בפסקל בצורה נורמאלית.
    אני לא אוהב את הצורה שהעולם המקצועי עובד, בה ככול שהשפה יותר משווקת, ככה בוחרים אותה יותר. בנינו, אפשר לכתוב בצורה די קריאה תוכנה בC, אבל האנרגייה שאתה צריך להשקיע בשביל תוכנה הכי פשוטה שתקלוט לך קלט פשוט, מול התועלת די לא שווה לדעתי.
    אני יכול להשתמש כמובן ב pyGTK, אבל אז אני צריך לעבוד עם Glade, ליצור GUI, ולחבר אותו לקוד. כאן עם לזרוס יש לי בדיוק את זה, רק בלי הפרדה ! לא משנה כמה אתה מקצועי בpyGTK וכו', אני בהכרח יצליח לעשות את זה צורה יותר מהירה ממך לאותה משימה גרפית.
    עכשיו אם אני לוקח את הGUI שכתבתי, ואני מקמפל אותו בווינדוז, הוא יקבל מראה של ווינדוז, ועדיין יעבוד בצורה זהה בלי קוד נוסף שהוספתי. אני לא צריך איזה VM (כמו ג'אווה), ואני לא צריך מליארד ספריות.
    בקשר לטכנולוגיות אני לא בטוח שאני יודע על מה אתה מדבר… שיש ספריות C או ++C, אז צריך לעשות binding, כמו כל שפה אחרת. גם בפיתון, פרל, רובי או ג'אווה, כאשר אתה צריך להשתמש בספרייה חיצונית, אתה צריך לעשות לה binding. אני יכול להגיד שC ו השפת ה patcing ++C די מוגבלות כי אני יכול ליצור ספריות שאתה בחיים לא תצליח לטעון ולהשתמש בשפות האלו. אבל זו לא המטרה.
    נכון שהכמות משתמשים בפסקל נמוכה, ומכאן הרבה באגים שעוד לא התגלו בגלל זה. אבל באותה מידה יכולתי להשתמש בספריות sockets אחרות כדוגמת synapsis, indy או לכתוב סוקטים בעצמי. אבל אני מאוד אוהב את הגישה של lnet, ואני מכיר אישית את המפתח שלה, דבר שגורם לי לבטוח בה יותר. אני זוכר שבsynpasis היתה תקופה מאוד ארוכה שהיה באג מעצבן בלינוקס, ואני יודע שיותר מאדם אחד שלח patch שלא התקבל, ובסוף כמובן הבעיה נפתרה, אבל לקח הרבה זמן. כאן, אלס (המפתח העיקרי) מאוד קשוב ותורם הרבה לFPC, דבר שאומר שכל מה שהוא עושה בספרייה יעבוד עם הקומפיילר.

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

  3. ארתיום

    לא בדיוק הבנתי מה הבעיה?

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

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

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

  4. צפריר כהן

    לא ברור לי למה זה כ"כ מסובך. לדוגמה, משהו בסגנון של:

    my @base_valid = qw(messages syslog user);
    my $pattern = '^/var/log/('.join('|', @valid_base).')(|.[0-9]+(|.gz))$';

    my @all_logs = ();
    my @valid_logs = grep $pattern @all_logs; ‎

    פעולת glob אחת ולולאת סינון (grep מסתיר לולאה)

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

  5. ik_5

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

  6. צפריר

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

    וחוץ מזה: את perl בוודאי יש לך. את CGI.pm אני מניח שיש לך גם־כן (הוא חלק מההפצה הרגילה של פרל, למיטב זכרוני). בעזרתו אתה יכול לכתוב דף פשוט בקלות.

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

  7. ik_5

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

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

להשאיר תגובה

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

הלוגו של WordPress.com

אתה מגיב באמצעות חשבון WordPress.com שלך. לצאת מהמערכת /  לשנות )

תמונת גוגל

אתה מגיב באמצעות חשבון Google שלך. לצאת מהמערכת /  לשנות )

תמונת Twitter

אתה מגיב באמצעות חשבון Twitter שלך. לצאת מהמערכת /  לשנות )

תמונת Facebook

אתה מגיב באמצעות חשבון Facebook שלך. לצאת מהמערכת /  לשנות )

מתחבר ל-%s

This site uses Akismet to reduce spam. Learn how your comment data is processed.