אין מילים.
טוב, יש כמה. WOW היא אחת.
עוד מידע אצל מייקרוסופט.
May your sockets never timeout
נפלתי על פודקאסט מד"ב מצויין בשם Singularity, מאת ביל דסמט.
תרגום חופשי מהדף בפודיו-בוקס:
* מה אם הפיצוץ האדיר בטונגוסקה ב1908 נגרם, לא על ידי מטאור או כוכב שביט אלא על ידי חור שחור מיקרוסקופי?
* מה אם האובייקט הפנטסטי הזה, קטן מאטום, עתיק מהכוכבים, כבד מהר – עדיין נמצא שם, מסתובב עמוק בתוך כדור הארץ, בולע אותו לאט לאט?
* מה אם סוכנת ממשלתית מתחילה ויועץ מבריק עומדים בין ביליונר רוסי, ותוכניתו להשתמש בחור השחור כדי לשנות את ההיסטוריה – או לסיים אותה?
* מה אם הכל אמת?
הסיפור מאוד מעניין, ומאוד מדוייק טכנית (לפחות באלמנטים שאני מבין בהם).
כל כך טוב למעשה, שמייד אחרי שסיימתי לשמוע את הפודקסט החלטתי לקנות את הספר – לא כי יש סיכוי טוב שאני אקרא אותו אי פעם לאור המחסור שלי בזמן, אלא כדי לעודד את הסופר לשחרר גם את ההמשך המתוכנן – Dualism, בפורמט של
פודקאסט.
על הדרך קניתי גם את Earthcore ואת Ancestor, שני ספרים מצויינים של סקוט סיגלר:
אם אני כבר תומך בפודקסטרים שעושים עבודה טובה, אז עד הסוף.
שלושת הספרים/פודקסטים מומלצים בחום (כולם זמינים בPodiobooks)
TiVO מזהירים שGPL3 יפגע בהם.
מסתבר שמערכות TiVO הן מבוססות לינוקס, ומתוכננות להפסיק לפעול אם הן מזהות שמשתמש מנסה לנטרל את מנגנון הDRM
TiVO מוסרים שאם GPL3 יאומץ, הם לא יוכלו להמשיך לכלול שיפורים עתידיים בגנו/לינוקס למערכת שלהם.
אתם שומעים את זה? כמו רעש של טיפות?
אלו הדמעות שיורדות לי.
TiVO מוחים שהם יאלצו להפסיק להגביל את המשתמשים שלהם.
עצוב נורא.
אה, איך נפלו גיבורים.
גוגל מרחיבים את מקורות הידע שלהם על קהל הגולשים, אם עד עכשיו גוגל אספו עלינו מידע דרך החיפושים שעשינו, הפגישות שהכנסנו לגוגל קלנדר, האימיילים ששלחנו וקיבלנו בג'ימייל, וכמובן אתרים שמשתמשים בגוגל אנליטיקס ואנחנו מבקרים בהם, אז עכשיו נוספו ערוצי הRSS שאנחנו מנויים עליהם דרך פיד ברנר לרשימה.
לא יודע מה איתכם, אבל אני הולך להפסיק להשתמש בפיד ברנר.
בנוסף, אני אשקול להוסיף סטטיסטיקות RSS לפיירסטטס. (בקשת שיפור 161)
כל מתכנת מתחיל נתקל בצורך לפענח שפות פשוטות בשלב מאוד מוקדם בקריירה שלו, הנה כמה דוגמאות לשפות פשוטות:
key1=value1
key2=value2
key3=another value
הטקסט שלמעלה הוא טקסט בשפה של קבצי Properties בג'אווה.
לא קשה לכתוב קוד בסיסי שמפענח אותו (נעזוב לרגע את זה שלא צריך לכתוב כזה כי המחלקה Properties יודעת לקרוא את זה):
private static void parse(BufferedReader reader) throws IOException
{
String line = null;
while ((line = reader.readLine()) != null)
{
StringTokenizer tok = new StringTokenizer(line, "=");
String key = tok.nextToken();
String value = tok.nextToken();
System.err.println("Read: key = " + key + ", value = " + value);
}
}
פשוט מספיק, נכון?
אבל השפה מכילה גם הערות, שאפשר שאפשר לציין באמצעות סימן #. כל מה שאחרי ה# מוגדר כהערה.
הקוד הקודם לא מתמודד עם זה – ולמרות שזה לא מסובך במיוחד להוסיף את זה, זה טיפה יותר קשה ממה שזה נראה במבט ראשון כי יש כל מני מקרים:
* האם ההערה היא בתחילת השורה? (מתעלמים מכל השורה).
* האם ההערה היא בסוף השורה? (השורה מכילה זוג ערכים וגם הערה).
עוד דבר אפשרי הוא לשבור שורה באמצע:
key1=ABC\
DEFG
פה יש רק ערך אחד לפי החוקים של השפה.
וזה לא הכל, יש עוד כמה עיזים שמסבכים את הטיפול בקלט הזה.
הקוד שקורא את השפה הזו שבמחלקה Propertis הסטנדרטית בג'אווה הוא בערך באורך של 50 שורות.
יחסית ארוך בשביל משהו כל כך פשוט, לא?
כששפה מסתבכת יותר העסק נהיה הרבה יותר מורכב ועדין מזה, אם קריאה של שפה כל כך פשוטה צריכה 50 שורות קוד, מה יעשה מי שצריך לבנות קומפיילר או שפת שאילתות מורכבת?
יש תאוריה ענפה מסביב לניתוח תחבירי וסמנטי של שפות פורמליות, ויש כלים טובים שעוזרים לפתור את הבעיה.
בגדול הרעיון הוא להגדיר את התחביר בצורה פורמלית, ולייצר ממנו בצורה אוטומטית קוד שמשמש לקריאה של קלט בשפה.
העסק לא פשוט, ודורש רקע תאורטי באוטומטים ושפות פורמליות (שכלול בכל תואר במדעי המחשב), אבל למרות מחיר הכניסה הגבוה שצריך לשלם כדי לשלוט בכלים האלו, זה בהחלט שווה את זה.
בגדול, יש חלוקה כזו:
חלק ראשון הוא המנתח הלקסיקלי, שמקבל זרם תווים, ומוציא זרם של לקסמות, הידועים גם כאסימונים (Tokens). האסימונים מוגדרים באמצעות ביטויים רגולריים (שפה דומה לשפה שמשמשת את grep).
חלק שני הוא המנתח התחבירי, שמקבל זרם של אסימונים מהמנתח הלקסיקלי, ומוציא עץ תחביר אבסטרקטי (Abstract syntax tree).
יש כלים שיודעים לקבל הגדות לקסיקליות ותחבירות, ולייצר מזה בצורה אוטומטית קוד שיודע לפענח קלט בשםה הנתונה. למעשה, הטכניקה המקובלת לכתיבת קומפיילרים כבר עשרות שנים מתבססת על כלים אוטומטיים כאלו.
את הPreprocessor של אנטנה כתבתי תוך שימוש בantlr, שהוא כלי כזה שכתוב בג'אווה, אבל יודע לייצר קוד במגוון שפות, ובקורס קומפילציה שאני לוקח כרגע בפתוחה לומדים להשתמש בכלים הקלאסיים – flex וbison.
לדעתי antlr הרבה יותר סימפטי לעבודה.
אם תהיה דרישה אני ארחיב עוד בנושא.
מי שניסה להגדיר בלינוקס מנגנון Traffic shaping יודע שלא מדובר במשימה לרכי לבב.
trickle הוא פתרון פשוט, שעובד עבור ישומים שמשתמשים בחיבור TCP בלבד.
טריקל עובד במרחב המשתמש ולא צריך מודולים בקרנל או משהו מורכב אחר.
ככה זה נראה בלי טריקל:
$ wget http://yadan.net/bulk.dat
–22:01:39– http://yadan.net/bulk.dat
=> `bulk.dat'
Resolving yadan.net… 10.0.0.2
Connecting to yadan.net|10.0.0.2|:80… connected.
HTTP request sent, awaiting response… 200 OK
Length: 20,480,000 (20M) [chemical/x-mopac-input]
14% [=============> ] 6,966,584 11.07M/s
וככה עם:
$ trickle -d 50k wget http://yadan.net/bulk.dat
trickle: Could not reach trickled, working independently: No such file or directory
–22:04:33– http://yadan.net/bulk.dat
=> `bulk.dat.2'
Resolving yadan.net… 10.0.0.2
Connecting to yadan.net|10.0.0.2|:80… connected.
HTTP request sent, awaiting response… 200 OK
Length: 20,480,000 (20M) [chemical/x-mopac-input]1% [> ] 278,528 52.48K/s ETA 06:15
בעיות רשת מוזרות יכולות לחרפן גם את המתכנת/טכנאי הסבלני ביותר.
הנה מספר בעיות רשת מוזרות שנתקלתי בהן לאחרונה, וניתוח מלא של הפתרון והדרך להגיע אליו.
הפוסט טכני, ולא מומלץ לרכי הלבב.
BattleField 2142, משחק רשת מרובה משתתפים עובד היטב, עד שיום בהיר אחד הוא מפסיק לראות שרתים ברשת.
פניתי לתמיכה של EA, שהציעו להסיר ולהתקין מחדש, תוך מחיקה של כל רמז לספריות נוספות שהמשחק שומר (במילים אחרון, אין להם מושג והם יורים באפלה).
עקבתי אחרי ההוראות, וכמובן שהבעיה לא נפתרה.
בצר לי, הורדתי את WireShark (לשעבר Ethereal), שהוא Network sniffer רב עוצמה, והפעלתי אותו לפני ההפעלה של המשחק.
די בקלות זיהיתי את הבעיה: המשחק שולח בקשת DNS למציאת כתובת הIP של השרת שמחזיק את רשימת השרתים, מקבל שגיאה מהDNS ומתעלם ממנה ומפסיק לנסות בלי למסור הודעת שגיאה למשתמש.
ברגע שהחלפתי את שרת הDNS שלי הבעיה נפתרה.
Call of duty 2, עוד משחק רשת משובח, עובד היטב ברשת המשרדית, עד שיום בהיר אחד הוא מפסיק לראות שרתים אחרים.
במילים אחרות, עמרי לא יכול להצטרף לשרתי המשחק ברשת, ונאלץ לעבוד בעבודה.
לאחר הטחת האשמות סרק ברשת, בסוויץ' במערכת הפעלה ובאלוהים, הפעלתי את WireShark על שני מחשבים, אחד בו אין בעיה, וזה שלי.
לאחר שהפעלתי את המשחק בשניהם, בחנתי את תעבורת הרשת, וגיליתי את הדבר הבא:
המשחק שולח בBroadcast פקטת UDP לכל הרשת כשהוא מחפש שרתים, והשרתים אמורים לענות לו ולמסור לו מידע על עצמם. (כדי לשלוח Broadcast צריך לשלוח את הפקטה לכתובת 255.255.255.255).
עד פה הכל טוב, רק שראיתי משהו מוזר במחשב שלי. במקום לצאת מכתובת הIP הרגילה שלי הוא יצא מכתובת IP אחרת, שבכלל לא נראית כאילו היא ברשת הפנימית שלנו.
מסתבר שהכתובת הנ"ל (192.168.40.1) שייכת למתאם רשת וירטואלי של VMWare, ומסיבה עלומה המשחק שלח את חבילת הUDP כאשר הכתובת של המתאם היא כתובת המקור של החבילה. השרת ניסה לענות, אבל מכיוון שהכתובת לא ברשת לא קיבלתי את התשובה.
אחרי ביטול של מתאמי הרשת של VMWare הבעיה נפתרה.
תוכנה שאנחנו מפתחים בעבודה מקבלת זרם של חבילות UDP משרת.
התוכנה עובדת טוב מול שרת אחד, ומאוד לאט מול שרת שני, שני השרתים מריצים את אותה תוכנה בדיוק.
הפעלה של WireShark על השרת והמכונה שמריצה את הלקוח מראה שהשרת שולח את החבילות בקצב הנכון, והחבילות מגיעות למכונת היעד באותו קצב, ובכל זאת לאפליקציית הלקוח החבילות מגיעות מאוד לאט.
הלקוח רץ על WTK, שהוא אמולטור של סביבות ג'אווה של פלאפונים. לWTK יש כלי Profiling פנימי, שמאפשר להגיד איפה האפליקציה משחיתה את זמנה.
הפעלתי את הפרופיילר, והסתבר שהיא משחיתה את מיטב זמנה בפונקציית מערכת בשם getHostByName.
תפקידה של הפונקציה הזו הוא בעצם לקבל כתובת שמית ולהמיר אותה לכתובת IP מספרית, במילים אחרות – לקרוא לDNS.
מסיבה לא ברורה הפונקציה לקחה הרבה זמן, ומסיבה לא ברורה היא נקראה עבוד כל חבילת UDP שהגיעה לאמולטור (באג באמולטור לדעתי, אבל שיהיה).
לחלונות יש קובץ בשם hosts בספריית החלונות, שדומה מאוד לאותו קובץ במערכות יוניקס (זה מראה על הקשר בין חלונות ליוניקסים), הקובץ משמש להוספה ידנית של רשומות לDNS המקומי.
ברגע שהוספתי את כתובת הIP של השרת לקובץ ההוסטים הבעיה נפתרה.
עד כאן פינתנו, בעיות רשת מוזרות.
נבחרי הציבור לא מפסיקים להפתיע ולחדש, והפעם – הצעת החוק של ח"כ אמנון כהן.
למי שבדיוק חזר מהירח, אמנון כהן מציע לחסום אתרי "מין, הימורים ואלימות" מכלל הגולשים, למעט מבוגרים שיבקשו מפורשות להסיר את החסימה.
בנוסף, הח"כ הנכבד מציע זיהוי ביומטרי (טביעת אצבע) כדי לזהות את הגולש.
יש כל כך הרבה בעיות עם ההצעה הזו, שקשה אפילו להתחיל.
הדבר שהכי מפריע לי הוא שבשם הצדקנות החרדית, החופש שלי ושלכם נפגע.
לא מדובר במושג מופשט, אני לא צריך ולא רוצה שח"כ אמנון כהן פלמוני יחליט בשבילי לאיזה אתרים אני יכול להכנס, ואני במיוחד לא מוכן שספקית אינטרנט תחזיק מידע שיכול לזהות אותי לפי טביעת אצבע (!), וכן – אני יודע שזה רק hash, אבל זה שקול לצורך העניין.
אני לא מוכן אפילו להכנס לדיון לגבי הנזק שזה גורם לילדים, יש דרכים אחרות לפתור את זה והבלוגוספירה מלאה בהצעות טובות, למשל:
* העברת המחשב הביתי לסלון, שם הילדים יהיו תחת פיקוח בזמן שהם גולשים.
* חיוב ספקיות האינטרנט לספק שרות סינון אתרים (בתשלום) למי שמעוניין.
* יצירת מסלול גלישה מצונזר ומאובטח לחרדים רכי לבב ששמים זין על הפרטיות והחופש שלהם. (אם להם לא איכפת, מי אני שאזיז אצבע בשבילם).
גל מור הניף את דגל המאבק, ומציע להציף את נבחרי הציבור בדרישות להפיל את הצעת החוק בתאריך קרוב להצבעה (התאריך לא ידוע עדיין).