ארכיון חודשי: אפריל 2010

חזון אחרית הימים בלזרוס

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

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

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

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

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

איפה IPv6 ?

כתובת ה IP המוכרות כיום מכילות 4 סגמנטים ומסוגלות להישמר כמספר שלם בעל 32 ביט (טווח של 4,294,967,296 ספרות סה"כ או 232 בקיצור) ספרות מלאות. כמות הסגמנטים בכתובת ה IP היא זו שקובעת את שמו כיום: IP גרסה 4 או IPv4 כקיצור (השם שונה לIPv4 רק באמצע שנות 90). גרסת IPv4 הגיעה לידי תקינה ב1980 וקיבלה עוד כמה שינויים "קלים" ב1981.

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

בין שימוש מרובה של מחשבים (בהם הטלפונים הסלולריים שהחלו בעצם לגרום לדילול רציני יותר), היו עוד כמה דברים שקצת מפריעים לIPv4 להשיג את מלוא הפוטנציאל שלו ואלו חוקים שונים כדוגמת טווחי כתובות המיועדים רק לרשתות פרטיות, פרוטוקולים נוספים המסבירים שכתובות קצה כלשהן, משמשות כתובות כדוגמת broadcast, routing וכו' וכך כמות הכתובות שבפועל אפשר להשתמש בהן קטן יותר מ 232 כאשר מדובר ברשת חיצונית. להמשיך לקרוא

אל תאתחל אותי ככה סתם

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

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

בראש ובראשונה בלינוקס יש ספרייה בשם tmp בroot הראשי. הספרייה הזו מכילה כל מיני דברים שלרב זמניים, אבל כשמשהו לא עובד, לפעמים הם מספקים תשובה למה.

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

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

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

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

יצירת תמיכה ב path info ל nginx

שרת nginx הוא שרת HTTP קל ומהיר אשר מספק תמיכה לכל תקשורת הקשורה ל HTTP כולל תמיכה ב Proxy ו Reversed Proxy. השרת אבל לא תומך ב CGI בכלל, אלא אם מתחכמים לו ומגדירים FAST CGI שמשמש משהו בסגנון reversed proxy בשרת זה, אך הוא טיפה יותר מזה, היות והשרת יודע שזה FAST CGI ולא proxy רגיל, העניין הוא ששרת ה FAST CGI צריך לרוץ בפני עצמו ולא כתהליך בן של nginx בניגוד לאפצ'י,  lighttpd ועוד כמה שרתים שאני מכיר (חלקם תכנותיים בכלל).

השרת מאפשר לנו ליצור הרבה משתנים שיכולים להכיל הרבה מידע שיעזור לנו להגדיר דברים כמו שאנחנו רוצים.

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

בשביל להסביר מה זה PATH_INFO, פשוט תסתכלו על הכתובת של הפוסט הזה, ותראו שהוא עובד באמצעות השיטה הזו.

לצערי, לקח לי הרבה זמן למצוא נוסחה הגיונית שתעבוד בצד nginx עבור path_info, היות והוא אינו תומך בהם בברירת מחדל בכלל, אבל ממש כמו ב Apache יש חוקי rewrite שצריך לממש. אבל הבעיה שאני הגעתי אליה היתה שהוא משום מה משכפל את השכתוב שלי לנתיב הפיזי לפחות ל5 רמות פנימה, למרות שזה לא מה שהשכתוב ביקש לבצע (אולי באג).

בסוף הגעתי לנוסחה שעובדת לי, ואני אשים אותה כאן בתור תעוד לעוד אנשים הנתקלים בבעיות.
קובץ nginx.conf: להמשיך לקרוא

עבודה עם מסדי נתונים בצורה פחות כואבת חלק שני

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

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

תכנות בטוח חלק ראשון

אתמול שוחרר חלק ראשון של מאמר שכתבתי אודות נושא עצום, חשוב ובד"כ לא נלמד בשם "תכנות בטוח" באתר  Digital Whisper.

החלק הראשון של המאמר זכה להרבה ביקורת בסגנון של "למה לא הכנסת את נושא X", או "למה לא כתבת איך מבצעים התקפה Y". עוד ביקורת שלדעתי הכי פחות עניינית קיבלתי מכמה אנשים בעלי תארים דווקא (חשוב לציין את זה לדעתי): "כתבת שיש דבר כזה SQL Injection אבל לא כתבת מה זה עושה", למרות שזה היה תחת כותרת של "הזרקת קוד", ואם זה לא מספיק, אז צויין שבהזרקת קוד, מורץ קוד במקום שהוא ישמש בתור מידע… קיבלתי עוד כמה ביקורות כאלו של "לא ברור מה בעיה Z עושה" מאותם בעלי תארים.

מדהים אותי שכל התשובות לכל ההתקפות שחוויתי קיבלו מענה כבר בחלק הראשון של המאמר:

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

‫…

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

איפה יכולות הבנת הקריאה של אנשים לחלק הראשון של הטענות ?

אז הנה החלק השני של הטענות:

כאשר המשתמש מזין קלט לתוכנה היא צריכה לעבוד עם הקלט ולהשתמש בו לצרכיה ומטרותיה. הבעיה‬ ‫היא שכאשר משתמשים במידע בצורה המדויקת בה הוא התקבל, ללא יצירת מסננים או טיפול במידע‬ ‫בעייתי, המשתמש יכול להזין קוד כלשהו (בין אם זה‪ SQL‬או כל קוד אחר), להריץ אותו דרך התכנה‬ ‫ולעשות כל העולה ברוחו באמצעות הקוד שהוא הזריק. 2 דוגמאות מאוד נפוצות בעולם ה- ‪  web‬הן‬ ‫הזרקת ‪ SQL‬ והזרקת ‪ HTML/Javascript‬ (המוכר בשם ‪  Cross Site Scripting‬או ‪  XSS‬בקיצור), אך ישנם עוד‬ ‫סוגים רבים ונוספים של הזרקות קוד שונות.‬

כמו שאפשר לראות, גם כאן יש מענה שלם אליהם.

כך שאולי מישהו יוכל להסביר לי פעם אחת ולתמיד את הבעיה בבקשה ?