מאמרים בנושא ‏C++‎‏‏.

קישוריות לבסיסי נתונים מ־C++‎

ב־יום שלישי, 14 בדצמבר 2010, מאת ארתיום; פורסם תחת: תכנה חופשית, פיתוח, תכנה ומחשבים, C++‎‏; ‏24 תגובות

לאחרונה אני הייתי מאוד לא מרוצה מעבודה עם libdbi‏ בתור ספריית הקישוריות לבסיסי נתונים וגם לא הצלחתי להתחבר ל־SOCI‏ ממספר סיבות נוספות.

הספריה הראשונה libdbi לא תומכת בכלל ב־Prepared Statements, יש לה לא מעט בעיות בגישה לטעינה של מודולים, הספריה השניה soci לא מי יודע מה מוצלחת מבחינת הגישה שלה לפיתוח, בפרט, סירוב עקבי שלא לתמוך ב־Last-Insert-Id או עבודה קצת עקומה עם prepared-statements ומחזור שחרור גרסאות מאוד ארוך (שבפועל דורש ממך לעבוד עם גרסת git).

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

  1. לתמוך בצורה שקופה ב־prepared-statements וגם ליצור cache שלהם כך שתהליך ההכנה שלהם יתבצע בפועל פעם אחת בלבד בצורה שקופה.
  2. לתמוך ב־connection pooling בצורה שקופה ונוחה.
  3. אפשרות לטעון מודולים של בסיסי הנתונים בצורה דינאמית וגם לקשר אותם בצורה סטטית לצורך הפצה נוחה.
  4. גמישות מבחינת בחירה של statement רגיל ו־prepared.‏
  5. מהירות
  6. תמיכה מלאה ב־postgresql,‏ mysql וב־sqlite3.‏
  7. תמיכה במספר גבוהה ככל האפשר של בסיסי הנתונים דרך מערכת קישוריות חילופית (odbc).

כך נוצרה ספריית cppdb‏ הזמינה תחת LGPLv3 (קישור חילופי).

כמובן רבים יאשימו אותי בהמצאת גלגל מחדש, אבל למעשה יצרתי משהו מאוד ייחודי שלא קיים במרבית ספריות הקישוריות הקיימות (ולא רק ב־C++‎) - הסיבה העיקרית זאת הנוחות העבודה עם prepared-statements והשמירה האוטומטית שלהם לצורך השימוש החוזר שנותנת תוספת ביצועים של עשרות אחוזים.

בנוסף שחררתי גם עדכון ל־dbixx‏ (המעטפת של libdbi) המביאה מספר תיקונים ושיפורים יחד עם ההחלטה להזניח את הפיתוח שלה תוך כשנה לטובת ה־cppdb.

CppCMS מול Java/JSP,‏ C#/Asp.Net‎‏, PHP

ב־יום שבת, 16 באוקטובר 2010, מאת ארתיום; פורסם תחת: תכנה חופשית, לינוקס, פיתוח, תכנה ומחשבים, CppCMS, C++‎‏; ‏0 תגובות

פרסמתי השוואת ביצועים עדכנית בין CppCMS ושלוש טכנולוגיות web מובילות: PHP,‏ Asp.Net/Mono ו־Java/JSP.

התוצאות וההסברים פורסמו כאן: http://art-blog.no-ip.info/cppcms/blog/post/67

שוחררה גרסה מקדימה של Boost.Locale 3.

ב־יום שישי, 10 בספטמבר 2010, מאת ארתיום; פורסם תחת: תכנה חופשית, לינוקס, פיתוח, תכנה ומחשבים, C++‎‏, Unicode, Boost‏; ‏0 תגובות

שלום,

שוחררה גרסה מקדימה של Boost.Locale

חדש בגרסה:

  • התווספה תמיכה במנגנוני לוקליזציה מרובים:
    • ספריית ICU - ברירת מחדל
    • תמיכה בסיסית של הספריית הסטנדרטית של C++‎ עם שיפורים.
    • POSIX 2008 API (כמו strftime_l)
    • Windows API.

    התמיכה הזו מאפשרת להשתמש בכלי לוקליזציה בסיסיים גם ללא ספריית ICU הכבדה.

  • שיפורים משמעותיים בממשק וניהול לוקלים
  • תיקוני ביצועים עובר ICU
  • שיפורים בעבודה עם UTF-8
  • תיקונים בתמיכה ב־UTF-16

ועוד.

קיימת תמיכה ב:

  • מערכות הפעלה: Linux, ‏FreeBSD,‏ OpenSolaris,‏ Windows,‏ Cygwin, (בקרוב גם Mac OS X).
  • מהדרים (קומפיילרים) gcc (גרסאות 3.4 עד 4.5), ‏Intel 11,‏ MSVC9, ‏SunCC 5.10/stlport

אמת המרה על רמת התמיכה בלוקליזציה

ב־יום ראשון, 5 בספטמבר 2010, מאת ארתיום; פורסם תחת: תכנה חופשית, פיתוח, תכנה ומחשבים, C++‎‏, Unicode, Boost‏; ‏0 תגובות

כפי שחלק מקוראי הבלוג אולי יודעים, אני עובד על ספריית Boost.Locale‏ שאני מקווה תשולב ב־Boost בעתיד.

הספריה נותנת בין השאר תכונות חשובות כמו: תרגום מחרוזות, הצגת תאריכים, מספרים, חלוקת הטקטס לתווים, מילים, מיון לפי סדר אלף־בית וכד'.

כדי לאפשר תמיכה נאותה בכל המרכיבים האלה, אני משתמש בספרית ICU‏ שנותנת את כל הדרוש, למעט API שמתכנת C++‎ שפוי יכול להשתמש בו.

למרות ש־ICU היא ספריה מצוינת, יש לה גם לא מעט חסרונות:

  • גודל הספרייה שמכילה את כל הנתונים הוא כ־12 מ"ב! זה בד"כ מאוד בעייתי עבור סביבות משובצות מחשב.
  • ביצועים - היא לא מצטיינת בהם, למשל יצירת תאריך או מספר לוקחת עד פי 10 יותר זמן בעזרת פונקציות ICU השוואה לפונקציות כמו strftime.

לכן, החלטתי להוסיף ל־Boost.Locale מנגנונים שיאפשרו לעבוד עם התמיכה הבסיסית בלוקליזציה שנמצאת בכל מערכת הפעלה או ספריה סטנדרטית.

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

אבל עדיין, יש לי שלוש אופציות:

  • שימוש בספריית C++‎ הסטנדרטית שמכילה את מרבית הדברים הנדרשים.
  • שימוש ב־API של POSIX 2008 שמגדיר אוסף פונקציות כמו newlocale, strftime_l או strcoll_l במערכות תואמות POSIX (למעשה, ה־API הזה נתמך בלינוקס ובמק).
  • שימוש ב־Win32 API שנותן פונקציות די עשירות כמו GetDateFormat, CompareString וכד' שנותנות תמיכה רצינית בלוקליזציה.

כמובן פה ושם צריך לסדר דבר או שניים כמו MSVC שלא מכיר בשמות לקול כמו en_US.UTF-8 ולא תומך ב־UTF-8, לעשות התאמות פה ושם להבדלים בין לינוקס ומק במימוש של API של לוקליזציה וכד'.

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

  • libstdc++‎ של GCC לא תומך בלוקליזציה בשום מערכת הפעלה מלבד Linux (לא שזה חדש, בגלל זה הוספתי את שתי האופציות הנוספות).
  • ‏מסתבר שב־Mac OS X (וגם ב־FreeBSD) פונקציה strcoll שבורה לחלוטין, כך הוא לא יודע לסדר a < ç < d או אפילו a < C < d כפי שזה מתבקש בשפה בטבעית.
  • ב־Solaris פונקציות towupper ו־towlower לא ממש מתחשבות בלוקל (למשל בלוקל טורקי i הופכת ל-"İ" ולא ל־"I" ב־upper case)

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

שוחררה גרסת בטא שניה של CppCMS

ב־יום רביעי, 4 באוגוסט 2010, מאת ארתיום; פורסם תחת: תכנה חופשית, לינוקס, פיתוח, תכנה ומחשבים, CppCMS, C++‎‏; ‏0 תגובות

שוחררה גרסת בטא שניה של CppCMS. השינויים כוללים בין השאר:

  • שיפורי ביצועים משמעותיים, בפרט בעבודה עם FastCGI, כך שהביצועים שלו לא נופלים מאלו של SCGI.
  • תיקוני באגים חשובים, ביניהם:

    • תיקוני באגים בהעלאת קבצים
    • בעיות שליחת תגובת HTTP במערכות אסינכרוניות.
    • בעיות בייצוג מספרים ב־JSON.
  • התווספו דוגמאות נוספות, בפרט עבודה עם JSON ו־Comet.

אבל, אחד הדברים החשובים בעיניי בגרסה הזו, הוא לאו דווקא עצם שחרור הגרסה הנוספת, אלא מעבר הקהילה ישירות לגרסה ‎1.x.x של CppCMS בזכות שיפורים רבים שהוכנסו לתוכה, למעשה, רוב המשתמשים הפעילים ברשימת התפוצה של CppCMS משתמשים בגרסה החדשה, למרות שהיא עדיין נחשבת לגרסת בטא.

העמוד הבא

העמוד הבא

דפים

נושאים