הבלוג של ארתיום
בלוג על לינוקס, תוכנה חופשית, מוזיקה, סלסה, ומה לא!
מאמרים בנושא תכנה ומחשבים.
פונקציית hash קריפטוגרפית ודעות קדומות
אחרי הכתבה של עידו על הקשחת שרת, ראיתי את האי־הבנות שקיימות בנוגע לפונקציות hash הקריפטוגרפיות.
- פונקציית md5 פרוצה, אז אני שומר את הססמאות בבסיס הנתונים בעזרת sha1 (או רשום פונקציית hash החביבה עליך) ואמנע גילוי ססמאות עם בסיס הנתונים ייפרץ!
- פונקציית md5 אינה בטוחה, אז אני אוסיף קצת "מלח": md5(salt+pass) והיא תהיה בטוחה!
- אני השתמשתי ב־hmac של פייתון בקונפיגורציית ברירת מחדל וגיליתי שהוא משתמש ב־md5 הפרוצה... עכשיו כל החתימות של שוות כלום.
מוכר לכם? ידוע לכם?
אז תגלו, שכל אלו הן טענות לא־בדיוק־נכונות.
המשך...העדפות שלי, תשובה לאילן
תשובה לשאלה של אילן שביט
- הפצה: דביאן יציבה 100%, אפילו שאני פוזל לכיוונים אחרים.
- סביבת עבודה: KDE
- מעבד תמלילים: LaTeX, עדיפות שניה OO.
- נגן מוזיקה: amarok
- נגן וידאו: Kaffeine ב־Windows כמובן VLC.
שפת תכנות: אין דבר כזה, תלוי משימה:
- GUI, שרת, יישום שדורש ביצועים -- C++ לפעמים C.
- עבודה עם קבצים, משימות פשוטות אחרות, קינפוגים bash.
- עיבוד טקסט python או perl.
- בניה של דף אינטרנט דינאמי קטן PHP.
- חישוב מתמטי octave/matlab.
מה שחשוב לדעת ולא לפחד לשלב ביניהם: למשל גרעין של CppCMS כתוב ב־C++, כאשר משימה שהיא לא מתבצעת בזמן־אמת ניתנת ל־python וכל מיני תסריטי עזר כתובים ב־bash.
IDE לשפת התכנות: KDevelop או vim.
- שפה נוספת שהייתי שמח להכיר (לעומק): Python ו־Java.
- מה הייתי לומד (לו היה לי זמן): FPC.
- משחקים אהובים: AH2
- דוא"ל: Yahoo
- דפדפן: פיירפוקס או אפיפני, לא ממש משנה.
- תוכנת גיבוי: תסריט bash עם scp לאתר מרוחק. (רק עבור דברים מאוד קריטיים כמו בסיס נתונים).
- חלוקה למחיצות: אני לא ממש זוכר מתי עשיתי אז זה בפעם האחרונה --- מה שעובד qparted/gparted או תוכנת התקנה של דביאן.
- עורך אודיו: Audacity (יש משהו חופשי אחר?)
- לקוח FTP: עבור windows כמובן filezilla, עבור לינוקס gftp, או Konqueror, או nautilus -- לא ממש משנה.
ניהול Sessions ב־CppCMS
הערה 05/01/2009: פורסם מדריך לעבודה עם sessions בויקי
אחד החלקים חשובים של כל תשתית פיתוח יישומי אינטרנט הוא --- תמיכה בניהול Sessions: שמירת מידע בין בקשות שונות. זה מאפשר להפוך פרוטוקול HTTP שהוא stateless בטבעו ל־statefull. זהו מרכיב הכרחי שקיימ ברוב התשתיות כמו Django או RoR.
בד"כ, אני נוהג להסתכל בפתרונות הקיימים, לבחור את הטוב ביותר וליישמו במסגרת האילוצים של CppCMS. גם הפעם הסתכלתי בשתי התשתיות הפופולריות RoR ו־Django והבנתי, שהפתרון שהם מציעים, כפי שהוא לא מתאים בגלל אילוצי ביצועים.
הדרך "זולה" ביותר, היא לשמור את המידע ב"עוגיות" אבל יש לה שני מגרעות:
- יש מגבלה של כ־4K נתונים שניתן לשמור בעוגיה (לא כולל קידוד וכד').
- RoR שנותנת אפשרות ניהול מידע בעוגיות, לא מבטיחה שהמידע השמור לא ייחשף ללקוח --- תחשבו על פתרון Captcha ששמור בתוך עוגיה..
שמירת המידע בצד השרת כרוכה בשתי בעיות:
- ניהול בסיס נתונים כלשהו לשמירת המידע --- שיכול להוות צוואר בקבוק.
- בעית הביזור שלו גישה מרובת משתמשים.
לכן, החלטתי שב־CppCMS אני אלך על פתרון קצת שונה שמשלב את התכונות של שניהם (עם שיפורים).
המשך...בחירת בסיס נתונים משובץ... או לא כל הנוצץ זהב.
מי שעוקב אחרי התפתחות של CppCMS יודע, שבתחילת דרכי, רציתי לעבוד עם בסיס נתונים מיוחד Berkeley DB. אחד היתרונות הגדולים שלו זה ביצועים מדהימים, לפחות לפי הנתונים של Oracle.
בזמנו, התלבטתי והחלטתי להפסיק להשתמש בו. אלה היו הסיבות:
- אומנם BDB היה מהיר יותר, אבל לא כל כך משמעותית.
- התחזוקה של בסיס נתונים הייתה מאוד מסובכת (בייחוד שדרוג של מבנה טבלאות).
- ה־API היה, נוראי בלשון המעטה שדרש מעטפת נוספת שהכתיבה שלה בפני עצמה הייתה לא מי יודע מה פשוטה.
אבל היום, עלה לי צורך ספציפי, בו הייתי זקוק לבסיס נתונים מאוד פשוט, לא מבוסס על SQL שיעשה את העבודה הפשוטה: ניהול Sessions.
מה בדיוק צריך לשמור:
- מפתח ייחודי לכל אחת.
- שעת התפוגה --- מתי אפשר למחוק רשומה מהטבלה.
- הנתונים עצמם.
אפשר היה להשתמש ב־RDBS כמו MySQL, אבל עבור המשימה הספציפית, זה היה נראה כבד מידי. הדרישות היו די בסיסיות:
- תחזוקה מינימלית.
- מהירות הכנסה גבוהה.
- זמינות גבוהה בהפצהות ומערכות הפעלה שונות.
- דרישות שרידות בסיסיות: רצוי שבסיס הנתונים לא ייפגע עם התכנה תקרוס, או מחשב יפול, אבל, אם ייאבדו כמה רשומות, זה לא ממש משנה.
אז היו לי מספר אפשרויות:
- בסיס נתונים מאוד פשוט של מפתח/ערך כמו gdbm עם מנגון "ניקוי".
- בסיס נתונים מורכב כמו Berkeley DB שתומך אינדקסים, כבר היה לי ניסיון איתו.
- מערכת קבצים --- כל ערך שמור בקובץ נפרד, גם פה צריך מנגנון "ניקוי" של ערכים ישנים.
- בסיס נתונים משובץ sqlite3.
אז בואו נתחיל.
המשך...מה אני שונא ב־C++.
אחד הדברים החשובים במלחמת "שפות/דתות" זה לדעת טוב מאוד את המגרעות של השפה. כך, כדי "לאזן" את הכתבות על C++ החלטתי לפרסם רשימת הדברים שאני שונא ב־C++.
- זמן קומפילציה --- נוראי. לפעמים כשאני מקמפל קוד C או Java אני לא מבין מה קורה? מדוע לחצתי על "Enter" והקמפול נגמר.
- קשה מאוד ליצור ספריות עם ABI תואם לאחור. כל שינוי קטן בממשק הורס תאימות לאחור. או צריך להמציא טריקים כמו "הסתרת מימוש" או לעבוד עם מחלקות אבסטרקטיות בלבד.
- שגיאות קומפילציה נוראיות: אני כבר מחכה ש־ConceptsGCC יתמזג לענף gcc הראשי --- שוב, חלק מ־C++Ox.
- מתכנתי C++ שאין להם מושג ירוק מה הם עושים.
- קוד C++ כתוב כמו קוד C... מקור מעולה לבאגים.
- ספריות "C++" שתואמות קומפיילרים טרם־היסטוריים --- ללא namespaces, ללא STL, ללא RTTI ועוד. (למשל ממשק C++ של BDB).
- ספריות שממציאות גלגל מחדש: בא לנו string משופר, רשימה מקושרת משופרת ועוד -- אבל הורסות את התאימות עם שאר הספריות.
- עבודה עם ספריות C מתוך C++ --- כי ב־C אין destructors ואז הקוד הופך לספגטי של try/catch. או צריך לעטוף כל שטות במחלקה. מצד שני, אי אפשר לוותר על זה, כי יש המון ספריות מעולות, מדובגות ונפוצות הן ספריות C.
- אני שונא iostreams -- הם מסובכים, לא נוח לעבוד עם format, לא נותנים גישה ל־file descriptors כמו FILE של C. מצד שני, הם הפתרון הטוב ביותר לעבודה אחידה מול streamים שונים -- למשל, כתיבה לקטע בזיכרון, כתיבה ל־socket ועוד.
- כתיבת טיפוסים של iterators --- אני כבר מחכה ל־auto של C++0x.
- קומפיילרים גרועים --- ראה ערך VS6 שאני לא מבין מדוע אנשים עדיין משתמשים בו.
אני מעביר את השרביט ל:
הסבר: הכוונה היא --- לתת ביקורת על מה שאפשר היה לשפר בשפה, או מה שלא ניתן לשנות וזה לפעמים מפריע.