מזרים NX

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

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

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

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

אז החלטתי ללכת על FPC/Lazarus ו Ruby. הסיבה שהלכתי על רובי היתה אחרי שגיליתי שרוב האתרים בארץ שוברים את ה Parser שיש לי עבור HTML 4 שמגיע עם FPC, היות והם לא תקניים בעליל, ואפילו tidy (אחרי למעלה מ3 דפים מלאי הערות ואזהרות, לא הצליח לתקן את המצב).

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

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

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

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

התלויות של רובי הם במודול שנקרא hpricot. המודול מאפשר לי בעצם לנתח את הHTML/XHTML באמצעות xpath, והוא יודע לא להיות בררן בקוד שנותנים לו (בניגוד למפרש בפסקל😦 ).

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

ניתן להוריד את מה שעשיתי בכתובת הבאה:

http://ik.homelinux.org/projects/files/mazrim-nx.tar.gz

7 מחשבות על “מזרים NX

  1. אילן שביט

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

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

  2. ik_5 מאת

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

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

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

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

  3. אילן שביט

    עידו
    לא נפגעתי: אתה פשוט אתה לוקח נושא שמתאים לך ובונה עליו תאוריות (לדוגמא קובץ הקונפיגורציה שמראש בניתי בחופזה מתוך מטרה ברורה לשפר אותו אח"כ).
    לגבי הביטויים הרגולריים: מדובר במערכות אוטומטיות שמייצרות את הקוד באתרים השונים (ולא בבניה ידנית של אנשים). זאת הסיבה שהאתר תומך בכל הקישורים (כי ההתנהגות של המערכות האוטומטיות היא קבועה). באופן כללי אני לא יכול לתת תמיכה מוחלטת בדברים שלא ידועים לי. אתה נתת דוגמא של הערה שאולי יכניסו לאמצע הקוד, אבל באותה המידה הם יכולים לשנות ב- 180 מעלות את הקוד וגם התוכנה שלך לא תתמוך בשינוי הזה. בקיצור, אני לא מאמין שניתן לבנות תוכנה "כללית" שתדע למצא קישורי וידאו בכל האתרים ותהיה מחוסנת מכל השינויים שיכולים להכניס בעלי האתרים.
    לסיום: אני חושב שאם כבר מדברים על תוכנה "אידיאלית" אז את האלגוריתמים עצמם כדאי למקם בשרת חיצוני (ולא בגוף התוכנה). כך התוכנה תוכל להתעדכן "On Line" באלגוריתמים חדשים מבלי שיהיה צורך לשחרר גרסאות חדשות. לגבי ה- gui: ניתן לוותר עליו. באמצעות הכפתור בשועל ניתן לנגן את קטעי הוידאו באופן ישיר (ניתן לכתוב זאת בפייתון, רובי, פרל ועוד…). במידה ורוצים מימשק גרפי (לניגון רדיו/מצלמות) אז ניתן אולי לייצר ממשק web – י (?javascript), כך שבאופן כללי גם לזרוס (שמייצר את המנשק הגרפי) וגם pythoncard/pygtk מיותרים. בקיצור אין סוף לרעיונות…🙂

  4. ik_5 מאת

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

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

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

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

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

  5. אילן שביט

    עידו שלום
    לדעתי הפתרון ששנינו עובדים עליו אינו נכון. כפי שכתבתי כל נושא המנשק הגרפי הוא מיותר. בנוסף התכנה צריכה להיות כתובה כך שהיא תהיה בנויה מ- parser שיקבל מהאינטרנט את האלגוריתם הנכון לפתרון הבעיה (פיצוח אתר בעייתי). בצורה זאת התוכנה תמיד תהיה חכמה ומעודכנת (גם אם היא תישבר אז הפתרון יהיה מאוד מהיר וללא הטרדת המשתמש). ליישום הזה לא צריך כאמור מנשקים גרפיים, ובטוח לא תותחים כבדים דוגמת לזרוס שרק מקשים על פורטביליות התוכנה. מעבר לכך יישום של הרדיו והמצלמות יוכל להיות מיושם ב- gui מבוסס web (‎‎javascript‎ ). הפתרון יכול להיות כתוב בפייתון/פרל (שיש בברירת המחדל בכל הפצת לינוקס) ורק בעדיפות נמוכה יותר ברובי או פסקל (שמחייבים התקנה נפרדת מה עוד שאין להם יתרון בנושא לעומת פייתון או פרל (והפתרון יכול להיתמך בקלות גם בחלונות, לינוקס ומקינטוש).

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

  6. ik_5 מאת

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

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

    הבחירה שלי הגיעה בסה"כ להדגים צורה נכונה יותר לעשות דברים, לא בתור *ה*דרך … אלא דרך/גישה טובה יותר ממה שקיים כיום.
    ד"א לפיתון יש עוד כמה פתרונות שחלקם אולי טובים יותר מאשר regex כדוגמת pyparser ואחרים.
    אני חושב שזמינות של שפות דינמיות כדוגמת פיתון רובי פרל וכו', היא בעייתית כי זה תמיד דורש הרבה מאוד תלויות, ולפעמים אפילו להדר תלות זו או אחרת.
    הפתרון של לזרוס הוא דווקא לעבוד על פורטביליות בין מערכות. ככה אתה יכול ליצור מערכת גם ללינוקס, גם ליוניקס, גם לווינדוז גם לווינדוז CE ואפילו להחליף UI בין GTK ל QT בלי לשנות את הקוד שלך. אני חושב שזה יותר פורטבילי מאשר השימוש בכל צורה אחרת שקיימת כיום.

  7. אילן שביט

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

כתיבת תגובה

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

הלוגו של WordPress.com

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

תמונת Twitter

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

תמונת Facebook

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

תמונת גוגל פלוס

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

מתחבר ל-%s