חטאי אימפריה סולרית

אחד המשחקים עם השם הכי פיוטיים שנתקלתי בהם לאחרונה הוא Sins of a solar empire.
המשחק הוא משחק אסטרטגית חלל בזמן אמת, דו מימדי בפועל (כל העצמים נמצאים על אותו מישור) אבל תלת מימדי מבחינת תצוגה.
בדומה למשחקי אסטרטגיית חלל כמו Master of orion, בונים אימפרייה חללית, חוקרים טכנולוגיות, בונים חלליות וכו'.
המשחק הוא בזמן אמת והתצוגה דומה לתצוגה של Homeworld (למרות שHomeworld הוא יותר תלת מימדי).
ובכל זאת הוא שונה מHomeworld מאוד. בHomeworld מה שמניע את העסק הוא הקרב עם האוייב בשלב הנוכחי והשלב הוא ממוקד וקטן יחסית.
בחטאים השלבים יכולים להיות גדולים מאוד, ומה שמניע את המשחק הוא הרצון לכבוש כוכבי לכת ואסטרואידים כמה שיותר מהר.
עוד הבדל מהותי מאוד הוא שHomeworld המשחק הוא בעיקר מונחה קמפיין עלילתי, ובחטאים אין קמפיין. בהתחלה חשבתי שזה חיסרון עצום, אבל אחרי ששיחקתי במשחק ראיתי שהוא מספיק טוב וממכר גם ככה.

המפה מחולקת לשמשות, ולכל שמש כוכבי לכת.
ספינות חלל קופצות מכוכב לכת לכוכב לכת, במסלולים מוגדרים מראש (לכל פלנאטה יש 'שכנים').
star.jpg
לכל פלאנטה יש באר כבידה, כדי לקפוץ החוצה צריך לצאת ממנה (אפשר לראות בתמונה את באר הכבידה מסומנת במעגל בהיר)
sins-well-thumb.jpg

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

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

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

סך הכל, חטאי אימפריה סולרית הוא אחלה משחק.
קניתי אותו כדי לתמוך בסטארדוק (שפיתחו בעבר את Galactic civilization הזכור לטובה).

כדי לחסוך לי איתחולים לחלונות משחקים שלי, קניתי מנוי שנתי לCedega ב45$ – מחיר של משחק בודד.
Cedega מאפשר לי להריץ את Sins, ועוד הרבה משחקים ישירות על הלינוקס.
התמיכה לא מושלמת, אבל טובה מספיק כדי שהמשחק יהיה מהנה מאוד.
רוב התצלומי מסך פה נלקחו מSins שרץ על לינוקס :).

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

IP2C 2.0.0

שחררתי גרסא חדשה של IP2C, מהירה מתמיד וגם תומכת בבסיס הנתונים של Software77.

[code]
All tests done on an Intel(R) Core(TM)2 Duo CPU E8400 @ 3.00GH
PHP:

* No cache: 5000 searches/sec (Fast startup, slow query)
* Memory cache: : 5700 searches/sec (Slow startup, fastest query)

Java:

* No cache: 13900 searches/second. (Fast startup, slow query)
* Memory mapped file: 265k searches/second. (Fast startup, fast query)
* Memory cache: 281k searches/second. (Slow startup, fastest query)
[/code]

זבלן הלוגים

לתשומת לב הנוסעים צפונה:
שלשום השרת שלי בסלון נתקע, רסטרטי אותו, וקיבלתי הודעות שגיאה על חוסר מקום.
מחיצת השורש שלו בגודל של 30 ג'יגה בלבד, אבל זה אמור להספיק כי אין לא כותב לשם שום דבר מיוחד.
מחקתי איזה 2 ג'יגה של קוד מספריית הsrc, (שזה קוד של כל מני דברים שהורדתי וקימפלתי בעבר) בתקווה לקנות כמה חודשים של שקט.
היום בבוקר, פוף, עוד פעם אין מקום.
הפעם החלטתי לרדת לעומק העניין..
הניחוש הראשון היה כמובן ספריית הלוגים של המערכת /var/log..
syslog תפס 2.6 ג'יגה, וdaemon.log תפס 6.4 ג'יגה.
נפח עצום, במיוחד למחיצה של 30GB, ובמיוחד לאור זה שהכל מהשבוע האחרון (logrotate כיון את daemon לפני שבוע, והוא היה קטן ונחמד).
בתוך daemon.log ראיתי ערמת הודעות כאלו:
[code]
Aug 29 10:36:46 home famd[3423]: fd 4 message length 1347375956 bytes exceeds max of 4136.
[/code]
נראה שfamd התחרפן קשות..
famd הוא File Alteration Monitor Daemon, פתרון וותיק למעקב אחרי שינויים בקבצים, ולא ממש נדרש בימינו כי inotify החליף אותו.
בכל אופן, אני בטוח לא צריך אותו, אז העפתי את הנבלה ואיפסתי את הלוגים.

ובא שלום וגואל, ומשיח על חמור שחור.

מיקרוסופט מפתחת את גוגל אנטיליטיקס

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

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

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

Antenna processor -> MTJ

הPreprocessror שפיתחתי במסגרת העבודה של בVollee, שנכלל בפרוייקט הקוד הפתוח אנטנה (פרוייקט שעוזר בפיתוח ובבניה של ישומי ג'אווה למכשירים סלולריים), אושר על ידי Eclipse Legal, ויכלל בMTJ.
MTJ הוא פרוייקט Eclipse רשמי שמטרתו להוסיף לEclipse תמיכה בפיתוח ישומי ג'אווה למכשירים סלולריים. כבר היום יש את EclipseME, פלאגין שפותח במשך שנים על ידי קרייג סטרה, שעושה את אותה עבודה – למעשה וקרייג עובד עם צוות MTJ, וMTJ מיועד להיות תחליף רשמי של EclipseME.
תהליך הקליטה של הPreprocessor לא היה קל:
הקוד המקורי הסתמך על ANTLR 2.7 (שמייצר אוטומטית קוד לפענוח קוד לפי הגדרה פורמלית – Parser generator) – הבעיה עם ANTLR 2.7 היתה שהרשיון שלו לא תאם את הרשיון של Eclipse (מסתבר שPublic domain זה לא תמיד טוב מספיק). למרבה המזל, ANTLR 3.0 כבר שוחרר ברשיון BSD שתאם את הרשיון של Eclipse, אבל הוא לא תאם את הקוד של הPreprocessor.
החב'רה בMTJ שאלו אם אני מוכן להמיר את הקוד כך שישתמש בANTLR 3.0: בינתיים עזבתי את Vollee ואת כל העולם של הפיתוח לסלולריים (בשעה טובה ומוצלחת) אז סירבתי, אבל אמרתי שאשמח לייעץ להם ולעזור מרחוק.
הם הרימו את הכפפה, וכמעט בלי עזרה מפתח אחד – דייגו סנדין – המיר את העסק לANTLR 3.0 תוך כשבועיים.
הזמן עבר, ולפני חודשיים צוות MTJ קיבל אישור למסור לי את הקוד, כדי שאקלוט אותו לתוך Antenna.
מכיוון שהקוד כלל בדיקות יחידה מקיפות, שדייגו הקפיד להשתמש בהן כדי לבדוק את ההמרה – התוצאה היתה טובה מאוד.
עוז זמן עבר, והיום הקוד קיבל אישור מEclipse Legal ויכנס לענף הראשי של MTJ.

יבוא SQL ישירות מתוך קוד ג'אווה

כשכותבים בדיקת יחידה (Unit test) לקוד שקשור לבסיס נתונים, צריך לאתחל את בסיס הנתונים לאיזה שהוא מצב ידוע ויציב לפני כל בדיקה.
מול MySQL, אפשר להשתמש בmysql עצמו כדי ליבא סקריפט SQL מוכן, אבל זה לא נחמד במיוחד:
צריך לפתוח תהליך חדש, ויש כל מני בעיות מעצבנות עם זה (בג'אווה למשל, חובה לקרוא את הפלט של התהליך, אחרת הוא יתקע בכתיבה לפלט הסטנדרטי כשיתמלא הבאפר).
הרבה יותר נחמד יהיה ליבא את הקובץ ישירות מתוך ג'אווה, בשימוש בJDBC, לא?
הנה קוד שעושה בדיוק את זה, הוא מקבל זרם קלט (InputStream) שיכול להיות כל דבר, וגם Connection JDBC שחיברתם מבעוד מועד, וקולט את הSQL לתוך בסיס הנתונים.
הקוד מתמודד עם הפלט הסטנדרטי של mysqldump.

[code lang="java"]
public static void importSQL(Connection conn, InputStream in) throws SQLException
{
Scanner s = new Scanner(in);
s.useDelimiter("(;(\r)?\n)|(–\n)");
Statement st = null;
try
{
st = conn.createStatement();
while (s.hasNext())
{
String line = s.next();
if (line.startsWith("/*!") && line.endsWith("*/"))
{
int i = line.indexOf(' ');
line = line.substring(i + 1, line.length() – " */".length());
}

if (line.trim().length() > 0)
{
st.execute(line);
}
}
}
finally
{
if (st != null) st.close();
}
}
[/code]

PHP4 מגיע לסוף החיים, אבל עדיין בשימוש של כ38% מהשרתים

שוחררה הגרסא האחרונה (ככל הנראה) בענף של PHP 4.4.
הגרסא הזו מסמנת את סוף התמיכה הרשמית בPHP4.
PHP5 כבר בחוץ במשך יותר משלוש שנים, אבל עד עכשיו האימוץ שלו היה די איטי, מסיבות של ביצה ודינוזאור:
מפתחי התוכנות לא רצו להפסיק לתמוך בPHP4 כדי לא לאבד משתמשים. חברות אירוח האתרים לא טרחו לשדרג כי כל התוכנות החשובות תמכו גם ככה בPHP4 והמשתמשים, מה איכפת להם?
בשנה שעברה נפתח אתר gophp5.org, ששם לעצמו למטרה לדחוף את האימוץ של PHP5.
הרעיון הוא שאם מסה מספיק גדולה של פרוייקטים תעבור לPHP5, ומסה מספיק גדולה של חברות אירוח תעבור לPHP5, לשאר חברות האירוח לא תהיה ברירה והן תאלצנה לשדרג או לאבד משתמשים, ואז לשאר הפרוייקטים לא תהיה סיבה להשאר בPHP4 והם יוכלו להתחיל סוף סוף לנצל את היכולות של PHP5.
בפברואר 2008 כבר היו מעל 100 פרוייקטי תוכנה שהתחייבו להפסיק לדאוג לתמיכה בPHP4 (זה לא אומר שהם ילכו וישברו את התמיכה בPHP4 בכוונה, פשוט שהם יפסיקו לדאוג שקוד חדש ירוץ בPHP4), ומעל 200 חברות איכסון שתומכות בPHP 5.2 כביררת מחדל וgophp5 טענו להצלחה והפסיקו לאסוף הרשמות.

אז למה לא לתמוך בPHP4? הנה דוגמא מאתמול:
JSON הוא דרך להעביר מבנה נתונים כלשהו לייצוג של מבנה הנתונים כאובייקט ג'אווה סקריפט, והוא אחת הדרכים הפשוטות והיעילות ביותר להעביר נתונים מקוד בצד השרת לדפדפן (שפשוט מפעיל על הטקסט שחוזר את המפסק (parser) של ג'אווה סקריפט כדי לקבל אובייקט מוכן לשימוש.
למרות שראשי התיבות של AJAX הן Asynchronous Javascript And XML, מעולם לא השתמשתי בAJAX כדי להעביר XML, למעשה אני מוצא את הרעיון מזעזע. הרבה יותר קל להעביר JSON, או אפילו קוד HTML ממש.
JSON משמש בהרבה מאוד פרוייקטים מבוססי AJAX, ומכיוון שאין בPHP4 תמיכה מובנית בJSON (אחרי הכל, PHP4 הוא בן שמונה, וJSON הוא די חדש בשכונה) צריך להשתמש בספריות חיצוניות שיודעות להעביר אובייקט PHP לפורמט JSON, אחת הספריות הנפוצות היא Services_JSON (למעשה אני משתמש בספריה הזו בFireStats).
הספריה כתובה בPHP, ולמרות שהיא עובדת נכון, היא לא ממש עובדת מהר, במיוחד כשממירים מבני נתונים גדולים (לא עצומים, משהו בסדר גודל של מערך עם 1000 אובייקטים טיפה מורכבים) לJSON.
ממש אתמול ניסיתי לשפר ביצועים של ישום PHP, אחרי חפירות גיליתי שאחד הדברים שמאטים מאוד את העסק היה המרה של תשובה לדפדפן לJSON בשימוש בServices_JSON, כשאני אומר איטי, אני מתכוון ל8 שניות.
שמונה שניות שהשרת טוחן את הCPU שלו כדי להכין תשובה ללקוח (במקרה הספציפי הזה, במקרים אחרים עם יותר נתונים זה כמובן יותר גרוע).
ברגע שראיתי את זה, לקח לי בדיוק שניה וחצי להיזכר שPHP5 תומך בJSON. בדיקה מהירה בphp.net הניבה את שתי הפונקציות הפשוטות json_encode וjson_decode. החלפתי את השימוש ב Services_JSON בקריאה לפונקציות של php5, ולא הייתי מופתע במיוחד לראות שהמרה של אותו מבנה נתונים לוקחת פתאום 40 מילישניות.
שיפור של פי 200, בזמן עבודה של כמה שניות (טוב, חוץ מלמצוא את הבעיה 🙂 )
השיפור נובע מכך שהתמיכה של PHP בJSON לא כתובה בPHP אלא בC, ולכן היא הרבה הרבה יותר יעילה.
השיפור הזה התאפשר רק כי הפרוייקט הספציפי הזה לא צריך לתמוך בPHP4.

מה אני אצטרך לעשות בFireStats, שעדיין תומך בPHP4 כדי להנות מהשיפור הזה? לבדוק אם אני על PHP5, ואם כן להשתמש בפונקציות האלו אחרת להשתמש בServices_JSON. לא כיף במיוחד.
ואם לא היתה לי סיפריה כמו Services_JSON (כי אין, או כי תנאי הרשיון לא מתאימים לי), הייתי נאלץ לכתוב אחת או פשוט לעבוד בצורה אחרת, פחות נוחה. גם לא כיף.

אז איך מתקדם האימוץ של PHP5?
החל מFireStats 1.3 ששחרתי לפני יותר משנה, FireStats מכילה רכיב ששולח (באישור המשתמש) מידע מערכת אנונימי. חלק מהמידע הוא גרסאות הPHP והMySQL.
הכוונה היא שאני אוכל להשתמש במידע הזה כדי להחליט בצורה יותר מושכלת במה אני צריך לתמוך.
המידע הצטבר לי בבסיס הנתונים, ונכון לכרגע יש לי מידע על כמעט 12000 התקנות. מה שאומר כמעט 12000 שרתים בעולים (אני מתעלם ממקרים של כמה התקנות על אותו שרת).
למי שתוהה, זה לא אומר שFireStats הותקנה 12000 פעמים, אלא ש12000 פעמים המתקינים הסכימו לשלוח מידע מערכת אנונימי.
מי שרוצה את המידע הגולמי מוזמן לקחת אותם מפה (יצוא MSQL, כ5 מגה דחוסים, 65 מגה פרושים).

אז ישבתי כמה שעות כדי להוציא מהנתונים הגולמיים שני גרפים נחמדים:
הראשון הוא אחוזי ההתקנות של PHP 4 מול PHP 5, במהלך השנה האחרונה.
למרות שאחוזי ההתקנה של PHP4 ירדו במהלך השנה האחרונה מ52% ל38%, עדיין מי אי אפשר להתעלם ממנו. נקווה שהוא ימות סופית בקרוב:
installed php versions
השני הוא אחוזי ההתקנות של הגרסאות המשמעותיות של MYSQL:

כיף לראות שMYSQL 5.0 שולט בשוק, אבל נראה שMYSQL 4.0 הזוועתי נתקע על 7% ולא רוצה למות.
בכל מקרה, MYSQL 4.0 הוא בהחלט מועמד לנטישה, וכבר היום יש לא מעט תכונות חשובות של FireStats שלא נתמכות בגרסא הזו.
installed mysql versions

משתמש תרם שיפורי ביצועים משמעותיים לIP2C

אם יש משהו שאני אוהב בפרוייקטי קוד פתוח, זה שאנשים מוכנים לפעמים לעבוד די קשה כדי לשפר אותם.
את IP2C, ספריה למציאת המדינה של כתובת IP שחררתי לפני כמעט שנתיים, וכתבתי גם פוסט שמספר על המימוש שלה פה.
IP2C ממומשת בPHP ובג'אווה. מה שמיוחד בה זה שהיא מסוגלת לחפש ישירות על הקובץ, מה שאומר שחיפוש בודד הוא מאוד מהיר כי לא צריך להעלות את כל הקובץ לזכרון.
הייתי לגמרי מרוצה מהביצועים של הספריה בPHP (כ1200 חיפושים בשניה במחשב האחרון שמדדתי), אבל הביצועים בג'אווה היו טובים יותר משמעותית – כ8000 חיפושים בשניה על אותו מחשב בעבודה ישירות על קובץ הנתונים.
ההבדל בביצועים בין PHP לג'אווה לא הטריד אותי, כי היה לי ברור שPHP תהיה יותר איטית מג'אווה, אבל הוא כן הטריד את תומס רומר שהתיישב על העסק לילה שלם ושיפור את הביצועים של גרסאת הPHP ב150%.
תומס כתב פוסט מעניין על השינויים שהוא עשה, ושלח לי את השינויים. שבמבט ראשון נראים טובים ואני אקלוט אותם לפרוייקט אחרי בדיקה מעמיקה יותר.

בנוסף דיברנו קצת בIRC, והוא יעבוד על תמיכה בבסיס הנתונים של software77 :
software77 מספקים בסיס נתונים של IP למדינה, שאמור להיות יותר איכותי מבסיס הנתונים שIP2C משתמשת בו כרגע (webhosting.info), אבל יש להם קצת בעיות בעקביות המידע.
התחלתי לעבוד על תמיכה בבסיס הנתונים שלהם לפני כמה חודשים טובים, אבל כשראיתי שזה נמשך יותר מדי הקפאתי את העסק (שעדיין נמצא בTODO שלי, קבור איפשהו 🙂 )
תומס ימשיך מאיפה שהפסקתי.

חולץ מאגר תגובות חבוי

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