Паранормальное
Большинство людей
Для меня достаточно очевидно, что эту кучу нужно делить на два чётких класса: на то, что противоречит современным научным взглядам (телекинез, телепатия, гороскопы, суеверия, аура и прочее), как бы это наукообразно не звучало (структурированная вода,
Про первую группу говорить не хочется, про вторую приведу два примера.
Другая тема — инопланетяне. В этой теме традиционно серьёзные исследования никому не интересны, потому что не содержат ничего сенсационного, а громче всех высказываются люди далёкие от науки. Поэтому первые ассоциации у нас всех — «зелёные человечки» и «летающие тарелочки». Тем не менее, в возможном существовании разумной жизни с других планет нет ничего ненаучного. Количество звёзд во Вселенной оценивается в 1,5×10¹¹, а недавно астрономы заявили, что их может быть в три раза больше. Вокруг такого гигантского количества звёзд громадное количество планет. Что мешает зародится жизни
Другое дело — посещение Земли инопланетянами. Ближайшая к нам звезда находится на расстоянии 4,22 световых года. Современная физика утверждает, что добраться за приемлемое время из такого замкадья к нам невозможно. Наверное, может быть
Например, на Марсе могла бы быть
Или вот у наших газовых планет найдены спутники, на которых, как считается, пристойные условия для жизни (не такие комфортные как у нас, но и на Земле жизнь
«Неловкая пауза»
Крестики-нолики на HTML CSS и прокрастинация

Есть такое понятие — прокрастинация, это про «никогда не откладывай на завтра то, что можно сделать послезавтра». В тяжёлых проектах есть соблазн отложить принятие трудных решений «на потом» или не делать
Я
У меня с моими «
Вчера ночью меня осенило, открыл ноут перед сном и исправил последнюю ошибку (их там оказалось две — в выводе данных из программы моделирующей игру и в самом конверторе,
Багов быть не должно, могут быть шероховатости. Я сам знаю пару неаккуратных вещей — кнопка «Restart» работает не во всех браузерах и на ничьей следующий ход уже не сделать (хотя он и не нужен
Картинка на чистом CSS

Сейчас CSS позволяет делать всё более интересные вещи. Раз уж сегодня короткий день, за 20 минут из «сэкономленного» часа накидал программу, которая конвертирует любую картинку (в форматах PNG, JPEG или GIF) в чистый CSS (без использования dataURI). Каждая точка кодируется через одну конструкцию
Если заморачиваться серьёзно, то можно выявлять в картинке области с градиентом (так делается в формате PNG для упаковки) и покрывать их целиком одной конструкцией, а так же оптимизировать наложением линейных градиентных областей с прозрачностью (через rgba или hsla). Достаточно интересная программисткая задача, кстати.
Самую очевидную оптимизацию я сделал в пробке по работе домой — выделил самый частый цвет и пустил его на фон, выиграл примерно 11,5КБ на картинке в примере.
За 20 минут я только успел сделать небольшой конвертор (результат работы можно посмотреть в разделе «Храню», только для «Хрома»). Так как синтаксис завязан на префиксы, то я в генераторе сделал указание браузера под который нужно сгенерировать код (поддерживаются: IE, Opera, Firefox и Chrome). Всё это весьма расточительно, картинка 75×75 занимает 164КБ.
У меня заработало для «Хрома» и «Файэрфокса», под «Оперой» не завелось, лень проверять что она не поддерживает, IE попробовать не могу — его не бывает на «Маках». Код конвертора
// Конвертор картинки в чистый CSS, / ноябрь 2011
<?
// ffccbb → fcb
// ff0000 → red
// abcdef → abcdef
function Bo_shortcolor($color) {
static $shortnames = array(
"#000080" => "navy",
"#008000" => "green",
"#008080" => "teal",
"#4b0082" => "indigo",
"#800000" => "maroon",
"#800080" => "purple",
"#808000" => "olive",
//"#808080" => "gray",
"#808080" => "grey",
"#a0522d" => "sienna",
"#a52a2a" => "brown",
"#c0c0c0" => "silver",
"#cd853f" => "peru",
"#d2b48c" => "tan",
"#da70d6" => "orchid",
"#dda0dd" => "plum",
"#ee82ee" => "violet",
"#f0e68c" => "khaki",
"#f0ffff" => "azure",
"#f5deb3" => "wheat",
"#f5f5dc" => "beige",
"#fa8072" => "salmon",
"#faf0e6" => "linen",
"#ff0000" => "red",
"#ff6347" => "tomato",
"#ff7f50" => "coral",
"#ffa500" => "orange",
"#ffc0cb" => "pink",
"#ffd700" => "gold",
"#ffe4c4" => "bisque",
"#fffafa" => "snow",
"#fffff0" => "ivory",
);
$c = strtolower($color);
if (isset($shortnames[$c])) {
return $shortnames[$c];
}
if ($c[0] == $c[1] && $c[2] == $c[3] && $c[4] == $c[5]) {
return '#' . $c[1] . $c[3] . $c[5];
}
return '#' . $c;
}
function Bo_convert($filename, $prefix = '') {
if (!file_exists($filename) && !is_readable($filename)) {
throw new Exception('File not found.');
}
$types = array(
IMAGETYPE_JPG => 'jpeg',
IMAGETYPE_PNG => 'png',
IMAGETYPE_GIF => 'gif',
);
$imagedata = @getimagesize($filename);
if (!is_array($imagedata) || !isset($imagedata[2]) || !isset($types[$imagedata[2]])) {
throw new Exception('Unknown image format');
}
$im = call_user_func("imagecreatefrom" . $types[$imagedata[2]], $filename);
$w = imagesx($im);
$h = imagesy($im);
// Самый частый цвет идёт на background-color
$colorfreq = array();
for ($x = 0; $x<$w; $x++) for ($y = 0; $y<$h; $y++) @$colorfreq[imagecolorat($im, $x, $y)]++;
$bg = array_search(max($colorfreq), $colorfreq);
for ($x = 0; $x<$w; $x++)
for ($y = 0; $y<$h; $y++) {
$pixel = imagecolorat($im, $x, $y);
if ($pixel != $bg) {
$color = Bo_shortcolor(sprintf('%06x', $pixel));
$dots[] = "{$prefix}radial-gradient($color,$color) {$x}px {$y}px";
}
}
$dots = join(',', $dots);
$bg = Bo_shortcolor(sprintf('%06x', $bg));
return <<<HTML
<head>
<title>$filename converted in background by Evgeny Stepanischev //bolknote.ru</title>
<style text="text/css">
div {
background: $dots;
background-repeat: no-repeat;
{$prefix}background-size: 1px 1px;
background-color: $bg;
background-size: 1px 1px;
width: {$w}; height: {$h};
}
</style>
<body>
<div></div>
</body>
HTML;
}
if ($_SERVER['argc'] < 2) {
echo <<<HELP
Image to background CSS convertor by Evgeny Stepanischev. //bolknote.ru Nov 2011
Usage: {$_SERVER['argv'][0]} filename [prefix]
filename - image file name (PNG, JPEG or GIF)
prefix - your browser name (Opera, IE, FF, Safari, Chrome)
HELP;
exit;
}
$browsers = array(
'ie' => '-ms-',
'opera' => '-o-',
'safari' => '-webkit-',
'chrome' => '-webkit-',
'chromium' => '-webkit-',
'ff' => '-moz-',
'firefox' => '-moz-',
);
if (isset($_SERVER['argv'][2])) {
$type = strtolower($_SERVER['argv'][2]);
$prefix = isset($browsers[$type]) ? $browsers[$type] : '-' . $type . '-';
} else {
$prefix = '';
}
try {
echo Bo_convert($_SERVER['argv'][1], $prefix);
} catch (Exception $e) {
echo "Error: ", $e->getMessage(), "\n";
};
Цвета из CSS, названия которых короче их номеров
Кстати, если вдруг
Например, «silver» короче своего числового эквивалента «#c0c0c0» на один символ, а «tan» короче «#d2b48c» на четыре.
Забавная книжка

Всё забываю рассказать. Купили эту книжку, когда в Финляндии с друзьями были. Продавалась в Хельсинки, в Музее современного искусства. Мне кажется, незаменима для развлечения маленьких детей, даром, что на финском.
Принцип простой — окрываешь страницу, в это время относительно друг друга движутся две пластины, открывая разные части изображений, формируя простенькую мультипликацию. Если я правильно насчитал, всего семь кадров. Пока открываешь страницу, анимация успевает смениться несколько раз.
Книга называется «Täyttä laukkaa!» («Во весь опор!», английское название — «Gallop!»), автор, насколько я понимаю — Rufus Butler Seder (Руфус Батлер Сидер). На каждом развороте справа картинка,
Уважаемые читатели, скажите пожалуйста, а на русском вы такие книги не видели?
Всякая мелочь одним постом-3
Немецкий физик Томас Зенкель собрал пилотируемый летательный аппарат с 16 пропеллерами от обычных игрушечных самолётов. Правда держится аппарат в воздухе всего от 10 до 30 минут, но это неплохо. В случае неполадок пилот может воспользоваться парашютом.
На «Хабре» недавно вышла статья сравнивающая лампы накаливания, люминесцентные и, появившиеся недавно, светодиодные бытовые лампы.
Подсказали два «пасхальных яйца» в Гугле, правда работают не во всех браузерах: Гугл делает «бочку» и Гугл перекосило.
Приказ Министерства связи и массовых коммуникаций Российской Федерации (Минкомсвязь России) от 3 мая 2011 г. N 92 г. Москва «Об определении видов технических средств и систем, подлежащих оснащению аппаратурой спутниковой навигации ГЛОНАСС или ГЛОНАСС/GPS» обязывает оснастить аппаратурой спутниковой навигации ГЛОНАСС или ГЛОНАСС/ГПС оборудование радиодоступа для беспроводной передачи данных. Точка доступа WiFi относится к оборудованию радиодоступа для беспроводной передачи данных. На что будет это похоже, а главное зачем это делать?
Полюбопытсвуйте на «Брачную газету», выпуск от 13 августа 1917 года. «Жениться желаетъ и ищетъ невѣсту съ большими средствами, не старше 35 лѣтъ…».
Очень хорошая статья «Почему мы верим во что попало и как с этим бороться». Мы предпочитаем «перебдеть, чем недобдеть», эволюция нас выучила тому, что безопаснее видеть закономерности даже там, где их нет, чем не увидеть там, где они есть.
Давно хотел написать на эту тему, а тут статья подвернулась — «Романтизм головного мозга», о том как искажают картину мира плохие фильмы и романы.
А это для программистов — приложение «D» стандарта Си 99 разрешает использование в качестве имён переменных и функций некоторые символы из Юникода. То есть уже 10 лет можно называть русскими (или арабскими) буквами переменные в Си. Чуть подробнее — у Анатолия Воробья в ЖЖ.
Л…ениногорск и голуби
Я сейчас вспоминаю, что в моём детстве кругом были голуби. В Лениногорске, в моём родном городе их было много, было даже несколько голубятен. Потом в стране многое произошло, держать голубей стало дорого, люди думали совсем о другом, я переехал в Казань и, если голубятни попадались, то все они были заброшенными, разрисованными плохенькими тегами.

После переезда из Москвы оказалось, что рядом с нашим домом стоит голубятня, а прямо напротив, через внутренний дворик, живёт хозяин. Его питомцев, которых он запускает с балкона, частенько видно из нашего окна.
Вид летящих белых голубей, напоминает мне
У̶д̶о̶б̶н̶о̶е̶ новое цитирование в блоге
Долго думал как упростить цитирование у себя в блоге, наконец придумал. Ещё остались
Сделал две вещи.
О последнем расскажу немного подробнее. Устроено всё несложно, разберём на примере выделения полужирным.

Чтобы звёздочки скопировались вместе с остальным текстом, они должны в этом тексте присутствовать. И они там есть. Вокруг слова, выделенного жирным находятся звёздочки, написанные нулевым шрифтом и прозрачным цветом. Поэтому в тексте и при выделении их не видно, но в буфер обмена они попадают. Так же устроено сохранение остальной разметки — вырезанных частей ссылок, исходных УРЛов картинок.
Юзерпики на «Яндекс.Фотках»
Вчера в Татарстане был выходной, поэтому пока мы ехали на машине за город, я сделал заготовку для хранения юзерпиков на «Яндекс.Фотках», а вечером её доделал. Сейчас все юзерпики в фоне переливаются туда в порядке запроса пользователем в закрытый альбом специального пользователя, которого я завёл.
До этого юзерпики по сложным правилам (с использование адреса почты из SRE OpenID или vCard, favatar, gravatar, pavatar, юзерпиков из «Ярушки» и ЖЖ и т. д.) получались для каждого человека в комментариях и загружались каждый раз с совершенно разношёрстных ресурсов.
Это было плохо по трём причинам.
Есть и четвёртая причина, не знаю насколько она значимая. Некоторые юзерпики (побайтно) повторяются, но так как браузер не знает, что с двух разных УРЛов грузится та же картинка, он грузит её два раза. У меня сейчас не так — я хеширую картинку и по хешу ищу совпадение. Есть вероятность совпадения хеша, но юзерпики
Сейчас юзерпики грузятся только в фоне, то есть
Первый снег в Казани
Первый снег выпал, то есть тот, который ляжет хорошим слоем и уже вряд ли растает до весны. Хорошее время, ещё не слишком холодно (−4˚C сейчас на улице), не гоняет никто (зимние шины есть не у всех, да и непривычно ещё), от этого тихо вокруг и очень комфортно на дороге.
Хочу поменять библиотеку для OpenID на сайте
Хочется поменять библиотеку, которую я использую для OpenID на сайте. Я сейчас использую Janrain OpenID, но она давно не обновлялась, генерирует варнинг и только с костылями и патчами работает с реализацией OpenID в ЖЖ
Посоветуйте
Требования — библиотека должна поддерживать OpenID 1.x и 2.x, SREG, предоставлять возможность хранить данные где я укажу (мне нужно на диске, а не в БД) и не должна использовать экзотические модули.
Какой точный расчёт

В почтовом ящике визитку нашёл на днях.
Запись в NTFS средствами Mac OS X
Как оказалось, использование этого небезопасно, используйте только если нет другого выхода.
Как известно пользователям «маков», Mac OS X умеет монтировать диски с файловой системой NTFS только на чтение. Обычно, чтобы писать скачивают сторонний драйвер NTFS — либо бесплатный
Ночью я случайно наткнулся на рецепт, позволяющий задействовать для записи на NTFS внутренний драйвер Mac OS X (рецепты немного различаются для «Снежного барса» и «Льва».
В сегодняшей утренней пробке я сделал программу, которая этот рецепт автоматизирует, листинг ниже, скачать можно с «Гитхаба» (запускать — через bash).
Плюсы следующие.
Добавлено позднее: Сергей Васильев предостерегает от использования родного драйвера для работы с NTFS: говорит, что можно разрушить файловую систему.
Листинг программы.
#!/bin/bash
ARCH=`uname -r | cut -d. -f1`
NMOUNT=/sbin/mount_ntfs
NLIBRA=/System/Library/Extensions/ntfs.kext/Contents/MacOS/ntfs
function usage {
cat <<USAGE
NTFS writing enabler (//bolknote.ru Nov 2011)
usage: $0 <action>
<action> - "enable" for enable NTFS write, "disable" otherwise.
USAGE
exit
}
function ntfsdisable {
if [ -e "${NMOUNT}_orig" ] && [[ -e "${NLIBRA}_orig" || $ARCH -eq 10 ]]; then
sudo /bin/mv "${NMOUNT}_orig" "$NMOUNT"
[ $ARCH -eq 11 ] && sudo mv "${NLIBRA}_orig" "$NLIBRA"
echo Disabled
else
echo "Error: cannot disable NTFS. Already disabled?"
fi
}
function ntfsenable {
ntfsenable$ARCH
echo Enabled
}
function ntfsenable10 {
echo -n 'Please enter your administrator password. '
sudo /bin/mv "$NMOUNT" "${NMOUNT}_orig"
/bin/cat << MNT | sudo /usr/bin/tee "$NMOUNT" >/dev/null
#!/bin/sh
/sbin/mount_ntfs_orig -o rw "\$@"
MNT
sudo /usr/sbin/chown root:wheel "$NMOUNT"
sudo /bin/chmod 755 "$NMOUNT"
}
function ntfsenable11 {
TEMP=`mktemp -d /tmp/ntfs$$.XXXXXX` || (
echo 'Cannot create temporary directory.'
exit
)
trap "/bin/rm -rf $TEMP" EXIT
echo -n 'Please wait. Downloading...'
curl -o "$TEMP/arch.zip" 'http://dl.dropbox.com/u/9349175/datahost-macdaily/NTFS_Enabler.zip' 2>&- 1>&- ||
curl -o "$TEMP/arch.zip" 'http://ntfs_enabler.chat.ru/NTFS_Enabler.zip' 2>&- 1>&- || (
echo 'Cannot download NTFS enabler bundle.'
exit
)
echo ' done'
unzip "$TEMP/arch.zip" -d "$TEMP" 2>&- 1>&-
[ `md5 "$TEMP/NTFS_Enabler/ntfs"` == a88031b3257379257086af017891f229 ] || (
echo "Error: invalid checksum NTFS enabler bundle"
exit
)
ntfsenable10
sudo /bin/mv "$NLIBRA" "${NLIBRA}_orig"
sudo /bin/mv "$TEMP/NTFS_Enabler/ntfs" "$NLIBRA"
sudo /usr/sbin/chown root:wheel "$NLIBRA"
sudo /bin/chmod 755 "$NLIBRA"
}
if [[ $ARCH -lt 10 || $ARCH -gt 11 ]]; then
echo 'Unknown Mac OS version (Snow Leopard or Lion required).'
exit
fi
[ "$1" == "" ] && usage
case "$1" in
enable)
ntfsenable
;;
disable)
ntfsdisable
;;
esac
Активность аудитории
Немного статистики.
В среднем на сайта в месяц бывает примерно 90 тысяч человек. Каждый месяц это число может быть меньше или больше. Например, в июне было 108 тысяч, а в августе — 77. Я недавно перелил большинство юзерпиков пользователей на «Яндекс.Фотки» и, делая скидку на людей с одинаковыми юзерпиками и именами (у меня для двух одинаковых имён сгенерируется один юзерпик), активная аудитория сайта порядка 1700 человек.
То есть более чем за 10 лет существования сайта (правда комментарии на сайте появились сильно позже) его посетила толпень народу, но комментрировали всего несколько тысяч. Похожая ситуация, судя по всему, у Экслера на его персональном блоге, в день его сайт посещает столько же народу, как меня за месяц, а комментариев в блоге — только несколько десятков к каждой записи.
Мне бы хотелось, чтобы читатели более активно высказывались, мне сейчас интереснее обсуждать мои мысли с читателями.
Причин низкой активности я вижу две:
Надо думать в сторону почты. Проблема с почтой, что её надо
Увы и подтверждение подлинности через письмо
Идея, которую я сейчас обдумываю такова: пользователю для первого подтверждения адреса почты (что будет доступно только для пользователей, которые авторизовались через OpenID), предлагается нажать на ссылку, сформированную специально для него.
Пользователь жмёт на ссылку, отсылает пустое письмо на этот адрес, с этого момента считается, что он подтвердил свой адрес. «Гмэйл» устроен таким образом, что на часть после плюса он внимания не обращает и эти письма будут попадать на ящик
Не слишком неудобно получается?
Картинка на чистом CSS-2

Я тут всё это время думал как дёшево улучшить свой конвертор картинок в чистый CSS и придумал.
Выкинул 89 79. Это уже неплохо, в сжатом (gzip) виде этот код занимает 19КБ, что всего в два с половиной раза больше, чем исходное изображение в PNG. Результат можно сильно улучшить, если отказаться от повтора цвета, но изображения с мелкими деталями (с текстом, например) пострадают.
Кстати говоря, логотип студии Лебедева при конвертации из PNG (6,7КБ) уменьшился до 1,6КБ 1,3КБ. Это уже реальная экономия, если бы не префиксы браузеров.
Отказ от радиального градиента в пользу линейного позволил мне кодировать целую строку изображения одной конструкцией, что, в свою очередь, позволило сильно экономить на повторяющихся байтах (кстати, можно попробовать группировать пиксели по вертикали и горизонтали, а потом выбирать лучший вариант).
Кстати этот раз «Опера», увы, не смогла показать картинку, так как, похоже, не поддерживает позиционирование для линейных градиентов.
Добавлено позднее: сделал оптимизацию, теперь конвертор делает два прогона: один просматривает пиксели по горизонтали, второй по вертикали. Выбирается тот, который даёт наименьший результат.
Ключи запуска те же.
<?
// ffccbb → fcb
// ff0000 → red
// abcdef → abcdef
function Bo_shortcolor($color) {
static $shortnames = array(
"c0c0c0" => "silver",
"808080" => "gray",
"800000" => "maroon",
"ff0000" => "red",
"800080" => "purple",
"008000" => "green",
"808000" => "olive",
"000080" => "navy",
"008080" => "teal",
"f0ffff" => "azure",
"f5f5dc" => "beige",
"ffe4c4" => "bisque",
"a52a2a" => "brown",
"ff7f50" => "coral",
"ffd700" => "gold",
"808080" => "gray",
"008000" => "green",
"808080" => "grey",
"4b0082" => "indigo",
"fffff0" => "ivory",
"f0e68c" => "khaki",
"faf0e6" => "linen",
"800000" => "maroon",
"000080" => "navy",
"808000" => "olive",
"ffa500" => "orange",
"da70d6" => "orchid",
"cd853f" => "peru",
"ffc0cb" => "pink",
"dda0dd" => "plum",
"800080" => "purple",
"ff0000" => "red",
"fa8072" => "salmon",
"a0522d" => "sienna",
"c0c0c0" => "silver",
"fffafa" => "snow",
"d2b48c" => "tan",
"008080" => "teal",
"ff6347" => "tomato",
"ee82ee" => "violet",
"f5deb3" => "wheat",
);
$c = strtolower($color);
if (isset($shortnames[$c])) {
return $shortnames[$c];
}
if ($c[0] == $c[1] && $c[2] == $c[3] && $c[4] == $c[5]) {
return '#' . $c[1] . $c[3] . $c[5];
}
return '#' . $c;
}
class Bo {
public function __get($num) {
return $num ? $num . 'px' : 0;
}
}
function Bo_convert_helper($im, $lim1, $lim2, $getpix, $dotmask, $z) {
$end = $lim1 - 1;
$dots = array();
for ($o1 = 0; $o1<$lim2; $o1++) {
$coll = array();
$prev = null;
$start = 0;
for ($o2 = 0; $o2<$lim1; $o2++) {
$pixel = $getpix($im, $o2, $o1);
if ($prev !== null && $prev !== $pixel || $o2 == $end) {
if ($prev !== null) {
$color = Bo_shortcolor(vsprintf('%02x%02x%02x', $prev));
$coll[] = "$color {$z->$start},$color {$z->$o2}";
}
if ($o2 == $end && $prev != $pixel) {
$color = Bo_shortcolor(vsprintf('%02x%02x%02x', $pixel));
$cell[] = "$color {$z->$o2}";
}
$start = $o2;
}
$prev = $pixel;
}
$dots[] = sprintf($dotmask, implode(',', $coll), $z->$o1);
}
return $dots;
}
function Bo_convert($filename, $prefix = '') {
$z = new Bo();
if (!file_exists($filename) && !is_readable($filename)) {
throw new Exception('File not found.');
}
$types = array(
IMAGETYPE_JPG => 'jpeg',
IMAGETYPE_PNG => 'png',
IMAGETYPE_GIF => 'gif',
);
$imagedata = @getimagesize($filename);
if (!is_array($imagedata) || !isset($imagedata[2]) || !isset($types[$imagedata[2]])) {
throw new Exception('Unknown image format');
}
$im = call_user_func("imagecreatefrom" . $types[$imagedata[2]], $filename);
$sw = $w = imagesx($im);
$sh = $h = imagesy($im);
$hfunc = create_function('$im, $x, $y', 'return imagecolorsforindex($im, imagecolorat($im, $x, $y));');
$hmask = "{$prefix}linear-gradient(0,%s) 0 %s";
$hdots = join(',', Bo_convert_helper($im, $w, $h, $hfunc, $hmask, $z));
$vfunc = create_function('$im, $y, $x', 'return imagecolorsforindex($im, imagecolorat($im, $x, $y));');
$vmask = "{$prefix}linear-gradient(90,%s) %s 0";
$vdots = join(',', Bo_convert_helper($im, $h, $w, $vfunc, $vmask, $z));
if (strlen($hdots) > strlen($vdots)) {
$dots = $vdots;
$sw = 1;
} else {
$dots = $hdots;
$sh = 1;
}
return <<<HTML
<head>
<title>$filename converted in background by Evgeny Stepanischev //bolknote.ru</title>
<style text="text/css">
div {
background: $dots;
background-repeat: no-repeat;
{$prefix}background-size: {$sw}px {$sh}px;
background-size: {$sw}px {$sh}px;
width: {$w}px; height: {$h}px;
}
</style>
<body>
<div></div>
</body>
HTML;
}
if ($_SERVER['argc'] < 2) {
echo <<<HELP
Image to background CSS convertor v2 by Evgeny Stepanischev. //bolknote.ru Nov 2011
Usage: {$_SERVER['argv'][0]} filename [prefix]
filename - image file name (PNG, JPEG or GIF)
prefix - your browser name (Opera, IE, FF, Safari, Chrome)
HELP;
exit;
}
$browsers = array(
'ie' => '-ms-',
'opera' => '-o-',
'safari' => '-webkit-',
'chrome' => '-webkit-',
'chromium' => '-webkit-',
'ff' => '-moz-',
'firefox' => '-moz-',
);
if (isset($_SERVER['argv'][2])) {
$type = strtolower($_SERVER['argv'][2]);
$prefix = isset($browsers[$type]) ? $browsers[$type] : '-' . $type . '-';
} else {
$prefix = '';
}
try {
echo Bo_convert($_SERVER['argv'][1], $prefix);
} catch (Exception $e) {
echo "Error: ", $e->getMessage(), "\n";
exit(1);
};Будущее формата CSS image

Мои эксперименты с картинками на чистом CSS внезапно дали следующий результат. Я взял для экспериментов логотип студии Лебедева в первом попавшемся цвете и перегнал его в CSS image при помощи своего конвертора, используя все префиксы браузеров: «webkit», «moz», «o» и «ms» («Конкерор» включать не стал, доля этого браузера исчезающе мала).
Оказалось, что если сжать получившийся файл (браузеры же понимают сжатый CSS), то получившийся файл будет размером меньше, чем та же картинка в формате PNG: 2,5КБ против 6,7. Файл с лого Студии я пропускал через онлайновый оптимизатор PNG (punypng), так что он вряд ли неоптимален.
Чем объяснить такой разврыв между форматом, предназначенном для эффективного сжатия графики, и неэффективным текстовым, с огромной избыточностью, сжатым обычным гзипом я не знаю.
Добавлено позднее: в комментариях картинку «утоптали» в 448 байт. Непонятно почему у меня такой плохой PNG получился.
Всякая мелочь одним постом-4
Сегодня суббота, значит время для всякой мелочи одним постом.
Всем разработчикам знакома ситуация «ладно, потом переделаем». Такая и подобные ей ситуации называются «техническим долгом». Не забывайте отдавать технические долги, аукнется, мало не покажется!
Быстро научиться разговаривать с татарским акцентом поможет смешная статья «Изучаем татарский вместе», которую я вынес из «Вконтакте».
В Живом Журнале krascat можно увидеть цветные фотографии Англии 1928 года Клиффорда Адамса. Фотографии сделаны по методу автохрома.
Алексей Кунгуров, более 10 лет занимающийся проведением избирательных компаний, рассказывает о мифах, связанных с выборами.
Новость на английском, но важная для всех, у кого есть смартфоны: компания Adobe прекращает разработку «Флеша» под мобильные платформы.
Про месть через 17 лет пишет mercylo в своём ЖЖ. Неприятная история — сына отомстившей, а скорее мелко подгадившей женщины
Как поставить Кобол на Мак
Пусть здесь полежит, чтобы я потом не искал.
Как поставить Кобол на Мак (при помощи «брю»):
curl http://www.sim-basis.de/open-cobol-1.1.tar.gz
tar xvfz open-cobol-1.1.tar.gz
cd open-cobol-1.1
brew install gmp
brew install berkeley-db
./configure --prefix=/usr/local/Cellar/open-cobol/1.1
make && make install
brew link open-cobolУдаление умершей ноды в кластере «Оракла»
Небольшой видеоурок по удалению умершей ноды из кластера «Оракла». В одном месте там требуется, чтобы на машине был своп не менее 500МБ, у нас не было (на машине 96ГБ памяти, зачем ей своп), мы его просто создали на диске в файле.
Заказали чай из Англии



Решили с женой попробовать заказать чай из Англии. Заказали месяц назад восемь сортов чая и один кофе
Очень рекомендую, если
Советские надписи на произодственной базе «Мелиты»
Сохранившиеся с советских времён таблички, надписи
Вот эти две — с заброшенной производственной базы фабрики «Мелита» (выпускает меховые изделия, существует


Зачем я учу языки программирования
Наверное многие заметили что время от времени я глубоко погружаюсь
Недавно я написал, что поставил себе Кобол на Мак, у многих возник вполне закономерный вопрос — зачем?
Тут дело несколько в ином. Я хочу увидеть как всё начиналось, Кобол — один из первых языков с читаемым англоязычным синтаксисом, с революционными идеями, которые теперь кажутся очень странными. Есть и ещё причина. На Коболе до сих написано больше всего кода (по крайней мере в банковской сфере и правительственной), специалисты по Коболу стоят очень дорого (просто потому что их очень мало), и мне показалось забавным увеличить свою стоимость как программиста изучением Кобола. Это не значит, что я хотел бы программировать на этом языке профессионально. Упаси боже.
Почему не следует расширять встроенные типы JavaScript
На Хабре хорошая статья — «
К выходу новой версии «Скайпа»
Скажите, а все те люди, которые установив новую версию, пишут в твиттер «вышел новый скайп, верните старый интерфейс» не догадываются, что можно скачать и поставить предыдущую или что?
Канадское слоговое письмо (ᓀᐦᐃᔭᐍᐏᐣ)
Случайно наткнулся на канадское слоговое письмо, это письменность, которой пользуются коренные народы Канады.
Оно есть в Юникоде, но не знаю как оно отобразится в вашей операционной системе.
Разработано совсем недавно (1840 год) и устроено очень остроумно. Запись, в основном, идёт слогами,
Согласная буква определяется формой, а гласная — поворотом. Например, «ᑭ» — «ки», «ᑫ» — «ке», «ᒥ» — «ми», «ᒣ» — «ме» и так далее. Из знаков пунктуации присутствует только точка («᙮»). Письменность довольно широко используется и в наши дни.
Многих привычных нам букв там нехватает, так что записать мои имя и фамилию очень тяжело, разве что подобрать
Для вызова экстренных служб наберите 3,14159265358979323846…

«Мегафон» выделился.
Как отключить автообновление «Скайпа» пятой версии
Так как многие не могут найти как выключить в «Винде» автообновления Skype 5, вот рецепт ниже.
Надо поместить в реестр следующую информацию (сохранить в файл disableskypeupdate.reg и запустить его):
REGEDIT4
[HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Skype\Phone]
"DisableVersionCheck"=dword:00000001Либо выполнить из командной строки вот это:
reg add HKLM\SOFTWARE\Policies\Skype\Phone /d DisableVersionCheck /t REG_DWORD /v 1Должно помочь. В четвёртой версии «Скайпа» есть галочка в настройках для запрета автообновлений. На «Маках» она есть и в пятой версии.
Как заменить табы, используя sed
Утилита командной строки sed (это потоковый редактор),
Я немного поэксперементировал, оказалось, что sed вполне воспринимает этот символ как таковой, а все «магические выражения» не работают. Поскольку «таб» имеет специальное значение в командной строке, ввести его можно либо через комбинацию Ctrl+V, tab, либо Ctrl+V, Ctrl+I. Во многих шеллах (например, в bash, ksh, sh) сработает специальный синтаксис с долларом, как в примере ниже.
Например, если вам надо заменить последовательные «табы» на один, то это может выглядеть вот так:
sed $'s/\t\t*/\t/g' sample.txt # именно \t\t*, а не \t+
# или
sed -E $'s/\t+/\t/g' sample.txt # в Линуксе ключ „-r“Если вы знаете как в sed можно работать с tab проще, расскажите, пожалуйста, в комментариях.
Интервью «Артджокеру»

Вышло интервью со мной в «Артджокере»: «Заноза в пятницу. Интервью с Евгением Степанищевым».
Всякая мелочь одним постом-5
Сейчас, конечно, многое собирается в Китае, но это ещё не значит, что КНР перестала производить, то что пренебрежительно называется «китайские подделки», разобрав однажды безымянный антенный усилитель вы вполне можете обнаружить, что «у ней внутре неонка».
Leon_sbp67 в своём ЖЖ справедливо критикует известный пропагандистский ролик «путинские сказки».
«Гугл мапс» обновил карты и внимательные пользователи нашли на них
Звездой интернета, думаю, неожиданно для себя стала некая Любовь Матвеевна за оригинальный подход к воспитанию собственных детей — она спрашивает совета на сайте «Ответы мейл.ру» по очень волнительным поводам. Например: «решила продать кровать дочери, пусть спит на полу» или «хочу за проступки сына наказывать дочь, а за проступки дочери — сына» или «хочу заставить сына ходить на физкультуру не в костюме „Рибок“, а в советском трико». Очень надеюсь, что это
Полезное — таблица символов Юникода, все символы в таблице (строится по мере прокрутки), заодно увидете, что поддерживает ваши система и браузер, а что нет.
«Здравствуй, мир» на Коболе
Я
Вот так выглядит моя первая программа на Коболе:
000100*Моя первая программа на Коболе
000200 IDENTIFICATION DIVISION.
000300 PROGRAM-ID. hw.
000400 AUTHOR. Evgeny Stepanischev
000500 PROCEDURE DIVISION.
000600 DISPLAY "Привет, мир!".
000700 STOP RUN.Первые шесть символов каждой строки — её номер, как легко догадаться. В современном Коболе их можно опустить (OpenCobol поддерживает этот синтаксис с ключом
В старом Коболе очень жёсткий порядок всего и вся. Мало того, что секции программы должны быть описано в строгом порядке, так ещё и столбец тоже имеет значение! То есть Кобол строго следит за отступами. Например, мой код с DISPLAY и STOP RUN начинается
Язык очень многословный и имеет целую тучу зарезервированных слов, некоторые из которых весьма доставляют:
bolk@Bolk ~/Projects/Cobol $ cobc --list-reserved | wc -l
530
bolk@Bolk ~/Projects/Cobol $ cobc --list-reserved | egrep '[[:digit:]]' | egrep -v 'UTF|UCS|FLOAT'
COMP-1 (Y)
COMP-2 (Y)
COMP-3 (Y)
COMP-4 (Y)
COMP-5 (Y)
COMPUTATIONAL-1 (Y)
COMPUTATIONAL-2 (Y)
COMPUTATIONAL-3 (Y)
COMPUTATIONAL-4 (Y)
COMPUTATIONAL-5 (Y)
STANDARD-1 (Y)
STANDARD-2 (Y)
SUB-QUEUE-1 (N)
SUB-QUEUE-2 (N)
SUB-QUEUE-3 (N)Как я буду учить это всё великолепие, пока не знаю, не уверен, что интерес к языку у меня настолько глубок. Впрочем, может оказаться, что бо́льшая часть из указанных 530 зарезервированных слов нужны в жизни очень редко. А ещё, бегло пробежавшись по документации, я нашёл большое количество синонимов. За примерами далеко ходить не надо,
«Двести баксов»
Очень не люблю, когда люди указывают цены в долларах. «Я тут продуктов купил на 235 баксов». Сколько это вообще? Как я должен пересчитать? Я вот сейчас специально зашёл на РБК, чтобы посмотреть сколько там курс доллара, в последний раз я его смотрел около года назад, когда в Египет ездили отдыхать с женой.
Я помню времена, когда буквально всё каждый день дорожало на десятки рублей, а свой первый деловой костюм для работы я купил за сто долларов прямо в магазине, то есть в России (это конец девяностых был) брали доллары. О зарплате договаривались только в долларах, иначе через месяц можно было получить ощутимо меньше денег в плане покупательной способности.
Вот тогда был смысл говорить цену в долларах, так как цены в рублях были бессмысленны, предыдущий опыт покупки на рубли не позволял понять что на них можно купить завтра.
Сегодня упоминание цен в долларах выглядит анахронизмом, только если вы действительно не платили долларами и вам лень цену на рубли пересчитать.
Археологи будущего о сигаретах

В Таллине, где мы были летом, посещали экскурсию по Бастионным ходам. Там в конце экспозиции показывали каким может стать Таллин в будущем. Один из стендов по этой теме показывал фантазии на тему какие объяснения могли бы дать археологи будущего о вещах, которыми мы пользуемся в наше время.
Антитабачную тему одной из таких фантазий я, конечно же, не смог обойти вниманием и сделал кадр.
Игорь Растеряев
Меня тут спросили какую я музыку слушаю. Я иногда клипы сюда вставляю или слова песен. Это всё то, что мне нравится. Недавно увидел Игоря Растеряева, хорошие слова, гармошка и «клипы», снятые на сотовый телефон. Мне очень нравится, есть за этим
Автор слов и музыки — сам Игорь.
Какой язык программирования изучать на перспективу
Меня тут недавно спросили — какой язык программирования следует изучить на перспективу. Я ответил в том духе, что никаких формальных признаков того, что язык будет перспективен лет через пять, не существует и до сих пор думаю, что прав. В самом деле, если взять «моду» на языки за последние десять лет, видно, что их успех определяется подводными течениями, которые со стороны увидеть трудно, компании неисповедимы, могут «выстрелить»
Правда потом, по пути домой я задумался над этим более глубоко и теперь считаю, что популярность должны набирать языки, в которых легко, на уровне языка, делается параллелизация. Дома у меня меня ремонт сейчас
Над цифрами выше трудятся уже только оверклокеры, заливая штаны жидким азотом. Гонка частот уже, кажется, остановлена, началась гонка за количество ядер. Недавно был выпущен первый смартфон с четырьмя процессорами, а рабочая станция «Мак Про» поставляется в топовой конфигурацией с 12 процессорами. Сегодня на «Хабре» появилась новость о процессоре GA144, который будет продаваться за шестьсот рублей. У него 144 ядра.
Не говоря уже о GPU, у которых количество ядер приближается к тысячам.
Если взять
Причём «легко» не обязательно даже так, как это сделано в «Гоу» (хотя и желательно) — отдельной конструкцией языка (go), нет нужды сводить к этому всю идеологию языка, как в «Эрланге», просто чтобы это делалось, в тривиальных случаях,
Например, на «Пайтоне»
@fork
def sort(arr):
arr.sort()
return arr
# тут функция начала фоном работать
result = sort(somearray)
… много кода …
# а тут уже доступны результаты, если недоступны, то будем ждать
print([el for el in result if el])Да, это не особо эффективно, нас уже приучили разбрасываться памятью, но ещё не приучили с лёгкостью разбрасываться ядрами, ничего привыкнем, когда их станет, как грязи.
Пока, наверное, верится с трудом. Но мой первый
Многозадачность в «Гоу»
В прошлой своей записи я упомянул многозадачность в «Гоу», а сейчас вспомнил, что я ни разу не показывал как же она там выглядит с точки зрения простого программиста. Покажу на примере.
Предположим, нам нужно вычислить
package main
import (
"io"
"os"
"crypto/sha512"
"encoding/hex"
"runtime"
"strconv"
)
func main () {
ch := make(chan string)
N := 3
runtime.GOMAXPROCS(N)
for i := 0; i<N; i++ {
go func (name string, num int, ch chan string) {
if f, err := os.OpenFile(name, os.O_RDONLY, 0666); err == nil {
defer f.Close()
h := sha512.New()
io.Copy(h, f)
ch <- strconv.Itoa(num) + ". " + hex.EncodeToString(h.Sum())
} else {
panic("Cannot open file")
}
}(os.Args[0], i, ch)
}
for ; N > 0; N-- {
print(<-ch, "\n")
}
}Что здесь происходит.
Первая строка объявляет имя модуля, для основного модуля программы это имя должно быть «main», эта конструкция скажет компилятору, что именно тут находится входная точка нашей программы. На первый взгляд кажется, что в основном модуле можно было бы просто не указывать имя, но язык придерживается хорошего принципа «явное лучше неявного», чем он мне очень симпатичен.
Дальше, очевидно, подключаются модули, в языке базовых функций почти нет, поэтому даже для такой небольшой программы мне понадобилось шесть модулей: «io» для копирования данных из одного потока в другой, «os» для работы с файлом, «crypto/sha512» для хеширования, «encoding/hex» для кодирования получившейся
Функция main — входная точка основного модуля программы, именно она (как в «Си») вызывается в самом начале.
Далее я создаю (make) небуферизированный «канал» и объявляю, что по нему будут идти строки, конструкция «:=» многим напоминает Паскаль, но отношения к нему не имеет, это синтаксический сахар для создания локальной переменной. «Канал» — это хорошее, говорящее название, хорошо отображающее суть, это действительно канал общения
В цикле создаются и сразу запускаются в фоне (конструкцией «go») на выполнение N
Внутри
Цикл не ждёт выполнения
Дальше идёт второй цикл, где N раз запускается команда на чтение из канала („… <- ch»).
Чтобы убедиться, что
У такой лёгкости использования есть свои ограничения, но об этом
Первый язык программирования высокого уровня — Планкалкюль ★
Планкалкюль (Plankalkül) — первый в мире язык программирования высокого уровня, разработанный немецким инженером Конрадом Цузе между 1942 и 1946 годами для его компьютера «Z4».
Шла Вторая Мировая Война, Цузе работал в отрыве от учёных других стран, совершенно самостоятельно. За это время он создал не только язык программирования, но и написал на нём 49 страниц программ для оценки шахматных позиций. Полностью его работа была опубликована много позже, в 1972.
Только в 1957 году (работы были начаты в 1954) появился Фортран — язык, который большинство считает первым языком высокого уровня.
«Z4» был
Диалект, который реализуется, назван
Язык довольно богатый, на мой взгляд, для сороковых
Все переменные делятся на четыре вида.
- Variablen (Входные переменные) — это входные переменные подпрограмм, доступны только для чтения начинаются с буквы V и номера;
- Zwischenwert (Значения промежуточные), доступны для чтения и записи, предназначены для хранения промежуточных вычисляемых значения, начинаются с Z и номера;
- Resultatwerte (Результат) — в этих переменных возвращается результат вычисления, начинаются с R и номера;
- Indizes (Индексы) — переменные цикла (аналога for), начинаются с i, дальше может быть номер, номер необходим для организации вложенных циклов.
Доступны три типа переменных. Несмотря на то, что «Z4» умел оперировать числами с плавающей точкой, интерпретатор этого не умеет.
Для целого неотрицательного указывается размерность в битах. Есть две формы записи 0 — один бит, n.0 — «n» бит, например, 8.0 — один байт (8 бит). Кортеж указывается в скобках, например (3.0, 4.0) — это две переменные в три и четыре бита, кортеж должен иметь более одного элемента. Массив записывается через точку, к примеру: 4.5.0 — массив из четырёх элементов по пять бит в каждом, 32.(0, 8.0, 16.0) — 32 кортежа, в каждом из которых три переменных: один бит, восемь и шестнадцать.
«Планкалкюль» явно можно сильно упростить по синтаксису, но современный диалект почти в точности копирует ту запись, которую использовал Цузе, я полагаю, что такой синтаксис родился
Одна из них вычисляет указанное (по порядку) число Фибоначчи:
P0 FactEvgenyStepanischev (V0[:4.0]) => (R0[:10.0])
(0, 1) => (Z0[:10.0], Z1[:10.0])
W1 (V0[:4.0]) [
i > 0 -> (Z0[:10.0] + Z1[:10.0], Z1[:10.0] - Z0[:10.0]) => (Z1[:10.0], Z0[:10.0])
]
Z1[:10.0] => R0[:10.0]
ENDЗапускать следует так: открываете страницу с интерпретатором, копируете в окно мою программу, нажимаете «Compile», открывается отдельное окно
Подпрограммы в языке начинаются с символа P и уникального номера, дальше идёт имя, по которому её можно будет вызвать, у меня подпрограмма называется FactEvgenyStepanischev, заканчивается подпрограмма ключевым словом END (в оригинальном Планкалкюле его не было).
У подпрограммы описываются принимаемые и возвращаемые значения, у меня используется одна переменная на вход, размерностью 4 бита и одна на выход, размерность в 10. Первой строкой присваиваются значения «ноль» и «один» промежуточным переменным Z0 и Z1. Тип переменных приходится указывать при каждом их использовании, преобразовать переменную в другой тип нельзя.
Ниже идёт цикл for (W1), поскольку номер переменной цикла я не указал (указывается в первых квадратных скобках, которые тут опущены), используется переменная цикла i, без номера. В круглых скобках указывается количество повторений, а в последующих квадратных — тело цикла. Подробности можно найти в описании.
Операция «стрелка» (->) — условная конструкция, часть справа будет выполнена, если выражение слева истинно. В диалекте работают только самые простые выражения, например цикл туда подставить можно, но кнопка «Run» в аплете у меня не появилась, поэтому я ограничился присваиванием внутри цикла.
Я тут использовал комплексное присваивание, которое хорошо знакомо тем, кто использует Перл, Пайтон или ПХП, но работает оно иначе — присваивания выполняются последовательно, слева направо, поэтому я не могу ограничиться,
(Z0[:10.0] + Z1[:10.0], Z1[:10.0]) => (Z1[:10.0], Z0[:10.0])результат будет не тот, который ожидается.
В конце я присваиваю промежуточное значение результирующему значению подпрограммы.
Кроме этого в языке почти ничего и нет. Обращение к элементам массива, вызов функции и цикл while описывать отдельно смысла не имеет, они выглядят достаточно естественно в рамках этого синтаксиса. Все операции, поддерживаемые языком (их немного — логические операции, битовые операции и четыре арифметические действия) выглядят привычно.
Всякая мелочь одним постом-6
Интересное видео — что будет с пиявкой если её поместить в воду, оставшуюся от кальяна. Задумайтесь, чем дышат курящие кальян.
Появился прибор «СПИДометр», использующий «неинвазивный, скрининговый метод диагностики», чтобы определять наличие СПИДа. Некоторые люди совсем потеряли совесть. В пользовательском соглашении написано: «использование Пользователем сервисов сайта не налагает на Администрацию сайта
Другое видео — диктор «РенТВ», читая текст про Барака Обаму, показывает в эфире средний палец. Что это было?
Для желающих понастальгировать девятого декабря выходит ремейк знаменитой игры для «Спектрума», главным героем которой является Диззи. Это ремейк шестой части, которая называется «Dizzy. Prince of The YolkFolk», игра будет выпущена под «Андроид», «Айпад» и «Айфон». Я куплю.
«Старое радио» — уникальный проект по оцифровке старых передач, аудиоплёнок и пластинок. В ЖЖ «Оттенки серого» великолепный рассказ об авторе этого проекта.
Будущее (а может уже и прошлое, кто знает) шпионажа — использование датчиков смартфона, лежащего рядом с ноутбуком или клавиатурой компьютера, для угадывания что печатает пользователь. Для английских фраз вероятность правильного распознавания с использованием только гироскопа и акселерометра (без микрофона, который может улучшить картину) — 80%.
С Днём рождения, жена!

Любимая жена, поздравляю тебя с Днём рождения! Главное — вот этот замечательный букет, который я сфотографировал, а под ним лежит незначительный, небольшой подарок, но надеюсь он тебе понравится!
Инте̲рне̲т
Сегодня впервые на встрече услышал как слово «интернет» произнесли через два «е». Насколько я знаю, считается, что из слов исчезает «э» (там где в написании стоит «е»), когда слово уже прочно вошло в язык. Возможно, человек, использовавший там «е» произностит «интернет» нарочито так, чтобы продемонстрировать — он считает, что слово уже «обрусело».
Я не знаю, существует ли в реальности такая тенденция (с буквами «э» и «е»), но если и существует, то, мне кажется, она исчезает. Я нередко сталкивался с тем, что слова «тест», «секс», «энергия», «бактерия» и прочие некоторые люди старшего поколения произносят через «е», тогда как в моём поколении и младше я вообще не наблюдаю использование такого произношения, там исключительно «э».
Может быть это отражение другой тенденции языка, русский становится более «твёрдым». Ещё моя бабушка говорила «четьверьгь», «дожжь», смягчая и некоторые другие слова. Насколько я знаю, так раньше говорили в Москве, а мода на «твёрдость» пришла из Питера, когда он был столицей. Сейчас «четьверьгь» я уже не слышу, а «дожжь» всё ещё иногда проскакивает.
