תחזיות לשנה החדשה

  • מניית גוגל תחצה את קו ה1000 דולר
  • פייסבוק תנפיק ותבצע השתלטות עויינת על גוגל.
  • עיר הבה"דים תוקם, ואחרי מספר חודשים יתחילו דיווחים על זומבים לובשי מדים שמסתובבים בערבות הנגב ומחפשים קורבנות טריים.
  • יחשף שהמשטרה היא בעצם המפעילה של ארגוני הפשע, ומקור ההכנסה המרכזי שלה הוא פרוטקשן, ולא רק של ארועי ספורט.
  • מייקרוסופט תכריז שוויסטה היתה מתיחה ותשחרר את הקוד שלה תחת GPL. שני אנשים יורידו את הקוד.
  • המודיעין הישראלי יכריז שתהיה לאירן פצצה גרעינית בעוד שנתיים.
  • גם בשנה הבאה הוא יכריז שתהיה לאירן פצצה גרעינית בעוד שנתיים.
  • אני אנחת בישראל, ובאמתחתי Wii וIPod touch.
  • בשנה הבאה אני אחזה עשר תחזיות

iPod touch

במסגרת השופינג ספרי פה בסיאטל, רכשתי iPod touch עם 8GB זכרון.
המחיר בארצות הברית יותר זול משמעותית מאשר בארץ, גרסאת ה8 ג'יגה עולה 299$ וגרסאת ה16 ג'יגה עולה 399$.
חוץ מניגון מוסיקה, הוא גם מאפשר גלישה דרך Wifi.
הממשק דומה לזה של הiPhone:
מסך מגע ענק, שמזהה כמה נקודות לחיצה (אפשר למשל לעשות זום אין בדפדפן על ידי "צביטה").
הדפדפן הוא ספארי די סטנדרטי, שגולש יפה מאוד (אפילו פיירסטטס עובד שם!), וכמובן שיש מקלדת מגע.
חסר פונט לעברית בדפדפן, אבל נתקלתי כבר בפתרונות לבעיה הזו לiPhone ואני די בטוח שהם יעבדו גם על הTouch.
איכות הסאונד טובה, והווליום גבוה מספיק כדי שלא תרצו לשמוע מוזיקה בווליום הכי גבוה.
לא בדקתי עדיין, אבל הסוללה אמורה להספיק ל22 שעות מוסיקה לפי אפל, ול17 שעות לפי ביקורות באינטרנט. בכל מקרה די והותר אפילו לטיסה טרנס אטלנטית (אהם).

הiPod touch מאוד מזכיר את הiPhone, בכמה הבדלים:
* הוא לא טלפון, אז אין התחייבות או התקשרות עם ספק סלולרי (יתרון ענק).
* אין לו Bluetooth, די חבל.
* המכשיר יותר דק.
* אין לו מיקרופון פנימי.

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

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

Wii

כבר בטיול האחרון להולנד וגרמניה חשבתי לקנות Nintendo Wii, אבל פשוט אי אפשר היה למצוא Wii באף חנות.
חצי שנה אחר כך, בחג המולד, המצב לא יותר טוב: למעשה, הוא יותר גרוע:
מי שרוצה לקנות Wii בחנות, יכול להרשם ולקבל אותו ב21 בינואר, שזה כמה שבועות אחרי שאני חוזר.
למזלי, השותף שלי לנסיעה – יניב – היה ממש לחוץ על Wii, והסכים לחפש בנרות בתנאי שאני אקנה אם הוא מוצא.
הוא גילה כמה אתרים שמתמחים בחיפושיי Wii, כשהמעניין בהם הוא wii.FindNearBy.net שמאפשר חיפוש עם אינטגרציה לגוגל מפות ולכמה רשתות מאוד משמעותיות (Ebay, אמזון, וולמארט, Target וכו').
במילים אחרות:
תמצא לי כל מי שמוכר Wii ברדיוס של 25 מיילים (או כל מרחק אחר) ממני.
מצאנו ככה Wii ב315$ בEbay, ובאותו יום נפגשתי עם המוכר בקניון South center שנמצא במרחק חמש דקות נסיעה מהמלון, והכסף החליף ידיים, וגם הWii. על הדרך קניתי בקניון את Super mario galaxy לWii, כדי שיהיה מה לשחק.
הWii ממש חדש, והגיע עם הניילונים בקופסא. מסתבר שהילדים שם רצו נורא PS3 לקריסמס, ופניהם נפלו למראה הWii.
החוויה של קניה באיביי בארצות הברית שונה לגמרי מאשר בארץ, ולו בגלל שקל מאוד למצוא מישהו שמוכר מה שאתם רוצים בקרבתכם. ההבדל משמעותי מאוד: במקום לשלם מחיר מופקע כדי לקבל את זה בדואר איטי לארץ, נפגשים באיזה מקום ואוספים את הרכש במהירות.

למרבה הצער, הטלוויזיה במלון מצו'קמקת למדי ואין לה חיבורים RCA מתאימים, אז לא יצא לי לבדוק את הרכש החדש, אבל הזמן לזה יגיע :).
הWii שלי צורך במתח ב110 וולט, ואני עדיין מחפש פתרון לזה:
או שאני אקנה פה ספק כוח שמתאים גם ל220 וולט (קצת קשה למצוא פה), או שאני אקנה בארץ ממיר 220 -> 110 וולט.
בכל מקרה, אני לא מודאג – הבעיה הזו פתירה.

בקרוב אצלי בסלון:

חיפוש סרטים בגוגל

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

Wiimote

בחור חכם בשם ג'וני לי עושה כמה דברים מדהימים עם השלט של נינטנדו Wii, הידוע גם כWiimote.

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

שווה להכנס לאתר שלו לראות את איך הוא עושה מסך מגע ומעקב אחרי אצבעות (באוויר) באמצעות הWiimote.
קניתי שלט כזה, ואני מתכוון להשתעשע בו (40$, כמה עולה בארץ? :).

נדודי שינה

סיאטל אכן יפה, בעיקר בלילה.
seattle.jpg

ספייס נידל
הספייס נידל הוא מגדל גבוה (158 מטרים) עם תצפית פנורמית על כל העיר.
בכניסה לספייס נידל קניתי ב53$ City pass שמאפשר כניסה מוזלת לכמה אטרקציות בעיר.
niddle1.jpg

niddle2.jpg

niddle3.jpg

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

הבונוס הוא שיש בתוכו קולנוע IMAX, שראינו בו את I am legend, סרט חדש עם ביל סמית' שמבוסס ספר באותו שם.
זה הסרט השלישי שמבוסס על אותו ספר, כשהשני היה איש האומגה מ71.
הסרט מספר על עתיד קרוב שבו וירוס קטלני הרג את רוב האנשים והפך את רוב הנותרים למטורפים אחוזי כלבת.
רוברט נוויל – ווירולוג צבאי (וויל סמית') – עדיין מנסה למצוא תרופה אחרי כמה שנים, בניו יורק הריקה.
סצינת הפתיחה מדהימה, וויל סמית' נוהג בניו יורק במוסטנג מ72 ומנסה לצוד צבאים שמסתבבים בעיר הנטושה, בין המכונות והעשב שצמח בכל מקום.
חווית הצפיה בIMAX היא ממש מעולה, מומלץ להתרחק מהמסך כמה שאפשר (רצוי לשבת באמצע למעלה) כדי לא לקבל נקע בצוואר.
לפני הסרט היה טריילר של 10 דקות לבאטמן החדש (The dark knight), והוא נראה משובח במיוחד. הצפיה בIMAX ממש מכניסה את הצופה לסרט.

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

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

גן החיות היבשתי בסיאטל
גן החיות (שמחזיק בדומיין zoo.org, לא פחות) מרשים מאוד, למרות שעקב מזג האוויר החורפי די הרבה בעלי חיים הסתתרו במחסות (אני בטוח שבקיץ הוא אפילו יותר מרשים).

monkey-boy.jpg
parrot.jpg

השמועות על מותי היו מוגזמות

אתמול ב20:00 בערב, שלוש שעות לפני ההמראה כמו ילד טוב – התייצבתי בנתב"ג.
היום ב24:00 (זמן ישראל) הגעתי למלון בסיאטל.
בן גוריון->אטלנטה, ואטלנטה->סיאטל.
30 שעות של זמן שדות תעופה וטיסות, כיף אמיתי.
בינתיים אני בעיקר עייף ורעב, אבל עדיין פה.

התמונה הזו צולמה בשדה התעופה בסיאטל:
seattle_airport-002.jpg

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

סיאטל

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

איך להוציא RSS מאתר שלא תומך בRSS?

לפני כמה שבועות הפיד RSS של TorrentLeech (להלן TL), ספק הסדרות העיקרי שלי, התחיל להחזיר 404 (דף לא נמצא).
אין פה שום דבר חדש, הפיד הזה אף פעם לא היה יציב במיוחד, לכן חיכיתי בסבלנות כשבוע, ואז התלוננתי בערוץ הIRC שהלינק של הפיד לא עובד.
גורם "רשמי" מסר לי שהפיד לא יחזור כי השתמשו בו לרעה.
ניסיתי לברר את פשר השימוש הפוחז, ואפילו הצעתי את עזרתי במציאת פיתרון, אך לשוא:
הילדון זב החוטם מסר שלא משנה מה אני אגיד או אעשה, הפיד לא חוזר.
הסברתי לו בדרכי נועם שאם המידע זמין באתר, אין שום הבדל כי אפשר להפוך אותו לפיד, אבל זה לא עזר.
אז החלטתי לעשות בדיוק את זה, וכך נולדה תוכנה חדשה – TorrentLeech2RSS.

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

בחרתי לכתוב את tl2rss בשפת ג'אווה.
הצעד הראשון, וכנראה הכי קשה בתהליך, הוא להכנס תכנותית לאתר, התהליך מורכב יחסית וכולל כמה שלבים.
כדי להבין מה אני אמור לשלוח ומתי, השתמשתי בWireShark, וניטרתי את התעבורה שנוצרת כשאני מבצע לוגין בעזרת הדפדפן.
שימו לב במיוחד לאפשרת של Follow TCP Stream, שמציגה שיחת HTTP שלמה בצורה ברורה.
ברגע שהקוד הצליח להזדהות מול השרת, לבקש דף שמתאים לקטגוריה רלוונטית זה קל. אבל מה עושים עם הדף?
הדפים של TorrentLeech הם דוגמא לאיך נראה קוד HTML מבולגן ולא תקני, ערבוביה של תגיות HTML שכוללות תוכן, עיצוב ועימוד.
בקיצור, לא משהו שכיף במיוחד לחפוש בתוכו אחרי מידע.
הגישה הנאווית לבעיות כאלו היא שימוש בביטוי רגולרי, אבל זה לא יעבוד טוב בכל המקרים (מה קורה למשל אם יש HTML בתוך התאור של הטורנט?).
בחרתי ללכת לגישה טיפה יותר חזקה, והיא פירוק מלא של הHTML למבנה נתונים בזכרון, וניתוח של אותו מבנה.
ספרית ג'אווה שמאפשרת parsing כזה לHTML היא htmlparser הוותיקה.
אבל גם אם htmlparser מחזירה לנו עץ אובייקטים נוח, איך מוציאים ממנו את מה שמעניין? הוא ענק וסבוך ויותר מכל מסובך.
למזלי מצאתי בונה פילטרים ויזואלי עם htmlparser. אפשר להריץ אותו עם Java web start:
[code]
javaws http://htmlparser.sourceforge.net/samples/filterbuilder.jnlp
[/code]
או פשוט להריץ את הקוד ישירות (org.htmlparser.parserapplications.filterbuilder.FilterBuilder). עורך הפילטרים מאפשר ליצור פילטרים מורכבים בהדרגתיות תוך בדיקה מתמדת של התוצאה על דף הHTML שאתם רוצים לבדוק.
אזהרה: הוא לא הכי ידידותי בעולם, לוקח זמן להתרגל אליו – אבל הוא עובד.
לדוגמא, נניח שאנחנו רוצים לחלץ את רשימת השחקנים מהסרט ביוולף בIMDB.
קודם נכניס בשורה התחתונה את הURL, אחר כך נלחץ על fetch page, ואז נקבל את הHTML כעץ בחלק הימני.
filterbuilder-1.png

ברגע שיש לנו את הHTML, נתחיל לפלטר. חיפוש קצר אחרי שם של אחד השחקנים (Musician #2) מצא את הטבלא, ולמרבה הנוחות אפשר לראות שclass הCSS שלה הוא cast. זה מצויין, כי זה יאפשר לנו לדוג את הטבלא בקלות:

נוסיף פילטר של תכונות (attributes), נכניס בו את התכונה class עם הערך cast.
קליק ימני על הפילטר, execute filter, ונקבל חלון קטן בצד ימין עם התוצאות.
בינגו, יש לנו את הטבלה.
filterbuilder-2.png

אבל אנחנו רוצים רק את רשימת השחקנים, אז צריך לעדן את הפילטר.
נוסיף שאנחנו רוצים רק טגים בשם TR, שיש להם הורה שהוא טבלא עם תכונה של class שערכו cast:
filterbuilder-3.png

אפשר להמשיך, אבל הרעיון – אני מקווה – ברור.
ברגע שאנחנו מרוצים מהפילטר שיצרנו, אפשר לשמור אותו.
זה מה שיוצא (גרסא מקוצרת):
[code lang="java"]

// Generated by FilterBuilder. http://htmlparser.org
// [aced0005737200206f…….17374]

import org.htmlparser.*;
import org.htmlparser.filters.*;
import org.htmlparser.beans.*;
import org.htmlparser.util.*;

public class imdb
{
public static void main (String args[])
{
TagNameFilter filter0 = new TagNameFilter ();
filter0.setName ("TR");
HasAttributeFilter filter1 = new HasAttributeFilter ();
filter1.setAttributeName ("class");
filter1.setAttributeValue ("cast");
HasParentFilter filter2 = new HasParentFilter ();
filter2.setRecursive (false);
filter2.setParentFilter (filter1);
NodeFilter[] array0 = new NodeFilter[2];
array0[0] = filter0;
array0[1] = filter2;
AndFilter filter3 = new AndFilter ();
filter3.setPredicates (array0);
NodeFilter[] array1 = new NodeFilter[1];
array1[0] = filter3;
FilterBean bean = new FilterBean ();
bean.setFilters (array1);
if (0 != args.length)
{
bean.setURL (args[0]);
System.out.println (bean.getNodes ().toHtml ());
}
else
System.out.println ("Usage: java -classpath .:htmlparser.jar:htmllexer.jar imdb ");
}
}
[/code]
בראש הקובץ יש קידוד של הפילטר, מה שמאפשר לנו לטעון את הקובץ ולהמשיך לעבוד עליו מאותה נקודה.
כדי לקמפל את זה צריך כמובן את htmlfilter.jar בclasspath.

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

בקלות, בעזרת ספרית ג'אווה בשם Rome.
השימוש ברומא פשוט מאוד, הנה דוגמא:
[code lang="java"]
public String getListRSS() throws FeedException
{
SyndFeed feed = new SyndFeedImpl();
feed.setFeedType("rss_2.0");
feed.setTitle("My RSS!");
feed.setLink("http://firefang.net/blog/768");
feed.setDescription("A feed for you!");
List entries = new ArrayList();
feed.setEntries(entries);

Vector v = new Vector();
v.add("item1");
v.add("item2");
v.add("item3");

for (int i = 0; i < v.size(); i++) { SyndEntry entry = new SyndEntryImpl(); entry.setTitle((String) v.elementAt(i)); entry.setLink("http:://imdb.com/"); entries.add(entry); } SyndFeedOutput output = new SyndFeedOutput(); return output.outputString(feed); } [/code] שמפיקה את הRSS הזה: [code lang="xml"]


My RSS! http://firefang.net/blog/768 A feed for you!

item1 http:://imdb.com/ http:://imdb.com/


item2 http:://imdb.com/ http:://imdb.com/


item3 http:://imdb.com/ http:://imdb.com/



[/code]

אז עכשיו שאנחנו יודעים לקחת דף HTML ולהוציא ממנו טקסט של RSS, נשאר רק לאפשר לקורא RSS רגילים לגשת אליו.
הדרך הטבעית תהיה להריץ שרת ווב קטן, שיגיש את קובץ הRSS למי שמבקש.
בחרתי להשתמש בJetty, שהוא שרת ווב קטן וגמיש בג'אווה, שמאפשר גם שילוב פשוט וקל בתוך אפליקציות אחרות.
לא להבהל מגודל ההורדה שלו, כדי להשתמש בו בתוך האפליקציה שלכם מספיק לקחת שלושה Jarים בגודל כולל של כ700K.
ככה משלבים את Jetty בתוך הישום שלכם, שימו לב כמה שזה פשוט.
[code lang="java"]
Handler handler=new AbstractHandler()
{
public void handle(String target, HttpServletRequest request, HttpServletResponse response, int dispatch)
throws IOException, ServletException
{
response.setContentType("text/html");
response.setStatus(HttpServletResponse.SC_OK);
response.getWriter().println("

Hello

");
((Request)request).setHandled(true);
}
}

Server server = new Server(8080);
server.setHandler(handler);
server.start();
[/code]

כדי לגשת אליו, נפתח את הדפדפן על http://localhost:8080 במקרה שלנו.
עכשיו רק נשאר לקשור את החוטים ביחד.

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

ספרית מפות חדשה לפיתוח אפליקציות web

לאחר חודשים של עבודה מפרכת שחררתי היום את ספרית המפות מבוססת ה-Google Web Toolkit שלי. הספריה מאפשרת פיתוח אפליקציות web עם מפות בשפת Java (החביבה עלי וכן על עמרי עד מאוד), כשם ש-Google Maps API מאפשר זאת למפתחי JavaScript.

לאחר נסיוני המר עם ה-GPL פרסמתי את ספרית המפות תחת ה-CC BY-NC-SA.

יום הולדת שמח, עמרי, ותהנה מהאוגרים!