לפני כמה שנים טובות עבדתי בסטארטאפ קטן בשם Content Objects שנסגר זה מכבר.
בתקופתי שם פיתחתי ספרית ג’אווה בשם JNotify שמאפשרת קבלת ארועים על שינויים במערכת הקבצים בלינוקס ובחלונות (ואולי עוד בהמשך).
דאגתי שהקוד ישוחרר ברשיון קוד פתוח כפרוייקט סורספורג’.
החברה נסגרה (אחרי שעזבתי), אבל הקוד נשאר. לא ממש תחזקתי אותו, אבל נראה שאנשים השתמשו בו בכל זאת – למרות שהיו כמה בעיות די חמורות בגרסאת החלונות.
כדי לתת מה שהספריה נותנת, חייבים להשתמש בקריאה לפונקציות של מערכת ההפעלה.
בלינוקס העניין היה פשוט יחסית: קטע הקוד המקומי (native code) הוא מינימלי ביותר ומסתמך על inotfiy. הAPI שלו מאוד פשוט אבל הוא לא תומך בהאזנה ריקורסיבית ולכן רוב הקוד כתוב בג’אווה ונועד להוסיף יכולת לקבלת ארועים על ספריות באופן ריקורסיבי (צפיה בתת ספריה על כל בניה).
בחלונות העניין הפוך, קריאת המערכת ReadDirectoryChangesW תומכת בהאזנה ריקוסיבית, אבל השימוש בה מורכב ברמות שלא יאמנו והתיעוד של מייקרוסופט מחורבן ביחס ישר למורכבות הAPI. ולכן על חלונות רוב הקוד כתוב בC++ (כי אין דרך פשוטה להתממשק אל הAPI המקומי מג’אווה) אבל קוד הג’אווה הספציפי לחלונות פשוט מאוד.
מכיוון שהרבה יותר קל לכתוב ולדבג קוד ג’אווה מאשר קוד C++, המימוש ללינוקס היה הרבה יותר יציב מזה של חלונות – שנטה להתרסק או להתקע לעיתים נדירות בכל מני סיטואציות שלא הצלחתי לשחזר.
לפני כמספר שבועות פנה אלי משתמש של הספריה, והציע שאני אפתור בתשלום את הבאגים בגרסאת החלונות.
לאחר משא ומתן קצר הסכמנו על $100, וניסיתי את מזלי.
זה היה די קשה, אבל לבסוף הצלחתי לתקן את הבאגים החמקמקים, ובנוסף לשפר את הביצועים של הספריה כך שלא תפספס אירועים גם על מחשבים חלשים.
אחרי שכמות השעות ההשקעתי בעניין עברה את מה שנראה לי מוצדק בעבור $100 הסכמנו גם להגדיל את הסכום ל$250 והיום שחררתי את הגרסא המתוקנת
$250 זה לא סכום שבאמת מכסה את כמות השעות שהשקעתי בתיקון הבאגים (אם הייתי לוקח סכום סביר לשעה), אבל זה בכל זאת פרוייקט קוד פתוח ואני מרוצה שתיקנתי את הבאגים האלו.
נודע לי מאותו משתמש שמישהו ביצע fork לספריה והוסיף לה תמיכה בMac.
פניתי אליו ונראה שהוא יצטרף לפרוייקט וישלב את התוספת שלו בקוד (שנכתב כך שיהיה קל מאוד להוסיף תמיכה במערכות הפעלה חדשות), ואולי גם יעזור עם באגים אחרים.
JNotify התעורר.
רסיסים (RSS)
January 25th, 2010 ב23:25
ב-C# החיים יותר קלים, אפשר להשתמש באובייקט FileSystemWatcher שיש לו ממשק נוח:
http://msdn.microsoft.com/en-us/library/system.io.filesystemwatcher(VS.85).aspx
January 25th, 2010 ב23:46
גם בג’אווה, מאוד קלים – פשוט משתמשים בJNotify
January 26th, 2010 ב08:48
מהמידע והתוכן הכלול במאמרך ניתן להכיר את הספריה, אך לא להנות מהשימוש בה, פשוט כי אין במאמר זה קישור להורדת הקוד…
לנוחות המחפשים הנוכחים והעתידיים, אני מצרף את הקישור להורדה, אליו הגעתי דרך הקישור למאמרך הקודם בנושא זה: http://sourceforge.net/projects/jnotify/?315
January 26th, 2010 ב09:04
עדכנתי את הלינק, תודה.
January 26th, 2010 ב12:08
נראה שבג’אווה 7 תהיה תמיכה בקבלת הודעות על שנויים במערכת הקבצים (באמצעות המחלקה java.nio.file.WatchService).
January 26th, 2010 ב12:34
שחר, זה נכון – אבל:
1. לא ברור מתי תצא ג’אווה 7 (ועם הסיפור של אורקל, לא ברור שהיא תצא בכלל).
2. אל תתפוס אותי במילה, אבל אני חושב שWatchService לא יתמוך בהאזנה ריקורסיבית על ספריות.
January 28th, 2010 ב22:52
עמרי, זה מרשים מאוד.
יש לי הצעה: למה שלא תכין תוכנית “Hello World” פשוטה המדגימה את הספרייה? למשל תוכנית עם מסך פשוט (אפילו console application) שמספקים לו ספרייה כארגומנט, ואז כל פעם שנכתב קובץ לספרייה יופיע “נוצר הקובץ X”, או “שונה הקובץ X”, או “נמחק הקובץ X בספרייה Y” וכ’.
אין טוב ממראה עיניים, וזה גם מאפשר להבין מייד איך אפשר לעשות שימוש בספרייה. זה הופך את כל העניין להרבה יותר ברור וגם “שוויק” (כלומר ניתן לשיווק, גם במובן האופן סורסי של המילה).
מה דעתך?
January 30th, 2010 ב12:17
יונתן, רעיון טוב, רק שכבר עשיתי את זה, רק צריך לעדכן את התיעוד.
אתה יכול להריץ את הספריה ככה:
java -Djava.library.path=. -cp jnotify-0.91.jar net.contentobjects.jnotify.JNotify [DIR]
זה יעקוב אחרי השינויים לDIR ויציג אותם (או הספריה הנוכחית אם DIR לא מוגדר).
January 30th, 2010 ב16:08
תודה עמרי, אני אבדוק את זה.
January 30th, 2010 ב16:10
אה, עוד משהו: אני חושב שהמקום הכי טוב לציין איך רואים דוגמת ה- Hello World הוא קובץ ה- README, כי אני מניח שזה הקובץ הראשון שאנשים קוראים (או אמורים לקרוא בכל אופן). אתה יכול להכין קובץ בשם Example.txt ולהפנות אליו בקוץ ה- README.
January 30th, 2010 ב16:10
(ואני מניח שזה שלא ראיתי את הדוגמא אכן מעיד שלא חקרתי מספיק את הקבצים).
January 30th, 2010 ב16:13
לא, כמו שאמרתי – רק צריך לעדכן את התיעוד.
קובץ הREADME בCVS כבר מכיל את הדוגמא, וזה יכנס בגרסא הבאה (שתכלול גם תמיכה במק וכנראה גם תמיכה בJVM שרץ ב64 ביט על חלונות).
January 30th, 2010 ב19:13
אוקיי.