ג׳קיל
3 ביוני, 2013

תקציר: הבלוג עבר מערכת. למה (כי זה אלגנטי ונעים לעבוד עם זה) ואיך (באופן מודולרי)? תקראו תהמשך.

אזהרת טכניוּת ומחשבית…

הקדמה

הבלוג הזה רץ (בפרפקט) כבר זמן רב על וורדפרס, מאז ינואר 2005 (אח, כל־כך הרבה דברים קרו ולא־קרו לי ב־2005…). בזמנו, הסתכלתי על כמה מערכות של בלוגים, והיה ברור שוורדפרס זהר:

בראיה לאחור, מסתבר שהימרתי נכון: וורדפרס נהיתה מערכת הַבִּלּוּג הפופולרית ביותר, והיא מתפעלת אחוז לא מבוטל מכלל האתרים ברשת (ר׳ הערך בוויקיפדיה להפניות לסטטיסטיקה).

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

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

בנוסף, כשאני מסתכל על האופן שבו אני עובד (workflow בלעז), ברור לי שמשהו כאן עקום. אני כותב הכל ב־Vim: בין אם זה תיזה (שלצערי אני יותר מדי לא כותב אותה…), שלטים, סטיקרים או פוסטים בבלוג. עם השנים שייפתי לי סביבת־עבודה ממש ממש נוחה לי. מה שהייתי עושה בוורדפרס זה לכתוב את הטקסט ב־Vim בקובץ במחשב, ולהעתיק+להדביק את התוכן לממשק הרשת של וורדפרס. זה עקום, מועד לטעויות של סנכרון וממש לא נוח (ב־Pentadactyl יש אפשרות קלה לעריכה של תיבות טקסט, אבל זה עדיין מעיק). אם אני עורך את הקבצים באופן מקומי, למה להשתמש בממשק לא־מקומי באופן ידני בשביל להציג ולפרסם את מה שאני כותב? הדברים נעשו ברורים יותר כשהכרתי את Git ו־GitHub, והתחלתי להעלות דברים שאני עושה אל זה האחרון באופן אוטומטי (דברים גמורים מספיק מתפרסמים גם כאן כפוסט עם קישור, כמובן).

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

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

למי שמתעצלים לקרוא: ג׳קיל היא מערכת שכתובה בשפת רובי, שלמדתי לחבב (השפה המועדפת עלי היא עדיין וולשית, אה, סליחה, פייתון), ולוקחת קבצי טקסט פשוטים (שכתובים ב־Markdown או בשפת־סימון אחרת) ומעבדת אותם (על־ידי Liquid ורובי) לידי קבצי HTML פשוטים וסטטיים שנשלחים על־ידי השרת למי שמבקש, כמות שהם. זאת שיטה שהיא אלגנטית ומינימליסטית, מתאימה לאופן שבו אני עובד (כתיבה ← עיבוד בג׳קיל ← העלאה ב־rsync, כשאת שני השלבים האחרונים אפשר לעשות באופן אוטומטי) וסטטית, כך שכל הבעיות שהזכרנו נפתרות ביחד.

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

לא הכל מושלם בג׳קיל (לדוגמה, יש באג בעיבוד של Markdown לרשימות שלא כוללות תו לטיני), אבל אני מקווה שהבעיות הקיימות יתוקנו במהרה.

אם אתם נתקלים בבעיות באתר (קישור שבור, משהו אחר שהשתבש), בבקשה ידעו אותי. האתר הישן זמין עדיין בכתובת עם הסיומת wp/, אבל חלק מהדברים שם נשברו בגלל שהם מניחים שאפשר לגשת אליהם מספריית השורש (בג׳קיל אפשר בקלות להמנע מבעיה כזאת בציון מפורש של {{site***url}} ב־Liquid).

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

המעבר — צדדים טכניים

את המעבר אפשר לחלק לשני תחומים: הצד שדורך בעבר (לקחת את הנתונים מהאתר בוורדפרס ולהעביר אותם לצורה שג׳קיל קורא) והצד השני דורך בהווה ובעתיד (לקחת את הנתונים האלה שהעברנו ולהציג אותם בצורה יפה וברורה).

העברת הנתונים מוורדפרס

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

פוסטים

ניסיתי את השיטה הקנונית להגירה, דרך התחברות ישירות לשרת ה־MySQL. לא עבד. אז ניסיתי את exitwp של Guillaume Emont, שנתן תוצאה טובה, אלא שכשרציתי להעביר את הפוסטים ושישארו בפורמט HTML (המרה ל־Markdown גרמה לאיבוד של מידע קריטי), גיליתי שהממיר מתעלם מזה שוורדרפס מוסיפה תגי <p> ו־<br /> באופן אוטומטי (הראשונים בשורה רווח בטקסט; השניים בשבירת שורה). תיקנתי את זה, ואני מקווה שזה יכנס בקרוב לענף הראשי.

בנוסף, הייתי צריך לשנות באופן גורף את ההפניות הפנימיות לקבצים ולפוסטים. למזלי, יש כלים יוניקסיים נחמדים כמו find ו־sed שמאפשרים לעשות בדיוק את זה: {% highlight sh %} {% raw %} find . -name '.html' -exec sed -i 's/=\"files\//=\"\/files\//g' "{}" \; find . -name '.html' -exec sed -i 's/=\"?p=/=\"\//g' "{}" \; {% endraw %}

תגובות

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

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

כדי לייבא את התגובות הקיימות השתמשתי ב־wp2jekyll-comments של תומס פרסמן, אלא שגם כאן היה צריך לעשות כמה שינויים, וגם כאן הצעתי תיקון שאני מקווה שיכנס בקרוב לענף הראשי: השמות של השדות שבפלט שונים משום מה מאלו שמערכת התגובות מצפה להם.

כדי להוסיף גרבטרים השתמשתי בזה.

תכונות לא־קנוניות

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

אנריק מרקוס כתב קוד למעבר לפוסט אקראי. אני מאוד אוהב את הפיצ׳ר הזה בוויקיפדיה, שמאפשר ללמוד דברים שאחרת לא הייתי מגיע אליהם. הפטנט של מרקוס עוקף את חוסר האקראיות שבאתר סטטי בעזרת JavaScript; הבעיה היא שההכנסה של הפוסטים למערך שממנו מוגרל אחד מהם נעשית בכל דף, מה שאומר סתם קוד שמשוכפל כמספר הפוסטים (סיבוכיות n²…). כדי לפשט את זה כתבתי דף פשוט שעושה redirection לפוסט אקראי; הנה הקוד.

דבר נוסף הוא סינדיקציה, שהוספתי לפי הפתרון הזה של Snaptortoise.

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

החיפוש באדיבות Duck Duck Go, שהוא מנוע־חיפוש פתוח חלקית ששומר על הפרטיות של הגולשים.

כדי להציג תאריכים עבריים התבססתי על jekyll-localization.

עניינים טכניים

כדי לקבל כתובות יפות השתמשתי בהפניות האלה, ולמדתי יפה־יפה על חשיבותו של סלאש.

כדי להעביר את הצורה של הכתובות של הפוסטים בוורדפרס (?p=123) לצורה של ג׳קיל השתמשתי בשיטה הזאת: {% highlight sh %} RewriteCond %{QUERY_STRING} ^p=([0-9]+)$ RewriteRule ^$ /%1? [R=301,L]

עיצוב

את הבסיס לעיצוב של האתר גנבתי בלי בושה מהאתר של הרוקו: בעיקר סקלת־צבעים ואת המראה של הפס למעלה והמלבנים. אני חושב שטקסט בהיר על רקע כהה הרבה יותר קל לקריאה ממסך מחשב, בטח בהשוואה לרקע הלבן־בוהק ששימש באתר קודם (בתבנית Conestoga Street ז״ל בעבר, וב־mnmlist עד לא מזמן).

הפונט של גוף הטקסט הוא „אלף”. הכותרות בפונט „פשוט” של קולמוס. שניהם פונטים מעולים, כשהראשון מותאם במיוחד לקריאה של טקסט רץ ממסך מחשב (/פלאפון וכד׳). בחרתי במתכוון גודל פונט גדול יחסית, לקריאה נוחה. לכותרת הראשית בחרתי את הפונט SBL Hebrew (אני יודע שלא כדאי להעמיס בסוגי פונטים, אבל למרות „אלף” ו„פשוט” הולכים נהדר ביחד בטקסט ובכותרות, אף אחד מהם לא נראה טוב ככותרת ראשית; ניסיתי).

למדתי לא מעט שנים מצרית (וגם יפאנית, אבל שם זה מופשט יותר); אני אוהב פיקטוגרמות ולוגוגרמות. לכן, בחרתי להשתמש בסימנים ציוריים מודרניים במקום מילים כמו „דואל” או „תאריך”. רוב הציורים לקוחים מהפונט הנהדר Entypo של דניאל ברוס. כדי לבחור רק חלק מהסימנים, ולהקטין את גודל הקובץ, השתמשתי באתר Fontello (כדאי לכם להכנס אליו כדי לראות את עושר הסימנים והאסתטיקה המינימליסטית שלהם. ראם, אגב, מזהה כמות מרשימה של סימנים; אוריינות ויזואלית…).

כדי לוודא שכל האייקונים ברורים, הוספתי tooltip ליד כל אחד מהם. את הבסיס, ב־CSS3, לקחתי מכאן.

בהקשר המצרי, תוכלו ללחוץ על ההירוגליף שבצד ימין למעלה כדי לקרוא הסבר עליו. הפונט שממנו לקוח הגליף הספציפי הזה הוא Aegyptus של ג׳ורג׳ דורוס, שמשחרר את הפונטים הנהדרים שלו (שימו לב ל־Symbola) באופן הכי חופשי: לכל שימוש שהוא, בלי כל הגבלה.

תגים