לפני כמה שנים טובות עבדתי בסטארטאפ קטן בשם Content Objects שנסגר זה מכבר.
בתקופתי שם פיתחתי ספרית ג'אווה בשם JNotify שמאפשרת קבלת ארועים על שינויים במערכת הקבצים בלינוקס ובחלונות (ואולי עוד בהמשך).
דאגתי שהקוד ישוחרר ברשיון קוד פתוח כפרוייקט סורספורג'.
החברה נסגרה (אחרי שעזבתי), אבל הקוד נשאר. לא ממש תחזקתי אותו, אבל נראה שאנשים השתמשו בו בכל זאת – למרות שהיו כמה בעיות די חמורות בגרסאת החלונות.
כדי לתת מה שהספריה נותנת, חייבים להשתמש בקריאה לפונקציות של מערכת ההפעלה.
בלינוקס העניין היה פשוט יחסית: קטע הקוד המקומי (native code) הוא מינימלי ביותר ומסתמך על inotfiy. הAPI שלו מאוד פשוט אבל הוא לא תומך בהאזנה ריקורסיבית ולכן רוב הקוד כתוב בג'אווה ונועד להוסיף יכולת לקבלת ארועים על ספריות באופן ריקורסיבי (צפיה בתת ספריה על כל בניה).
בחלונות העניין הפוך, קריאת המערכת ReadDirectoryChangesW תומכת בהאזנה ריקוסיבית, אבל השימוש בה מורכב ברמות שלא יאמנו והתיעוד של מייקרוסופט מחורבן ביחס ישר למורכבות הAPI. ולכן על חלונות רוב הקוד כתוב בC++ (כי אין דרך פשוטה להתממשק אל הAPI המקומי מג'אווה) אבל קוד הג'אווה הספציפי לחלונות פשוט מאוד.
מכיוון שהרבה יותר קל לכתוב ולדבג קוד ג'אווה מאשר קוד C++, המימוש ללינוקס היה הרבה יותר יציב מזה של חלונות – שנטה להתרסק או להתקע לעיתים נדירות בכל מני סיטואציות שלא הצלחתי לשחזר.
לפני כמספר שבועות פנה אלי משתמש של הספריה, והציע שאני אפתור בתשלום את הבאגים בגרסאת החלונות.
לאחר משא ומתן קצר הסכמנו על $100, וניסיתי את מזלי.
זה היה די קשה, אבל לבסוף הצלחתי לתקן את הבאגים החמקמקים, ובנוסף לשפר את הביצועים של הספריה כך שלא תפספס אירועים גם על מחשבים חלשים.
אחרי שכמות השעות ההשקעתי בעניין עברה את מה שנראה לי מוצדק בעבור $100 הסכמנו גם להגדיל את הסכום ל$250 והיום שחררתי את הגרסא המתוקנת
$250 זה לא סכום שבאמת מכסה את כמות השעות שהשקעתי בתיקון הבאגים (אם הייתי לוקח סכום סביר לשעה), אבל זה בכל זאת פרוייקט קוד פתוח ואני מרוצה שתיקנתי את הבאגים האלו.
נודע לי מאותו משתמש שמישהו ביצע fork לספריה והוסיף לה תמיכה בMac.
פניתי אליו ונראה שהוא יצטרף לפרוייקט וישלב את התוספת שלו בקוד (שנכתב כך שיהיה קל מאוד להוסיף תמיכה במערכות הפעלה חדשות), ואולי גם יעזור עם באגים אחרים.
JNotify התעורר.
ב-C# החיים יותר קלים, אפשר להשתמש באובייקט FileSystemWatcher שיש לו ממשק נוח:
http://msdn.microsoft.com/en-us/library/system.io.filesystemwatcher(VS.85).aspx
גם בג'אווה, מאוד קלים – פשוט משתמשים בJNotify 🙂
מהמידע והתוכן הכלול במאמרך ניתן להכיר את הספריה, אך לא להנות מהשימוש בה, פשוט כי אין במאמר זה קישור להורדת הקוד…
לנוחות המחפשים הנוכחים והעתידיים, אני מצרף את הקישור להורדה, אליו הגעתי דרך הקישור למאמרך הקודם בנושא זה: http://sourceforge.net/projects/jnotify/?315
עדכנתי את הלינק, תודה.
נראה שבג'אווה 7 תהיה תמיכה בקבלת הודעות על שנויים במערכת הקבצים (באמצעות המחלקה java.nio.file.WatchService).
שחר, זה נכון – אבל:
1. לא ברור מתי תצא ג'אווה 7 (ועם הסיפור של אורקל, לא ברור שהיא תצא בכלל).
2. אל תתפוס אותי במילה, אבל אני חושב שWatchService לא יתמוך בהאזנה ריקורסיבית על ספריות.
עמרי, זה מרשים מאוד.
יש לי הצעה: למה שלא תכין תוכנית "Hello World" פשוטה המדגימה את הספרייה? למשל תוכנית עם מסך פשוט (אפילו console application) שמספקים לו ספרייה כארגומנט, ואז כל פעם שנכתב קובץ לספרייה יופיע "נוצר הקובץ X", או "שונה הקובץ X", או "נמחק הקובץ X בספרייה Y" וכ'.
אין טוב ממראה עיניים, וזה גם מאפשר להבין מייד איך אפשר לעשות שימוש בספרייה. זה הופך את כל העניין להרבה יותר ברור וגם "שוויק" (כלומר ניתן לשיווק, גם במובן האופן סורסי של המילה).
מה דעתך?
יונתן, רעיון טוב, רק שכבר עשיתי את זה, רק צריך לעדכן את התיעוד.
אתה יכול להריץ את הספריה ככה:
java -Djava.library.path=. -cp jnotify-0.91.jar net.contentobjects.jnotify.JNotify [DIR]
זה יעקוב אחרי השינויים לDIR ויציג אותם (או הספריה הנוכחית אם DIR לא מוגדר).
תודה עמרי, אני אבדוק את זה.
אה, עוד משהו: אני חושב שהמקום הכי טוב לציין איך רואים דוגמת ה- Hello World הוא קובץ ה- README, כי אני מניח שזה הקובץ הראשון שאנשים קוראים (או אמורים לקרוא בכל אופן). אתה יכול להכין קובץ בשם Example.txt ולהפנות אליו בקוץ ה- README.
(ואני מניח שזה שלא ראיתי את הדוגמא אכן מעיד שלא חקרתי מספיק את הקבצים).
לא, כמו שאמרתי – רק צריך לעדכן את התיעוד.
קובץ הREADME בCVS כבר מכיל את הדוגמא, וזה יכנס בגרסא הבאה (שתכלול גם תמיכה במק וכנראה גם תמיכה בJVM שרץ ב64 ביט על חלונות).
אוקיי.