ZmanimCLI, ועל דבר יפה (!) שיש בג'אווה
בעבר כתבתי ממשק קטן לספריית חישוב זמני היום ההלכתיים של KosherJava .
אחד הדברים ששיגע אותי, הוא שהספרייה כולה כתובה בג'אווה, וממילא גם כתיבת ה Gui הוכרחה להיות בג'אווה. וזאת שפה מוזרה… (שלא לדבר על שאר החסרונות שלה, בפרט המהירות).
אלא שממש במקרה עליתי על תכונה מגניבה (לפעמים יש כאלה) של ג'אווה, שמאפשרת לפתור במידה מסויימת את הבעייה הזאת.
מסתבר שלג'אווה (טוב, לא רק לג'אווה, גם לג'אווה) יש תכונה שנקראת Reflection , שמאפשרת, בין השאר, למצוא בזמן ריצה (!), פונקצייה לפי השם שלה בלבד.
זה כמובן מסובך מאוד בכל שפה מתקמפלת, אבל מאחר וג'אווה רצה על VM, זה קיים, ואפילו שימושי.
אז מה זה נותן לנו?
עכשיו שאפשר לקרוא לפונקצייה ע"פ שמה בלבד, אפשר לכתוב wrapper (איך מתרגמים את זה?) קטנטן שיקבל את שם הפונקציה, משורת הפקודה למשל, ויריץ אותה.
ואכן, זה מה שיצא:
moshe@debian:~/Desktop$ java -jar ZmanimCLI.jar
Usage: ZmanimCLI [options] [Time]
Options:
-d --date [yyyy/mm/dd] Set date. (Year first!)
-lat --latitude [latitude] Set location's latitude
-lon --longitude [longitude] Set location's longitude
-e --elevation [elevation] Set location's
elevation; Positive only
-tz --timezone [timezone] Set location's TimeZone
Help:
-h --help Show this help
-stl --time-list Show common available
times to display
-ftl --full-time-list Show all available
times to display
-tzl --timezone-list Show available timezones
Exapmle:
ZmanimCLI --latitude 31.7780 --longitude 35.235149 --elevation
600 --timezone Israel Sunrise
Will show the sunrise time today in Jerusalem
ובפועל:
moshe@debian:~/Desktop$ java -jar ZmanimCLI.jar sunrise
6:10:28
moshe@debian:~/Desktop$ java -jar ZmanimCLI.jar --date 2010/08/12 tzais72
20:38:15
וכמובן שעכשיו אפשר גם להשתולל יותר,
moshe@debian:~/Desktop$ java -jar ZmanimCLI.jar sunrise -d `date -d "next sunday" +%Y/%m/%d`
6:12:57
וזה כמובן מוביל אותנו למה שבאמת חשוב לי -
עכשיו, סוף סוף, (אמנם בעזרת הרצת תוכנה חיצונית, אבל עדיין), אפשר לקבל את הזמן הרצוי – מכל שפה!
Qt Creator, here I come!
( ולמי שרוצה את התוכנה, או חלילה לראות את הקוד
התוכנה: http://www.sendspace.com/file/02eho4
הקוד: http://www.sendspace.com/file/jscimp )
מה לגבי לעשות פורט של הקוד מ-Java ל-C או משהו קצת פחות כבד? זה גם יאפשר לך לעשות ממשק לכל שפה אחרת שאתה רוצה.
קפלן
ליאור: משה מתבסס על הספריה "זמנים" שכתובה בג'אווה ולכן כתב את הממשק בג'אווה.
נ.ב. יש ספריה לזמני היום ב C. היא נמצאת במאגרים של דביאן, ויש לה ממשקים ל פסקל, פיתון, רובי, php , Cpp …
"מסתבר שלג’אווה יש תכונה שנקראת Reflection , שמאפשרת, בין השאר, למצוא בזמן ריצה (!), פונקצייה לפי השם שלה בלבד.
זה כמובן בלתי אפשרי לחלוטין בכל שפה נורמלית, אבל מאחר וג’אווה היא ממש לא כזאת…"
הממ, תגדיר "שפה נורמלית". תכונות כאלה מובנות ברוב השפות הנפוצות ב־10-15 שנים האחרונות, וקיימות בצורה מוגבלת (דרך ספריות, והרבה פעמים עם מגבלות על הפונקציות שאפשר למצוא) אפילו ב־C.
ליאור:
זה בדיוק מה שרציתי להמנע ממנו. הרעיון היה לעקוף את הבעייה בצורה אלגנטית, ולדעתי זו דרך די חביבה.
קובי:
אתה מדבר על libhdate? אל תתביש, מותר לך לפרסם את זה כאן…
בכל מקרה, וכבר דיברתי איתך על זה בעבר – הייתי זקוק לשיטות שלא היו בנמצא ב libhdate.
Zmnaim נותן המון המון שיטות. אתה מוזמן להריץ את ZmanimCLI עם הדגל -ftl ולראות בעצמך.
שי:
אני דיברתי פשוט על שפות מתקמפלות. אולי לא היה כדאי להשתמש בביטוי "שפה נורמלית" כדי לא לעצבן אנשים… (ובאמת שאין לי משהו נגד שפות לא מתקמפלות).
כן, זה גם בשפות מתקמפלות — #C וכל שפות Net., פסקל מודרנית, פייתון (היא מתקמפלת ל־bytecode, בדיוק כמו Java), כמובן כל השפות שמתקמפלות ל־JVM, וכמו שאמרתי, דרך ספריות, אפילו C.
זו לא תכונה יוצאת דופן.
השפות האלה לא בדיוק מתקמפלות. עד כמה שאני יודע, הם כולם (חוץ מפסקל שאני לא מכיר), צריכות רמה כלשהי של מתווך, או VM, בשביל להריץ אותם. גם ה bytecode לא רץ לבד.
לא יודע איך הספרייה שעושה את זה ל c עובדת, אני אנסה להציץ. בכל מקרה, אני מניח שזה מימוש שונה מאוד מאשר הצורה הטבעית כמעט בה זה קורה בשפות VM.
אבל צודק, הניסוח שלי באמת היה לא נכון, זה בוודא לא "לא אפשרי" בשאר השפות.
תיקנתי
אגב, יש ספריה פשוטה ב־C שנקראת libhdate . ניסית להשתמש בה?
אכן. בעבר הרחוק אפילו כתבתי widget לסופר קרמבה (למי שזוכר מה זה) שעבד איתה.
( לחובבי הנוסטלגיה: http://kde-look.org/content/show.php?content=15826 )
אמנם שם לא התעסקתי עם הזמנים, אבל שמעתי מקובי שהם קיימים.
אבל, כפי שעניתי לו (רק שלוש תגובות מעליך) – זה לא הספיק לי. zmanim נותן הרבה יותר שיטות, בהבדל של סדר גודל.
אתה מוזמן להריץ את ZmanimCLI עם הדגל -ftl ולהשוות למה ש libhdate נותן.
משה
אצלי במערכת:
$ apt-cache search hdate
hdate-applet – Hebrew calendar applet
libhdate-dev – A library that help use hebrew dates
libhdate-perl – A library that help use hebrew dates
libhdate-python – A library that help use hebrew dates
libhdate1 – A library that help use hebrew dates
[...] לי כמובן להתבסס על libhdate, ואת הזמנים הוצאתי בדרך שתוארה כאן. לא מהיר – אבל עובד בסדר [...]