?

Log in

No account? Create an account
бритва хэнлона, временные метки и падение боинга - Поклонник деепричастий [entries|archive|friends|userinfo]
Anatoly Vorobey

[ website | Website ]
[ userinfo | livejournal userinfo ]
[ archive | journal archive ]

Links
[Links:| English-language weblog ]

бритва хэнлона, временные метки и падение боинга [июл. 20, 2014|04:05 pm]
Anatoly Vorobey
[Tags|, , ]

Это, наверное, первая запись в моем журнале с метками одновременно "программирование" и "политика".

Если вы следите за кризисом в Украине и в частности за падением малазийского "Боинга", то заметили, наверное, что украинское СБУ опубликовало запись переговоров сепаратистов вскоре после падения самолета. Видео была закачано на канал СБУ в Ютюбе всего через несколько часов после падения самолета. Люди заметили, что если скачать с Ютюба это видео, а потом посмотреть на видеофайл в какой-нибудь программе, которая показывает метаданные, то "дата создания" в файле оказывается 16-го июля, т.е. днем раньше собственно падения. Причем это не может быть разница в часовых поясах, потому что время почти на 24 часа раньше падения; отсюда люди заключили, что это доказательство того, что СБУ сделало фальшивые записи еще до катастрофы. Правда, другие люди вскоре заметили, что Ютюб поступает так с любым видео, которое в него загружают, и это видимо баг в Ютюбе. Так что теперь волнами по сети и оффлайновым СМИ расходятся разоблачение СБУ и разоблачение разоблачения.

Кажется, я разобрался, что это за баг. В видеоформате mp4 (стандарт MPEG-4) есть возможность записать "время создания" любого потока данных, с помощью специальной метки. Значение этой метки в стандарте - кол-во секунд, прошедших с 1 января 1904 года, или так называемое "время по эпохе макинтоша", потому что маки первыми стали использовать такой отсчет времени. Меж тем в современных серверах намного проще иметь дело с "временем по эпохе Юникса", а именно кол-вом секунд, прошедших с 1 января 1970 года. В результате этого во множестве программ, которые работают на Линуксе или других юниксовских операционных системах, есть кусок кода, который выглядит примерно так:

- получить "время сейчас по юниксу";
- добавить разницу между временем по юниксу и временем по макинтошу - это некая константа;
- полученное "время сейчас по макинтошу" записать в файл mp4, который мы создаем.

Чему равна константа "разница между временем по юниксу и временем по макинтошу"? Она равна в точности числу секунд, прошедших между 1 января 1904 и 1 января 1970. Это 66 лет, из которых 17 были високосными (проверьте, если не доверяете мне). Всего дней получается: 66*365+17 = 24107, а секунд, учитывая 86400 секунд в сутках: 24107*86400 = 2082844800. Это правильное значение константы.

Но есть маленькая крохотная незаметная проблемка. Часть стандарта MPEG-4 - исходники библиотек, которые умеют читать и писать mp4-файлы, так называемое "reference software" на C++, которым все могут пользоваться, чтобы позаимствовать или сравнить со своим кодом. Полное название этой части стандарта - "ISO/IEC 14496-5". Если вам интересно, вы можете скачать эту часть стандарта бесплатно с официального сайта. И если вы посмотрите на исходники, то увидите, что там используется другое значение этой константы, а именно 2082758400. Это ровно на 86400 секунд, то есть на одни сутки, меньше правильного значения.

Как случилось, что создатели MPEG-4 неправильно посчитали разницу между двумя датами? Может, кто-то вручную считал високосные годы и ошибся? Не знаю. Так или иначе, неправильное значение из-за его присутствия в стандарте попало во множество библиотек для чтения и записи видеоформатов. Постепенно в последние годы правильное значение начинает его сменять; если вы поищете в гугле оба числа, то увидите несколько точных описаний проблемы в исходниках нескольких проектов: "стандарт предлагает использовать 2082758400, но правильное значение 2082844800". В других проектах правильное значение стоит просто потому, что они сами посчитали, исходя из определений эпох, а не пользовались исходниками из стандарта.

Если в библиотеке, которая создает для вас mp4-файл, записано неправильное значение, то что произойдет, когда она захочет записать время "сейчас"? Она возьмет правильное число секунд по юниксу, добавит константу на сутки меньше, чем надо, и получит тем самым число секунд, согласно эпохе макинтоша, которое соответствует времени на сутки раньше. Я послал описание проблемы и решения разработчикам Ютюба, и надеюсь, что вскоре этот баг исчезнет.

Все в этом мире взаимосвязано. Кривые руки авторов стандарта MPEG-4 приводят к конспиративным теориям в украинском конфликте. Так и живем.
СсылкаОтветить

Comments:
Страница 1 из 4
<<[1] [2] [3] [4] >>
[User Picture]From: avva
2014-07-20 01:12 pm
Мне эта ссылка недоступна.
(Ответить) (Parent) (Thread) (Развернуть)
[User Picture]From: rsokolov
2014-07-20 01:13 pm
невероятно круто

Интересно, что объяснить некое загадочное явления без привлечения высших сил и конспиративных теорий можно "по науке" - то, что сделали вы, а можно - исходя из эмпирики ("Ютуб всегда это делает, а почему - неизвестно").
(Ответить) (Thread)
[User Picture]From: kodak2004
2014-07-20 02:56 pm
Строго говоря, второе - не объяснение, а констатация факта.
(Ответить) (Parent) (Thread) (Развернуть)
[User Picture]From: nihao_62
2014-07-20 01:13 pm
Спасибо. Очень интересно.
(Ответить) (Thread)
[User Picture]From: kodak2004
2014-07-21 11:19 pm
Для avva: вот еще два комментария с ценной инфой: http://npubop.livejournal.com/2159734.html?thread=55450230#t55450230
(Ответить) (Parent) (Thread)
[User Picture]From: rednyrg721
2014-07-20 01:14 pm
На HN и реддите вчера обсуждалось:

https://news.ycombinator.com/item?id=8057599

http://www.reddit.com/r/programming/comments/2b4kpg/conspiracy_and_an_offbyone_error/

Edited at 2014-07-20 13:15 (UTC)
(Ответить) (Thread)
[User Picture]From: gholam
2014-07-20 01:26 pm
Это не баг а закладка ЦРУАНБАТФ!!!111расрасрас
(Ответить) (Thread)
[User Picture]From: arpad
2014-07-20 06:01 pm
beware - your sarcasm can be taken literally
(Ответить) (Parent) (Thread) (Развернуть)
From: a_shen
2014-07-20 01:26 pm

вот это да!

а такой технический вопрос: ведь, как я понимаю, при "скачивании" не сам youtube выдаёт ролик в виде файла, он как раз вроде старается этого не делать, чтобы нельзя было потом это использовать, а надо было ставить ссылку, а какие-то третьи сайты конвертируют видеопоток с youtube в файл? или я неправильно понимаю (я не разбирался подробно, наверно, Вы это знаете)?
(Ответить) (Thread)
[User Picture]From: avva
2014-07-20 01:31 pm

Re: вот это да!

То, что происходит - это третьи сайты хитро генерируют правильный запрос к серверам youtube, который мимикрирует запрос, который посылает обычно плейер внутри вашего браузера, и этот запрос заставляет youtube послать файл прямо вам. Видеопоток *не* проходит через третий сайт, хоть это на первый взгляд и неинтуитивно. Прямую ссылку на youtube дать невозможно, там стоит какая-то защита против этого, и цель существования третих сайтов - эту защиту обойти. Подробностей я не знаю.

Наверняка это не все, ведь плейеры еще могут прыгать прямо в середину потока, делать умную буферизацию итд., так что должен быть еще режим общения плейера с сервером сложнее, чем просто "пошли мне mp4-файл". Но поскольку есть и такой простой режим тоже, третьи сайты им могут воспользоваться.
(Ответить) (Parent) (Thread) (Развернуть)
[User Picture]From: tacente
2014-07-20 01:31 pm
Очень интересно. Это отчасти перекликается с моими соображениями про фейки, потому что в вашем рассуждении используются и условно-филологические методы (ну, от балды выбранные даты -- вполне себе факт истории отрасли, дисциплины вполне филологической).

А у меня на маке вот какой баг: любые файлы, создаваемые или сохраняемые, он записывает с правильной датой, но со временем всегда 19:xx. Это не то чтобы сильно мешало, но вызывает удивление. Системные часы при этом показывают правильное время.
(Ответить) (Thread)
(Удалённый комментарий)
[User Picture]From: avva
2014-07-20 01:33 pm
Нет технических причин считать, что до.
(Ответить) (Parent) (Thread) (Развернуть)
(Удалённый комментарий)
(Удалённый комментарий)
[User Picture]From: xaxam
2014-07-20 01:47 pm
Я помню несколько раз, когда по соображениям коррекции астрономического времени к году добавляли (или вычитали) секунду. Газеты писали, что-де уходящий год будет на секунду короче/длиннее, что широкой публикой воспринималось как чувство юмора яйцеголовых учёных.

Это к тому, что вычисление количества секунд в "константе" неточно на 2-3 секунды (странно, что этого не знают разработчики).

Остаётся маленькая вероятность, что все эти коррекции случились после 1.1.1970. Маленькая, потому что все эти игры нужны среди прочего для космических и военных целей, а в эти игры яйцеголовые учёные начали играть намного раньше...
(Ответить) (Thread)
[User Picture]From: avva
2014-07-20 01:52 pm
Да, мне это тоже приходило в голову - насколько я понимаю, для целей такой относительно "грубой" датировки, как время файла с точностью до секунды, тема високосных секунд просто игнорируется. В астрономии и нескольких смежных областях, когда вычисляют время, используют более сложные библиотеки, которые все это знают и просчитывают.
(Ответить) (Parent) (Thread) (Развернуть)
(Удалённый комментарий)
[User Picture]From: vodianoj
2014-07-20 01:54 pm
Приятно, когда теории конспирации спобобствуют нахождению и устранению багов. Хоть какая-то ощутимая польза.

(Ответить) (Thread)
[User Picture]From: cema
2014-07-20 01:56 pm
Молодец, как всегда.
(Ответить) (Thread)
[User Picture]From: kaathewise
2014-07-20 02:07 pm
Круто! А скажи, пожалуйста, какая существует политика в отношении таких (пусть незначительных) подробностей кода? То есть, нужно ли тебе было согласовать это с кем-то, или это относится к таким вещам, которые всегда можно рассказать?
(Ответить) (Thread)
[User Picture]From: sam_kort
2014-07-20 02:08 pm

А содержание разговора Вас не смущает?

Казаки настолько круты, чтобы держать бук на блок-посту? В ПЗРК на блок-посту верю, в бук не верю.
(Ответить) (Thread)
[User Picture]From: taki_net
2014-07-20 02:20 pm

Re: А содержание разговора Вас не смущает?

Латынина (да, я знаю, что она цензоред и т.д.) говорит, что это, очевидно, маскировка типа "4 огурца и 18 помидор доставлены".
(Ответить) (Parent) (Thread) (Развернуть)
[User Picture]From: evg25
2014-07-20 02:12 pm
Круто! Спасибо! :-)
(Ответить) (Thread)
(Удалённый комментарий)
From: shmelipolosatov
2014-07-20 08:03 pm
что за бред про временные метки склеенных кусочков, кто-то может прояснить?
(Ответить) (Parent) (Thread)
(Удалённый комментарий)
Страница 1 из 4
<<[1] [2] [3] [4] >>