Блог для программиста

Традиция такая. Про переезд на новый хостинг пост. А как иначе? Новоселье!

Вот помню еще той весной задумал завести свой блог, но осенью пишу статью; как раз пол года срок. Ну что ж, начну рассказ с начала.

Все началось с ЖЖ. И все закончилось уже, хватило мне единственного взгляда — ЖЖ ужасен, и сколько бы народу не сидело в нем — порывы рвотные я не могу сдержать при взгляде на его дизайн. Могу лишь навещать, пусть через силу, друзей в сообществах родных по духу. На каждый комментарий что оставил в нем, читая интересный пост, затрачено пустых усилий было столько, что мог бы целый пост я написать, будь волен я не заходить по десять раз на сайт и не елозить мышью по доброй сотне комментариев ветвей.

Потом я Blogger испытал, но не прижился он: был черезчур раздут (или мне показалось). Задумка в целом глупой оказалась, ведь корпорации добра до блогов дела нет.

Ничем кроме проклятья не назову я то, что настигает гугл в его попытках тщетных представить публике почтенной уютное местечко для бесед. Волну никто не понял, а Buzz, в который каждого из нас как будто носом ткнули — вовсе не базар, а так… лоток в безлюдной деревушке, в котором обречен подряд который месяц себя любимого читать, и кросспосты с чтеца, и твиты с твиттера, короче — что угодно. Единственное понял я — оригинального контента не сыскать, там все из третьих мест и не серьезно.

О Posterous товарищ Умпутун в своем подкасте замолвил доброе слово — грех было не попробовать, и честно вам скажу — понравилось. Чего уж там, я всем рекомендую на Posterous взглянуть, запостить что-нибудь, и до тех пор пока ваши посты будут просты вам не в чем будет блог-платформу упрекнуть.

Прошло три месяца, и все бы ничего, но нет, хозяева платформы поспешили презентовать markdown для постов, но допилить забыли возможность обновлять посты потом; чем причинили мне долгие часы в попытках обновить свой пост. Все было тщетно.

Я понял, что идеала быть не может, хотя, быть может, он возможен, но нужно постараться самому и приложить усилия к тому, чтобы собрать платформу на которой будет просто и в удовольствие постить. Я оказался не один такой. В Сети нашлись люди, которые не ждали пока им принесут идеал на блюде. Эти люди были те еще гики — это ж надо додуматься приспособить систему контроля версий для публикации постингов.

Парни открыли на гитхабе дополнительный сервис, зовется он Pages — статические HTML-страницы держит. Простые страницы все же не блог — так какой же от сервиса толк? Там есть генератор удобный, который из пачки шаблонов и текста ровного сделает сайт пользователю на радость командой одной — git push — экая малость.

В чем суть? Зачем ради простого блога такие огороды городить?

Шаблоны? HTML? CSS?
Ради индивидуальности. Когда-нибудь настанет время, захочется чтоб просто было все, красиво, чтоб нашу отражало суть, чтоб каждый мог к нам заглянуть и посмотреть не на шаблон, которых 100500 в Сети, а на творение…

Здесь путь один, и раз уж взялся показать себя в Сети — освой HTML и CSS, без них здесь не пройти.

Git
Для техников пишу эту статью. Ужель ты с Википедией знаком? Гит — то же самое, но лучше; хранилище для текста.

Чем отличается программа от статьи? Ничем. Суть текст простой. И нам же лучше, если мы сможем откатить ошибки, поправить сайт не будучи в сети, друзьям послать — пускай помогут нам, и от греха подальше сохранить на множестве машин.

sudo aptitude install git-core
Emacs
При чем здесь Emacs? А при том, что мы работать будем в нем. В Org Mode.

Что лучше может быть, чем пост писать в редакторе достойном? Шаблоны править в нем, по ходу: CSS, HTML, коммитить в нем же в git, и слушать музыку (но я здесь не о том). С тех пор как я намучался с плодами Web 2.0, порою к страшным прибегая извращениям (навроде написания статьи в редакторе GMail'а) подход, где все в одном, все по-старинке — спокойствие вселяет, и заставляет к благому делу большее усердие прилягнуть.

Org Mode
Буквально месяц с тех времен прошел когда впервые я прослышал о сей моде. Немного поискал и примянул использовать разок. Потом другой. И третий. В конце концов оставил не у дел я множество вещей, будь то ToDo-листы, календари и прочий ширпотреб — org-mode с лихом эти вещи заменяет.

Я был шокирован не далее чем пару дней назад, наткнувшись на один из тысяч форков настроек Emacs Starter Kit. От радости я плакал, когда код читал (сам Кнут бы плакал тоже) — настройки те написаны в «литературном стиле». В том самом стиле был написан «TeX». Суть в кратце такова: внутри «org-mode»-файла лежит рассказ о коде, код; рассказ сам — исполняется, двух зайцев убивая в раз — в конце у нас есть просто код и есть рассказ (пригодный к публикации в блоге или в виде PDF-файла сгенерированного LaTeX'ом — безо всякой дополнительной обработки).

Jekyll
Генератор Jekyll написан на Ruby, заточен под блоги. Работа с ним идет таким ходом: пользователь в директории, git-репозитории, создает поддиректории особые, которые наполняет шаблонами, картинками, страницами стилей, скриптами и собственно, постами. Когда очередной работы выполнен кусок — контент коммитится и отправляется на сервера гитхаба, там прогоняется через наш генератор, он из шаблонов и кусков конечный собирает блог.

Без Jekyll'а мы можем обойтись вполне — достаточно нам git'а, но чтоб по десять тысяч раз нам в облако не пушить и не плодить коммитов — поставим; а позже в нем мы сможем запустить и протестировать наш блог.

Вам правду доложу — поставить Jekyll было трудно, я битый час консоль пытал; так было это нудно. Я весь расстроился и был немного зол, что много нехороших слов про руби в тви наплёл. Но превозмог и сделал грязный хак — скачал пакет из Meerkat (вот дурак ;)

sudo aptitude install ruby-full
wget http://mirrors.kernel.org/ubuntu/pool/universe/libg/libgems-ruby/rubygems1.8_1.3.7-2_all.deb
sudo dpkg --install rubygems1.8_1.3.7-2_all.deb
sudo gem install jekyll

Пускай вас эта ложка дегтя не смущает, хотя стабильности она не добавляет, стабильность оставляю не у дел; ведь так всегда — поставил свежий софт и глюки потерпел.

Бинарь ищите в недрах:

/var/lib/gems/1.8/gems/jekyll-0.7.0/bin/jekyll
Ubuntu
Не знаю, как там кто — я пользуюсь Убунтой; тому есть сто причин, но главная из них — я не хочу напрасно тратить время, работаю по принципу «работает — хуй с ним».

Не стану я вдаваться глубоко в тоньчайшие аспекты разработки, представлю вам всё просто и легко — два пасса мышью плюс в консоли десять строк, встряхнуть, разбавить, потрясти; готово — вот наш блог.

Мой блог; хоть он не совершенен — своею писаниной дорожу, поэтому я поступаю просто и сурово — я git-репозиторий в svn держу (в Dropbox'е тобиш):

cd ~/Dropbox
git init zahardzhan.github.com
cd ./zahardzhan.github.com

Здесь имя — zahardzhan, пишу своё, я вашего не знаю; читатель, укажи своё, но не забудь .github.com приписать — таков формат.

Залейте бложик на гитхаб.

git remote add origin git@github.com:zahardzhan/zahardzhan.github.com.git
git push origin master

В своем устройстве блог не терпит беспорядка — давно уж прописали: что где лежит и что чему принадлежит.

~
   Dropbox
      zahardzhan.github.com
         atom.xml
         _config.yml
         css
            screen.css
         favicon.ico
         images
            image1.png
            image2.png
         index.html
         _layouts
            default.html
            post.html
         org
            2010-10-09-buddhas-zen.org
            2010-10-10-blog-for-programmer.org
         _posts
            2010-10-09-buddhas-zen.html
            2010-10-10-blog-for-programmer.html
         _site

Вот файлы, по порядку:

atom.xml
Шаблон канала новостей. Уважь читателя — кто будет блог читать без новостей? И пропиши канал в feedburner.com скорей.
_config.yml
Настройки Jekyll в формате YAML. Подробнее в оригинале. Я не большой фанат — держу всё по-дефолту:
css
Здесь я держу страницу стиля.
favicon.ico
Иконка.
images
Картинки.
index.html
Заглавная страница. Три черточки вверху в формате YAML front matter укажут заголовок и шаблон в который будет вставлена страница.
_layouts
Шаблоны сайта; используют язык liquid. Примеры приводить не стану — там много кода для поста, но если любопытно вам, прошу репозиторий блога навестить.
org
Хранилище постов в формате Emacs Org-mode. Отсюда готовые посты будут компилироваться в html-файлы в директорию
_posts
Хранилище для постов в формате html, markdown и textile. Отсюда готовые посты будут компилироваться в html-файлы в директорию
_site
Хранилище скомпилированых постов в формате html. Отсюда они уже никуда не будут компилироваться, поэтому эту директорию нужно проигнорировать в своем .gitignore.

Перед письмом постов настроим Emacs, чтоб правильно он импорт проводил. Нам от готового поста нужно одно лишь тело (контент между тагами <body>).

(setq org-publish-project-alist
      '(("zahardzhan.github.com-org"
         :base-directory "~/Dropbox/Blog/org/"
         :base-extension "org"
         :publishing-directory "~/Dropbox/Blog/_posts/"
         :recursive t
         :publishing-function org-publish-org-to-html
         :headline-levels 4
         :html-extension "html"
         :body-only t)

        ("zahardzhan.github.com-static"
         :base-directory "~/Dropbox/Blog/org/"
         :base-extension "css\\|js\\|png\\|jpg\\|gif\\|pdf\\|mp3\\|ogg\\|swf\\|php"
         :publishing-directory "~/Dropbox/Blog/_posts/"
         :recursive t
         :publishing-function org-publish-attachment)

        ("zahardzhan.github.com"
         :components ("zahardzhan.github.com-org"
                      "zahardzhan.github.com-static"))))

Посты мы пишем так:

#+OPTIONS: H:3 num:nil toc:nil \n:nil @:t ::t |:t ^:t -:t f:t *:t TeX:t LaTeX:nil skip:nil d:t 
#+STARTUP: SHOWALL INDENT
#+BEGIN_HTML
---
layout: post
title: Мой первый пост
---

Мой первый пост!

Название .org-файла должно указывать на то, что это пост; он должен быть назван так: 2010-10-10-my-first-post.org, иначе непойдет.

Как будет пост готов — нажмём C-c e X zahardzhan.github.com (с расчетом на свой сайт).

Взглянём что получилось (в браузере по адресу localhost:4000)

~/Dropbox/zahardzhan.github.com # /var/lib/gems/1.8/gems/jekyll-0.7.0/bin/jekyll --server

Magit'ом закоммитим новый _posts/2010-10-10-my-first-post.html.

git push. На этом всё.