חבילת דביאן שימושית : apt-cacher

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

להתקנה, כמובן : apt-get install apt-cacher

הSDK של IPod touch וIPhone

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

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

נראה שעורכי הדין של אפל עובדים שעות נוספות כדי לחסום את המשתמשים מלעשות דברים שימושיים.
הפסקה האחרונה מרמזת שאו שעורכי הדין של אפל הם חבורת מפגרים שלא מבינים רשיונות קוד פתוח (שום דבר שמישהו יכול לעשות עם רשיון קוד פתוח לא יכול להדביק את הקוד של אפל!) או שהם מנסים להפיץ FUD לגבי קוד פתוח.
תנאי הרשיון מונעים המרה של דפדפנים (פיירפוקס למשל) לIPhone, מונעים שימוש בשפות נוספות כמו Java, PHP, Python וכו', מונעים כתיבה של תוכנות מסרים מיידיים (כי הם צריכים לרוץ ברקע) ועוד.
זה די מרתיח שבאפל יושבים כאלו חולי שליטה.

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

סקוייה

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

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

דרך סלאשדוט.

עדכון:
בחיפוש אחר שם המכונה שמוזכר באימייל שנשלח (Sequoia Advantage voting machine), מצאתי שפרופסור אפל כבר שם את ידיו על אחת המכונות לפני שנה.
הוא קנה אותה ב82$, בלי שום בעיה.
הוא כותב שהחברה משקרת במפרטים שלה, לפחות לגבי המכונה הספציפית שברשותו, ושקל מאוד להחליף את הROM של המכונה.

ספריות מעניינות לפיתוח ישומי WEB

למי שמחפש פתרון תומך לבדיקות יחידה (Unit test) של קוד PHP, יש את PHPUnit.
PHPUnit יהיה מוכר מאוד לכל מי שהשתמש אי פעם בJUnit, ולו משום שהוא port מוצהר של JUnit לשפת PHP.
התחלתי לכתוב בדיקות יחידה לחלקים של פיירסטטס, ואולי יהיה פוסט נוסף על העסק הזה בהמשך.


YUI
– יואי, או Why you aye, הוא ספריית JavaScript שמפותחת ביאהו.
יואי משוחרר ברשיון BSD (רשיון תעשו מה שאתם רוצים עם הקוד), וכולל טאבים, עצים, אנימציות, השלמה אוטומטית ועוד פחות או יותר 252 דברים שאולי תרצו לבדוק אם אתם רוצים להכניס עניין באפליקציית WEB שאתם מפתחים.
אני שוקל להתחיל להשתמש בYUI בפיירסטטס – לפחות באופן חלקי, במקום הערמה המגוונת של ספריות חיצוניות שיש שם כרגע.

על YUI שמעתי בפעם הראשונה בפודקסט המצויין של ליאו לפורט – Floss weekly.
למי שמתעניין בקוד פתוח – מומלץ מאוד.
בכל פודקסט (לא ממש פעם בשבוע), יש ראיון עם דמות מפתח מעולם הקוד הפתוח.
החל ממפתחים שהתחילו שפות (PHP, פיתון), דרך מיסד וויקיפדיה, אבן מוגלן ועוד.
מאוד מעניין ומומלץ.

Shareaza.com, המחטף

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

Make it so the real shareaza program queries their site [shareaza.com] every couple of seconds. As an individual user this won’t take much personal bandwidth. But all shareaza users worldwide put together should be enough to kill their server and they won’t really be able to do much since it will be coming from so many different IPs.

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

This law firm represents Discordia, Ltd., the operator of the website Shareaza.com and owner of the rights in the Shareaza branded software distributed from that domain. Please be advised, that your forum contains a string of posts under the title: “suggestion to kill Shareaza.com.” Under the string, the poster, RedSquirrel offers directions for users of Shareaza software to implement a DoS that would have the effect of destroying or seriously impairing our client’s application and network. The poster OldDeath also offers a manner to illegally attack our client’s business.

Despite whatever complaints your forum’s users may have with our client’s proper and legal business activities, the type of activity promoted on your forum is illegal. Therefore, we request that you immediately remove this string of posts and any future strings of this nature. My client respects your users’ rights to express their points of view. However, the line is crossed when users begin to promote the destruction of a legitimate business (evidently based on out some misguided belief that artists and others who create music should not be fairly compensated for their efforts) via illegal or other predatory means.

If the above cited illegal activity on your site does not immediately cease and desist, our client will take all necessary action to vigorously and relentlessly protect its rights. To be clear, if this action is not immediately taken and, as result, our client’s business is harmed, we will not only pursue, locate and hold fully responsible each and every one of those who have implemented this, or any similar DoS, but also those responsible for maintaining your site and the forums.

Please confirm that the requested action is being taken immediately.

Jeffrey A. Kimmel

Meister Seelig & Fein, LLP
140 E. 45th St., 19th Fl.
New York, NY 10017
(212) 655-3578

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

הסיפור המלא כאן.

פיירפוקס 3 בטא 3

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

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

ומי שרוצה לשחק קצת עם פיירפוקס 3, אבל בלי לקלקל או להסיר את פיירפוקס 2?
אה, זה קל, אחרי שמוצאים הוראות באינטרנט :).
יוצרים פרופיל חדש עם הפיירפוקס החדש ככה:
[code]
/path/to/firefox -profilemanager -no-remote
[/code]
נניח שנקרא לו beta3test

ואחר כך כדי להפעיל את הפיירפוקס החדש מריצים את:
[code]
/path/to/firefox3 -P beta3test -no-remote &
[/code]

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

מחשב על מפתח

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

בדרך כלל אני לא נודד בין מחשבים, יש לי את המחשבים הקבועים שלי, אבל לפעמים כן.
אז מה עושים?

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

רשימת התוכנות הנתמכות ארוכה ויפה, וכוללת את FireFox, Thunderbird, Open office, Pidgin, Audacity, FileZilla, Gimp, Putty ועוד הרבה.
למרבה הצער נראה שרק גרסאות החלונות נתמכות, אבל מכיוון שממילא רוב המחשבים הזרים מריצים חלונות זו לא כזו בעיה גדולה.

portable apps

יוניקוד ודגים אחרים

הערה: יש סקר בסוף.

סקירה היסטורית
בראשית היה ASCII (האמת היא שהיו קידודים לפני ASCII אבל הם לא מעניינים אותנו).
אסקי נועד בעיקר לתווים באנגלית, הערך של 'A' הוא 65, הערך של רווח הוא 32 וכן הלאה. ASCII הוא קידוד 7 ביטים, מה שאומר שהוא משתמש ב128 אפשרויות מתוך 256 האפשרויות שנכנסות בbyte.
הבעיה עם אסקי היא שהוא לא כולל תווים של שפות אחרות – קירילית ועברית למשל.

Code page
הפתרון המתבקש הוא להשתמש בערכים 128-255 כדי לייצג את האותיות החסרות.
הבעיה היא שהרבה אנשים חשבו על הפתרון הזה בו זמנית, ומטבע הדברים היו הרבה טבלאות כאלו, לפעמים אפילו כמה בתוך אותה מדינה.
לא נחמד, כי מסמך שנכתב תוך שימוש בטבלא אחת לא הוצג כמו שצריך למי שהשתמש בטבלא אחרת.
בשלב מסויים הוגדרו סטנדרטים על ידי ארגון התקינה האמריקאי (ANSI) , שנקראו Code pages, מה שעזר למנוע הווצרות של טבלאות מיותרות חדשות.
הבעיה העיקרית עם הפתרון הזה הוא שאי אפשר לערבב שפות שמשתמשות בקודים שונים.
בנוסף, הוא נותן פתרון רק לשפות בעלות פחות מ128 אותיות.
באסיה הוגדר תקן בשם DBCS – Double byte character set, שנועד לתת פתרון לשפות האסיאתיות.
התקן הזה השתמש בקידוד באורך משתנה: חלק מהתווים היו באורך בייט אחד וחלק באורך שני בייטים, ובאופן כללי היה מבלבל למדי.

UNICODE
יוניקוד הוא שם הקוד לטבלא גדולה מאוד שמתאימה מספר לכל אות ידועה (וגם כמה משפות מומצאות כמו קלינגונית), מכיוון שיש טבלא אחת לכל השפות – אין בעיה לערבב בין שפות שונות.
מיתוס נפוץ הוא שניתן לייצג כל אות ביוניקוד בעזרת מספר בין 16 סיביות (או במילים אחרות, שיש פחות מ65536 אותיות ביוניקוד).
זה לא נכון, ולמעשה יש ביוניקוד גרסא 4.0 קרוב ל240,000 סימנים, מה שאומר שצריך לפחות 3 בתים כדי למספר את כל התווים ביוניקוד.
מחרוזת ביוניקוד היא בסך הכל סדרה של מספרים, כאשר כל מספר הוא המיקום של אות מסויימת בטבלא.
מקובל לסמן תו יוניקוד בסימן כמו U+0041, כאשר U+ אומר שזה יוניקוד והמספר שאחריו הוא קוד האות בבסיס הקסדצימלי.
לא במקרה, 128 התווים הראשונים ביוניקוד הם בדיוק אותם 128 התוים הראשונים באסקי וברוב קידודי הCode page.
המחרוזת hello ביוניקוד תכתב ככה:
U+0048 U+0065 U+006C U+006C U+006F
אם נשמור את זה, נקבל:
[code]
00 48 00 65 00 6C 00 6C 00 6F
[/code]
או
[code]
48 00 65 00 6C 00 6C 00 6F 00
[/code]
תלוי בשיטת בה אנחנו מקודדים ספרות בזכרון המחשב (Little endian או Big endian).
כדי להבחין בין שתי השיטות ישנה תוספת של התווים FE FF בתחילת מחרוזת יוניקוד (שתראה ככה או הפוך, לפי הEndianness של המכונה).
הסימון הזה נקרא Unicode Byte Order Mark, או בקיצור BOM – והוא גורם ללא מעט צרות לדפדפנים שכתובים רע.

UTF-8
באו האמריקאים ושאלו, מה אנחנו צריכים את האפסים האלו באמצע המחרוזת? הרי המחרוזת תופסת פי שתיים, והם גם מבלבלים תוכנות שמתייחסות ל0 בתור סימון לסוף המחרוזת (מקובל בC וC++).
וככה נולד UTF-8.
UTF-8 הוא שיטה לקידוד יוניקוד בקידוד בעל אורך משתנה.

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

PHP ויוניקוד
PHP התמיכה של PHP 4 ו5 ביוניקוד חלקית ביותר.
מחרוזות בPHP הן בעצם סדרה של בייטים ולא יותר ולמרות שתמיד אפשר להשתמש במחרוזת PHP כדי לשמור מחרוזות בקידודים שונים – רק במקרה שהPHP קומפל עם תמיכה בmb_string יהיו לנו פונקציות מיוחדות לטיפול במחרוזות מרובות בתים.
פתרון נוסף הוא להשתמש בספריה iconv, שמוסיפה לPHP יכולות המרה של קידודים, אבל היא לא מגיעה כברירת מחדל עם PHP ומי שרוצה תוכנה שתוכל לרוץ בקלות בכל מחשב ימנע ממנה.
בPHP 6 שמתבשל לאיטו צפויה תמיכה ביוניקוד, UTF-8 וכל זה, אבל זה עדיין לא שוחרר, ואם לשפוט לפי הקצב שלוקח לשוק לאמץ את PHP5 – אז PHP6 לא יהיה רלוונטי בשנים הקרובות למי שרוצה לשחרר תוכנה שתרוץ בכל מחשב.
מכיוון שהפונקציות הסטנדרטיות בPHP תומכות בעצם רק בקידוד שבו כל אות תופסת בייט אחד, הן יכולות ליצור בעיות מעניינות.
אם תקבלו מחרוזת שמקודדת בUTF-8, נניח "שלום", ותציגו אותה בדפדפן האורך שלה יהיה 4 אותיות. אם תשתמשו בפונקצית הPHP לחישוב אורך של מחרוזות, תקבלו שהאורך שלה הוא 8 תווים, כי כל אות מקודדת בשני בתים.
אם תנסו את אותו דבר על המחרוזת המעורבת "שלום SHALOM", תקבלו שהאורך הוא 8 + 1 + 6 = 15.
לעומת זאת, אם תשתמשו בmb_strlen תקבלו את האורך הנכון.
בעיה נוספת היא בעיה של חיתוך מחרוזות UTF-8.
אם נשתמש בפונקציה wordwrap לחיתוך מחרוזות UTF8, היא עלולה לחתוך אות בין שני הבתים שלה, ובעצם להעלים אותה. לא נעים.
הפתרון שלי היה לכתוב גרסא של wordwrap שעובדת על מחרוזות UTF-8.
אפשר להבין למה מפתחי PHP מתבלבלים כשהם מתעסקים עם מחרוזות בUTF-8.

המרות וקיבועים
למרות שרוב אתרי האינטרנט בימינו השכילו לעבור לUTF-8 לקידוד של מחרוזות, עדיין יש אתרים מסויימים שמשתמשים בקידודים מבוססי Code page. למשל – מנוע החיפוש של Walla מקודד לפעמים את מילות החיפוש בכתובת בקידוד עברית 1255 (עברית חלונות), ולפעמים בקידוד UTF-8. מאוד נחמד מצידם של המפתחים לפחות להעביר את הקידוד כחלק מהכתובת (e=hew לעברית 1255 וe=utf לutf8).
לא חסרות דוגמאות אחרות, בעיקר במנועי חיפוש מקומיים (yandex.ru, mail.ru שמשתמשים בקידוד קירילי 1251) ועוד.
מכיון שאני רוצה שמילות החיפוש יוצגו כמו שצריך בFireStats, צריך להמיר את הקידודים האלו לUTF-8.
הבעיה היא שכאמור – אין תמיכה מובטחת בiconv שמאפשר המרות כאלו, ולכן נאלצתי לכתוב בעצמי ספריית המרות קטנה מקידודי codepage כלשהם לקידוד UTF8. הספריה מסתמכת על טבלאות המרה שאפשר להשיג באתר הראשי של יוניקוד.
הרעיון של הספריה הוא להמיר באמצעות הטבלא את המחרוזת ליוניקוד, ואז לקודד אותה לUTF8.

וזו האגדה על אסקי יוניקוד וUTF-8.

מה דעתכם על המאמר?

View Results

Loading ... Loading ...

רוצה עוד מאמרים טכניים?

View Results

Loading ... Loading ...

קריאה נוספת

Joel on software במאמר מצויין על יוניקוד
מצגת על השרדות עם UTF-8
שאלות נפוצות על יוניקוד וUTF-8 בלינוקס ויוניקס
Unicode Introduction and Resources

ייעול הכנסת נתונים מנורמלים לבסיס הנתונים בFireStats

במסגרת מקצה אופטימיזציות לFireStats מימשתי מנגנון נוסף לקליטת כניסות.
המנגנון הרגיל בו כולם משתמשים היום בודק שהכניסה לא צריכה להיות מסוננת (כניסה של רובוט ידוע או IP מסונן למשל), ומכניס את הנתונים בצורה מנורמלת.
נירמול בסיס נתונים נועד למנוע כפילויות, מה שעוזר במניעת אנומליות ובחיסכון במקום. בFireStats הנרמול מתבטא בכך שכל כתובת נשמרת פעם אחת בטבלאת הURLים, כל UserAgent בטבלאת הUserAgents וכדומה. כאשר מכניסים את הנתון העיקרי של כל הכניסה, משתמשים במזהה של כל נתון מנורמל.
המשמעות של זה בזמן הכנסת הנתונים היא כזו:
הגיעה כניסה עם כתובת מסויימת, מפנה מסויים ודפדפן (UserAgent) מסויים. לכל אחד מהנתונים האלו מבצעים פחות או יותר את סדרת הפעולות הבאה:
הכנס לטבלא הרלוונטית עם INSERT IGNORE, מה שמונע שגיאה במקרה שהנתון כבר נמצא שם (הטבלאות מוגדרות לא לקבל רשומות כפולות).
בדוק מה המזהה של הנתון שהכנסנו (אם הוא נכנס, אז זה יהיה מזהה חדש, אם לא זה יהיה המזהה שנבחר בפעם הראשונה שהכנסנו את הנתון לטבלא).
לבסוף, הכנס שורה לטבלאת הכניסות תוך שימוש במזהים שמצאנו בצעדים הקודמים.
זה קצת יותר מורכב מזה כי גם צריך לזהות ולסנן כניסות מסויימות כאמור.

כל התהליך הוא איטי למדי.
יצרתי קובץ CSV עם 100,000 כניסות (מfirestats.cc) והשתמשתי בו למדידת הביצועים:
בשיטה של הכנסה מנורמלת של כל כניסה, הקצב מתחיל די לא רע עם 80 כניסות לשניה, אבל ככל שבסיס הנתונים מתמלא הוא יורד עד שמתייצב על 7-8 כניסות לשניה.
למרות שקצב כזה בהחלט מספיק לכל בלוג מצוי, הוא ממש לא מספק לאתרים רציניים יותר או לבלוגיות עתירות בלוגים.

כשהוספתי תמיכה בWPMU בFireStats 1.4, חזיתי (חודשים לפני שביצעתי את המדידות) שקצב הכניסות יכול להיות בעיה בבלוגיות והוספתי שיטה חדשה לקליטת נתונים.
במקום לקלוט את הנתונים בצורה מנורמלת, הנתונים נקלטים לטבלאת כניסות ממתינות בצורה לא מנורמלת עם INSERT DELAYED. המשמעות של הDELAYED היא שבסיס הנתונים מכניס את הנתונים בזמנו הפנוי, ולא מחזיק את הקורא עד שהנתון הוכנס ממש.
עדיין צריך לנרמל את הנתונים, ולכל כתבתי סקריפט PHP פשוט שעובר על הכניסות הלא מנורמלות בטבלא אחת אחת, ולכל אחת קורא לפונקציה הרגילה שקולטת נתונים ומנרמלת אותם, ולבסוף מוחק את הכניסה מטבלאת הכניסות הממתינות. (מנהל המערכת אחראי לדאוג שהסריפט ירוץ בפרקי זמן סבירים, למשל באמצעות cron).
אני שומע אתכם צועקים: כן, אבל זה יהיה איטי לפחות כמו קודם, אם לא יותר!
זה נכון, אבל לפחות זה מאפשר לתזמן את העיבוד של הכניסות לזמנים פחות עמוסים כמו הלילה.
חיסרון נוסף הוא שהמשתמשים כבר לא מקבלים את הנתונים בזמן אמת, אלא נתונים שנכונים נכון לזמן העיבוד האחרון של הכניסות בטבלאת הממתינים.

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

הצעד הבא הוא כמובן לשפר את הביצועים של העיבוד הנ"ל.
כבר מהרגע הראשון שכתבתי אותו, היה לי ברור שדרושה פה אופטימיזציה רצינית, והיה לי גם ברור שהיא תהיה מסובכת.
האופטימיזציה מתבססת על התובנה הבאה:
בתוך קבוצת כניסות שנקלטו בפרק זמן מסויים, יהיו חזרות רבות מאוד של כתובות, מפנים ודפדפנים.
מה אם במקום לטפל בהם אחד אחד, נטפל בהם בקבוצות? נניח 1000 כניסות בכל קבוצה?
במקום 1000 כתובות ו1000 מפנים, יהיו לנו משהו כמו 300 כתובות (שכוללים מפנים).
במקום משהו כמו 1000 דפדפנים יהיו לנו משהו כמו 50 או 100 דפדפנים.
עכשיו נצטרך להכניס את כל מה שחדש לבסיס הנתונים, לחלץ את המזהים שלהם, ולבסוף להכניס את הכניסות עצמן תוך שאנחנו משתמשים במזהים מקודם, רק שהפעם נכניס 1000 כניסות במכה במקום כניסה אחת.
המשמעות של זה היא בעצם לממש את הפונקציה שמכניסה כניסה בודדת – אבל לרוחב, כך שתהיה ברוחב של k כניסות (קבוע כלשהו).
המימוש של זה מורכב, ולמעשה לקח יותר מפי עשר שורות קוד מהמימוש התמים הקודם, אבל הביצועים סוכר:
מעיבוד של 8 כניסות בשניה, עליתי לעיבוד של 600 כניסות לשניה.
שיפור של פי 75!

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

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

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

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