Моя Казань (видео)
Видео к торжественной передаче флага Международной федерации студенческого спорта от Китая России, которая состоялась в рамках церемонии закрытия Всемирных летних студенческих игр 2011 года. Мэр Казани Ильсур Метшин получил флаг из рук мэра Шеньженя (в 2013 году Казань принимает у себя «Универсиаду»).
Ночевал в Авиагородке
Если вы, как я вчера, опоздаете на самолёт и вам придётся искать ночлег в Домодедове, рекомендую — Галина Васильевна (+7 916 626 64 69). За две тысячи рублей (если вас двое — по 1500 с каждого) разместит вас у себя в квартире в Авиагородке на улице Туполева. Квартира чистая, правда с советским ремонтом, комната отдельная. Гостиница в аэропорту, для сравнения, стоит 6700 за обычный номер.
Такси до места (и обратно — в аэропорт) стоит 200 рублей, ехать — минут
Авиагородок (бывший посёлок
Кстати, забавно — водитель такси, который вёз меня оттуда спросил «в аэропорт куда?».
ЭЦП
На конференции «Осенний
ЭЦП (электронная цифровая подпись) сейчас, фактически, используется не для того, для чего была придумана. Её назначение — кратковременное подтверждение подлинности переданного документа. К примеру, я получил письмо и мне нужно убедиться, что оно действительно пришло именно от того адресата, которые указан в поле отправителя. Стандартный протокол обмена письмами мне этой уверенности не даёт. А ЭЦП — пожалуйста.
Я открываю письмо, по подлинности ЭЦП убеждаюсь, что всё в порядке, дальше ЭЦП мне не нужна.
В электронных документооборотах не так. Там ЭЦП используется для подтверждения подлинности документа в долгосрочном периоде — годы, десятки лет, в перспективе, возможно, сотни (если речь идёт о долгосрочных договорах между государствами, например).
Чтобы не было возможности подделать документ, изменить его содержимое, применяется ЭЦП. Как правило, доступ к хранилищу, где он размещается, имеют сотни людей, причём многие из них — на запись. С течением времени, количество людей, имевших теоритическую возможность подмены документа, увеличивается —
Но. Надёжность ЭЦП, фактически, основана на сложности математических задач, заложенных в алгоритм электронной цифровой подписи. Эти задачи выбраны таким образом, чтобы подделка подписи требовала огромных вычислительных ресурсов. Последнее с успехом может быть заменено использованием более скромных ресурсов
В чём проблема. Мы все с вами наблюдаем современные темпы развития техники, пройдёт пара лет
В долгосрочной перспективе использования ЭЦП это проблема — при хранении документов десятки и сотни лет, риск подмены документов, особенно важных, где игра стоит свеч возрастает многократно.
Конечно эту проблему следует смотреть и в разрезе обеспечения доступа к самому хранилищу, но то, что нужны
С физическими (например, бумажными) носителями несколько проще — подделку нужно изготовить заранее, если упустить шанс, то его уже больше не представится. Насколько я знаю, пока нет технологии, которая могла бы «состарить» чернила, бумагу, а так же начеркать загогулину обычной подписи, так чтобы эксперты не смогли её отличить от подлинных, оставленных на других документах. А в её отсутствие, подделка вряд ли возможна.
Можно увеличивать длину ключа, (фантазирую) применять ключи, занимающие десятки килобайт. Шифрование будет крайне медленным, но для важных документов можно и потерпеть. Но вот вопрос — если через двадцать лет появятся квантовые компьютеры, которым такая длина ключей «на один зуб», что будем делать? Как видно, простого выхода из ситуации не существует.
Sublime Text 2 (совет)
Поставил по совету коллег с прежней работы себе текстовый редактор «Sublime Text 2», всё хорошо, одна проблема — файлы с кодировкой CP1251 он открывает неправильно, приходится переоткрывать через «File → Reopen with Encoding → Cyrillic (Windows 1251)».
Покопался по настройкам, нашёл выход. Нужно зайти в настройки (на «Маке», как обычно — ⌘+,) и добавить между фигурными скобками вот такую настройку: «»fallback_encoding«: „Cyrillic (Windows 1251)“». Мой файл настроек сейчас почти пустой и выглядит вот так:
// Settings in here override those in "Default/Base File.sublime-settings", and
// are overridden in turn by file type specific settings. Place your settings
// here, to ensure they're preserved when upgrading.
{
"fallback_encoding": "Cyrillic (Windows 1251)"
}
Тач-интерфейс
Я тут задумался над русским аналогом
Записались с женой в спортзал

Ура! Записались с женой в спортзал на 15 месяцев (абонемент на год + три месяца в подарок). Спасибо жене — нашла и выбрала программу для нас, будем ходить. Записались
Если промотать до 15 октября, примерно до 18:50, можно нас там увидеть на нескольких кадрах — слева инстуктор, потом я, в центре жена, а дальше ещё одна пара, которой тоже показывали залы.
Расширение для «Альфреда» для перевода текста
Решил перейти на «Альфред» — замену «Спотлайта» на «Маке». Мне его Вадим Макеев мельком показал на конференции в Самаре.
Главная причина — под «Альфред» легко писать расширения. Писать их можно на обычном Баше, Экшнскрипте или в Автоматоре.
Для этого я купил «Паверпак» (£12), который позволяет ставить и использовать расширения (сам «Альфред» бесплатный) и «Граул» ($1,99), позволяющий создавать собственные всплывающие нотификации в системе.
Скачать расширение можно по следующей ссылке:

Перевод делается через сервис «Яндекса». Результат показывается через «Граул».
Поставить расширение проще простого — в закладке «Extensions» есть поле, где написано «Drop to install», туда надо перетащить скачанное расширение и всё, дело сделано.
Ещё раз про 28:00
Например, на сайте «Мосгортранса» висит расписание автобусов (Дофин, спасибо за ссылку!), где, в частности, написано, что автобус №115 отправляется «от к/ст. “Марьино”
А вот этот снимок я сделал, когда прилетел в Казань пару месяцев назад, это расписание справочной авиакомпании «Татарстан» в казанском аэропорту:

CSS hack for FireFox 6
Меня тут попросили сделать
x::-moz-progress-bar, body {
background: orange; /* FF 6.0+ */
}
@-moz-document regexp(".*") {
body {
background: orange; /* FF 6.0+ */
}
}Проверено на Firefox 6.0 и 7.0.1.
TOEFL
Сегодня прошёл письменный тест TOEFL
Заметил две вещи: мне сложно определять ошибки в фразе, я привык отталкиваться от того, что фраза написана без ошибок, и мне тяжело воспринимать американскую речь, которая была в тесте. Речь на английском ведущего нашего теста я воспринимал естественно и не задумываясь. Возможно, конечно, что он специально выбирал выражения попроще, но думаю, что всё дело в том, что она была просто «чистой» — он не склеивал слова и не «жевал» окончания.
Оптимизиция шрифтов с «Гугл фонт АПИ»
Благодаря Мицголу невозбранно узнал о существовании у «Гугл фонт АПИ» параметра «text», где можно перечислить буквы, которые вы будете использовать в шрифте. Это сильно сокращает размер скачиваемого шрифта. Напоминаю, «Гугл фонт АПИ» — это специальное АПИ для браузеров, позволяющее использовать свободные шрифты из коллекции Гугла. Шрифты подготавливаются автоматически, в зависимости от того, что поддерживает браузер:
bolk@Bolk ~/Projects/Ttt/exp (master) $ wget -O - --user-agent='Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)' http://fonts.googleapis.com/css?family=Rock+Salt 2>&-
@font-face {
font-family: 'Rock Salt';
font-style: normal;
font-weight: normal;
src: url('http://themes.googleusercontent.com/static/fonts/rocksalt/v1/Q94aHXFHGip10K5uxi1jOPY6323mHUZFJMgTvxaG2iE.eot');
src: local('Rock Salt'), local('RockSalt'), url('http://themes.googleusercontent.com/static/fonts/rocksalt/v1/Q94aHXFHGip10K5uxi1jOD8E0i7KZn-EPnyo3HZu7kw.woff') format('woff');
}
bolk@Bolk ~/Projects/Ttt/exp (master) $ wget -O - --user-agent='Opera/9.00 (Windows NT 5.1; U; en)' http://fonts.googleapis.com/css?family=Rock+Salt 2>&-
@font-face {
font-family: 'Rock Salt';
font-style: normal;
font-weight: normal;
src: local('Rock Salt'), local('RockSalt'), url('http://themes.googleusercontent.com/static/fonts/rocksalt/v1/Q94aHXFHGip10K5uxi1jOKCWcynf_cDxXwCLxiixG1c.ttf') format('truetype');
}
bolk@Bolk ~/Projects/Ttt/exp (master) $ wget -O - --user-agent='Mozilla/5.0 (X11; Linux i686; rv:6.0) Gecko/20100101 Firefox/6.0' http://fonts.googleapis.com/css?family=Rock+Salt 2>&-
@font-face {
font-family: 'Rock Salt';
font-style: normal;
font-weight: normal;
src: local('Rock Salt'), local('RockSalt'), url('http://themes.googleusercontent.com/static/fonts/rocksalt/v1/Q94aHXFHGip10K5uxi1jOD8E0i7KZn-EPnyo3HZu7kw.woff') format('woff');
}Для примера. Пусть у меня выбранный шрифт используется в двух фразах: «NEWS» и «ABOUT US», тогда строка запроса для этих двух заголовков будет выглядеть следующим образом (повторяющиеся буквы опущены, «%20» — это пробел):
http://fonts.googleapis.com/css?family=Rock+Salt&text=%20NEWSABOUTЕсли сравнить размер шрифта без указания используемых букв и с ними, то разница выйдет более чем существенная:
bolk@Bolk ~/Projects/Ttt/exp (master) $ wget -O- `wget -O- 'http://fonts.googleapis.com/css?family=Rock+Salt' 2>&- | awk -F' '/http/{print $6}'` 2>&- | wc -c
125136
bolk@Bolk ~/Projects/Ttt/exp (master) $ wget -O- `wget -O- 'http://fonts.googleapis.com/css?family=Rock+Salt&text=%20NEWSABOUT' 2>&- | awk -F' '/http/{print $6}'` 2>&- | wc -c
6801Как видно, размер файла сократился более чем в 18 раз!
Казань ✈ Москва ✈ Казань
19 и 20 октября буду в Москве, на отраслевой конференции «Осенний
Признаюсь честно, я — робот

Не смог я пройти тест Тьюринга.
Санскрит
Спасибо Илье Бирману за ссылку на потрясающую лекцию академика Андрея Анатольевича Зализняка про санскрит «О языке древней Индии». Я, кстати, пребывал в заблуждении, что санскрит — прадедушка большинства европейских языков, тех что называют индоевропейскими. Оказывается, нет:
И сейчас прекрасно известно, что
всё-таки санскрит — это просто одна из ветвей индоевропейских языков; он не более праязык, чем любой другой известный нам язык, а настоящий праязык индоевропейцев в подлинном своем виде ни в каких письменных документах не сохранился. И вообще этот праязык на несколько тысяч лет глубже во времени, чем любой самый древний письменный памятник, которым мы располагаем. А все индоевропейские языки к моменту, от которого до нас доходят какие бы то ни было памятники, уже прошли даже не несколько веков, а несколько тысячелетий развития от общего праязыка.
Лекция действительно интересная, я насладился хорошим литературным языком, которым она изложена и провёл много параллелей со своим прежним опытом. Вот истоки восточной витееватости, последствия разделения литературного языка и языка плебеев:
С другой стороны, потребность выражаться изысканно ведет к тому, что в хорошем классическом санскрите корову никто коровой не назовет. А назовут ее обязательно
какой-нибудь «пестроходящей», «молочноглазой» и т. д. Змея никогда не будет названа змеей, хотя для этого есть прекрасное простое слово, родственное русскому. Но это слово простецкое, низкое, в хорошей литературе оно употребляться не должно, это был бы низкий плебейский стиль.
Вот почему в литовском (который очень близок к санскриту) часто слышно окончание
Так вот, литовский занял бы первое место среди живых языков по сохранности древнего числа слогов. Он сохранил окончание именительного падежа -ас. Ростов будет
по-литовски Ростовас. Почему? Потому что это -ас так же необходимо в современном литовском, как и три тысячи лет назад в санскрите.
Теория относительности
Сейчас много разговоров о том, что в одном из экспериментов скорость нейтирино оказалась выше скорости света. Якобы, это ставит под сомнение теорию относительности Эйнштейна.
Чтобы вспомнить что такое теория относительности, рекомендую
Поддержка MJPEG в «Опере»
Как я уже писал, «Опера» иначе показывает MJPEG, не как остальные браузеры. Если открыть
А мне хочется смотреть
Вдохновившись библиотекой добавляющей нативную поддержку APNG в браузер, я подумал, что я ничем не хуже и смогу добавить поддержку MJPEG в «Оперу». Получился небольшой userjs, который я, естественно, выложил на «Гитхаб».
Идея такая — находим картинку во всех тегах IMG, у которой расширение «mjpg». Через XHR получаем с сервера видеопоток, копим кадр, подменяем найденную картинку и так далее.
Работает начиная с 12 версии браузера, которая ещё не вышла (кстати, в позавчерашней сборке сломали userjs напрочь) — в предыдущих версиях XHR слабоват по возможностям для этого.
Больше всего я бился с декодированием бинарных данных. Последняя версия «Оперы» поддерживает тип ответа arraybuffer (а вот blob не поддерживается), но если его выбрать, то данные в цикле
Кстати, быстрее всего у меня получилось декодировать не циклом, а регулярными выражениями, дальше тормозит уже не мой код, а способ получения отдельного кадра — каждый раз я соединяюсь с сервером заново. Можно бы накапливать кадры пачкой и потом их сбрасывать, но у меня нет задачи смотреть трансляции футбола, у меня дом, который не бегает и полученной скорости мне вполне хватает
В общем, получился довольно небольшой код — 94 строки. Если вы не в курсе как устанавливаются скрипты userjs, то это очень просто. В интернете есть много инструкций на эту тему. Только напоминаю, что «Опера» нужна двенадцатая, причём в сборке за седьмое октября userjs сломаны.Посмотреть код.
// ==UserScript==
// @name MJPEG+Opera - Add to Opera MJPEG support
// @author Evgeny Stepanischev aka Bolk
// @version 1.00
// @namespace /files/opera-mjpeg.js
// @modified 2011-10-09
// @include *
// ==/UserScript==
opera.addEventListener('BeforeEvent.DOMContentLoaded', function() {
if (opera.version() < 12) return;
var BolkMJpeg = function (url, img) {
var req = new XMLHttpRequest();
img.src = 'about:blank'; // Сброс картинки, чтобы прекратить передачу
// Асинхронно забираем кадр при помощи XHR, нам придёт видеопоток
var start = function (url) {
req.open("GET", url, true);
// Свежепридуманный хитрый хак, позволяет получить данные в UCS-2
req.overrideMimeType('image/jpeg');
req.send(null);
}
// Хитрыми путями восстанавливаем порядок байт в reponse, там сейчас UCS-2,
// получаем просто последовательность байт
var reqbytes = function (n, l) {
return escape(req.response.substr(n, l)).
replace(/([^%]|%[^u].|%u....)/g, '<$1>').
replace(/<%u(..)(..)>/g, '%$2%$1').
replace(/<%(..)>/g, '%$1%00').
replace(/<(.)>/g, '$1%00');
}
// заменяем картинку на бинарные данные
var draw = function (bin) {
img.src = 'data:image/jpeg,' + bin;
}
// На изменение состояние входных данных собираем по частям JPEG
req.onreadystatechange = function () {
// состояние «3» — данные пошли, но ещё не кончились
if (req.readyState === 3) {
var hnd = setInterval(function () {
// по заголовку получаем размер данных
var header = unescape(reqbytes(0, 300)).toLowerCase();
var idx = header.indexOf('content-length:');
if (idx > -1) {
// 15 — длина заголовка
var len = parseInt(header.substr(idx + 15), 10);
var headend = header.indexOf("\r\n\r\n");
// дожидаемся конца заголовка
if (headend > -1) {
var resp = reqbytes(0, len);
// умножаем всё на три, так как reqbytes даёт esc-последовательность
// вида %XX%XX…
len *= 3;
headend = (headend + 4) * 3;
// если собрали весь JPEG, обрываем соединение
// и начинаем новый цикл. Мы могли бы собирать кадры и дальше, но
// это съест всю память со временем
if (resp.length >= len + headend) {
req.abort();
resp = resp.substr(headend, len);
draw(resp);
clearInterval(hnd);
start(url);
}
}
}
}, 100);
}
}
start(url);
};
// ищем картинку, у которой расширение mjpg
var imgs = document.getElementsByTagName('IMG');
for (var i = 0, len = imgs.length; i<len; i++) {
if (/\.mjpg$/.test(imgs[i].src)) {
BolkMJpeg(imgs[i].src, imgs[i]);
break;
}
}
}, true);
Невероятно плохо

Кажется я никогда не сталкивался с тем, чтобы отдельностоящее слово «невероятно» использовали для отрицательной оценки. «Невероятно», во всех случаях употребления без богатой эмоциональной обвязки вокруг однозначно воспринимается мной как восхищение.
Фотография сделана в третьем роддом города Казани, с одного из плакатов около
MJPEG, MPNG, MGIF, MSVG
Я вчера показывал вам «телевизор» про фестиваль в Самаре. Сделано очень просто — уменьшил все сделанные там снимки до 66×44 и сконвертировал их в анимированный ГИФ. Мелковато, конечно, но что делать — ГИФ
У JPEG есть свой формат анимации, если так можно выразиться, а точнее — скорее простенький формат видео, так как формат анимации, в моём представлении, помимо кадров должен содержать себе
Мне давно хотелось посмотреть что у этого формата внутри, сегодня наконец посмотрел. Всё оказалось крайне просто.
В данном случае, MJPEG — формат стримминга (потоковой подачи) видео. Собственно, это даже не формат, а простое соединение JPEG и специального заголовка
Смысл этого заголовка — содержимое которое пришло раньше заменяется тем, что пришло позже. То есть MJPEG — это просто последовательность картинок, у которых этим заголовком указано — когда приходит следующая картинка, ею надо заменить предыдущую. Внутри выглядит это вот таким образом.
Content-type: multipart/x-mixed-replace;boundary=СТРОКАРАЗДЕЛИТЕЛЬ
--СТРОКАРАЗДЕЛИТЕЛЬ
Content-type: image/jpeg
Content-length: 232311
…бинарное содержимое первой картинки…
--СТРОКАРАЗДЕЛИТЕЛЬ
Content-type: image/jpeg
Content-length: 47474
…бинарное содержимое второй картинки…СТРОКУРАЗДЕЛИТЕЛЬ надо выбирать так, чтобы она не встретилась в бинарных данных изображения.
Браузерам этот заголовок достался от фирмы Нетскейп, которая
Например для «Оперы», нужно выдавать данные с задержкой, то есть показали один кадр, ждём пару секунд, ничего с сервера не отдаём, потом следующий. Иначе, «Опера» «хитрит» — показывает следующий кадр, не дожидаясь загрузки предыдущего. Если канал хороший, то мы увидим только последний кадр.
«Файрфокс» единственный, кто хорошо справляется с тем, что кадры могут быть разных размеров — он отображает их правильно, «Опера» масштабирует по первой картинке, «Хром» и «Сафари» глючат — иногда пропускают кадр, иногда ничего не показывают, иногда показывают нормально.
Самое приятное в этом формате — что все современные браузеры считают его картинкой, то есть тег IMG его преспокойно показывает.
Любопытно, что браузеры позволяют сжимать содержимое всего файла и даже каждого кадра отдельно, то есть можно в заголовке кадра поставить
Так что, если вы задумались сделать аналог
Фестиваль «404» в Самаре
![]()
Меня тут все спрашивают, как прошёл фестиваль «404» в Самаре. Отлично прошёл, друзья мои! Но у меня совершенно не было времени хотя бы удалить дубли фотографий и выложить оставшееся. Поэтому предлагаю взглянуть на фестиваль в маленькое (66×44) окошко моего импровизированного телевизора. Скорее всего читателям трансляций (в ЖЖ, «Ярушке» и так далее) не будет видно самого телевизора, только картинку, так что заходите на сайт.
Гоу версия 1
Язык программирования «Гугл Гоу»
We propose to issue a Go release early next year that will be called “Go version 1”, Go 1 for short, that will be the first Go release to be stable in this way. Code that compiles in Go version 1 should, with few exceptions, continue to compile throughout the lifetime of that version, as we issue updates and bug fixes such as Go version 1.1, 1.2, and so on… Go version 1 will be a stable language with stable libraries. Other than critical fixes, changes made to the library and packages for versions 1.1, 1.2 and so on may add functionality but will not break existing Go version 1 programs.