מאמרים בנושא ‏תכנה ומחשבים‏.

מפגש עולמות - או מדוע כדי לבצע פקודת SQL אתה לא אמור להוריד כלי של 150MB.

ב־יום ראשון, 19 בדצמבר 2010, מאת ארתיום; פורסם תחת: תכנה חופשית, פיתוח, תכנה ומחשבים; ‏6 תגובות

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

  • לפיתוח ממשקים יש לך כלים מצויינים כמו Qt - שגם בעולם חלונות הופכים למובילים. כמובן גם כלים כמו Java Swing או Java SWT הם מעולים.
  • לפיתוח web - כמעט כל דבר: PHP, Rails, Django, JSP/Java אפילו Asp.Net הופך ליותר זמין בזכות (או באשמתה תלוי איך רואים) של Mono.
  • פיתוח רכיבי תשתית ב־C++‎ עם כלים כמו Boost הופכים לשקופים, וכמובן אסור לשכוח את Java, Python, Perl ושפות רבות אחרות שנותנות SDK עשיר חוצה פלטפורמה.

אבל הבעיה עדיין נשארת פתוחה - אם אתה לא מתאמץ ולא מכיר את שני העולמות - קשה לפתח משהו שהוא ייראה טבעי ונוח בשני העולמות.

הסיפור

תוך כדי פיתוח CppDB‏ ובניית תמיכה ב־ODBC‏ רציתי לבדוק עבודה מול MS SQL Server בגלל הגישה "המיוחדת" שלו ל־Unicode. מה יותר פשוט:

  • יש מכונה וירטואלית מוכנה.
  • יש גרסת SQL Server Express 2008 חינמית.
  • יש odbcunix ו־freetds מותקנים.

לא אמור להיות מסובך. מתוך אפשרויות ההתקנה בחרתי את הקטנה והפשוטה ביותר - להתקין רק את המנוע ששוקל רק 70MB בלי תוספות משוכללות כמו Management Studio ודברים מיותרים אחרים.

הורדתי, התקנתי - תוך כדי התקנה הגדרתי משתמש ניהול - בסה"כ next->next->next וזה מוכן. אחר כך הגדרתי תקשורת מעל TCP/IP הגדרתי קישוריות מ־VirtualBox ו־host הגדרתי ODBC מתחבר... לא מצליח לבצע login.

אחרי חקירה קצרה ובדיקת Event Log מתברר השמשתמש שהגדרתי בהתקנה לא מוגדר. להגדיר משתמש זה אמור להיות די פשוט (בסה"כ להריץ פקודת SQL פשוטה) אבל נפלתי במלכוד 22:

  • כדי להגדיר משתמש חדש אני צריך קישוריות לבסיס הנתונים.
  • כדי שתהיה לי קישוריות לבסיס הנתונים אני צריך משתמש.

אחרי חיפושים ובדיקות הבנתי שעדיין יש משתמש XP שאמור להיות מסוגל לבצע login ואפילו הצלחתי לבצע login ולהריץ שאילת עם איזשהו כלי import המגיע עם SQL Server. כל מה שנותר לי זה להתחבר לבסיס הנתונים עם משתמש XP של מתוך המכונה עצמה ולבצע login... השאלה כיצד?

הכלי שאני מכיר להתחברות הוא sql management studio ששוקל 150MB... אבל אני צריך להריד סה"כ פקודה או שניים? חייב להיות אישזהו כלי שאפשר להריץ בשורת פקודות כדי להתחבר לשרת SQL ולהריץ פקודה.

מכיוון שאני לא מכיר את Microsoft SQL Server מספיק, שאלתי שאלה ב־Serverfault‏:

כיצד להגדיר משתמש בשרת SQL ללא שימוש ב-Management Studio.

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

אבל זה לא מה שמעניין בסיפור, מה שמעניין זה הערות שקיבלתי על השאלה שלי: הנה דוגמאות:

Top rated(3 votes)

>   It seems silly to not use
>   the purpose built tools that
>   come packaged with the product 
>   just to save a few hundred MB

Another one, very good:

> As someone who manages numerous SQL
> Server instances from Sql 2000 - 2008,
> creating a VM to throw XP (at least)
> just to run SSMS makes sense. SSMS is your
> friend..not the enemy you're making it out to be.. 

כיצד להסביר לאנשים האלה, שזה לא נראה לי הגיוני להוריד 150MB כדי לבצע שתי פקודות?

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

אני רואה מפתחי חלונות לא מבינים בצורך להיכנס לשורת פקודות, לא מבינים כיצד אפשר לפתח ללא IDE או לעבוד מול SQL ללא כלי משוכלל. מצד שני אני רואה את עצמי ומפתחי לינוקס אחרים נגעלים בכל פעם מחדש מה"כלים המשוכללים" שלא עובדים כמו שצריך שעושים דברים לא ברורים מאחורי הקלעים ולא מאפשרים לא לדבג בעיות בצורה שקופה, כלים שאי אפשר להריץ אותם מתוך סקריפט ועוד.

האמת... לא נכון, מרבית כלי Microsoft באים עם כלי שורת פקודות. למשל ,אני עובד הרבה יותר עם CMake+NMake+CL מאשר עם IDE של Visual C++‎ ואני מבין הרבה יותר טוב איך הדברים עובדים. רק שבעולם ההוא זה לא מקובל.

לך תבין! בגלל זה המעבר בין העולמות הוא הרבה מעבר למעבר בין Posix API ל־Win32 API הרבה מעבר למעבר מ־cl ל־gcc ולהפך, לעבר מ־Visual Studio ל־KDevelop או מעבר בין דיאלקט SQL של MS SQL לבין זה של PostgreSQL או MySQL.

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

קישוריות לבסיסי נתונים מ־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.

MySQL אכן צעצוע - או rollback לא עובד בצורה מסתורית על InnoDB

ב־יום שבת, 27 בנובמבר 2010, מאת ארתיום; פורסם תחת: תכנה חופשית, תכנה ומחשבים; ‏4 תגובות

עידו, מאיר, שי - אתם צודקים! MySQL אכן צעצוע!

תוך כדי הרצת Unit Test של עבודה מול ODBC גיליתי שטרקציות לא מבצעות roolback. מידי הבנתי ששכחתי להגדיר את הטבלה כ־InnoDB והרצתי את הטסט שוב עם טבלה חדשה. עדיין נכשל. WTF? נכנסתי ללקוח של MySQL והרצתי:

create table test ( i integer ) Engine = InnoDB;
begin;
insert into test(i) values(10);
insert into test(i) values(20);
rollback;
select count(*) from test;

ואני מקבל כפלט 2 במקום 0? WTF $%^$%^&#$%^#&^#%&?

פניתי ל־Stackoverflow‏ אולי אני עושה משהו לא נכון וקיבלתי תשובה: הקוד שלי בסדר גמור.

אולי גרסת בסיס נתונים ישנה 5.0.51? התקנתי 5.1.49 עדיין אותה בעיה! ניסיתי לחזור ל־5.0.51 סקריפט של dpkg נכשל! משהו פה ממש לא בסדר.

מחקתי את בסיס הנתונים עם Purge - קרי מחקתי התקנה, הגדרות ואת כל בסיסי הנתונים, התקנתי 5.0.51 מחדש ו... זה אכן עובד.

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

עידו, מאיר, שי אנשים יקרים: אתם צודקים... MySQL זה צעצוע.

עכשיו השאלה - כיצד אני מכייל את PostgreSQL לביצועים דומים? :-)

בניות ובדיקות ליליות ו־VirtualBox

ב־יום רביעי, 27 באוקטובר 2010, מאת ארתיום; פורסם תחת: תכנה חופשית, לינוקס, פיתוח, תכנה ומחשבים, סימולטורים, CppCMS; ‏7 תגובות

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

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

כנ"ל CppCMS, אפילו שיש לי מערכת Unit-Tests שלמה, מידי פעם יש פספוסים בשחרור גרסה. וזה ברור: כשאתה מנסה לתמוך ב־GCC החל מ־3.4 עד 4.5, בקומפיילר של MSVC ושל Intel ב־Solaris‏, Linux‏, BSD‏, Mac OS X ו־Windows אז משהו בתוך כ־40 אלף שורות קוד חייב להישבר.

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

בכל מקרה, בניתי סקריפט, שרץ מתוך crontab ומעלה מכונה וירטואלי, מתחבר אליה דרך ssh מריץ תסריט בניה וטסט ואז מוריד אותה באופן אוטומטי וכך לכל למכונה (למעשה Solaris ו־FreeBSD).

כאשר ניסיתי לעשות את אותו הטריק עם XP הסיפור הפך להיות מתסכל, בשרת FreeSSHD פשוט לא הצלחתי לבצע password-less login על־אף מאמצים רבים וקריאת התיעוד. בכל מקרה, המוצר הזה השאיר לי תחושה של מוצר "חצי־אפוי" כי הוא לא תמיד התנהג כמו שהוא אמור.

אחר־כך ניסיתי copssh, גם הוא היה כישלון טוטלי מכיוון שלא הצליח להעלות סרביס של ssh עם הודעות שגיאה על הרשאות ומשתמש ב־Even Log. החיפושים ברשת לא הניבו תוצאות. אז עברתי לגישה אחרת.

העתקתי את התסריט וכל הקבצים הנדרשים לשרת Samba והכנתי תסריט bat שרץ בחלונות וניגש תיקיה עם עליית המערכת. אם הקובץ נמצא, הוא בונה גרסה ומריץ טסטים, לאחר מכן שם את התוצאות באותו שרת ה־samba. עקום, אבל איכשהו עובד (כמו כל דבר אחר בחלונות...)

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

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

העמוד הבא

העמוד הבא

דפים

נושאים