Блог подвергся тотальной оптимизации. Теперь всё должно работать еще быстрее и еще лучше. Теперь на каждой странице осталось только по одному js и css файлу, конечно, если не считать сторонние сервисы — Disqus и Google Analytics. И вообще везде царствует гармония и фен-шуй.
Весь javascript был переписан с использованием Google Closurе. Попутно в него были внесены мелкие, но приятные дополнения. Например, навигация с помощью комбинаций клавиш Ctrl+← и Ctrl+→ или эмуляция переходов между состояниями (transitions) для старых браузеров, не поддерживающих CSS Transitions. Конечно, для этого пришлось написать часть кода из плагинов Twitter Bootstrap. Но в любом случае я доволен: суммарный размер всех js фалов на рабочем сервере уменьшился в 3 раза: со 180 до 60 килобайт. Да и прокачанный навык в Google Closure многого стоит.
С CSS было проще: я просто выкинул неиспользуемые части из Twitter Bootstrap и добавил свой код в результирующий файл. Это не заняло много времени.
А еще теперь при наведении на стоку в листинге с кодом слева подписывается ее номер. Не особо нужная штука, но может кому пригодиться.
Весь код, как обычно, на GitHub, включая новые большие скрипты для сборки проекта. Смотрим, изучаем, комментируем.
Я сейчас скажу некоторое количество банальностей.
Раньше, до создания своего сайта, я думал, что когда у тебя небольшой сайт, тебя никто не будет взламывать. Это ведь никому не нужно. Теперь я так не думаю. Если посмотреть логи сайта, то там будет видна куча записей с обращениями на несуществующие страницы. Видно, что боты просто проверяют наличие какого-то стандартного программного обеспечения с известными уязвимостями: a вдруг получится сломать еще один сайт и поиметь с него какого-нибудь профита. Особенно часто любят проверять наличие phpMyAdmin по стандартным адресам. Вывод: не расслабляемся, если что-то и используем, то меняем хотя бы имена.
UPD: Вот, кстати, свежее:
120.107.174.225 - - [27/Sep/2012:17:27:43 +0000] "GET /muieblackcat HTTP/1.1" 404 - - "-"
120.107.174.225 - - [27/Sep/2012:17:27:43 +0000] "GET //index.php HTTP/1.1" 404 - - "-"
120.107.174.225 - - [27/Sep/2012:17:27:44 +0000] "GET //admin/index.php HTTP/1.1" 404 - - "-"
120.107.174.225 - - [27/Sep/2012:17:27:44 +0000] "GET //admin/pma/index.php HTTP/1.1" 404 - - "-"
120.107.174.225 - - [27/Sep/2012:17:27:45 +0000] "GET //admin/phpmyadmin/index.php HTTP/1.1" 404 - - "-"
120.107.174.225 - - [27/Sep/2012:17:27:45 +0000] "GET //db/index.php HTTP/1.1" 404 - - "-"
120.107.174.225 - - [27/Sep/2012:17:27:45 +0000] "GET //dbadmin/index.php HTTP/1.1" 404 - - "-"
120.107.174.225 - - [27/Sep/2012:17:27:46 +0000] "GET //myadmin/index.php HTTP/1.1" 404 - - "-"
120.107.174.225 - - [27/Sep/2012:17:27:46 +0000] "GET //mysql/index.php HTTP/1.1" 404 - - "-"
120.107.174.225 - - [27/Sep/2012:17:27:46 +0000] "GET //mysqladmin/index.php HTTP/1.1" 404 - - "-"
120.107.174.225 - - [27/Sep/2012:17:27:47 +0000] "GET //typo3/phpmyadmin/index.php HTTP/1.1" 404 - - "-"
120.107.174.225 - - [27/Sep/2012:17:27:47 +0000] "GET //phpadmin/index.php HTTP/1.1" 404 - - "-"
120.107.174.225 - - [27/Sep/2012:17:27:47 +0000] "GET //phpMyAdmin/index.php HTTP/1.1" 404 - - "-"
120.107.174.225 - - [27/Sep/2012:17:27:48 +0000] "GET //phpmyadmin/index.php HTTP/1.1" 404 - - "-"
120.107.174.225 - - [27/Sep/2012:17:27:48 +0000] "GET //phpmyadmin1/index.php HTTP/1.1" 404 - - "-"
120.107.174.225 - - [27/Sep/2012:17:27:49 +0000] "GET //phpmyadmin2/index.php HTTP/1.1" 404 - - "-"
120.107.174.225 - - [27/Sep/2012:17:27:49 +0000] "GET //pma/index.php HTTP/1.1" 404 - - "-"
120.107.174.225 - - [27/Sep/2012:17:27:49 +0000] "GET //web/phpMyAdmin/index.php HTTP/1.1" 404 - - "-"
120.107.174.225 - - [27/Sep/2012:17:27:50 +0000] "GET //xampp/phpmyadmin/index.php HTTP/1.1" 404 - - "-"
120.107.174.225 - - [27/Sep/2012:17:27:50 +0000] "GET //web/index.php HTTP/1.1" 404 - - "-"
120.107.174.225 - - [27/Sep/2012:17:27:50 +0000] "GET //php-my-admin/index.php HTTP/1.1" 404 - - "-"
120.107.174.225 - - [27/Sep/2012:17:27:51 +0000] "GET //websql/index.php HTTP/1.1" 404 - - "-"
120.107.174.225 - - [27/Sep/2012:17:27:51 +0000] "GET //phpmyadmin/index.php HTTP/1.1" 404 - - "-"
120.107.174.225 - - [27/Sep/2012:17:27:52 +0000] "GET //phpMyAdmin/index.php HTTP/1.1" 404 - - "-"
120.107.174.225 - - [27/Sep/2012:17:27:52 +0000] "GET //phpMyAdmin-2/index.php HTTP/1.1" 404 - - "-"
120.107.174.225 - - [27/Sep/2012:17:27:52 +0000] "GET //php-my-admin/index.php HTTP/1.1" 404 - - "-"
120.107.174.225 - - [27/Sep/2012:17:27:53 +0000] "GET //phpMyAdmin-2.2.3/index.php HTTP/1.1" 404 - - "-"
120.107.174.225 - - [27/Sep/2012:17:27:53 +0000] "GET //phpMyAdmin-2.2.6/index.php HTTP/1.1" 404 - - "-"
120.107.174.225 - - [27/Sep/2012:17:27:53 +0000] "GET //phpMyAdmin-2.5.1/index.php HTTP/1.1" 404 - - "-"
120.107.174.225 - - [27/Sep/2012:17:27:54 +0000] "GET //phpMyAdmin-2.5.4/index.php HTTP/1.1" 404 - - "-"
120.107.174.225 - - [27/Sep/2012:17:27:54 +0000] "GET //phpMyAdmin-2.5.5-rc1/index.php HTTP/1.1" 404 - - "-"
120.107.174.225 - - [27/Sep/2012:17:27:55 +0000] "GET //phpMyAdmin-2.5.5-rc2/index.php HTTP/1.1" 404 - - "-"
120.107.174.225 - - [27/Sep/2012:17:27:55 +0000] "GET //phpMyAdmin-2.5.5/index.php HTTP/1.1" 404 - - "-"
120.107.174.225 - - [27/Sep/2012:17:27:55 +0000] "GET //phpMyAdmin-2.5.5-pl1/index.php HTTP/1.1" 404 - - "-"
120.107.174.225 - - [27/Sep/2012:17:27:56 +0000] "GET //phpMyAdmin-2.5.6-rc1/index.php HTTP/1.1" 404 - - "-"
120.107.174.225 - - [27/Sep/2012:17:27:56 +0000] "GET //phpMyAdmin-2.5.6-rc2/index.php HTTP/1.1" 404 - - "-"
120.107.174.225 - - [27/Sep/2012:17:27:56 +0000] "GET //phpMyAdmin-2.5.6/index.php HTTP/1.1" 404 - - "-"
120.107.174.225 - - [27/Sep/2012:17:27:57 +0000] "GET //phpMyAdmin-2.5.7/index.php HTTP/1.1" 404 - - "-"
120.107.174.225 - - [27/Sep/2012:17:27:57 +0000] "GET //phpMyAdmin-2.5.7-pl1/index.php HTTP/1.1" 404 - - "-"
Что-то давно я ничего не постил в блог. Не хорошо получается. Поэтому расскажу вкратце, чем же таким я занимался всё это время. Во-первых, я переписываю javascript часть блога с jQuery на Google Closure. Почему? Потому что таким образом значительно уменьшится размер и количество js-файлов (в идеале, остаться должен только один). Ну и плюс к этому лучше проникаюсь концепциями, скрытыми в архитектуре этого фреймворка.
Во-вторых, поставил себе TeamCity и пытаюсь разобраться, как применить CI к разработке на Haskell. В конце концов, хотелось бы получить автоматическое обновление сайта после обновления ветки production на GitHub.
А еще недавно случился день программиста. По этому поводу я посетил новый офис Prontosoft и полюбовался, как у них теперь хорошо:
Развитие блога не прекращается ни на минуту (ну почти). На этот раз я сделал meta-теги в заголовке страницы для Facebook. Теперь, если добавить ссылку на мой блог, то в блок в Facebook попадет начало поста. Кстати, совершенно внезапно, вконтактик тоже правильно стал отображать описание, что не может не радовать.
В очередной раз впечатлился выразительностью Хаскеля: cколько всего можно написать одной строчкой. Вот, например, кусочек из свеженаписанного:
getDescription :: Node -> Text
getDescription = maybe emptyDescription
(until (not . T.null) (\_ -> emptyDescription) . getDescription') .
findChild (checkMainDiv . current) . fromNode
getDescription' :: Cursor -> Text
getDescription' = cutDescription . transformDescription .
T.intercalate " " . map nodeText . filter checkParagraph .
maybe [] siblings . firstChild
Можете сравнить с примерной калькой на JavaScript:
var getDescription_ = function (cursor) {
var fc = firstChild(cursor)
return cutDescription(transformDescription(
(fc ? siblings(fc) : []).filter(checkParagraph).map(nodeText).join(" ")
));
}
var getDescription = function (node) {
var mainDiv = findChild(function (cursor) {
return checkMainDiv(current(cursor))
}, fromNode(node));
return mainDiv ? getDescription_(mainDiv) || emptyDescription : emptyDescription;
}
Хотя да, и в JS есть своя прелесть.
Как вы, может быть, заметили (или же поднимите глаза вверх и увидите прямо сейчас), на сайте появился новый раздел «Фильмы». По большей части он выполняет информационную функцию: список просмотренных мною фильмов и моя оценка по десятибалльной шкале, как на IMDb.
Может, этот список поможет кому-нибудь определиться с фильмом, который стоит глянуть, ну или хотя бы порадует глаз красивыми постерами. Смотрите, изучайте, оставляйте комментарии.
Пара слов о реализации. Я уже как-то упоминал, что практически вся информация в блоге предcтавлена в виде markdown, и этот раздел не исключение. В админке я задаю простой ненумерованный список, который уже после загрузки страницы с помощью JavaScript преобразуется в то, что хочется увидеть. Получается так называемый graceful degradation, и страница выглядит вполне адекватно в своем первоначальном виде. Таким образом, те, у кого JavaScript напрочь отсутствует, не увидят абракадабру. Сама идея верстки этого раздела была позаимствована у Сергея Чикуёнка. Этот способ позволяет мне рисовать переменное количество блоков в строке в зависимости от ширины экрана — вроде как таблица, только лучше. Главная идея этого способа в том, чтобы элементам проставить display: inline-block
, и затем расположить их относительно строки вверху (vertical-align: top
) и внизу (vertical-align: bottom
).
UPD: Пост устарел.