N המלכות

חידה נפוצה בשיעורי הבית של תלמידי קורסים לבינה מלאכותית היא:
בהנתן לוח בגודל NxN, יש לסדר N מלכות כך שאף אחת לא מאיימת על השניה.
כמובן שאני כותב על זה כי קיבלתי את השאלה הזו בשיעורי הבית שלי בקורס מבוא לבינה מלאכותית.
האלגוריתם שפותר את החידה בצורה יעילה הוא אלגוריתם אקראי חמדני:
מכיון שיש N עמודות, וN מלכות, ברור שיש מלכה בכל עמודה.
אז נשים בכל עמודה מלכה, אבל צריך לבחור גם את השורה.
הרעיון הוא להגריל את השורות בהתחלה, ואז בכל סיבוב להזיז מלכה אחת למקום שמקטין הכי הרבה את מספר המלכות המאויימות.
כך בכל סיבוב מספר המלכות המאויימות קטן, עד שמגיעים ל0, או שמגיעים למצב שבו אי אפשר לשפר יותר – כי התחלנו לא טוב, ואז מתחילים מחדש, מגרילים מספרים וחוזר חלילה, עד שהמלכות מסתדרות באורח פלא.

השאלה לא היתה שאלה אלגוריתמית אלא מימושית, האלגוריתם הוסבר בבהירות רבה בשאלה, ורק נשאר לבחור שפה ולממש.
בניגוד למטלה הקודמת, בה בחרתי בפרולוג לפתרון של סודוקו, מה שלמרבה הצער שרף הרבה זמן והביא לתוצאות מפוקפקות, הפעם החלטתי ללכת על שפת הבית – הרי היא ג'אווה.
תוך בערך שעה העסק היה די כתוב, חוץ מזה שהוא לא עבד – לפעמים האלגוריתם נתקע בלולאה אינסופית, ולפעמים פתר את הבעיה בקלות.
בהתחלה הדפסתי את הלוח למסוף הטקסט, אבל מהר מאוד הבנתי שככה לא נגיע רחוק:
מאוד קשה לזהות תבניות שחוזרות על עצמן כשהן מודפסות כטקסט, וגם קשה לראת אם המלכות מאיימות אחת על השניה באלכסון.
החלטתי לעשות את מה שאני עושה טוב, וכתבתי ממשק שמציג סימולציה של האלגוריתם בג'אווה, ובעזרתו מצאתי את הבאגים.
חשבתי לעצמי, אם כבר הגעתי לכאן, נשקיע עוד קצת ונהפוך את זה ליותר שימושי:
הפכתי את הישום לאפלט, מה שמאפשר להריץ אותו גם בדפדפן, והוספתי כמה כפתורים ששולטים על הסימולציה.
התוצאה לפניכם:
נסו לשחק עם זה, בכל פעם שהוא נתקע הרקע הופך לאדום והוא מגריל מחדש.
שימו לב שאפשר לפתור עם זה גם לוחות גדולים מאוד.
עוד דברים שכדאי לשים אליהם לב זה שיש בעיה עם לוחות קטנים (כמה קטנים?), ושכל פעם הוא נותן פתרון אחר כי ההתחלה אקראית.
האפלט כאן, הקוד כלול בפנים (מי שרוצה את הקוד, שישמור את הJAR ויפרוש אותו עם WinZip או תוכנת זיפ אחרת, הקוד בפנים).


קוד פתוח

החברה הקודמת בה עבדתי, סטארטפ קטן בשם Content Objects, נסגרה לפני כחודש.
אין פה חדש, סטרטאפים נסגרים, ככה זה, ובכל מקרה אני כבר לא הייתי שם כשזה קרה.
כשעבדתי שם, נזקקנו ליכולת לקבל ארועים על שנויים במערכת הקבצים של חלונות, לינוקס ואולי עוד מערכות הפעלה, מכיוון שלא מצאתי אף פרוייקט שמאפשר את היכולות האלו לישומי ג'אווה, שינסתי את הקומפיילר והתחלתי לכתוב, לא לפני שקיבלתי אישור מהמנכ"ל של החברה להשתמש בפרוייקט, שנקרא JNotify, כניסוי קטן:
החלטנו שהפרוייקט יהיה פרוייקט קוד פתוח, מהסיבות האלו:

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

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

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

גלגלן – הגרסא המהירה

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

גלגלן 2.0

שדרוג נוסף לגלגלן (מישהו יכול לבוא עם שם יותר טוב מזה?):
מעכשיו, הגלגלן יודע לקרוא קבצי OPML, שהם קבצי לינקים בפורמט XML שנמצאים בשימוש בגרגרן ובעוד אספני רסיסים.
בנוסף, מעכשיו יש חלון מידע (tooltip) בכל אחד מהלינקים (העכבר צריך לצוף פרק זמן מסויים מעל הלינק) שמכיל את השם והתאור של הבלוג (אם יש).
מה שטוב בשיטה החדשה היא שמופעים שם בלוגים שנמצאים בגרגרן שלי, ולכן כולם (רובם) הם בלוגים חיים שאני באמת קורא על בסיס קבוע, כמו כן, בלוגים חדשים שאני אוסיף לגרגרן יופיעו אוטומטית בגלגלן הקישורים.
אני מזכיר שהגלגלן והקוד שלו משוחרר תחת רשיון חופשי (בחרתי ברשיון BSD), וכולם יכולים להשתמש בו בצורה חופשית לגמרי, כולל שינויים לקוד.
עוד מידע, וקישור לקוד, נמצא פה.
קרדיט הולך לפרוייקט NanoXML, על פרסר XML זעיר ועובד.

זה מה שצריך להוסיף לHTML כדי להציג את הגלגלן (בשינויים נדרשים, כמו לשנות את הcodebase לאתר שלכם).
שימו לב, מגבלות אבטחה על ישומוני ג'אווה לא חתומים מונעים מהגלגלן להתחבר לשרת אחר מזה שהוא בא ממנו.



וככה זה נראה:

עדכון של הגלגלן.

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

JNotify 0.7 שוחרר

שחררתי את JNotify 0.7 – ספריית ג'אווה שמאפשרת קבלת ארועים של שינויים במערכת הקבצים על מערכות חלונות ולינוקס (2.6.14 ומעלה).
ממשק התכנות (API) של JNotify הוא מאוד פשוט, ומתועד פה.

גלגלן בלוגים חדש.

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