jiyuu-מחשבות פתוחות

קצת חידושים

24/04/2008 22:23 ע"י כתריאל טראום

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

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

קשה כמובן לפספס גם את החידוש במראה. הפכתי את הבלוג ליותר סטנדרטי, תוך שימוש בתגי HTML סטנדרטיים, במקום יצירת CSS Styles עבור כל שטות בבלוג.

אז מה יש לנו:

  • העברתי את כל ה-HTML לתוך תבניות Smarty
  • הפכתי את כל הטפסים בבלוג למבוססי HTML_QuickForm
  • הסכמה של sqlite עברה בחינה תחת "חוקי הנירמול" וקיבלה עוד כמה שיפורים בדמות Triggers אשר יעזרו לשמור על שפיות המידע
  • גירסת ה-xajax שודרגה

סה"כ, מרגיש יותר יציב בעבודה. מי שמעוניין, מוזמן לשלוח לי מייל ל katriel AT traum.org.il ולקבל עותק של jiyuu.

לא הרבה קורה

23/03/2008 22:14 ע"י כתריאל טראום

הכותרת אומרת הכל אני חושב…

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

בין לבין, יוצא לי קצת לעבוד על jiyuu. הגעתי למסקה שאני קצת חוטא למטרה הראשונית שלי של jiyuu, והיא לשמור את המערכת פשוטה ונקיה. הקוד התחיל להתנפח ולהסתבך כל כך עד שהייתי צריך לעקוב ולרדוף אחרי שורת פלט אחת ב-3 קבצי PHP שונים. בהחלט לט מה שרציתי.
לכן החלטתי לשכתב קצת את jiyuu, גם לשמור את המערכת פשוטה יותר, וגם להשתמש ברכיבים סטנדרטיים. שימוש ברכיבים סטנדרטיים אמור להוריד את כמות הקוד הכתוב, ולעלות את כמות הרכיבים שניתן למחזר בקוד. בחרתי ב-2 כלים כדי לבצע את העבודה השחורה בשבילי:

  • smarty - מנוע שבלונות מצויין, ובנוסף מספק מנוע caching מצויין
  • HTML_QuickForm - הרחבת PEAR שמאפשרת בניה קלה ומהירה של טפסים, אשר תשמש ליצירת טפסי הוספה\עריכה של מידע ב-jiyuu.

בנושאי עבודה, יוצא לי לאחרונה לעבוד קצת עם Jython, שהוא יישום של מפענח לשפת Python שכתוב כולו ב-Java. אני משתמש בו דרך מוצר צד שלישי מסחרי כלשהוא.

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

אם בעבר עבור חברה מסחרית שימוש בקוד פתוח היה "טאבו", או משהו אשר השתמשו בו רק כמוצר פנימי, הרי שבימינו, נראה שקניה של חברת קוד פתוח, והמשך פיתוח המוצר שלה ככזה, היא הדבר החם בשוק (ראו רכישת XenSource ו-MySQL). רבות כבר נידון על הנושאים האלו, אבל מבחינתי, זו היא סוף סוף ההכרה שמה שהרבה מאיתנו כבר יודעים מזה זמן רב (קוד פתוח=טוב יותר, כיף יותר, <דעתכם על קוד פתוח כאן>), יכול להיות מתורגם גם לעולם העיסקי.

Foreign Keys ב-SQLite

23/01/2008 20:29 ע"י כתריאל טראום

עם העבודה על jiyuu, יוצא לי לא מעט לעבוד עם sqlite. למי שלא מכיר, זה מסד נתונים אשר מיושם בספריה, ללא שרת, ללא צורך בהתקנה ועם תמיכה ב-Transactions.

סכמת מסד הנתונים של jiyuu אינה מסובכת כל כך. היא כוללת כמה טבלאות פשוטות שמחזיקות פוסטים, תגובות, תגיות וקונפיגורציה. אבל, למרות הפשטות, היה חסר לי מאפיין אחד חשוב, שיעזור לי לשמור על הנקיון ועל תקינות המידע: Foreign Keys.

הסבר מהיר: Foreign Keys הוא מנגנון במסדי נתונים שמאפשר יצירת קשר בין טבלאות שונות. בעזרת Foreign Key ניתן לקשר מידע בטבלה א' למידע בטבלה ב' כך שלא יכול להיות מידע בעמודה מקושרת בטבלה א' שאינו קיים בטבלה ב'. קישור זה הוא בד"כ דו-כיווני: לא ניתן יהיה למחוק מידע מטבלה ב', כל עוד ישנם רשומות בטבלה א' שעדיין מפנות אליה.

דוגמא:

CREATE TABLE tbl1 (
	id INTEGER PRIMARY KEY NOT NULL,
	col1 VARCHAR(20),
	col2 INTEGER NOT NULL CONSTRAINT fk_tbl2_id REFERENCES tbl2(id))

זהו התחביר ליצירת Foreign Keys ב-SQLite (אפילו שהוא לא תומך ב-Foreign Keys. עוד על זה מיד). לפי הדוגמא, לא ניתן יהיה להכניס שורה חדשה לטבלה tbl1, במידה והערך של col2 לא יהיה קיים ב-tbl2. בכיוון השני, ברגע שיש מידע שבטבלה tbl1 אשר מקושר ל-tbl2, לא ניתן יהיה למחוק את הרשומה שאליה המידע קשור ב-tbl2.

רק רגע, אבל הרגע אמרתי ש-Foreign Keys לא נתמך ב-SQLite. המצב כרגע הוא שהפקודות קיימות, אך SQLite לא מתייחס אליהם או עושה להם Parsing\Enforcing. אז איך כן ניתן ליישם Foreign Keys שישמרו על אחידות המידע שלי? התשובה פשוטה: Triggers

הפוסט הזה הופך לשעור ב-SQL… אז מה זה Triggers? אלו פקודות SQL אשר מורות למסד הנתונים לבצע פקודה מסויימת כאשר מתרחש מקרה מסויים. ניתן לנצל יכולת זו כדי לתפוס כל מחיקה, יצירה או שינוי של רשומה כדי לוודא שאין התנגשות עם Foreign Key. נצטרך לצור 3 Trigger-ים: אחד עבור יצירה, מחיקה ועדכון רשומה, בעבור כל טבלה שבא הגדרנו Foreign Key Constraint

CREATE TRIGGER fk_insert_tbl1
BEFORE INSERT ON tbl1
FOR EACH ROW BEGIN
  SELECT RAISE(ROLLBACK, 'insert on table "tbl1" violates foreign key constraint "fk_insert_tbl1"')
  WHERE (SELECT id FROM tbl2 WHERE id = NEW.col2) IS NULL;
END;

CREATE TRIGGER fk_update_tbl1
BEFORE UPDATE ON tbl1
FOR EACH ROW BEGIN
    SELECT RAISE(ROLLBACK, 'update on table "tbl1" violates foreign key constraint "fk_update_tbl1"')
      WHERE (SELECT id FROM tbl2 WHERE id = NEW.col2) IS NULL;
END;

CREATE TRIGGER fk_delete_tbl2
BEFORE DELETE ON tbl2
FOR EACH ROW BEGIN
  SELECT RAISE(ROLLBACK, 'delete on table "tbl2" violates foreign key constraint "fk_delete_tbl2"')
  WHERE (SELECT col2 FROM tbl1 WHERE col2 = OLD.id) IS NOT NULL;
END;

הרבה מידע, אני יודע. אבל אם מתעמקים טיפה, לא מסובך מדי. 2 הדוגמאות הראשונות בעצם דואגות כי לפני יצירה\שינוי ב-tbl1, ייבדק כי קיים ערך מתאים ב-tbl2. הדוגמא השלישית פועלת בכלל על tbl2 בזמן מחיקת רשומה, ומוודאת כי אין רשומות מקושרות ב-tbl1. שימו לב כי אם השדה col2 ב-tbl1 לא היה מוגדר כ-NOT NULL, הפלט היה קצת אחר, אם לדוגמא ניקח את ה Insert Trigger הבא:

CREATE TRIGGER fk_insert_tbl1
BEFORE INSERT ON tbl1
FOR EACH ROW BEGIN
  SELECT RAISE(ROLLBACK, 'insert on table "tbl1" violates foreign key constraint "fk_insert_tbl1"')
  WHERE NEW.col2 IS NOT NULL AND (SELECT id FROM tbl2 WHERE id = NEW.col2) IS NULL;
END;

התוספת היא השורה WHERE NEW.col2 IS NOT NULL, אשר מוודא כי השדה החדש אינו ריק לפני שה-Foreign Key נאכף.

למחפשים עוד מידע, את הדוגמאות שלי שאבתי מהקישור הבא, והשתמשתי בכלי הבא כדי לייצר Triggers מה-Foreign Keys שלי.

אז עכשיו יש ל-jiyuu מסד נתונים מסודר, נקי ונכון. וכדי להפוך את הסכמה לקריאה יותר, השארתי את פקודות ב-Foreign Key המקוריות.

ל-jiyuu יש טיוטות

27/08/2007 23:42 ע"י כתריאל טראום

הבטחתי לעצמי שאצ'פר את עצמי בהוספת יכולת של שמירת בלוג כטויטה לפני פרסום. אז הנה, סוף סוף היה לי את השעה+ זמן פנוי בכדי להוסיף את ה-Feature.

בלי קשר, להלן רשימה של דברים שהוספתי לאחרונה:

  • תמיכה ב-Google Sitemap/AdSense
  • אפשרות ל-Post Preview
  • אפשרות לשמירה כטיוטה לפני פרסום
  • מעבר ל-PDO/sqlite3, הדרך ה"סטנדרטית" (אם יש כזו) של PHP5 לעבוד מול sqlite
  • אופציה למעבר בין URL Rewriting ל- Full URL (אני לא סובל את זה אישית, מכוער מדי)

אשמח לשמוע עוד הצעות ל-Features.

בא לשכונה בלוג חדש

08/08/2007 23:47 ע"י כתריאל טראום

הנה מתווסף לו עוד בלוג לשכונה. כבר הרבה זמן אני קורא ונהנה מבלוגים של אנשים בקהילה כמו הבלוג של ליאור קפלן, דותן קמבר, שושנה פורבס ואחרים. אני חייב להודות, מעולם, לא הייתי הבן-אדם הכי רהוט ורציף בכתיבתי (גם את בלוג הזה קצת קשה לי להוציא ב"מכה", הכתיבה די קטועה), אבל הרגשתי שזו אולי תהיה דרך לשפר קצת את ה"רהיטות" שלי בכתיבה, ותוך כדי, לכתוב על נושאים שמעניינים אותי: טכניים ואישיים יותר.

מעניין אותי לשמוע אולי מבלוגרים אחרים ש(אולי?)קוראים את הבלוג הזה, איך אתם כותבים? איך באים לכם ה"רעיונות"? בשינה? בעבודה? בשרותים?

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

אז חברים, הנה הנסיון שלי לעשות משהו יצירתי ואחר קצת משרתי Xen, קינפוג WebSphere וגידול קישואים בגינה (שאגב גודלים ממש ממש יפה, והם גם טעימים, אולי אצרף תמונה לבלוג בעתיד).

כמובן, שבלי (אן שאם) קשר לנ"ל, הבלוג הזה יעסוק גם בעניינים טכניים שמעניינים אותי, ובתקווה שגם אתכם הקוראים, כשיהיו כאלו.

25/07/2007 22:35 ע"י כתריאל טראום

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

לכן החלטתי לכתוב את jiyuu, מנוע למערכת בלוגים. jiyuu מבוססת על php (כמובן), ו-sqlite מה שהופך אותה לפשוטה וקלה; מאין דרך אמצע בין מערכת בלוגים מבוססת mysql ומערכת מבוססת קבצים. אישית אני משתמש ב-lighttpd כשרת הווב, אבל כמובן ש-jiyuu תעבוד ללא בעיה עם Apache.
jiyuu עושה שימוש נרחב במנוע ה-Ajax המצויין xajax, מה שהופך אותה לזורמת ונוחה יותר לשימוש ממנוע בלוגים קלאסי (לדעתי כמובן, אבל אני בכלל לא משוחד).

כרגע jiyuu עדיין בשלבים מוקדמים, ולכן עוד לא העלתי קוד שלה, אשמח לשלוח במייל את הקוד למי שמבקש, שלחו לי אימייל לכתובת katriel AT traum dot org dot il.

jiyuu זמינה ותהיה זמינה תחת רשיון ה-GPL.