Переносимый Jekyll для Windows

Установка Jekyll под Windows довольно хлопотное дело. Но мир не без добрых людей и существует сборка позволяющая сделать это с минимальными телодвижениями.
В состав сборки входят:

  • Ruby 2.0
  • Ruby development Kit
  • Git 1.8.3
  • Python 2.7.5
  • Jekyll 1.0.3

Все что нужно сделать, это скачать архив, распаковать его и добавить в переменную окружения PATH пути к исполняемым файлам.

Что делать с ошибкой «Conversion error: There was an error converting…»

Для сборки одного сайта я использовал ruby 2.0.0p451 и jekyll 1.4.3 запущенные под Windows 7.

При попытке запуска сайта получал ошибку:
Generating... Conversion error: There was an error converting '_posts/welcome.md/'.
error: incompatible encoding regexp match (UTF-8 regexp with IBM866 string). Use --trace to view backtrace

Как ни странно, но лечится это довольно просто: chcp 65001. Для удобства можно добавить эту строку в jekyll.bat.

Синхронизация fork’а с оригинальным репозиторием на GitHub

Почему-то в статье Syncing a fork из справки GitHub описан только метод синхронизации через локальный репозиторий. В то же время синхронизировать fork можно и через веб-интерфейс:

  1. Заходим в fork на GitHub.
  2. Жмем Pull Requests.
  3. Жмем New Pull Request. По умолчанию GitHub будет сравнивать ваш форк с оригинальным репозиторием и не будет никаких сравнений, если вы не вносили изменений.
  4. Жмем switching the base. Теперь GitHub будет сравнивать оригинальный репозиторий с вашим форком и вы увидите все последние изменения.
  5. Жмем Click to create a pull request for this comparison и указываем осмысленное имя вашему pull request, например «Обновление из оригинального репозитория».
  6. Жмем Send pull request.
  7. Листаем вниз, жмем Merge pull request, а затем жмем Confirm merge. Если ваш форк не содержал никаких изменений, то у вас будет возможность слить код автоматически.

Интересная работа

Прочитал на Хабре статью «Reverse engineering на собеседовании: как мы нанимаем на работу» и захотелось стать вирусным аналитиком. Правда наверно уже поздно.

Ваш телефон@yandex.ru — теперь это возможно!

На днях Яндекс.Почта предложила мне создать алиас почтового ящика в виде телефон@yandex.ru. По моему, это очень интересная функция, так как избавляет от диктовки по телефону конструкция типа «эс как доллар», «и с точкой», «эйч как русская эн» и т. д.

Бесплатные SSL-сертификаты

Возвращаясь к теме SSL-сертификатов. Еще два года назад я прочитал про бесплатные сертификаты от startssl.com, но как-то руки не доходили попробовать. Как оказалось, все очень просто и работает (в этом можно убедиться пройдя по ссылке).

Corban, dear! — отладочная библиотека для PHP

Когда я в 2000-ом году пришел в Softerra, там для PHP во всю использовали небольшую, порядка 200 строк, самописную библиотеку для дебага «Corban, dear!». Первоначально написал её Боба, дав название по мотивам «Пятого элемента». Но так уж получилось что потом ей занимался я: под впечатлением от ColdFusion я сделал буферизированный вывод после завершения работы скрипта, добавил поддержку объектов, вывод методов класса, вывод в файл, написал документацию. Затем я ушел из Softerra, прошло пару лет и вместе с Бобой её основательно переписали. И мы до сих пор её используем, так как это намного лучше чем var_dump() или print_r().

Страница библиотеки на Google Project Hosting и на GitHub.

Wildcard SSL-сертификаты

Недавно понадобилось приобрести wildcard SSL-сертификат. Как оказалось, российские конторы их только перепродают, причем втридорога. А у «производителей», например Comodo или RapidSSL, обычный можно приобрести от 49$, а wildcard от 149$.

Ютюбоподобный хеш

Году в 2006 мы разрабатывали свой клон Ютюба. В этом проекте многие вещи пришлось разрабатывать с нуля. Например, мне очень хотелось использовать в проекте хеши подобные тем, что использует Ютюб. С ходу решения не нашлось и пришлось поразмышлять:

  1. Хеш Ютюба содержит 11 символов.
  2. Алфавит хеша состоит из 64 символов (по 26 заглавных и строчных букв латинского алфавита, 10 цифр, дефис и символ подчеркивания).
  3. На кодирование всех символов этого алфавита нужно 6 бит (2^6 = 64).
  4. Хеш Ютюба содержит 11 символов, т.е. 66 бит.
  5. Можно предположить что берется какой-то хеш в 64 бита, например половина MD5, дополняется до 66 и дробится на куски по 6 бит.
  6. Каждый кусок — это символ нашего алфавита.

Тогда у меня получился такой код:

function get_ylhash($data=null, $long=false)
{
	if (is_null($data))
	{
		if ( substr(PHP_VERSION, 0, 1) == '5')
		{	// PHP5
			$data = md5(uniqid(rand(), true), true);
		}
		else
		{	// < PHP5
			$data = md5(uniqid(rand(), true));
			$data = pack('H*', $data);
		}
	}

	if (!$long)
	{
		$data = substr($data, 0, 8);
	}

	$alphabet = '0123456789_abcdefghijklmnopqrstuvwxyz-ABCDEFGHIJKLMNOPQRSTUVWXYZ';
	$result = '';
	$m = $a = 0;
	for ($i=0, $len=strlen($data); $i<$len; $i++)
	{
		$c = ord($data{$i});
		$result .= $alphabet{($c << $m | $a) & 63};
		$a = $c >> (6-$m);
		$m += 2;
		if ( ($m==6) || ($i==$len-1) )
		{
			$result .= $alphabet{$a};
			$m = $a = 0;
		}
	}

	return $result;
}

Шли годы, я использовал эти ютюбоподобные хеши в дальнешйих проектах, пока до меня наконец дошло: преобразование бинароной последовательности в строку состоящую из символов алфавита с 64 знаками называется Base64. Немного погуглив я нашел rfc3548.txt, в разделе 4 которого описан стандарт Base64-кодирования для использования в URL и именах файлов.

В итоге получилась такая функция:

function get_ylhash($data=null, $long=false)
{
	$trans = array
	(
		'+' => '-',
		'/' => '_',
		'=' => '',
	);

	if (is_null($data))
	{
		$data = crypt( mt_rand().uniqid(), mt_rand().uniqid() );
	}

	$data = md5($data, true);

	if(!$long)
	{
		$data = substr($data, 0, 8);
	}

	$data = strtr(base64_encode($data), $trans);

	return $data;
}

Исходный код на GitHub.

Правильно закрываем сайт на техобслуживание

Был немного удивлен тем, как на текущей работе закрывают сайт на техобслуживание: перенаправляют все запросы на closed.php. Это не совсем удобно для посетителей, т.к. если в момент начала работ кто-то был на сайте, то в итоге окажется на непонятной странице. И очень не удобно для поисковиков, т.к. они получат какой-то мусор.

Правильным решением будет на время проведения технических работ на все запросы отдавать содержимое специальной страницы, вместе с 503 кодом состояния HTTP.

Для этого файл .htaccess должен выглядеть следующим образом:

RewriteEngine On
RewriteCond %{HTTP_HOST} ^(www\.)?example\.com$
RewriteCond $1 !^(closed\.php)
RewriteRule ^(.*)$ /closed.php [L]

А файл closed.php должен быть таким:

<?php
$online = '22.01.2014 14:40 +0400';
$online = strtotime($online);
header('Content-Type: text/html; charset=utf-8');
header('HTTP/1.1 503 Service Temporarily Unavailable');
header('Status: 503 Service Temporarily Unavailable');
header('Retry-After: '.gmdate(DATE_RFC822, $online));
?>
<html>
<head>
	<meta charset="utf-8" />
	<title>example.com: ведутся технические работы</title>
</head>
<body>
	<div style="text-align: center; width: 300px; height: 200px; position: absolute; top: 50%; left: 50%; margin-top: -100px; margin-left: -150px;">
		<h2>На сайте ведутся технические работы. Приблизительное время включения <?php echo date('H:i d.m.Y', $online); ?>.</h2>
	</div>
</body>
</html>

Исходный код на GitHub.