Google Wave

גוגל וויב (Wave) הוא מיקס מגניב של אימייל, צ'אט, וויקי ועוד.
סיכמתי פה כמה נקודות מהווידאו, אבל כדאי לראות את הווידאו ולהשתכנע בעצמכם.

וויב

  • אפשרות לפצל שיחה לכמה קווי שיחה בקלות (Threads)
  • צ'אט חי, כמו בימי הבבסים (רואים מה האדם השני מקליד בזמן שהוא מקליד).
  • אפשרות לחבר אדם נוסף לשיחה בדיעבד על ידי הוספה שלו למשתתפים, הוא יוכל לראות את השיחה מההתחלה, כולל באמצעות מצב ניגון שמנגן את השיחה בשבילו צעד אחר צעד כאילו הוא השתתף בה מההתחלה.
  • אפשרות להגביל גישה להודעות למשתתפים מסויימים (מסרים פרטיים)
  • תמיכה בגרור וזרוק כדי להצמיד תמונות (וקבצים באופן כללי) להודעות, נכון לכרגע זה דורש גוגל gears, אבל הכוונה היא לדחוף את היכולת הזו בהצעה לHTML 5.
  • אפשרות לשתול שיחה בקלות בתוך בלוג (Embed), מכיוון שהשיחה מאוכסנת בשרת מרכזי זה לא משנה אם מגיבים מהבלוג אם מתוך Wave, היא תשאר שיחה אחת.
  • כל שיחה יכול להיות בעצם מסמך משותף שכל המשתתפים תורמים לו, בדומה לוויקי, כולל פיצול ואיחוד של גרסאות (Branch and merge), כולל עריכה חיה (כמו הצ'אט החי) על ידי כמה משתתפים במקביל.

הרחבות

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

פרוטוקול

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

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

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

שימוש חכם בזכרון כדי להאיץ גישה לנתונים

קחו את המצב הבא:
יש שתי טבלאות עם כחצי מילארד רשומות בכל אחת.
באופן חד פעמי – אתם צריכים לעבד את טבלא א' בבלוקים של כמה אלפים בכל פעם.
עבור כל בלוק, אתם צריכים לגשת לטבלא ב' ולהשלים משם נתונים.
אתם צריכים לגשת רק לחלק מהעמודות בטבלא ב', אבל הביצועים חרבנה.
שליפה של כמה אלפי רשומות מטבלא ב' במכה עובד בקצב של כמה מאות בשניה:
[code lang="sql"]
SELECT a,b,c FROM table WHERE id IN (….)
[/code]

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

הרעיון הבא שלי היה לשמור את הנתונים המעניינים על הדיסק בצורה בינרית, ממויינים לפי שדה הid, כאשר הפורמט הוא פשוט רשומה אחרי רשומה.
ברגע שכל הנתונים בקובץ, אפשר לטעון אותו לזכרון פעם אחת, ולבצע עליו חיפוש בינארי זריז כדי למצוא כל רשומה.
רעיון פשוט, אבל המימוש נתקל בכמה קשיים:
נפח הנתונים המעניינים במקרה שלי הוא כ14.4 ג'יגה בייטים, כל רשומה שוקלת 24 בתים, ויש 600 מליון רשומות כאלו.
אין הרבה מחשבים שמסוגלים להעלות כזו כמות של מידע לזכרון, בהתחלה חשבתי שנתונים ישקלו "רק" 12 ג'יגה, ולכן היה ישים לטעון את כולם לזכרון של שרת עם 16GB זכרון, אבל 14.4 ג'יגה זה כבר גבולי מדי.
בעיה נוספת היא שג'אווה, השפה בה אני מממש את העניין – לא תומכת במערכים גדולים מכ2 מילארד איברים (גם לא בJVM של 64 ביט), ולכן מערך הבייטים הגדול ביותר שאני יכול ליצור לא מספיק גדול בשביל להחזיק את הקובץ בזכרון.

כדי לפתור את הבעיה של המערך הקטן מדי, חילקתי את המערך לכמה מערכים של 2GB, וכשלב מקדים לחיפוש הבינארי בתוך המערך – אני עובר על המערכים בזריזות כדי להבין באיזה מהם נמצא הערך שאני מחפש (רק מביט באיבר הראשון והאחרון כדי לראות אם הID שאני מחפש נמצא ביניהם).
כדי לפתור את הבעיה השניה, כתבתי שכבה פשוטה של שרת לקוח, כאשר אני יכול להריץ כמה שרתים שאני רוצה על כמה מכונות שצריך, כשכל אחד מהם מעלה חלק אחר מהקובץ לזכרון.
לקוח פשוט פונה לכל השרתים ושואל ומבקש מהם על גבי חיבור TCP לחפש עבורו את הנתונים שמתאימים לרשימת מזהים.

בבדיקה ביצועים ראשונית יצרתי קובץ מ26 מיליון רשומות, וחיפשתי בתוכו 2 מיליון רשומות. הקצב היה קרוב למיליון רשומות בשניה, מה שאומר שהבעיה נפתרה.

ניצחון.

midp-build

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

The midp-build system is a generic build system for mobile java applications developed in Eclipse. it uses the Eclipse configuration files (.classpath files) to determine project dependency, build order and build classpath automatically.

it can build any MIDlet with very little configuration.

  • The system supports complex builds with multiple outputs, for example – it's possible to build for several products, configurations and devices in a single run.
  • The build fully support preprocessing of source code based on symbols that are defined per devices, products and configurations (or almost any combination of those).
  • The build allow fine customization of the properties contained in the JAD for each JAR+JAD pair generated.
  • The build supports signing of generated MIDlets automatically
  • The build supports including classpath resources in the generated JAR(s), and/or copying specific resources
  • The build supports local builds, based on files on the workspace (without changing them in any way).
  • The build fully supports CVS and have some untested support for SVN
  • The build supports multiple build configurations per Eclipse project (see conf.prefix)

Breaking Bad

הערה: פוסט זה נטול ספויילרים.
Breaking Bad היא הסדרה הכי טובה שאף אחד (כמעט) לא רואה.
הפרק הראשון נפתח בקטע ההזוי הבא (אלו הדקות הראשונות):

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

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

הארדווינו הגיע

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

אז מה בחבילה?

  • ארדוינו מגה
  • לוח פרורי-לחם (מה שנקרא BreadCrumbs), וערמת מחברים
  • שקית מלאה בנגדים, LEDים, כפתורים,ג'אמפרים וכו'
  • כבל USB כחול ומגניב לחיבור הארדוינו למחשב

arduino

(התמונה לחיצה וסחיטה).

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

ככה נראית התוכנית בתוך סביבת הפיתוח:
screenshot-arduino-0015

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

מלחמת השועלים

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

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

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