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

Программирование ≠ информатика

На хабре перевод статьи некоего Коннелла о том, почему нельзя до конца формализовать и алгоритмизировать разработку софта:

Разработка программного обеспечения никогда не будет строгой дисциплиной с подтверждёнными результатами, поскольку в неё вовлечена деятельность человека.

Это экстра-математическое утверждение о границах формальных систем. Я не имею никаких доказательств за или против. Но факт в том, что человеческие проблемы остаются центральными вопросами разработки программного обеспечения:

  • Что должна делать эта программа? (требования, юзабилити, безопасность)
  • Как должна выглядеть программа внутри, чтобы её легко было починить и модифицировать? (архитектура, дизайн, масштабируемость, переносимость, расширяемость)
  • Как долго займёт её написание? (оценка)
  • Как мы должны её разрабатывать? (кодирование, тестирование, измерение, конфигурация)
  • Как следует эффективно организовать работу команды? (менеджмент, процесс, документация)

Все эти проблемы вращаются вокруг людей.

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

9 августа 2017 года, 00:03     работа программиста     Оставить комментарий

Как определить домен из PHP

Илья Бирман написал про баг в Эгее, когда сайт доступен по разным доменам, и RSS кешируется то с одним доменом, то с другим.

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

Проблема этого подхода в том, что в PHP (и в любом языке вообще) не существует универсального надежного способа узнать, на каком домене открыли страницу сайта.

HTTP_HOST и SERVER_NAME

Для этих целей обычно проверяют серверную переменную HTTP_HOST. Но в ней всего лишь содержимое заголовка Host из http-запроса. Этот заголовок — часть стандарта HTTP/1.1, и в HTTP/1.0 он не обязателен. Правда, без этого заголовка не заработают виртуальные хосты — разные сайты на общем сервере. Но даже в таком случае среди сайтов есть сайт по умолчанию, открывающийся при заходе напрямую по IP. Так вот, когда устаревшие клиенты (в том числе нормальные браузеры за старыми или специально настроенными прокси) открывают сайт по умолчанию, переменная HTTP_HOST будет пустой.

Есть еще одна серверная переменная — SERVER_NAME. Обычно она содержит хост, определенный в конфигурации веб-сервера. Но на него тоже нельзя стопроцентно положиться. Например, в nginx хост по умолчанию задается конструкцией

server_name _;

Сайт будет прекрасно открываться, но при этом в SERVER_NAME окажется знак подчеркивания.

Подробности для дальнейшего чтения на стековерфлоу: HTTP_HOST vs. SERVER_NAME.

Параметр конфигурации

Если вы делаете распространяемый движок для работы на разных серверах, у вас нет гарантированного способа определить хост, по которому открыт сайт. В моем движке S2 я скопировал способ из PunBB. В нем установочный скрипт «угадывает» адрес сайта (протокол + домен + порт + подпапка) в том числе на основе HTTP_HOST, дает возможность этот адрес отредактировать и сохраняет результат в конфигурационный файл. Затем именно этот адрес используется для генерации ссылок.

Как альтернативу Илья советует настроить редиректы. Это правильно, но, опять же, не всегда выполнимо. Например, вы настроили на сервере https, но не хотите делать редирект с http на https (вы хотите поддерживать старые браузеры, но у вас нет отдельного IP-адреса на каждый домен).

Когда одна и та же страница открывается по разным адресам, Гугл рекомендует в явном виде указывать canonical-адреса:

<link rel="canonical" href="https://example.com/some/url" />

Именно они попадут в поисковую выдачу. Ясно, что движок не сможет сгенерировать такой тег, если не будет знать, на каком из доменов он на самом деле работает.

Кстати, давно хотел написать о том, что https — это новый www. Он вынуждает совершать дополнительные бессмысленные действия при настройке сайта вроде редиректов с www. Ради https мне пришлось сделать в S2 поддержку тега link rel="canonical".

14 августа 2017 года, 23:12     www · PHP · S2     Оставить комментарий

Сочинение музыки к стихотворениям

Когда моя знакомая (Олеся, привет) узнала, что я пытаюсь сочинять музыку, попросила сочинить что-нибудь к ее стихотворениям. Из четырех выбрал одно:

Слетают листья, словно конфетти.
Неслышно в доме сумерки вздыхают.
И наши одинокие пути
Созвездия в ночи пересекают.

В чужой Вселенной, может, отыщу
Координаты тех пересечений.
Пройду до них по лунному лучу
Сквозь звездные холодные теченья.

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

Включайте музыку и проследите, как на нее ложится это стихотворение.

Роман Парпалак: В чужой Вселенной

Дальше я расскажу, как сочинял эту композицию. К четверостишиям хорошо подходит последовательность аккордов золотой секвенции. Ее я и выбрал.

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

Вторая попытка оказалась удачнее. Я попробовал спеть про себя слова и нашел характерный подход с тремя затактовыми нотами.

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

В основе всех трех строф одна и та же часть с небольшими ритмическими и мелодическими вариациями, продиктованными различным текстом. Я разбавил строфы проигрышем с гармонией i VI VII V.

16 августа 2017 года, 17:46     музыка     Комментарии (1)

← сюда туда →

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