הבלוג של ארתיום
בלוג על לינוקס, תוכנה חופשית, מוזיקה, סלסה, ומה לא!
מאמרים בנושא תכנה ומחשבים.
מדוע אני אוהב MySQL...
אני יודע שיש אנשים שלא סובלים MySQL ומעדיפים כל דבר על פניו. יש הרבה ביקורות כלפי MySQL ויש לו לא מעט בעיות... אבל, מתוך ניסיון עבודה עם MySQL, Sqlite3, PostgreSQL וניסיון מועט בעבודה עם Firebird ו־MS SQL... אני מעדיף MySQL ובמקום השני Sqlite3.
מודע? כי הוא לא דורשים ממך תואר ב־DBA כדי להשתמש בו. הוא נותן לך כלים טובים ונוחים, לשמור, לנהל ולשלוף מידע בצורה פשוטה ונוחה; והסיבה העיקרית לכך:
הם עושים את הדבר הנפוץ פשוט
דוגמה 1: יצירת unique row id
אני יודע עידו כל־כך לא אהב איך שזה עובד ב־MySQL. אבל זה עובד בצורה פשוטה מאוד. יותר מזה היא מתנהגת בצורה הגיונית (לפחות בעיני).
דוגמה: אם אני יצרתי schema:
create table users (
id integer NOT NULL AUTO_INCREMENT,
name varchar(32) NOT NULL
);
ואז מייבא נתונים קיימים:
insert into users(id,name) values(1,'Yossi');
insert into users(id,name) values(2,'Moshe');
ואז מוסיף משתמש חדש:
insert into users(name) values('Artyom');
אני אקבל id=3 כפי שניתן לצפות. מצד שני, ב־PostgreSQL אני חייב לעדכן sequence אחרי הכנסה של ערך ידני, אחרת אקבל התנגשויות.
ב־Firebird אתה בכלל חייב תואר שלישי ב־DBA כי ליצור auto-increment כי זה נעשה רק עם trigger.
או קיי, אבל מה אם אני רוצה לעשות משהו מסובך באמת שלא נתמך ע"י auto_increment פשוט? אז גם זה אפשרי עם כתיבת trigger. אבל המקרה הנפוץ הוא פשוט.
דוגמה 2: הוספה או עדכון
עוד משהו שתמיד הפריע לי ב־SQL הסטנדרטי, כיצד אני עושה Update אם ערך קיים או insert אם הוא לא קיים?
פעולה מאוד נפוצה שאני ממש לא מבין לא היא לא חלק מ־SQL סטנדרטי... ב־MySQL וגם ב־Sqlite יש replace וגם יש לך אופציות שונות איך להתנהג אם ערך קיים: להתעלם, לעדכן, לעשות rollback וכד'.
איך עושים את זה ב־PgSQL? כותבים פרוצדורה של... תעשו חיפוש בגוגל, אני רוצה לדעת אם מישהו ימצא פתרון בפחות מ־5 שורות SQL... כנ"ל Firebird ו־MS SQL. למשל, כך עושים את זה ב־Firebird, מישהו היה מנחש?
אני יודע ש־MySQL אינו בסיס נתונים מושלם, יש לו הרבה בעיות ונקודות בהן אפשר ליפול... אבל יש לו יתרון אחד גדול, אתה לא חייב להיות DBA כדי להשתמש בו.
מדוע Asp.Net/Mono לעולם לא ירוץ על לינוקס...
זאת הסיבה:
http://www.tapuz.co.il/forums2008/forumpage.aspx?forumId=156
http://www.tapuz.co.il/forums2008/forumPage.aspx?forumId=156
http://www.tapuz.co.il/Forums2008/ForumPage.aspx?ForumId=156
(לא אל תיכנסו לקישורים, תסתכלו בהם)
שוחררה CppCMS 0.0.2!
אחרי תקופה ארוכה של פיתוח מאומץ שוחררה גרסה 0.0.2 של CppCMS -- תשתית פיתוח יישומי אינטרנט ב־C++.
- הורדה
- תיעוד -- עדיין לא הושלם ב־100%.
- הוראות התקנה
הגרסה כוללת
- CppCMS תשתית הפיתוח.
- DbiXX --- ספריה לעבודה מול בסיסי נתונים שונים.
- WikiPP מערכת ויקי מובססת CppCMS.
- Examples --- דוגמאות שונות כחלק מתיעוד של CppCMS.
שינויים במדיניות
ישנם מספר שינויים חשובים במדיניות שחרור הגרסאות:
- גרסאות בטא ציבוריות יהיו זמינות רק דרך svn, ענף פיתוח ראשי trunk.
- קצב שחרור הגרסאות יגדל. אמנע משמירת השינויים ב־trunk בלבד.
- רוב הארכיטקטורה של CppCMS התייצבה, אם כי, API עדיין נתון לשינוי. עם זאת, ייצוב API ותאימות לאחרות הן מטרות חשובות של פיתוח עתידי.
השינויים העיקריים
- מערכת תבניות חדשה מבוססת על טיפוסים סטטיים. היא נשענת על קימפול התבניות לקוד המכונה וטעינתן כ־shared objects.
- מערכת תבניות הישנה, מבוססת על טיפוסים דינאמיים לא תיתמך יותר.
השיפורים השונים במערכת התבניות כוללים בין השאר:
- ירושת תבניות בסגנון Django.
- הרחבת תבניות ע"י השתלת קוד C++ לתוכן.
- תבניות הן חלק מהתשתית ולא מהוות ספריה נפרדת.
פותחה מערכת חדשה ליצירה ובדיקה של טפסים. היא משולבת עם מערכת התבניות.
- פיתחה מערכת ניהול sessions חדשה.
- שיפורים ב־API של מערכת caching לתמיכה יותר טובה ב־cache העובד ללא טריגרים.
- התיעוד של המערכת הועבר ל־WikiPP מערכת ויקי שפותחה על בסיס של CppCMS.
- נתמכות מערכות הפעלה חדשות: FreeBSD ו־OpenSolaris, בנוסף ל־Linux ו־Cygwin.
- מערכת ויקי WikiPP שוחררה תחת רישיון GPLv3.
ימי הביניים של Unix או FreeBSD 7.1.
כידוע, אני רוצה לוודא כי cppcms ירוץ על מספר מרבי של פלטפורמות תואמות POSIX. כשהפיתוח נעשה לרוב על Linux, אני רוצה לוודא כי הוא ירוץ על כל פלטפורמת POSIX חופשית: שכרגע הן: Linux, OpenSolaris, *BSD ו־Cygwin.
העבודה על לינוקס הרגילה אותי לסטנדרטים גובהים של מימושים ותאימות, תיעוד man מעולה עם דוגמאות והסברים ובכלל --- סביבת פיתוח UNIXית די נוחה.
אבל, כידוע לא כל ה־UNIXים הם זהים. יש פה ושם api שלא ממומש, יש פה ושם סמנטיקות שונות לפעולות בתנאים שונים ועוד. אז אחרי שמצאתי תאימות טובה מאוד ל־solaris גיליתי ש־FreeBSD היא קוץ אחד גדול.
אחת ההפתעות הראשונות שהייתה לי --- pthread_mutexattr_setpshared
לא נתמך. ידעתי שהוא לא נתמך ב־cygwin אבל מ־FreeBSD 7.1 ציפיתי לטוב יותר.
הסבר: זאת אופציה שמאפשרת לשים mutex בזיכרון משותף של שני תהליכים שונים. כל UNIX בוגר תומך באופציה הזו. Linux תומך בזה החל מ־2.6 עם כניסת NPTL והופיע לראשונה ב־RH9.
טוב, מאחר ויש לי תמיכה של "אי־שימוש" במחיר של ביטול רכיבים מסוימים, לא נורא.
המערכת התקמפלה ועבדה יפה. ברגע שניסיתי להפעיל אותה ב־mod_prefork
היא עפה עם unsupported system call...
או קיי? מה זה אומר.
מסתבר, ש־sem_init
גורם לתופעה כזו. אני קורא man -- הכל אמור לעבוד. כותב תוכנת ניסוי פשוטה -- היא עפה. התחלתי לגגל וגיליתי: תמיכה ב־POSIX Semaphores היא ניסיונית מאוד ולא יציבה. צריך לקמפל kernel עם אופציה ספציפית כדי שזה יעבוד!
אם כך, למה להעיף תוכנה? אולי עדיף ש־sem_init
יחזיר שגיאה? או קיי, אז אולי נשתמש במנגנון אחר? נגיד flock? אהה... לפי man של FreeBSD הוא אפילו לא יוצא עם EINTR במקרה של סיגנל (שזאת הסיבה העיקרית שהשתמשתי ב־Posix Semaphores.
היו כמובן עוד כמה נפלאות של עבודה על BSD עצמו: כמו המערכת קבצים ברירת מחדל בכלל לא עובדת עם journaling, תהליך fsck הוא איום. הגדרות בסיסיות על הפנים, pkg_add הנותן שגיאות מאוד "עוזרות וממצאות" "קל מאוד" להגדרה ועוד. תיעוד... לא אכנס לזה. התחושה שאני עובד על איזה Debian Potato... או בעצם גם אז הוא היה קצת יותר טוב.
בקיצור --- אני אומנם אמשיך ואגרום ל־CppCMS לעבוד על FreeBSD כי זה לא מי יודע מה מסובך, אבל...
Free BSD Sucks!!!
חד וחלק!
אני OpenSolaris, VirtualBox והרבה כאב ראש...
החלטתי לבדוק את CppCMS על מערכות הפעלה נוספות מלבד Linux, לכן, החלטתי להתקין OpenSolaris על VirtaulBox. אני מזהיר מראש, הסיפור של CppCMS כאן הוא מינורי --- התיקונים האמתיים שקשורים ל־OpenSolaris לקחו בדיוק 5 דקות, ש־4 מתוכן היו קומפילצייה של הקוד מחדש.
ובכן, נתחיל -- החלטתי להתקין OpenSolaris. כהרגלי, הורדתי LiveCD עדכני, הפעלתי VirtualBox ו־... גיליתי ש־OpenSolaris לא עולה. גיגלתי, בדקתי, הבנתי שצריך לעדכן גרסת VB. בסדר, לא מסובך נעשה.
בשלב הבא, כשההתקנה הושלמה, גיליתי שאין לי אינטרנט, חיפשתי גיגלתי, שיחקתי עם דרייברים ועם מודולים, ifup/down שיניתי הגדרות "חומרה וירטואלית" --- nada, אין אינטרנט... אחרי עוד מספר שעות בגוגל, גיליתי שאני חייב לעשות 2 אתחולים של מחשב וירטואלי לאחר התקנה כדי שהאינטרנט יעבוד(?!)
אכן, בשלב מסוים, הוא התחיל לעבוד, אבל, אחרי עוד אתחול הוא מת... בלי סיכויי להחייאה -- כנראה הרסתי משהו במשחקים קודמים.
אז, התקנתי OpenSolaris מחדש ו... לא כאן לא נגמרו בעיות
המשך...