از وردپرس به نیکولا
خیلی وقت بود که به فکر انتقال وبلاگم به یکی از سیستمهای وبلاگ ایستا (Static) بودم. عمدهترین دلیلش هم قابلیت خوب Github برای انتشار چنین وبلاگهایی بود. اما بیشتر از یک سال این فکر را عقب انداختم تا دیگر کم کم نگهداری از هاست و دامین وبلاگ آن هم با نوع سرویس دهی شرکتهای ایرانی، برایم خسته کننده شد. وبلاگنویسی قرار نیست تمام فکر و ذکرم را به خودش مشغول کند! قرار است یک جای ساده باشد که خیلی راحت بتوان تویش نوشت و منتشر کرد. (الان که دارم مینویسم، دامین اصلی وبلاگم Shahinism.com لنگ به هواست و نمیتوانم DNS را به هاست قبلی منتقل کنم)
چرا یک وبلاگ ایستا؟
خوب به طور کلی دلایلش از این قرارند:
- سرعت، سرعت، سرعت: دیگر در این نوع از وبلاگ، خبری از پایگاه داده نیست. همینطور قرار نیست هیچ پردازشی در سمت سرور وبلاگ قرار گیرد. و خوب طبیعتا خیلی خیلی امکاناتی که این ابزارها فراهم میکنند را نمیتوانم داشته باشم. اما حقیقتش در یک وبلاگ، به بسیاری از این ابزارها نیاز ندارم. به هر حال این نبودنها، یعنی سرعت بیشتر. در مورد من، سرعت لود صفحات، حدودا سه برابر بیشتر شد.
- سادگی: فکر نمیکنم چیز زیادی در این زمینه برای گفتن باقی گذاشته باشم.
- امنیت: وقتی تنها با صفحات سادهٔ HTML روبرو هستید. وقتی یک سیستم انتشار قابل اطمینان دارید، دیگر نباید نگران آپدیت بودن ابزار وبلاگنویسیتان و یا هک شدنش باشید. اینطور نیست؟
- محدود نبودن پهنای باند: این یکی از آن کابوسهایی است که بیخبر به سراغتان میآید. ولی خوب خوشبختانه روی گیتهاب، این نگرانی را نداریم ;-)
- قابلیت بازیابی: خوب این یکی زیاد مربوط به خود سیستم وبلاگنویسی نیست. ولی چون نتیجهٔ کارش را میتوان با هر سیستم دلخواهی منتشر کرد و من گیت را انتخاب کردهام، خیلی راحت میتوانم در صورت گند زدن، بدون هیچ استرسی آن را به حالت قبل برگردانم. این قابلیت روی هاستهای اشتراکی پولی و گران است و در سرورهای اختصاصی، خیلی پر دردسرتر از چیزی که در اینجا با آن طرفیم ;-)
کدام سیستم؟
به هر حال، پس از قطعی شدن تصمیم انتقال، باید یکی از سیستمها را انتخاب میکردم. به طور کلی این سیستمها اعم از Nikola, Pelican, Octopress و خیلیهای دیگر که با یک سرچ در اینترنت میتوانید پیدایشان کنید، تفاوت عمدهای در نتیجهٔ کار ندارند. طرز کارشان فوقالعاده ساده است. شما متن پست وبلاگتان را در یک فایل حالا به هر فرمتی که سیستم مورد نظر برایتان مهیا کرده مینویسید، یک قالب هم بر اساس قوائد تعیین شدهٔ سیستم به آن میخورانید و میگویید که وبلاگ آماده شود. در نهایت این سیستم میآید یک سایت کاملا ایستا در فایلهای html آماده میکند که شامل پستهای شماست و بر اساس قالب مورد نظرتان قالببندی شده.
من Nikola را انتخاب کردم، چون اولا پایتونی است و بعد از آن خیلی راحتتر از Pelican که آن هم پایتونی است نصب میشود. همین!
نام فارسی پستها و مشکلاتش
برای انتقال وبلاگ وردپرسیام کافی بود که یک خروجی XML از وبلاگم بگیرم و آن را به صورت زیر به نیکولا بخورانم:
nikola import_wordpress wordpress_output.xml
و در اینجا یک مشکل ساده پیش رویم بود. من روی وبلاگ وردپرسیام از URLهای فارسی برای پستها استفاده میکردم. همانطور که میدانید کاراکترهای Unicode در URLها به صورت خاصی کد میشوند و اگر ما آنها را در مرورگرمان به صورت فارسی میبینیم، این تنها قابلیت مرورگرمان است و بس! یعنی آدرس اصلی URLها همان کدهای در هم و شلخته است. به هر حال روی وردپرس این امکان مشکل زیادی ایجاد نمیکرد و از قرار به SEO سایت هم کمک میکرد.
در فرآیند انتقال، نیکولا به ازای هر پست یک فایل تکست که حاوی متن پست است با پسوند wp و یک فایل جدا با فرمت meta که حاوی تگها و اطلاعات دیگر پست است ایجاد میکند. نام این فایلها را با کمی دستکاری، از روی آدرس قبلی پستها بر میدارد. اولین باری که وبلاگ را وارد کردم، یک کابوس واقعی بود! اسم فایلها همان کاراکترهای یونیکد کد شده بود و مدیریتشان واقعا سخت.
خوشبختانه پایتون در ماژول urllib متدی به اسم unqoute دارد که میتواند این رشتهها را به همتای یونیکدیشان ترجمه کند. این مساله را با نویسندهٔ Nikola در میان گذاشتم و او هم این قابلیت را به نیکولا اضافه کرد. با این تفاوت که اسم فایلها باز هم فارسی نبود. برای مثال پستی به اسم این ایمکس دوست داشتنی (بالانس کردن پرانتزها) اسمی به صورت yn-ymkhs-dwst-dshtny-blns-khrdn-prn میگرفت. خوب که توجه کنید یک تلاش ناشیانه برای فینگلیش کردن کاراکترها را میبینید. اینطور نیست؟ خوب این برایم خیلی جالب بود. این عمل با استفاده از تابع unidecode پایتون در متد slugify نیکولا انجام میگرفت. چند نفر دیگر هم این مشکل را با توسعه دهندهٔ Nikola در میان گذاشتند، ولی از قرار فعلا نیکولا لازم است که از این تابع استفاده کند و راهی برای دور زدنش نیست (من هم هرچند سوادش را ندارم، ولی زیاد درگیرش نشدهام).
این است که پستهای قبلی وبلاگم، آدرسهایی کوتاهتر، شکیلتر ولی نامفهوم و غیر SEO دارند. اما هر چه باشد، فعلا قابل تحمل است، شاید در آینده فکری به حالش کردم.
طراحی قالب
نیکولا قابلیت استفاده از دو زبان برای طراحی قالبش را دارد. Mako و Jinja2. من به خاطر خوشگلی Jinja2 را انتخاب کردم و پس از مطالعهٔ مستنداتش شروع به نوشتن یک قالب برای Nikola کردم. و خوب از آنجایی که بنیاد اصلی قالبهای نیکولا Mako بود، زیاد دستم به جایی بند نبود. این بود که قالب Orphan نیکولا را که با Mako نوشته شده بود به Jinja2 ترجمه کردم و روی آن کار کردم. ترکیبش با استایل و Markup قالب وردپرسی Manifest چیزی است که الان روی این وبلاگ میبینید. ترجمهٔ Jinja2ای قالب Orphan را برای اضافه شدن به Nikola کامیت کردم، ولی هنوز اضافه نشدم (همان بهتر که اضافه نشده، چون مشکلاتی دارد که باید حل کنم). قالب فعلی هم بعد از تکامل به لیست قالبهای Nikola اضافه میشود.
Syntax highlighter در پستها
خوب من در وبلاگم زیاد کد به اشتراک میگذارم. این است که یک Syntax highlighter خوب میتواند خیلی کمک کننده باشد. قبلا از دو افزونهٔ مختلف وردپرس که هر کدام نحو مخصوص به خودشان را داشتند استفاده کرده بودم و با هزار بدبختی نحو یکی را با دیگری منطبق کردم که ساختار وبلاگ یکپارچه به نظر آید. ولی بعد از انتقال به Nikola هیچ کدام از این نحوها درست کار نمیکرد.
باید بیش از ۲۰۰ پست را جستجو میکردم و هر جا کدی بود آن را به صورت دستی ویرایش میکردم و به شکلی منطبق با Markdown در میآوردم (Nikola پس از وارد کردن پستهای وردپرسی به وبلاگ، به صورت خودکار آنها را با Markdown کامپایل میکند). خوب وقتی Emacs کبیر ویرایشگر محبوبتان باشد، با dired و یک Query میتوانید کل این ویرایشها را یکجا انجام دهید (نکات تکنیکی کار را بعدا در پستهای جداگانه مینویسم. ولی همین اشارهها هم باید به قدر کافی روشنگر باشند).
این را هم اضافه کنم که Nikola برای این کار از Pygments استفاده میکند که لیست Lexerهایش را میتوانید از اینجا ببینید.
دیدگاهها
قبلا گفتم که با Nikola دیگر خبری از پایگاه داده نیست. تنها ابزار خیلی خیلی مهم مورد نیاز برای وبلاگنویسی بخش دیدگاههاست که از چند وقت پیش دوباره برگردانده بودمش روی Disqus. این ابزار فوقالعاده است. ولی خوب فعلا یک مشکل عمدهای که با آن دارم این است که نمیتوانم متن کامنتها را در آن راست به چپ کنم. قبلا این امکان در آن وجود داشت که با CSS آن را کنترل کنم. ولی در نسخهٔ جدید این امکان را حذف کردهاند (چرا؟ نمیدانم). با مدیرانش تماس گرفتم و گفتند که در تلاشند تا امکان نمایش درست دیدگاههای RTL را به Disqus اضافه کنند. تا آن موقع مجبوریم با این یکی کنار بیاییم D:
اما یک نکتهٔ دیگر هم باقی میماند. همانطور که قبلا گفتیم، بعد از انتقال به Nikola آدرس پستهایمان تغییر کرده. در نتیجه، Disqus از آدرسهای جدید برای کامنتهای وبلاگمان استفاده میکند و کامنتهای قبلیمان را در جای درست نشان نمیدهد. Disqus برای این کار یک قابلیت Migration دارد که با گرفتن یک فایل .csv آدرس کامنتهای قبلی را به همتایان جدیدشان تبدیل میکند. Nikola به طور خودکار پس از وارد کردن وردپرس، این فایل را در شاخهٔ اصلی ایجاد میکند که میتوانید استفاده کنید.
استفاده از Github
برای اینکار کافی است یک مخزن در Github ایجاد کنید و پوشهٔ output را به آن بسپارید. ضمنا توجه کنید در صورتی که قصد دارید مثل من وبلاگ (برای کاربر یا یک گروه) ایجاد کنید نام مخزن باید به صورت username.github.io باشد و صفحات در برنچ master آپلود شوند.
انتقال دامنه
اگر مثل من قصد داشتید که یک دامنهٔ مستقل به وبلاگ پیوند بزنید، کافیست یک فایل به اسم CNAME که تنها حاوی دامنهٔ مورد نظر به صورت text است در شاخهٔ اصلی مخزن اضافه کنید. و سپس در دامنهتان یک A Record به IP شمارهٔ 204.232.175.78 اضافه کنید (برای این کار باید به DNS Management دامنهتان دسترسی داشته باشید). و خوب مشکل بعدی اینجا سر راهم سبز شد. در هنگام ثبت دامنهام، قرار بود من دسترسی کامل به دامنه داشته باشم و چون قبل از این نمیدانستم A Record چیست، فکر میکردم همینطور هم هست. میتوانستم DNSها را کنترل کنم، ولی هیچوقت نیاز به یک Record نداشتم. به هر حال، چون دیدم به DNS Manager دسترسی ندارم، یک تیکت به ثبت کنندهٔ دامنهام زدم و کاشف به عمل آمد این یکی جزء خدمات پولی است! خوب چون مدت زیادی به پایان دامنهام نمانده، قصد دارم دامنه را به یک Provider اجنبی منتقل کنم که این خدمات و خیلی چیزهای دیگر که تا قبل از این نمیدانستم میتوانم با دامنهام انجام دهم را مجانی بهم میدهد و پول تمدید خیلی کمتری هم طلب میکند!
301 Redirect
چون نمیتوانستم دامینم را منتقل کنم (این اتفاق بانی خیر شد)، یکجورهایی ناجور بود که دو دامنهٔ متفاوت با یک محتوا فعال باشند (Google به این خاطر امتیاز کم میکند). جستجو کردم و دیدم از قبل برای این کار پیشبینیهای لازم شده. این اخطارهای ۴.۴ یا ۴۰۳ (که این دومی را ما ایرانیها خوب میشناسیم) را که یادتان هست. از قرار در زمان اولیه اینترنت اتاق ۳۰۱ای بوده که وظیفهٔ انتقال دادن درخواستها را بر عهده داشته.
اما قبل از این که به چگونگی این کار بپردازم به این نکته اشاره کنم که اول از همه به فکرم رسید که دامین را فروارد کنم (که خوشبختانه رایگان بود D:) و این کار را هم کردم. ولی نمیدانم Github چرا دامین منتقل شده را درک نمیکند و اخطار ۴۰۴ میدهد. به هر حال بعدش بود که تغییر مسیر ۳۰۱ را پیدا کردم و دیدم که چقدر بهتر از آن Forward است.
برای این کار چند انتخاب داشتم. اول این که .htaccess را دستکاری کنم. دوم این که به مخزن عظیم پلاگینهای وردپرس پناه ببرم. خوب من دومی را انتخاب کردم. چون اینطوری هنوز هم به خیلی از اطلاعات دیگری که وردپرس فعلا میتواند در اختیارم بگذارد دسترسی دارم. افزونهٔ Redirection وردپرس این کار را انجام میدهد. و خوشبختانه هم فایل با پسوند CSVمان را میخواند هم دستور .htaccess را به عنوان ورودی میگیرد.
من که یک فایل CSV که Nikola برایم آماده کرده بود را داشتم، هدفم هم استفاده از همان بود. ولی یک مشکلی بود! آدرسها با این فرض ساخته شده بود که دامینم بعد از انتقال Shahinism.com میماند که فعلا اینطور نیست. یعنی یک همچین چیزی:
shahinism.com/oldversion/page1, shahinism.com/page1
که من میخواستم به همچین شکلی در آید:
shahinism.com/oldversion/page1, shahinsm.github.io/page1
خوب برای یک خط ساده است، ولی برای دویست و خردهای خط و قاطی با کلی کاراکتر کد شدهٔ یونیکد چطور؟ آن هم ساده است. باز هم Emacs و اینبار با کمک Multiple cursor که اعجوبهای است برای خودش. این است که تا موعد سر رسیدن هاستینگم، آدرس تمام پستهای قبلی به این وبلاگ منتقل میشوند و گوگل هم گم نمیشود.
بعد از آن هم که دیگر امیدوارم دامین اصلیام روی وبلاگ سوار شده باشد.
منابع دیگر:
- راهنمای نیکولا
- راهنمای صفحات گیتهاب
- راهنمای restructuredText که من برای نوشتن این پست از آن استفاده کردم و فوقالعاده لذت بردم.
- راهنمای سادهٔ تغییر قالب Orphan با Mako