Эволюция сборщиков

Здесь моё, абсолютно субъективное, мнение, как я представляю эволюцию сборщиков кода. Или грубо о зародыше софтверной части современного DevOps инженера.

Когда никто даже не подозревал

Совсем недавно по историческим меркам, но оочень давно по меркам IT индустрии люди писали код. Пусть, скажем, году так в 2000-ом. И особенность этой индустрии заключается в том, что со времён, наверное, после громоздких ЭВМ, код, написанный программистами перемещается на другой компьютер для работы. Сейчас этот процесс модно называется “деливери”, а человек, который им руководит – “деливери менеджер”. Изюминка в этом всём, что код нужно было запустить после того как его перемещали на машину, где он должен был работать. Отсюда прямо следует две фазы – упаковка выполняемого кода и запуск на другом компьютере. И осуществлялось это самым незатейлевым способом. Программисты неким образом складывали свои файлики и писали краткую иструкцию, что нужно сделать чтобы это всё заработало. Думаю все слышали про так называемые ридми файлы.

Надо с этим жить

Итак у нас есть инструкции и файлы программы. Всё хорошо работает. Но. Есть у человека свойство лениться. Уж не хочет очень один и тот же человек делать одно и то же по нескольку раз. Теперь давайте представим, что админ, который копирует, переименовывает, меняет файлы раз от раза, хочет свести свою работу к минимуму (или то же самое другими словами – не хочет делать свою работу). Он берёт и пишет батник в котором фактически автоматизирует работу по установке и запуску ПО.

Что-то начали подозревать

У админа значит есть батник, который делает за него его работу. Поэтому админ может ничего не делать, но есть ведь программист! Который, падла, постоянно пишет код. Поэтому однажды админ осознаёт, что всё упало. Разбирается и понимает, что инструкция по установке нового релиза претерпела, так сказать, незначительные изменения. Программист не знает ведь, что админ написал скрипт и нихрена не делает… Естественно совершенно здравое желание админа заставить программиста апдейтить скрипт для развёртки. Иначе админу опять прийдётся работать!

Но программист же умный. Он тут же говорит, что “я ваш баш не курю”, “я такое могу написать, что сервер сам уронится”, “я понятия не имею где будет приложение разворачиваться – мне писать (кол-во операционных систем)*скриптов?”.

После этого ситуация, так сказать, на некоторое время подвисает. И работа “деливери менеджера” в этот период заключается в том, чтобы уворачиваться между какашками, которые метают друг в друга программисты и админы, пытаясь переложить друг на друга свою работу.

Вот где-то тогда и появился Ant. Он закрыл все вопросы о кроссплатформенности, поэтому “тугие” в админских делах программисты могли уже писать сами как им надо там файлики копировать. Ну а админы по ламерски уже запускали ant build.xml.

“Деливери менеджеры” получили заслуженную передышку. Их задача сводилась к написанию ответственного письма в ответственное время. И они уже начали потихоньку примерять новую лычку “релиз менеджера” НО…

Надоело!

Тут опять программисты, ссуки. Их скорость написания приложений, а также фанатичная приверженность всякораным бест практисам и “не изобретению” велосипедов, породила хаос библиотек, которые нужно было откуда-то брать, где-то хранить и при сборке не только использовать для компиляции, но и как-то ими оперировать. Концептуально проблема решается очень элементарно – единым хранилищем всех библиотек. А поскольку в IT ничего простого не бывает, эта проблема не решалась очень долго и хаос библиотек ширился и процветал.

Когда уже стало совсем швах с развёрткой системы, программисты начали искать решение. Вместо того чтобы решить проблему с хранилищем библиотек, был изменён подход к самой сборке бинарников. Что с одной стороны упростило сборку однотипных небольших проектов, с другой стороны сделало практически невозможным гибко и быстро кастомизировать сборку под свои нужды.

Но поскольку с библиотечным адом maven более-менее справлялся, решили, что серебрянная пуля найдена и все на время успокоились. Начали оперировать новым бест практисом – модульностью. То что модульность в этом случае ограничивалась всего-лишь новой зависимостью и очень часто никакой больше нагрузки не имела – мало кого заботило. Благо, что maven сам эту зависимость и менеджил.

Ничто не вечно

Казалось бы, хранилище библиотек есть, сборка в один клик работает. Но. Как всегда бывает, когда строишь дом из современных материалов на старом и гнилом фундаменте – потерпишь факап. Что собственно и случилось с maven. Если говорить грубо, то я бы сказал, что этот фреймворк выебал сам себя. То количество тупых и нелогичных затыков, с которыми встречаешься в процессе работы – поражает. Особенно, когда нужно отойти от декларативной прямой и лайфсайкла, что требует maven. Поэтому что? Поправить фреймворк? К хуям! Напишем gradle!

Лично мне уже даже интересно на чём может зафакапиться этот очередной высер программерской мысли. Так что жду с нетерпением…

Неизвестный Херсон

Как-то листая одну социальную сеть, попалась “на глаза” пара картинок. Не в одном посте. И я бы их пропустил если бы не одно обстоятельство. Начну вот с этой:

Французская карта Херсона

Эта картинка была добавлена в комментарий для демострации моста, помеченного красной линией. Обратил я на неё внимание, поскольку никогда ни от кого я не слышал ни единого упоминания о мосте или даже некоем пути изображённом на этой карте. При этом неоднократно слышал о таких экзотических способах не только перправы но и движения автотранспорта прямо по Днепру зимой, когда река замерзала. Давно это было, не с теперешними зимами. Вот. О таком слышал, а вот про мост из центра города на противоположный берег – не слышал. Интересно, забавно, но с нулевой перспективой. Официальные историки вряд ли признают эту переправу, поскольку до сих пор не упоминали об этом. А какие либо доказательства найти, думаю, нереально. С одной стороны морпорт уже ннадцать раз перестроенный. С другой стороны плавни – болото, непроходимый камыш и заросли. Так что если поиски переправы и возможны, то с привлечением оочень уж продвинутых и масштабных методов. Просто так не походишь с фотоаппаратом.

Но карта была аккуратная и понятная, так что я продолжил дальше рассматривать. Вот что меня заинтересовало:

  1. Остров.
  2. Некая речка то ли Перетка, то ли Пепетка.
  3. Судя по всему это был телеграф. Детальнее здесь.
  4. Городская крепость.
  5. Городской вал.
  6. Верфи.

Теперь немного пояснений почему именно эти моменты. Острова нет сейчас от слова совсем. Настолько совсем, что я даже упоминания о нём нигде не встречал. Отсатки речки Перетки сейчас есть. Вполне себе отчетливо просматривается между Конкой и Днепром. Удивляет тот факт, что на старой карте она отображена как полноценная река, хотя сейчас я бы так не сказал (обведено красным):

Остстки речки Перетка

Телеграф отметил как любопытный факт. Я знаю, что в Херсоне в определённое время был очень развит проводной телеграф, но вот тот факт, что был беспроводной – я не слышал. Городская крепость – изъеденный факт. Некие остатки стоят и по сей день. Слышал, что крепость сохранилась до 60-х годов прошлого века. Но несмотря на это фотографий старой крепости очень мало. А тот факт, что это была крепость-звезда так вообще нечто немыслимое. Городского вала, согласно официалам вообще не существовало. Совсем. С верфью тоже не совсем ясно. Согласно официалам Херсон был основан как верфь для постройки черноморского флота и координации действий на южном направлении. С этим официалы соглашаются. Но, насколько я понимаю, где именно эти верфи находились им уже непонятно. Хотя на мой взгляд, очевидное место старой верфи сохранилось до сих пор. Как минимум два строительных дока. И это же место отмечено на карте. Карта кстати французская.

Вот с такими чувствами рассматривал эту картинку. И оно бы и осталось в памяти как ещё одни забавные байки о Херсоне, но встретилась мне другая картинка с якобы Херсоном с той же социальной сети. Не знаю что это гравюра, картина или что-то ещё:

Как нетрудно заметить эта картинка практически по всем пунктам пересекается с картой. Мы видим посреди реки остров (кстати с постройками). Справа мощнейший городской вал, сходящий прямо к Днепру. А за ним практически целый флот из парусных кораблей. Причем с мачтами и развевающимися флагами.

Остров

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

Так мне казалось вначале. Начал я с локализации места где нужно искать. Как мы видим на карте острвов явно расположен на изгибе реки. Таких изгибов сейчас два. Один в районе пляжа “Лилэя”. Второй – в районе автомобильного моста. Если посмотреть на современную карту, то в пермом случае мы имеем изгиб только правого берега, в то время как левый берег никаких признаков искривления не демонстрирует. С другой стороны, на старой карте остров отчётливо находится вверх по течению за двумя бухтами на правом берегу.

Промеры дна в том районе вроде как указывают на остров до бухт (слева отмечено красным). За бухтами признаков острова практически не видно. Самое мелкое место отличается практически на уровне погрешности с соседними (отмечено красным справа):

Участок Днепра в районе консервного

Так что не думаю что здесь был остров. А кривизна правого берега вполне может оказаться искусственной. Там рядом косревный завод и спуск к реке. Всё указывает на активное использование берега в промышленных целях.

Остаётся второй участок. Цюрюпинский мост. Здесь всё веселее. На карте глубин отчетливо просматривается возвышение дна. Причем не только по цифрам глубин. Там даже отмечен участок другим цветом (отмечено красным):

Остатки острова на карте глубин

Дальше – больше.  Попытался поискать упоминания об этом острове. Как ни странно я их не только нашёл. Я их нашёл в относительно недавнем событии. А именно при строительстве автомобильного моста через Днепр. Вот например проект моста (кстати раньше тоже был, как видим, “строительный паспорт объекта”). Здесь на заднем плане мы отчётливо видим нечто похожее на облако или остров. Но вот что-то мне кажется что там изображен именно остров:

“Паспорт” цюрюпинского моста

А вот и реальные фото. На некоторых отчетливо просматривается участок суши над водой:

Другими словами остров был. И его даже использовали при строительстве моста. Карта промеров глубин это допускает. После строительства его могли смыть совсем, дабы не мешал судоходству и не “ломал” течение реки, ледохода ну и прочим геофизическим причинам.

Городская стена

Факт существования острова совсем по другому позволяет смотреть на старую карту и гравюру. Следующим что можно поискать является городской вал. Как мы видим он берёт начало между двумя бухтами (одна из которых вполне себе искусственна) и островом.

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

Бухты в районе консервного

Бухты в районе “молодёжки”

Остатки двух бухт

Первые две пары очень похожи друг на друга. Одна в районе “молодёжки”, вторая – район консервного. Но меня заинтересовали не они, а вот то, что могло находиться на третьем рисунке. Очень мне уж видятся там остатки двух бухт. Левая, которая на карте имеет форму чуть ли не квадрата с абсолютно ровными сторонами, могла быть создана искуственно. И если присмотреться к гравюре, то можно увидеть флот кораблей, который находится сразу же за городской стеной. Они не могут находится вдоль Днепра – перспектива не позволяет. А вот если предположить, что они находились в этой бухте, то всё сходится. И площать бухты позволяет и глубина нужна относительно небольшая – до 5 метров. Остатки второй бухты справа более отчётливы. Она тоже частично “заземлена”, но мы видим отчетливые очертания протоки и прибрежного края. Также текущее состояние (факт что левая бухта не сохранилась, а правая частично) вполне объясняется тем, что левая полностью искуственная, а правая имеет естественное происхождение.

Что дальше

На мой взгляд начало многообещающее. Следующее, что можно сделать – это съездить на место старых бухт и соориентироваться на местности. Ну и начинать искать остатки городского вала. Если гравюра не врёт, он был огромен. Здесь, кстати, нужно помнить, что большой бородской вал мы видим только на гравюре и он мог не быть таким же по всему периметру. На некоторых участках могли использовать естественные природные образования.

Предварительные выводы

  1. Официалы или прямо врут или чего то не договоаривают.
  2. Версия что корабли строились в Херсоне а дооснащались вниз по реке или полностью не правдива или частично. Как мы видим кораблей было много и они были с мачтами. Здесь же можно вспомнить пушечный сталелитейный завод, который находился в Херсоне (правда никто не знает где именно). В итоге получается официальная картина маслом: корпуса кораблей строили в Херсоне, пушли лили там же. Дальше всё это дело перемещали в Голую Пристань и там дооснащали. То есть пушки ставили на корабли, мачты, такелаж, то есть всё, что утяжеляло корабль. Делалось это якобы потому что глубина Днепра в районе Херсона была небольшая. И с кораблями то всё понятно, но вот с пушками как? Херсон и Голая Пристань находятся на разных берегах. Путь по суше в то время нереальный. Тогда приходилось бы гонять лодочками по одной – две пушки из Херсона в ГП. Но что ж с них взять – глупые! Не знали что такое “логистика”!
  3. Мосты на карте скорее всего были не мосты, по крайней мере через Днепр, а самая обычная паромная переправа. Объясняет отсутсвие упоминаний и останков. Сегодя есть, завтра нет. Вроде логично. Против моста говорит также факт наличия кораблей. Будь то даже корабли без мачт, согласно официалам. Корпус “пустой”, без мачт это махина 6-7 метров в высоту. Это ж какой мост должен быть? Нет, не было таких мостов на Днепре в то время.
  4. Масштабы Херсона. Он был огромен!

Генерация Kerberos заголовка

Недавно понадобилось мне получить Kerberos токен в джаве. До сих пор я имплементил только серверную часть Kerberos аутентификации. И там токет брался из заголовка запроса, что приходил из браузера. То есть меня не парило кто его генерирует. Как ни странно, но вменяемого описания как получить токен я не нашёл на просторах интернета. Пришлось лепить самому. Получилось такое:

Чтобы запустить это приложение нужна одна зависимость:

А также создать файл login.conf:

и запускать приложение с параметром -Djava.security.auth.login.config=login.conf

Замечание

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