פינגווין עם כיפה

ZmanimCLI, ועל דבר יפה (!) שיש בג'אווה

פורסם ב קוד פתוח ב moshewagner על ידי אוגוסט 27, 2009

בעבר כתבתי ממשק קטן לספריית חישוב זמני היום ההלכתיים של 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 )

10 תגובות

לקבלת עדכונים לתגובות באמצעות RSS.

  1. ליאור קפלן said, on אוגוסט 27, 2009 at 8:39 pm

    מה לגבי לעשות פורט של הקוד מ-Java ל-C או משהו קצת פחות כבד? זה גם יאפשר לך לעשות ממשק לכל שפה אחרת שאתה רוצה.

    קפלן

    • קובי said, on אוגוסט 28, 2009 at 8:46 am

      ליאור: משה מתבסס על הספריה "זמנים" שכתובה בג'אווה ולכן כתב את הממשק בג'אווה.

      נ.ב. יש ספריה לזמני היום ב C. היא נמצאת במאגרים של דביאן, ויש לה ממשקים ל פסקל, פיתון, רובי, php , Cpp …

  2. Shai said, on אוגוסט 28, 2009 at 2:00 am

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

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

  3. moshewagner said, on אוגוסט 28, 2009 at 10:03 am

    ליאור:
    זה בדיוק מה שרציתי להמנע ממנו. הרעיון היה לעקוף את הבעייה בצורה אלגנטית, ולדעתי זו דרך די חביבה.

    קובי:
    אתה מדבר על libhdate? אל תתביש, מותר לך לפרסם את זה כאן…

    בכל מקרה, וכבר דיברתי איתך על זה בעבר – הייתי זקוק לשיטות שלא היו בנמצא ב libhdate.

    Zmnaim נותן המון המון שיטות. אתה מוזמן להריץ את ZmanimCLI עם הדגל -ftl ולראות בעצמך.

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

  4. Shai said, on אוגוסט 28, 2009 at 12:27 pm

    כן, זה גם בשפות מתקמפלות — #C וכל שפות Net., פסקל מודרנית, פייתון (היא מתקמפלת ל־bytecode, בדיוק כמו Java), כמובן כל השפות שמתקמפלות ל־JVM, וכמו שאמרתי, דרך ספריות, אפילו C.

    זו לא תכונה יוצאת דופן.

  5. moshewagner said, on אוגוסט 28, 2009 at 1:00 pm

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

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

    אבל צודק, הניסוח שלי באמת היה לא נכון, זה בוודא לא "לא אפשרי" בשאר השפות.
    תיקנתי :-)

  6. Tzafrir Cohen said, on אוגוסט 28, 2009 at 10:35 pm

    אגב, יש ספריה פשוטה ב־C שנקראת libhdate . ניסית להשתמש בה?

    • moshewagner said, on אוגוסט 29, 2009 at 8:53 pm

      אכן. בעבר הרחוק אפילו כתבתי widget לסופר קרמבה (למי שזוכר מה זה) שעבד איתה.
      ( לחובבי הנוסטלגיה: http://kde-look.org/content/show.php?content=15826 )

      אמנם שם לא התעסקתי עם הזמנים, אבל שמעתי מקובי שהם קיימים.

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

      אתה מוזמן להריץ את ZmanimCLI עם הדגל -ftl ולהשוות למה ש libhdate נותן.

      משה

  7. Tzafrir Cohen said, on אוגוסט 28, 2009 at 10:36 pm

    אצלי במערכת:

    $ 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

  8. [...] לי כמובן להתבסס על libhdate, ואת הזמנים הוצאתי בדרך שתוארה כאן. לא מהיר – אבל עובד בסדר [...]


להגיב

Fill in your details below or click an icon to log in:

WordPress.com Logo

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

Twitter picture

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

Facebook photo

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

Connecting to %s

Follow

Get every new post delivered to your Inbox.