Сегодня, 11 мая 2013 года, в 01:41:39.8 UTC (05:41:39.8 московского времени) в русском разделе Википедии появилась миллионная статья. По случайному совпадению, русский раздел именно сегодня отмечает своё 12-летие. Статью Life Extension Foundation создал участник UG72. Уже разгорелись споры о том, имеет ли статья право на жизнь, но тот факт, что рубеж взяла именно она, установлен однозначно.
Счётчик статей в Википедии показывает количество статей, в которых есть хотя бы одна ссылка (существуют и две другие настройки правил). Таким образом, на его значение может повлиять как создание и удаление статей, так и переименование и даже любая правка. Добавим к этому то, что в преддверии юбилея участники начинают массово заливать свои заготовки в надежде, что одна из них всё-таки окажется юбилейной статьёй, и то, что счётчик, как не очень важная обычно вещь, обновляется асинхронно. В итоге вычислить нужную статью становится очень непросто. Но всем же интересно!
Выкрутиться всё-таки можно.
Из-за того, что на счётчик могут повлиять любые действия, и всё происходит очень быстро, попытки вычислить номер статьи ретроспективно обречены. На счётчик нужно смотреть в реальном времени. Когда Википедия была ещё не такой известной, было достаточно зайти в нужное время на список новых статей, где в то время размещался счётчик, и успеть сделать скриншот. Но сегодня, например, круглое значение счётчика продержалось меньше двух секунд.
У фонда Викимедиа есть Тулсервер — набор серверов, на которые копируются базы данных проектов фонда. Шелл-доступ к ним может запросить любой технически грамотный участник. Получив доступ, ресурсы Тулсервера можно использовать для любых действий, полезных для проектов фонда.
Актуальное значение счётчика статей хранится в базе данных; там же, естественно, находится и информация о новых статьях. Поэтому для фиксации юбилейного момента достаточно опрашивать базу данных несколько раз в секунду, следить за изменениями счётчика и логировать их. Лог выглядит примерно вот так:
06:05:25.02 999397 Касиски,_Фридрих 06:05:25.51 999398 Касиски,_Фридрих 06:09:02.67 999398 Криволапов,_Григорий_Архипович 06:09:03.32 999399 Криволапов,_Григорий_Архипович 06:10:16.17 999399 Лёгкая_промышленность_России 06:10:18.39 999400 Лёгкая_промышленность_России
Обычно каждая статья появляется в нём дважды: в первый раз меняется показание поля «Последняя созданная статья», во второй — значение счётчика. Таким образом, например, статья Касиски,_Фридрих была 999398-й.
Сегодня ночью в районе юбилея с доступом к Тулсерверу были проблемы. Следящий скрипт продолжал работать и регистрировать новые статьи, однако значение счётчика было другим! Разобраться, почему так происходит, быстро не получилось. Средства мониторинга говорили, что репликация осуществляется корректно и без задержек. Разница показаний счётчиков медленно плавала в районе 100 статей. Поэтому скрипт пришлось срочно переписать, чтобы он брал данные напрямую с сайта. Работающий с базой экземпляр остался запущенным на всякий случай.
У MediaWiki есть прекрасное API, позволяющее вытащить много интересных данных. К API можно сформулировать запрос, который одновременно вернёт значение счётчика и последние новые страницы:
Нужные данные находятся в полях .query.statistics.articles
и .query.recentchanges[0].title
. С этими данными нужно делать то же самое — постоянно опрашивать их и логировать любые изменения. Асинхронность счётчика при этом становится заметной в меньшем числе случаев.
Поскольку HTTP-запрос выполняется дольше, чем запрос к базе, я на всякий случай запустил тот же скрипт со своего личного сервера. На этом я успокоился, затаился и стал ждать.
Статью создали. Три лога в районе миллиона выглядят так:
01:36:32.57 999878 Клавдиево 01:36:32.89 999879 Клавдиево ... 01:41:37.88 999908 Ловно 01:41:38.30 999909 Ловно 01:41:38.49 999909 Кручинин,_Владимир_Фёдорович 01:41:38.93 999909 Калямин,_Вячеслав_Иванович 01:41:39.09 999910 Калямин,_Вячеслав_Иванович 01:41:40.69 999911 Калямин,_Вячеслав_Иванович 01:41:40.75 999911 Life_Extension_Foundation 01:41:40.91 999912 Life_Extension_Foundation 01:41:41.95 999912 Фортыгин,_Виталий_Сергеевич 01:41:42.11 999913 Фортыгин,_Виталий_Сергеевич 01:41:43.07 999913 Император_-_сила 01:41:43.29 999914 Император_-_сила 01:41:43.35 999914 Чертова,_Надежда_Андреевна 01:41:43.97 999915 Glock_21 01:41:44.59 999916 Glock_21 01:41:44.65 999916 Володя_Шишкин 01:41:44.69 999917 Володя_Шишкин ... 01:43:17.60 999935 Бобрик_(станиця) 01:43:17.69 999936 Бобрик_(станиця)
01:36:32.67 999966 Клавдиево 01:36:32.93 999967 Клавдиево ... 01:41:38.01 999997 Ловно 01:41:38.67 999997 Кручинин, Владимир Фёдорович 01:41:39.12 999998 Калямин, Вячеслав Иванович 01:41:39.35 999999 Калямин, Вячеслав Иванович 01:41:39.80 1000000 Life Extension Foundation 01:41:41.12 1000000 Фортыгин, Виталий Сергеевич 01:41:41.56 1000001 Фортыгин, Виталий Сергеевич 01:41:41.79 1000000 Фортыгин, Виталий Сергеевич 01:41:42.00 1000001 Фортыгин, Виталий Сергеевич 01:41:42.63 1000002 Император - сила 01:41:43.09 1000003 Чертова, Надежда Андреевна 01:41:43.32 1000004 Glock 21 01:41:44.22 1000004 Володя Шишкин ... 01:43:17.01 1000023 Бобрик (станиця) 01:43:17.22 1000024 Бобрик (станиця)
01:36:32.72 999966 Клавдиево 01:36:32.96 999967 Клавдиево ... 01:41:37.95 999996 Ловно 01:41:38.19 999997 Ловно 01:41:38.68 999997 Кручинин, Владимир Фёдорович 01:41:38.92 999997 Калямин, Вячеслав Иванович 01:41:39.17 999999 Калямин, Вячеслав Иванович 01:41:39.88 1000000 Life Extension Foundation 01:41:41.25 1000000 Фортыгин, Виталий Сергеевич 01:41:41.73 1000001 Фортыгин, Виталий Сергеевич 01:41:42.68 1000002 Император - сила 01:41:42.92 1000002 Чертова, Надежда Андреевна 01:41:43.14 1000003 Чертова, Надежда Андреевна 01:41:43.38 1000004 Glock 21 01:41:44.32 1000004 Володя Шишкин ... 01:43:17.10 1000023 Бобрик (станиця) 01:43:17.34 1000024 Бобрик (станиця)
По всем трём логам видно, что рубеж взяла именно статья Life Extension Foundation. По статьям Клавдиево (999967) и Бобрик (станиця) (1000024) можно заключить, что разница показаний счётчиков Тулсервера и самой Википедии в интересующем нас отрезке была равна 88. Под номером 1000000−88=999912 находим, опять-таки, статью Life Extension Foundation.
К счастью, вандальные статьи в этот раз снова пронеслись мимо.
Автор: Kalan