October 2007 - Posts
עדכון: יש פוסט מעודכן. עברו כמה שנים מאז שהפוסט הזה נכתב.
אני משתמש כבד של מודם סלולארי. כבד מאוד אפילו.
את הזמן שנשאר בין תורנויות מטבח, הקלדת המסמכים של הרב ושטיפת בית הכנסת בימ"ח אני משתדל לנצל בעזרתו האדיבה של מחשבי הנייד ומוטורולה v3x.
אז לטובת כל מי שיזדקק, מדריך הישרדות עם החיבור הנ"ל.
1. חבילה
הסיפור הזה יהיה יקר מדי בלי חבילה, וגם החבילות עצמן כלל לא זולות. אני אישית בחרתי את חבילת ה-Ultra UTMS שכוללת תעבורה בנפח של 12GB. חבילות נוספות שנפוצות הן 60 (נדמה לי) מגה, 300 מגה ו-1G. אין חבילת ביניים בתחום של 1-12GB.
מחיר החבילה בה אני משתמש - 240 ש"ח בחודש כולל מע"מ, שזה אומר שני שליש מהמשכורת (כלומר - 380 שקלים חדשים וחצי).
2. מגבלות קליטה
החיבור הנפוץ הוא דור שלישי, ששטח הכיסוי שלו כולל את רוב שטח היישובים בארץ ישראל המערבית.
מקומות חסרי קליטה לדוגמא: צומת ה-T (לכיוון בית אל) וואדי חרמיה על כביש 60, בסיס גדנ"ע צלמון, חומש, שא נור (באחרון אין כיסוי בכלל, גם לא דור שני).
בקיצור - כבישים הרריים, עם דגש חזק על אלו של יהודה ושומרון וצפון הארץ. בשפלה כמעט ולא נתקלתי בבעיות כיסוי.
בגבעות מיושבות (למשל גבעות עולם ליד איתמר, או מאחזים באזור אלון מורה) הקליטה לרוב חלקה, וכך גם בבסיסי צה"ל הממוקמים במקומות אסטרטגיים.
למי שתהה - כן, התחברתי לרשת מכל המקומות האלה. החל מהגבעות ליד איתמר, חומש וגבעות נוספות. היכן שהיה כיסוי דור שלישי עבד חלק.
קיבלתי שגיאה באימייל, אז ניסיתי להתחבר לרשת ולראות מה קורה.
על חורבות היישוב חומש בצפון השומרון.
3. מגבלות הרשת
א. מהירות - דור שלישי ע"ב UTMS הוא בקצבים של עד 380Kbps. מהירויות ההורדה האפקטיביות משרתי HTTP הן סביב 32-33KBps, בתנאים טובים הגעתי לסביבות ה-46KBps שזה פחות או יותר המקסימום.
ב. שיהוי (Delay) מטורף - 200-600ms הוא זמן התגובה של פינגים לארץ בדרך כלל. בדור שני המצב גרוע בהרבה ומגיע לעד שניה וחצי.
ג. פרוקסי - בעיה נוספת עבור מפתחי Web היא העובדה (אותה ניתן לגלות למי שקצת מבין) שישנו שרת פרוקסי שקוף המופעל על ידי החברות הסלולאריות, ששומר תמונות וקבצים סטטיים למשך כיומיים.
תקלה דחופה שתיקנת - אתה לא יכול לבדוק את הקובץ העדכני.
ד. שימוש בכתובות IP פנימיות - חוסם את האפשרות להתחבר לרשתות מרוחקות המשתמשות באותם הטווחים.
4. פיתרונות יצירתיים
אז עד עכשיו התלוננתי. מה בכל זאת אפשר לעשות, כשאין שום אפשרות אחרת להתחבר לרשת בחיבור קווי או WiFi ?
א. הגדלת מספר החיבורים בו זמנית של IE מ-2 (ברירת המחדל) ל-10. משפר את הביצועים בעשרות אחוזים. במקום להוריד 2 תמונות במקביל (ויש הרי שיהוי מטורף), הוא מוריד 10 במקביל.
ב. התחברות ב-VPN או SSL VPN (עדיף!) ושימוש בפרוקסי הנמצא ברשת אחרת (שימו לב לטווח הכתובות שבשימוש הרשת המרוחקת).
לעיתים מעט איטי יותר אבל נטול בעיות קאש.
ג. לדעת לבחור אתרים שכתבו HTML נקי וקצר, ולא מערכות מבוססות Community Server או האתרים הישראליים הפופולאריים (YNET, NRG) שאליהם אי אפשר להיכנס בכלל.
ערוץ 7 למי שתהה - עובד חלק, וכך גם אתרים שמשקל דפי ה-HTML שם הוא עד כ-50KB.
לפני כמה חודשים (או יותר, לא זוכר כבר), port 25 של Microsoft העלו Plug In של Windows Media עבור Firefox. בתור מי שמפעיל אתר חדשות טלוויזיה על בסיס שרת Windows Media, קפצתי על המציאה וחיש קל, התחלתי לשחק עם הרכיב החדש.
הלקוח עובד כמצופה, ולמעט כמה התנהגויות שניצלתי בחלונות ולא יכולתי לנצל בו הוא פעל כהלכה (אחת מהן היא הסתרה של סרגל הלחצנים שלו באמצעות CSS, מכיוון שאחרת לא יופיע הסרגל גם במסך מלא).
כשהגעתי לשלב הפיתוח, הסתבר שהוא לא מגיב לפקודה mp.controls.Play() כמו ב-IE. חמש דקות נוספות של עבודה הראו כי לפקודה mp.controls.play() הוא דווקא כן מגיב, אבל IE דווקא לא.
עוד חצי שעה של נסיונות העלו את התוצאה העקומה הבאה, שדווקא עובדת כהלכה:
mp = document.getElementById('Player');
try {
mp.controls.Play()
}
catch(e) {
mp.controls.play();
}
עקום, אבל עובד מצויין. והנה זה פה למי שיחפש את זה בגוגל בהמשך.
בלא מעט רשתות מותקן שרת DNS, מלא מעט סיבות. על פי רוב הוא משמש כ-DNS Proxy אבל אפשר לשמש אותו גם לעוד דברים.
לעיתים נוצר צורך לפתוח שרתי פיתוח כלפי חוץ ו/או שרתים שמריצים אפליקציות שונות כמו OWA.
לכאורה אין פשוט מזה - פותחים את הפורט המתאים ב-FW או בנתב ובזה נגמר הסיפור.
הבעיה מתחילה כאשר יש שימוש ב-Name based ברמת IIS, ומאחר ורוב הנתבים בשוק לא נותנים להיכנס מבפנים לניתוב החיצוני.
גישה מבחוץ לכתובת שהגדרנו (נניח stam.co.il) עובדת, בעוד שגישה ממחשבים בתוך הרשת לא עובדת, מכיוון שכתובת ה-IP החיצונית של ה-FW לא מגיבה.
הפיתרון הוא פשוט למדיי:
נכנסים לשרת ה-DNS, יוצרים שם zone חדש של Forward Lookup על הדומיין שלנו, ומגדירים אותו כמו שמגדירים כל דומיין אחר בשרת, אבל במקום כתובת הIP החיצונית, מגדירים את ה-IP הפנימי של שרת הפיתוח. ב-DNS שמגיב לכל העולם אין שינוי.
התוצאה:
מחשב ברשת הפנימית:
nslookup stam.co.il
Server: dnsname
Address: 192.168.0.1
Name: stam.co.il
Address: 192.168.0.4
וברשת החיצונית:
nslookup stam.co.il dns.netvision.net.il
Server: UnKnown
Address: 194.90.1.5
Non-authoritative answer:
Name: stam.co.il
Address: 194.90.181.242
כמובן שלא מעט פרטים כאן שונו, אבל העיקרון מובן. שימו לב שבשאילתא הראשונה התשובה אינה Non-authoritative answer, בגלל שה-DNS יודע שהדומיין בעצם אצלו.
בשלב הזה אפשר להשתמש באותו שם גם מבפנים וגם מבחוץ, ולתת לינק למי שצריך. עדיף תמיד להגביל גישה למכונת הפיתוח לפי כתובת IP.
אחד התוספים הנפוצים ל-MSN Messenger נקרא Messenger Plus. נתקלתי לפני כשנה וחצי בתכונה נחמדה שלו - Scripting בשפת JS.
את JS אני מכיר על בוריה, ואת המימוש של ActiveX שלה גם עוד מימי עבודתי בסביבת ASP הפרה היסטורית, וכך באחד מימי שישי בתקופת הטירונות, הורדתי את ה-CHM שלהם (נמצא בתפריטים של התוכנה) שמספק נתונים סבירים על סביבת הפיתוח והתחלתי לעבוד. חיפשתי פיתרון שיאפשר לי לצ'וטט בעזרת מכשירים ניידים בלי לנתק את הבית ובלי הזמן הארוך שלוקח להתחבר.
בשלב הבא עשיתי דבר מאוד מאוד פשוט, ומאוד מאוד בסיסי:
לקחת את כל ההודעות שאני מקבל, ולזרוק אותם ל-DB כלשהו. הוספתי גם טבלאות עבור אנשי הקשר והוספתי פה ושם קוד (שלא כתוב לפי כל כללי הכתיבה התמה) שאמור לעדכן ב-DB את מצב אנשי הקשר.
function OnEvent_ChatWndReceiveMessage(ChatWnd, Origin, Message, MessageKind )
{
var e = new Enumerator(ChatWnd.Contacts);
for(; !e.atEnd(); e.moveNext())
{
var Contact = e.item();
if (Contact.Name == Origin) Origin = Contact.Email;
}
if (Origin.indexOf("@")==-1) {return false;} // לא מצאנו את המשתמש משום מה
var oConn = new ActiveXObject("ADODB.Connection");
oConn.Open(sConn);
oConn.Execute("insert into Messages (m_new,m_date,m_from,m_type,m_message) values (1,Now(),'"+SSQL(Origin)+"',0,'" +SSQL(Message)+"')");
oRs = oConn.Execute("select count(m_id) from messages where m_new=1 and m_from='"+ Origin +"'");
iNum = oRs(0)*1;
oRs.Close(); oRs = null;
oConn.Execute("update Contacts set c_LastMsg = Now(), c_Count = "+iNum+" Where c_email='"+ Origin +"'");
oConn.Close();
oConn = null;
aChatLastUpdate[ChatWnd.Handle] = new Date()
}
שליפה מ-DB זו לא בעיה קשה. בזמן קצר (וב- ASPX עם HTML קלאסי, למרות שאולי Mobile Web Forms היה מתאים יותר) בניתי אפליקציה שתפקידה לקרוא את הנתונים מה-DB ולהציג לפלאפון.
עכשיו נשאר לי לדאוג לכך שאוכל גם לכתוב ולא רק לקרוא.
חזרתי לסקריפט, כתבתי שם טיימר שמדי 10 שניות מתחבר לשרת ובודק אם יש הודעות בטבלה שעוד לא נשלחו, ואם כן - שישלח אותם.
בגלל מבנה ה-Messenger זה קצת יותר מורכב ממה שזה נשמע (יש שם נושא של ניהול Sessions שהם בעצם חלונות שיחה מול משתמשים) ולאחר עוד קצת זמן גם זה עבד.
function OnEvent_Timer(TimerID)
{
if (TimerID=="poll")
{
var oConn = new ActiveXObject("ADODB.Connection");
try {
oConn.Open(sConn);
}
catch(e) { MsgPlus.AddTimer("poll",10000); return false;}
var oRs = oConn.Execute("select * from Messages where m_type=1");
while(!oRs.Eof) {
var Window;
var sFrom = oRs("m_from")
var e = new Enumerator(Messenger.CurrentChats);
for(; !e.atEnd(); e.moveNext()) {
var ChatWnd = e.item();
var e = new Enumerator(ChatWnd.Contacts);
for(; !e.atEnd(); e.moveNext()) {
var Contact = e.item();
if (Contact.Email == sFrom) Window = ChatWnd;
}
}
if (Window==null) Window = Messenger.OpenChat(sFrom); // אם אין חלון שיחה פתוח
Window.SendMessage(oRs("m_message")); // שלח את ההודעה בפועל
aChatLastUpdate[Window.Handle] = new Date();
oConn.Execute("delete from Messages where m_id="+ oRs("m_id")); // מחיקת ההודעה מהדיבי
oRs.MoveNext();
}
זה עבד יפה, אבל אני רציתי קצת יותר.
רציתי גם לשלוף (ולעדכן) את המצב שלי, גם זה ישירות בדיבי
(יש כאן תמיכה באפשרות להגדיר מצבים נוספים לקנפוג מרחוק, בפועל נעשה שימוש רק באחד מהם):
oRs = oConn.Execute("select * from data where d_update=1")
while(!oRs.Eof) {
switch(oRs("d_id")*1) {
case 1:
Messenger.MyStatus = oRs("d_value");
break;
}
oRs.MoveNext();
}
oRs.Close(); oRs = null;
ובהמשך
MsgPlus.AddTimer("poll",10000);
oConn.Close(); oConn = null;
}
בפועל יש שם עוד לא מעט קוד, שמטפל בסגירה אוטומאטית של חלונות ה-Messenger שכלל ההודעות שנכתבו בהם נקראו על ידי הלקוח המרוחק, או שסתם נשארו פתוחים, או שהם של משתמשים נודניקים שאני לא רוצה/יכול לחסום, אבל זה לא רלוונטי ולכן דילגתי.
עוד כמה פונקציות:
// עדכון פרטי איש קשר, כשמתחבר/מתנתק או משנה מצב/שם:
function OnEvent_ContactSignin(Email) {ContactUpdate(Email)}
function OnEvent_ContactSignout(Email) {ContactUpdate(Email)}
function OnEvent_ContactStatusChange(Email) {ContactUpdate(Email)}
function OnEvent_ContactNameChange(Email) {ContactUpdate(Email)}
function ContactUpdate(Email)
{
var oConn = new ActiveXObject("ADODB.Connection");
oConn.Open(sConn)
var e = new Enumerator(Messenger.MyContacts);
for(; !e.atEnd(); e.moveNext())
{
var Contact = e.item();
if (Contact.Email==Email) {
var oRs = oConn.Execute("select c_id from Contacts where c_email='"+Contact.Email+"'");
if (oRs.Eof) oConn.Execute("Insert Into Contacts (c_name,c_email,c_status) values('"+SSQL(Contact.Name) +"','"+Contact.Email+"',"+Contact.Status+")");
else oConn.Execute("Update Contacts set c_name = '"+SSQL(Contact.Name) +"', c_status = "+Contact.Status+" where c_email = '"+Contact.Email+"'");
}
}
oConn.Close()
oConn = null;
}
// כניסה למערכת: עדכון כלל פרטי המשתמשים במערכת
function OnEvent_Signin(sEmail) {
var oConn = new ActiveXObject("ADODB.Connection");
oConn.Open(sConn)
var e = new Enumerator(Messenger.MyContacts);
for(; !e.atEnd(); e.moveNext())
{
var Contact = e.item();
var oRs = oConn.Execute("select * from Contacts where c_email='"+Contact.Email+"'");
if (oRs.Eof) oConn.Execute("Insert Into Contacts (c_name,c_email,c_status) \
values('"+SSQL(Contact.Name) +"','"+Contact.Email+"',"+Contact.Status+")");
else oConn.Execute("Update Contacts set c_name = '"+SSQL(Contact.Name) +"', c_status = "+Contact.Status+" where c_email = '"+Contact.Email+"'");
}
oConn.Close()
oConn = null;
}
function SSQL(str) {return str.replace(/\'/g,"''")} // גרשיים עבור SQL
MsgPlus.AddTimer("poll",1000); // הפעלת הטיימר
עכשיו נשאר רק לשכתב את זה בצורה יותר נחמדה שתגרום לפחות "קפיאות" של המסנג'ר ותאפשר עבודה גם על שרתים מרוחקים - עבודה מול איזה WebService דרך XMLHTTP.
מסנני האתרים - מהצד של מפתחי האתרים.
מי מכם שקרא את עלוני בתי הכנסת של הציבור הדתי לאומי או את השבועון "בשבע", נתקל שם בחודש-חודשיים האחרונים במתקפה רבתי על "האינטרנט הפרוץ" וקריאה לנתק אותו בכלל או לשים עליו מסנן. הכוונה כמובן לבעיית הפורנוגרפיה ברשת, והעובדה שצעירים (וגם מבוגרים) דתיים גולשים באתרים הללו. אמר לי בעבר מנהל בי"ס תיכון כי אין לו ספק שתלמידיו נכנסים לזבל ואין לו מה לעשות נגד זה, אבל שלא יהיה "על מצפוני", ובחר בפיתרון של מורשת, פיתרון שחייב את המורים לבטל את החסימה לפני כל שיעור אנגלית ע"מ שבכלל ניתן יהיה לחפש משהו בגוגל.
ישנם פתרונות חסימה וסינון רבים בשוק:
פתרונות ברמת הרשת המקומית - שרתי פרוקסי שמוגדרים אד-הוק על ידי מנהלי מערכת נמרצים, כלי סינון המובנים בנתבים או שרתי סינון (SurfControl למשל) ואחרים. העובדה שאתרי פורנו הגיעו לרוב עם רוגלות ושאר תוכנות זבל שמספקות אחר כך עבודה ל-HelpDesk עודדה חסימת האתרים הללו.
בשוק הפרטי והבלתי מקצועי היו בעיקר תוכנות סינון שונות שרצות על המחשב המקומי, כמו זו של בב"ל - של חברת iCognito או של NV מבית PureSight, ואחרים. יש אפילו אחד שמגיע עם מערכת ההפעלה Windows Vista ואחר כתוסף לדפדפן Firefox. היה גם מי שחסם אתרים פה ושם ע"י שימוש בקובץ hosts של מערכת ההפעלה.
פתרונות אחרים מומשו ברמת ה-ISP (ספק האינטרנט) ואלו מקודמים בראש חוצות על ידי רבנים ומחנכים, ובאלו אשתדל להתמקד כאן:
"מורשת" הינו הספק הראשון שהרים את הכפפה. בעבר היה ספק אינטרנט עצמאי והיום מציע שרותי סינון מגוונים דרך בב"ל (אקטקום ז"ל) ואינטרנט זהב.
הרשימה השחורה שלהם לא מי יודע מה יעילה, והרשימה הלבנה משאירה אינטרנט-צעצוע חסר תועלת, משהו כמו מה שנפוץ ב"דמוקרטיה" בסין ובמדינות המפרץ או באיראן.
גרוע מכך - לא רבים יודעים את זה, אבל כל משתמשי הרשימה הלבנה שלהם מחוברים דרך כתובת IP בודדת לעולם, המשמעות היא שאם יש גולש שמציף מהכתובת הזו, חסימתה תגרור חסימת עשרות אלפי המשתמשים של הספק מהאתר. פעם ידעתי אותה בעל פה אבל לאחרונה היא התחלפה.
בניתם אתר שפונה לקהל יעד דתי או בתי ספר? מורשת לא יאשרו אותו מיוזמתם. אתם צריכים לשלוח להם מייל מיוחד ולהתחנן שהם יוסיפו את האתר ל"רשימה הלבנה" שלהם, ולא - ילדי בתי הספר הדתיים לא יוכלו לגלוש באתר שלכם. הם גם לרוב לא עונים למיילים וצריך לנסות פעמיים ושלוש. מנסיון.
יש לכם שרת שמחזיק קבצים סטטיים או דבר דומה - צריך לבקש מהם לפתוח גם אותו. עלוב..
"אינטרנט רימון" הוא ספק סינון חדש יחסית שנדחף בעיקר על ידי ישיבת ההסדר רמת גן והרב יהושוע שפירא. שמעתי עליו לראשונה מחבר, שלמד שם והיה חלק מהצוות שהריץ את הסיפור הזה בגירסת הביטא. היה נשמע לי מעניין ובדקתי קצת יותר לעומק את הפיתרון שלהם. יש לציין שלא התחברתי אליו ממש אלא נעזרתי באחרים שהתחברו ו/או עבדו במרכז הבקרה שלהם.
לרימון מסלולי סינון מגוונים המבוססים על מרכז בקרה אנושי שבודק ומאשר אתרים חדשים בזמן אמת, מה שמאפשר בחבילות הבסיסיות גלישה כמעט חופשית (ייתרון אדיר על מורשת למשל). הם טוענים שהם יודעים לסנן עד רמת התמונה או הדף הבודד.
כך למשל, נראה מדור באתר YNet אחרי שרימון סיננו חלק מהתכנים שבו:

צילום: אתר כיפה (מתוך כתבה שלהם על הנושא)
גם שם נמצא בשימוש IP בודד לחלק מחבילות הסינון הסגורות יותר וגם שם ניתן לראות עשרות גולשים בו זמנית ללא קשר בניהם מחוברים מכתובת ה-IP הזאת: 213.151.32.56.
חסמתם אותו - כל משתמשי רימון לא יוכלו להתחבר לאתר שלכם (או להגיב וכו').
בעיה נוספת עם שירותי הסינון היא העובדה שהם לרוב מסננים את הפרסומות, גם בגלל אופיין הבוטה והלא צנוע (מנקודת המבט הדתית כמובן) וגם בתור צ'ופר לגולשים דרך אותו ספק. המשמעות הכלכלית לאתרים ברורה מאליה. אחרים מסננים על הדרך קבצים נלווים לאתר בגלל שמצאו שם משהו חשוד כבעייתי ואז אתם מגלים שהאתר לא עובד כי קובץ JS כלשהו נחסם.
מילים נפוצות שנחסמות: sex (שימו לב! נוטה להיבלע בין 2 מילים בכתובות של דפים), icq, messenger (לחסום לקוחות IM מבוססי Web) ואחרים.
גם אם התופעה כרגע יחסית זניחה, באתרים הפונים לקהל היעד הדתי או הצעיר ניכרת עליה משמעותית בשימוש בספקים הללו, כאשר בכ-95% מחדרי המחשבים בבתי הספר או בישיבות/אולפנות (מקביל לתיכון) מותקן שירות סינון כלשהו, לרוב מורשת או רימון.
בקיצור - כדאי לדעת.
אני חדש. יקח לי קצת זמן להשתלט על כל הרכיבים של Community Server, ואיך מיישרים פה בדיוק בשביל RTL לעברית, אבל גם זה יקרה בסוף.
שמי משה, מגרד את העשרים מלמטה ומשרת היום בצה"ל כפקיד רבנות. מתכנת מזה כ-10 שנים. זה התחיל בתכנות בסיסי בשפת Basic, עבר מתישהו ל-VB 6 ובמקביל HTML, JS, CSS, ASP ובהמשך גם ASP.net. במקביל עסקתי גם קצת בתחום ה-System בשביל להכיר קצת יותר את המערכות שעליהן אני עובד ובעיקר כדי לתכנן פיתרונות יצירתיים.
"רבי מאיר רימון מצא, תוכו אכל - קליפתו זרק" (חגיגה ע"ב)
יש כאלה שאצלם מערכת ההפעלה
זה דת. אצלי מערכת ההפעלה (ו/או סביבת הפיתוח) היא כלי שנבחר לפי העניין ולפי הצורך ולפי העניין. סביבת הפיתוח העיקרית שלי היא Windows 2003 - IIS6 + ASP.net + VB.net + MySQL כאשר הכלים מסביב נבחרים לפי העניין.
בשנת תשס"ב-2002, התחלתי להרים אתר לתנועת הנוער בה הייתי חבר - "עזרא". יחד עם האתר העלתי מערכת פורומים מוכנה (סניץ) שאותה תרגמתי לא הרבה זמן קודם. עם הזמן הפורומים תפסו תאוצה ואני נכנסתי למעגל קסמים:
האתר מתפתח וגדל > נהיה כבד ואיטי > אני מייעל את הקוד ומשכתב > הבעיה נפתרת > האתר גדל עוד יותר וחוזר חלילה.
העובדה שמדובר היה באתר ללא תקציב שאוחסן על שרתים חינמיים ו/או אחסון שיתופי בסיסי, חייבה אותי לבנות את האתר עם חשיבה מקסימלית על ביצועים, מה שאיפשר לו לשרוד עם קרוב למאה משתמשים בפורום בו זמנית על מסד הנתונים Access.
עם השנים פיתחתי או מימשתי שיטות עבודה ששמות דגש חזק מאוד על ביצועים, וזו מן הסתם תהיה נקודת המבט העיקרית של הבלוג.
בפעם הבאה:
מה זה "מורשת", מה זה "אינטרנט רימון" ואיך הם ממררים למנהלי אתרים את החיים.