הבלוג של ארתיום
בלוג על לינוקס, תוכנה חופשית, מוזיקה, סלסה, ומה לא!
ספריית Boost.Locale הוגשה לביקורת רשימית
בשעה טובה, הגשתי את הספריית לוקליזציה Boost.Locale לביקורת רשמית (formal review) של קהילת ה־Boost. אם היא תעבור אותה היא תתקבל כחלק רשמי של Boost.
קישורים:
אעדכן אתכם על התפתחויות בהמשך.
עדכון: זה רשמי -- Boost.Locale התווספה לרשימת הספריות הממתינות לביקורת. עכשיו צריך שמישהו מהקהילה יתנדב להיות מנהל הביקורת (review manager).
הוספת הקשר לתרגומי Gettext
אחת התכונות החסרות ביותר ב־gettext הייתה עד לא מזמן היא העדר אפשרות להעביר מידע על הקשר המילה. כך למשל, מילה "exchange" יכולה להיות מתורגמת ל"החלף" כשמדובר בחפצים ו"המר" כשמדובר בכסף. אבל אם שתי המילים מופיעות באותה תוכנה הדורשות תרגומים שונים בהקשרים שונים, ב־gettext לא הייתה שום דרך להבחין ביניהם.
החל מגרסה 0.15 התווספה התמיכה במה שנקרא הקשר. אם עד היום התרגום של מחרוזת "exchange" נעשה כ:
gettext("exchange");
אז הפונקציה pgettext מאפשרת להוסיף הקשר לתרגום:
pgettext("currency","exchange");
שיכולה להיות מתורגמת בצורה נכונה בכל הקשר. בקטלוג מחרוזות po הדוגמה הזו תופיע כ־
msgctxt "currency"
msgid "exchange"
msgstr "המר"
חשוב לזכור:
- צריך להשתמש ב־gettext עדכני
צריך להשתמש בכלי תרגום עדכניים שיודעים לעבוד עם msgctxt.
כך KBabel כלל לא תומך ב־msgctxt, poedit לא מציג מידע על הקשר. עד כמה שידוע לי, גרסאות עדכניות של lokalize ו־gtranslator תומכות בהקשרים במילוני gettext.
כמובן שגם Boost.Locale תומך בהקשרים של Gettext.
Boost חסרת תועלת למפתחי ספריות
Boost חסרת תועלת למפתחי הספריות, או ליתר דיוק מפתחי ספריות שמנסים לשמור על ABI יציב של הספריות שלהן. זהו שם הדיון שפתחתי ברשימת תפוצה של Boost שאני חושב שעוררה סערה קטנה בקרב המפתחים שלה. אני מאוד מקווה שזה יגרום לשינויים בתפיסה של Boost ובסופו של דבר יגרום ליצירת Boost-stable, או boost::abi.
רקע קצר: ספרית Boost היא אוסף ספריות C++ עשיר שנותן כלים מצוינים למפתחים. אפשר להשוואות אותה ל־JDK של Java שנותן לך כלים כמעט לכל דבר. בעיקר היא ממלא חורים רבים שחסרים בספרית C++ סטנדרטית: טבלאות hash, ביטויים רגולריים, מצביעים חכמים, תמיכה בחוטים (threads), ועוד ועוד ועוד.
למעשה החלקים הגדולים שלה כבר נמצאים בסטנדרט C++ הבא שישוחרר (בתקווה) בקרוב. למעשה, אם רוב הקומפיילרים היו תומכים ב־C++0x כבר לא הייתי זקוק למחצית הכלים שזמינים לי היום דרך Boost.
למעשה, Boost היא ספריה המנוהלת כמדיניות ע"י דחפים אבולוציוניים משפרת את התכנון שלה כל הזמן, אפיל רכיבים יסודיים ביותר כמו boost::shared_ptr
עוברים שיפורים משמעותיים. וכאן מתחילה בעיה:
- כל שלושה חודשים משוחררת גרסה חדשה של Boost.
- כל גרסה חדש אינה מבטיחה תאימות כלשהי הן של ABI ואפילו API.
בפועל זה גורם לכך ש:
- רוב החברות שעובדות עם Boost בד"כ תקועות עם גרסה מיושנות כי מפחדים לשדרג אותה
ישנים מקרים רבים של טעויות בהן שתי ספריות צד ג' בנויות עם גרסאות שונות של Boost פשוט קורסות ברגע שהן עבדות באותה יחידה (קובץ ריצה).
מה שבהחלט לא עוזר להטמעה של Boost לפרויקטים רבים, במיוחד ספריות, כי מטילות עליהן מגבלת תאימות גרסה קשות.
העליתי את זה (בפעם העשירית אולי) ברשימת התפוצה של Boost. אבל נראה לי הפעם זה יצר הד מסוים וגם נראה לי שקיר ה"אי־הבנה" התחיל להישבר, לפחות הרגשתי את זה ממספר מפתחי Boost מרכזיים.
כך או אחרת, בגלל הבעיות האלה וצרכים קיומיים של CppCMS:
- הסתרתי חלקי Boost שהייתי מוכרח להשתמש בהם תחת namespace חילופי.
- יצרתי ספריה חלופית Booster שבנויה עם API מאוד דומה ל־API של Boost אבל משתמשת ברכיבים אחרים: למשל, לתמיכה בביטויים רגולריים אני משתמש ב־PCRE ל־threadים אני משתמש ב־pthreads (גם בחלונות).
- חלקים קריטיים כמו
shared_ptr
פשוט לקחתי מ־Boost והתאמתי ליציבות בינארית. - חלקים שכתבתי כמו
booster::function
.
בגדול כל דבר שהייתי משתמש בו והייתי זקוק לו ב־API הכנסתי ל־Booster מ־Boost בצורה כזו או אחרת.
האמת? זאת הייתה החלט מאוד קשה ועצובה מבחינתי. כי ללא ספק Boost היא ספריה מצוינת, שאי אפשר בלעדיה ואני כל כך שונא "להמציא גלגל מחדש", מצד שני, Boost יכולה להפוך לסיוט בתנאים מסוימים ו־CppCMS זה בדיוק המקרה בו תלות ב־Boost היא סיוט מתמשך.
מי שמעוניין יכול לקחת Booster מ־svn כאן:
https://cppcms.svn.sourceforge.net/svnroot/cppcms/framework/branches/refactoring/booster
אבל תהיו מודעים לעובדה ש־Booster איננה Boost, והיא נבנתה לצורכי CppCMS בלבד.
גיוס מפתחים דרך Stackoverflow.
Stackoverflow זהו פורום מפתחי תכנה מיוחד בו ניתן לשאול שאלות, לענות עליהם ולהצביע להן ולתשובות הטובות ביותר. יש שם מאגר מידע עצום שאני נעזר בו לעתים קרובות ומוצא תשובות להרבה שאלות. האתר הוקם לפני כשנתיים ותפס תאוצה מדהימה בקרב מפתחים תוך זמן קצר.
לא מזמן גיליתי שירות מדהים ש־Stackoverflow נותן לפרויקטים של תכנה חופשית. האתר מאפשר להגיש בקשה לפרסום הפרויקט שזקוק גיוס מפתחים. במילים אחרות, אם אתה מעוניין לגייס מפתחים לפרויקט קוד פתוח, אז ניתן להגיש בקשה לפרסום. אם היא מקבלת 6 הצבעות או יותר מהקהילה אז היא תופיע באתר.
כמובן שאני בהחלט זקוק לעזרה בפיתוח CppCMS, לכן גם אני הגשתי בקשה ב־Stackoverflow. בתקווה שהיא תעבור את הרף של 6 הצבעות ותופיע בסופו של דבר באתר.
כך שאם יש לכם, קוראי הבלוג הזה, חשבון ב־Stackoverflow ואיכפת לכם מהפרויקט שלי, אשמח לקבל הצבעות ;-)
נ.ב.: מה אתם חושבים על הבאנר?
נ.נ.ב.: נכון לעכשיו, הבאנר קיבל 5 הצבעות... אני זקוק לעוד אחת. אם אתם רשומים ב־Stackoverflow ואיכפת לכם מהפרויקט, בבקשה תצביעו!
שימו לב:
- להירשם סתם כדי להצביע זה לא יעזור... צריך לצבור מוניטין כדי לקבל אפשרות הצבעה.
- אם אתם לא רשומים ב־meta.stackoverflow, פשוט תירשמו ותשייכו את החשבון לחשבון ב־stackoverflow זה יתן לכם אוטומטית תוספת ניקוד שתאפשר להצביע.
תודה!
שוחררה Boost.Locale
שוחררה גרסה חדשה של הספריה שמיועדת ל־boost Boost.Locale (ראה הודעה ברשמת התפוצה של Boost):
הגרסה הזו מכילה את השיפורים הבאים:
- תכנון מחדש של איטרטור גבולות (כלי המאפשר להפריד בין מילים, משפטים וכד').
- התווספה תמיכה בעבודה עם תאריכים בלוחות שנה שונים כמו גרגוריאני (לועזי), עברי ואחרים. ראה דוגמה calendar.cpp המדפיסה לוח שנה בהתאם ללוקל.
- תיקוני באגים רבים.
- תמיכה בפלטפורמות נוספות
ועוד.
הספרייה מספקת:
- נורמליזציה של Unicode, טיפול נכון בשינוי case של מחרוזות.
- מיון (collation) לפי 4 רמות unicode שונות.
- טיפול אחיד בלוחות שנה שונים כמו, גרגוריאני (לועזי), עברי ואחרים
- אנליזה של גבולות הטקסט (מילים, משפטים, תווים ועוד).
- הדפסה של מספרים, תאריכים, ערכי כסף, איות מספרים ועוד.
- פרמוט של מחרוזות המתאים ללוקליזציה ותרגום מחרוזות בעזרת מילונים של gettext.
תמיכה בקידודים שונים, utf-8/16/32 וקידודים אחרים כמו cp1255.
תיעוד: http://cppcms.sourceforge.net/boost_locale/html/index.html
- הורדה: https://sourceforge.net/projects/cppcms/files/
- מדריך מקיף: http://cppcms.sourceforge.net/boost_locale/html/tutorial.html
חשוב לציין
- Boost.Locale איננה חלק רשמי של Boost (בינתיים) ובתקווה תהפוך לכזו.
- היא לא מממשת את רוב כלי Uniode בעצמה אלא לרוב עוטפת API של ICU בצורה ידידותית למפתח C++.