Сайт Романа ПарпалакаБлог202406

Глюки подключения модема и ошибки мышления

12 июня 2024 года, 20:33

Вспомнил историю, которая хорошо иллюстрирует одну из ошибок мышления: «после — не значит вследствие».

Чуть больше 20 лет назад у меня появился первый компьютер. В те времена большинство пользователей интернета выходили туда через модемы — специальные платы, которые позволяли подключать компьютеры к телефонной линии. Чтобы заработал интернет, специальная программа «звонила» по номеру провайдера, и по телефонной линии передавалась цифровая информация, представленная как аудиосигнал.

В компьютере был модем с заявленной скоростью 33,6 килобит в секунду. Такой скорости подключения я никогда не видел. Настоящая скорость была немного ниже, 28,8 или 31,2 килобита в секунду. По тем временам таким интернетом можно было пользоваться более-менее сносно.

Скорость передачи данных через модем зависит от качества телефонной линии. У меня изредка появлялись ошибки подключения. Я списывал их на плохой контакт в проводе от компьютера к телефонной розетке. Стандартный провод был слишком коротким, и я его удлинил. Когда начинались ошибки подключения, я наклонялся к компьютеру, шевелил провод и разъемы, пытаясь улучшить контакт. После нескольких попыток ошибки пропадали.

Чтобы как-то улучшить ситуацию с качеством подключения, я несколько раз перепаивал провод, применил витую пару, укреплял места пайки, думая, что они со временем «расшатываются». Проблемы исчезали и потом появлялись снова.

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

Вообще, это какой-то странный глюк: иногда модем перестает подключаться к интернету, и после этого удается только четвертая попытка подключения. Как будто автор прошивки написал в коде счетчик до трех, но применил его в неправильном месте.

Интересно посмотреть, почему я не сразу понял, что причина проблем в кривой прошивке. Во-первых, каждая попытка подключения достаточно долгая, около 10 секунд. Если бы каждая неудачная попытка подключиться заканчивалась ошибкой мгновенно, я бы быстрее заметил, что их всегда было три.

Во-вторых, три — достаточно маленькое число, чтобы понять, что несколько неудачных попыток подключения подряд — это именно три. Один-два раза пробуешь просто переподключиться. Один-два раза шевелишь провод, думая что улучшаешь контакт. И вот уже компьютер нормально подключается и работает.

В-третьих, я попался в ловушку мышления и нашел несуществующую причинно-следственную связь: подключение появляется после того, как я шевелил провод, но это не значит, что оно появляется вследствие этого действия.

Наверно, мы все слышали об этой логической ошибке: после — не значит вследствие. Одно дело — знать о ней, и совсем другое — понять, что мы совершаем ее раз за разом.

    Оставить комментарий

Можно ли надежно определить, по какому адресу открыли сайт?

17 июня 2024 года, 22:37

Я уже писал о том, что в PHP нет надежного способа определить текущий домен. Сейчас столкнулся с похожей трудностью с определением порта. Ко мне обратились за помощью с ошибкой в форуме PunBB при входе пользователей.

Напомню, что на своей первой работе в 2008 году я входил в команду разработки этого форума. С тех времен он не сильно развивался, и информацию обо мне до сих пор не удалили со страницы в вики. Видимо, оттуда на меня и вышли.

Проблема у собеседника проявлялась в том, что после отправки формы с логином и паролем редирект происходил на адрес типа https://example.com:80/some_forum_url. Ответ не приходил, потому что на порту 80 никто не обрабатывал https-запросы, так как веб-сервер ожидал их на стандартном порту 443.

PunBB устроен так, что в момент установки URL форума записывается в специальную переменную в файле настройки. Сама эта переменная была установлена правильно, порта в ней не было: https://example.com/. Но именно после входа неверный порт откуда-то появлялся.

Я поискал по коду форума «80» и нашел такую строчку:

$port = (isset($_SERVER['SERVER_PORT'])
   && (
      ($_SERVER['SERVER_PORT'] != '80' && $protocol == 'http://')
      || ($_SERVER['SERVER_PORT'] != '443' && $protocol == 'https://')
   ) && strpos($_SERVER['HTTP_HOST'], ':') === false)
   ? ':'.$_SERVER['SERVER_PORT']
   : '';

Здесь код пытается понять по значению серверной переменной $_SERVER['SERVER_PORT'], запущен ли он на нестандартном порту. Я предложил заменить строку на $port = ''. Проблема исчезла.

Оказалось, что на хостинге значение переменной $_SERVER['SERVER_PORT'] было установлено неверно. Оно равнялось 80, хотя сам сайт открывается по стандартному для https порту 443.

Надо сказать, что у меня нет понимания, нужно ли вообще обрабатывать значение $_SERVER['SERVER_PORT']. С одной стороны, если не обработать, то движок получается менее универсальным, он не может определить, что запущен на нестандартном порту. С другой стороны, если обрабатывать, можно столкнуться с некорректной настройкой веб-сервера и ошибками на ровном месте, как в этом случае. Описание похожей проблемы есть на стековерфлоу, так что это не какой-то экзотический случай.

Чтобы не пытаться определять адрес сайта во время выполнения, авторы PunBB сделали это определение только во время установки для формирования «умной догадки», которую можно подправить. Но какой-то разработчик в этом вопросе разобрался не до конца и использовал этот код еще и для определения адреса редиректа, что и повлекло саму ошибку.

    2 комментария

← сюда туда →

Поделиться
Записи