Куча говна / Говнокод #26862 Ссылка на оригинал

0

  1. 1
IT Оффтоп #56

#28: https://govnokod.ru/26372 https://govnokod.xyz/_26372
#29: https://govnokod.ru/26385 https://govnokod.xyz/_26385
#30: https://govnokod.ru/26413 https://govnokod.xyz/_26413
#31: https://govnokod.ru/26423 https://govnokod.xyz/_26423
#32: https://govnokod.ru/26440 https://govnokod.xyz/_26440
#33: https://govnokod.ru/26449 https://govnokod.xyz/_26449
#34: https://govnokod.ru/26456 https://govnokod.xyz/_26456
#35: https://govnokod.ru/26463 https://govnokod.xyz/_26463
#36: https://govnokod.ru/26508 https://govnokod.xyz/_26508
#37: https://govnokod.ru/26524 https://govnokod.xyz/_26524
#38: https://govnokod.ru/26539 https://govnokod.xyz/_26539
#39: https://govnokod.ru/26556 https://govnokod.xyz/_26556
#40: https://govnokod.ru/26568 https://govnokod.xyz/_26568
#41: https://govnokod.ru/26589 https://govnokod.xyz/_26589
#42: https://govnokod.ru/26600 https://govnokod.xyz/_26600
#43: https://govnokod.ru/26604 https://govnokod.xyz/_26604
#44: https://govnokod.ru/26627 https://govnokod.xyz/_26627
#45: https://govnokod.ru/26635 https://govnokod.xyz/_26635
#46: (vanished) https://govnokod.xyz/_26646
#46: (vanished) https://govnokod.xyz/_26654
#47: https://govnokod.ru/26671 https://govnokod.xyz/_26671
#48: https://govnokod.ru/26707 https://govnokod.xyz/_26707
#49: https://govnokod.ru/26750 https://govnokod.xyz/_26750
#49: https://govnokod.ru/26776 https://govnokod.xyz/_26776
#50: https://govnokod.ru/26804 https://govnokod.xyz/_26804
#51: https://govnokod.ru/26809 https://govnokod.xyz/_26809
#52: https://govnokod.ru/26817 https://govnokod.xyz/_26817
#53: https://govnokod.ru/26833 https://govnokod.xyz/_26833
#54: https://govnokod.ru/26840 https://govnokod.xyz/_26840
#55: https://govnokod.ru/26844 https://govnokod.xyz/_26844

Запостил: nepeKamHblu_nemyx nepeKamHblu_nemyx, (Updated )

Комментарии (1911) RSS

  • Пересмотрел оффтопы, содержащие более 400 комментариев.

    Хостинг: http://govnokod.ru/25396

    Прыщеблядь VS Акнеблядь: http://govnokod.ru/24915

    Память в пхп не шарится, и на каждый запрос заново запускается. По-моему это каждый петух знает: http://govnokod.ru/25675

    БОЖЕСТВЕННЫЙ СУДЪ: http://govnokod.ru/26438

    Питушня: http://govnokod.ru/26692

    Словарь терминов говнокода: http://govnokod.ru/26478
    Обсуждение словаря терминов говнокода: http://govnokod.ru/26488

    Вореции {
    12 это 35 это 7876... http://govnokod.ru/16567
    Бредогенерации тред: http://govnokod.ru/16714
    }
    Ответить
  • https://habr.com/post/515102/
    > Apple и Google удалили Fornite из магазинов AppStore и Google Play за обход встроенной платежной системы
    > 13 августа 2020 года Epic Games добавила альтернативную возможность оплаты за V-bucks (игровые виртуальные деньги) в мобильной версии игры Fortnite. Это было сделано для того, чтобы пользователи могли сэкономить при выборе нового способа оплаты. В этом случае не платилась комиссия Apple и Google за встроенные покупки.

    > Вечером этого же дня Apple убрала приложение Fortnite из App Store из-за нарушения условий размещения в магазине приложений. Немного позже это сделала и Google. [...] Фактически это был бан за невозможность получать 30-процентную комиссию от оплаты пользователем встроенных покупок в этих игровых приложениях, что недопустимо по правилам магазинов AppStore и Google Play.

    > Однако, Epic Games не согласна с такими действиями Apple и Google.
    > Разработчик решил не сдаваться и предпринял новые шаги по борьбе с двумя монополистами.

    > Для того, чтобы пользователи и игроки узнали об этой ситуации Epic Games анонсировала выход короткометражного фильма Nineteen Eighty-Fortnite, в котором Apple сравнивается с Большим Братом из романа-антиутопии Джорджа Оруэлла «1984».
    > Разработчик открыл для пользователей портал "FreeFortnite", где уже опубликован пародийный ролик на Apple, где логотип компании обыгрывается в виде червивого яблока.

    > Вдобавок Epic Games подала в суд на Apple. Разработчик обвинил компанию в ограничении конкуренции и нарушении антимонопольного законодательства США. Epic Games в своем иске просит объявить незаконными ограничения, которые накладывает Apple в AppStore.


    Китайское говно кидается какашками в гугловское говно и эппловское говно. Ебала жаба гадюку.
    Ответить
    • Ну эпики сами те ещё пидоры. Притащили на десктоп концепцию "эксклюзивов", многие игры теперь год-другой только в их магазине продаются.
      Ответить
      • Подтверждаю. Помимо этого, «Эпики» по факту принадлежат «Tencent», а «Tencent» — это ёбаный китайский рак. Китайский рак надо выжигать калёным железом.
        Ответить
  • Имеются ли тут webpackoBble_nemyxu? Инженерный отдел начал читать мануал, а там с первых же строчек что-то кукарекают про «NodeJS» и «импорты». Его вообще можно использовать для обычных, чисто браузерных приложений, без всего этого говна?
    Ответить
    • Ну да, они же даже сами пишут в своём getting started, что вебпак все эти импорты уберёт и сделает код совместимым со старыми браузерами.
      Ответить
    • WebPack обычно работает так:

      Ты описываешь bundle в js файле, и запускаешь webpack через node.js.
      Вебпак поддерживает импорты, и собирает в бандл все нужные файлы, которые ты до этого установил через npm.

      Полученный бандл ты загружаешь в страницу.

      Пример:

      main.js импортирует foo.js, bar,js а так же isodd, iseven, iseleven и другие полезные пакеты.
      webpack собирает из этово один огромный page.js минифицированный.
      Его ты и подключаешь
      Ответить
  • https://habr.com/post/515168/
    > Проект криптовалюты под названием YAM закрылся 12 августа после того, как ее создатели обнаружили, что существующая в коде программная ошибка фактически лишает их возможности управлять валютой.
    > «Мы обнаружили ошибку в контракте на перебазирование, из-за которой было извлечено гораздо больше YAM, чем предполагалось для продажи в пул Uniswap YAM/yCRV, что привело к отправке большого количества избыточного YAM в резерв протокола», — разъяснили авторы проекта.
    > «Учитывая модуль управления YAM, эта ошибка сделает невозможным достижение кворума, а это означает, что никакие действия по управлению будут невозможны, и средства в казначействе будут заблокированы», — добавили они.

    > Ошибка в коде заблокировал токены Curve (yCRV) на сумму около $750 000 в казначействе YAM. Эти активы были предназначены для использования в качестве резервной валюты для поддержания стоимости YAM.
    > При этом создатели настаивали, что ошибка не повлияла напрямую на балансы или активы в контрактах на размещение.
    > Но после того, как попытки восстановить контроль над казначейством YAM потерпели неудачу, соучредитель Брок Элмор принес в твиттере официальные извинения.

    > Несмотря на свой провал, YAM Finance намерена повторить попытку: «Мы создадим грант Gitcoin для координации финансируемого сообществом аудита контрактов YAM. «Если цель финансирования будет достигнута, по завершении аудита мы планируем поддержать запуск YAM 2.0 через контракт на миграцию из YAM».


    Какая-то ёбанная хипстерская феерия.
    Ответить
    • Кстати, интересно, а почему все вот эти вот «криптопроекты» до сих пор не приравняли к финансовым пирамидам?
      Ответить
      • Так механизмы другие. Криптопараша усиленно пародирует биржу.
        Ответить
        • И таки замечательно пагодигует, скажу я вам!
          > Ошибка в коде заблокировал токены Curve (yCRV) на сумму около $750 000
          > Но после того, как попытки восстановить контроль над казначейством YAM потерпели неудачу, соучредитель Брок Элмор принес в твиттере официальные извинения.
          Ответить
          • Ну вот, достаточно извиниться и всё хорошо.
            Всегда так делаю.

            И вообще, что такое $750 000? Чуть больше шестидесяти битков. Хакеры-вымогатели смеются над этими нищебродами.
            Ответить
            • Ну вот, достаточно извиниться и всё хорошо.
              Всегда так делаю.

              И вообще, что такое $750 000? Чуть больше шестидесяти битков. Хакеры-вымогатели смеются над этими нищебродами.
              Ответить
            • Ну вот, достаточно извиниться и всё хорошо.
              Всегда так делаю.

              И вообще, что такое $750 000? Чуть больше шестидесяти битков. Хакеры-вымогатели смеются над этими нищебродами.
              Ответить
            • Ну вот, достаточно извиниться и всё хорошо.
              Всегда так делаю.

              И вообще, что такое $750 000? Чуть больше шестидесяти битков. Хакеры-вымогатели смеются над этими нищебродами.
              Ответить
            • Ну вот, достаточно извиниться и всё хорошо.
              Всегда так делаю.

              И вообще, что такое $750 000? Чуть больше шестидесяти битков. Хакеры-вымогатели смеются над этими нищебродами.
              Ответить
            • Ну вот, достаточно извиниться и всё хорошо.
              Всегда так делаю.

              И вообще, что такое $750 000? Чуть больше шестидесяти битков. Хакеры-вымогатели смеются над этими нищебродами.
              Ответить
            • Ну вот, достаточно извиниться и всё хорошо.
              Всегда так делаю.

              И вообще, что такое $750 000? Чуть больше шестидесяти битков. Хакеры-вымогатели смеются над этими нищебродами.
              Ответить
            • Ну вот, достаточно извиниться и всё хорошо.
              Всегда так делаю.

              И вообще, что такое $750 000? Чуть больше шестидесяти битков. Хакеры-вымогатели смеются над этими нищебродами.
              Ответить
            • Ну вот, достаточно извиниться и всё хорошо.
              Всегда так делаю.

              И вообще, что такое $750 000? Чуть больше шестидесяти битков. Хакеры-вымогатели смеются над этими нищебродами.
              Ответить
            • Ну вот, достаточно извиниться и всё хорошо.
              Всегда так делаю.

              И вообще, что такое $750 000? Чуть больше шестидесяти битков. Хакеры-вымогатели смеются над этими нищебродами.
              Ответить
            • Ну вот, достаточно извиниться и всё хорошо.
              Всегда так делаю.

              И вообще, что такое $750 000? Чуть больше шестидесяти битков. Хакеры-вымогатели смеются над этими нищебродами.
              Ответить
          • И таки замечательно пагодигует, скажу я вам!
            Ошибка в коде заблокировал токены Curve (yCRV) на сумму около $750 000
            Но после того, как попытки восстановить контроль над казначейством YAM потерпели неудачу, соучредитель Брок Элмор принес в твиттере официальные извинения.
            Ответить
          • И таки замечательно пагодигует, скажу я вам!
            Ошибка в коде заблокировал токены Curve (yCRV) на сумму около $750 000
            Но после того, как попытки восстановить контроль над казначейством YAM потерпели неудачу, соучредитель Брок Элмор принес в твиттере официальные извинения.
            Ответить
          • И таки замечательно пагодигует, скажу я вам!
            Ошибка в коде заблокировал токены Curve (yCRV) на сумму около $750 000
            Но после того, как попытки восстановить контроль над казначейством YAM потерпели неудачу, соучредитель Брок Элмор принес в твиттере официальные извинения.
            Ответить
          • И таки замечательно пагодигует, скажу я вам!
            Ошибка в коде заблокировал токены Curve (yCRV) на сумму около $750 000
            Но после того, как попытки восстановить контроль над казначейством YAM потерпели неудачу, соучредитель Брок Элмор принес в твиттере официальные извинения.
            Ответить
          • И таки замечательно пагодигует, скажу я вам!
            Ошибка в коде заблокировал токены Curve (yCRV) на сумму около $750 000
            Но после того, как попытки восстановить контроль над казначейством YAM потерпели неудачу, соучредитель Брок Элмор принес в твиттере официальные извинения.
            Ответить
          • И таки замечательно пагодигует, скажу я вам!
            Ошибка в коде заблокировал токены Curve (yCRV) на сумму около $750 000
            Но после того, как попытки восстановить контроль над казначейством YAM потерпели неудачу, соучредитель Брок Элмор принес в твиттере официальные извинения.
            Ответить
          • И таки замечательно пагодигует, скажу я вам!
            Ошибка в коде заблокировал токены Curve (yCRV) на сумму около $750 000
            Но после того, как попытки восстановить контроль над казначейством YAM потерпели неудачу, соучредитель Брок Элмор принес в твиттере официальные извинения.
            Ответить
          • И таки замечательно пагодигует, скажу я вам!
            Ошибка в коде заблокировал токены Curve (yCRV) на сумму около $750 000
            Но после того, как попытки восстановить контроль над казначейством YAM потерпели неудачу, соучредитель Брок Элмор принес в твиттере официальные извинения.
            Ответить
          • И таки замечательно пагодигует, скажу я вам!
            Ошибка в коде заблокировал токены Curve (yCRV) на сумму около $750 000
            Но после того, как попытки восстановить контроль над казначейством YAM потерпели неудачу, соучредитель Брок Элмор принес в твиттере официальные извинения.
            Ответить
          • И таки замечательно пагодигует, скажу я вам!
            Ошибка в коде заблокировал токены Curve (yCRV) на сумму около $750 000
            Но после того, как попытки восстановить контроль над казначейством YAM потерпели неудачу, соучредитель Брок Элмор принес в твиттере официальные извинения.
            Ответить
          • И таки замечательно пагодигует, скажу я вам!
            Ошибка в коде заблокировал токены Curve (yCRV) на сумму около $750 000
            Но после того, как попытки восстановить контроль над казначейством YAM потерпели неудачу, соучредитель Брок Элмор принес в твиттере официальные извинения.
            Ответить
          • И таки замечательно пагодигует, скажу я вам!
            Ошибка в коде заблокировал токены Curve (yCRV) на сумму около $750 000
            Но после того, как попытки восстановить контроль над казначейством YAM потерпели неудачу, соучредитель Брок Элмор принес в твиттере официальные извинения.
            Ответить
          • И таки замечательно пагодигует, скажу я вам!
            Ошибка в коде заблокировал токены Curve (yCRV) на сумму около $750 000
            Но после того, как попытки восстановить контроль над казначейством YAM потерпели неудачу, соучредитель Брок Элмор принес в твиттере официальные извинения.
            Ответить
          • И таки замечательно пагодигует, скажу я вам!
            Ошибка в коде заблокировал токены Curve (yCRV) на сумму около $750 000
            Но после того, как попытки восстановить контроль над казначейством YAM потерпели неудачу, соучредитель Брок Элмор принес в твиттере официальные извинения.
            Ответить
          • И таки замечательно пагодигует, скажу я вам!
            Ошибка в коде заблокировал токены Curve (yCRV) на сумму около $750 000
            Но после того, как попытки восстановить контроль над казначейством YAM потерпели неудачу, соучредитель Брок Элмор принес в твиттере официальные извинения.
            Ответить
          • И таки замечательно пагодигует, скажу я вам!
            Ошибка в коде заблокировал токены Curve (yCRV) на сумму около $750 000
            Но после того, как попытки восстановить контроль над казначейством YAM потерпели неудачу, соучредитель Брок Элмор принес в твиттере официальные извинения.
            Ответить
          • И таки замечательно пагодигует, скажу я вам!
            Ошибка в коде заблокировал токены Curve (yCRV) на сумму около $750 000
            Но после того, как попытки восстановить контроль над казначейством YAM потерпели неудачу, соучредитель Брок Элмор принес в твиттере официальные извинения.
            Ответить
          • И таки замечательно пагодигует, скажу я вам!
            Ошибка в коде заблокировал токены Curve (yCRV) на сумму около $750 000
            Но после того, как попытки восстановить контроль над казначейством YAM потерпели неудачу, соучредитель Брок Элмор принес в твиттере официальные извинения.
            Ответить
          • И таки замечательно пагодигует, скажу я вам!
            Ошибка в коде заблокировал токены Curve (yCRV) на сумму около $750 000
            Но после того, как попытки восстановить контроль над казначейством YAM потерпели неудачу, соучредитель Брок Элмор принес в твиттере официальные извинения.
            Ответить
          • И таки замечательно пагодигует, скажу я вам!
            Ошибка в коде заблокировал токены Curve (yCRV) на сумму около $750 000
            Но после того, как попытки восстановить контроль над казначейством YAM потерпели неудачу, соучредитель Брок Элмор принес в твиттере официальные извинения.
            Ответить
          • И таки замечательно пагодигует, скажу я вам!
            Ошибка в коде заблокировал токены Curve (yCRV) на сумму около $750 000
            Но после того, как попытки восстановить контроль над казначейством YAM потерпели неудачу, соучредитель Брок Элмор принес в твиттере официальные извинения.
            Ответить
          • И таки замечательно пагодигует, скажу я вам!
            Ошибка в коде заблокировал токены Curve (yCRV) на сумму около $750 000
            Но после того, как попытки восстановить контроль над казначейством YAM потерпели неудачу, соучредитель Брок Элмор принес в твиттере официальные извинения.
            Ответить
          • И таки замечательно пагодигует, скажу я вам!
            Ошибка в коде заблокировал токены Curve (yCRV) на сумму около $750 000
            Но после того, как попытки восстановить контроль над казначейством YAM потерпели неудачу, соучредитель Брок Элмор принес в твиттере официальные извинения.
            Ответить
          • И таки замечательно пагодигует, скажу я вам!
            Ошибка в коде заблокировал токены Curve (yCRV) на сумму около $750 000
            Но после того, как попытки восстановить контроль над казначейством YAM потерпели неудачу, соучредитель Брок Элмор принес в твиттере официальные извинения.
            Ответить
          • И таки замечательно пагодигует, скажу я вам!
            Ошибка в коде заблокировал токены Curve (yCRV) на сумму около $750 000
            Но после того, как попытки восстановить контроль над казначейством YAM потерпели неудачу, соучредитель Брок Элмор принес в твиттере официальные извинения.
            Ответить
        • Так механизмы другие. Криптопараша усиленно пародирует биржу.
          Ответить
        • Так механизмы другие. Криптопараша усиленно пародирует биржу.
          Ответить
        • Так механизмы другие. Криптопараша усиленно пародирует биржу.
          Ответить
        • Так механизмы другие. Криптопараша усиленно пародирует биржу.
          Ответить
        • Так механизмы другие. Криптопараша усиленно пародирует биржу.
          Ответить
        • Так механизмы другие. Криптопараша усиленно пародирует биржу.
          Ответить
        • Так механизмы другие. Криптопараша усиленно пародирует биржу.
          Ответить
        • Так механизмы другие. Криптопараша усиленно пародирует биржу.
          Ответить
        • Так механизмы другие. Криптопараша усиленно пародирует биржу.
          Ответить
        • Так механизмы другие. Криптопараша усиленно пародирует биржу.
          Ответить
        • Так механизмы другие. Криптопараша усиленно пародирует биржу.
          Ответить
        • Так механизмы другие. Криптопараша усиленно пародирует биржу.
          Ответить
        • Так механизмы другие. Криптопараша усиленно пародирует биржу.
          Ответить
        • Так механизмы другие. Криптопараша усиленно пародирует биржу.
          Ответить
        • Так механизмы другие. Криптопараша усиленно пародирует биржу.
          Ответить
        • Так механизмы другие. Криптопараша усиленно пародирует биржу.
          Ответить
        • Так механизмы другие. Криптопараша усиленно пародирует биржу.
          Ответить
        • Так механизмы другие. Криптопараша усиленно пародирует биржу.
          Ответить
        • Так механизмы другие. Криптопараша усиленно пародирует биржу.
          Ответить
        • Так механизмы другие. Криптопараша усиленно пародирует биржу.
          Ответить
        • Так механизмы другие. Криптопараша усиленно пародирует биржу.
          Ответить
        • Так механизмы другие. Криптопараша усиленно пародирует биржу.
          Ответить
        • Так механизмы другие. Криптопараша усиленно пародирует биржу.
          Ответить
        • Так механизмы другие. Криптопараша усиленно пародирует биржу.
          Ответить
        • Так механизмы другие. Криптопараша усиленно пародирует биржу.
          Ответить
    • Я по заголовку подумал, что дикобраз в итоге выжил.

      А так ни себе ни людям
      Ответить
      • – Самолеты преодолевают верхнюю облачность... Ласточки попадают в сопла... Самолеты падают... Гибнут люди... Ласточки попадают в сопла... Глохнут моторы... Самолеты разбиваются... Гибнут люди...
        А напротив сидел поэт Евгений Рейн.
        – Самолеты разбиваются, – продолжал Веселов, – гибнут люди...
        – А ласточки что – выживают?! – обиженно крикнул Рейн.
        Ответить
  • Блядь, как же заебали ёбанные виндовые сеошники. Вижу у себя какой-то драйвер-фильтр ФС (вендовая терминология, ага) «npsvctrig», хочу узнать, что это такое. Ввожу в «Гугл», получаю страницу, забитую ёбанными автогенерированными ворециями:
    npsvctrig.sys Windows process - What is it?
    Npsvctrig.sys is a Windows driver. A driver is a small software program that allows your computer to
    communicate with hardware or connected devices. This means ...
    
    Скачать Npsvctrig.sys и исправить ошибки «синего экрана»
    6 мая 2020 г. - Файл npsvctrig.sys входит в комплект Windows 10, Windows 8.1 и Windows 8.
    Ниже приведены подробные сведения, порядок устранения ...
    
    What you should know about npsvctrig.sys
    The npsvctrig.sys (Named pipe service triggers) file is a Windows driver. Generally, drivers are used
    by Windows to enable internal components like graphic cards ...
    
    npsvctrig.sys - Что это такое?
    npsvctrig.sys не является необходимым для Windows 10/8/7/XP. Нажмите здесь, чтобы узнать,
    является ли npsvctrig безопасным и как избежать ошибок ...
    
    Что такое npsvctrig? -
    Процесс, известный как триггеры службы именованных каналов, принадлежит корпорации
    Microsoft (www.microsoft.com). Описание: Npsvctrig.sys не ...

    Блядопидорасы ебливые, зла не хватает.
    Ответить
  • К этому же периоду относится и визит Швейка на свою квартиру к своей старой служанке пани Мюллеровой. Швейк застал дома двоюродную сестру пани Мюллеровой, которая с плачем сообщила ему, что пани Мюллерова была арестована в тот же вечер, когда отвезла Швейка на призыв. Старушку судил военный суд, и в виду того, что ничего не было доказано, её отвезли в концентрационный лагерь в Штейнгоф. От неё уже получено письмо.
    Швейк взял эту семейную реликвию и прочёл:

    «Милая Аннушка! Нам здесь очень хорошо, и все мы здоровы. У соседки по койке сыпной ███, но есть и чёрная ████. В остальном всё в порядке. Еды у нас достаточно, и мы собираем на суп картофельную ██████ Слышала я, что пан Швейк уже ████ так ты как-нибудь разузнай, где он лежит, чтобы после войны мы могли украсить его могилу. Забыла тебе сказать, что на чердаке в тёмном углу в ящике остался щеночек фокстерьер. Вот уже сколько недель, как он ничего не ел, — с той поры как пришли меня ██████████. Я думаю, что уже поздно и пёсик уже отдал ████ душу».

    Весь лист пересекал розовый штемпель:
    Zensuriert К.. и k. Konzentrationslager Steinhof /
    Просмотрено цензурой. Императорский королевский
    концентрационный лагерь Штейнгоф (нем.)./.

    Ярослав Гашек. Похождения бравого солдата Швейка. [ДАННЫЕ УДАЛЕНЫ]
    Ответить
  • https://habr.com/post/515696/
    https://habrastorage.org/webt/rp/ru/mu/rprumuo8cydmzee4cd6nlynbd_k.jpeg
    https://habrastorage.org/webt/b_/fz/-e/b_fz-e8mahprwkzai6kyy3xkcqq.jpeg
    > Дизайнерский концепт «ябломобиля» от Magic Torch, сообщество Behance.net

    Похоже, «дизайнеру» забыли рассказать, что такие вот круглые штуки внизу автомобиля называются «колёса», и если их нет (или они не крутятся), то машина не поедет.
    Ответить
  • На почту пришёл какой-то спам с замечательными ворециями: #вореции
    >>>
    Фигура разворота «Харами»

    Фигура японских свечей Харами состоит из 2 свечей; длинная первая поглощает вторую короткую; разворачивает текущий тренд.
    Фигура «Харами» (англ. harami) — разворотная фигура на графике японских свечей. Она состоит из 2-х рядом стоящих свечей, вторая из которых меньше первой, при этом тело и тени второй свечи должны находится в пределах первой свечи. Харами разворачивает предшествующий тренд, направление которого является куда более важным сигналом, чем цвета свечей. Несмотря на то, что разные источники утверждают разную информацию про цвета свечей в Харами, автор пришел к выводу, что комбинации цвета имеют несущественное значение. Харами — это зеркальное отражение фигуры Поглощение. Харами (разворотная фигура японских свечей)
    Фигура японских свечей «Харами» в действии
    Харами наблюдаются в концах трендов. Это могут быть как длинные тренды в несколько месяцев, так и короткие тенденции в несолько дней. Чтоб понять Харами, надо проанализировать, что же происходит во время торгов в период формирования Харами.
    Обратный разрыв в фигуре Харами
    Заметьте, что независимо от цвета первой свечи, открытие второй свечи происходит с окном от закрытия первой свечи. Более того, это окно-то обращено в противоположную сторону от движения цены в первой свече. Т.е. если цена падает в первой свече (и свеча первая, соответственно, темная), то вторая свеча открывается с окном выше, чем закрылась первая свеча. С другой стороны, если в первой свече цена росла, то во второй свече цена откроется с разрывом ниже. Именно этот разрыв (окно) в противоположную сторону от движения цены в первой свече и является ключевым моментом фигуры Харами.
    Важность размеров второй свечи
    Чем меньше вторая свеча в Харами — тем достовернее фигура. Если вторая свеча является Доджи, надежность фигуры сильно возрастает.
    Ответить
    • #вореции
      (продолжение)
      >>>
      Бычий и медвежий Харами
      Т.к. фигура Харами — разворотная, есть 2 варианта Харами, которые соответствуют направлению нового, развернутого тренда:

      бычий Харами — разворачивает нисходящие тренд на восходящий
      медвежий Харами — меняет восходящий тренд нисходящим

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

      черная с черной
      черная с белой
      белая с черной
      белая с белой

      Разные источники утверждают, что бычьи Харами должны обязательно начинаться с белых свечей, а медвежьи Харами — с темных. Но новые данные подтверждают, Стив Найсон (CandleCharts.com) об этом пишет, и автор убежден, что комбинации цвета свечей в фигуре Харами имеют гораздо меньшее значение, чем размеры свечей. Вполне вероятно наблюдать любую из 4-х комбинаций цветов свечей в качестве и медвежьего Харами и бычьего.
      Прикладной смысл фигуры Харами
      Естественно, т.к. Харами — фигура разворота, главный ее прикладной смысл — обнаружение разворотов. Именно поэтому, Харами является отличным помощником при анализе финансовых инструментов, которые находятся в ценовом коридоре. При обнаружении Харами близ областей поддержки или сопротивления стоит делать соответствующие действия, т.к. Харами свидетельствует о развороте. Также можно использовать Харами в отрыве от ценового канала, и просто выявлять разворот текущего тренда, но при этом стоит воспользоваться дополнительным инструментом технического анализа (например, каким-то индикатором) для подтверждения разворота тренда.
      Ответить
      • #вореции
        (окончание)
        >>>
        Вывод
        Фигура на графике японских свечей Харами поможет вам увидеть вероятное место разворота текущего тренда.
        Ответить
          • Я вообще до половины текста был уверен, что это что-то про оригами.

            А в конце решил, что это про фен-шуй и гороскопы. В принципе, не особо ошибся.
            Ответить
            • Ну, к слову, на форексе даже зарабывают. Продавая гороскопы и мануалы.
              Ответить
            • Я бы не решился. Потому что звучит как очередное описание дилдака с АлиЭкспресс
              Ответить
            • Я вообще до половины текста был уверен, что это что-то про оригами.

              А в конце решил, что это про фен-шуй и гороскопы. В принципе, не особо ошибся.
              Ответить
            • Я вообще до половины текста был уверен, что это что-то про оригами.

              А в конце решил, что это про фен-шуй и гороскопы. В принципе, не особо ошибся.
              Ответить
            • Я вообще до половины текста был уверен, что это что-то про оригами.

              А в конце решил, что это про фен-шуй и гороскопы. В принципе, не особо ошибся.
              Ответить
            • Я вообще до половины текста был уверен, что это что-то про оригами.

              А в конце решил, что это про фен-шуй и гороскопы. В принципе, не особо ошибся.
              Ответить
            • Я вообще до половины текста был уверен, что это что-то про оригами.

              А в конце решил, что это про фен-шуй и гороскопы. В принципе, не особо ошибся.
              Ответить
            • Я вообще до половины текста был уверен, что это что-то про оригами.

              А в конце решил, что это про фен-шуй и гороскопы. В принципе, не особо ошибся.
              Ответить
            • Я вообще до половины текста был уверен, что это что-то про оригами.

              А в конце решил, что это про фен-шуй и гороскопы. В принципе, не особо ошибся.
              Ответить
            • Я вообще до половины текста был уверен, что это что-то про оригами.

              А в конце решил, что это про фен-шуй и гороскопы. В принципе, не особо ошибся.
              Ответить
            • Я вообще до половины текста был уверен, что это что-то про оригами.

              А в конце решил, что это про фен-шуй и гороскопы. В принципе, не особо ошибся.
              Ответить
            • Я вообще до половины текста был уверен, что это что-то про оригами.

              А в конце решил, что это про фен-шуй и гороскопы. В принципе, не особо ошибся.
              Ответить
            • Я вообще до половины текста был уверен, что это что-то про оригами.

              А в конце решил, что это про фен-шуй и гороскопы. В принципе, не особо ошибся.
              Ответить
            • Я вообще до половины текста был уверен, что это что-то про оригами.

              А в конце решил, что это про фен-шуй и гороскопы. В принципе, не особо ошибся.
              Ответить
            • Я вообще до половины текста был уверен, что это что-то про оригами.

              А в конце решил, что это про фен-шуй и гороскопы. В принципе, не особо ошибся.
              Ответить
            • Я вообще до половины текста был уверен, что это что-то про оригами.

              А в конце решил, что это про фен-шуй и гороскопы. В принципе, не особо ошибся.
              Ответить
            • Я вообще до половины текста был уверен, что это что-то про оригами.

              А в конце решил, что это про фен-шуй и гороскопы. В принципе, не особо ошибся.
              Ответить
            • Я вообще до половины текста был уверен, что это что-то про оригами.

              А в конце решил, что это про фен-шуй и гороскопы. В принципе, не особо ошибся.
              Ответить
            • Я вообще до половины текста был уверен, что это что-то про оригами.

              А в конце решил, что это про фен-шуй и гороскопы. В принципе, не особо ошибся.
              Ответить
            • Я вообще до половины текста был уверен, что это что-то про оригами.

              А в конце решил, что это про фен-шуй и гороскопы. В принципе, не особо ошибся.
              Ответить
            • Я вообще до половины текста был уверен, что это что-то про оригами.

              А в конце решил, что это про фен-шуй и гороскопы. В принципе, не особо ошибся.
              Ответить
            • Я вообще до половины текста был уверен, что это что-то про оригами.

              А в конце решил, что это про фен-шуй и гороскопы. В принципе, не особо ошибся.
              Ответить
            • Я вообще до половины текста был уверен, что это что-то про оригами.

              А в конце решил, что это про фен-шуй и гороскопы. В принципе, не особо ошибся.
              Ответить
            • Я вообще до половины текста был уверен, что это что-то про оригами.

              А в конце решил, что это про фен-шуй и гороскопы. В принципе, не особо ошибся.
              Ответить
            • Я вообще до половины текста был уверен, что это что-то про оригами.

              А в конце решил, что это про фен-шуй и гороскопы. В принципе, не особо ошибся.
              Ответить
            • Я вообще до половины текста был уверен, что это что-то про оригами.

              А в конце решил, что это про фен-шуй и гороскопы. В принципе, не особо ошибся.
              Ответить
            • Я вообще до половины текста был уверен, что это что-то про оригами.

              А в конце решил, что это про фен-шуй и гороскопы. В принципе, не особо ошибся.
              Ответить
      • Зашёл на сайт, там предлагают японскими свечами побеждать на Форексе.

        Каково это, одну шизу лечить другой шизой?
        Ответить
      • > медвежий Харами — меняет восходящий тренд нисходящим

        Шёл медведь по бирже, видит свеча Харами. Сел на неё и сгорел.
        Ответить
    • а что не так?
      Византия действительно ассоциировалась с интригами обычно.
      Ответить
        • А к чему это тогда? Български език? Елда пукана?
          Ответить
          • Домашен гълъб – външно устройство
            На главата са разположени зрителните, слуховите и обонятелните сетивни органи. Като цяло зрението и слуха са отлично развити и особено при някои грабливи птици. Вместо уста, гълъбът притежават клюн, който при различните представители на класа се е видоизменил съобразно начина им на хранене.
            Ответить
            • хехе, это про голубя, тут к гадалке не ходи

              Если помнить, что "ъ" это такая гласная, то все становится понятно
              Ответить
          • Защо ме притесняваш, бом?

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

            Но я его в русском тексте встретил и, похоже, немного в другом значении
            Ответить
  • Блин, жёсткая у иксов архитектура.

    Закрытие окна по крестику убивает к хуям окно, коннект к Х серверу и саму прогу. И надо договариваться с window manager'ом чтобы он вместо этого кидал сообщение о закрытии...
    Ответить
    • А как бы ты хотел чтобы было? Чтобы закрытие всех окон приводило к висячему безоконному приложению?
      Ответить
      • Не всех, а любого из них. Тебе не возвращают код для остановки лупа, тебе не кидают ивентов. Просто window manager заставляет X убить коннект до твоей проги. А xlib внутри твоей проги на любую ошибку делает terminate.

        Не умеешь обрабатывать закрытие? Получи по яйцам.

        Видимо какой-то атавизм из древних времён когда window manager'ов ещё не было. Протокол общения с wm явно сбоку прикручен.
        Ответить
            • лол, одновременно написили, да)

              а ты прямо на xlib голом хуячеш? xcb не пробовал?
              Ответить
              • Дык xcb это ещё более голый интерфейс над иксовым протоколом. xlib сейчас поверх него навёрнут. И если у xlib дока просто хуёвая, то у xcb её почти нет. Ибо предполагается, что знаток спеки иксов и так всё поймёт.
                Ответить
                • ага, но она же более новая, не?

                  с документацией права был пиздец, когда я ее смотрел, собссно я потому и не асилил. Но может быть время прошло
                  Ответить
                  • Да, xcb более новая, шустрая и треды умеет.

                    На самом деле я теперь понимаю почему в вайланде просто выкинули всё, вообще всё нахуй. И поддержку шрифтов и доюникодный юникод и драйверы видюх и взаимодействие между окнами и сетевой транспорт... Остались только тупые shared memory дырки в которые можно рисовать.
                    Ответить
                    • да, в иксах очень много древнейшего говнища типа серверных шрифтов, дурацких селекшенов итд.

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

                      И совсем не охуенно в 2020, когда ты хочешь напрямую с видеопамятью работать и пр
                      Ответить
      • Для корректного закрытия ты должен опубликовать специальный атом в свойствах своего окна. Тогда wm увидит его, поймёт что ты умеешь закрывать окна и кинет тебе ивент вместо жёсткого дисконнекта.

        Какая расширяемость )))
        Ответить
        • Ну а как бы ты хотел? чтобы по умолчанию ничего не делалось?

          Это странно, учитывая то, что большинтво прилогух имеют один только рутвиндов
          Ответить
          • Ну хер знает, чтобы по-умолчанию такие простые вещи работали а не расширениями...

            Проги, которые крестик не умеют обрабатывать в общем-то уже с 89 года устаревшие, когда icccm внедрили.
            Ответить
            • ну вот смотри: я сделал тупую прогамму, она рисует квадратное окно, и всё.

              Я не хочу думать даже про ее интероп с WM, я не читал icccm, я макака.

              И вот кто-то жмет крестик, и она закрывается. Всё логично и правильно.

              Не?

              Кстати, крестик обрабатывает ведь не прога, а wm. Прога обрабаывает WM_DELETE, или не обрабатывает, лол
              Ответить
              • Ну она слишком жёстко закрывается, без шансов что-то переспросить или сохранить. Это как бы не совсем то, что я в 2020 году ожидаю от закрытия проги по крестику. WM мог бы хотя бы спросить действительно ли я хочу наебнуть прогу. Может быть я передумаю и выйду по-хорошему через менюшку.
                Ответить
                • WM может спросить, кто ему мешает?
                  Спросил, и послал WM_DELETE.

                  Но хорошие проги сами обрабатывают обычно (gvim, emacs итд).

                  А что сделает винда, если я WM_DESTROY все окна?
                  Ответить
                  • > кто ему мешает

                    Опенсурсный UX ему мешает. Пользователь знает что делает, все дела.

                    Ну у полноценных прог обычно тулкит какой-нибудь, а там всё обрабатывается.
                    Я только у мелочи типа glxgears и прочих туториалов помню ошибку при выходе.
                    Ответить
                    • да, без тулкитов даже кнопочки не нарисовать номральные.
                      Неземную красоту родных иксовых кнопарей можно увидеть запустить "$ xfontsel".


                      Ты не ответил про пинду.

                      WinMain , в нем циклл while (GetMessage)
                      В туда пришел WM_DESTROY

                      что случится?

                      Или ты о том, что завершение всё же будет корректное, а не просто сметь?
                      Ответить
                      • https://docs.microsoft.com/en-us/windows/win32/learnwin32/closing-the-window
                        The user can close an application window by clicking the Close button, or by
                        using a keyboard shortcut such as ALT+F4. Any of these actions causes the window
                        to receive a WM_CLOSE message. The WM_CLOSE message gives you an opportunity
                        to prompt the user before closing the window. If you really do want to close the window,
                        call the DestroyWindow function. Otherwise, simply return zero from the WM_CLOSE
                        message, and the operating system will ignore the message and not destroy the window.

                        WM_DESTROY шлётся когда окно уже исчезло.
                        Ответить
                      • > пришёл WM_DESTROY

                        Ну если окно последнее или единственное - прога кинет себе WM_QUIT и выйдет из лупа. В общем-то и всё.

                        Если луп нерабочий - винда предложит убить.

                        Вот кстати, если в иксах луп нерабочий аля типичный туториал со sleep(10) вместо лупа, то прога НЕ помрёт и продолжит висеть в памяти. Хотя окно закроется из-за дисконнекта, конечно.
                        Ответить
  • https://devblogs.microsoft.com/oldnewthing/20110322-00/?p=11163
    > Why is there the message '!Do not use this registry key' in the registry?
    [...] But it seems that some people need more than a nudge; they need a shove.
    Let’s see, we’re told that the functions for obtaining the locations of known folders
    are SH­Get­Folder­Path and its more modern counterpart SH­Get­Known­Folder­Path. I wonder
    what the names of the functions for modifying those locations might be? Man that’s a tough one.
    I’ll let you puzzle that out for a while. Okay, here, I’ll tell you: The corresponding functions go by
    the completely unobvious names SH­Set­Folder­Path and SH­Set­Known­Folder­Path.
    
    Sorry you had to use your brain. I’ll let you get back to programming now.

    Какой нахрюк )))
    Ответить
    • >registry key exists only to retain backward compatibility with four programs written in 1994.

      лал.

      Кстати, Чен охуенный, и книжка его The Old New Thing тоже
      Ответить
        • возможно, что это сторонее тяжлое энтерпрайзное говно за охулион доллаов, пераписать которое уже нереально: сырцов нет, и прогаммисты на пенсии
          Ответить
      • Кстати MS как всегда обосрался и не пофиксил ссылки в статьях 🙁
        Ответить
        • Ага, это самое уебанское в «MSDN». Каждые полгода перемещают все статьи на новые адреса без 301 со старых. Уебаны.
          Ответить
          • а вот в джанго так бы не получилось: там урлы не хордкодют
            Ответить
            • Они между разными CMS'ками судя по всему мигрируют эти странички, а не просто домен меняют. Поэтому никакая джанга не спасёт.

              Но блядь, можно ведь было записать что куда смигрировали и прочесать странички простеньким скриптом. Неужели даже джуна на такую работу не нашлось?
              Ответить
              • нахуя они это делают, если у них уже четверть века есть share point?

                Хуля блядь не сделать на своем собственном движке говно, и не автоматиизовать это?
                Ответить
                    • У них достаточно собак чтобы тестировать на них свою еду. Или я неправильно понимаю смысл догфудинга.
                      Ответить
                      • ну смотри: у тебя есть CMS. Ты его продаешь.
                        и он написан твоих технолгиях (.net, C#).

                        И тебе нужно сделать портал для документации и статей

                        Это ж ведь ровно то, для чего нужна CMS.
                        Вроде бы бери и делай, не?
                        Ответить
                        • Шарепоинт сильно специфическая штука для generic сайта, как мне кажется
                          Ответить
                          • так он не джерерик: он сайт с блогами и статьями.

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

                              Есть реальные примеры когда он в паблик работает?
                              Ответить
                              • а в чем разница между публичным и не публичным сайтом?

                                уж не хочешь ли ты сказать, что в шарепоинте есть дыры?
                                Ответить
                                • Х.з. там хоть дизайн можно поменять? Да и не особо шустрый он для паблика.
                                  Ответить
                                  • цвета и логотип точно можно, сам видел
                                    Ответить
                      • Хрюфундинг это когда чуваки скидываются на какой-нибудь нахрюк?
                        Ответить
                              • Я вам нахрюкала на хрюшку, прохрючьте, пожалуйста
                                Ответить
                                • Прохрючили, нахрюков не охрюкали. У нас всё хрюкает. Вы пробовали выхрюкать и снова захрюкать?
                                  Ответить
                                  • Хрюк нахрюк да не по нахрюковски. Надо его перехрюковать, отнахрюковать и вынахрюковать.
                                    Ответить
                                      • В тот хрюнь, когда ты мне прихрюлся,
                                        Я всё прихрюкала хрюма.
                                        На хрюмлю хрюхо отхрюмилась
                                        Хрюма, хрюма, хрюма
                                        Ответить
                                        • ебать, какое некро ты откопал
                                          Это год так это двухтыщный?
                                          Ответить
                                          • Двуххрюшечный

                                            Кто тогда из пацанов не мечтал ей [ДАННЫЕ УДАЛЕНЫ], а потом [УДАЛЕНЫ ДАННЫЕ] и сигаретку закурить.
                                            Ответить
                                                • ослу, конечно. Я даже погуглил специально.

                                                  Их каждого утюга же неслося, и из каждой дискатеки..
                                                  Ответить
                                                  • если ты про певицу, то у неё другой порядок бувк

                                                    хорошо устроилась кстати
                                                    Ответить
                                            • Если всхрюк оказался вдруг и не хрюк и не хряк, а так.
                                              Ответить
                                              • Разхрючавшись хрюкну со скалы,
                                                Вот я хрю и вот хрюна не стало.
                                                Ответить
                                                  • Косят хрюшки траву, хрюн-траву на поляне
                                                    И от страха все быстрее хрюкают хрю-хрю.
                                                    Ответить
                                                    • Обернусь я белой хрюшкой
                                                      Да в окошко ухрючу
                                                      Чтобы в ясно небо взхрюкнуть
                                                      К Солнца яркому хрючу
                                                      Ответить
                                                      • Тот, кто взял хрюки однажды в повелительные руки,
                                                        У того исчез навеки безмятежный свет очей,
                                                        Духи ада любят слушать эти царственные звуки,
                                                        Бродят бешеные волки по дороге поросей.
                                                        Ответить
                                                          • Я захрюкаюсь от хрюльности,
                                                            От твоей-моей питульности,
                                                            Я хрюльну все твои хрюкалки, ага-ага,
                                                            Вижжю твои-мои хрюсенки.

                                                            Хрю-хрю-хрю? Лааааааай-ла-лааааа!
                                                            Ответить
                                                            • Хрюкана река, глубока река,
                                                              Не хрюкнуть тебе с того бережка,
                                                              Хряки толстые прячут лунный свет,
                                                              Завижжать бы мне, да вот грязи нет.
                                                              Ответить
                                                              • В далёком сохрюкии Хряу-Хрюта,
                                                                Все стало для нас не хрюнятно,
                                                                Хрюгнал похрюкаем: "Вы хрю хрюли там?"
                                                                А нас похрюкают обратно.
                                                                Ответить
                                                              • Хрюк облака, плывущего над тундрой,
                                                                Хрюк птицы, пролетающей над тундрой,
                                                                И хрюк оленя, что бежит по тундре,
                                                                Перегоняют кабана в пути.
                                                                Ответить
                                                                • Кабы я была хрюльница, —
                                                                  Третья хрюкала сестрица, —
                                                                  Я б для батюшки Царя
                                                                  Нахрюкала б на птушников.
                                                                  Ответить
                                                                  • Не прихрючно ли будет нам, хряки,
                                                                    Начать древним хрюком
                                                                    Печальный нахрюк о хрюках Игоря,
                                                                    Игоря Святохрюковича!
                                                                    Ответить
                                                                    • Опять нахрюк, опять хрю-хрю,
                                                                      Снова выход на бис.
                                                                      Лежит в грязи веретено
                                                                      За чертою кулис.
                                                                      Ответить
                                                                        • Хрюкнет за горой грязный замок мой.
                                                                          Душу мучает порой царящий в нем покой.
                                                                          Я своих нахрюков страждущий герой,
                                                                          А любви моей живой все образы со мной.

                                                                          Я часто слышу хрюк в смотрящих на меня рылах.
                                                                          Им суждено уснуть в моих стенах,
                                                                          Застыть в моих грязях.

                                                                          Но сердце от грязи горит, моя душа болит,
                                                                          И грязевых фигур прекрасен вид —
                                                                          Нахрюк везде царит!
                                                                          Ответить
                                                                          • Я хрюкнуть пытался:
                                                                            Чудовищ нет на земле.
                                                                            Но тут же раздался
                                                                            Нахрюк зловещий во тьме:

                                                                            Мне больно хрюкать в белый свет,
                                                                            Мне лучше хрюкать в темноте.
                                                                            Я очень много-много лет
                                                                            Прохрюкал только о еде.
                                                                            Ответить
                                                                  • Кабы я была хрюльница, —
                                                                    Третья хрюкала сестрица, —
                                                                    Я б для батюшки Царя
                                                                    Нахрюкала б на птушников.
                                                                    Ответить
                                                                  • Кабы я была хрюльница, —
                                                                    Третья хрюкала сестрица, —
                                                                    Я б для батюшки Царя
                                                                    Нахрюкала б на птушников.
                                                                    Ответить
                                                                  • Кабы я была хрюльница, —
                                                                    Третья хрюкала сестрица, —
                                                                    Я б для батюшки Царя
                                                                    Нахрюкала б на птушников.
                                                                    Ответить
                                                                  • Кабы я была хрюльница, —
                                                                    Третья хрюкала сестрица, —
                                                                    Я б для батюшки Царя
                                                                    Нахрюкала б на птушников.
                                                                    Ответить
                                                                  • Кабы я была хрюльница, —
                                                                    Третья хрюкала сестрица, —
                                                                    Я б для батюшки Царя
                                                                    Нахрюкала б на птушников.
                                                                    Ответить
                                                                  • Кабы я была хрюльница, —
                                                                    Третья хрюкала сестрица, —
                                                                    Я б для батюшки Царя
                                                                    Нахрюкала б на птушников.
                                                                    Ответить
                                                                  • Кабы я была хрюльница, —
                                                                    Третья хрюкала сестрица, —
                                                                    Я б для батюшки Царя
                                                                    Нахрюкала б на птушников.
                                                                    Ответить
                                                                  • Кабы я была хрюльница, —
                                                                    Третья хрюкала сестрица, —
                                                                    Я б для батюшки Царя
                                                                    Нахрюкала б на птушников.
                                                                    Ответить
                                                                  • Кабы я была хрюльница, —
                                                                    Третья хрюкала сестрица, —
                                                                    Я б для батюшки Царя
                                                                    Нахрюкала б на птушников.
                                                                    Ответить
                                                                  • Кабы я была хрюльница, —
                                                                    Третья хрюкала сестрица, —
                                                                    Я б для батюшки Царя
                                                                    Нахрюкала б на птушников.
                                                                    Ответить
                                                                  • Кабы я была хрюльница, —
                                                                    Третья хрюкала сестрица, —
                                                                    Я б для батюшки Царя
                                                                    Нахрюкала б на птушников.
                                                                    Ответить
                                                                  • Кабы я была хрюльница, —
                                                                    Третья хрюкала сестрица, —
                                                                    Я б для батюшки Царя
                                                                    Нахрюкала б на птушников.
                                                                    Ответить
                                                                  • Кабы я была хрюльница, —
                                                                    Третья хрюкала сестрица, —
                                                                    Я б для батюшки Царя
                                                                    Нахрюкала б на птушников.
                                                                    Ответить
                                                                  • Кабы я была хрюльница, —
                                                                    Третья хрюкала сестрица, —
                                                                    Я б для батюшки Царя
                                                                    Нахрюкала б на птушников.
                                                                    Ответить
                                                                  • Кабы я была хрюльница, —
                                                                    Третья хрюкала сестрица, —
                                                                    Я б для батюшки Царя
                                                                    Нахрюкала б на птушников.
                                                                    Ответить
                                                                  • Кабы я была хрюльница, —
                                                                    Третья хрюкала сестрица, —
                                                                    Я б для батюшки Царя
                                                                    Нахрюкала б на птушников.
                                                                    Ответить
                                                                  • Кабы я была хрюльница, —
                                                                    Третья хрюкала сестрица, —
                                                                    Я б для батюшки Царя
                                                                    Нахрюкала б на птушников.
                                                                    Ответить
                                                                  • Кабы я была хрюльница, —
                                                                    Третья хрюкала сестрица, —
                                                                    Я б для батюшки Царя
                                                                    Нахрюкала б на птушников.
                                                                    Ответить
                                                                  • Кабы я была хрюльница, —
                                                                    Третья хрюкала сестрица, —
                                                                    Я б для батюшки Царя
                                                                    Нахрюкала б на птушников.
                                                                    Ответить
                                                                  • Кабы я была хрюльница, —
                                                                    Третья хрюкала сестрица, —
                                                                    Я б для батюшки Царя
                                                                    Нахрюкала б на птушников.
                                                                    Ответить
                                                                  • Кабы я была хрюльница, —
                                                                    Третья хрюкала сестрица, —
                                                                    Я б для батюшки Царя
                                                                    Нахрюкала б на птушников.
                                                                    Ответить
                                                                  • Кабы я была хрюльница, —
                                                                    Третья хрюкала сестрица, —
                                                                    Я б для батюшки Царя
                                                                    Нахрюкала б на птушников.
                                                                    Ответить
                                                                  • Кабы я была хрюльница, —
                                                                    Третья хрюкала сестрица, —
                                                                    Я б для батюшки Царя
                                                                    Нахрюкала б на птушников.
                                                                    Ответить
                                                                  • Кабы я была хрюльница, —
                                                                    Третья хрюкала сестрица, —
                                                                    Я б для батюшки Царя
                                                                    Нахрюкала б на птушников.
                                                                    Ответить
                                                                  • Кабы я была хрюльница, —
                                                                    Третья хрюкала сестрица, —
                                                                    Я б для батюшки Царя
                                                                    Нахрюкала б на птушников.
                                                                    Ответить
                                                          • > На заре хрюканье зовёт меня

                                                            Кстати, Олег Заурович Парастаев умер недавно.
                                                            Ответить
                                        • В тот хрюнь, когда ты мне прихрюлся,
                                          Я всё прихрюкала хрюма.
                                          На хрюмлю хрюхо отхрюмилась
                                          Хрюма, хрюма, хрюма
                                          Ответить
                                          • В тот хрюнь, когда ты мне прихрюлся,
                                            Я всё прихрюкала хрюма.
                                            На хрюмлю хрюхо отхрюмилась
                                            Хрюма, хрюма, хрюма
                                            Ответить
                                          • В тот хрюнь, когда ты мне прихрюлся,
                                            Я всё прихрюкала хрюма.
                                            На хрюмлю хрюхо отхрюмилась
                                            Хрюма, хрюма, хрюма
                                            Ответить
                                          • В тот хрюнь, когда ты мне прихрюлся,
                                            Я всё прихрюкала хрюма.
                                            На хрюмлю хрюхо отхрюмилась
                                            Хрюма, хрюма, хрюма
                                            Ответить
                                          • В тот хрюнь, когда ты мне прихрюлся,
                                            Я всё прихрюкала хрюма.
                                            На хрюмлю хрюхо отхрюмилась
                                            Хрюма, хрюма, хрюма
                                            Ответить
                                          • В тот хрюнь, когда ты мне прихрюлся,
                                            Я всё прихрюкала хрюма.
                                            На хрюмлю хрюхо отхрюмилась
                                            Хрюма, хрюма, хрюма
                                            Ответить
                                          • В тот хрюнь, когда ты мне прихрюлся,
                                            Я всё прихрюкала хрюма.
                                            На хрюмлю хрюхо отхрюмилась
                                            Хрюма, хрюма, хрюма
                                            Ответить
                                          • В тот хрюнь, когда ты мне прихрюлся,
                                            Я всё прихрюкала хрюма.
                                            На хрюмлю хрюхо отхрюмилась
                                            Хрюма, хрюма, хрюма
                                            Ответить
                                          • В тот хрюнь, когда ты мне прихрюлся,
                                            Я всё прихрюкала хрюма.
                                            На хрюмлю хрюхо отхрюмилась
                                            Хрюма, хрюма, хрюма
                                            Ответить
                                          • В тот хрюнь, когда ты мне прихрюлся,
                                            Я всё прихрюкала хрюма.
                                            На хрюмлю хрюхо отхрюмилась
                                            Хрюма, хрюма, хрюма
                                            Ответить
                                          • В тот хрюнь, когда ты мне прихрюлся,
                                            Я всё прихрюкала хрюма.
                                            На хрюмлю хрюхо отхрюмилась
                                            Хрюма, хрюма, хрюма
                                            Ответить
                                          • В тот хрюнь, когда ты мне прихрюлся,
                                            Я всё прихрюкала хрюма.
                                            На хрюмлю хрюхо отхрюмилась
                                            Хрюма, хрюма, хрюма
                                            Ответить
                                          • В тот хрюнь, когда ты мне прихрюлся,
                                            Я всё прихрюкала хрюма.
                                            На хрюмлю хрюхо отхрюмилась
                                            Хрюма, хрюма, хрюма
                                            Ответить
                                          • В тот хрюнь, когда ты мне прихрюлся,
                                            Я всё прихрюкала хрюма.
                                            На хрюмлю хрюхо отхрюмилась
                                            Хрюма, хрюма, хрюма
                                            Ответить
                                          • В тот хрюнь, когда ты мне прихрюлся,
                                            Я всё прихрюкала хрюма.
                                            На хрюмлю хрюхо отхрюмилась
                                            Хрюма, хрюма, хрюма
                                            Ответить
                                          • В тот хрюнь, когда ты мне прихрюлся,
                                            Я всё прихрюкала хрюма.
                                            На хрюмлю хрюхо отхрюмилась
                                            Хрюма, хрюма, хрюма
                                            Ответить
                                          • В тот хрюнь, когда ты мне прихрюлся,
                                            Я всё прихрюкала хрюма.
                                            На хрюмлю хрюхо отхрюмилась
                                            Хрюма, хрюма, хрюма
                                            Ответить
                                          • В тот хрюнь, когда ты мне прихрюлся,
                                            Я всё прихрюкала хрюма.
                                            На хрюмлю хрюхо отхрюмилась
                                            Хрюма, хрюма, хрюма
                                            Ответить
                                          • В тот хрюнь, когда ты мне прихрюлся,
                                            Я всё прихрюкала хрюма.
                                            На хрюмлю хрюхо отхрюмилась
                                            Хрюма, хрюма, хрюма
                                            Ответить
                                          • В тот хрюнь, когда ты мне прихрюлся,
                                            Я всё прихрюкала хрюма.
                                            На хрюмлю хрюхо отхрюмилась
                                            Хрюма, хрюма, хрюма
                                            Ответить
                                          • В тот хрюнь, когда ты мне прихрюлся,
                                            Я всё прихрюкала хрюма.
                                            На хрюмлю хрюхо отхрюмилась
                                            Хрюма, хрюма, хрюма
                                            Ответить
                                          • В тот хрюнь, когда ты мне прихрюлся,
                                            Я всё прихрюкала хрюма.
                                            На хрюмлю хрюхо отхрюмилась
                                            Хрюма, хрюма, хрюма
                                            Ответить
                                          • В тот хрюнь, когда ты мне прихрюлся,
                                            Я всё прихрюкала хрюма.
                                            На хрюмлю хрюхо отхрюмилась
                                            Хрюма, хрюма, хрюма
                                            Ответить
                                          • В тот хрюнь, когда ты мне прихрюлся,
                                            Я всё прихрюкала хрюма.
                                            На хрюмлю хрюхо отхрюмилась
                                            Хрюма, хрюма, хрюма
                                            Ответить
                                          • В тот хрюнь, когда ты мне прихрюлся,
                                            Я всё прихрюкала хрюма.
                                            На хрюмлю хрюхо отхрюмилась
                                            Хрюма, хрюма, хрюма
                                            Ответить
                                          • В тот хрюнь, когда ты мне прихрюлся,
                                            Я всё прихрюкала хрюма.
                                            На хрюмлю хрюхо отхрюмилась
                                            Хрюма, хрюма, хрюма
                                            Ответить
                                        • В тот хрюнь, когда ты мне прихрюлся,
                                          Я всё прихрюкала хрюма.
                                          На хрюмлю хрюхо отхрюмилась
                                          Хрюма, хрюма, хрюма
                                          Ответить
                                        • В тот хрюнь, когда ты мне прихрюлся,
                                          Я всё прихрюкала хрюма.
                                          На хрюмлю хрюхо отхрюмилась
                                          Хрюма, хрюма, хрюма
                                          Ответить
                                        • В тот хрюнь, когда ты мне прихрюлся,
                                          Я всё прихрюкала хрюма.
                                          На хрюмлю хрюхо отхрюмилась
                                          Хрюма, хрюма, хрюма
                                          Ответить
                                        • В тот хрюнь, когда ты мне прихрюлся,
                                          Я всё прихрюкала хрюма.
                                          На хрюмлю хрюхо отхрюмилась
                                          Хрюма, хрюма, хрюма
                                          Ответить
                                        • В тот хрюнь, когда ты мне прихрюлся,
                                          Я всё прихрюкала хрюма.
                                          На хрюмлю хрюхо отхрюмилась
                                          Хрюма, хрюма, хрюма
                                          Ответить
                                        • В тот хрюнь, когда ты мне прихрюлся,
                                          Я всё прихрюкала хрюма.
                                          На хрюмлю хрюхо отхрюмилась
                                          Хрюма, хрюма, хрюма
                                          Ответить
                                        • В тот хрюнь, когда ты мне прихрюлся,
                                          Я всё прихрюкала хрюма.
                                          На хрюмлю хрюхо отхрюмилась
                                          Хрюма, хрюма, хрюма
                                          Ответить
                                        • В тот хрюнь, когда ты мне прихрюлся,
                                          Я всё прихрюкала хрюма.
                                          На хрюмлю хрюхо отхрюмилась
                                          Хрюма, хрюма, хрюма
                                          Ответить
                                        • В тот хрюнь, когда ты мне прихрюлся,
                                          Я всё прихрюкала хрюма.
                                          На хрюмлю хрюхо отхрюмилась
                                          Хрюма, хрюма, хрюма
                                          Ответить
              • Старая ссылка была:
                http://blogs.msdn.com/oldnewthing/archive/2003/11/03/55532.aspx

                Новая такая:
                https://devblogs.microsoft.com/oldnewthing/20031103-00/?p=41973

                Если убрать p=41973, то есть сделать ссылку такой:
                https://devblogs.microsoft.com/oldnewthing/20031103-00
                , то откроется не сама статья, а её превью.

                Сделать редирект было бы несложно, но у них почему-то проебался изначальный айдишник 55532 и вместо него теперь 00. Откуда взялся айдишник 41973, вообще большая загадка.
                Ответить
    • > Услуги детектива по проверке партнёра на измену
      Пиздец у кого-то нездоровые отношения… Нахуй так жить?
      Ответить
      • Когда вас любят -- ревновать глупо.
        Когда не любят -- бессмыслено. (c)
        Ответить
      • Услуги детектива по проверке партнёра на измену
        Пиздец у кого-то нездоровые отношения… Нахуй так жить?
        Ответить
      • Услуги детектива по проверке партнёра на измену
        Пиздец у кого-то нездоровые отношения… Нахуй так жить?
        Ответить
      • Услуги детектива по проверке партнёра на измену
        Пиздец у кого-то нездоровые отношения… Нахуй так жить?
        Ответить
        • Услуги детектива по проверке партнёра на измену
          Пиздец у кого-то нездоровые отношения… Нахуй так жить?
          Ответить
          • Услуги детектива по проверке партнёра на измену
            Пиздец у кого-то нездоровые отношения… Нахуй так жить?
            Ответить
          • Услуги детектива по проверке партнёра на измену
            Пиздец у кого-то нездоровые отношения… Нахуй так жить?
            Ответить
          • Услуги детектива по проверке партнёра на измену
            Пиздец у кого-то нездоровые отношения… Нахуй так жить?
            Ответить
          • Услуги детектива по проверке партнёра на измену
            Пиздец у кого-то нездоровые отношения… Нахуй так жить?
            Ответить
            • Услуги детектива по проверке партнёра на измену
              Пиздец у кого-то нездоровые отношения… Нахуй так жить?
              Ответить
            • Услуги детектива по проверке партнёра на измену
              Пиздец у кого-то нездоровые отношения… Нахуй так жить?
              Ответить
            • Услуги детектива по проверке партнёра на измену
              Пиздец у кого-то нездоровые отношения… Нахуй так жить?
              Ответить
            • Услуги детектива по проверке партнёра на измену
              Пиздец у кого-то нездоровые отношения… Нахуй так жить?
              Ответить
            • Услуги детектива по проверке партнёра на измену
              Пиздец у кого-то нездоровые отношения… Нахуй так жить?
              Ответить
            • Услуги детектива по проверке партнёра на измену
              Пиздец у кого-то нездоровые отношения… Нахуй так жить?
              Ответить
            • Услуги детектива по проверке партнёра на измену
              Пиздец у кого-то нездоровые отношения… Нахуй так жить?
              Ответить
            • Услуги детектива по проверке партнёра на измену
              Пиздец у кого-то нездоровые отношения… Нахуй так жить?
              Ответить
            • Услуги детектива по проверке партнёра на измену
              Пиздец у кого-то нездоровые отношения… Нахуй так жить?
              Ответить
            • Услуги детектива по проверке партнёра на измену
              Пиздец у кого-то нездоровые отношения… Нахуй так жить?
              Ответить
            • Услуги детектива по проверке партнёра на измену
              Пиздец у кого-то нездоровые отношения… Нахуй так жить?
              Ответить
            • Услуги детектива по проверке партнёра на измену
              Пиздец у кого-то нездоровые отношения… Нахуй так жить?
              Ответить
            • Услуги детектива по проверке партнёра на измену
              Пиздец у кого-то нездоровые отношения… Нахуй так жить?
              Ответить
            • Услуги детектива по проверке партнёра на измену
              Пиздец у кого-то нездоровые отношения… Нахуй так жить?
              Ответить
            • Услуги детектива по проверке партнёра на измену
              Пиздец у кого-то нездоровые отношения… Нахуй так жить?
              Ответить
            • Услуги детектива по проверке партнёра на измену
              Пиздец у кого-то нездоровые отношения… Нахуй так жить?
              Ответить
            • Услуги детектива по проверке партнёра на измену
              Пиздец у кого-то нездоровые отношения… Нахуй так жить?
              Ответить
            • Услуги детектива по проверке партнёра на измену
              Пиздец у кого-то нездоровые отношения… Нахуй так жить?
              Ответить
            • Услуги детектива по проверке партнёра на измену
              Пиздец у кого-то нездоровые отношения… Нахуй так жить?
              Ответить
            • Услуги детектива по проверке партнёра на измену
              Пиздец у кого-то нездоровые отношения… Нахуй так жить?
              Ответить
            • Услуги детектива по проверке партнёра на измену
              Пиздец у кого-то нездоровые отношения… Нахуй так жить?
              Ответить
            • Услуги детектива по проверке партнёра на измену
              Пиздец у кого-то нездоровые отношения… Нахуй так жить?
              Ответить
            • Услуги детектива по проверке партнёра на измену
              Пиздец у кого-то нездоровые отношения… Нахуй так жить?
              Ответить
            • Услуги детектива по проверке партнёра на измену
              Пиздец у кого-то нездоровые отношения… Нахуй так жить?
              Ответить
            • Услуги детектива по проверке партнёра на измену
              Пиздец у кого-то нездоровые отношения… Нахуй так жить?
              Ответить
          • Услуги детектива по проверке партнёра на измену
            Пиздец у кого-то нездоровые отношения… Нахуй так жить?
            Ответить
          • Услуги детектива по проверке партнёра на измену
            Пиздец у кого-то нездоровые отношения… Нахуй так жить?
            Ответить
          • Услуги детектива по проверке партнёра на измену
            Пиздец у кого-то нездоровые отношения… Нахуй так жить?
            Ответить
          • Услуги детектива по проверке партнёра на измену
            Пиздец у кого-то нездоровые отношения… Нахуй так жить?
            Ответить
          • Услуги детектива по проверке партнёра на измену
            Пиздец у кого-то нездоровые отношения… Нахуй так жить?
            Ответить
          • Услуги детектива по проверке партнёра на измену
            Пиздец у кого-то нездоровые отношения… Нахуй так жить?
            Ответить
        • Услуги детектива по проверке партнёра на измену
          Пиздец у кого-то нездоровые отношения… Нахуй так жить?
          Ответить
        • Услуги детектива по проверке партнёра на измену
          Пиздец у кого-то нездоровые отношения… Нахуй так жить?
          Ответить
        • Услуги детектива по проверке партнёра на измену
          Пиздец у кого-то нездоровые отношения… Нахуй так жить?
          Ответить
        • Услуги детектива по проверке партнёра на измену
          Пиздец у кого-то нездоровые отношения… Нахуй так жить?
          Ответить
        • Услуги детектива по проверке партнёра на измену
          Пиздец у кого-то нездоровые отношения… Нахуй так жить?
          Ответить
        • Услуги детектива по проверке партнёра на измену
          Пиздец у кого-то нездоровые отношения… Нахуй так жить?
          Ответить
        • Услуги детектива по проверке партнёра на измену
          Пиздец у кого-то нездоровые отношения… Нахуй так жить?
          Ответить
        • Услуги детектива по проверке партнёра на измену
          Пиздец у кого-то нездоровые отношения… Нахуй так жить?
          Ответить
        • Услуги детектива по проверке партнёра на измену
          Пиздец у кого-то нездоровые отношения… Нахуй так жить?
          Ответить
      • Услуги детектива по проверке партнёра на измену
        Пиздец у кого-то нездоровые отношения… Нахуй так жить?
        Ответить
      • Услуги детектива по проверке партнёра на измену
        Пиздец у кого-то нездоровые отношения… Нахуй так жить?
        Ответить
        • Услуги детектива по проверке партнёра на измену
          Пиздец у кого-то нездоровые отношения… Нахуй так жить?
          Ответить
        • Услуги детектива по проверке партнёра на измену
          Пиздец у кого-то нездоровые отношения… Нахуй так жить?
          Ответить
        • Услуги детектива по проверке партнёра на измену
          Пиздец у кого-то нездоровые отношения… Нахуй так жить?
          Ответить
        • Услуги детектива по проверке партнёра на измену
          Пиздец у кого-то нездоровые отношения… Нахуй так жить?
          Ответить
        • Услуги детектива по проверке партнёра на измену
          Пиздец у кого-то нездоровые отношения… Нахуй так жить?
          Ответить
        • Услуги детектива по проверке партнёра на измену
          Пиздец у кого-то нездоровые отношения… Нахуй так жить?
          Ответить
        • Услуги детектива по проверке партнёра на измену
          Пиздец у кого-то нездоровые отношения… Нахуй так жить?
          Ответить
        • Услуги детектива по проверке партнёра на измену
          Пиздец у кого-то нездоровые отношения… Нахуй так жить?
          Ответить
        • Услуги детектива по проверке партнёра на измену
          Пиздец у кого-то нездоровые отношения… Нахуй так жить?
          Ответить
        • Услуги детектива по проверке партнёра на измену
          Пиздец у кого-то нездоровые отношения… Нахуй так жить?
          Ответить
        • Услуги детектива по проверке партнёра на измену
          Пиздец у кого-то нездоровые отношения… Нахуй так жить?
          Ответить
        • Услуги детектива по проверке партнёра на измену
          Пиздец у кого-то нездоровые отношения… Нахуй так жить?
          Ответить
        • Услуги детектива по проверке партнёра на измену
          Пиздец у кого-то нездоровые отношения… Нахуй так жить?
          Ответить
        • Услуги детектива по проверке партнёра на измену
          Пиздец у кого-то нездоровые отношения… Нахуй так жить?
          Ответить
        • Услуги детектива по проверке партнёра на измену
          Пиздец у кого-то нездоровые отношения… Нахуй так жить?
          Ответить
        • Услуги детектива по проверке партнёра на измену
          Пиздец у кого-то нездоровые отношения… Нахуй так жить?
          Ответить
        • Услуги детектива по проверке партнёра на измену
          Пиздец у кого-то нездоровые отношения… Нахуй так жить?
          Ответить
        • Услуги детектива по проверке партнёра на измену
          Пиздец у кого-то нездоровые отношения… Нахуй так жить?
          Ответить
        • Услуги детектива по проверке партнёра на измену
          Пиздец у кого-то нездоровые отношения… Нахуй так жить?
          Ответить
        • Услуги детектива по проверке партнёра на измену
          Пиздец у кого-то нездоровые отношения… Нахуй так жить?
          Ответить
        • Услуги детектива по проверке партнёра на измену
          Пиздец у кого-то нездоровые отношения… Нахуй так жить?
          Ответить
        • Услуги детектива по проверке партнёра на измену
          Пиздец у кого-то нездоровые отношения… Нахуй так жить?
          Ответить
        • Услуги детектива по проверке партнёра на измену
          Пиздец у кого-то нездоровые отношения… Нахуй так жить?
          Ответить
        • Услуги детектива по проверке партнёра на измену
          Пиздец у кого-то нездоровые отношения… Нахуй так жить?
          Ответить
        • Услуги детектива по проверке партнёра на измену
          Пиздец у кого-то нездоровые отношения… Нахуй так жить?
          Ответить
      • Услуги детектива по проверке партнёра на измену
        Пиздец у кого-то нездоровые отношения… Нахуй так жить?
        Ответить
      • Услуги детектива по проверке партнёра на измену
        Пиздец у кого-то нездоровые отношения… Нахуй так жить?
        Ответить
        • Услуги детектива по проверке партнёра на измену
          Пиздец у кого-то нездоровые отношения… Нахуй так жить?
          Ответить
        • Услуги детектива по проверке партнёра на измену
          Пиздец у кого-то нездоровые отношения… Нахуй так жить?
          Ответить
        • Услуги детектива по проверке партнёра на измену
          Пиздец у кого-то нездоровые отношения… Нахуй так жить?
          Ответить
        • Услуги детектива по проверке партнёра на измену
          Пиздец у кого-то нездоровые отношения… Нахуй так жить?
          Ответить
        • Услуги детектива по проверке партнёра на измену
          Пиздец у кого-то нездоровые отношения… Нахуй так жить?
          Ответить
        • Услуги детектива по проверке партнёра на измену
          Пиздец у кого-то нездоровые отношения… Нахуй так жить?
          Ответить
        • Услуги детектива по проверке партнёра на измену
          Пиздец у кого-то нездоровые отношения… Нахуй так жить?
          Ответить
        • Услуги детектива по проверке партнёра на измену
          Пиздец у кого-то нездоровые отношения… Нахуй так жить?
          Ответить
        • Услуги детектива по проверке партнёра на измену
          Пиздец у кого-то нездоровые отношения… Нахуй так жить?
          Ответить
        • Услуги детектива по проверке партнёра на измену
          Пиздец у кого-то нездоровые отношения… Нахуй так жить?
          Ответить
        • Услуги детектива по проверке партнёра на измену
          Пиздец у кого-то нездоровые отношения… Нахуй так жить?
          Ответить
        • Услуги детектива по проверке партнёра на измену
          Пиздец у кого-то нездоровые отношения… Нахуй так жить?
          Ответить
        • Услуги детектива по проверке партнёра на измену
          Пиздец у кого-то нездоровые отношения… Нахуй так жить?
          Ответить
        • Услуги детектива по проверке партнёра на измену
          Пиздец у кого-то нездоровые отношения… Нахуй так жить?
          Ответить
        • Услуги детектива по проверке партнёра на измену
          Пиздец у кого-то нездоровые отношения… Нахуй так жить?
          Ответить
        • Услуги детектива по проверке партнёра на измену
          Пиздец у кого-то нездоровые отношения… Нахуй так жить?
          Ответить
        • Услуги детектива по проверке партнёра на измену
          Пиздец у кого-то нездоровые отношения… Нахуй так жить?
          Ответить
        • Услуги детектива по проверке партнёра на измену
          Пиздец у кого-то нездоровые отношения… Нахуй так жить?
          Ответить
        • Услуги детектива по проверке партнёра на измену
          Пиздец у кого-то нездоровые отношения… Нахуй так жить?
          Ответить
        • Услуги детектива по проверке партнёра на измену
          Пиздец у кого-то нездоровые отношения… Нахуй так жить?
          Ответить
        • Услуги детектива по проверке партнёра на измену
          Пиздец у кого-то нездоровые отношения… Нахуй так жить?
          Ответить
        • Услуги детектива по проверке партнёра на измену
          Пиздец у кого-то нездоровые отношения… Нахуй так жить?
          Ответить
        • Услуги детектива по проверке партнёра на измену
          Пиздец у кого-то нездоровые отношения… Нахуй так жить?
          Ответить
        • Услуги детектива по проверке партнёра на измену
          Пиздец у кого-то нездоровые отношения… Нахуй так жить?
          Ответить
        • Услуги детектива по проверке партнёра на измену
          Пиздец у кого-то нездоровые отношения… Нахуй так жить?
          Ответить
      • Услуги детектива по проверке партнёра на измену
        Пиздец у кого-то нездоровые отношения… Нахуй так жить?
        Ответить
      • Услуги детектива по проверке партнёра на измену
        Пиздец у кого-то нездоровые отношения… Нахуй так жить?
        Ответить
      • Услуги детектива по проверке партнёра на измену
        Пиздец у кого-то нездоровые отношения… Нахуй так жить?
        Ответить
    • хм, я думал это много дороже стоит. Это же надо реально таскаться за человеком неделю, или иметь подвязки у сотоператора, чтобы заполучить список звонков, или там комп ломать и читать переписку..

      и сраные 5К
      Ответить
      • Я чот не думаю, что реальный частный детектив будет свой профайл выкладывать на Яндексе.
        Ответить
        • а, тогда это должно работать так:


          "чувак, твоя жена платит мне 5К чтоб я тебя провеил. Или ты даешь мне 10К, или я говорю ей, что ты спишь с ее сестрой"
          Ответить
          • А фотографии в фотошопе конечно же сделает

            Главное потом распечатать на газетной бумаге, чтобы никто не заметил подвоха
            Ответить
            • Если человек нанимает детектива, чтобы следить за супругом, значит он на 99% уверен, что рогат.

              А если ты в чем-то уверен, то ты не будешь очень критичен к пруфам.
              Ответить
              • Тогда цена оправдана.

                1% уверенности стоит 5K.

                Если ты вообще думаешь, что твой партнёр ни капли в рот ни сантиметра в жопу, то цена будет за 100% уверенности, а это уже 500K
                Ответить
            • > фотографии
              Ну чо ты сразу начинаешь, уважаемый же человек работал, как можно не доверять!
              Ответить
    • Поиск человека по номеру телефона
      Отследить абонента по его передвижению и где находится
      Поиск человека по номеру телефона
      15 000 ₽
      
      Пробить человека по базе данных
      5 000 ₽

      Так, минуточку, а с каких пор у нас в России законом разрешено пробивать людей по базе данных и отслеживать передвижения по номеру телефона?
      Ответить
    • А ты кстати чо, решил свою подругу неслучившуюся на измену пробить что ли?
      Ответить
      • Нет, я просто искал по номеру телефона в поиске, выпала ссылка на услугах, а в рекомендациях вот это.

        А подруга мне подробно расписала что ей не нравится, вернее пыталась, но сама запуталась )
        Ответить
        • > подробно расписала что ей не нравится

          У вас там прям ревью. Будешь баги фиксить или забьёшь?
          Ответить
          • Ну а хуле? Если не вышло, то почему бы не попытаться узнать почему. А её баги уже не мне фиксить.
            Ответить
  • На Берлинском кинофестивале больше не будет наград за лучшую мужскую и женскую роль

    Организаторы упразднили гендерное разделение приза. Вместо этого будут присуждаться «Серебряный медведь» за лучшую главную роль и «Серебряный медведь» за лучшую роль второго плана, — сообщает «Интерфакс». Ожидается, что в следующем году Берлинале пройдет в традиционном формате.
    Ответить
  • Перекатный петух обновлён.
    1. Добавлен пропущенный пятый оффтоп;
    2. Добавлен «Хрюкни»;
    3. Исправлена ошибка, которая могла привести к дублированию перекатов: теперь одновременно может быть запущен только один инстанс перекатного петуха.

    Изменения (в том числе ручная правка БД) не тестировались, нужно будет проверять.
    Ответить
    • Блядь, оказывается, 15-го августа перекатный петух завис и нихуя не проверял. Ненавижу делать надёжные приложения, которым нужно активно стучаться в сеть.
      Ответить
        • Это правильно.
          У меня когда программы глючат, я всегда добавляю им sleep(4). Обычно помогает...
          Ответить
        • Почему по умолчанию их нет? Именно поэтому я за «PHP».
          Ответить
          • Решили не решать за пользователя, наверное.

            You can tell Requests to stop waiting for a response after a given number
            of seconds with the timeout parameter. Nearly all production code should
            use this parameter in nearly all requests. Failure to do so can cause your
            program to hang indefinitely

            Какой багор )))
            Ответить
            • Интересно как они умудрились навечно повешаться. У сокетов же таймауты. Да и хттп сервер тебя тоже не будет вечно ждать.
              Ответить
      • > надёжные приложения, которым нужно активно стучаться в сеть

        Именно поэтому я за супервизоров, которые следят за супервизорами супервизоров.
        Ответить
        • Блядь, не поможет. Три четверти кода перекатного петуха — это разные проверки на ошибки сети и ошибки удалённых хостов, которые надо внятно обработать и не проебаться.
          Ответить
            • Потому что перекатный петух должен быть надёжным и корректно обрабатывать аварийные ситуации. Я не хочу проебать проверку какого-нибудь поля и на следующий день обнаружить просранный 100к гет.
              Ответить
              • Псевдокот
                while True:
                
                try: 
                    connect()
                    send()
                    hue()
                    moe()
                except govno as NetworkException:
                    log.err(govno)
                   sleep(10)
                Ответить
                • send() публикует новый пост на ГК, в hue() происходит исключение, moe() не записывает изменения в БД, на следующей итерации всё повторяется, в результате ГК полностью засран потерянными оффтопами.

                  UPD: Ну и мне надо в логи записывать, что проебалось. А то будет приятная отладка.
                  Ответить
                  • t = create_transaction()
                        connect(t)
                        send(t)
                        hue(t)
                        moe(t)
                        t.commit()


                    правда, в базу нужно писать ДО того, как ты чото обубликовал
                    Ответить
                    • Что ты этим решил? Точно так же исключение в hue(t) откатит транзакцию, и в результате пост на ГК будет, а в БД — нет.
                      Ответить
                      • >правда, в базу нужно писать ДО того, как ты чото обубликовал

                        Далее либо ты опубликовал пост, и закоммтил базу, либо не опубликовал его, и ролбечнул транзакцию, не?
                        Ответить
                        • А, так не получится же. ID поста с ГК придёт только ПОСЛЕ его публикации, а без него в БД положить ничего нельзя.
                          Ответить
                          • Тогда сделай queue задач, да хоть в той же базе.

                            Пусть у тебя лежит объект "sync", который в фоновом режиме переводят в следующее состояние. Если не получилось -- то снова попробую итд.

                            Это в enterprise integration patterns описина
                            https://www.enterpriseintegrationpatterns.com/
                            Ответить
                            • Ну и будешь снова и снова постить.

                              Либо операция должна быть идемпотентной (т.е. ГК видит, что такой пост уже есть и не добавляет) либо ты сам должен это сэмулировать проверив, существует ли такой пост перед отправкой.
                              Ответить
                              • Да почему?
                                create_file("i_will_post_govno")
                                if send() == 200:
                                    delete_file("i_will_post_govno")
                                    create_file("posted")


                                единственная жопа тут, это что пост создается, а 200 не возаращется
                                ну или что твой код падает в середине выполнения, ну так званяй кумо: транзационность в REST не завезли
                                Ответить
                                • Ну так и есть.
                                  perekat = Perekat.make_perekat(offtop.category, session)
                                  if perekat.old_offtop is None or perekat.old_offtop.id != offtop.id:
                                      L.error(f'Perekat.make_perekat() returned invalid old_offtop (perekat for {offtop.post_id})')
                                      continue
                                  
                                  # Publish new offtop
                                  time.sleep(config.PEREKAT_ACTIONS_PAUSE)
                                  if not perekat.form.publish(requests_session, auth_cookie, config.POST_MAX_RETRIES, config.POST_RETRY_TIME):
                                      L.error(f'Could not publish new offtop (perekat for {offtop.post_id})')
                                      continue
                                  
                                  if perekat.form.post_id is None:
                                      L.error(f'Could not get new offtop\'s post_id (perekat for {offtop.post_id})')
                                      continue
                                  
                                  perekat.new_offtop.post_id = perekat.form.post_id
                                  perekat.new_offtop.comment_list_id = perekat.form.comments_list_id
                                  perekat.new_offtop = session.merge(perekat.new_offtop)
                                  session.commit()  # Save published post_id
                                  Ответить
                              • Ну и будешь снова и снова постить.

                                Либо операция должна быть идемпотентной (т.е. ГК видит, что такой пост уже есть и не добавляет) либо ты сам должен это сэмулировать проверив, существует ли такой пост перед отправкой.
                                Ответить
                              • Ну и будешь снова и снова постить.

                                Либо операция должна быть идемпотентной (т.е. ГК видит, что такой пост уже есть и не добавляет) либо ты сам должен это сэмулировать проверив, существует ли такой пост перед отправкой.
                                Ответить
                              • Ну и будешь снова и снова постить.

                                Либо операция должна быть идемпотентной (т.е. ГК видит, что такой пост уже есть и не добавляет) либо ты сам должен это сэмулировать проверив, существует ли такой пост перед отправкой.
                                Ответить
                              • Ну и будешь снова и снова постить.

                                Либо операция должна быть идемпотентной (т.е. ГК видит, что такой пост уже есть и не добавляет) либо ты сам должен это сэмулировать проверив, существует ли такой пост перед отправкой.
                                Ответить
                              • Ну и будешь снова и снова постить.

                                Либо операция должна быть идемпотентной (т.е. ГК видит, что такой пост уже есть и не добавляет) либо ты сам должен это сэмулировать проверив, существует ли такой пост перед отправкой.
                                Ответить
                              • Ну и будешь снова и снова постить.

                                Либо операция должна быть идемпотентной (т.е. ГК видит, что такой пост уже есть и не добавляет) либо ты сам должен это сэмулировать проверив, существует ли такой пост перед отправкой.
                                Ответить
                              • Ну и будешь снова и снова постить.

                                Либо операция должна быть идемпотентной (т.е. ГК видит, что такой пост уже есть и не добавляет) либо ты сам должен это сэмулировать проверив, существует ли такой пост перед отправкой.
                                Ответить
                              • Ну и будешь снова и снова постить.

                                Либо операция должна быть идемпотентной (т.е. ГК видит, что такой пост уже есть и не добавляет) либо ты сам должен это сэмулировать проверив, существует ли такой пост перед отправкой.
                                Ответить
                              • Ну и будешь снова и снова постить.

                                Либо операция должна быть идемпотентной (т.е. ГК видит, что такой пост уже есть и не добавляет) либо ты сам должен это сэмулировать проверив, существует ли такой пост перед отправкой.
                                Ответить
                              • Ну и будешь снова и снова постить.

                                Либо операция должна быть идемпотентной (т.е. ГК видит, что такой пост уже есть и не добавляет) либо ты сам должен это сэмулировать проверив, существует ли такой пост перед отправкой.
                                Ответить
                              • Ну и будешь снова и снова постить.

                                Либо операция должна быть идемпотентной (т.е. ГК видит, что такой пост уже есть и не добавляет) либо ты сам должен это сэмулировать проверив, существует ли такой пост перед отправкой.
                                Ответить
                              • Ну и будешь снова и снова постить.

                                Либо операция должна быть идемпотентной (т.е. ГК видит, что такой пост уже есть и не добавляет) либо ты сам должен это сэмулировать проверив, существует ли такой пост перед отправкой.
                                Ответить
                              • Ну и будешь снова и снова постить.

                                Либо операция должна быть идемпотентной (т.е. ГК видит, что такой пост уже есть и не добавляет) либо ты сам должен это сэмулировать проверив, существует ли такой пост перед отправкой.
                                Ответить
                              • Ну и будешь снова и снова постить.

                                Либо операция должна быть идемпотентной (т.е. ГК видит, что такой пост уже есть и не добавляет) либо ты сам должен это сэмулировать проверив, существует ли такой пост перед отправкой.
                                Ответить
                              • Ну и будешь снова и снова постить.

                                Либо операция должна быть идемпотентной (т.е. ГК видит, что такой пост уже есть и не добавляет) либо ты сам должен это сэмулировать проверив, существует ли такой пост перед отправкой.
                                Ответить
                              • Ну и будешь снова и снова постить.

                                Либо операция должна быть идемпотентной (т.е. ГК видит, что такой пост уже есть и не добавляет) либо ты сам должен это сэмулировать проверив, существует ли такой пост перед отправкой.
                                Ответить
                              • Ну и будешь снова и снова постить.

                                Либо операция должна быть идемпотентной (т.е. ГК видит, что такой пост уже есть и не добавляет) либо ты сам должен это сэмулировать проверив, существует ли такой пост перед отправкой.
                                Ответить
                              • Ну и будешь снова и снова постить.

                                Либо операция должна быть идемпотентной (т.е. ГК видит, что такой пост уже есть и не добавляет) либо ты сам должен это сэмулировать проверив, существует ли такой пост перед отправкой.
                                Ответить
                              • Ну и будешь снова и снова постить.

                                Либо операция должна быть идемпотентной (т.е. ГК видит, что такой пост уже есть и не добавляет) либо ты сам должен это сэмулировать проверив, существует ли такой пост перед отправкой.
                                Ответить
                              • Ну и будешь снова и снова постить.

                                Либо операция должна быть идемпотентной (т.е. ГК видит, что такой пост уже есть и не добавляет) либо ты сам должен это сэмулировать проверив, существует ли такой пост перед отправкой.
                                Ответить
                              • Ну и будешь снова и снова постить.

                                Либо операция должна быть идемпотентной (т.е. ГК видит, что такой пост уже есть и не добавляет) либо ты сам должен это сэмулировать проверив, существует ли такой пост перед отправкой.
                                Ответить
                              • Ну и будешь снова и снова постить.

                                Либо операция должна быть идемпотентной (т.е. ГК видит, что такой пост уже есть и не добавляет) либо ты сам должен это сэмулировать проверив, существует ли такой пост перед отправкой.
                                Ответить
                              • Ну и будешь снова и снова постить.

                                Либо операция должна быть идемпотентной (т.е. ГК видит, что такой пост уже есть и не добавляет) либо ты сам должен это сэмулировать проверив, существует ли такой пост перед отправкой.
                                Ответить
                              • Ну и будешь снова и снова постить.

                                Либо операция должна быть идемпотентной (т.е. ГК видит, что такой пост уже есть и не добавляет) либо ты сам должен это сэмулировать проверив, существует ли такой пост перед отправкой.
                                Ответить
                              • Ну и будешь снова и снова постить.

                                Либо операция должна быть идемпотентной (т.е. ГК видит, что такой пост уже есть и не добавляет) либо ты сам должен это сэмулировать проверив, существует ли такой пост перед отправкой.
                                Ответить
                            • Да, я хотел сделать очередь задач, но прикинул, что это будет ещё сложнее и запутаннее, чем есть сейчас — хотя бы потому, что логики именно отправки особенно меньше не станет, а синхронизировать всё это говно придётся ещё активнее.
                              Ответить
                        • Ну он о ситуации когда ты пост отправил, а дальше всё пизданулось и коммит не удался.
                          Ответить
                    • t = create_transaction()
                          connect(t)
                          send(t)
                          hue(t)
                          moe(t)
                          t.commit()


                      правда, в базу нужно писать ДО того, как ты чото обубликовал
                      Ответить
                    • t = create_transaction()
                          connect(t)
                          send(t)
                          hue(t)
                          moe(t)
                          t.commit()


                      правда, в базу нужно писать ДО того, как ты чото обубликовал
                      Ответить
                    • t = create_transaction()
                          connect(t)
                          send(t)
                          hue(t)
                          moe(t)
                          t.commit()


                      правда, в базу нужно писать ДО того, как ты чото обубликовал
                      Ответить
                    • t = create_transaction()
                          connect(t)
                          send(t)
                          hue(t)
                          moe(t)
                          t.commit()


                      правда, в базу нужно писать ДО того, как ты чото обубликовал
                      Ответить
                    • t = create_transaction()
                          connect(t)
                          send(t)
                          hue(t)
                          moe(t)
                          t.commit()


                      правда, в базу нужно писать ДО того, как ты чото обубликовал
                      Ответить
                    • t = create_transaction()
                          connect(t)
                          send(t)
                          hue(t)
                          moe(t)
                          t.commit()


                      правда, в базу нужно писать ДО того, как ты чото обубликовал
                      Ответить
                    • t = create_transaction()
                          connect(t)
                          send(t)
                          hue(t)
                          moe(t)
                          t.commit()


                      правда, в базу нужно писать ДО того, как ты чото обубликовал
                      Ответить
                    • t = create_transaction()
                          connect(t)
                          send(t)
                          hue(t)
                          moe(t)
                          t.commit()


                      правда, в базу нужно писать ДО того, как ты чото обубликовал
                      Ответить
                    • t = create_transaction()
                          connect(t)
                          send(t)
                          hue(t)
                          moe(t)
                          t.commit()


                      правда, в базу нужно писать ДО того, как ты чото обубликовал
                      Ответить
                    • t = create_transaction()
                          connect(t)
                          send(t)
                          hue(t)
                          moe(t)
                          t.commit()


                      правда, в базу нужно писать ДО того, как ты чото обубликовал
                      Ответить
                    • t = create_transaction()
                          connect(t)
                          send(t)
                          hue(t)
                          moe(t)
                          t.commit()


                      правда, в базу нужно писать ДО того, как ты чото обубликовал
                      Ответить
                    • t = create_transaction()
                          connect(t)
                          send(t)
                          hue(t)
                          moe(t)
                          t.commit()


                      правда, в базу нужно писать ДО того, как ты чото обубликовал
                      Ответить
                    • t = create_transaction()
                          connect(t)
                          send(t)
                          hue(t)
                          moe(t)
                          t.commit()


                      правда, в базу нужно писать ДО того, как ты чото обубликовал
                      Ответить
                    • t = create_transaction()
                          connect(t)
                          send(t)
                          hue(t)
                          moe(t)
                          t.commit()


                      правда, в базу нужно писать ДО того, как ты чото обубликовал
                      Ответить
                    • t = create_transaction()
                          connect(t)
                          send(t)
                          hue(t)
                          moe(t)
                          t.commit()


                      правда, в базу нужно писать ДО того, как ты чото обубликовал
                      Ответить
                    • t = create_transaction()
                          connect(t)
                          send(t)
                          hue(t)
                          moe(t)
                          t.commit()


                      правда, в базу нужно писать ДО того, как ты чото обубликовал
                      Ответить
                    • t = create_transaction()
                          connect(t)
                          send(t)
                          hue(t)
                          moe(t)
                          t.commit()


                      правда, в базу нужно писать ДО того, как ты чото обубликовал
                      Ответить
                    • t = create_transaction()
                          connect(t)
                          send(t)
                          hue(t)
                          moe(t)
                          t.commit()


                      правда, в базу нужно писать ДО того, как ты чото обубликовал
                      Ответить
                    • t = create_transaction()
                          connect(t)
                          send(t)
                          hue(t)
                          moe(t)
                          t.commit()


                      правда, в базу нужно писать ДО того, как ты чото обубликовал
                      Ответить
                    • t = create_transaction()
                          connect(t)
                          send(t)
                          hue(t)
                          moe(t)
                          t.commit()


                      правда, в базу нужно писать ДО того, как ты чото обубликовал
                      Ответить
                    • t = create_transaction()
                          connect(t)
                          send(t)
                          hue(t)
                          moe(t)
                          t.commit()


                      правда, в базу нужно писать ДО того, как ты чото обубликовал
                      Ответить
                    • t = create_transaction()
                          connect(t)
                          send(t)
                          hue(t)
                          moe(t)
                          t.commit()


                      правда, в базу нужно писать ДО того, как ты чото обубликовал
                      Ответить
                    • t = create_transaction()
                          connect(t)
                          send(t)
                          hue(t)
                          moe(t)
                          t.commit()


                      правда, в базу нужно писать ДО того, как ты чото обубликовал
                      Ответить
                    • t = create_transaction()
                          connect(t)
                          send(t)
                          hue(t)
                          moe(t)
                          t.commit()


                      правда, в базу нужно писать ДО того, как ты чото обубликовал
                      Ответить
                    • t = create_transaction()
                          connect(t)
                          send(t)
                          hue(t)
                          moe(t)
                          t.commit()


                      правда, в базу нужно писать ДО того, как ты чото обубликовал
                      Ответить
                  • Дык если ты сделал перекат, то твой код увидит его на следующей попытке и не будет перекатывать. Разве нет?
                    Ответить
                    • Перекатный петух не проверяет ГК, у него в мозгах только занесённые в БД посты. Если он запостил новый оффтоп, но не добавил его в БД, то на следующей проверке об этом потерянном посте петух ничего знать не будет.
                      Ответить
                      • псевдокод
                        while True:
                          sync = get_next_from_queue()
                          try:
                             sync.next_state()
                          except e:
                             log.err(f"Can't go to next state because of", e)
                             sleep(100500)


                        стейты такие:
                        SYNC_REQUEST_CREATED ->
                        SYNC_REQUEST_PUBLISHED_ON_GK ->
                        SYNC_REQUEST_SAVED_TO_DB
                        Ответить
                        • Ну дык все проблемы остаются.
                          >>> Либо операция должна быть идемпотентной (т.е. ГК видит, что такой пост уже есть и не добавляет) либо ты сам должен это сэмулировать проверив, существует ли такой пост перед отправкой.

                          При этом появляются новые: например, перед проверкой очередного оффтопа нам нужно убедиться, что задач на его перекат нет, иначе мы можем создать две одинаковых задачи и разъебать всё приложение.
                          Ответить
                            • >>> например, перед проверкой очередного оффтопа нам нужно убедиться, что задач на его перекат нет, иначе мы можем создать две одинаковых задачи и разъебать всё приложение.
                              Ответить
                              • ну так называй задачу по дате, и не допускай двух одинаковых задач.
                                Возможно, что готовые фреймворки это уже и так делают
                                Ответить
                                • >>> нам нужно убедиться, что задач на его перекат нет
                                  Это ещё больше логики, ещё больше протекания обсракций.
                                  Ответить
                                  • >на его перекат нет
                                    А у него есть уникальный ID?
                                    Что мешает сделать так, чтобы не делать двух задач для одинакового ID?
                                    Ответить
                                    • на его перекат нет
                                      А у него есть уникальный ID?
                                      Что мешает сделать так, чтобы не делать двух задач для одинакового ID?
                                      Ответить
                                    • на его перекат нет
                                      А у него есть уникальный ID?
                                      Что мешает сделать так, чтобы не делать двух задач для одинакового ID?
                                      Ответить
                                    • на его перекат нет
                                      А у него есть уникальный ID?
                                      Что мешает сделать так, чтобы не делать двух задач для одинакового ID?
                                      Ответить
                                    • на его перекат нет
                                      А у него есть уникальный ID?
                                      Что мешает сделать так, чтобы не делать двух задач для одинакового ID?
                                      Ответить
                                    • на его перекат нет
                                      А у него есть уникальный ID?
                                      Что мешает сделать так, чтобы не делать двух задач для одинакового ID?
                                      Ответить
                                    • на его перекат нет
                                      А у него есть уникальный ID?
                                      Что мешает сделать так, чтобы не делать двух задач для одинакового ID?
                                      Ответить
                                    • на его перекат нет
                                      А у него есть уникальный ID?
                                      Что мешает сделать так, чтобы не делать двух задач для одинакового ID?
                                      Ответить
                                    • на его перекат нет
                                      А у него есть уникальный ID?
                                      Что мешает сделать так, чтобы не делать двух задач для одинакового ID?
                                      Ответить
                                    • на его перекат нет
                                      А у него есть уникальный ID?
                                      Что мешает сделать так, чтобы не делать двух задач для одинакового ID?
                                      Ответить
                                    • на его перекат нет
                                      А у него есть уникальный ID?
                                      Что мешает сделать так, чтобы не делать двух задач для одинакового ID?
                                      Ответить
                                    • на его перекат нет
                                      А у него есть уникальный ID?
                                      Что мешает сделать так, чтобы не делать двух задач для одинакового ID?
                                      Ответить
                                    • на его перекат нет
                                      А у него есть уникальный ID?
                                      Что мешает сделать так, чтобы не делать двух задач для одинакового ID?
                                      Ответить
                                    • на его перекат нет
                                      А у него есть уникальный ID?
                                      Что мешает сделать так, чтобы не делать двух задач для одинакового ID?
                                      Ответить
                                    • на его перекат нет
                                      А у него есть уникальный ID?
                                      Что мешает сделать так, чтобы не делать двух задач для одинакового ID?
                                      Ответить
                                    • на его перекат нет
                                      А у него есть уникальный ID?
                                      Что мешает сделать так, чтобы не делать двух задач для одинакового ID?
                                      Ответить
                                    • на его перекат нет
                                      А у него есть уникальный ID?
                                      Что мешает сделать так, чтобы не делать двух задач для одинакового ID?
                                      Ответить
                                    • на его перекат нет
                                      А у него есть уникальный ID?
                                      Что мешает сделать так, чтобы не делать двух задач для одинакового ID?
                                      Ответить
                                    • на его перекат нет
                                      А у него есть уникальный ID?
                                      Что мешает сделать так, чтобы не делать двух задач для одинакового ID?
                                      Ответить
                                    • на его перекат нет
                                      А у него есть уникальный ID?
                                      Что мешает сделать так, чтобы не делать двух задач для одинакового ID?
                                      Ответить
                                    • на его перекат нет
                                      А у него есть уникальный ID?
                                      Что мешает сделать так, чтобы не делать двух задач для одинакового ID?
                                      Ответить
                                    • на его перекат нет
                                      А у него есть уникальный ID?
                                      Что мешает сделать так, чтобы не делать двух задач для одинакового ID?
                                      Ответить
                                    • на его перекат нет
                                      А у него есть уникальный ID?
                                      Что мешает сделать так, чтобы не делать двух задач для одинакового ID?
                                      Ответить
                                    • на его перекат нет
                                      А у него есть уникальный ID?
                                      Что мешает сделать так, чтобы не делать двух задач для одинакового ID?
                                      Ответить
                                    • на его перекат нет
                                      А у него есть уникальный ID?
                                      Что мешает сделать так, чтобы не делать двух задач для одинакового ID?
                                      Ответить
                                    • на его перекат нет
                                      А у него есть уникальный ID?
                                      Что мешает сделать так, чтобы не делать двух задач для одинакового ID?
                                      Ответить
                                  • нам нужно убедиться, что задач на его перекат нет
                                    Это ещё больше логики, ещё больше протекания обсракций.
                                    Ответить
                                  • нам нужно убедиться, что задач на его перекат нет
                                    Это ещё больше логики, ещё больше протекания обсракций.
                                    Ответить
                                  • нам нужно убедиться, что задач на его перекат нет
                                    Это ещё больше логики, ещё больше протекания обсракций.
                                    Ответить
                                  • нам нужно убедиться, что задач на его перекат нет
                                    Это ещё больше логики, ещё больше протекания обсракций.
                                    Ответить
                                  • нам нужно убедиться, что задач на его перекат нет
                                    Это ещё больше логики, ещё больше протекания обсракций.
                                    Ответить
                                  • нам нужно убедиться, что задач на его перекат нет
                                    Это ещё больше логики, ещё больше протекания обсракций.
                                    Ответить
                                  • нам нужно убедиться, что задач на его перекат нет
                                    Это ещё больше логики, ещё больше протекания обсракций.
                                    Ответить
                                  • нам нужно убедиться, что задач на его перекат нет
                                    Это ещё больше логики, ещё больше протекания обсракций.
                                    Ответить
                                  • нам нужно убедиться, что задач на его перекат нет
                                    Это ещё больше логики, ещё больше протекания обсракций.
                                    Ответить
                                  • нам нужно убедиться, что задач на его перекат нет
                                    Это ещё больше логики, ещё больше протекания обсракций.
                                    Ответить
                                  • нам нужно убедиться, что задач на его перекат нет
                                    Это ещё больше логики, ещё больше протекания обсракций.
                                    Ответить
                                  • нам нужно убедиться, что задач на его перекат нет
                                    Это ещё больше логики, ещё больше протекания обсракций.
                                    Ответить
                                  • нам нужно убедиться, что задач на его перекат нет
                                    Это ещё больше логики, ещё больше протекания обсракций.
                                    Ответить
                                  • нам нужно убедиться, что задач на его перекат нет
                                    Это ещё больше логики, ещё больше протекания обсракций.
                                    Ответить
                                  • нам нужно убедиться, что задач на его перекат нет
                                    Это ещё больше логики, ещё больше протекания обсракций.
                                    Ответить
                                  • нам нужно убедиться, что задач на его перекат нет
                                    Это ещё больше логики, ещё больше протекания обсракций.
                                    Ответить
                                  • нам нужно убедиться, что задач на его перекат нет
                                    Это ещё больше логики, ещё больше протекания обсракций.
                                    Ответить
                                  • нам нужно убедиться, что задач на его перекат нет
                                    Это ещё больше логики, ещё больше протекания обсракций.
                                    Ответить
                                  • нам нужно убедиться, что задач на его перекат нет
                                    Это ещё больше логики, ещё больше протекания обсракций.
                                    Ответить
                                  • нам нужно убедиться, что задач на его перекат нет
                                    Это ещё больше логики, ещё больше протекания обсракций.
                                    Ответить
                                  • нам нужно убедиться, что задач на его перекат нет
                                    Это ещё больше логики, ещё больше протекания обсракций.
                                    Ответить
                                  • нам нужно убедиться, что задач на его перекат нет
                                    Это ещё больше логики, ещё больше протекания обсракций.
                                    Ответить
                                  • нам нужно убедиться, что задач на его перекат нет
                                    Это ещё больше логики, ещё больше протекания обсракций.
                                    Ответить
                                  • нам нужно убедиться, что задач на его перекат нет
                                    Это ещё больше логики, ещё больше протекания обсракций.
                                    Ответить
                                  • нам нужно убедиться, что задач на его перекат нет
                                    Это ещё больше логики, ещё больше протекания обсракций.
                                    Ответить
          • Можно так.

            1) Перед запуском задачи смотришь, какой сейчас на ГК тред последний и вписываешь его в поле задачи.

            2) Если задача in progress, проверяешь все треды начиная с запомненного, чтобы убедиться что задача ещё не выполнена. Если уже выполнена - переводишь её в done, вписываешь номер найденного треда и ничего не постишь.

            3) Если задача ещё не начата, то переводишь её в in progress, постишь тред и переходишь на пункт 2.
            Ответить
            • О чём этот тред? Зачем что-то делать, если уже работает?
              Ответить
              • ой, всё
                можешь ничего не делать
                Ответить
                • Не, серьёзно. Есть уже написанный рабочий код, нужно подправить несколько мелочей. Ты предлагаешь всё нахуй переписать.
                  Ответить
                  • некоторые дураки меняют архитектуру вместо того, чтобы просто дописать иф. Десятый. В четыре места.
                    Ответить
                    • Какую архитектуру? Для преуатного петуха? Туда ничего добавлять не нужно будет. Написал и забыл.
                      Ответить
                      • Написал и забыл. А через день вспомнил, и еще чуть чуть дописал, и забыл.
                        А через день вспомнил, и еще чуть чуть дописал, и забыл. А через день вспомнил, и еще чуть чуть дописал, и забыл. А через день вспомнил, и еще чуть чуть дописал, и забыл. А через день вспомнил, и еще чуть чуть дописал, и забыл. А через день вспомнил, и еще чуть чуть дописал, и забыл. А через день вспомнил, и еще чуть чуть дописал, и забыл.
                        Ответить
                        • Подтверждаю. Вон, для «Хрюкни» пришлось схему править.
                          Ответить
                          • Нет, не похуй. А через день вспомнил, и еще чуть чуть дописал, и забыл. А через день вспомнил, и еще чуть чуть дописал, и забыл. А через день вспомнил, и еще чуть чуть дописал, и забыл. А через день вспомнил, и еще чуть чуть дописал, и забыл. А через день вспомнил, и еще чуть чуть дописал, и забыл. А через день вспомнил, и еще чуть чуть дописал, и забыл.
                            Ответить
                  • На самом деле, как я внизу написал, перевести перекатного петуха на новый движок будет просто, потому что логика публикации и так вынесена в изолированные модули. Это даже есть в планах инженерного отдела — но в отдалённых, когда инженерный отдел будет в настроении попробовать что-нибудь новенькое.
                    Ответить
            • > Если задача in progress, проверяешь все треды начиная с запомненного, чтобы убедиться что задача ещё не выполнена.
              Ну да, и каждый тред может выкинуть Application was halted by an exception., после чего нужно либо долбить его до посинения, либо обновлять поле задачи этим тредом и опять идти спать.

              UPD: Ну а так да, хороший вореант. Правда, я именно об этом в начале ветки и говорил: для написания надёжного приложения, зависящего от внешних сервисов, приходится наваливать кучу лишнего говна.
              Ещё его можно оптимизировать, проверяя не все ГК подряд, а RSS-ленты перекатных петухов (в моей рахитектуре их может быть много, да), в которых по-умолчанию будут только доверенные посты.
              Ответить
              • Короче, я отделил бы логику от движка.

                Сделал бы конечный атвуомат, который на каждом следующем шаге делает какое-то действтие, и движок, который пытается перевести его в следующее состояние>

                Если там база или интернет отвалились или halted by exception, то движок ждет, и пытается снова перевести в следующее состояние

                Я за пафосный энетрпрайзный код, а не за наколенное. но тебе видней
                Ответить
                • Ну, кстати, в текущей рахитектуре это можно сделать, причём почти прозрачно: у меня уже вся логика публикации комментов/постов вынесена в отдельные классы. Её можно легко заменить на создание соответствующих задач (ну и из кода проверки на перекаты выкинуть модификацию БД). Возможно, когда нашим отделам будет нехуй делать — они этим займутся.

                  >>> Правда, я именно об этом в начале ветки и говорил: для написания надёжного приложения, зависящего от внешних сервисов, приходится наваливать кучу лишнего говна.
                  Ответить
                  • ИМХО: Куча гавна это когда ты сам пишешь много унылого бойлерплейта и прячешь его среди логики.
                    А когда ты делаешь красивенький и внятный фреймворк для фоновой обработки задач (или берешь готовый, что еще лучше) то это уже не говно, а конфетка.

                    не?
                    Ответить
                    • Проблема в том, что это нинужная конфетка. Ну и бойлерплейт никуда не девается, он просто переносится в логику публикации. Нам как минимум нужно залоггировать полученные ошибки, как максимум — обработать. Например, 403, полученное с govnokod.ru/add, должно привести к созданию новой задачи по обновлению кук соответствующего пользователя, наличие «<li>Неверно введен проверочный код!</li>» в ответе на запрос создания кода — к нескольким попыткам заново распознать капчу (просто отправляться спать будет неразумно и неэффективно), и так далее, и тому подобное.
                      Ответить
                      • > бойлерплейт никуда не девается, он просто переносится в логику публикации

                        Там он будет не бойлерплейтом, а логикой!
                        логикой движка

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

                        Значит-ли это, что бойлерплейт ушел в операционку?
                        Нет. Там он не бойлерплейт, там он логичен и правилен, и написан один раз.

                        А ты можешь писать логику своей программы, и течь.
                        Ответить
                        • Нет. Это именно что тупой бойлерплейт с бесконечными проверками всего и вся, потому что в ответ на запрос тебе может придти абсолютно любая какаха. Или не придти. Или придти, но поздно. Или ещё какая-нибудь хуйня может случиться. И всё это говно надо методично профильтровать и настоять, чтобы получить нормальные, предсказуемые результаты.

                          Вон, прямо под этим комментарием реальный пример.
                          Ответить
                          • любая какаха оборачивается в raise CantIntoExeption(kakaha), и движок просто пробует снова через 5 минут.
                            Ответить
                            • Я уже объяснял, почему так просто сделать нельзя.
                              Ответить
                                • Вон, мой комментарий ниже с кодом.
                                  > if r is None:
                                  Какая-то ошибка сети. Она была залоггирована на верхнем уровне (в safe_post_response), нам осталось только сохранить полученную страницу для дальнейшего расследования и возвратить соответствующий код ошибки.

                                  > if '<li>Неверно введен проверочный код!</li>' in self.html
                                  Ошибка капчи. Нам нужно заново распарсить страницу на предмет CSRF и captcha_id (чтобы не загружать её повторно) и возвратить нужную ошибку. В коде-клиенте эта ошибка должна привести к нескольким повторным попыткам распознать капчу, потому что это ожидаемое поведение (точность там около 90%), и спать по пять минут на каждый фейл капчи совершенно непрактично.

                                  > elif r.status_code != 200:
                                  Хуй знает, что произошло. Залоггируем и попробуем заново распарсить ответ — и, разумеется, сохраним страницу.

                                  > m = _GK_POST_REDIRECT_RE.match(post_url); if m is None:
                                  ГК почему-то перенаправил нас не на страницу с постом, а в какую-то жопу. Логгирование и сохранение для потомков.

                                  > m = _GK_COMMENTS_LIST_ID_REGEX.search(self.h tml); if m is None:
                                  Пост опубликован, ID получен, но comments_list_id не найден. Возможно, Страйкер поменял вёрстку или произошла ещё какая-нибудь непонятная хуйня. Залоггируем, сохраним страницу, но клиенту скажем, что всё в порядке, потому что пост на ГК создан.

                                  Заметь: из пяти проверок четыре — это проверки на какую-то хуйню, в частности, с расчётом на то, что у ГК может поменяться вёрстка. Мне это не нравится.
                                  Ответить
                    • Вот, например, метод, пробующий опубликовать пост:
                      def try_post(self, session: requests.Session, auth_cookie: str) -> 'PostForm.Status':
                          r = Form.safe_post_response(session,
                                                      _GK_ADD_URL,
                                                      data=self._to_form_dict(),
                                                      cookies=self._get_cookie_dict(auth_cookie))
                          if r is None:
                              self._dump_html_dated('post_post_error')
                              return PostForm.Status.POST_ERROR
                      
                          self.html = r.text
                          if '<li>Неверно введен проверочный код!</li>' in self.html \
                                  or '<li>Произвол не пройдёт! Укажите проверочный код!</li>' in self.html:
                              L.error('PostForm.post(): Invalid captcha')
                              self.parse(self.html)
                              return PostForm.Status.INVALID_CAPTCHA
                      
                          elif r.status_code != 200:
                              self.parse(self.html)
                              L.error(f'PostForm.post(): invalid response (status_code {r.status_code})')
                              self._dump_html_dated('post_invalid_response')
                              return PostForm.Status.POST_ERROR
                          
                          post_url = r.url
                          m = _GK_POST_REDIRECT_RE.match(post_url)
                          if m is None:
                              L.error(f'PostForm.post(): invalid new post url ({post_url})')
                              self._dump_html_dated('post_invalid_url')
                              return PostForm.Status.POST_ERROR
                          self.post_id = int(m.group(1))
                      
                          m = _GK_COMMENTS_LIST_ID_REGEX.search(self.html)
                          if m is None:  # No return POST_ERROR, because the post is published
                              L.warning(f'PostForm.post(): could not find comments_list_id in post {self.post_id}')
                              self._dump_html_dated('post_no_list_id')
                          else:
                              self.comments_list_id = int(m.group(1))
                      
                          return PostForm.Status.POST_DONE

                      Все вот эти вот говнопроверки никуда не денутся, они просто переедут в логику движка.
                      Ответить
                      • Вот, например, метод, пробующий опубликовать пост:
                        >def try_post(self, session: requests.Session, auth_cookie: str) - 'PostForm.Status':
                            r = Form.safe_post_response(session,
                                                        _GK_ADD_URL,
                                                        data=self._to_form_dict(),
                                                        cookies=self._get_cookie_dict(auth_cookie))
                            if r is None:
                                self._dump_html_dated('post_post_error')
                                return PostForm.Status.POST_ERROR
                        
                            self.html = r.text
                            if 'liНеверно введен проверочный код!/li' in self.html \
                                    or 'liПроизвол не пройдёт! Укажите проверочный код!/li' in self.html:
                                L.error('PostForm.post(): Invalid captcha')
                                self.parse(self.html)
                                return PostForm.Status.INVALID_CAPTCHA
                        
                            elif r.status_code != 200:
                                self.parse(self.html)
                                L.error(f'PostForm.post(): invalid response (status_code {r.status_code})')
                                self._dump_html_dated('post_invalid_response')
                                return PostForm.Status.POST_ERROR
                            
                            post_url = r.url
                            m = _GK_POST_REDIRECT_RE.match(post_url)
                            if m is None:
                                L.error(f'PostForm.post(): invalid new post url ({post_url})')
                                self._dump_html_dated('post_invalid_url')
                                return PostForm.Status.POST_ERROR
                            self.post_id = int(m.group(1))
                        
                            m = _GK_COMMENTS_LIST_ID_REGEX.search(self.html)
                            if m is None:  # No return POST_ERROR, because the post is published
                                L.warning(f'PostForm.post(): could not find comments_list_id in post {self.post_id}')
                                self._dump_html_dated('post_no_list_id')
                            else:
                                self.comments_list_id = int(m.group(1))
                        
                            return PostForm.Status.POST_DONE

                        Все вот эти вот говнопроверки никуда не денутся, они просто переедут в логику движка.
                        Ответить
                      • Вот, например, метод, пробующий опубликовать пост:
                        >def try_post(self, session: requests.Session, auth_cookie: str) - 'PostForm.Status':
                            r = Form.safe_post_response(session,
                                                        _GK_ADD_URL,
                                                        data=self._to_form_dict(),
                                                        cookies=self._get_cookie_dict(auth_cookie))
                            if r is None:
                                self._dump_html_dated('post_post_error')
                                return PostForm.Status.POST_ERROR
                        
                            self.html = r.text
                            if 'liНеверно введен проверочный код!/li' in self.html \
                                    or 'liПроизвол не пройдёт! Укажите проверочный код!/li' in self.html:
                                L.error('PostForm.post(): Invalid captcha')
                                self.parse(self.html)
                                return PostForm.Status.INVALID_CAPTCHA
                        
                            elif r.status_code != 200:
                                self.parse(self.html)
                                L.error(f'PostForm.post(): invalid response (status_code {r.status_code})')
                                self._dump_html_dated('post_invalid_response')
                                return PostForm.Status.POST_ERROR
                            
                            post_url = r.url
                            m = _GK_POST_REDIRECT_RE.match(post_url)
                            if m is None:
                                L.error(f'PostForm.post(): invalid new post url ({post_url})')
                                self._dump_html_dated('post_invalid_url')
                                return PostForm.Status.POST_ERROR
                            self.post_id = int(m.group(1))
                        
                            m = _GK_COMMENTS_LIST_ID_REGEX.search(self.html)
                            if m is None:  # No return POST_ERROR, because the post is published
                                L.warning(f'PostForm.post(): could not find comments_list_id in post {self.post_id}')
                                self._dump_html_dated('post_no_list_id')
                            else:
                                self.comments_list_id = int(m.group(1))
                        
                            return PostForm.Status.POST_DONE

                        Все вот эти вот говнопроверки никуда не денутся, они просто переедут в логику движка.
                        Ответить
                      • Вот, например, метод, пробующий опубликовать пост:
                        >def try_post(self, session: requests.Session, auth_cookie: str) - 'PostForm.Status':
                            r = Form.safe_post_response(session,
                                                        _GK_ADD_URL,
                                                        data=self._to_form_dict(),
                                                        cookies=self._get_cookie_dict(auth_cookie))
                            if r is None:
                                self._dump_html_dated('post_post_error')
                                return PostForm.Status.POST_ERROR
                        
                            self.html = r.text
                            if 'liНеверно введен проверочный код!/li' in self.html \
                                    or 'liПроизвол не пройдёт! Укажите проверочный код!/li' in self.html:
                                L.error('PostForm.post(): Invalid captcha')
                                self.parse(self.html)
                                return PostForm.Status.INVALID_CAPTCHA
                        
                            elif r.status_code != 200:
                                self.parse(self.html)
                                L.error(f'PostForm.post(): invalid response (status_code {r.status_code})')
                                self._dump_html_dated('post_invalid_response')
                                return PostForm.Status.POST_ERROR
                            
                            post_url = r.url
                            m = _GK_POST_REDIRECT_RE.match(post_url)
                            if m is None:
                                L.error(f'PostForm.post(): invalid new post url ({post_url})')
                                self._dump_html_dated('post_invalid_url')
                                return PostForm.Status.POST_ERROR
                            self.post_id = int(m.group(1))
                        
                            m = _GK_COMMENTS_LIST_ID_REGEX.search(self.html)
                            if m is None:  # No return POST_ERROR, because the post is published
                                L.warning(f'PostForm.post(): could not find comments_list_id in post {self.post_id}')
                                self._dump_html_dated('post_no_list_id')
                            else:
                                self.comments_list_id = int(m.group(1))
                        
                            return PostForm.Status.POST_DONE

                        Все вот эти вот говнопроверки никуда не денутся, они просто переедут в логику движка.
                        Ответить
                      • Вот, например, метод, пробующий опубликовать пост:
                        >def try_post(self, session: requests.Session, auth_cookie: str) - 'PostForm.Status':
                            r = Form.safe_post_response(session,
                                                        _GK_ADD_URL,
                                                        data=self._to_form_dict(),
                                                        cookies=self._get_cookie_dict(auth_cookie))
                            if r is None:
                                self._dump_html_dated('post_post_error')
                                return PostForm.Status.POST_ERROR
                        
                            self.html = r.text
                            if 'liНеверно введен проверочный код!/li' in self.html \
                                    or 'liПроизвол не пройдёт! Укажите проверочный код!/li' in self.html:
                                L.error('PostForm.post(): Invalid captcha')
                                self.parse(self.html)
                                return PostForm.Status.INVALID_CAPTCHA
                        
                            elif r.status_code != 200:
                                self.parse(self.html)
                                L.error(f'PostForm.post(): invalid response (status_code {r.status_code})')
                                self._dump_html_dated('post_invalid_response')
                                return PostForm.Status.POST_ERROR
                            
                            post_url = r.url
                            m = _GK_POST_REDIRECT_RE.match(post_url)
                            if m is None:
                                L.error(f'PostForm.post(): invalid new post url ({post_url})')
                                self._dump_html_dated('post_invalid_url')
                                return PostForm.Status.POST_ERROR
                            self.post_id = int(m.group(1))
                        
                            m = _GK_COMMENTS_LIST_ID_REGEX.search(self.html)
                            if m is None:  # No return POST_ERROR, because the post is published
                                L.warning(f'PostForm.post(): could not find comments_list_id in post {self.post_id}')
                                self._dump_html_dated('post_no_list_id')
                            else:
                                self.comments_list_id = int(m.group(1))
                        
                            return PostForm.Status.POST_DONE

                        Все вот эти вот говнопроверки никуда не денутся, они просто переедут в логику движка.
                        Ответить
                      • Вот, например, метод, пробующий опубликовать пост:
                        >def try_post(self, session: requests.Session, auth_cookie: str) - 'PostForm.Status':
                            r = Form.safe_post_response(session,
                                                        _GK_ADD_URL,
                                                        data=self._to_form_dict(),
                                                        cookies=self._get_cookie_dict(auth_cookie))
                            if r is None:
                                self._dump_html_dated('post_post_error')
                                return PostForm.Status.POST_ERROR
                        
                            self.html = r.text
                            if 'liНеверно введен проверочный код!/li' in self.html \
                                    or 'liПроизвол не пройдёт! Укажите проверочный код!/li' in self.html:
                                L.error('PostForm.post(): Invalid captcha')
                                self.parse(self.html)
                                return PostForm.Status.INVALID_CAPTCHA
                        
                            elif r.status_code != 200:
                                self.parse(self.html)
                                L.error(f'PostForm.post(): invalid response (status_code {r.status_code})')
                                self._dump_html_dated('post_invalid_response')
                                return PostForm.Status.POST_ERROR
                            
                            post_url = r.url
                            m = _GK_POST_REDIRECT_RE.match(post_url)
                            if m is None:
                                L.error(f'PostForm.post(): invalid new post url ({post_url})')
                                self._dump_html_dated('post_invalid_url')
                                return PostForm.Status.POST_ERROR
                            self.post_id = int(m.group(1))
                        
                            m = _GK_COMMENTS_LIST_ID_REGEX.search(self.html)
                            if m is None:  # No return POST_ERROR, because the post is published
                                L.warning(f'PostForm.post(): could not find comments_list_id in post {self.post_id}')
                                self._dump_html_dated('post_no_list_id')
                            else:
                                self.comments_list_id = int(m.group(1))
                        
                            return PostForm.Status.POST_DONE

                        Все вот эти вот говнопроверки никуда не денутся, они просто переедут в логику движка.
                        Ответить
                      • Вот, например, метод, пробующий опубликовать пост:
                        >def try_post(self, session: requests.Session, auth_cookie: str) - 'PostForm.Status':
                            r = Form.safe_post_response(session,
                                                        _GK_ADD_URL,
                                                        data=self._to_form_dict(),
                                                        cookies=self._get_cookie_dict(auth_cookie))
                            if r is None:
                                self._dump_html_dated('post_post_error')
                                return PostForm.Status.POST_ERROR
                        
                            self.html = r.text
                            if 'liНеверно введен проверочный код!/li' in self.html \
                                    or 'liПроизвол не пройдёт! Укажите проверочный код!/li' in self.html:
                                L.error('PostForm.post(): Invalid captcha')
                                self.parse(self.html)
                                return PostForm.Status.INVALID_CAPTCHA
                        
                            elif r.status_code != 200:
                                self.parse(self.html)
                                L.error(f'PostForm.post(): invalid response (status_code {r.status_code})')
                                self._dump_html_dated('post_invalid_response')
                                return PostForm.Status.POST_ERROR
                            
                            post_url = r.url
                            m = _GK_POST_REDIRECT_RE.match(post_url)
                            if m is None:
                                L.error(f'PostForm.post(): invalid new post url ({post_url})')
                                self._dump_html_dated('post_invalid_url')
                                return PostForm.Status.POST_ERROR
                            self.post_id = int(m.group(1))
                        
                            m = _GK_COMMENTS_LIST_ID_REGEX.search(self.html)
                            if m is None:  # No return POST_ERROR, because the post is published
                                L.warning(f'PostForm.post(): could not find comments_list_id in post {self.post_id}')
                                self._dump_html_dated('post_no_list_id')
                            else:
                                self.comments_list_id = int(m.group(1))
                        
                            return PostForm.Status.POST_DONE

                        Все вот эти вот говнопроверки никуда не денутся, они просто переедут в логику движка.
                        Ответить
                      • Вот, например, метод, пробующий опубликовать пост:
                        >def try_post(self, session: requests.Session, auth_cookie: str) - 'PostForm.Status':
                            r = Form.safe_post_response(session,
                                                        _GK_ADD_URL,
                                                        data=self._to_form_dict(),
                                                        cookies=self._get_cookie_dict(auth_cookie))
                            if r is None:
                                self._dump_html_dated('post_post_error')
                                return PostForm.Status.POST_ERROR
                        
                            self.html = r.text
                            if 'liНеверно введен проверочный код!/li' in self.html \
                                    or 'liПроизвол не пройдёт! Укажите проверочный код!/li' in self.html:
                                L.error('PostForm.post(): Invalid captcha')
                                self.parse(self.html)
                                return PostForm.Status.INVALID_CAPTCHA
                        
                            elif r.status_code != 200:
                                self.parse(self.html)
                                L.error(f'PostForm.post(): invalid response (status_code {r.status_code})')
                                self._dump_html_dated('post_invalid_response')
                                return PostForm.Status.POST_ERROR
                            
                            post_url = r.url
                            m = _GK_POST_REDIRECT_RE.match(post_url)
                            if m is None:
                                L.error(f'PostForm.post(): invalid new post url ({post_url})')
                                self._dump_html_dated('post_invalid_url')
                                return PostForm.Status.POST_ERROR
                            self.post_id = int(m.group(1))
                        
                            m = _GK_COMMENTS_LIST_ID_REGEX.search(self.html)
                            if m is None:  # No return POST_ERROR, because the post is published
                                L.warning(f'PostForm.post(): could not find comments_list_id in post {self.post_id}')
                                self._dump_html_dated('post_no_list_id')
                            else:
                                self.comments_list_id = int(m.group(1))
                        
                            return PostForm.Status.POST_DONE

                        Все вот эти вот говнопроверки никуда не денутся, они просто переедут в логику движка.
                        Ответить
                      • Вот, например, метод, пробующий опубликовать пост:
                        >def try_post(self, session: requests.Session, auth_cookie: str) - 'PostForm.Status':
                            r = Form.safe_post_response(session,
                                                        _GK_ADD_URL,
                                                        data=self._to_form_dict(),
                                                        cookies=self._get_cookie_dict(auth_cookie))
                            if r is None:
                                self._dump_html_dated('post_post_error')
                                return PostForm.Status.POST_ERROR
                        
                            self.html = r.text
                            if 'liНеверно введен проверочный код!/li' in self.html \
                                    or 'liПроизвол не пройдёт! Укажите проверочный код!/li' in self.html:
                                L.error('PostForm.post(): Invalid captcha')
                                self.parse(self.html)
                                return PostForm.Status.INVALID_CAPTCHA
                        
                            elif r.status_code != 200:
                                self.parse(self.html)
                                L.error(f'PostForm.post(): invalid response (status_code {r.status_code})')
                                self._dump_html_dated('post_invalid_response')
                                return PostForm.Status.POST_ERROR
                            
                            post_url = r.url
                            m = _GK_POST_REDIRECT_RE.match(post_url)
                            if m is None:
                                L.error(f'PostForm.post(): invalid new post url ({post_url})')
                                self._dump_html_dated('post_invalid_url')
                                return PostForm.Status.POST_ERROR
                            self.post_id = int(m.group(1))
                        
                            m = _GK_COMMENTS_LIST_ID_REGEX.search(self.html)
                            if m is None:  # No return POST_ERROR, because the post is published
                                L.warning(f'PostForm.post(): could not find comments_list_id in post {self.post_id}')
                                self._dump_html_dated('post_no_list_id')
                            else:
                                self.comments_list_id = int(m.group(1))
                        
                            return PostForm.Status.POST_DONE

                        Все вот эти вот говнопроверки никуда не денутся, они просто переедут в логику движка.
                        Ответить
                      • Вот, например, метод, пробующий опубликовать пост:
                        >def try_post(self, session: requests.Session, auth_cookie: str) - 'PostForm.Status':
                            r = Form.safe_post_response(session,
                                                        _GK_ADD_URL,
                                                        data=self._to_form_dict(),
                                                        cookies=self._get_cookie_dict(auth_cookie))
                            if r is None:
                                self._dump_html_dated('post_post_error')
                                return PostForm.Status.POST_ERROR
                        
                            self.html = r.text
                            if 'liНеверно введен проверочный код!/li' in self.html \
                                    or 'liПроизвол не пройдёт! Укажите проверочный код!/li' in self.html:
                                L.error('PostForm.post(): Invalid captcha')
                                self.parse(self.html)
                                return PostForm.Status.INVALID_CAPTCHA
                        
                            elif r.status_code != 200:
                                self.parse(self.html)
                                L.error(f'PostForm.post(): invalid response (status_code {r.status_code})')
                                self._dump_html_dated('post_invalid_response')
                                return PostForm.Status.POST_ERROR
                            
                            post_url = r.url
                            m = _GK_POST_REDIRECT_RE.match(post_url)
                            if m is None:
                                L.error(f'PostForm.post(): invalid new post url ({post_url})')
                                self._dump_html_dated('post_invalid_url')
                                return PostForm.Status.POST_ERROR
                            self.post_id = int(m.group(1))
                        
                            m = _GK_COMMENTS_LIST_ID_REGEX.search(self.html)
                            if m is None:  # No return POST_ERROR, because the post is published
                                L.warning(f'PostForm.post(): could not find comments_list_id in post {self.post_id}')
                                self._dump_html_dated('post_no_list_id')
                            else:
                                self.comments_list_id = int(m.group(1))
                        
                            return PostForm.Status.POST_DONE

                        Все вот эти вот говнопроверки никуда не денутся, они просто переедут в логику движка.
                        Ответить
                      • Вот, например, метод, пробующий опубликовать пост:
                        >def try_post(self, session: requests.Session, auth_cookie: str) - 'PostForm.Status':
                            r = Form.safe_post_response(session,
                                                        _GK_ADD_URL,
                                                        data=self._to_form_dict(),
                                                        cookies=self._get_cookie_dict(auth_cookie))
                            if r is None:
                                self._dump_html_dated('post_post_error')
                                return PostForm.Status.POST_ERROR
                        
                            self.html = r.text
                            if 'liНеверно введен проверочный код!/li' in self.html \
                                    or 'liПроизвол не пройдёт! Укажите проверочный код!/li' in self.html:
                                L.error('PostForm.post(): Invalid captcha')
                                self.parse(self.html)
                                return PostForm.Status.INVALID_CAPTCHA
                        
                            elif r.status_code != 200:
                                self.parse(self.html)
                                L.error(f'PostForm.post(): invalid response (status_code {r.status_code})')
                                self._dump_html_dated('post_invalid_response')
                                return PostForm.Status.POST_ERROR
                            
                            post_url = r.url
                            m = _GK_POST_REDIRECT_RE.match(post_url)
                            if m is None:
                                L.error(f'PostForm.post(): invalid new post url ({post_url})')
                                self._dump_html_dated('post_invalid_url')
                                return PostForm.Status.POST_ERROR
                            self.post_id = int(m.group(1))
                        
                            m = _GK_COMMENTS_LIST_ID_REGEX.search(self.html)
                            if m is None:  # No return POST_ERROR, because the post is published
                                L.warning(f'PostForm.post(): could not find comments_list_id in post {self.post_id}')
                                self._dump_html_dated('post_no_list_id')
                            else:
                                self.comments_list_id = int(m.group(1))
                        
                            return PostForm.Status.POST_DONE

                        Все вот эти вот говнопроверки никуда не денутся, они просто переедут в логику движка.
                        Ответить
                      • Вот, например, метод, пробующий опубликовать пост:
                        >def try_post(self, session: requests.Session, auth_cookie: str) - 'PostForm.Status':
                            r = Form.safe_post_response(session,
                                                        _GK_ADD_URL,
                                                        data=self._to_form_dict(),
                                                        cookies=self._get_cookie_dict(auth_cookie))
                            if r is None:
                                self._dump_html_dated('post_post_error')
                                return PostForm.Status.POST_ERROR
                        
                            self.html = r.text
                            if 'liНеверно введен проверочный код!/li' in self.html \
                                    or 'liПроизвол не пройдёт! Укажите проверочный код!/li' in self.html:
                                L.error('PostForm.post(): Invalid captcha')
                                self.parse(self.html)
                                return PostForm.Status.INVALID_CAPTCHA
                        
                            elif r.status_code != 200:
                                self.parse(self.html)
                                L.error(f'PostForm.post(): invalid response (status_code {r.status_code})')
                                self._dump_html_dated('post_invalid_response')
                                return PostForm.Status.POST_ERROR
                            
                            post_url = r.url
                            m = _GK_POST_REDIRECT_RE.match(post_url)
                            if m is None:
                                L.error(f'PostForm.post(): invalid new post url ({post_url})')
                                self._dump_html_dated('post_invalid_url')
                                return PostForm.Status.POST_ERROR
                            self.post_id = int(m.group(1))
                        
                            m = _GK_COMMENTS_LIST_ID_REGEX.search(self.html)
                            if m is None:  # No return POST_ERROR, because the post is published
                                L.warning(f'PostForm.post(): could not find comments_list_id in post {self.post_id}')
                                self._dump_html_dated('post_no_list_id')
                            else:
                                self.comments_list_id = int(m.group(1))
                        
                            return PostForm.Status.POST_DONE

                        Все вот эти вот говнопроверки никуда не денутся, они просто переедут в логику движка.
                        Ответить
                      • Вот, например, метод, пробующий опубликовать пост:
                        >def try_post(self, session: requests.Session, auth_cookie: str) - 'PostForm.Status':
                            r = Form.safe_post_response(session,
                                                        _GK_ADD_URL,
                                                        data=self._to_form_dict(),
                                                        cookies=self._get_cookie_dict(auth_cookie))
                            if r is None:
                                self._dump_html_dated('post_post_error')
                                return PostForm.Status.POST_ERROR
                        
                            self.html = r.text
                            if 'liНеверно введен проверочный код!/li' in self.html \
                                    or 'liПроизвол не пройдёт! Укажите проверочный код!/li' in self.html:
                                L.error('PostForm.post(): Invalid captcha')
                                self.parse(self.html)
                                return PostForm.Status.INVALID_CAPTCHA
                        
                            elif r.status_code != 200:
                                self.parse(self.html)
                                L.error(f'PostForm.post(): invalid response (status_code {r.status_code})')
                                self._dump_html_dated('post_invalid_response')
                                return PostForm.Status.POST_ERROR
                            
                            post_url = r.url
                            m = _GK_POST_REDIRECT_RE.match(post_url)
                            if m is None:
                                L.error(f'PostForm.post(): invalid new post url ({post_url})')
                                self._dump_html_dated('post_invalid_url')
                                return PostForm.Status.POST_ERROR
                            self.post_id = int(m.group(1))
                        
                            m = _GK_COMMENTS_LIST_ID_REGEX.search(self.html)
                            if m is None:  # No return POST_ERROR, because the post is published
                                L.warning(f'PostForm.post(): could not find comments_list_id in post {self.post_id}')
                                self._dump_html_dated('post_no_list_id')
                            else:
                                self.comments_list_id = int(m.group(1))
                        
                            return PostForm.Status.POST_DONE

                        Все вот эти вот говнопроверки никуда не денутся, они просто переедут в логику движка.
                        Ответить
                      • Вот, например, метод, пробующий опубликовать пост:
                        >def try_post(self, session: requests.Session, auth_cookie: str) - 'PostForm.Status':
                            r = Form.safe_post_response(session,
                                                        _GK_ADD_URL,
                                                        data=self._to_form_dict(),
                                                        cookies=self._get_cookie_dict(auth_cookie))
                            if r is None:
                                self._dump_html_dated('post_post_error')
                                return PostForm.Status.POST_ERROR
                        
                            self.html = r.text
                            if 'liНеверно введен проверочный код!/li' in self.html \
                                    or 'liПроизвол не пройдёт! Укажите проверочный код!/li' in self.html:
                                L.error('PostForm.post(): Invalid captcha')
                                self.parse(self.html)
                                return PostForm.Status.INVALID_CAPTCHA
                        
                            elif r.status_code != 200:
                                self.parse(self.html)
                                L.error(f'PostForm.post(): invalid response (status_code {r.status_code})')
                                self._dump_html_dated('post_invalid_response')
                                return PostForm.Status.POST_ERROR
                            
                            post_url = r.url
                            m = _GK_POST_REDIRECT_RE.match(post_url)
                            if m is None:
                                L.error(f'PostForm.post(): invalid new post url ({post_url})')
                                self._dump_html_dated('post_invalid_url')
                                return PostForm.Status.POST_ERROR
                            self.post_id = int(m.group(1))
                        
                            m = _GK_COMMENTS_LIST_ID_REGEX.search(self.html)
                            if m is None:  # No return POST_ERROR, because the post is published
                                L.warning(f'PostForm.post(): could not find comments_list_id in post {self.post_id}')
                                self._dump_html_dated('post_no_list_id')
                            else:
                                self.comments_list_id = int(m.group(1))
                        
                            return PostForm.Status.POST_DONE

                        Все вот эти вот говнопроверки никуда не денутся, они просто переедут в логику движка.
                        Ответить
                      • Вот, например, метод, пробующий опубликовать пост:
                        >def try_post(self, session: requests.Session, auth_cookie: str) - 'PostForm.Status':
                            r = Form.safe_post_response(session,
                                                        _GK_ADD_URL,
                                                        data=self._to_form_dict(),
                                                        cookies=self._get_cookie_dict(auth_cookie))
                            if r is None:
                                self._dump_html_dated('post_post_error')
                                return PostForm.Status.POST_ERROR
                        
                            self.html = r.text
                            if 'liНеверно введен проверочный код!/li' in self.html \
                                    or 'liПроизвол не пройдёт! Укажите проверочный код!/li' in self.html:
                                L.error('PostForm.post(): Invalid captcha')
                                self.parse(self.html)
                                return PostForm.Status.INVALID_CAPTCHA
                        
                            elif r.status_code != 200:
                                self.parse(self.html)
                                L.error(f'PostForm.post(): invalid response (status_code {r.status_code})')
                                self._dump_html_dated('post_invalid_response')
                                return PostForm.Status.POST_ERROR
                            
                            post_url = r.url
                            m = _GK_POST_REDIRECT_RE.match(post_url)
                            if m is None:
                                L.error(f'PostForm.post(): invalid new post url ({post_url})')
                                self._dump_html_dated('post_invalid_url')
                                return PostForm.Status.POST_ERROR
                            self.post_id = int(m.group(1))
                        
                            m = _GK_COMMENTS_LIST_ID_REGEX.search(self.html)
                            if m is None:  # No return POST_ERROR, because the post is published
                                L.warning(f'PostForm.post(): could not find comments_list_id in post {self.post_id}')
                                self._dump_html_dated('post_no_list_id')
                            else:
                                self.comments_list_id = int(m.group(1))
                        
                            return PostForm.Status.POST_DONE

                        Все вот эти вот говнопроверки никуда не денутся, они просто переедут в логику движка.
                        Ответить
                      • Вот, например, метод, пробующий опубликовать пост:
                        >def try_post(self, session: requests.Session, auth_cookie: str) - 'PostForm.Status':
                            r = Form.safe_post_response(session,
                                                        _GK_ADD_URL,
                                                        data=self._to_form_dict(),
                                                        cookies=self._get_cookie_dict(auth_cookie))
                            if r is None:
                                self._dump_html_dated('post_post_error')
                                return PostForm.Status.POST_ERROR
                        
                            self.html = r.text
                            if 'liНеверно введен проверочный код!/li' in self.html \
                                    or 'liПроизвол не пройдёт! Укажите проверочный код!/li' in self.html:
                                L.error('PostForm.post(): Invalid captcha')
                                self.parse(self.html)
                                return PostForm.Status.INVALID_CAPTCHA
                        
                            elif r.status_code != 200:
                                self.parse(self.html)
                                L.error(f'PostForm.post(): invalid response (status_code {r.status_code})')
                                self._dump_html_dated('post_invalid_response')
                                return PostForm.Status.POST_ERROR
                            
                            post_url = r.url
                            m = _GK_POST_REDIRECT_RE.match(post_url)
                            if m is None:
                                L.error(f'PostForm.post(): invalid new post url ({post_url})')
                                self._dump_html_dated('post_invalid_url')
                                return PostForm.Status.POST_ERROR
                            self.post_id = int(m.group(1))
                        
                            m = _GK_COMMENTS_LIST_ID_REGEX.search(self.html)
                            if m is None:  # No return POST_ERROR, because the post is published
                                L.warning(f'PostForm.post(): could not find comments_list_id in post {self.post_id}')
                                self._dump_html_dated('post_no_list_id')
                            else:
                                self.comments_list_id = int(m.group(1))
                        
                            return PostForm.Status.POST_DONE

                        Все вот эти вот говнопроверки никуда не денутся, они просто переедут в логику движка.
                        Ответить
                      • Вот, например, метод, пробующий опубликовать пост:
                        >def try_post(self, session: requests.Session, auth_cookie: str) - 'PostForm.Status':
                            r = Form.safe_post_response(session,
                                                        _GK_ADD_URL,
                                                        data=self._to_form_dict(),
                                                        cookies=self._get_cookie_dict(auth_cookie))
                            if r is None:
                                self._dump_html_dated('post_post_error')
                                return PostForm.Status.POST_ERROR
                        
                            self.html = r.text
                            if 'liНеверно введен проверочный код!/li' in self.html \
                                    or 'liПроизвол не пройдёт! Укажите проверочный код!/li' in self.html:
                                L.error('PostForm.post(): Invalid captcha')
                                self.parse(self.html)
                                return PostForm.Status.INVALID_CAPTCHA
                        
                            elif r.status_code != 200:
                                self.parse(self.html)
                                L.error(f'PostForm.post(): invalid response (status_code {r.status_code})')
                                self._dump_html_dated('post_invalid_response')
                                return PostForm.Status.POST_ERROR
                            
                            post_url = r.url
                            m = _GK_POST_REDIRECT_RE.match(post_url)
                            if m is None:
                                L.error(f'PostForm.post(): invalid new post url ({post_url})')
                                self._dump_html_dated('post_invalid_url')
                                return PostForm.Status.POST_ERROR
                            self.post_id = int(m.group(1))
                        
                            m = _GK_COMMENTS_LIST_ID_REGEX.search(self.html)
                            if m is None:  # No return POST_ERROR, because the post is published
                                L.warning(f'PostForm.post(): could not find comments_list_id in post {self.post_id}')
                                self._dump_html_dated('post_no_list_id')
                            else:
                                self.comments_list_id = int(m.group(1))
                        
                            return PostForm.Status.POST_DONE

                        Все вот эти вот говнопроверки никуда не денутся, они просто переедут в логику движка.
                        Ответить
                      • Вот, например, метод, пробующий опубликовать пост:
                        >def try_post(self, session: requests.Session, auth_cookie: str) - 'PostForm.Status':
                            r = Form.safe_post_response(session,
                                                        _GK_ADD_URL,
                                                        data=self._to_form_dict(),
                                                        cookies=self._get_cookie_dict(auth_cookie))
                            if r is None:
                                self._dump_html_dated('post_post_error')
                                return PostForm.Status.POST_ERROR
                        
                            self.html = r.text
                            if 'liНеверно введен проверочный код!/li' in self.html \
                                    or 'liПроизвол не пройдёт! Укажите проверочный код!/li' in self.html:
                                L.error('PostForm.post(): Invalid captcha')
                                self.parse(self.html)
                                return PostForm.Status.INVALID_CAPTCHA
                        
                            elif r.status_code != 200:
                                self.parse(self.html)
                                L.error(f'PostForm.post(): invalid response (status_code {r.status_code})')
                                self._dump_html_dated('post_invalid_response')
                                return PostForm.Status.POST_ERROR
                            
                            post_url = r.url
                            m = _GK_POST_REDIRECT_RE.match(post_url)
                            if m is None:
                                L.error(f'PostForm.post(): invalid new post url ({post_url})')
                                self._dump_html_dated('post_invalid_url')
                                return PostForm.Status.POST_ERROR
                            self.post_id = int(m.group(1))
                        
                            m = _GK_COMMENTS_LIST_ID_REGEX.search(self.html)
                            if m is None:  # No return POST_ERROR, because the post is published
                                L.warning(f'PostForm.post(): could not find comments_list_id in post {self.post_id}')
                                self._dump_html_dated('post_no_list_id')
                            else:
                                self.comments_list_id = int(m.group(1))
                        
                            return PostForm.Status.POST_DONE

                        Все вот эти вот говнопроверки никуда не денутся, они просто переедут в логику движка.
                        Ответить
                      • Вот, например, метод, пробующий опубликовать пост:
                        >def try_post(self, session: requests.Session, auth_cookie: str) - 'PostForm.Status':
                            r = Form.safe_post_response(session,
                                                        _GK_ADD_URL,
                                                        data=self._to_form_dict(),
                                                        cookies=self._get_cookie_dict(auth_cookie))
                            if r is None:
                                self._dump_html_dated('post_post_error')
                                return PostForm.Status.POST_ERROR
                        
                            self.html = r.text
                            if 'liНеверно введен проверочный код!/li' in self.html \
                                    or 'liПроизвол не пройдёт! Укажите проверочный код!/li' in self.html:
                                L.error('PostForm.post(): Invalid captcha')
                                self.parse(self.html)
                                return PostForm.Status.INVALID_CAPTCHA
                        
                            elif r.status_code != 200:
                                self.parse(self.html)
                                L.error(f'PostForm.post(): invalid response (status_code {r.status_code})')
                                self._dump_html_dated('post_invalid_response')
                                return PostForm.Status.POST_ERROR
                            
                            post_url = r.url
                            m = _GK_POST_REDIRECT_RE.match(post_url)
                            if m is None:
                                L.error(f'PostForm.post(): invalid new post url ({post_url})')
                                self._dump_html_dated('post_invalid_url')
                                return PostForm.Status.POST_ERROR
                            self.post_id = int(m.group(1))
                        
                            m = _GK_COMMENTS_LIST_ID_REGEX.search(self.html)
                            if m is None:  # No return POST_ERROR, because the post is published
                                L.warning(f'PostForm.post(): could not find comments_list_id in post {self.post_id}')
                                self._dump_html_dated('post_no_list_id')
                            else:
                                self.comments_list_id = int(m.group(1))
                        
                            return PostForm.Status.POST_DONE

                        Все вот эти вот говнопроверки никуда не денутся, они просто переедут в логику движка.
                        Ответить
                      • Вот, например, метод, пробующий опубликовать пост:
                        >def try_post(self, session: requests.Session, auth_cookie: str) - 'PostForm.Status':
                            r = Form.safe_post_response(session,
                                                        _GK_ADD_URL,
                                                        data=self._to_form_dict(),
                                                        cookies=self._get_cookie_dict(auth_cookie))
                            if r is None:
                                self._dump_html_dated('post_post_error')
                                return PostForm.Status.POST_ERROR
                        
                            self.html = r.text
                            if 'liНеверно введен проверочный код!/li' in self.html \
                                    or 'liПроизвол не пройдёт! Укажите проверочный код!/li' in self.html:
                                L.error('PostForm.post(): Invalid captcha')
                                self.parse(self.html)
                                return PostForm.Status.INVALID_CAPTCHA
                        
                            elif r.status_code != 200:
                                self.parse(self.html)
                                L.error(f'PostForm.post(): invalid response (status_code {r.status_code})')
                                self._dump_html_dated('post_invalid_response')
                                return PostForm.Status.POST_ERROR
                            
                            post_url = r.url
                            m = _GK_POST_REDIRECT_RE.match(post_url)
                            if m is None:
                                L.error(f'PostForm.post(): invalid new post url ({post_url})')
                                self._dump_html_dated('post_invalid_url')
                                return PostForm.Status.POST_ERROR
                            self.post_id = int(m.group(1))
                        
                            m = _GK_COMMENTS_LIST_ID_REGEX.search(self.html)
                            if m is None:  # No return POST_ERROR, because the post is published
                                L.warning(f'PostForm.post(): could not find comments_list_id in post {self.post_id}')
                                self._dump_html_dated('post_no_list_id')
                            else:
                                self.comments_list_id = int(m.group(1))
                        
                            return PostForm.Status.POST_DONE

                        Все вот эти вот говнопроверки никуда не денутся, они просто переедут в логику движка.
                        Ответить
                      • Вот, например, метод, пробующий опубликовать пост:
                        >def try_post(self, session: requests.Session, auth_cookie: str) - 'PostForm.Status':
                            r = Form.safe_post_response(session,
                                                        _GK_ADD_URL,
                                                        data=self._to_form_dict(),
                                                        cookies=self._get_cookie_dict(auth_cookie))
                            if r is None:
                                self._dump_html_dated('post_post_error')
                                return PostForm.Status.POST_ERROR
                        
                            self.html = r.text
                            if 'liНеверно введен проверочный код!/li' in self.html \
                                    or 'liПроизвол не пройдёт! Укажите проверочный код!/li' in self.html:
                                L.error('PostForm.post(): Invalid captcha')
                                self.parse(self.html)
                                return PostForm.Status.INVALID_CAPTCHA
                        
                            elif r.status_code != 200:
                                self.parse(self.html)
                                L.error(f'PostForm.post(): invalid response (status_code {r.status_code})')
                                self._dump_html_dated('post_invalid_response')
                                return PostForm.Status.POST_ERROR
                            
                            post_url = r.url
                            m = _GK_POST_REDIRECT_RE.match(post_url)
                            if m is None:
                                L.error(f'PostForm.post(): invalid new post url ({post_url})')
                                self._dump_html_dated('post_invalid_url')
                                return PostForm.Status.POST_ERROR
                            self.post_id = int(m.group(1))
                        
                            m = _GK_COMMENTS_LIST_ID_REGEX.search(self.html)
                            if m is None:  # No return POST_ERROR, because the post is published
                                L.warning(f'PostForm.post(): could not find comments_list_id in post {self.post_id}')
                                self._dump_html_dated('post_no_list_id')
                            else:
                                self.comments_list_id = int(m.group(1))
                        
                            return PostForm.Status.POST_DONE

                        Все вот эти вот говнопроверки никуда не денутся, они просто переедут в логику движка.
                        Ответить
                      • Вот, например, метод, пробующий опубликовать пост:
                        >def try_post(self, session: requests.Session, auth_cookie: str) - 'PostForm.Status':
                            r = Form.safe_post_response(session,
                                                        _GK_ADD_URL,
                                                        data=self._to_form_dict(),
                                                        cookies=self._get_cookie_dict(auth_cookie))
                            if r is None:
                                self._dump_html_dated('post_post_error')
                                return PostForm.Status.POST_ERROR
                        
                            self.html = r.text
                            if 'liНеверно введен проверочный код!/li' in self.html \
                                    or 'liПроизвол не пройдёт! Укажите проверочный код!/li' in self.html:
                                L.error('PostForm.post(): Invalid captcha')
                                self.parse(self.html)
                                return PostForm.Status.INVALID_CAPTCHA
                        
                            elif r.status_code != 200:
                                self.parse(self.html)
                                L.error(f'PostForm.post(): invalid response (status_code {r.status_code})')
                                self._dump_html_dated('post_invalid_response')
                                return PostForm.Status.POST_ERROR
                            
                            post_url = r.url
                            m = _GK_POST_REDIRECT_RE.match(post_url)
                            if m is None:
                                L.error(f'PostForm.post(): invalid new post url ({post_url})')
                                self._dump_html_dated('post_invalid_url')
                                return PostForm.Status.POST_ERROR
                            self.post_id = int(m.group(1))
                        
                            m = _GK_COMMENTS_LIST_ID_REGEX.search(self.html)
                            if m is None:  # No return POST_ERROR, because the post is published
                                L.warning(f'PostForm.post(): could not find comments_list_id in post {self.post_id}')
                                self._dump_html_dated('post_no_list_id')
                            else:
                                self.comments_list_id = int(m.group(1))
                        
                            return PostForm.Status.POST_DONE

                        Все вот эти вот говнопроверки никуда не денутся, они просто переедут в логику движка.
                        Ответить
                      • Вот, например, метод, пробующий опубликовать пост:
                        >def try_post(self, session: requests.Session, auth_cookie: str) - 'PostForm.Status':
                            r = Form.safe_post_response(session,
                                                        _GK_ADD_URL,
                                                        data=self._to_form_dict(),
                                                        cookies=self._get_cookie_dict(auth_cookie))
                            if r is None:
                                self._dump_html_dated('post_post_error')
                                return PostForm.Status.POST_ERROR
                        
                            self.html = r.text
                            if 'liНеверно введен проверочный код!/li' in self.html \
                                    or 'liПроизвол не пройдёт! Укажите проверочный код!/li' in self.html:
                                L.error('PostForm.post(): Invalid captcha')
                                self.parse(self.html)
                                return PostForm.Status.INVALID_CAPTCHA
                        
                            elif r.status_code != 200:
                                self.parse(self.html)
                                L.error(f'PostForm.post(): invalid response (status_code {r.status_code})')
                                self._dump_html_dated('post_invalid_response')
                                return PostForm.Status.POST_ERROR
                            
                            post_url = r.url
                            m = _GK_POST_REDIRECT_RE.match(post_url)
                            if m is None:
                                L.error(f'PostForm.post(): invalid new post url ({post_url})')
                                self._dump_html_dated('post_invalid_url')
                                return PostForm.Status.POST_ERROR
                            self.post_id = int(m.group(1))
                        
                            m = _GK_COMMENTS_LIST_ID_REGEX.search(self.html)
                            if m is None:  # No return POST_ERROR, because the post is published
                                L.warning(f'PostForm.post(): could not find comments_list_id in post {self.post_id}')
                                self._dump_html_dated('post_no_list_id')
                            else:
                                self.comments_list_id = int(m.group(1))
                        
                            return PostForm.Status.POST_DONE

                        Все вот эти вот говнопроверки никуда не денутся, они просто переедут в логику движка.
                        Ответить
                      • Вот, например, метод, пробующий опубликовать пост:
                        >def try_post(self, session: requests.Session, auth_cookie: str) - 'PostForm.Status':
                            r = Form.safe_post_response(session,
                                                        _GK_ADD_URL,
                                                        data=self._to_form_dict(),
                                                        cookies=self._get_cookie_dict(auth_cookie))
                            if r is None:
                                self._dump_html_dated('post_post_error')
                                return PostForm.Status.POST_ERROR
                        
                            self.html = r.text
                            if 'liНеверно введен проверочный код!/li' in self.html \
                                    or 'liПроизвол не пройдёт! Укажите проверочный код!/li' in self.html:
                                L.error('PostForm.post(): Invalid captcha')
                                self.parse(self.html)
                                return PostForm.Status.INVALID_CAPTCHA
                        
                            elif r.status_code != 200:
                                self.parse(self.html)
                                L.error(f'PostForm.post(): invalid response (status_code {r.status_code})')
                                self._dump_html_dated('post_invalid_response')
                                return PostForm.Status.POST_ERROR
                            
                            post_url = r.url
                            m = _GK_POST_REDIRECT_RE.match(post_url)
                            if m is None:
                                L.error(f'PostForm.post(): invalid new post url ({post_url})')
                                self._dump_html_dated('post_invalid_url')
                                return PostForm.Status.POST_ERROR
                            self.post_id = int(m.group(1))
                        
                            m = _GK_COMMENTS_LIST_ID_REGEX.search(self.html)
                            if m is None:  # No return POST_ERROR, because the post is published
                                L.warning(f'PostForm.post(): could not find comments_list_id in post {self.post_id}')
                                self._dump_html_dated('post_no_list_id')
                            else:
                                self.comments_list_id = int(m.group(1))
                        
                            return PostForm.Status.POST_DONE

                        Все вот эти вот говнопроверки никуда не денутся, они просто переедут в логику движка.
                        Ответить
                      • Вот, например, метод, пробующий опубликовать пост:
                        >def try_post(self, session: requests.Session, auth_cookie: str) - 'PostForm.Status':
                            r = Form.safe_post_response(session,
                                                        _GK_ADD_URL,
                                                        data=self._to_form_dict(),
                                                        cookies=self._get_cookie_dict(auth_cookie))
                            if r is None:
                                self._dump_html_dated('post_post_error')
                                return PostForm.Status.POST_ERROR
                        
                            self.html = r.text
                            if 'liНеверно введен проверочный код!/li' in self.html \
                                    or 'liПроизвол не пройдёт! Укажите проверочный код!/li' in self.html:
                                L.error('PostForm.post(): Invalid captcha')
                                self.parse(self.html)
                                return PostForm.Status.INVALID_CAPTCHA
                        
                            elif r.status_code != 200:
                                self.parse(self.html)
                                L.error(f'PostForm.post(): invalid response (status_code {r.status_code})')
                                self._dump_html_dated('post_invalid_response')
                                return PostForm.Status.POST_ERROR
                            
                            post_url = r.url
                            m = _GK_POST_REDIRECT_RE.match(post_url)
                            if m is None:
                                L.error(f'PostForm.post(): invalid new post url ({post_url})')
                                self._dump_html_dated('post_invalid_url')
                                return PostForm.Status.POST_ERROR
                            self.post_id = int(m.group(1))
                        
                            m = _GK_COMMENTS_LIST_ID_REGEX.search(self.html)
                            if m is None:  # No return POST_ERROR, because the post is published
                                L.warning(f'PostForm.post(): could not find comments_list_id in post {self.post_id}')
                                self._dump_html_dated('post_no_list_id')
                            else:
                                self.comments_list_id = int(m.group(1))
                        
                            return PostForm.Status.POST_DONE

                        Все вот эти вот говнопроверки никуда не денутся, они просто переедут в логику движка.
                        Ответить
                      • Вот, например, метод, пробующий опубликовать пост:
                        >def try_post(self, session: requests.Session, auth_cookie: str) - 'PostForm.Status':
                            r = Form.safe_post_response(session,
                                                        _GK_ADD_URL,
                                                        data=self._to_form_dict(),
                                                        cookies=self._get_cookie_dict(auth_cookie))
                            if r is None:
                                self._dump_html_dated('post_post_error')
                                return PostForm.Status.POST_ERROR
                        
                            self.html = r.text
                            if 'liНеверно введен проверочный код!/li' in self.html \
                                    or 'liПроизвол не пройдёт! Укажите проверочный код!/li' in self.html:
                                L.error('PostForm.post(): Invalid captcha')
                                self.parse(self.html)
                                return PostForm.Status.INVALID_CAPTCHA
                        
                            elif r.status_code != 200:
                                self.parse(self.html)
                                L.error(f'PostForm.post(): invalid response (status_code {r.status_code})')
                                self._dump_html_dated('post_invalid_response')
                                return PostForm.Status.POST_ERROR
                            
                            post_url = r.url
                            m = _GK_POST_REDIRECT_RE.match(post_url)
                            if m is None:
                                L.error(f'PostForm.post(): invalid new post url ({post_url})')
                                self._dump_html_dated('post_invalid_url')
                                return PostForm.Status.POST_ERROR
                            self.post_id = int(m.group(1))
                        
                            m = _GK_COMMENTS_LIST_ID_REGEX.search(self.html)
                            if m is None:  # No return POST_ERROR, because the post is published
                                L.warning(f'PostForm.post(): could not find comments_list_id in post {self.post_id}')
                                self._dump_html_dated('post_no_list_id')
                            else:
                                self.comments_list_id = int(m.group(1))
                        
                            return PostForm.Status.POST_DONE

                        Все вот эти вот говнопроверки никуда не денутся, они просто переедут в логику движка.
                        Ответить
      • Блядь, оказывается, 15-го августа перекатный петух завис и нихуя не проверял. Ненавижу делать надёжные приложения, которым нужно активно стучаться в сеть.
        Ответить
      • Блядь, оказывается, 15-го августа перекатный петух завис и нихуя не проверял. Ненавижу делать надёжные приложения, которым нужно активно стучаться в сеть.
        Ответить
      • Блядь, оказывается, 15-го августа перекатный петух завис и нихуя не проверял. Ненавижу делать надёжные приложения, которым нужно активно стучаться в сеть.
        Ответить
      • Блядь, оказывается, 15-го августа перекатный петух завис и нихуя не проверял. Ненавижу делать надёжные приложения, которым нужно активно стучаться в сеть.
        Ответить
      • Блядь, оказывается, 15-го августа перекатный петух завис и нихуя не проверял. Ненавижу делать надёжные приложения, которым нужно активно стучаться в сеть.
        Ответить
      • Блядь, оказывается, 15-го августа перекатный петух завис и нихуя не проверял. Ненавижу делать надёжные приложения, которым нужно активно стучаться в сеть.
        Ответить
      • Блядь, оказывается, 15-го августа перекатный петух завис и нихуя не проверял. Ненавижу делать надёжные приложения, которым нужно активно стучаться в сеть.
        Ответить
      • Блядь, оказывается, 15-го августа перекатный петух завис и нихуя не проверял. Ненавижу делать надёжные приложения, которым нужно активно стучаться в сеть.
        Ответить
      • Блядь, оказывается, 15-го августа перекатный петух завис и нихуя не проверял. Ненавижу делать надёжные приложения, которым нужно активно стучаться в сеть.
        Ответить
      • Блядь, оказывается, 15-го августа перекатный петух завис и нихуя не проверял. Ненавижу делать надёжные приложения, которым нужно активно стучаться в сеть.
        Ответить
      • Блядь, оказывается, 15-го августа перекатный петух завис и нихуя не проверял. Ненавижу делать надёжные приложения, которым нужно активно стучаться в сеть.
        Ответить
      • Блядь, оказывается, 15-го августа перекатный петух завис и нихуя не проверял. Ненавижу делать надёжные приложения, которым нужно активно стучаться в сеть.
        Ответить
      • Блядь, оказывается, 15-го августа перекатный петух завис и нихуя не проверял. Ненавижу делать надёжные приложения, которым нужно активно стучаться в сеть.
        Ответить
      • Блядь, оказывается, 15-го августа перекатный петух завис и нихуя не проверял. Ненавижу делать надёжные приложения, которым нужно активно стучаться в сеть.
        Ответить
      • Блядь, оказывается, 15-го августа перекатный петух завис и нихуя не проверял. Ненавижу делать надёжные приложения, которым нужно активно стучаться в сеть.
        Ответить
      • Блядь, оказывается, 15-го августа перекатный петух завис и нихуя не проверял. Ненавижу делать надёжные приложения, которым нужно активно стучаться в сеть.
        Ответить
      • Блядь, оказывается, 15-го августа перекатный петух завис и нихуя не проверял. Ненавижу делать надёжные приложения, которым нужно активно стучаться в сеть.
        Ответить
      • Блядь, оказывается, 15-го августа перекатный петух завис и нихуя не проверял. Ненавижу делать надёжные приложения, которым нужно активно стучаться в сеть.
        Ответить
      • Блядь, оказывается, 15-го августа перекатный петух завис и нихуя не проверял. Ненавижу делать надёжные приложения, которым нужно активно стучаться в сеть.
        Ответить
      • Блядь, оказывается, 15-го августа перекатный петух завис и нихуя не проверял. Ненавижу делать надёжные приложения, которым нужно активно стучаться в сеть.
        Ответить
      • Блядь, оказывается, 15-го августа перекатный петух завис и нихуя не проверял. Ненавижу делать надёжные приложения, которым нужно активно стучаться в сеть.
        Ответить
      • Блядь, оказывается, 15-го августа перекатный петух завис и нихуя не проверял. Ненавижу делать надёжные приложения, которым нужно активно стучаться в сеть.
        Ответить
      • Блядь, оказывается, 15-го августа перекатный петух завис и нихуя не проверял. Ненавижу делать надёжные приложения, которым нужно активно стучаться в сеть.
        Ответить
      • Блядь, оказывается, 15-го августа перекатный петух завис и нихуя не проверял. Ненавижу делать надёжные приложения, которым нужно активно стучаться в сеть.
        Ответить
      • Блядь, оказывается, 15-го августа перекатный петух завис и нихуя не проверял. Ненавижу делать надёжные приложения, которым нужно активно стучаться в сеть.
        Ответить
  • https://habr.com/post/516230/
    > Blue-Green Deployment на минималках
    >
    ensure-reverse-proxy() {
        is-container-up reverse-proxy && return 0
        echo "Deploying reverse-proxy..."
        docker network create web-gateway
        docker run \
            --detach \
            --restart always \
            --log-driver journald \
            --name reverse-proxy \
            --network web-gateway \
            --publish 80:80 \
            nginx:alpine || return 1
        docker exec --interactive reverse-proxy sh -c "> /etc/nginx/conf.d/default.conf"
        docker exec reverse-proxy nginx -s reload
    }
    
    is-container-up() {
        local container=${1?"Usage: ${FUNCNAME[0]} container_name"}
    
        [ -n "$(docker ps -f name=${container} -q)" ]
        return $?
    }
    
    get-active-slot() {
        local service=${1?"Usage: ${FUNCNAME[0]} service_name"}
    
        if is-container-up ${service}_BLUE && is-container-up ${service}_GREEN; then
            echo "Collision detected! Stopping ${service}_GREEN..."
            docker rm -f ${service}_GREEN
            return 0  # BLUE
        fi
        if is-container-up ${service}_BLUE && ! is-container-up ${service}_GREEN; then
            return 0  # BLUE
        fi
        if ! is-container-up ${service}_BLUE; then
            return 1  # GREEN
        fi
    }
    
    get-service-status() {
        local usage_msg="Usage: ${FUNCNAME[0]} service_name deployment_slot"
        local service=${1?usage_msg}
        local slot=${2?$usage_msg}
    
        case $service in
            # Add specific healthcheck paths for your services here
            *) local health_check_port_path=":8080/" ;;
        esac
        local health_check_address="http://${service}_${slot}${health_check_port_path}"
        # [...] gost: ещё 500+ символов

    Блядь, как всё сложно, именно поэтому я за «index.php» по «FTP».

    И да, этот скрипт — только маленькая часть всей статьи.
    Ответить
      • «index.php» может быть хоть какой: хоть «index_green.php», хоть «index_red.php», хоть «index_blue.php»!
        Ответить
      • Ну и, кстати, в статье тоже нихуя не гринблю.
        >>> Biblusha
        >>> После поднятия второго контейнера и исправления файла в nginx старый контейнер убивается. Как в таком случаи поведут себя активные соединения с этим контейнером?

        И это даже не говоря про всяческие «вебсокеты», которые от такого гринблю сами позеленеют.
        Ответить
        • С тем же успехом можно просто залить по «FTP» новый «index.php», лол. Работать будет точно так же.
          Ответить
        • Ну так для нормальной гринбли нужен фронт и такое понятие как "опустошение" (забыл как по-пиндосски правильно): в течение этого времени НОВЫЕ запросы идут на НОВЫЙ контейнер, а старые пока еще держаца.
          Рано или поздно старые коннекты все заканчиваются, и тогда вот старый ложица.
          Ответить
          • Ну да. Поэтому убийство старого контейнера сразу после запуска нового — это не настоящий гринблю, это граблю́ просто стандартный деплой, дополнительно запутанный и переусложнённый.


            И, кстати, деплой «index.php» по «FTP» не вызывает простоев сервиса на перезапуск, а потому и всяческий гринблю не нужен. Именно поэтому я за «PHP».
            Ответить
            • с index.php есть такая проблема, что в какой-то момент index.php уже новый, а funcii.php еще старый, и пользователь может в этот момент попасть.

              потому я стараюсь весь код иметь в одном файле
              Ответить
          • > в течение этого времени НОВЫЕ запросы идут на НОВЫЙ контейнер, а старые пока еще держаца.
            Кстати, как умные дяди это делают?
            Я вижу так: после смены контейнеров запускается скрипт, который периодически проверяет «ss»/«что там у докера есть для этого» на предмет наличия подключений к синему контейнеру, когда они исчезают — синий контейнер убивается. С «вебсокетами», правда, есть проблема: какой-нибудь упорный клиент может год сидеть с открытой вкладкой, и тогда старая версия приложения так и не умрёт. Думаю, можно либо просто через сутки принудительно обрывать коннект («ладно, похуй»), либо реализовывать поддержку на стороне приложения, добавляя команду мягкого перезапуска вебсокет-соединения с клиентом без потерь данных.
            Ответить
            • Я вспомнил слово: draining.

              Вот дяди в AWS делают так: все запросы идут через фронт (application load balancer), так что он сам в курсе всех запросов.

              Новые шлются на новый. Но уже существующие TCP соединения на старый (находящийся в состоянии "draining") не рвутся.

              Приложение, если оно умное, должно использовать спец API чтобы понять, что оно draining, и как-то среагировать: или перезагрузить страницу, или явно сказать пользователю "сейчас перезагржусь братан, извини".

              Фронт лоад балансер еще умеет как-то стикать пользователей к бекендам: у него свои сессии (через куки, например) и он делает так, чтобы все твои запросы шли на один бек, иначе может быть петрушка
              Ответить
              • > Приложение, если оно умное, должно использовать спец API чтобы понять, что оно draining, и как-то среагировать
                А, понятно. Я думал, такое дело автоматизировали, чтобы приложение могло вообще ни о каких гринблюях не знать.
                Ответить
                • Ну во-первых все равно оно должно быть готово работать в одной базе с другой версией себя, так что совсем не знать не получица.

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

                  В версии 1 у тебя были состояния A, B, C.
                  И вот у тебя клиент в состоянии "B".

                  А в версии 2 у тебя состояния "Q, Z, D".
                  Тут уже никак "прозрачно" не обновишься>

                  Да и наконец есть фронтэнд: если поменялся JS, то точно надо обновить страницу.\


                  Можно дрейнить час, а потом ложить старую версию просто.
                  За час N% питухов отвалится или обновит страницу
                  Ответить
                  • > Ну во-первых все равно оно должно быть готово работать в одной базе с другой версией себя, так что совсем не знать не получица.
                    А почему оно может не уметь работать с базой одновременно с другой версией себя? Разве что приложение на старте эксклюзивную блокировку БД берёт, но это какой-то кал.

                    > Во-вторых если у тебя есть уже TCP соединение, то довольно сложно перевести его на другой сервер
                    Так и не надо его переводить. Я ж как раз предложил дождаться, когда со старым контейнером соединений не будет, и только после этого убить. Проблема только с «вебсокетами», которые могут висеть неограниченно долго.
                    Ответить
                    • потому что новая версия пишет заказы с сайта в таблицу Foo, а старая -- в таблицу Bar.
                      А еще при миграции на новую версию переименовали колонку в базе.

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

                      Именно потому я за "Web 1.0"
                      Ответить
                      • А, ну да, с миграциями жопа будет.

                        > Если вебсокетов нет, то приложение и не обязано ничего знать о гринбле (ну если не считать базы). Просто в какой-то момент пользогватель обновит страницу, и попадет уже на новое.
                        Я об этом и говорил, интересуясь, существуют ли более энтерпрайзные решения этой задачи.
                        >>> Я вижу так: после смены контейнеров запускается скрипт, который периодически проверяет «ss»/«что там у докера есть для этого» на предмет наличия подключений к синему контейнеру, когда они исчезают — синий контейнер убивается.
                        Ответить
                        • А, ну да, с миграциями жопа будет.

                          Если вебсокетов нет, то приложение и не обязано ничего знать о гринбле (ну если не считать базы). Просто в какой-то момент пользогватель обновит страницу, и попадет уже на новое.
                          Я об этом и говорил, интересуясь, существуют ли более энтерпрайзные решения этой задачи.
                          Я вижу так: после смены контейнеров запускается скрипт, который периодически проверяет «ss»/«что там у докера есть для этого» на предмет наличия подключений к синему контейнеру, когда они исчезают — синий контейнер убивается.
                          Ответить
                        • А, ну да, с миграциями жопа будет.

                          Если вебсокетов нет, то приложение и не обязано ничего знать о гринбле (ну если не считать базы). Просто в какой-то момент пользогватель обновит страницу, и попадет уже на новое.
                          Я об этом и говорил, интересуясь, существуют ли более энтерпрайзные решения этой задачи.
                          Я вижу так: после смены контейнеров запускается скрипт, который периодически проверяет «ss»/«что там у докера есть для этого» на предмет наличия подключений к синему контейнеру, когда они исчезают — синий контейнер убивается.
                          Ответить
                        • А, ну да, с миграциями жопа будет.

                          Если вебсокетов нет, то приложение и не обязано ничего знать о гринбле (ну если не считать базы). Просто в какой-то момент пользогватель обновит страницу, и попадет уже на новое.
                          Я об этом и говорил, интересуясь, существуют ли более энтерпрайзные решения этой задачи.
                          Я вижу так: после смены контейнеров запускается скрипт, который периодически проверяет «ss»/«что там у докера есть для этого» на предмет наличия подключений к синему контейнеру, когда они исчезают — синий контейнер убивается.
                          Ответить
                        • А, ну да, с миграциями жопа будет.

                          Если вебсокетов нет, то приложение и не обязано ничего знать о гринбле (ну если не считать базы). Просто в какой-то момент пользогватель обновит страницу, и попадет уже на новое.
                          Я об этом и говорил, интересуясь, существуют ли более энтерпрайзные решения этой задачи.
                          Я вижу так: после смены контейнеров запускается скрипт, который периодически проверяет «ss»/«что там у докера есть для этого» на предмет наличия подключений к синему контейнеру, когда они исчезают — синий контейнер убивается.
                          Ответить
                        • А, ну да, с миграциями жопа будет.

                          Если вебсокетов нет, то приложение и не обязано ничего знать о гринбле (ну если не считать базы). Просто в какой-то момент пользогватель обновит страницу, и попадет уже на новое.
                          Я об этом и говорил, интересуясь, существуют ли более энтерпрайзные решения этой задачи.
                          Я вижу так: после смены контейнеров запускается скрипт, который периодически проверяет «ss»/«что там у докера есть для этого» на предмет наличия подключений к синему контейнеру, когда они исчезают — синий контейнер убивается.
                          Ответить
                        • А, ну да, с миграциями жопа будет.

                          Если вебсокетов нет, то приложение и не обязано ничего знать о гринбле (ну если не считать базы). Просто в какой-то момент пользогватель обновит страницу, и попадет уже на новое.
                          Я об этом и говорил, интересуясь, существуют ли более энтерпрайзные решения этой задачи.
                          Я вижу так: после смены контейнеров запускается скрипт, который периодически проверяет «ss»/«что там у докера есть для этого» на предмет наличия подключений к синему контейнеру, когда они исчезают — синий контейнер убивается.
                          Ответить
                        • А, ну да, с миграциями жопа будет.

                          Если вебсокетов нет, то приложение и не обязано ничего знать о гринбле (ну если не считать базы). Просто в какой-то момент пользогватель обновит страницу, и попадет уже на новое.
                          Я об этом и говорил, интересуясь, существуют ли более энтерпрайзные решения этой задачи.
                          Я вижу так: после смены контейнеров запускается скрипт, который периодически проверяет «ss»/«что там у докера есть для этого» на предмет наличия подключений к синему контейнеру, когда они исчезают — синий контейнер убивается.
                          Ответить
                        • А, ну да, с миграциями жопа будет.

                          Если вебсокетов нет, то приложение и не обязано ничего знать о гринбле (ну если не считать базы). Просто в какой-то момент пользогватель обновит страницу, и попадет уже на новое.
                          Я об этом и говорил, интересуясь, существуют ли более энтерпрайзные решения этой задачи.
                          Я вижу так: после смены контейнеров запускается скрипт, который периодически проверяет «ss»/«что там у докера есть для этого» на предмет наличия подключений к синему контейнеру, когда они исчезают — синий контейнер убивается.
                          Ответить
                        • А, ну да, с миграциями жопа будет.

                          Если вебсокетов нет, то приложение и не обязано ничего знать о гринбле (ну если не считать базы). Просто в какой-то момент пользогватель обновит страницу, и попадет уже на новое.
                          Я об этом и говорил, интересуясь, существуют ли более энтерпрайзные решения этой задачи.
                          Я вижу так: после смены контейнеров запускается скрипт, который периодически проверяет «ss»/«что там у докера есть для этого» на предмет наличия подключений к синему контейнеру, когда они исчезают — синий контейнер убивается.
                          Ответить
                        • А, ну да, с миграциями жопа будет.

                          Если вебсокетов нет, то приложение и не обязано ничего знать о гринбле (ну если не считать базы). Просто в какой-то момент пользогватель обновит страницу, и попадет уже на новое.
                          Я об этом и говорил, интересуясь, существуют ли более энтерпрайзные решения этой задачи.
                          Я вижу так: после смены контейнеров запускается скрипт, который периодически проверяет «ss»/«что там у докера есть для этого» на предмет наличия подключений к синему контейнеру, когда они исчезают — синий контейнер убивается.
                          Ответить
                        • А, ну да, с миграциями жопа будет.

                          Если вебсокетов нет, то приложение и не обязано ничего знать о гринбле (ну если не считать базы). Просто в какой-то момент пользогватель обновит страницу, и попадет уже на новое.
                          Я об этом и говорил, интересуясь, существуют ли более энтерпрайзные решения этой задачи.
                          Я вижу так: после смены контейнеров запускается скрипт, который периодически проверяет «ss»/«что там у докера есть для этого» на предмет наличия подключений к синему контейнеру, когда они исчезают — синий контейнер убивается.
                          Ответить
                        • А, ну да, с миграциями жопа будет.

                          Если вебсокетов нет, то приложение и не обязано ничего знать о гринбле (ну если не считать базы). Просто в какой-то момент пользогватель обновит страницу, и попадет уже на новое.
                          Я об этом и говорил, интересуясь, существуют ли более энтерпрайзные решения этой задачи.
                          Я вижу так: после смены контейнеров запускается скрипт, который периодически проверяет «ss»/«что там у докера есть для этого» на предмет наличия подключений к синему контейнеру, когда они исчезают — синий контейнер убивается.
                          Ответить
                        • А, ну да, с миграциями жопа будет.

                          Если вебсокетов нет, то приложение и не обязано ничего знать о гринбле (ну если не считать базы). Просто в какой-то момент пользогватель обновит страницу, и попадет уже на новое.
                          Я об этом и говорил, интересуясь, существуют ли более энтерпрайзные решения этой задачи.
                          Я вижу так: после смены контейнеров запускается скрипт, который периодически проверяет «ss»/«что там у докера есть для этого» на предмет наличия подключений к синему контейнеру, когда они исчезают — синий контейнер убивается.
                          Ответить
                        • А, ну да, с миграциями жопа будет.

                          Если вебсокетов нет, то приложение и не обязано ничего знать о гринбле (ну если не считать базы). Просто в какой-то момент пользогватель обновит страницу, и попадет уже на новое.
                          Я об этом и говорил, интересуясь, существуют ли более энтерпрайзные решения этой задачи.
                          Я вижу так: после смены контейнеров запускается скрипт, который периодически проверяет «ss»/«что там у докера есть для этого» на предмет наличия подключений к синему контейнеру, когда они исчезают — синий контейнер убивается.
                          Ответить
                        • А, ну да, с миграциями жопа будет.

                          Если вебсокетов нет, то приложение и не обязано ничего знать о гринбле (ну если не считать базы). Просто в какой-то момент пользогватель обновит страницу, и попадет уже на новое.
                          Я об этом и говорил, интересуясь, существуют ли более энтерпрайзные решения этой задачи.
                          Я вижу так: после смены контейнеров запускается скрипт, который периодически проверяет «ss»/«что там у докера есть для этого» на предмет наличия подключений к синему контейнеру, когда они исчезают — синий контейнер убивается.
                          Ответить
                        • А, ну да, с миграциями жопа будет.

                          Если вебсокетов нет, то приложение и не обязано ничего знать о гринбле (ну если не считать базы). Просто в какой-то момент пользогватель обновит страницу, и попадет уже на новое.
                          Я об этом и говорил, интересуясь, существуют ли более энтерпрайзные решения этой задачи.
                          Я вижу так: после смены контейнеров запускается скрипт, который периодически проверяет «ss»/«что там у докера есть для этого» на предмет наличия подключений к синему контейнеру, когда они исчезают — синий контейнер убивается.
                          Ответить
                        • А, ну да, с миграциями жопа будет.

                          Если вебсокетов нет, то приложение и не обязано ничего знать о гринбле (ну если не считать базы). Просто в какой-то момент пользогватель обновит страницу, и попадет уже на новое.
                          Я об этом и говорил, интересуясь, существуют ли более энтерпрайзные решения этой задачи.
                          Я вижу так: после смены контейнеров запускается скрипт, который периодически проверяет «ss»/«что там у докера есть для этого» на предмет наличия подключений к синему контейнеру, когда они исчезают — синий контейнер убивается.
                          Ответить
                        • А, ну да, с миграциями жопа будет.

                          Если вебсокетов нет, то приложение и не обязано ничего знать о гринбле (ну если не считать базы). Просто в какой-то момент пользогватель обновит страницу, и попадет уже на новое.
                          Я об этом и говорил, интересуясь, существуют ли более энтерпрайзные решения этой задачи.
                          Я вижу так: после смены контейнеров запускается скрипт, который периодически проверяет «ss»/«что там у докера есть для этого» на предмет наличия подключений к синему контейнеру, когда они исчезают — синий контейнер убивается.
                          Ответить
                        • А, ну да, с миграциями жопа будет.

                          Если вебсокетов нет, то приложение и не обязано ничего знать о гринбле (ну если не считать базы). Просто в какой-то момент пользогватель обновит страницу, и попадет уже на новое.
                          Я об этом и говорил, интересуясь, существуют ли более энтерпрайзные решения этой задачи.
                          Я вижу так: после смены контейнеров запускается скрипт, который периодически проверяет «ss»/«что там у докера есть для этого» на предмет наличия подключений к синему контейнеру, когда они исчезают — синий контейнер убивается.
                          Ответить
                        • А, ну да, с миграциями жопа будет.

                          Если вебсокетов нет, то приложение и не обязано ничего знать о гринбле (ну если не считать базы). Просто в какой-то момент пользогватель обновит страницу, и попадет уже на новое.
                          Я об этом и говорил, интересуясь, существуют ли более энтерпрайзные решения этой задачи.
                          Я вижу так: после смены контейнеров запускается скрипт, который периодически проверяет «ss»/«что там у докера есть для этого» на предмет наличия подключений к синему контейнеру, когда они исчезают — синий контейнер убивается.
                          Ответить
                        • А, ну да, с миграциями жопа будет.

                          Если вебсокетов нет, то приложение и не обязано ничего знать о гринбле (ну если не считать базы). Просто в какой-то момент пользогватель обновит страницу, и попадет уже на новое.
                          Я об этом и говорил, интересуясь, существуют ли более энтерпрайзные решения этой задачи.
                          Я вижу так: после смены контейнеров запускается скрипт, который периодически проверяет «ss»/«что там у докера есть для этого» на предмет наличия подключений к синему контейнеру, когда они исчезают — синий контейнер убивается.
                          Ответить
                        • А, ну да, с миграциями жопа будет.

                          Если вебсокетов нет, то приложение и не обязано ничего знать о гринбле (ну если не считать базы). Просто в какой-то момент пользогватель обновит страницу, и попадет уже на новое.
                          Я об этом и говорил, интересуясь, существуют ли более энтерпрайзные решения этой задачи.
                          Я вижу так: после смены контейнеров запускается скрипт, который периодически проверяет «ss»/«что там у докера есть для этого» на предмет наличия подключений к синему контейнеру, когда они исчезают — синий контейнер убивается.
                          Ответить
                        • А, ну да, с миграциями жопа будет.

                          Если вебсокетов нет, то приложение и не обязано ничего знать о гринбле (ну если не считать базы). Просто в какой-то момент пользогватель обновит страницу, и попадет уже на новое.
                          Я об этом и говорил, интересуясь, существуют ли более энтерпрайзные решения этой задачи.
                          Я вижу так: после смены контейнеров запускается скрипт, который периодически проверяет «ss»/«что там у докера есть для этого» на предмет наличия подключений к синему контейнеру, когда они исчезают — синий контейнер убивается.
                          Ответить
                        • А, ну да, с миграциями жопа будет.

                          Если вебсокетов нет, то приложение и не обязано ничего знать о гринбле (ну если не считать базы). Просто в какой-то момент пользогватель обновит страницу, и попадет уже на новое.
                          Я об этом и говорил, интересуясь, существуют ли более энтерпрайзные решения этой задачи.
                          Я вижу так: после смены контейнеров запускается скрипт, который периодически проверяет «ss»/«что там у докера есть для этого» на предмет наличия подключений к синему контейнеру, когда они исчезают — синий контейнер убивается.
                          Ответить
                        • А, ну да, с миграциями жопа будет.

                          Если вебсокетов нет, то приложение и не обязано ничего знать о гринбле (ну если не считать базы). Просто в какой-то момент пользогватель обновит страницу, и попадет уже на новое.
                          Я об этом и говорил, интересуясь, существуют ли более энтерпрайзные решения этой задачи.
                          Я вижу так: после смены контейнеров запускается скрипт, который периодически проверяет «ss»/«что там у докера есть для этого» на предмет наличия подключений к синему контейнеру, когда они исчезают — синий контейнер убивается.
                          Ответить
                        • в гринбле все миграции придется писать руками и много думать, джанговые из коробки соснут, например.

                          Гринбля вообще не дешевая штука: усложняется и деплоймент, и разработка. Нужно подумать реально ли тебе она нужна.
                          Очень часто даунтайм в течение десяти секунд в ночь субботы на воскресение это ок.
                          Конечно, если ты не Яндекс
                          Ответить
                          • > Очень часто даунтайм в течение десяти секунд в ночь субботы на воскресение это ок.
                            > Конечно, если ты не Яндекс
                            Ну вот, а я не так давно обновлял ночью «НГК» — получил жалобы от пользователей на 503-и ошибки. Получается, «НГК» почти как «Яндекс»!
                            Ответить
                            • попробуй с 6:30 AM до 6:40 AM по MSK, проверим
                              Ответить
                            • Очень часто даунтайм в течение десяти секунд в ночь субботы на воскресение это ок.
                              Конечно, если ты не Яндекс
                              Ну вот, а я не так давно обновлял ночью «НГК» — получил жалобы от пользователей на 503-и ошибки. Получается, «НГК» почти как «Яндекс»!
                              Ответить
                            • Очень часто даунтайм в течение десяти секунд в ночь субботы на воскресение это ок.
                              Конечно, если ты не Яндекс
                              Ну вот, а я не так давно обновлял ночью «НГК» — получил жалобы от пользователей на 503-и ошибки. Получается, «НГК» почти как «Яндекс»!
                              Ответить
                            • Очень часто даунтайм в течение десяти секунд в ночь субботы на воскресение это ок.
                              Конечно, если ты не Яндекс
                              Ну вот, а я не так давно обновлял ночью «НГК» — получил жалобы от пользователей на 503-и ошибки. Получается, «НГК» почти как «Яндекс»!
                              Ответить
                            • Очень часто даунтайм в течение десяти секунд в ночь субботы на воскресение это ок.
                              Конечно, если ты не Яндекс
                              Ну вот, а я не так давно обновлял ночью «НГК» — получил жалобы от пользователей на 503-и ошибки. Получается, «НГК» почти как «Яндекс»!
                              Ответить
                            • Очень часто даунтайм в течение десяти секунд в ночь субботы на воскресение это ок.
                              Конечно, если ты не Яндекс
                              Ну вот, а я не так давно обновлял ночью «НГК» — получил жалобы от пользователей на 503-и ошибки. Получается, «НГК» почти как «Яндекс»!
                              Ответить
                            • Очень часто даунтайм в течение десяти секунд в ночь субботы на воскресение это ок.
                              Конечно, если ты не Яндекс
                              Ну вот, а я не так давно обновлял ночью «НГК» — получил жалобы от пользователей на 503-и ошибки. Получается, «НГК» почти как «Яндекс»!
                              Ответить
                            • Очень часто даунтайм в течение десяти секунд в ночь субботы на воскресение это ок.
                              Конечно, если ты не Яндекс
                              Ну вот, а я не так давно обновлял ночью «НГК» — получил жалобы от пользователей на 503-и ошибки. Получается, «НГК» почти как «Яндекс»!
                              Ответить
                            • Очень часто даунтайм в течение десяти секунд в ночь субботы на воскресение это ок.
                              Конечно, если ты не Яндекс
                              Ну вот, а я не так давно обновлял ночью «НГК» — получил жалобы от пользователей на 503-и ошибки. Получается, «НГК» почти как «Яндекс»!
                              Ответить
                            • Очень часто даунтайм в течение десяти секунд в ночь субботы на воскресение это ок.
                              Конечно, если ты не Яндекс
                              Ну вот, а я не так давно обновлял ночью «НГК» — получил жалобы от пользователей на 503-и ошибки. Получается, «НГК» почти как «Яндекс»!
                              Ответить
                            • Очень часто даунтайм в течение десяти секунд в ночь субботы на воскресение это ок.
                              Конечно, если ты не Яндекс
                              Ну вот, а я не так давно обновлял ночью «НГК» — получил жалобы от пользователей на 503-и ошибки. Получается, «НГК» почти как «Яндекс»!
                              Ответить
                            • Очень часто даунтайм в течение десяти секунд в ночь субботы на воскресение это ок.
                              Конечно, если ты не Яндекс
                              Ну вот, а я не так давно обновлял ночью «НГК» — получил жалобы от пользователей на 503-и ошибки. Получается, «НГК» почти как «Яндекс»!
                              Ответить
                            • Очень часто даунтайм в течение десяти секунд в ночь субботы на воскресение это ок.
                              Конечно, если ты не Яндекс
                              Ну вот, а я не так давно обновлял ночью «НГК» — получил жалобы от пользователей на 503-и ошибки. Получается, «НГК» почти как «Яндекс»!
                              Ответить
                            • Очень часто даунтайм в течение десяти секунд в ночь субботы на воскресение это ок.
                              Конечно, если ты не Яндекс
                              Ну вот, а я не так давно обновлял ночью «НГК» — получил жалобы от пользователей на 503-и ошибки. Получается, «НГК» почти как «Яндекс»!
                              Ответить
                            • Очень часто даунтайм в течение десяти секунд в ночь субботы на воскресение это ок.
                              Конечно, если ты не Яндекс
                              Ну вот, а я не так давно обновлял ночью «НГК» — получил жалобы от пользователей на 503-и ошибки. Получается, «НГК» почти как «Яндекс»!
                              Ответить
                            • Очень часто даунтайм в течение десяти секунд в ночь субботы на воскресение это ок.
                              Конечно, если ты не Яндекс
                              Ну вот, а я не так давно обновлял ночью «НГК» — получил жалобы от пользователей на 503-и ошибки. Получается, «НГК» почти как «Яндекс»!
                              Ответить
                            • Очень часто даунтайм в течение десяти секунд в ночь субботы на воскресение это ок.
                              Конечно, если ты не Яндекс
                              Ну вот, а я не так давно обновлял ночью «НГК» — получил жалобы от пользователей на 503-и ошибки. Получается, «НГК» почти как «Яндекс»!
                              Ответить
                            • Очень часто даунтайм в течение десяти секунд в ночь субботы на воскресение это ок.
                              Конечно, если ты не Яндекс
                              Ну вот, а я не так давно обновлял ночью «НГК» — получил жалобы от пользователей на 503-и ошибки. Получается, «НГК» почти как «Яндекс»!
                              Ответить
                            • Очень часто даунтайм в течение десяти секунд в ночь субботы на воскресение это ок.
                              Конечно, если ты не Яндекс
                              Ну вот, а я не так давно обновлял ночью «НГК» — получил жалобы от пользователей на 503-и ошибки. Получается, «НГК» почти как «Яндекс»!
                              Ответить
                            • Очень часто даунтайм в течение десяти секунд в ночь субботы на воскресение это ок.
                              Конечно, если ты не Яндекс
                              Ну вот, а я не так давно обновлял ночью «НГК» — получил жалобы от пользователей на 503-и ошибки. Получается, «НГК» почти как «Яндекс»!
                              Ответить
                            • Очень часто даунтайм в течение десяти секунд в ночь субботы на воскресение это ок.
                              Конечно, если ты не Яндекс
                              Ну вот, а я не так давно обновлял ночью «НГК» — получил жалобы от пользователей на 503-и ошибки. Получается, «НГК» почти как «Яндекс»!
                              Ответить
                            • Очень часто даунтайм в течение десяти секунд в ночь субботы на воскресение это ок.
                              Конечно, если ты не Яндекс
                              Ну вот, а я не так давно обновлял ночью «НГК» — получил жалобы от пользователей на 503-и ошибки. Получается, «НГК» почти как «Яндекс»!
                              Ответить
                            • Очень часто даунтайм в течение десяти секунд в ночь субботы на воскресение это ок.
                              Конечно, если ты не Яндекс
                              Ну вот, а я не так давно обновлял ночью «НГК» — получил жалобы от пользователей на 503-и ошибки. Получается, «НГК» почти как «Яндекс»!
                              Ответить
                            • Очень часто даунтайм в течение десяти секунд в ночь субботы на воскресение это ок.
                              Конечно, если ты не Яндекс
                              Ну вот, а я не так давно обновлял ночью «НГК» — получил жалобы от пользователей на 503-и ошибки. Получается, «НГК» почти как «Яндекс»!
                              Ответить
                            • Очень часто даунтайм в течение десяти секунд в ночь субботы на воскресение это ок.
                              Конечно, если ты не Яндекс
                              Ну вот, а я не так давно обновлял ночью «НГК» — получил жалобы от пользователей на 503-и ошибки. Получается, «НГК» почти как «Яндекс»!
                              Ответить
                            • Очень часто даунтайм в течение десяти секунд в ночь субботы на воскресение это ок.
                              Конечно, если ты не Яндекс
                              Ну вот, а я не так давно обновлял ночью «НГК» — получил жалобы от пользователей на 503-и ошибки. Получается, «НГК» почти как «Яндекс»!
                              Ответить
                          • Поэтому я за "hot bytecode patching". Впрочем, с ним своя веселуха, особенно когда версию BEAM VM надо на живой системе обновить, а ноды между собой по RPC общаются, и шлют друг другу по сети лямбды, и всё это ещё в гринбле. Вот это были миграции так миграции, эх.
                            Ответить
                  • Ну во-первых все равно оно должно быть готово работать в одной базе с другой версией себя, так что совсем не знать не получица.

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

                    В версии 1 у тебя были состояния A, B, C.
                    И вот у тебя клиент в состоянии B.

                    А в версии 2 у тебя состояния Q, Z, D.
                    Тут уже никак прозрачно не обновишься

                    Да и наконец есть фронтэнд: если поменялся JS, то точно надо обновить страницу.\


                    Можно дрейнить час, а потом ложить старую версию просто.
                    За час N% питухов отвалится или обновит страницу
                    Ответить
                  • Ну во-первых все равно оно должно быть готово работать в одной базе с другой версией себя, так что совсем не знать не получица.

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

                    В версии 1 у тебя были состояния A, B, C.
                    И вот у тебя клиент в состоянии B.

                    А в версии 2 у тебя состояния Q, Z, D.
                    Тут уже никак прозрачно не обновишься

                    Да и наконец есть фронтэнд: если поменялся JS, то точно надо обновить страницу.\


                    Можно дрейнить час, а потом ложить старую версию просто.
                    За час N% питухов отвалится или обновит страницу
                    Ответить
                  • Ну во-первых все равно оно должно быть готово работать в одной базе с другой версией себя, так что совсем не знать не получица.

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

                    В версии 1 у тебя были состояния A, B, C.
                    И вот у тебя клиент в состоянии B.

                    А в версии 2 у тебя состояния Q, Z, D.
                    Тут уже никак прозрачно не обновишься

                    Да и наконец есть фронтэнд: если поменялся JS, то точно надо обновить страницу.\


                    Можно дрейнить час, а потом ложить старую версию просто.
                    За час N% питухов отвалится или обновит страницу
                    Ответить
                  • Ну во-первых все равно оно должно быть готово работать в одной базе с другой версией себя, так что совсем не знать не получица.

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

                    В версии 1 у тебя были состояния A, B, C.
                    И вот у тебя клиент в состоянии B.

                    А в версии 2 у тебя состояния Q, Z, D.
                    Тут уже никак прозрачно не обновишься

                    Да и наконец есть фронтэнд: если поменялся JS, то точно надо обновить страницу.\


                    Можно дрейнить час, а потом ложить старую версию просто.
                    За час N% питухов отвалится или обновит страницу
                    Ответить
                  • Ну во-первых все равно оно должно быть готово работать в одной базе с другой версией себя, так что совсем не знать не получица.

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

                    В версии 1 у тебя были состояния A, B, C.
                    И вот у тебя клиент в состоянии B.

                    А в версии 2 у тебя состояния Q, Z, D.
                    Тут уже никак прозрачно не обновишься

                    Да и наконец есть фронтэнд: если поменялся JS, то точно надо обновить страницу.\


                    Можно дрейнить час, а потом ложить старую версию просто.
                    За час N% питухов отвалится или обновит страницу
                    Ответить
                  • Ну во-первых все равно оно должно быть готово работать в одной базе с другой версией себя, так что совсем не знать не получица.

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

                    В версии 1 у тебя были состояния A, B, C.
                    И вот у тебя клиент в состоянии B.

                    А в версии 2 у тебя состояния Q, Z, D.
                    Тут уже никак прозрачно не обновишься

                    Да и наконец есть фронтэнд: если поменялся JS, то точно надо обновить страницу.\


                    Можно дрейнить час, а потом ложить старую версию просто.
                    За час N% питухов отвалится или обновит страницу
                    Ответить
                  • Ну во-первых все равно оно должно быть готово работать в одной базе с другой версией себя, так что совсем не знать не получица.

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

                    В версии 1 у тебя были состояния A, B, C.
                    И вот у тебя клиент в состоянии B.

                    А в версии 2 у тебя состояния Q, Z, D.
                    Тут уже никак прозрачно не обновишься

                    Да и наконец есть фронтэнд: если поменялся JS, то точно надо обновить страницу.\


                    Можно дрейнить час, а потом ложить старую версию просто.
                    За час N% питухов отвалится или обновит страницу
                    Ответить
                  • Ну во-первых все равно оно должно быть готово работать в одной базе с другой версией себя, так что совсем не знать не получица.

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

                    В версии 1 у тебя были состояния A, B, C.
                    И вот у тебя клиент в состоянии B.

                    А в версии 2 у тебя состояния Q, Z, D.
                    Тут уже никак прозрачно не обновишься

                    Да и наконец есть фронтэнд: если поменялся JS, то точно надо обновить страницу.\


                    Можно дрейнить час, а потом ложить старую версию просто.
                    За час N% питухов отвалится или обновит страницу
                    Ответить
                  • Ну во-первых все равно оно должно быть готово работать в одной базе с другой версией себя, так что совсем не знать не получица.

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

                    В версии 1 у тебя были состояния A, B, C.
                    И вот у тебя клиент в состоянии B.

                    А в версии 2 у тебя состояния Q, Z, D.
                    Тут уже никак прозрачно не обновишься

                    Да и наконец есть фронтэнд: если поменялся JS, то точно надо обновить страницу.\


                    Можно дрейнить час, а потом ложить старую версию просто.
                    За час N% питухов отвалится или обновит страницу
                    Ответить
                  • Ну во-первых все равно оно должно быть готово работать в одной базе с другой версией себя, так что совсем не знать не получица.

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

                    В версии 1 у тебя были состояния A, B, C.
                    И вот у тебя клиент в состоянии B.

                    А в версии 2 у тебя состояния Q, Z, D.
                    Тут уже никак прозрачно не обновишься

                    Да и наконец есть фронтэнд: если поменялся JS, то точно надо обновить страницу.\


                    Можно дрейнить час, а потом ложить старую версию просто.
                    За час N% питухов отвалится или обновит страницу
                    Ответить
                  • Ну во-первых все равно оно должно быть готово работать в одной базе с другой версией себя, так что совсем не знать не получица.

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

                    В версии 1 у тебя были состояния A, B, C.
                    И вот у тебя клиент в состоянии B.

                    А в версии 2 у тебя состояния Q, Z, D.
                    Тут уже никак прозрачно не обновишься

                    Да и наконец есть фронтэнд: если поменялся JS, то точно надо обновить страницу.\


                    Можно дрейнить час, а потом ложить старую версию просто.
                    За час N% питухов отвалится или обновит страницу
                    Ответить
                  • Ну во-первых все равно оно должно быть готово работать в одной базе с другой версией себя, так что совсем не знать не получица.

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

                    В версии 1 у тебя были состояния A, B, C.
                    И вот у тебя клиент в состоянии B.

                    А в версии 2 у тебя состояния Q, Z, D.
                    Тут уже никак прозрачно не обновишься

                    Да и наконец есть фронтэнд: если поменялся JS, то точно надо обновить страницу.\


                    Можно дрейнить час, а потом ложить старую версию просто.
                    За час N% питухов отвалится или обновит страницу
                    Ответить
                  • Ну во-первых все равно оно должно быть готово работать в одной базе с другой версией себя, так что совсем не знать не получица.

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

                    В версии 1 у тебя были состояния A, B, C.
                    И вот у тебя клиент в состоянии B.

                    А в версии 2 у тебя состояния Q, Z, D.
                    Тут уже никак прозрачно не обновишься

                    Да и наконец есть фронтэнд: если поменялся JS, то точно надо обновить страницу.\


                    Можно дрейнить час, а потом ложить старую версию просто.
                    За час N% питухов отвалится или обновит страницу
                    Ответить
                  • Ну во-первых все равно оно должно быть готово работать в одной базе с другой версией себя, так что совсем не знать не получица.

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

                    В версии 1 у тебя были состояния A, B, C.
                    И вот у тебя клиент в состоянии B.

                    А в версии 2 у тебя состояния Q, Z, D.
                    Тут уже никак прозрачно не обновишься

                    Да и наконец есть фронтэнд: если поменялся JS, то точно надо обновить страницу.\


                    Можно дрейнить час, а потом ложить старую версию просто.
                    За час N% питухов отвалится или обновит страницу
                    Ответить
                  • Ну во-первых все равно оно должно быть готово работать в одной базе с другой версией себя, так что совсем не знать не получица.

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

                    В версии 1 у тебя были состояния A, B, C.
                    И вот у тебя клиент в состоянии B.

                    А в версии 2 у тебя состояния Q, Z, D.
                    Тут уже никак прозрачно не обновишься

                    Да и наконец есть фронтэнд: если поменялся JS, то точно надо обновить страницу.\


                    Можно дрейнить час, а потом ложить старую версию просто.
                    За час N% питухов отвалится или обновит страницу
                    Ответить
                  • Ну во-первых все равно оно должно быть готово работать в одной базе с другой версией себя, так что совсем не знать не получица.

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

                    В версии 1 у тебя были состояния A, B, C.
                    И вот у тебя клиент в состоянии B.

                    А в версии 2 у тебя состояния Q, Z, D.
                    Тут уже никак прозрачно не обновишься

                    Да и наконец есть фронтэнд: если поменялся JS, то точно надо обновить страницу.\


                    Можно дрейнить час, а потом ложить старую версию просто.
                    За час N% питухов отвалится или обновит страницу
                    Ответить
                  • Ну во-первых все равно оно должно быть готово работать в одной базе с другой версией себя, так что совсем не знать не получица.

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

                    В версии 1 у тебя были состояния A, B, C.
                    И вот у тебя клиент в состоянии B.

                    А в версии 2 у тебя состояния Q, Z, D.
                    Тут уже никак прозрачно не обновишься

                    Да и наконец есть фронтэнд: если поменялся JS, то точно надо обновить страницу.\


                    Можно дрейнить час, а потом ложить старую версию просто.
                    За час N% питухов отвалится или обновит страницу
                    Ответить
                  • Ну во-первых все равно оно должно быть готово работать в одной базе с другой версией себя, так что совсем не знать не получица.

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

                    В версии 1 у тебя были состояния A, B, C.
                    И вот у тебя клиент в состоянии B.

                    А в версии 2 у тебя состояния Q, Z, D.
                    Тут уже никак прозрачно не обновишься

                    Да и наконец есть фронтэнд: если поменялся JS, то точно надо обновить страницу.\


                    Можно дрейнить час, а потом ложить старую версию просто.
                    За час N% питухов отвалится или обновит страницу
                    Ответить
                  • Ну во-первых все равно оно должно быть готово работать в одной базе с другой версией себя, так что совсем не знать не получица.

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

                    В версии 1 у тебя были состояния A, B, C.
                    И вот у тебя клиент в состоянии B.

                    А в версии 2 у тебя состояния Q, Z, D.
                    Тут уже никак прозрачно не обновишься

                    Да и наконец есть фронтэнд: если поменялся JS, то точно надо обновить страницу.\


                    Можно дрейнить час, а потом ложить старую версию просто.
                    За час N% питухов отвалится или обновит страницу
                    Ответить
                  • Ну во-первых все равно оно должно быть готово работать в одной базе с другой версией себя, так что совсем не знать не получица.

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

                    В версии 1 у тебя были состояния A, B, C.
                    И вот у тебя клиент в состоянии B.

                    А в версии 2 у тебя состояния Q, Z, D.
                    Тут уже никак прозрачно не обновишься

                    Да и наконец есть фронтэнд: если поменялся JS, то точно надо обновить страницу.\


                    Можно дрейнить час, а потом ложить старую версию просто.
                    За час N% питухов отвалится или обновит страницу
                    Ответить
                  • Ну во-первых все равно оно должно быть готово работать в одной базе с другой версией себя, так что совсем не знать не получица.

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

                    В версии 1 у тебя были состояния A, B, C.
                    И вот у тебя клиент в состоянии B.

                    А в версии 2 у тебя состояния Q, Z, D.
                    Тут уже никак прозрачно не обновишься

                    Да и наконец есть фронтэнд: если поменялся JS, то точно надо обновить страницу.\


                    Можно дрейнить час, а потом ложить старую версию просто.
                    За час N% питухов отвалится или обновит страницу
                    Ответить
                  • Ну во-первых все равно оно должно быть готово работать в одной базе с другой версией себя, так что совсем не знать не получица.

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

                    В версии 1 у тебя были состояния A, B, C.
                    И вот у тебя клиент в состоянии B.

                    А в версии 2 у тебя состояния Q, Z, D.
                    Тут уже никак прозрачно не обновишься

                    Да и наконец есть фронтэнд: если поменялся JS, то точно надо обновить страницу.\


                    Можно дрейнить час, а потом ложить старую версию просто.
                    За час N% питухов отвалится или обновит страницу
                    Ответить
                  • Ну во-первых все равно оно должно быть готово работать в одной базе с другой версией себя, так что совсем не знать не получица.

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

                    В версии 1 у тебя были состояния A, B, C.
                    И вот у тебя клиент в состоянии B.

                    А в версии 2 у тебя состояния Q, Z, D.
                    Тут уже никак прозрачно не обновишься

                    Да и наконец есть фронтэнд: если поменялся JS, то точно надо обновить страницу.\


                    Можно дрейнить час, а потом ложить старую версию просто.
                    За час N% питухов отвалится или обновит страницу
                    Ответить
                  • Ну во-первых все равно оно должно быть готово работать в одной базе с другой версией себя, так что совсем не знать не получица.

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

                    В версии 1 у тебя были состояния A, B, C.
                    И вот у тебя клиент в состоянии B.

                    А в версии 2 у тебя состояния Q, Z, D.
                    Тут уже никак прозрачно не обновишься

                    Да и наконец есть фронтэнд: если поменялся JS, то точно надо обновить страницу.\


                    Можно дрейнить час, а потом ложить старую версию просто.
                    За час N% питухов отвалится или обновит страницу
                    Ответить
                  • Ну во-первых все равно оно должно быть готово работать в одной базе с другой версией себя, так что совсем не знать не получица.

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

                    В версии 1 у тебя были состояния A, B, C.
                    И вот у тебя клиент в состоянии B.

                    А в версии 2 у тебя состояния Q, Z, D.
                    Тут уже никак прозрачно не обновишься

                    Да и наконец есть фронтэнд: если поменялся JS, то точно надо обновить страницу.\


                    Можно дрейнить час, а потом ложить старую версию просто.
                    За час N% питухов отвалится или обновит страницу
                    Ответить
          • Ну так для нормальной гринбли нужен фронт и такое понятие как опустошение (забыл как по-пиндосски правильно): в течение этого времени НОВЫЕ запросы идут на НОВЫЙ контейнер, а старые пока еще держаца.
            Рано или поздно старые коннекты все заканчиваются, и тогда вот старый ложица.
            Ответить
          • Ну так для нормальной гринбли нужен фронт и такое понятие как опустошение (забыл как по-пиндосски правильно): в течение этого времени НОВЫЕ запросы идут на НОВЫЙ контейнер, а старые пока еще держаца.
            Рано или поздно старые коннекты все заканчиваются, и тогда вот старый ложица.
            Ответить
          • Ну так для нормальной гринбли нужен фронт и такое понятие как опустошение (забыл как по-пиндосски правильно): в течение этого времени НОВЫЕ запросы идут на НОВЫЙ контейнер, а старые пока еще держаца.
            Рано или поздно старые коннекты все заканчиваются, и тогда вот старый ложица.
            Ответить
          • Ну так для нормальной гринбли нужен фронт и такое понятие как опустошение (забыл как по-пиндосски правильно): в течение этого времени НОВЫЕ запросы идут на НОВЫЙ контейнер, а старые пока еще держаца.
            Рано или поздно старые коннекты все заканчиваются, и тогда вот старый ложица.
            Ответить
          • Ну так для нормальной гринбли нужен фронт и такое понятие как опустошение (забыл как по-пиндосски правильно): в течение этого времени НОВЫЕ запросы идут на НОВЫЙ контейнер, а старые пока еще держаца.
            Рано или поздно старые коннекты все заканчиваются, и тогда вот старый ложица.
            Ответить
          • Ну так для нормальной гринбли нужен фронт и такое понятие как опустошение (забыл как по-пиндосски правильно): в течение этого времени НОВЫЕ запросы идут на НОВЫЙ контейнер, а старые пока еще держаца.
            Рано или поздно старые коннекты все заканчиваются, и тогда вот старый ложица.
            Ответить
          • Ну так для нормальной гринбли нужен фронт и такое понятие как опустошение (забыл как по-пиндосски правильно): в течение этого времени НОВЫЕ запросы идут на НОВЫЙ контейнер, а старые пока еще держаца.
            Рано или поздно старые коннекты все заканчиваются, и тогда вот старый ложица.
            Ответить
          • Ну так для нормальной гринбли нужен фронт и такое понятие как опустошение (забыл как по-пиндосски правильно): в течение этого времени НОВЫЕ запросы идут на НОВЫЙ контейнер, а старые пока еще держаца.
            Рано или поздно старые коннекты все заканчиваются, и тогда вот старый ложица.
            Ответить
          • Ну так для нормальной гринбли нужен фронт и такое понятие как опустошение (забыл как по-пиндосски правильно): в течение этого времени НОВЫЕ запросы идут на НОВЫЙ контейнер, а старые пока еще держаца.
            Рано или поздно старые коннекты все заканчиваются, и тогда вот старый ложица.
            Ответить
          • Ну так для нормальной гринбли нужен фронт и такое понятие как опустошение (забыл как по-пиндосски правильно): в течение этого времени НОВЫЕ запросы идут на НОВЫЙ контейнер, а старые пока еще держаца.
            Рано или поздно старые коннекты все заканчиваются, и тогда вот старый ложица.
            Ответить
          • Ну так для нормальной гринбли нужен фронт и такое понятие как опустошение (забыл как по-пиндосски правильно): в течение этого времени НОВЫЕ запросы идут на НОВЫЙ контейнер, а старые пока еще держаца.
            Рано или поздно старые коннекты все заканчиваются, и тогда вот старый ложица.
            Ответить
          • Ну так для нормальной гринбли нужен фронт и такое понятие как опустошение (забыл как по-пиндосски правильно): в течение этого времени НОВЫЕ запросы идут на НОВЫЙ контейнер, а старые пока еще держаца.
            Рано или поздно старые коннекты все заканчиваются, и тогда вот старый ложица.
            Ответить
          • Ну так для нормальной гринбли нужен фронт и такое понятие как опустошение (забыл как по-пиндосски правильно): в течение этого времени НОВЫЕ запросы идут на НОВЫЙ контейнер, а старые пока еще держаца.
            Рано или поздно старые коннекты все заканчиваются, и тогда вот старый ложица.
            Ответить
          • Ну так для нормальной гринбли нужен фронт и такое понятие как опустошение (забыл как по-пиндосски правильно): в течение этого времени НОВЫЕ запросы идут на НОВЫЙ контейнер, а старые пока еще держаца.
            Рано или поздно старые коннекты все заканчиваются, и тогда вот старый ложица.
            Ответить
          • Ну так для нормальной гринбли нужен фронт и такое понятие как опустошение (забыл как по-пиндосски правильно): в течение этого времени НОВЫЕ запросы идут на НОВЫЙ контейнер, а старые пока еще держаца.
            Рано или поздно старые коннекты все заканчиваются, и тогда вот старый ложица.
            Ответить
          • Ну так для нормальной гринбли нужен фронт и такое понятие как опустошение (забыл как по-пиндосски правильно): в течение этого времени НОВЫЕ запросы идут на НОВЫЙ контейнер, а старые пока еще держаца.
            Рано или поздно старые коннекты все заканчиваются, и тогда вот старый ложица.
            Ответить
          • Ну так для нормальной гринбли нужен фронт и такое понятие как опустошение (забыл как по-пиндосски правильно): в течение этого времени НОВЫЕ запросы идут на НОВЫЙ контейнер, а старые пока еще держаца.
            Рано или поздно старые коннекты все заканчиваются, и тогда вот старый ложица.
            Ответить
          • Ну так для нормальной гринбли нужен фронт и такое понятие как опустошение (забыл как по-пиндосски правильно): в течение этого времени НОВЫЕ запросы идут на НОВЫЙ контейнер, а старые пока еще держаца.
            Рано или поздно старые коннекты все заканчиваются, и тогда вот старый ложица.
            Ответить
          • Ну так для нормальной гринбли нужен фронт и такое понятие как опустошение (забыл как по-пиндосски правильно): в течение этого времени НОВЫЕ запросы идут на НОВЫЙ контейнер, а старые пока еще держаца.
            Рано или поздно старые коннекты все заканчиваются, и тогда вот старый ложица.
            Ответить
          • Ну так для нормальной гринбли нужен фронт и такое понятие как опустошение (забыл как по-пиндосски правильно): в течение этого времени НОВЫЕ запросы идут на НОВЫЙ контейнер, а старые пока еще держаца.
            Рано или поздно старые коннекты все заканчиваются, и тогда вот старый ложица.
            Ответить
          • Ну так для нормальной гринбли нужен фронт и такое понятие как опустошение (забыл как по-пиндосски правильно): в течение этого времени НОВЫЕ запросы идут на НОВЫЙ контейнер, а старые пока еще держаца.
            Рано или поздно старые коннекты все заканчиваются, и тогда вот старый ложица.
            Ответить
          • Ну так для нормальной гринбли нужен фронт и такое понятие как опустошение (забыл как по-пиндосски правильно): в течение этого времени НОВЫЕ запросы идут на НОВЫЙ контейнер, а старые пока еще держаца.
            Рано или поздно старые коннекты все заканчиваются, и тогда вот старый ложица.
            Ответить
          • Ну так для нормальной гринбли нужен фронт и такое понятие как опустошение (забыл как по-пиндосски правильно): в течение этого времени НОВЫЕ запросы идут на НОВЫЙ контейнер, а старые пока еще держаца.
            Рано или поздно старые коннекты все заканчиваются, и тогда вот старый ложица.
            Ответить
          • Ну так для нормальной гринбли нужен фронт и такое понятие как опустошение (забыл как по-пиндосски правильно): в течение этого времени НОВЫЕ запросы идут на НОВЫЙ контейнер, а старые пока еще держаца.
            Рано или поздно старые коннекты все заканчиваются, и тогда вот старый ложица.
            Ответить
          • Ну так для нормальной гринбли нужен фронт и такое понятие как опустошение (забыл как по-пиндосски правильно): в течение этого времени НОВЫЕ запросы идут на НОВЫЙ контейнер, а старые пока еще держаца.
            Рано или поздно старые коннекты все заканчиваются, и тогда вот старый ложица.
            Ответить
        • Ну и, кстати, в статье тоже нихуя не гринблю.
          Biblusha
          После поднятия второго контейнера и исправления файла в nginx старый контейнер убивается. Как в таком случаи поведут себя активные соединения с этим контейнером?

          И это даже не говоря про всяческие «вебсокеты», которые от такого гринблю сами позеленеют.
          Ответить
        • Ну и, кстати, в статье тоже нихуя не гринблю.
          Biblusha
          После поднятия второго контейнера и исправления файла в nginx старый контейнер убивается. Как в таком случаи поведут себя активные соединения с этим контейнером?

          И это даже не говоря про всяческие «вебсокеты», которые от такого гринблю сами позеленеют.
          Ответить
        • Ну и, кстати, в статье тоже нихуя не гринблю.
          Biblusha
          После поднятия второго контейнера и исправления файла в nginx старый контейнер убивается. Как в таком случаи поведут себя активные соединения с этим контейнером?

          И это даже не говоря про всяческие «вебсокеты», которые от такого гринблю сами позеленеют.
          Ответить
        • Ну и, кстати, в статье тоже нихуя не гринблю.
          Biblusha
          После поднятия второго контейнера и исправления файла в nginx старый контейнер убивается. Как в таком случаи поведут себя активные соединения с этим контейнером?

          И это даже не говоря про всяческие «вебсокеты», которые от такого гринблю сами позеленеют.
          Ответить
        • Ну и, кстати, в статье тоже нихуя не гринблю.
          Biblusha
          После поднятия второго контейнера и исправления файла в nginx старый контейнер убивается. Как в таком случаи поведут себя активные соединения с этим контейнером?

          И это даже не говоря про всяческие «вебсокеты», которые от такого гринблю сами позеленеют.
          Ответить
        • Ну и, кстати, в статье тоже нихуя не гринблю.
          Biblusha
          После поднятия второго контейнера и исправления файла в nginx старый контейнер убивается. Как в таком случаи поведут себя активные соединения с этим контейнером?

          И это даже не говоря про всяческие «вебсокеты», которые от такого гринблю сами позеленеют.
          Ответить
        • Ну и, кстати, в статье тоже нихуя не гринблю.
          Biblusha
          После поднятия второго контейнера и исправления файла в nginx старый контейнер убивается. Как в таком случаи поведут себя активные соединения с этим контейнером?

          И это даже не говоря про всяческие «вебсокеты», которые от такого гринблю сами позеленеют.
          Ответить
        • Ну и, кстати, в статье тоже нихуя не гринблю.
          Biblusha
          После поднятия второго контейнера и исправления файла в nginx старый контейнер убивается. Как в таком случаи поведут себя активные соединения с этим контейнером?

          И это даже не говоря про всяческие «вебсокеты», которые от такого гринблю сами позеленеют.
          Ответить
        • Ну и, кстати, в статье тоже нихуя не гринблю.
          Biblusha
          После поднятия второго контейнера и исправления файла в nginx старый контейнер убивается. Как в таком случаи поведут себя активные соединения с этим контейнером?

          И это даже не говоря про всяческие «вебсокеты», которые от такого гринблю сами позеленеют.
          Ответить
        • Ну и, кстати, в статье тоже нихуя не гринблю.
          Biblusha
          После поднятия второго контейнера и исправления файла в nginx старый контейнер убивается. Как в таком случаи поведут себя активные соединения с этим контейнером?

          И это даже не говоря про всяческие «вебсокеты», которые от такого гринблю сами позеленеют.
          Ответить
        • Ну и, кстати, в статье тоже нихуя не гринблю.
          Biblusha
          После поднятия второго контейнера и исправления файла в nginx старый контейнер убивается. Как в таком случаи поведут себя активные соединения с этим контейнером?

          И это даже не говоря про всяческие «вебсокеты», которые от такого гринблю сами позеленеют.
          Ответить
        • Ну и, кстати, в статье тоже нихуя не гринблю.
          Biblusha
          После поднятия второго контейнера и исправления файла в nginx старый контейнер убивается. Как в таком случаи поведут себя активные соединения с этим контейнером?

          И это даже не говоря про всяческие «вебсокеты», которые от такого гринблю сами позеленеют.
          Ответить
        • Ну и, кстати, в статье тоже нихуя не гринблю.
          Biblusha
          После поднятия второго контейнера и исправления файла в nginx старый контейнер убивается. Как в таком случаи поведут себя активные соединения с этим контейнером?

          И это даже не говоря про всяческие «вебсокеты», которые от такого гринблю сами позеленеют.
          Ответить
        • Ну и, кстати, в статье тоже нихуя не гринблю.
          Biblusha
          После поднятия второго контейнера и исправления файла в nginx старый контейнер убивается. Как в таком случаи поведут себя активные соединения с этим контейнером?

          И это даже не говоря про всяческие «вебсокеты», которые от такого гринблю сами позеленеют.
          Ответить
        • Ну и, кстати, в статье тоже нихуя не гринблю.
          Biblusha
          После поднятия второго контейнера и исправления файла в nginx старый контейнер убивается. Как в таком случаи поведут себя активные соединения с этим контейнером?

          И это даже не говоря про всяческие «вебсокеты», которые от такого гринблю сами позеленеют.
          Ответить
        • Ну и, кстати, в статье тоже нихуя не гринблю.
          Biblusha
          После поднятия второго контейнера и исправления файла в nginx старый контейнер убивается. Как в таком случаи поведут себя активные соединения с этим контейнером?

          И это даже не говоря про всяческие «вебсокеты», которые от такого гринблю сами позеленеют.
          Ответить
        • Ну и, кстати, в статье тоже нихуя не гринблю.
          Biblusha
          После поднятия второго контейнера и исправления файла в nginx старый контейнер убивается. Как в таком случаи поведут себя активные соединения с этим контейнером?

          И это даже не говоря про всяческие «вебсокеты», которые от такого гринблю сами позеленеют.
          Ответить
        • Ну и, кстати, в статье тоже нихуя не гринблю.
          Biblusha
          После поднятия второго контейнера и исправления файла в nginx старый контейнер убивается. Как в таком случаи поведут себя активные соединения с этим контейнером?

          И это даже не говоря про всяческие «вебсокеты», которые от такого гринблю сами позеленеют.
          Ответить
        • Ну и, кстати, в статье тоже нихуя не гринблю.
          Biblusha
          После поднятия второго контейнера и исправления файла в nginx старый контейнер убивается. Как в таком случаи поведут себя активные соединения с этим контейнером?

          И это даже не говоря про всяческие «вебсокеты», которые от такого гринблю сами позеленеют.
          Ответить
        • Ну и, кстати, в статье тоже нихуя не гринблю.
          Biblusha
          После поднятия второго контейнера и исправления файла в nginx старый контейнер убивается. Как в таком случаи поведут себя активные соединения с этим контейнером?

          И это даже не говоря про всяческие «вебсокеты», которые от такого гринблю сами позеленеют.
          Ответить
        • Ну и, кстати, в статье тоже нихуя не гринблю.
          Biblusha
          После поднятия второго контейнера и исправления файла в nginx старый контейнер убивается. Как в таком случаи поведут себя активные соединения с этим контейнером?

          И это даже не говоря про всяческие «вебсокеты», которые от такого гринблю сами позеленеют.
          Ответить
        • Ну и, кстати, в статье тоже нихуя не гринблю.
          Biblusha
          После поднятия второго контейнера и исправления файла в nginx старый контейнер убивается. Как в таком случаи поведут себя активные соединения с этим контейнером?

          И это даже не говоря про всяческие «вебсокеты», которые от такого гринблю сами позеленеют.
          Ответить
        • Ну и, кстати, в статье тоже нихуя не гринблю.
          Biblusha
          После поднятия второго контейнера и исправления файла в nginx старый контейнер убивается. Как в таком случаи поведут себя активные соединения с этим контейнером?

          И это даже не говоря про всяческие «вебсокеты», которые от такого гринблю сами позеленеют.
          Ответить
        • Ну и, кстати, в статье тоже нихуя не гринблю.
          Biblusha
          После поднятия второго контейнера и исправления файла в nginx старый контейнер убивается. Как в таком случаи поведут себя активные соединения с этим контейнером?

          И это даже не говоря про всяческие «вебсокеты», которые от такого гринблю сами позеленеют.
          Ответить
        • Ну и, кстати, в статье тоже нихуя не гринблю.
          Biblusha
          После поднятия второго контейнера и исправления файла в nginx старый контейнер убивается. Как в таком случаи поведут себя активные соединения с этим контейнером?

          И это даже не говоря про всяческие «вебсокеты», которые от такого гринблю сами позеленеют.
          Ответить
    • https://habr.com/post/516230/
      Blue-Green Deployment на минималках
      >ensure-reverse-proxy() {
          is-container-up reverse-proxy &;&; return 0
          echo Deploying reverse-proxy...
          docker network create web-gateway
          docker run \
              --detach \
              --restart always \
              --log-driver journald \
              --name reverse-proxy \
              --network web-gateway \
              --publish 80:80 \
              nginx:alpine || return 1
          docker exec --interactive reverse-proxy sh -c  /etc/nginx/conf.d/default.conf
          docker exec reverse-proxy nginx -s reload
      }
      
      is-container-up() {
          local container=${1?Usage: ${FUNCNAME[0]} container_name}
      
          [ -n $(docker ps -f name=${container} -q) ]
          return $?
      }
      
      get-active-slot() {
          local service=${1?Usage: ${FUNCNAME[0]} service_name}
      
          if is-container-up ${service}_BLUE &;&; is-container-up ${service}_GREEN; then
              echo Collision detected! Stopping ${service}_GREEN...
              docker rm -f ${service}_GREEN
              return 0  # BLUE
          fi
          if is-container-up ${service}_BLUE &;&; ! is-container-up ${service}_GREEN; then
              return 0  # BLUE
          fi
          if ! is-container-up ${service}_BLUE; then
              return 1  # GREEN
          fi
      }
      
      get-service-status() {
          local usage_msg=Usage: ${FUNCNAME[0]} service_name deployment_slot
          local service=${1?usage_msg}
          local slot=${2?$usage_msg}
      
          case $service in
              # Add specific healthcheck paths for your services here
              *) local health_check_port_path=:8080/ ;;
          esac
          local health_check_address=http://${service}_${slot}${health_check_port_path}
          # [...] gost: ещё 500+ символов

      Блядь, как всё сложно, именно поэтому я за «index.php» по «FTP».

      И да, этот скрипт — только маленькая часть всей статьи.
      Ответить
    • https://habr.com/post/516230/
      Blue-Green Deployment на минималках
      >ensure-reverse-proxy() {
          is-container-up reverse-proxy &;&; return 0
          echo Deploying reverse-proxy...
          docker network create web-gateway
          docker run \
              --detach \
              --restart always \
              --log-driver journald \
              --name reverse-proxy \
              --network web-gateway \
              --publish 80:80 \
              nginx:alpine || return 1
          docker exec --interactive reverse-proxy sh -c  /etc/nginx/conf.d/default.conf
          docker exec reverse-proxy nginx -s reload
      }
      
      is-container-up() {
          local container=${1?Usage: ${FUNCNAME[0]} container_name}
      
          [ -n $(docker ps -f name=${container} -q) ]
          return $?
      }
      
      get-active-slot() {
          local service=${1?Usage: ${FUNCNAME[0]} service_name}
      
          if is-container-up ${service}_BLUE &;&; is-container-up ${service}_GREEN; then
              echo Collision detected! Stopping ${service}_GREEN...
              docker rm -f ${service}_GREEN
              return 0  # BLUE
          fi
          if is-container-up ${service}_BLUE &;&; ! is-container-up ${service}_GREEN; then
              return 0  # BLUE
          fi
          if ! is-container-up ${service}_BLUE; then
              return 1  # GREEN
          fi
      }
      
      get-service-status() {
          local usage_msg=Usage: ${FUNCNAME[0]} service_name deployment_slot
          local service=${1?usage_msg}
          local slot=${2?$usage_msg}
      
          case $service in
              # Add specific healthcheck paths for your services here
              *) local health_check_port_path=:8080/ ;;
          esac
          local health_check_address=http://${service}_${slot}${health_check_port_path}
          # [...] gost: ещё 500+ символов

      Блядь, как всё сложно, именно поэтому я за «index.php» по «FTP».

      И да, этот скрипт — только маленькая часть всей статьи.
      Ответить
    • https://habr.com/post/516230/
      Blue-Green Deployment на минималках
      >ensure-reverse-proxy() {
          is-container-up reverse-proxy &;&; return 0
          echo Deploying reverse-proxy...
          docker network create web-gateway
          docker run \
              --detach \
              --restart always \
              --log-driver journald \
              --name reverse-proxy \
              --network web-gateway \
              --publish 80:80 \
              nginx:alpine || return 1
          docker exec --interactive reverse-proxy sh -c  /etc/nginx/conf.d/default.conf
          docker exec reverse-proxy nginx -s reload
      }
      
      is-container-up() {
          local container=${1?Usage: ${FUNCNAME[0]} container_name}
      
          [ -n $(docker ps -f name=${container} -q) ]
          return $?
      }
      
      get-active-slot() {
          local service=${1?Usage: ${FUNCNAME[0]} service_name}
      
          if is-container-up ${service}_BLUE &;&; is-container-up ${service}_GREEN; then
              echo Collision detected! Stopping ${service}_GREEN...
              docker rm -f ${service}_GREEN
              return 0  # BLUE
          fi
          if is-container-up ${service}_BLUE &;&; ! is-container-up ${service}_GREEN; then
              return 0  # BLUE
          fi
          if ! is-container-up ${service}_BLUE; then
              return 1  # GREEN
          fi
      }
      
      get-service-status() {
          local usage_msg=Usage: ${FUNCNAME[0]} service_name deployment_slot
          local service=${1?usage_msg}
          local slot=${2?$usage_msg}
      
          case $service in
              # Add specific healthcheck paths for your services here
              *) local health_check_port_path=:8080/ ;;
          esac
          local health_check_address=http://${service}_${slot}${health_check_port_path}
          # [...] gost: ещё 500+ символов

      Блядь, как всё сложно, именно поэтому я за «index.php» по «FTP».

      И да, этот скрипт — только маленькая часть всей статьи.
      Ответить
    • https://habr.com/post/516230/
      Blue-Green Deployment на минималках
      >ensure-reverse-proxy() {
          is-container-up reverse-proxy &;&; return 0
          echo Deploying reverse-proxy...
          docker network create web-gateway
          docker run \
              --detach \
              --restart always \
              --log-driver journald \
              --name reverse-proxy \
              --network web-gateway \
              --publish 80:80 \
              nginx:alpine || return 1
          docker exec --interactive reverse-proxy sh -c  /etc/nginx/conf.d/default.conf
          docker exec reverse-proxy nginx -s reload
      }
      
      is-container-up() {
          local container=${1?Usage: ${FUNCNAME[0]} container_name}
      
          [ -n $(docker ps -f name=${container} -q) ]
          return $?
      }
      
      get-active-slot() {
          local service=${1?Usage: ${FUNCNAME[0]} service_name}
      
          if is-container-up ${service}_BLUE &;&; is-container-up ${service}_GREEN; then
              echo Collision detected! Stopping ${service}_GREEN...
              docker rm -f ${service}_GREEN
              return 0  # BLUE
          fi
          if is-container-up ${service}_BLUE &;&; ! is-container-up ${service}_GREEN; then
              return 0  # BLUE
          fi
          if ! is-container-up ${service}_BLUE; then
              return 1  # GREEN
          fi
      }
      
      get-service-status() {
          local usage_msg=Usage: ${FUNCNAME[0]} service_name deployment_slot
          local service=${1?usage_msg}
          local slot=${2?$usage_msg}
      
          case $service in
              # Add specific healthcheck paths for your services here
              *) local health_check_port_path=:8080/ ;;
          esac
          local health_check_address=http://${service}_${slot}${health_check_port_path}
          # [...] gost: ещё 500+ символов

      Блядь, как всё сложно, именно поэтому я за «index.php» по «FTP».

      И да, этот скрипт — только маленькая часть всей статьи.
      Ответить
    • https://habr.com/post/516230/
      Blue-Green Deployment на минималках
      >ensure-reverse-proxy() {
          is-container-up reverse-proxy &;&; return 0
          echo Deploying reverse-proxy...
          docker network create web-gateway
          docker run \
              --detach \
              --restart always \
              --log-driver journald \
              --name reverse-proxy \
              --network web-gateway \
              --publish 80:80 \
              nginx:alpine || return 1
          docker exec --interactive reverse-proxy sh -c  /etc/nginx/conf.d/default.conf
          docker exec reverse-proxy nginx -s reload
      }
      
      is-container-up() {
          local container=${1?Usage: ${FUNCNAME[0]} container_name}
      
          [ -n $(docker ps -f name=${container} -q) ]
          return $?
      }
      
      get-active-slot() {
          local service=${1?Usage: ${FUNCNAME[0]} service_name}
      
          if is-container-up ${service}_BLUE &;&; is-container-up ${service}_GREEN; then
              echo Collision detected! Stopping ${service}_GREEN...
              docker rm -f ${service}_GREEN
              return 0  # BLUE
          fi
          if is-container-up ${service}_BLUE &;&; ! is-container-up ${service}_GREEN; then
              return 0  # BLUE
          fi
          if ! is-container-up ${service}_BLUE; then
              return 1  # GREEN
          fi
      }
      
      get-service-status() {
          local usage_msg=Usage: ${FUNCNAME[0]} service_name deployment_slot
          local service=${1?usage_msg}
          local slot=${2?$usage_msg}
      
          case $service in
              # Add specific healthcheck paths for your services here
              *) local health_check_port_path=:8080/ ;;
          esac
          local health_check_address=http://${service}_${slot}${health_check_port_path}
          # [...] gost: ещё 500+ символов

      Блядь, как всё сложно, именно поэтому я за «index.php» по «FTP».

      И да, этот скрипт — только маленькая часть всей статьи.
      Ответить
    • https://habr.com/post/516230/
      Blue-Green Deployment на минималках
      >ensure-reverse-proxy() {
          is-container-up reverse-proxy &;&; return 0
          echo Deploying reverse-proxy...
          docker network create web-gateway
          docker run \
              --detach \
              --restart always \
              --log-driver journald \
              --name reverse-proxy \
              --network web-gateway \
              --publish 80:80 \
              nginx:alpine || return 1
          docker exec --interactive reverse-proxy sh -c  /etc/nginx/conf.d/default.conf
          docker exec reverse-proxy nginx -s reload
      }
      
      is-container-up() {
          local container=${1?Usage: ${FUNCNAME[0]} container_name}
      
          [ -n $(docker ps -f name=${container} -q) ]
          return $?
      }
      
      get-active-slot() {
          local service=${1?Usage: ${FUNCNAME[0]} service_name}
      
          if is-container-up ${service}_BLUE &;&; is-container-up ${service}_GREEN; then
              echo Collision detected! Stopping ${service}_GREEN...
              docker rm -f ${service}_GREEN
              return 0  # BLUE
          fi
          if is-container-up ${service}_BLUE &;&; ! is-container-up ${service}_GREEN; then
              return 0  # BLUE
          fi
          if ! is-container-up ${service}_BLUE; then
              return 1  # GREEN
          fi
      }
      
      get-service-status() {
          local usage_msg=Usage: ${FUNCNAME[0]} service_name deployment_slot
          local service=${1?usage_msg}
          local slot=${2?$usage_msg}
      
          case $service in
              # Add specific healthcheck paths for your services here
              *) local health_check_port_path=:8080/ ;;
          esac
          local health_check_address=http://${service}_${slot}${health_check_port_path}
          # [...] gost: ещё 500+ символов

      Блядь, как всё сложно, именно поэтому я за «index.php» по «FTP».

      И да, этот скрипт — только маленькая часть всей статьи.
      Ответить
    • https://habr.com/post/516230/
      Blue-Green Deployment на минималках
      >ensure-reverse-proxy() {
          is-container-up reverse-proxy &;&; return 0
          echo Deploying reverse-proxy...
          docker network create web-gateway
          docker run \
              --detach \
              --restart always \
              --log-driver journald \
              --name reverse-proxy \
              --network web-gateway \
              --publish 80:80 \
              nginx:alpine || return 1
          docker exec --interactive reverse-proxy sh -c  /etc/nginx/conf.d/default.conf
          docker exec reverse-proxy nginx -s reload
      }
      
      is-container-up() {
          local container=${1?Usage: ${FUNCNAME[0]} container_name}
      
          [ -n $(docker ps -f name=${container} -q) ]
          return $?
      }
      
      get-active-slot() {
          local service=${1?Usage: ${FUNCNAME[0]} service_name}
      
          if is-container-up ${service}_BLUE &;&; is-container-up ${service}_GREEN; then
              echo Collision detected! Stopping ${service}_GREEN...
              docker rm -f ${service}_GREEN
              return 0  # BLUE
          fi
          if is-container-up ${service}_BLUE &;&; ! is-container-up ${service}_GREEN; then
              return 0  # BLUE
          fi
          if ! is-container-up ${service}_BLUE; then
              return 1  # GREEN
          fi
      }
      
      get-service-status() {
          local usage_msg=Usage: ${FUNCNAME[0]} service_name deployment_slot
          local service=${1?usage_msg}
          local slot=${2?$usage_msg}
      
          case $service in
              # Add specific healthcheck paths for your services here
              *) local health_check_port_path=:8080/ ;;
          esac
          local health_check_address=http://${service}_${slot}${health_check_port_path}
          # [...] gost: ещё 500+ символов

      Блядь, как всё сложно, именно поэтому я за «index.php» по «FTP».

      И да, этот скрипт — только маленькая часть всей статьи.
      Ответить
    • https://habr.com/post/516230/
      Blue-Green Deployment на минималках
      >ensure-reverse-proxy() {
          is-container-up reverse-proxy &;&; return 0
          echo Deploying reverse-proxy...
          docker network create web-gateway
          docker run \
              --detach \
              --restart always \
              --log-driver journald \
              --name reverse-proxy \
              --network web-gateway \
              --publish 80:80 \
              nginx:alpine || return 1
          docker exec --interactive reverse-proxy sh -c  /etc/nginx/conf.d/default.conf
          docker exec reverse-proxy nginx -s reload
      }
      
      is-container-up() {
          local container=${1?Usage: ${FUNCNAME[0]} container_name}
      
          [ -n $(docker ps -f name=${container} -q) ]
          return $?
      }
      
      get-active-slot() {
          local service=${1?Usage: ${FUNCNAME[0]} service_name}
      
          if is-container-up ${service}_BLUE &;&; is-container-up ${service}_GREEN; then
              echo Collision detected! Stopping ${service}_GREEN...
              docker rm -f ${service}_GREEN
              return 0  # BLUE
          fi
          if is-container-up ${service}_BLUE &;&; ! is-container-up ${service}_GREEN; then
              return 0  # BLUE
          fi
          if ! is-container-up ${service}_BLUE; then
              return 1  # GREEN
          fi
      }
      
      get-service-status() {
          local usage_msg=Usage: ${FUNCNAME[0]} service_name deployment_slot
          local service=${1?usage_msg}
          local slot=${2?$usage_msg}
      
          case $service in
              # Add specific healthcheck paths for your services here
              *) local health_check_port_path=:8080/ ;;
          esac
          local health_check_address=http://${service}_${slot}${health_check_port_path}
          # [...] gost: ещё 500+ символов

      Блядь, как всё сложно, именно поэтому я за «index.php» по «FTP».

      И да, этот скрипт — только маленькая часть всей статьи.
      Ответить
    • https://habr.com/post/516230/
      Blue-Green Deployment на минималках
      >ensure-reverse-proxy() {
          is-container-up reverse-proxy &;&; return 0
          echo Deploying reverse-proxy...
          docker network create web-gateway
          docker run \
              --detach \
              --restart always \
              --log-driver journald \
              --name reverse-proxy \
              --network web-gateway \
              --publish 80:80 \
              nginx:alpine || return 1
          docker exec --interactive reverse-proxy sh -c  /etc/nginx/conf.d/default.conf
          docker exec reverse-proxy nginx -s reload
      }
      
      is-container-up() {
          local container=${1?Usage: ${FUNCNAME[0]} container_name}
      
          [ -n $(docker ps -f name=${container} -q) ]
          return $?
      }
      
      get-active-slot() {
          local service=${1?Usage: ${FUNCNAME[0]} service_name}
      
          if is-container-up ${service}_BLUE &;&; is-container-up ${service}_GREEN; then
              echo Collision detected! Stopping ${service}_GREEN...
              docker rm -f ${service}_GREEN
              return 0  # BLUE
          fi
          if is-container-up ${service}_BLUE &;&; ! is-container-up ${service}_GREEN; then
              return 0  # BLUE
          fi
          if ! is-container-up ${service}_BLUE; then
              return 1  # GREEN
          fi
      }
      
      get-service-status() {
          local usage_msg=Usage: ${FUNCNAME[0]} service_name deployment_slot
          local service=${1?usage_msg}
          local slot=${2?$usage_msg}
      
          case $service in
              # Add specific healthcheck paths for your services here
              *) local health_check_port_path=:8080/ ;;
          esac
          local health_check_address=http://${service}_${slot}${health_check_port_path}
          # [...] gost: ещё 500+ символов

      Блядь, как всё сложно, именно поэтому я за «index.php» по «FTP».

      И да, этот скрипт — только маленькая часть всей статьи.
      Ответить
    • https://habr.com/post/516230/
      Blue-Green Deployment на минималках
      >ensure-reverse-proxy() {
          is-container-up reverse-proxy &;&; return 0
          echo Deploying reverse-proxy...
          docker network create web-gateway
          docker run \
              --detach \
              --restart always \
              --log-driver journald \
              --name reverse-proxy \
              --network web-gateway \
              --publish 80:80 \
              nginx:alpine || return 1
          docker exec --interactive reverse-proxy sh -c  /etc/nginx/conf.d/default.conf
          docker exec reverse-proxy nginx -s reload
      }
      
      is-container-up() {
          local container=${1?Usage: ${FUNCNAME[0]} container_name}
      
          [ -n $(docker ps -f name=${container} -q) ]
          return $?
      }
      
      get-active-slot() {
          local service=${1?Usage: ${FUNCNAME[0]} service_name}
      
          if is-container-up ${service}_BLUE &;&; is-container-up ${service}_GREEN; then
              echo Collision detected! Stopping ${service}_GREEN...
              docker rm -f ${service}_GREEN
              return 0  # BLUE
          fi
          if is-container-up ${service}_BLUE &;&; ! is-container-up ${service}_GREEN; then
              return 0  # BLUE
          fi
          if ! is-container-up ${service}_BLUE; then
              return 1  # GREEN
          fi
      }
      
      get-service-status() {
          local usage_msg=Usage: ${FUNCNAME[0]} service_name deployment_slot
          local service=${1?usage_msg}
          local slot=${2?$usage_msg}
      
          case $service in
              # Add specific healthcheck paths for your services here
              *) local health_check_port_path=:8080/ ;;
          esac
          local health_check_address=http://${service}_${slot}${health_check_port_path}
          # [...] gost: ещё 500+ символов

      Блядь, как всё сложно, именно поэтому я за «index.php» по «FTP».

      И да, этот скрипт — только маленькая часть всей статьи.
      Ответить
    • https://habr.com/post/516230/
      Blue-Green Deployment на минималках
      >ensure-reverse-proxy() {
          is-container-up reverse-proxy &;&; return 0
          echo Deploying reverse-proxy...
          docker network create web-gateway
          docker run \
              --detach \
              --restart always \
              --log-driver journald \
              --name reverse-proxy \
              --network web-gateway \
              --publish 80:80 \
              nginx:alpine || return 1
          docker exec --interactive reverse-proxy sh -c  /etc/nginx/conf.d/default.conf
          docker exec reverse-proxy nginx -s reload
      }
      
      is-container-up() {
          local container=${1?Usage: ${FUNCNAME[0]} container_name}
      
          [ -n $(docker ps -f name=${container} -q) ]
          return $?
      }
      
      get-active-slot() {
          local service=${1?Usage: ${FUNCNAME[0]} service_name}
      
          if is-container-up ${service}_BLUE &;&; is-container-up ${service}_GREEN; then
              echo Collision detected! Stopping ${service}_GREEN...
              docker rm -f ${service}_GREEN
              return 0  # BLUE
          fi
          if is-container-up ${service}_BLUE &;&; ! is-container-up ${service}_GREEN; then
              return 0  # BLUE
          fi
          if ! is-container-up ${service}_BLUE; then
              return 1  # GREEN
          fi
      }
      
      get-service-status() {
          local usage_msg=Usage: ${FUNCNAME[0]} service_name deployment_slot
          local service=${1?usage_msg}
          local slot=${2?$usage_msg}
      
          case $service in
              # Add specific healthcheck paths for your services here
              *) local health_check_port_path=:8080/ ;;
          esac
          local health_check_address=http://${service}_${slot}${health_check_port_path}
          # [...] gost: ещё 500+ символов

      Блядь, как всё сложно, именно поэтому я за «index.php» по «FTP».

      И да, этот скрипт — только маленькая часть всей статьи.
      Ответить
    • https://habr.com/post/516230/
      Blue-Green Deployment на минималках
      >ensure-reverse-proxy() {
          is-container-up reverse-proxy &;&; return 0
          echo Deploying reverse-proxy...
          docker network create web-gateway
          docker run \
              --detach \
              --restart always \
              --log-driver journald \
              --name reverse-proxy \
              --network web-gateway \
              --publish 80:80 \
              nginx:alpine || return 1
          docker exec --interactive reverse-proxy sh -c  /etc/nginx/conf.d/default.conf
          docker exec reverse-proxy nginx -s reload
      }
      
      is-container-up() {
          local container=${1?Usage: ${FUNCNAME[0]} container_name}
      
          [ -n $(docker ps -f name=${container} -q) ]
          return $?
      }
      
      get-active-slot() {
          local service=${1?Usage: ${FUNCNAME[0]} service_name}
      
          if is-container-up ${service}_BLUE &;&; is-container-up ${service}_GREEN; then
              echo Collision detected! Stopping ${service}_GREEN...
              docker rm -f ${service}_GREEN
              return 0  # BLUE
          fi
          if is-container-up ${service}_BLUE &;&; ! is-container-up ${service}_GREEN; then
              return 0  # BLUE
          fi
          if ! is-container-up ${service}_BLUE; then
              return 1  # GREEN
          fi
      }
      
      get-service-status() {
          local usage_msg=Usage: ${FUNCNAME[0]} service_name deployment_slot
          local service=${1?usage_msg}
          local slot=${2?$usage_msg}
      
          case $service in
              # Add specific healthcheck paths for your services here
              *) local health_check_port_path=:8080/ ;;
          esac
          local health_check_address=http://${service}_${slot}${health_check_port_path}
          # [...] gost: ещё 500+ символов

      Блядь, как всё сложно, именно поэтому я за «index.php» по «FTP».

      И да, этот скрипт — только маленькая часть всей статьи.
      Ответить
    • https://habr.com/post/516230/
      Blue-Green Deployment на минималках
      >ensure-reverse-proxy() {
          is-container-up reverse-proxy &;&; return 0
          echo Deploying reverse-proxy...
          docker network create web-gateway
          docker run \
              --detach \
              --restart always \
              --log-driver journald \
              --name reverse-proxy \
              --network web-gateway \
              --publish 80:80 \
              nginx:alpine || return 1
          docker exec --interactive reverse-proxy sh -c  /etc/nginx/conf.d/default.conf
          docker exec reverse-proxy nginx -s reload
      }
      
      is-container-up() {
          local container=${1?Usage: ${FUNCNAME[0]} container_name}
      
          [ -n $(docker ps -f name=${container} -q) ]
          return $?
      }
      
      get-active-slot() {
          local service=${1?Usage: ${FUNCNAME[0]} service_name}
      
          if is-container-up ${service}_BLUE &;&; is-container-up ${service}_GREEN; then
              echo Collision detected! Stopping ${service}_GREEN...
              docker rm -f ${service}_GREEN
              return 0  # BLUE
          fi
          if is-container-up ${service}_BLUE &;&; ! is-container-up ${service}_GREEN; then
              return 0  # BLUE
          fi
          if ! is-container-up ${service}_BLUE; then
              return 1  # GREEN
          fi
      }
      
      get-service-status() {
          local usage_msg=Usage: ${FUNCNAME[0]} service_name deployment_slot
          local service=${1?usage_msg}
          local slot=${2?$usage_msg}
      
          case $service in
              # Add specific healthcheck paths for your services here
              *) local health_check_port_path=:8080/ ;;
          esac
          local health_check_address=http://${service}_${slot}${health_check_port_path}
          # [...] gost: ещё 500+ символов

      Блядь, как всё сложно, именно поэтому я за «index.php» по «FTP».

      И да, этот скрипт — только маленькая часть всей статьи.
      Ответить
    • https://habr.com/post/516230/
      Blue-Green Deployment на минималках
      >ensure-reverse-proxy() {
          is-container-up reverse-proxy &;&; return 0
          echo Deploying reverse-proxy...
          docker network create web-gateway
          docker run \
              --detach \
              --restart always \
              --log-driver journald \
              --name reverse-proxy \
              --network web-gateway \
              --publish 80:80 \
              nginx:alpine || return 1
          docker exec --interactive reverse-proxy sh -c  /etc/nginx/conf.d/default.conf
          docker exec reverse-proxy nginx -s reload
      }
      
      is-container-up() {
          local container=${1?Usage: ${FUNCNAME[0]} container_name}
      
          [ -n $(docker ps -f name=${container} -q) ]
          return $?
      }
      
      get-active-slot() {
          local service=${1?Usage: ${FUNCNAME[0]} service_name}
      
          if is-container-up ${service}_BLUE &;&; is-container-up ${service}_GREEN; then
              echo Collision detected! Stopping ${service}_GREEN...
              docker rm -f ${service}_GREEN
              return 0  # BLUE
          fi
          if is-container-up ${service}_BLUE &;&; ! is-container-up ${service}_GREEN; then
              return 0  # BLUE
          fi
          if ! is-container-up ${service}_BLUE; then
              return 1  # GREEN
          fi
      }
      
      get-service-status() {
          local usage_msg=Usage: ${FUNCNAME[0]} service_name deployment_slot
          local service=${1?usage_msg}
          local slot=${2?$usage_msg}
      
          case $service in
              # Add specific healthcheck paths for your services here
              *) local health_check_port_path=:8080/ ;;
          esac
          local health_check_address=http://${service}_${slot}${health_check_port_path}
          # [...] gost: ещё 500+ символов

      Блядь, как всё сложно, именно поэтому я за «index.php» по «FTP».

      И да, этот скрипт — только маленькая часть всей статьи.
      Ответить
    • https://habr.com/post/516230/
      Blue-Green Deployment на минималках
      >ensure-reverse-proxy() {
          is-container-up reverse-proxy &;&; return 0
          echo Deploying reverse-proxy...
          docker network create web-gateway
          docker run \
              --detach \
              --restart always \
              --log-driver journald \
              --name reverse-proxy \
              --network web-gateway \
              --publish 80:80 \
              nginx:alpine || return 1
          docker exec --interactive reverse-proxy sh -c  /etc/nginx/conf.d/default.conf
          docker exec reverse-proxy nginx -s reload
      }
      
      is-container-up() {
          local container=${1?Usage: ${FUNCNAME[0]} container_name}
      
          [ -n $(docker ps -f name=${container} -q) ]
          return $?
      }
      
      get-active-slot() {
          local service=${1?Usage: ${FUNCNAME[0]} service_name}
      
          if is-container-up ${service}_BLUE &;&; is-container-up ${service}_GREEN; then
              echo Collision detected! Stopping ${service}_GREEN...
              docker rm -f ${service}_GREEN
              return 0  # BLUE
          fi
          if is-container-up ${service}_BLUE &;&; ! is-container-up ${service}_GREEN; then
              return 0  # BLUE
          fi
          if ! is-container-up ${service}_BLUE; then
              return 1  # GREEN
          fi
      }
      
      get-service-status() {
          local usage_msg=Usage: ${FUNCNAME[0]} service_name deployment_slot
          local service=${1?usage_msg}
          local slot=${2?$usage_msg}
      
          case $service in
              # Add specific healthcheck paths for your services here
              *) local health_check_port_path=:8080/ ;;
          esac
          local health_check_address=http://${service}_${slot}${health_check_port_path}
          # [...] gost: ещё 500+ символов

      Блядь, как всё сложно, именно поэтому я за «index.php» по «FTP».

      И да, этот скрипт — только маленькая часть всей статьи.
      Ответить
    • https://habr.com/post/516230/
      Blue-Green Deployment на минималках
      >ensure-reverse-proxy() {
          is-container-up reverse-proxy &;&; return 0
          echo Deploying reverse-proxy...
          docker network create web-gateway
          docker run \
              --detach \
              --restart always \
              --log-driver journald \
              --name reverse-proxy \
              --network web-gateway \
              --publish 80:80 \
              nginx:alpine || return 1
          docker exec --interactive reverse-proxy sh -c  /etc/nginx/conf.d/default.conf
          docker exec reverse-proxy nginx -s reload
      }
      
      is-container-up() {
          local container=${1?Usage: ${FUNCNAME[0]} container_name}
      
          [ -n $(docker ps -f name=${container} -q) ]
          return $?
      }
      
      get-active-slot() {
          local service=${1?Usage: ${FUNCNAME[0]} service_name}
      
          if is-container-up ${service}_BLUE &;&; is-container-up ${service}_GREEN; then
              echo Collision detected! Stopping ${service}_GREEN...
              docker rm -f ${service}_GREEN
              return 0  # BLUE
          fi
          if is-container-up ${service}_BLUE &;&; ! is-container-up ${service}_GREEN; then
              return 0  # BLUE
          fi
          if ! is-container-up ${service}_BLUE; then
              return 1  # GREEN
          fi
      }
      
      get-service-status() {
          local usage_msg=Usage: ${FUNCNAME[0]} service_name deployment_slot
          local service=${1?usage_msg}
          local slot=${2?$usage_msg}
      
          case $service in
              # Add specific healthcheck paths for your services here
              *) local health_check_port_path=:8080/ ;;
          esac
          local health_check_address=http://${service}_${slot}${health_check_port_path}
          # [...] gost: ещё 500+ символов

      Блядь, как всё сложно, именно поэтому я за «index.php» по «FTP».

      И да, этот скрипт — только маленькая часть всей статьи.
      Ответить
    • https://habr.com/post/516230/
      Blue-Green Deployment на минималках
      >ensure-reverse-proxy() {
          is-container-up reverse-proxy &;&; return 0
          echo Deploying reverse-proxy...
          docker network create web-gateway
          docker run \
              --detach \
              --restart always \
              --log-driver journald \
              --name reverse-proxy \
              --network web-gateway \
              --publish 80:80 \
              nginx:alpine || return 1
          docker exec --interactive reverse-proxy sh -c  /etc/nginx/conf.d/default.conf
          docker exec reverse-proxy nginx -s reload
      }
      
      is-container-up() {
          local container=${1?Usage: ${FUNCNAME[0]} container_name}
      
          [ -n $(docker ps -f name=${container} -q) ]
          return $?
      }
      
      get-active-slot() {
          local service=${1?Usage: ${FUNCNAME[0]} service_name}
      
          if is-container-up ${service}_BLUE &;&; is-container-up ${service}_GREEN; then
              echo Collision detected! Stopping ${service}_GREEN...
              docker rm -f ${service}_GREEN
              return 0  # BLUE
          fi
          if is-container-up ${service}_BLUE &;&; ! is-container-up ${service}_GREEN; then
              return 0  # BLUE
          fi
          if ! is-container-up ${service}_BLUE; then
              return 1  # GREEN
          fi
      }
      
      get-service-status() {
          local usage_msg=Usage: ${FUNCNAME[0]} service_name deployment_slot
          local service=${1?usage_msg}
          local slot=${2?$usage_msg}
      
          case $service in
              # Add specific healthcheck paths for your services here
              *) local health_check_port_path=:8080/ ;;
          esac
          local health_check_address=http://${service}_${slot}${health_check_port_path}
          # [...] gost: ещё 500+ символов

      Блядь, как всё сложно, именно поэтому я за «index.php» по «FTP».

      И да, этот скрипт — только маленькая часть всей статьи.
      Ответить
    • https://habr.com/post/516230/
      Blue-Green Deployment на минималках
      >ensure-reverse-proxy() {
          is-container-up reverse-proxy &;&; return 0
          echo Deploying reverse-proxy...
          docker network create web-gateway
          docker run \
              --detach \
              --restart always \
              --log-driver journald \
              --name reverse-proxy \
              --network web-gateway \
              --publish 80:80 \
              nginx:alpine || return 1
          docker exec --interactive reverse-proxy sh -c  /etc/nginx/conf.d/default.conf
          docker exec reverse-proxy nginx -s reload
      }
      
      is-container-up() {
          local container=${1?Usage: ${FUNCNAME[0]} container_name}
      
          [ -n $(docker ps -f name=${container} -q) ]
          return $?
      }
      
      get-active-slot() {
          local service=${1?Usage: ${FUNCNAME[0]} service_name}
      
          if is-container-up ${service}_BLUE &;&; is-container-up ${service}_GREEN; then
              echo Collision detected! Stopping ${service}_GREEN...
              docker rm -f ${service}_GREEN
              return 0  # BLUE
          fi
          if is-container-up ${service}_BLUE &;&; ! is-container-up ${service}_GREEN; then
              return 0  # BLUE
          fi
          if ! is-container-up ${service}_BLUE; then
              return 1  # GREEN
          fi
      }
      
      get-service-status() {
          local usage_msg=Usage: ${FUNCNAME[0]} service_name deployment_slot
          local service=${1?usage_msg}
          local slot=${2?$usage_msg}
      
          case $service in
              # Add specific healthcheck paths for your services here
              *) local health_check_port_path=:8080/ ;;
          esac
          local health_check_address=http://${service}_${slot}${health_check_port_path}
          # [...] gost: ещё 500+ символов

      Блядь, как всё сложно, именно поэтому я за «index.php» по «FTP».

      И да, этот скрипт — только маленькая часть всей статьи.
      Ответить
    • https://habr.com/post/516230/
      Blue-Green Deployment на минималках
      >ensure-reverse-proxy() {
          is-container-up reverse-proxy &;&; return 0
          echo Deploying reverse-proxy...
          docker network create web-gateway
          docker run \
              --detach \
              --restart always \
              --log-driver journald \
              --name reverse-proxy \
              --network web-gateway \
              --publish 80:80 \
              nginx:alpine || return 1
          docker exec --interactive reverse-proxy sh -c  /etc/nginx/conf.d/default.conf
          docker exec reverse-proxy nginx -s reload
      }
      
      is-container-up() {
          local container=${1?Usage: ${FUNCNAME[0]} container_name}
      
          [ -n $(docker ps -f name=${container} -q) ]
          return $?
      }
      
      get-active-slot() {
          local service=${1?Usage: ${FUNCNAME[0]} service_name}
      
          if is-container-up ${service}_BLUE &;&; is-container-up ${service}_GREEN; then
              echo Collision detected! Stopping ${service}_GREEN...
              docker rm -f ${service}_GREEN
              return 0  # BLUE
          fi
          if is-container-up ${service}_BLUE &;&; ! is-container-up ${service}_GREEN; then
              return 0  # BLUE
          fi
          if ! is-container-up ${service}_BLUE; then
              return 1  # GREEN
          fi
      }
      
      get-service-status() {
          local usage_msg=Usage: ${FUNCNAME[0]} service_name deployment_slot
          local service=${1?usage_msg}
          local slot=${2?$usage_msg}
      
          case $service in
              # Add specific healthcheck paths for your services here
              *) local health_check_port_path=:8080/ ;;
          esac
          local health_check_address=http://${service}_${slot}${health_check_port_path}
          # [...] gost: ещё 500+ символов

      Блядь, как всё сложно, именно поэтому я за «index.php» по «FTP».

      И да, этот скрипт — только маленькая часть всей статьи.
      Ответить
    • https://habr.com/post/516230/
      Blue-Green Deployment на минималках
      >ensure-reverse-proxy() {
          is-container-up reverse-proxy &;&; return 0
          echo Deploying reverse-proxy...
          docker network create web-gateway
          docker run \
              --detach \
              --restart always \
              --log-driver journald \
              --name reverse-proxy \
              --network web-gateway \
              --publish 80:80 \
              nginx:alpine || return 1
          docker exec --interactive reverse-proxy sh -c  /etc/nginx/conf.d/default.conf
          docker exec reverse-proxy nginx -s reload
      }
      
      is-container-up() {
          local container=${1?Usage: ${FUNCNAME[0]} container_name}
      
          [ -n $(docker ps -f name=${container} -q) ]
          return $?
      }
      
      get-active-slot() {
          local service=${1?Usage: ${FUNCNAME[0]} service_name}
      
          if is-container-up ${service}_BLUE &;&; is-container-up ${service}_GREEN; then
              echo Collision detected! Stopping ${service}_GREEN...
              docker rm -f ${service}_GREEN
              return 0  # BLUE
          fi
          if is-container-up ${service}_BLUE &;&; ! is-container-up ${service}_GREEN; then
              return 0  # BLUE
          fi
          if ! is-container-up ${service}_BLUE; then
              return 1  # GREEN
          fi
      }
      
      get-service-status() {
          local usage_msg=Usage: ${FUNCNAME[0]} service_name deployment_slot
          local service=${1?usage_msg}
          local slot=${2?$usage_msg}
      
          case $service in
              # Add specific healthcheck paths for your services here
              *) local health_check_port_path=:8080/ ;;
          esac
          local health_check_address=http://${service}_${slot}${health_check_port_path}
          # [...] gost: ещё 500+ символов

      Блядь, как всё сложно, именно поэтому я за «index.php» по «FTP».

      И да, этот скрипт — только маленькая часть всей статьи.
      Ответить
    • https://habr.com/post/516230/
      Blue-Green Deployment на минималках
      >ensure-reverse-proxy() {
          is-container-up reverse-proxy &;&; return 0
          echo Deploying reverse-proxy...
          docker network create web-gateway
          docker run \
              --detach \
              --restart always \
              --log-driver journald \
              --name reverse-proxy \
              --network web-gateway \
              --publish 80:80 \
              nginx:alpine || return 1
          docker exec --interactive reverse-proxy sh -c  /etc/nginx/conf.d/default.conf
          docker exec reverse-proxy nginx -s reload
      }
      
      is-container-up() {
          local container=${1?Usage: ${FUNCNAME[0]} container_name}
      
          [ -n $(docker ps -f name=${container} -q) ]
          return $?
      }
      
      get-active-slot() {
          local service=${1?Usage: ${FUNCNAME[0]} service_name}
      
          if is-container-up ${service}_BLUE &;&; is-container-up ${service}_GREEN; then
              echo Collision detected! Stopping ${service}_GREEN...
              docker rm -f ${service}_GREEN
              return 0  # BLUE
          fi
          if is-container-up ${service}_BLUE &;&; ! is-container-up ${service}_GREEN; then
              return 0  # BLUE
          fi
          if ! is-container-up ${service}_BLUE; then
              return 1  # GREEN
          fi
      }
      
      get-service-status() {
          local usage_msg=Usage: ${FUNCNAME[0]} service_name deployment_slot
          local service=${1?usage_msg}
          local slot=${2?$usage_msg}
      
          case $service in
              # Add specific healthcheck paths for your services here
              *) local health_check_port_path=:8080/ ;;
          esac
          local health_check_address=http://${service}_${slot}${health_check_port_path}
          # [...] gost: ещё 500+ символов

      Блядь, как всё сложно, именно поэтому я за «index.php» по «FTP».

      И да, этот скрипт — только маленькая часть всей статьи.
      Ответить
    • https://habr.com/post/516230/
      Blue-Green Deployment на минималках
      >ensure-reverse-proxy() {
          is-container-up reverse-proxy &;&; return 0
          echo Deploying reverse-proxy...
          docker network create web-gateway
          docker run \
              --detach \
              --restart always \
              --log-driver journald \
              --name reverse-proxy \
              --network web-gateway \
              --publish 80:80 \
              nginx:alpine || return 1
          docker exec --interactive reverse-proxy sh -c  /etc/nginx/conf.d/default.conf
          docker exec reverse-proxy nginx -s reload
      }
      
      is-container-up() {
          local container=${1?Usage: ${FUNCNAME[0]} container_name}
      
          [ -n $(docker ps -f name=${container} -q) ]
          return $?
      }
      
      get-active-slot() {
          local service=${1?Usage: ${FUNCNAME[0]} service_name}
      
          if is-container-up ${service}_BLUE &;&; is-container-up ${service}_GREEN; then
              echo Collision detected! Stopping ${service}_GREEN...
              docker rm -f ${service}_GREEN
              return 0  # BLUE
          fi
          if is-container-up ${service}_BLUE &;&; ! is-container-up ${service}_GREEN; then
              return 0  # BLUE
          fi
          if ! is-container-up ${service}_BLUE; then
              return 1  # GREEN
          fi
      }
      
      get-service-status() {
          local usage_msg=Usage: ${FUNCNAME[0]} service_name deployment_slot
          local service=${1?usage_msg}
          local slot=${2?$usage_msg}
      
          case $service in
              # Add specific healthcheck paths for your services here
              *) local health_check_port_path=:8080/ ;;
          esac
          local health_check_address=http://${service}_${slot}${health_check_port_path}
          # [...] gost: ещё 500+ символов

      Блядь, как всё сложно, именно поэтому я за «index.php» по «FTP».

      И да, этот скрипт — только маленькая часть всей статьи.
      Ответить
    • https://habr.com/post/516230/
      Blue-Green Deployment на минималках
      >ensure-reverse-proxy() {
          is-container-up reverse-proxy &;&; return 0
          echo Deploying reverse-proxy...
          docker network create web-gateway
          docker run \
              --detach \
              --restart always \
              --log-driver journald \
              --name reverse-proxy \
              --network web-gateway \
              --publish 80:80 \
              nginx:alpine || return 1
          docker exec --interactive reverse-proxy sh -c  /etc/nginx/conf.d/default.conf
          docker exec reverse-proxy nginx -s reload
      }
      
      is-container-up() {
          local container=${1?Usage: ${FUNCNAME[0]} container_name}
      
          [ -n $(docker ps -f name=${container} -q) ]
          return $?
      }
      
      get-active-slot() {
          local service=${1?Usage: ${FUNCNAME[0]} service_name}
      
          if is-container-up ${service}_BLUE &;&; is-container-up ${service}_GREEN; then
              echo Collision detected! Stopping ${service}_GREEN...
              docker rm -f ${service}_GREEN
              return 0  # BLUE
          fi
          if is-container-up ${service}_BLUE &;&; ! is-container-up ${service}_GREEN; then
              return 0  # BLUE
          fi
          if ! is-container-up ${service}_BLUE; then
              return 1  # GREEN
          fi
      }
      
      get-service-status() {
          local usage_msg=Usage: ${FUNCNAME[0]} service_name deployment_slot
          local service=${1?usage_msg}
          local slot=${2?$usage_msg}
      
          case $service in
              # Add specific healthcheck paths for your services here
              *) local health_check_port_path=:8080/ ;;
          esac
          local health_check_address=http://${service}_${slot}${health_check_port_path}
          # [...] gost: ещё 500+ символов

      Блядь, как всё сложно, именно поэтому я за «index.php» по «FTP».

      И да, этот скрипт — только маленькая часть всей статьи.
      Ответить
    • https://habr.com/post/516230/
      Blue-Green Deployment на минималках
      >ensure-reverse-proxy() {
          is-container-up reverse-proxy &;&; return 0
          echo Deploying reverse-proxy...
          docker network create web-gateway
          docker run \
              --detach \
              --restart always \
              --log-driver journald \
              --name reverse-proxy \
              --network web-gateway \
              --publish 80:80 \
              nginx:alpine || return 1
          docker exec --interactive reverse-proxy sh -c  /etc/nginx/conf.d/default.conf
          docker exec reverse-proxy nginx -s reload
      }
      
      is-container-up() {
          local container=${1?Usage: ${FUNCNAME[0]} container_name}
      
          [ -n $(docker ps -f name=${container} -q) ]
          return $?
      }
      
      get-active-slot() {
          local service=${1?Usage: ${FUNCNAME[0]} service_name}
      
          if is-container-up ${service}_BLUE &;&; is-container-up ${service}_GREEN; then
              echo Collision detected! Stopping ${service}_GREEN...
              docker rm -f ${service}_GREEN
              return 0  # BLUE
          fi
          if is-container-up ${service}_BLUE &;&; ! is-container-up ${service}_GREEN; then
              return 0  # BLUE
          fi
          if ! is-container-up ${service}_BLUE; then
              return 1  # GREEN
          fi
      }
      
      get-service-status() {
          local usage_msg=Usage: ${FUNCNAME[0]} service_name deployment_slot
          local service=${1?usage_msg}
          local slot=${2?$usage_msg}
      
          case $service in
              # Add specific healthcheck paths for your services here
              *) local health_check_port_path=:8080/ ;;
          esac
          local health_check_address=http://${service}_${slot}${health_check_port_path}
          # [...] gost: ещё 500+ символов

      Блядь, как всё сложно, именно поэтому я за «index.php» по «FTP».

      И да, этот скрипт — только маленькая часть всей статьи.
      Ответить
    • https://habr.com/post/516230/
      Blue-Green Deployment на минималках
      >ensure-reverse-proxy() {
          is-container-up reverse-proxy &;&; return 0
          echo Deploying reverse-proxy...
          docker network create web-gateway
          docker run \
              --detach \
              --restart always \
              --log-driver journald \
              --name reverse-proxy \
              --network web-gateway \
              --publish 80:80 \
              nginx:alpine || return 1
          docker exec --interactive reverse-proxy sh -c  /etc/nginx/conf.d/default.conf
          docker exec reverse-proxy nginx -s reload
      }
      
      is-container-up() {
          local container=${1?Usage: ${FUNCNAME[0]} container_name}
      
          [ -n $(docker ps -f name=${container} -q) ]
          return $?
      }
      
      get-active-slot() {
          local service=${1?Usage: ${FUNCNAME[0]} service_name}
      
          if is-container-up ${service}_BLUE &;&; is-container-up ${service}_GREEN; then
              echo Collision detected! Stopping ${service}_GREEN...
              docker rm -f ${service}_GREEN
              return 0  # BLUE
          fi
          if is-container-up ${service}_BLUE &;&; ! is-container-up ${service}_GREEN; then
              return 0  # BLUE
          fi
          if ! is-container-up ${service}_BLUE; then
              return 1  # GREEN
          fi
      }
      
      get-service-status() {
          local usage_msg=Usage: ${FUNCNAME[0]} service_name deployment_slot
          local service=${1?usage_msg}
          local slot=${2?$usage_msg}
      
          case $service in
              # Add specific healthcheck paths for your services here
              *) local health_check_port_path=:8080/ ;;
          esac
          local health_check_address=http://${service}_${slot}${health_check_port_path}
          # [...] gost: ещё 500+ символов

      Блядь, как всё сложно, именно поэтому я за «index.php» по «FTP».

      И да, этот скрипт — только маленькая часть всей статьи.
      Ответить
  • Петербуржец потратил в игре "Великий султан" 763 550 рублей и пытался вернуть деньги через суд

    Объединённая пресс-служба судов Санкт-Петербурга сообщила о том, что Пушкинский районный суд вынес решение по иску Эндрю Синицкого к Mechanist Internet Technologies, Google и «Тинькофф Банк» о защите прав потребителя. Издание «Фонтанка» со ссылкой на данные СПАРК сообщает, что Синицкий – «бывший индивидуальный предприниматель и совладелец петербургской компании, которая специализируется в области права».

    С 27 ноября 2018 года по 3 марта 2019 года Синицкий потратил в мобильной игре «Великий султан» 763 550 рублей. Истец уверял, что операции по переводу денежных средств на счёт создателей игры были сделаны «в одностороннем порядке, без согласия истца». Синицкий не получал SMS- уведомления о переводах денежных средств, поскольку не подключил эту услугу «в связи с экономией».

    Синицкий в суде требовал «признать действия по навязыванию платных услуг (платного контента) незаконными и необоснованными».

    Синицкий требовал взыскать с ответчиков 653 958 рублей и 109 517 индийских рупий, а также 5 тысяч рублей в качестве компенсации за моральный вред и 50% штрафа за несоблюдение в добровольном порядке удовлетворения требований потребителя.

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

    Суд в удовлетворении исковых требований Синицкого отказал.
    Ответить
    • >поскольку не подключил эту услугу «в связи с экономией».
      У тинькова уведомление стоит 50 рублей в месяц.

      Какая экономия ))
      Ответить
      • Х.з., у меня гуглплей отпечаток или пароль просил на каждую транзакцию... По-моему он пиздит.
        Ответить
        • А ты тоже играл в великого султана? и какой у тебя там уровень?
          Ответить
          • Я играл в великого адмирала анимешных корабликов.
            Ответить
          • А ты тоже играл в великого султана? и какой у тебя там уровень?
            Ответить
          • А ты тоже играл в великого султана? и какой у тебя там уровень?
            Ответить
            • А ты тоже играл в великого султана? и какой у тебя там уровень?
              Ответить
            • А ты тоже играл в великого султана? и какой у тебя там уровень?
              Ответить
            • А ты тоже играл в великого султана? и какой у тебя там уровень?
              Ответить
            • А ты тоже играл в великого султана? и какой у тебя там уровень?
              Ответить
            • А ты тоже играл в великого султана? и какой у тебя там уровень?
              Ответить
            • А ты тоже играл в великого султана? и какой у тебя там уровень?
              Ответить
            • А ты тоже играл в великого султана? и какой у тебя там уровень?
              Ответить
            • А ты тоже играл в великого султана? и какой у тебя там уровень?
              Ответить
            • А ты тоже играл в великого султана? и какой у тебя там уровень?
              Ответить
            • А ты тоже играл в великого султана? и какой у тебя там уровень?
              Ответить
            • А ты тоже играл в великого султана? и какой у тебя там уровень?
              Ответить
            • А ты тоже играл в великого султана? и какой у тебя там уровень?
              Ответить
            • А ты тоже играл в великого султана? и какой у тебя там уровень?
              Ответить
            • А ты тоже играл в великого султана? и какой у тебя там уровень?
              Ответить
            • А ты тоже играл в великого султана? и какой у тебя там уровень?
              Ответить
            • А ты тоже играл в великого султана? и какой у тебя там уровень?
              Ответить
            • А ты тоже играл в великого султана? и какой у тебя там уровень?
              Ответить
            • А ты тоже играл в великого султана? и какой у тебя там уровень?
              Ответить
            • А ты тоже играл в великого султана? и какой у тебя там уровень?
              Ответить
            • А ты тоже играл в великого султана? и какой у тебя там уровень?
              Ответить
            • А ты тоже играл в великого султана? и какой у тебя там уровень?
              Ответить
            • А ты тоже играл в великого султана? и какой у тебя там уровень?
              Ответить
            • А ты тоже играл в великого султана? и какой у тебя там уровень?
              Ответить
            • А ты тоже играл в великого султана? и какой у тебя там уровень?
              Ответить
            • А ты тоже играл в великого султана? и какой у тебя там уровень?
              Ответить
          • А ты тоже играл в великого султана? и какой у тебя там уровень?
            Ответить
          • А ты тоже играл в великого султана? и какой у тебя там уровень?
            Ответить
          • А ты тоже играл в великого султана? и какой у тебя там уровень?
            Ответить
            • А ты тоже играл в великого султана? и какой у тебя там уровень?
              Ответить
            • А ты тоже играл в великого султана? и какой у тебя там уровень?
              Ответить
            • А ты тоже играл в великого султана? и какой у тебя там уровень?
              Ответить
            • А ты тоже играл в великого султана? и какой у тебя там уровень?
              Ответить
            • А ты тоже играл в великого султана? и какой у тебя там уровень?
              Ответить
            • А ты тоже играл в великого султана? и какой у тебя там уровень?
              Ответить
            • А ты тоже играл в великого султана? и какой у тебя там уровень?
              Ответить
            • А ты тоже играл в великого султана? и какой у тебя там уровень?
              Ответить
            • А ты тоже играл в великого султана? и какой у тебя там уровень?
              Ответить
            • А ты тоже играл в великого султана? и какой у тебя там уровень?
              Ответить
            • А ты тоже играл в великого султана? и какой у тебя там уровень?
              Ответить
            • А ты тоже играл в великого султана? и какой у тебя там уровень?
              Ответить
            • А ты тоже играл в великого султана? и какой у тебя там уровень?
              Ответить
            • А ты тоже играл в великого султана? и какой у тебя там уровень?
              Ответить
            • А ты тоже играл в великого султана? и какой у тебя там уровень?
              Ответить
            • А ты тоже играл в великого султана? и какой у тебя там уровень?
              Ответить
            • А ты тоже играл в великого султана? и какой у тебя там уровень?
              Ответить
            • А ты тоже играл в великого султана? и какой у тебя там уровень?
              Ответить
            • А ты тоже играл в великого султана? и какой у тебя там уровень?
              Ответить
            • А ты тоже играл в великого султана? и какой у тебя там уровень?
              Ответить
            • А ты тоже играл в великого султана? и какой у тебя там уровень?
              Ответить
            • А ты тоже играл в великого султана? и какой у тебя там уровень?
              Ответить
            • А ты тоже играл в великого султана? и какой у тебя там уровень?
              Ответить
            • А ты тоже играл в великого султана? и какой у тебя там уровень?
              Ответить
            • А ты тоже играл в великого султана? и какой у тебя там уровень?
              Ответить
          • А ты тоже играл в великого султана? и какой у тебя там уровень?
            Ответить
          • А ты тоже играл в великого султана? и какой у тебя там уровень?
            Ответить
          • А ты тоже играл в великого султана? и какой у тебя там уровень?
            Ответить
            • А ты тоже играл в великого султана? и какой у тебя там уровень?
              Ответить
            • А ты тоже играл в великого султана? и какой у тебя там уровень?
              Ответить
            • А ты тоже играл в великого султана? и какой у тебя там уровень?
              Ответить
            • А ты тоже играл в великого султана? и какой у тебя там уровень?
              Ответить
            • А ты тоже играл в великого султана? и какой у тебя там уровень?
              Ответить
            • А ты тоже играл в великого султана? и какой у тебя там уровень?
              Ответить
            • А ты тоже играл в великого султана? и какой у тебя там уровень?
              Ответить
            • А ты тоже играл в великого султана? и какой у тебя там уровень?
              Ответить
            • А ты тоже играл в великого султана? и какой у тебя там уровень?
              Ответить
            • А ты тоже играл в великого султана? и какой у тебя там уровень?
              Ответить
            • А ты тоже играл в великого султана? и какой у тебя там уровень?
              Ответить
            • А ты тоже играл в великого султана? и какой у тебя там уровень?
              Ответить
            • А ты тоже играл в великого султана? и какой у тебя там уровень?
              Ответить
            • А ты тоже играл в великого султана? и какой у тебя там уровень?
              Ответить
            • А ты тоже играл в великого султана? и какой у тебя там уровень?
              Ответить
            • А ты тоже играл в великого султана? и какой у тебя там уровень?
              Ответить
            • А ты тоже играл в великого султана? и какой у тебя там уровень?
              Ответить
            • А ты тоже играл в великого султана? и какой у тебя там уровень?
              Ответить
            • А ты тоже играл в великого султана? и какой у тебя там уровень?
              Ответить
            • А ты тоже играл в великого султана? и какой у тебя там уровень?
              Ответить
            • А ты тоже играл в великого султана? и какой у тебя там уровень?
              Ответить
            • А ты тоже играл в великого султана? и какой у тебя там уровень?
              Ответить
            • А ты тоже играл в великого султана? и какой у тебя там уровень?
              Ответить
            • А ты тоже играл в великого султана? и какой у тебя там уровень?
              Ответить
            • А ты тоже играл в великого султана? и какой у тебя там уровень?
              Ответить
          • А ты тоже играл в великого султана? и какой у тебя там уровень?
            Ответить
          • А ты тоже играл в великого султана? и какой у тебя там уровень?
            Ответить
          • А ты тоже играл в великого султана? и какой у тебя там уровень?
            Ответить
          • А ты тоже играл в великого султана? и какой у тебя там уровень?
            Ответить
          • А ты тоже играл в великого султана? и какой у тебя там уровень?
            Ответить
          • А ты тоже играл в великого султана? и какой у тебя там уровень?
            Ответить
          • А ты тоже играл в великого султана? и какой у тебя там уровень?
            Ответить
          • А ты тоже играл в великого султана? и какой у тебя там уровень?
            Ответить
          • А ты тоже играл в великого султана? и какой у тебя там уровень?
            Ответить
          • А ты тоже играл в великого султана? и какой у тебя там уровень?
            Ответить
          • А ты тоже играл в великого султана? и какой у тебя там уровень?
            Ответить
          • А ты тоже играл в великого султана? и какой у тебя там уровень?
            Ответить
          • А ты тоже играл в великого султана? и какой у тебя там уровень?
            Ответить
          • А ты тоже играл в великого султана? и какой у тебя там уровень?
            Ответить
          • А ты тоже играл в великого султана? и какой у тебя там уровень?
            Ответить
          • А ты тоже играл в великого султана? и какой у тебя там уровень?
            Ответить
          • А ты тоже играл в великого султана? и какой у тебя там уровень?
            Ответить
          • А ты тоже играл в великого султана? и какой у тебя там уровень?
            Ответить
          • А ты тоже играл в великого султана? и какой у тебя там уровень?
            Ответить
          • А ты тоже играл в великого султана? и какой у тебя там уровень?
            Ответить
          • А ты тоже играл в великого султана? и какой у тебя там уровень?
            Ответить
          • А ты тоже играл в великого султана? и какой у тебя там уровень?
            Ответить
          • А ты тоже играл в великого султана? и какой у тебя там уровень?
            Ответить
          • А ты тоже играл в великого султана? и какой у тебя там уровень?
            Ответить
          • А ты тоже играл в великого султана? и какой у тебя там уровень?
            Ответить
          • А ты тоже играл в великого султана? и какой у тебя там уровень?
            Ответить
          • А ты тоже играл в великого султана? и какой у тебя там уровень?
            Ответить
        • Х.з., у меня гуглплей отпечаток или пароль просил на каждую транзакцию... По-моему он пиздит.
          Ответить
        • Х.з., у меня гуглплей отпечаток или пароль просил на каждую транзакцию... По-моему он пиздит.
          Ответить
        • Х.з., у меня гуглплей отпечаток или пароль просил на каждую транзакцию... По-моему он пиздит.
          Ответить
        • Х.з., у меня гуглплей отпечаток или пароль просил на каждую транзакцию... По-моему он пиздит.
          Ответить
        • Х.з., у меня гуглплей отпечаток или пароль просил на каждую транзакцию... По-моему он пиздит.
          Ответить
        • Х.з., у меня гуглплей отпечаток или пароль просил на каждую транзакцию... По-моему он пиздит.
          Ответить
        • Х.з., у меня гуглплей отпечаток или пароль просил на каждую транзакцию... По-моему он пиздит.
          Ответить
        • Х.з., у меня гуглплей отпечаток или пароль просил на каждую транзакцию... По-моему он пиздит.
          Ответить
        • Х.з., у меня гуглплей отпечаток или пароль просил на каждую транзакцию... По-моему он пиздит.
          Ответить
        • Х.з., у меня гуглплей отпечаток или пароль просил на каждую транзакцию... По-моему он пиздит.
          Ответить
        • Х.з., у меня гуглплей отпечаток или пароль просил на каждую транзакцию... По-моему он пиздит.
          Ответить
        • Х.з., у меня гуглплей отпечаток или пароль просил на каждую транзакцию... По-моему он пиздит.
          Ответить
        • Х.з., у меня гуглплей отпечаток или пароль просил на каждую транзакцию... По-моему он пиздит.
          Ответить
        • Х.з., у меня гуглплей отпечаток или пароль просил на каждую транзакцию... По-моему он пиздит.
          Ответить
        • Х.з., у меня гуглплей отпечаток или пароль просил на каждую транзакцию... По-моему он пиздит.
          Ответить
        • Х.з., у меня гуглплей отпечаток или пароль просил на каждую транзакцию... По-моему он пиздит.
          Ответить
        • Х.з., у меня гуглплей отпечаток или пароль просил на каждую транзакцию... По-моему он пиздит.
          Ответить
        • Х.з., у меня гуглплей отпечаток или пароль просил на каждую транзакцию... По-моему он пиздит.
          Ответить
        • Х.з., у меня гуглплей отпечаток или пароль просил на каждую транзакцию... По-моему он пиздит.
          Ответить
        • Х.з., у меня гуглплей отпечаток или пароль просил на каждую транзакцию... По-моему он пиздит.
          Ответить
        • Х.з., у меня гуглплей отпечаток или пароль просил на каждую транзакцию... По-моему он пиздит.
          Ответить
        • Х.з., у меня гуглплей отпечаток или пароль просил на каждую транзакцию... По-моему он пиздит.
          Ответить
        • Х.з., у меня гуглплей отпечаток или пароль просил на каждую транзакцию... По-моему он пиздит.
          Ответить
        • Х.з., у меня гуглплей отпечаток или пароль просил на каждую транзакцию... По-моему он пиздит.
          Ответить
        • Х.з., у меня гуглплей отпечаток или пароль просил на каждую транзакцию... По-моему он пиздит.
          Ответить
    • Кстати, у игры картинка клюквенная
      https://www.gametech.ru/news/72371/

      У девушки грудь из декольте вываливается, открытая голова и волосы распущены ниже плеч. Какой бы султан такое позволил при людях?
      Ответить
      • > какой бы султан

        Великий. Люди должны вовремя отворачиваться и не смотреть. Иначе им пизда.
        Ответить
        • напоминает анекдот про армянский вирус. иногда еще встречаются варианты "еврейский" или "молдавский".
          Знаешь?
          Ответить
        • Как в «Лампе Аладдина»:
          — Прикажите ему, чтобы он посмотрел на меня.
          — Но, если он посмотрит на Вас, тогда придётся отрубить ему голову!
          — Ну и збс
          Ответить

Добавить комментарий для Okay_guy Отменить ответ

Переведи на "PHP", guest!

    А не использовать ли нам bbcode?


    8