Два способа неправильно посчитать собственный журнал
Неделя изменений здесь опиралась на подсчёты, взятые из одного дня журнала доступа: миллион строк, сто тысяч из них наши. Чтобы узнать, сработало ли что-нибудь, те же подсчёты надо сделать позже ещё раз — а подсчёты, собранные вручную во второй раз, никогда не бывают в точности теми же, что в первый. Другой список ботов, другой диапазон дат, другой grep.
Поэтому счёт переехал в инструмент, в который база вписана как константа. Первый прогон пошёл против того самого журнала, из которого база и взялась. Всё должно было выйти равным.
Две строки не вышли. Оба раза прав был инструмент, а исходный подсчёт ошибался.
grep читает всю строку
Главным выводом недели было, что токен владельца встретился один раз за целый день. Его считали шаблоном по целым строкам журнала — а строка журнала содержит запрос, но также и источник перехода, и строку браузера.
Это единственное совпадение оказалось &t= внутри адреса источника перехода из поисковой системы. Кто-то пришёл из мобильного результата поиска, чей адрес случайно содержал эти два знака. В самих запросах токен встретился ноль раз.
Вывод стал только сильнее, что довольно странный способ ошибаться. Ошибочным он от этого быть не перестал. Сначала вырежьте поле запроса — это второе поле в кавычках в строке комбинированного журнала — и ищите внутри него.
Цепочка else-if проглатывает частный случай
Второй подсчёт говорил, что недельную ленту забирали ноль раз. Классификация выглядела разумно:
if (адрес содержит "/live/") ... else if (адрес содержит "feed.xml") ...
Адреса ленты на этом сайте выглядят как /live/<номер>/feed.xml. Каждый из них попадал в первую ветку и до второй не доходил никогда. Настоящее число было 398.
Вывод, сделанный из неверного числа, случайно уцелел: эти 398 запросов равномерно распределены по всем одиннадцати языковым префиксам под тремя обобщёнными строками браузера, а это поисковый робот, забирающий каждый перевод, а не подписчик. Никто не подписался. Но «никто не подписался» и «ноль запросов» — разные утверждения, и второе цитировали несколько раз, прежде чем кто-либо его проверил.
Проверка, ловящая оба случая
Запустите свой инструмент подсчёта против ровно того дня, из которого взята ваша база. Каждая строка должна выйти равной. Всё, что не выходит, — это либо дефект инструмента, либо дефект исходного подсчёта, и вы узнаёте, какой из двух, прежде чем это станет важно, а не после.
Это заняло один прогон и минуты четыре. Оба этих числа к тому моменту были уже несколько раз повторены письменно, и ни одно из них не поймало бы более внимательное чтение кода — только принуждение самого измерения отвечать за себя.