ארכיון עבור הקטגוריה FireStats
שוחררה הגרסא האחרונה (ככל הנראה) בענף של 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%, עדיין מי אי אפשר להתעלם ממנו. נקווה שהוא ימות סופית בקרוב:

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

7 תגובות »
אם יש משהו שאני אוהב בפרוייקטי קוד פתוח, זה שאנשים מוכנים לפעמים לעבוד די קשה כדי לשפר אותם.
את IP2C, ספריה למציאת המדינה של כתובת IP שחררתי לפני כמעט שנתיים, וכתבתי גם פוסט שמספר על המימוש שלה פה.
IP2C ממומשת בPHP ובג’אווה. מה שמיוחד בה זה שהיא מסוגלת לחפש ישירות על הקובץ, מה שאומר שחיפוש בודד הוא מאוד מהיר כי לא צריך להעלות את כל הקובץ לזכרון.
הייתי לגמרי מרוצה מהביצועים של הספריה בPHP (כ1200 חיפושים בשניה במחשב האחרון שמדדתי), אבל הביצועים בג’אווה היו טובים יותר משמעותית - כ8000 חיפושים בשניה על אותו מחשב בעבודה ישירות על קובץ הנתונים.
ההבדל בביצועים בין PHP לג’אווה לא הטריד אותי, כי היה לי ברור שPHP תהיה יותר איטית מג’אווה, אבל הוא כן הטריד את תומס רומר שהתיישב על העסק לילה שלם ושיפור את הביצועים של גרסאת הPHP ב150%.
תומס כתב פוסט מעניין על השינויים שהוא עשה, ושלח לי את השינויים. שבמבט ראשון נראים טובים ואני אקלוט אותם לפרוייקט אחרי בדיקה מעמיקה יותר.
בנוסף דיברנו קצת בIRC, והוא יעבוד על תמיכה בבסיס הנתונים של software77 :
software77 מספקים בסיס נתונים של IP למדינה, שאמור להיות יותר איכותי מבסיס הנתונים שIP2C משתמשת בו כרגע (webhosting.info), אבל יש להם קצת בעיות בעקביות המידע.
התחלתי לעבוד על תמיכה בבסיס הנתונים שלהם לפני כמה חודשים טובים, אבל כשראיתי שזה נמשך יותר מדי הקפאתי את העסק (שעדיין נמצא בTODO שלי, קבור איפשהו )
תומס ימשיך מאיפה שהפסקתי.
אין תגובות »
נכתב על ידי עמרי בנושא FireStats
בשעה טובה, פיירסטטס 1.5 הגיע לגרסא יציבה עם השחרור של 1.5.11-stable.
שדרגו בהמוניכם 
2 תגובות »
נכתב על ידי עמרי בנושא FireStats, תכנות
לפני כמה שבועות פרסמתי פוסט על אופטימיזציות.
הנה ההמשך.
דוגמא מעשית, שיפור ביצועים של שאילתות בFireStats (לגרסא 1.6)
מנגנון מקובל לשיפור ביצועים הוא מטמון (cache). הרעיון פשוט : בפעם הראשונה ששואלים אותנו משהו אנחנו מחשבים אותו וזוכרים את התוצאה. בפעם השניה אנחנו משתמשים בתוצאה שחישבנו קודם.
כשבודקים ביצועים, חשוב לוודא שהבדיקה נותנת תוצאות זהות בשתי הרצות שונות. במקרים רבים יש מנגנוני מטמון יגרמו לבדיקה לרוץ הרבה יותר מהר בפעם השניה, ובדרך כלל הם רק מפריעים בסיטואציות של בדיקת ביצועים כי אנחנו רוצים למדוד את השיפור שנובע מהקוד שלנו, ולא מזה שהCache הכיל את התוצאה שכבר חישבנו בהרצה הראשונה.
דוגמא לכך היא הCache של MySQL: ההרצה השניה של שאילת תמיד תהיה הרבה יותר מהירה מההרצה הראשונה, כי MySQL זוכר את התוצאות מהפעם הראשונה ואם שום דבר בנתונים לא השתנה הוא פשוט מחזיר את אותה תוצאה.
כדי לבטל את אותו Cache, אפשר להשתמש בפקודת הMySQL:
SET GLOBAL query_cache_size = 0;
FireStats תומך בגרסאות MySQL ממשפחת 4.0, 4.1 ו5.0, כאשר ההבדל בין 4.0 ל4.1 כל כך משמעותי שיש שאילתות בFireStats שכתובות אחרת לכל אחת מהגרסאות.
נסיון לשיפור ביצועים, במיוחד כזה שמבוסס על שינויים בסכמת הנתונים יצריך שינויים בקוד שמטפל ב4.0 ובקוד של 4.1, לכן כדאי לבדוק שהכל עובד על השרת הרלוונטי. בנוסף, מכיוון שרוב (60%) משתמשי FireStats עובדים עם MySQL 5.X, כדי גם לבדוק את השיפור על השרת הזה.
כדי לבצע את זה, הרמתי שלושה שרתי MySQL, נציג אחד מכל משפחת גרסאות, והכנסתי לכל שרת חבילת נתונים די כבדה (וזהה בין השרתים) שמבוססים על סטטיסטיקות מהשרת שלי.
ובכל אחד מהשרתים ביטלתי את מטמון השאילתות (query_cache_size).
יצרתי טבלא בגנומטיק (כמו אקסל), שנראית ככה (תת טבלא כזו לכל בדיקה שאני רוצה)

נניח שהפונקציה שאני רוצה לשפר היא:
function foo()
{
$sql = “SELECT * from …”;
return query($sql);
}
קודם כל הכפלתי את הקוד והוספתי הדפסה של שאילת הSQL שנשלחת לשרת:
function foo ()
{
if (true) // old code
{
$sql = “SELECT * from …”;
echo $sql; return;
return query ($sql);
}else{
$sql = “SELECT * from …”;
echo $sql; return;
return query ($sql);
}
}
מכאן זו היתה שיטת העבודה:
1. הרצה של הקוד במצב הישן.
2. העתקה של השאילתה שהודפסה, והרצה שלה ישירות על כל אחד משלושת בסיסי הנהנתונים. ושמירה של הזמן שנדרש בטבלא מסודרת.
3. מעבר למצב חדש (פשוט לשנות את הfalse לtrue בראש הפונקציה), אופטימיזציה של השאילתה וחזרה על הבדיקה מול כל אחד מהשרתים, ושוב שמירה של התוצאות בטבלא, הפעם בעמודה של תוצאות אחרי אופטימיזציה.
העבודה השיטתית עזרה לי לא לשכוח דברים תוך כדי, ולוודא שאכן שיפרתי את התוצאות לפני שאני רץ להכניס את הקוד למערכת.
בנוסף, מכיוון שגם הקוד החדש וגם הישן היו לי מול העיניים, יכלתי לוודא שהם עושים בדיוק את אותו דבר.
חשוב לשים לב שלא ערבבתי אופטימיזציה של קוד הPHP עם שאילות הMYSQL. זה מבלבל מספיק גם ככה.
אז מה בעצם עשיתי?
פיירסטטס תומך בכמה אתרים בו זמנית, ולכן יש בו מזהה אתר. בהתחלה שמרתי את מזהה האתר בטבלאת הכניסות, בשלב מסויים הבנתי שאני צריך מזהה אתר גם בטבלאת הכתובות (URLים), כי הרי כל URL שיך לכל היותר לאתר אחד.
אז הוספתי את העמודה, אבל שכחתי למחוק את העמודה מטבלאת הכניסות.
מצב כזה של כפילות נתונים הוא לא מומלץ לפי הגישה המקובלת בתכנון בסיסי נתונים, כי הוא מאפשר מצבים של חוסר עקביות במידע.
באחת הגרסאות האחרונות של פיירסטטס תיקנתי את המעוות: הסרתי את העמודה מטבלאת הכניסות ותיקנתי את כל הקוד שהושפע מזה לבצע join עם טבלאת הכתובות כשהוא צריך גישה לאתר.
על פניו הדבר הנכון לעשות: אבל זה יצר בעיה חדשה:
כמעט כל השאילתות דרשו עכשיו join נוסף. עבור משתמשים עם בסיסי נתונים קטנים (נניח עד חצי מליון כניסות בטבלאת הכניסות ועד 50 אלף כתובות בטבלאת העסק עבד סביר, אבל עבור משתמשים עם בסיסי נתונים גדולים יותר העומס על השרת התחיל לגדול בצורה חדה ככל שנפח הנתונים עלה.
הפתרון שלי הוא לחזור בי מהדבר “הנכון” שעשתי קודם, כלומר להחזיר את עמודת הsite_id לטבלאת הכניסות, שתשמש לצרכי פילטור בזמן השאילות כדי להמנע מהjoin עם טבלאת הכתובות.
שיפור נוסף נבע משינוי מבני של השאילות ככה שיעבדו בצורה יותר יעילה.
כדי לעשות את זה, חשוב להבין מה עושה בסיס הנתונים כדי לחשב את השאילתה.
לשם כך אפשר להשתמש בפקודה explain, שמחזירה תיאור של האסטרטגיה שבה בסיס הנתונים יחשב את התוצאות.
explain מחזיר תוצאות די קריפטיות, לא משהו שתבינו בלי לקרוא את התיעוד.
בכך מקרה, חשוב לשים לב לעובדות הבאות:
בכל שלב, MySQL משתמש באינדקס אחד בלבד לכל היותר (אם יש אינדקס מתאים). ככל שהאינדקס יהיה יותר ספציפי ככה הביצועים יכולים להיות טובים יותר.
(יתכן שגרסאות עתידיות של MySQL ידעו להשתמש בכמה אינדקסים בשלב, אבל לדעתי זה עדיין לא פה).
ככה נראית הטבלא שלי אחרי שמילאתי אותה:
| Query name |
MySQL Version |
4.0.17 |
4.1 |
5.0.51 |
|
| Num page views for all hits in site=1 |
Original query time sec |
1.20 |
0.93 |
0.84 |
| Optimized query time sec |
0.10 |
0.06 |
0.06 |
|
| Improvement % |
91.67% |
93.55% |
92.86% |
|
|
|
|
|
|
|
| Num page views for all hits in all sites |
Original query time sec |
1.17 |
0.91 |
0.84 |
|
| Optimized query time sec |
0.11 |
0.08 |
0.08 |
|
| Improvement % |
90.60% |
91.21% |
90.48% |
|
|
|
|
|
|
|
| Num page views for for last last 14 days for all sites |
Original query time sec |
0.19 |
0.16 |
0.16 |
|
| Optimized query time sec |
0.12 |
0.09 |
0.11 |
|
| Improvement % |
36.84% |
43.75% |
31.25% |
|
|
|
|
|
|
|
| Num all unique visitors for site_id = 1 |
Original query time sec |
2.93 |
1.24 |
1.13 |
|
| Optimized query time sec |
1.75 |
0.68 |
0.72 |
|
| Improvement % |
40.27% |
45.16% |
36.28% |
|
|
|
|
|
|
|
| Num all unique visitors for all sites |
Original query time sec |
2.09 |
1.24 |
1.15 |
|
| Optimized query time sec |
1.26 |
0.47 |
0.47 |
|
| Improvement % |
39.71% |
62.10% |
59.13% |
|
|
|
|
|
|
|
| Num unique visitors for last 14 days for all sites |
Original query time sec |
0.32 |
0.18 |
0.18 |
|
| Optimized query time sec |
0.28 |
0.16 |
0.15 |
|
| Improvement % |
12.50% |
11.11% |
16.67% |
|
|
|
|
|
|
|
| Recent referrers for all sites |
Original query time sec |
2.54 |
3.01 |
3.01 |
|
| Optimized query time sec |
2.30 |
1.54 |
1.78 |
|
| Improvement % |
9.45% |
48.84% |
40.86% |
|
|
|
|
|
|
|
| Recent referrers for site_id = 1 |
Original query time sec |
2.48 |
2.71 |
2.76 |
|
| Optimized query time sec |
2.65 |
1.65 |
1.90 |
|
| Improvement % |
−6.85% |
39.11% |
31.16% |
|
|
|
|
|
|
|
| Search terms for site_id = 1 |
Original query time sec |
1.67 |
2.14 |
2.75 |
|
| Optimized query time sec |
1.67 |
0.84 |
0.91 |
|
| Improvement % |
Not optimized |
60.75% |
66.91% |
|
|
|
|
|
|
|
| Popular pages (all) |
Original query time sec |
1.88 |
4.67 |
4.80 |
|
| Optimized query time sec |
- |
1.73 |
1.96 |
|
| Improvement % |
Not optimized |
62.96% |
59.17% |
|
|
|
|
|
|
|
| Popular pages (site_id = 1) |
Original query time sec |
1.93 |
4.07 |
4.09 |
|
| Optimized query time sec |
- |
1.88 |
2.11 |
|
| Improvement % |
Not optimized |
53.81% |
48.41% |
|
|
|
|
|
|
|
| get questagents (180 days, site_id = 1) |
Original query time sec |
6.89 |
2.90 |
2.35 |
|
| Optimized query time sec |
5.07 |
1.00 |
1.10 |
|
| Improvement % |
26.42% |
65.52% |
53.19% |
|
|
|
|
|
|
|
|
|
|
|
|
|
| Countries (20 countries, 180 days, site_id = 1) |
Original query time sec |
1.95 |
1.08 |
1.08 |
|
| Optimized query time sec |
0.30 |
0.20 |
0.23 |
|
| Improvement % |
84.62% |
81.48% |
78.70% |
|
|
|
|
|
|
|
| Hits table (100) |
Original query time sec |
0.30 |
0.61 |
0.42 |
|
| Optimized query time sec |
- |
- |
- |
|
| Improvement % |
Not optimized |
Not optimized |
Not optimized |
אין תגובות »
נכתב על ידי עמרי בנושא FireStats
מפעם לפעם אני מקבל תרומות תמיכה בFireStats, בדרך כלל בסכומים של $5, $10.
זה נחמד, ומראה שאנשים אוהבים את המערכת.
לפני כמה ימים קיבלתי תרומה כזו, בסכום של $10, ומיד לאחריה את האימייל הזה, שבאמת חימם לי את הלב:
Hello!
This donation is my way of appreciating your work.
It comes to you from India, where this amount represents
almost my one day’s earnings. That shows how much
I appreciate your work. I am a retired person.
Dr.______
2 תגובות »
בצירוף מקרים קוסמי שחררתי היום גרסאות חדשות לשלושה פרוייקטים בלתי תלויים:
FireStats 1.5.9-RC3:
FireStats 1.5 מתייצב, ורוב הסיכויים שהגרסא הבאה תהיה הגרסא היציבה של הענף הזה.
רשימת השינויים נמצאת כאן.
WPMU Plugin Commander 1.1.0
WPMU Plugin Commander הוא תוסף ניהוי תוספים לWPMU, שמוסיף כמה תכונות מאוד נדרשות לWPMU (אפשרות לבחור איזה תוספים משמשים יכולים להפעיל ולכבות, אפשרות להפעיל אוטומטית תוספים עבור בלוגים חדשים ועוד)
אתמול בלילה קיבלתי תרומת קוד שמוסיפה תמיכה בריבוי שפות לPlugin Commander, וכן שינויי עיצוב שגורמים לא להיות הרבה פחות מכוער.
בנוסף, התורמת של הקוד תרמה גם תרגום לרוסית של התוסף.
Antenna 1.1.0-beta
קיבלתי תרומת קוד גדולה מצוות MTJ, הקוד מממש את הPreprocessor שכתבתי בANTLR 3.0, מה שיאפשר הכנסה של הPreprocesror לתוך MTJ.
MTJ הוא פרוייקט שמטרתו להכניס תמיכה בפיתוח קוד J2ME בEclipse. הפרוייקט יתבסס על EclipseME, שהוא הסטנדרט דה-פקטו לפיתוח J2ME עם Eclipse. הPreprocessor שלי כבר נמצא בתוך EclipseME די הרבה זמן, אבל היתה בעיה עם הרשיון של ANTR 2.7.7 שבו השתמשתי כדי לפתח אותו, ו Eclipse legal לא אישרו את הכנסת הקוד שלי לMTJ מהסיבה הזו.
הצוות של MTJ בחר לבצע Porting של הPreprocessor כך שיעבוד עם ANTLR 3.0 כי הרשיון שלו תואם את זה של Eclipse.
לפני כמה ימים הצוות קיבל אישור מEclipse legal לתת לי את הקוד שהם יצרו כדי שאני אקלוט אותו לתוך Antenna.
הקוד היה איכותי, ועבר את כל בדיקות היחידה שהגדרתי כבר, מה שנתן לי ביטחון גבוה שהוא עובד כמו שצריך. אחרי כמה שעות עבודה, הקוד הוטמע והיום שחררתי גרסא חדשה של Antenna שמשתמשת בPreprocessor החדש כברירת מחדל.
תגובה אחת »
נכתב על ידי עמרי בנושא FireStats
The pirate bay מתחיל להציע בלוגים על בסיס וורדפרס מיו, ונחשו מה הוא מריץ?
FireStats!
לכבוד הוא לי :).
8 תגובות »
נכתב על ידי עמרי בנושא FireStats
כחלק מהתחרות הבלתי פוסקת בגוגל, מייקרוסופט החליטה לקנות את פיירסטטס, ולשלב אותו בוויסטה.
המערכת המשולבת תקרא Vistats, ותתמוך בהצגת נתונים סטטיסטיים על השימוש של המשתמש במחשב דרך אתר מרכזי.
נתונים שיאספו על משתמשי וויסטה:
* התפלגות השעות בהן הממשתמש עובד על המחשב.
* התפלגות השעות בהן המשתמש משחק משחקי פלאש באינטרנט.
* התפלגות השעות בהן המשתמש צופה בסרטי פורנו.
* קבצים שנפתחים בתדירות הגבוהה ביותר.
ועוד.
כל הנתונים יהיו זמינים לכל דיכפין דרך vistats.microsoft.com.
המערכת נמכרה תמורת סכום שצונזר כדי להמנע מתשלום מס מנופח.
נשבע לכם.
8 תגובות »
נכתב על ידי עמרי בנושא FireStats
שחררתי בטא שלישית של 1.5, שמתקנת את כל הבעיות שהיו ידועות עד כה.
מי שמריץ את 1.5 מוזמן לשדרג, ומי שלא - שייתביש בפינה!
רשימת התיקונים פה.
אגב, חלק מהבאגים נפתרו בטיסה טרנס אטלנטית :).
למרות שהקטע הראשון של הטיסה לסאן פרינסיסקו היה במטוס מחורבן, הדרך חזרה היתה במטוסים עם מסך אישי כולל חשמל 110 וולט ללפטופים, מה שעזר רבות :).
אגב, התרגום לעברית עודכן, לא הודות לשרון שפוטרה מתפקידה כמתרגמת עקב תפקוד לקוי.
3 תגובות »
למי שמחפש פתרון תומך לבדיקות יחידה (Unit test) של קוד PHP, יש את PHPUnit.
PHPUnit יהיה מוכר מאוד לכל מי שהשתמש אי פעם בJUnit, ולו משום שהוא port מוצהר של JUnit לשפת PHP.
התחלתי לכתוב בדיקות יחידה לחלקים של פיירסטטס, ואולי יהיה פוסט נוסף על העסק הזה בהמשך.
YUI - יואי, או Why you aye, הוא ספריית JavaScript שמפותחת ביאהו.
יואי משוחרר ברשיון BSD (רשיון תעשו מה שאתם רוצים עם הקוד), וכולל טאבים, עצים, אנימציות, השלמה אוטומטית ועוד פחות או יותר 252 דברים שאולי תרצו לבדוק אם אתם רוצים להכניס עניין באפליקציית WEB שאתם מפתחים.
אני שוקל להתחיל להשתמש בYUI בפיירסטטס - לפחות באופן חלקי, במקום הערמה המגוונת של ספריות חיצוניות שיש שם כרגע.
על YUI שמעתי בפעם הראשונה בפודקסט המצויין של ליאו לפורט - Floss weekly.
למי שמתעניין בקוד פתוח - מומלץ מאוד.
בכל פודקסט (לא ממש פעם בשבוע), יש ראיון עם דמות מפתח מעולם הקוד הפתוח.
החל ממפתחים שהתחילו שפות (PHP, פיתון), דרך מיסד וויקיפדיה, אבן מוגלן ועוד.
מאוד מעניין ומומלץ.
תגובה אחת »
|