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

0

  1. 1
Как вы думаете, что может делать функция getAlabamaTimezone(now: Date) ?

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

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

  • 1) Получать время в часовом поясе Алабамы относительно времени, данного в аргументе.
    2) Узнать сам часовой пояс Алабамы относительно времени, данного в аргументе.
    Ответить
    • Ставлю на первый вариант.

      Хотя может быть и наоборот, конвертит время из алабамского в utc...
      Ответить
  • Возможно, это как-то связано с тем, что несколько питухов в Алабаме выпендрились и живут по другой таймзоне?
    Ответить
    • Тогда логично было бы координаты на вход, а не дату?
      Ответить
        • if (isAlabamaTime(time)) {
            location = Alabama;
          } else if (isAshgabatTime(time))
          Ответить
          • Учитывая какие порой индусские лоскуты в нашей кодовой базе возникают, и такое возможно.
            Ответить
        • – Гугл, где я в Алабаме?
          – В своей сестре.
          – А, точно!
          Ответить
  • Алабама это где сестра говорит брату "а ты трахаешься лучше, чем папа", а он отвечает: "я знаю, мне мама говорила"?
    Ответить
    • Ответы хороши, но есть еще. В нашей кодовой базе например эта функция на самом деле определяет, не наступил ли сейчас определенный дедлайн (от этого зависит например на какой день можно заказать билет). Как такое значение приобрела эта функция - могу только догадываться. Возможно в названии закладывалось конкретное value (типа до 03:00 UTC), а не общий физический смысл валидации, но потом бизнес поменял хотелку на другой border и название функции совсем утратило смысл.
      Ответить
      • > не наступил ли сейчас определенный дедлайн

        Т.е. она возвращает true/false?
        Ответить
        • Причем не просто считает true/false, но еще зависит от текущего системного времени. Удачи написать юнит-тест или просто словить веселых багов со state consistency на различных границах! Та что в ОП-посте - это уже затронутая рефакторингом с уменьшением количества state-а с системным временем. Раньше параметра now вовсе не было и системное время внутри функции доставалось.
          Ответить
            • На клиенте на клиенте. Бэкенд отдельно проверяет time border для изменения данных.
              Ответить
              • То есть, если подкрутить время, можно будет купить уже недоступные билеты?

                Я надеюсь, время хоть в UTC/с сохранением таймзоны?
                Ответить
                • > То есть, если подкрутить время, можно будет купить уже недоступные билеты?

                  Нет, просто UI покажет неправильное состояние (а когда дело дойдет до транзы, приложение просто ругнется нотификашкой с ошибкой от бэка). Операции с билетами на уровне данных делает бэк.

                  > Я надеюсь, время хоть в UTC/с сохранением таймзоны?

                  Да, при расчетах времени все даты приводятся к UTC.
                  Ответить
                • Правда в нашей кодовой базе есть чисто фронтовая валидация времени на соседнем сервисе. Мной было сказано что надо также на бэк добавить проверку (с моком текущей даты который включается только в тестовом окружении), но бизнес-аналитик сказал что "пока оверкилл". Типа пилим же сервис для своих, кто будет хакать - того покараем. Но все равно выглядит это так, будто определенные номера телефонов блокируются изолентой вокруг телефонной трубки.
                  Ответить
                  • >на бек добавить

                    современное программирование это когда ты написал логику на беке а потом еще раз на фронте, но уже на другом языке (например, на TS)

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

                        Если есть бизнес знание "пуськи бятые не могут быть в крапинку", то его придется писать и на беке (чтобы они не попали в базу) и на фронте (чтобы подсветить формочку).

                        Правильное решение -- написать это один раз, и сгенерить из этого код бека и фронта.

                        Буткемп приносил какую-то схему для валидации форм декларативной, но я забыл
                        Ответить
                        • > Правильное решение -- написать это один раз, и сгенерить из этого код бека и фронта.

                          Да, из этого возникли isomorphic приложения (актуально только в контексте веба), кодогенерация по всяким JSON-чикам (главное чтобы инициализация фронта и бэка использовала один и тот же конфиг, в котором расписаны валидаторы и пр). Но между валидацией фронта и бэка не всегда 1-1 соотношение
                          Ответить
                          • не всегда, но часто.

                            Очень много копипасты логики между ними, и это грустно
                            Ответить
                            • Усе потому что условный Wordpress тупо заменили на Реакт/Vue и Лару. Либо копипаст на этапе MVP, которое по фронту и бэку будет развиваться параллельно. По-хорошему фронт и бэк все же решают разные задачи: с бэка спихивают нагрузку по рендерингу контента на фронт например. Real-time графика на сервере очень дорогая (а это основа фоторедакторов, игр всяких). Некоторые задачи вообще нерешаемы на стороне сервера: например генерация подписи приватным ключом (бэк может только проверить ее валидность по публичному).

                              В небольших (веб) приложениях достаточно монолита.
                              Ответить
                            • Интересный вопрос вообще что лучше: делить систему на фронт/бэк когда она еще MVP, или взять условный PHP комбайн не подумав о ее расширении. Мне лично второе менее привлекательно, ибо нужно тратить еще больше времени на распил, рефакторинг, переписывание кода с одного источника на другой (либо прикрутить редкий транспайлер каким-то образом).
                              Ответить
                                • > тьюринг-полнота

                                  Возможности исполнителя ограничены в первую очередь не ею, а его устройством. Тьюринг-полнота лишь означает, что с помощью языка исполнителя мы можем решить все задачи, относящиеся к bounding context исполнителя (html-ем и css-ом мы не можем например сделать фоторедактор). Майнкрафт тоже Тьюринг-полный...
                                  Ответить
                                  • > Возможности исполнителя ограничены в первую очередь не ею, а его устройством. Тьюринг-полнота лишь означает, что с помощью языка исполнителя мы можем решить все задачи, относящиеся к bounding context исполнителя

                                    В случае JS это еще означает, что браузер может сожрать кучу памяти, и всё нафиг зависнет. Или что этот JS может нагружать процессор некоторой хренью, о которой я не просил (например майнить что-нибудь).

                                    >(html-ем и css-ом мы не можем например сделать фоторедактор)

                                    А зачем делать фоторедактор на JS?

                                    > Майнкрафт тоже Тьюринг-полный...

                                    И?
                                    Ответить
                                    • >А зачем делать фоторедактор на JS?

                                      Потому что это простой способ сделать кросс-платформенный софт, который не нужно ставить.

                                      Сделать его на плюсах и Qt будет намного сложнее и дороже, увы.
                                      Ответить
                                  • Туринг полнота означает, что мы можем написать
                                    const arr = [];
                                    while(1) {
                                     arr.push(new Object());
                                    }

                                    и всё сломать



                                    Если бы бразуер умел только документы показывать (как было во времена HTML 3.2 когда можно было смотреть сайты вообще без JS) то проблемы бы не было
                                    Ответить
                                    • > Туринг полнота означает, что мы можем написать

                                      const arr = [];
                                      while(1) {
                                      arr.push(new Object());
                                      }

                                      и всё сломать

                                      Проблема это JavaScript-а или все же браузера, который слишком много памяти для процесса позволяет выделять (в Хромом движок детектит deadlock на обработку юзерских ивентов и говорит: "не, чет слишком долго выполняется" и предлагает остановить выполнение скрипта - такой проблемы нет) (то что сам скрипт виснет - проблема уже самого программирования на JS)?
                                      Ответить
                                      • Когда нужно останавливать этот скрипт?
                                        Через минуту? Через секунду?

                                        Что значит "много памяти"? Много -- это сколько?

                                        В общем случае мы не можем доказать, что какое-то говно не зациклилось. Ты же знаешь про проблему остановки, да?
                                        Ответить
                                        • > Когда нужно останавливать этот скрипт?

                                          По истечению таймера на ожидание доступности обработчика юзерского события. Скрипт выполняется в параллельном от tab manager-а процессе/потоке.

                                          > Через минуту? Через секунду?
                                          Через 10-20 секунд, не больше. Для прикладного приложения not of concern.

                                          > Ты же знаешь про проблему точки останова, да?

                                          Которая тут bound-ится процессом(ами) движка JS. Если зависает из-за этого весь браузер и тем более вся ОС - ну значит памяти/CPU слишком мало, в ОС неправильно приоритеты процессов выставлены. Проблема JS кода тут только в том что из-за него виснет движок.
                                          Ответить
                                          • Вот! Приятно читать комментарий нормального человека, а не ма-те-ма-ти-ка, для которого работа программы или определение постановы за число Грэма секунд - приемлемо, а за бесконечность - плохо.
                                            Ответить
                                        • А сейчас это выглядит как:

                                          "В том, что у меня при выполнении глючного кода на GPU отказал центральный процессор, виноват язык GPU а не архитектура материнской платы". Никакие системы не устойчивы к экплоитам на 100%.
                                          Ответить
                                          • > А сейчас это выглядит как:

                                            > "В том, что у меня при выполнении глючного кода на GPU отказал центральный процессор, виноват язык GPU а не архитектура материнской платы".

                                            К самому JS как к языку программирования я тут кстати не доебывался (хотя можно, но это тема отдельного разговора). Если б вместо JS в браузер встроили какой-нибудь Tcl или Lua, сути бы это не изменило

                                            Я доебывался до того, как этот язык используется в браузерах, что всякие говносайты могут невозбранно выжрать память и процессорное время. Ссылку я уже кидал https://www.youtube.com/watch?v=o111yYPqLHU&t=4420s
                                            Ответить
                                        • Опять проблема постановы и питуринг-пестрота.

                                          Когда же все уже поймут, что проблема постановы и питуринг-пестрота абсолютно ни на что не влияют?!
                                          Ставим лимит 10 секунд и 100МБ. Кто не выполнил - прибивать. Настройки лимитов для каждого сайта отдать пользователю (как с настройками криптушни, микрофона и т.п.).

                                          Касательно постановы:
                                          * Если у меня есть полиамидный ай-горит определения проблемы постановы, да пусть даже лунейный, но который проверяет реальный скрипт за 60 секунд, никто не будет ждать, кроме довольных ма-те-ма-ти-ков.
                                          * Если у меня есть мгновенный детектор постановы, но он не просчитывает время постановы и потребление памяти во время работы, то толку от него всё равно нет. 5 минут и 10 гигабайт спустя пользователь скрипт всё равно убьёт, это для 99% людей бесконечность.
                                          * Если у меня есть мгновенный детектор постановы, времени и памяти, то я не буду зря запускать ненужную питушню и ждать таймаут, но у меня функциональность не будет работать.

                                          Касательно пестроты:
                                          * Бесконечной ленты байтов не бывает. Бесконечного времени не бывает. Способность/неспособность что-то вычислять на них ни о чём не говорит.
                                          * Тройной вложенный цикл по всему диапазону short будет и без питуринговой пустоты эквивалентен бесконечному вычислению на бесконечной ленте.

                                          P.S. Особенно весело вышло с тестом Тьюринга. Тот в шутку что-то сказал, но сектанты её приметили и начали строить свои философствования.
                                          Ответить
                                      • > Проблема это JavaScript-а или все же браузера, который слишком много памяти для процесса позволяет выделять

                                        Думаю что если браузер не будет выдерять много памяти, почти никто этим браузером пользоваться не станет, т.к. уже написано куча говнокода на JS который кучу памяти требует для своей работы и используется на куче сайтов, и эти сайты в таком браузере работать тупо не будут.
                                        Ответить
                                    • > Если бы бразуер умел только документы показывать (как было во времена HTML 3.2 когда можно было смотреть сайты вообще без JS) то проблемы бы не было

                                      Возможно. Но и в нативных приложениях хватало vulnerabilities, ведущих систему юзера к отказу.
                                      Ответить
                                • Забывается простая вещь: весь браузерный код выполняется не только в user mode ОСи (если у тебя будет переполнение буфера из-за косяка с валидацией, у тебя тупо программа с segfault-ом крашнется и ОСь просто не даст перезаписать байтики выделенные для чужого процесса), но и внутри песочницы которая ограничивает доступ к функциональности ОСи.
                                  Ответить
                                  • > Забывается простая вещь: весь браузерный код выполняется не только в user mode ОСи (если у тебя будет переполнение буфера из-за косяка с валидацией, у тебя тупо программа с segfault-ом крашнется и ОСь просто не даст перезаписать байтики выделенные для чужого процесса), но и внутри песочницы которая ограничивает доступ к функциональности ОСи.

                                    Уровень безопасности современных браузеров на данный момент (2021 год) недостаточен, регулярно появляются новые уязвимости, позволяющие выполнить произвольный код с правами того пользователя, от чьего имени браузер запущен. CVE-2021-30632 в хроме например https://threatpost.com/google-chrome-zero-day-exploited/169442/
                                    Ответить
                                    • > Уровень безопасности современных браузеров на данный момент (2021 год) недостаточен

                                      Именно поэтому я за apparmor. Ещё один слой поверх песочницы браузера...
                                      Ответить
                                      • > Именно поэтому я за apparmor

                                        Наконец-то можно "безопасно" запускать Флэш..
                                        Ответить
                                      • > Именно поэтому я за apparmor. Ещё один слой поверх песочницы браузера...

                                        Можно еще в виртуалку это всё засунуть, как в Qubes OS. https://www.qubes-os.org/doc/gui/ - там вообще под каждое приложение свой огороженный Xorg сделан

                                        > All AppVM X applications connect to local (running in AppVM) Xorg servers that use the following “hardware” drivers:

                                        > dummyqsb_drv - video driver, that paints onto a framebuffer located in RAM, not connected to real hardware
                                        > qubes_drv - it provides a virtual keyboard and mouse (in fact, more, see below)
                                        Ответить
                                        • > в виртуалку это всё засунуть

                                          Ну тут уже оверхед по диску/памяти становится слишком большим, к сожалению... Плюс всё аппаратное ускорение идёт в пизду: не буду же я по видюхе на каждое приложение покупать.

                                          Так что это уже для чуваков, которые от трёхбуквенных агентств бегают.
                                          Ответить
                                          • ну так сделайте тонкую виртуалку уже, сделайте нормальный внятный сендбокс

                                            Пусть возможные сисколы и аргументы будут ограничены хардварно!

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

                                              В случае с "тонким" сендбоксом ты получаешь сотню-другую сисколлов и ещё сотню-другую иоктлов. На этом уровне на порядки сложнее построить что-то секьюрное. Если вообще возможно.

                                              И это даже если запретить иксы, пульсу, DRM и кучу других протоколов.
                                              Ответить
                                              • Я имел ввиду вот что: допустим, я запускаю процесс "Foo".

                                                Ядро в спец таблице прописывает какие сисколы доступны, и пусть за этим следит процессор как он следит за IO и памятью.
                                                Ответить
                                                • И что это изменит? Сисколлов станет меньше или их взаимодействия друг с другом будут проще? Не в пирфомансе там дело...

                                                  Все вот эти lockdown, seccomp, apparmor, selinux и ещё десяток LSM как раз таки пытаются что-то обрезать на уровне сисколлов. Семь (?) неймспейсов для ядерных объектов вон даже прикрутили.

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

                                                  Составить "список разрешённых сисколлов и их аргументов" не так просто, как тебе кажется.
                                                  Ответить
                                                    • > >процессор

                                                      Что "процессор"? А сейчас за этим GPU следит, или что?
                                                      Ответить
                                                      • как реализован seccomp?
                                                        кто не дает мне вызвать запрешщенный сискол?
                                                        Ответить
                                                        • > как реализован seccomp?

                                                          Как системный вызов, который какие-то там другие системные вызовы разрешает или не разрешает. А как это еще можно было б реализовать? Переписать ядро Linux на VHDL чтобы вот системные вызовы Linux ядра были частью процессора, или что ты блядь предлагаешь? Что там процессор должен следить?
                                                          Ответить
                                                          • ядро линукса на fpga
                                                            заебись идея, надо торвальдсу передать
                                                            Ответить
                                                          • Процессор отлично следит за обращениями к IO и памяти и за вызовом некоторых инструкций, которые нельзя вызвать с третьего кольца.

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

                                                            По-моему я четко написал:
                                                            https://govnokod.xyz/_27840/#comment-779379
                                                            Ответить
                                                            • > Если бы у каждого процесса была таблица сисколов (как сейчас есть таблица страниц) которую заполняло бы ядро, то следить за допустимыми сисколами мог бы процессор.

                                                              А как бы по-твоему процессор понимал, что вот сейчас выполняется вот этот процесс, и ему можно вот эти системные вызовы, а вот сейчас произошло переключение контекста, и теперь выполняется другой процесс, которому можно другие системные вызовы? Ему об этом ядро ОС должно сообщать? А почему б самому ядру ОС при системных вызовах не проверять системные вызовы, по-твоему там будет супербольшой оверхед? И кстати есть еще seccomp-bpf, через который можно сделать ограничения вида "системный вызов write может писать только в файловый дескриптор 1 и не более чем 512 байт за 1 раз" - пример вот там можешь посмотреть https://book.hacktricks.xyz/linux-unix/privilege-escalation/docker-breakout/seccomp

                                                              /* allow writing up to 512 bytes to fd 1 */
                                                                printf("Adding rule : Allow write upto 512 bytes to FD 1\n");
                                                                seccomp_rule_add(ctx, SCMP_ACT_ALLOW, SCMP_SYS(write), 2,
                                                                  SCMP_A0(SCMP_CMP_EQ, 1),
                                                                  SCMP_A2(SCMP_CMP_LE, 512));
                                                                
                                                                /* if writing to any other fd, return -EBADF */
                                                                printf("Adding rule : Deny write to any FD except 1 \n");
                                                                seccomp_rule_add(ctx, SCMP_ACT_ERRNO(EBADF), SCMP_SYS(write), 1,
                                                                  SCMP_A0(SCMP_CMP_NE, 1));


                                                              Или ты хочешь в сам процессор встроить понятие каких-нибудь процессов и планировщик?
                                                              Ответить
                                                              • >А как бы по-твоему процессор понимал, что вот сейчас выполняется вот этот процесс

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

                                                                Во-вторых когда-то была идея хардварного переключения контекстов, но оно не используется, хотя и есть в проссоре.

                                                                >seccomp-bfp
                                                                а BPF у нас тюринг-полный?:)
                                                                Задачи про "не более чем 512 за раз" это скорее про перформанс, чем про безопасность, это можно оставить и в ядре


                                                                >Или ты хочешь в сам процессор встроить понятие каких-нибудь процессов?

                                                                Ну так они и были в Hardware Task Switching же
                                                                Ответить
                                                                • > Ну во-первых переключение контекста и так сопровождается загрузкой других Page tables, точно также можно было бы и грузить таблицы сисколов.

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

                                                                  > Во-вторых когда-то была идея хардварного переключения контекстов, но оно не используется, хотя и есть в проссоре.

                                                                  Потому что оказалось тормозной хуйней. https://stackoverflow.com/a/2761422

                                                                  > а BPF у нас тюринг-полный?:)

                                                                  Нет. https://blog.cloudflare.com/bpf-the-forgotten-bytecode/
                                                                  Before executing the BPF bytecode kernel ensures that it's safe:

                                                                  All the jumps are only forward, which guarantees that there aren't any loops in the BPF program. Therefore it must terminate.
                                                                  All instructions, especially memory reads are valid and within range.
                                                                  The single BPF program has less than 4096 instructions.

                                                                  All this guarantees that the BPF programs executed within kernel context will run fast and will never infinitely loop. That means the BPF programs are not Turing complete, but in practice they are expressive enough for the job and deal with packet filtering very well.
                                                                  Ответить
                                                              • > через который можно сделать ограничения вида

                                                                Отлично! А теперь запрети писать слово "хуй" в дескриптор 1.
                                                                Ответить
                                                                • > Отлично! А теперь запрети писать слово "хуй" в дескриптор 1.

                                                                  Модулем ядра можно такое реализовать.

                                                                  Или огороженый процесс может срать в какой-нибудь пайп, из пайпа потом читает другой процесс и ищет там слово "хуй". Если не находит, тогда пишет уже в дескриптор 1
                                                                  Ответить
                                                                  • > Модулем ядра можно такое реализовать.

                                                                    Ну вот, уже прокси надо городить, которая тоже добавляется к поверхности атаки, состояние какое-то хранить для каждого клиента...

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

                                                                      Не, ну вообще можно через системный вызов ptrace всякой хуйни понаделать. https://www.alfonsobeato.net/c/modifying-system-call-arguments-with-ptrace/

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

                                                                      Можешь погуглить ptrace sandbox
                                                                      Ответить
                                                                      • > ptrace sandbox

                                                                        seccomp вроде тоже умеет отправлять на дальнейший анализ в ptrace. Чтобы совсем все вызовы под ptrace не гонять.
                                                                        Ответить
                                                                      • > поискать "хуй" в буфере

                                                                        Ну тут тоже огромный простор для багов и уязвимостей...

                                                                        Можно, к примеру, увидеть "ху" и от радости забыть, что дальше конец буфера.

                                                                        Или забыть тот факт, что прошлый буфер закончился на "ху".

                                                                        Т.е. сам ptrace-sandbox становится частью attack surface... И его тоже надо загонять в сендбокс по-хорошему. Или писать на чём-то безопасном.
                                                                        Ответить
                                                                        • > Т.е. сам ptrace-sandbox становится частью attack surface... И его тоже надо загонять в сендбокс по-хорошему. Или писать на чём-то безопасном.

                                                                          Если б проверка на слово "хуй" была реализована в ядре, это было б еще хуже для секурности. Так что в идеале надо формально доказывать.
                                                                          Ответить
                                                        • Ядро не даёт.

                                                          Ты реально не понимаешь проблему? Суть не в том, как запретить. Суть в том, что запретить.

                                                          Никто тебе на этот вопрос не ответит со 100% уверенностью.
                                                          Ответить
                                                          • Это вторая проблема.

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

                                                            когда у тебя 500 сисколов, то конечно никто ничего не понимает
                                                            Ответить
                                                            • > Это вторая проблема.

                                                              Первая, на самом деле.

                                                              > делать простой и понятный набор сисколов

                                                              Да, к сожалению придётся всю ось, все протоколы и весь софт редизайнить с нуля. И никаких сокетов, пайпов, девнод и прочих "волшебных" сущностей, которые превращают "простые и понятные" read и write в неконтролируемые каналы связи.

                                                              Для каких-то встраиваемых решений это (с натяжкой) прокатит. Для десктопа и серверов это не взлетит никогда. Рыночек выберет совместимость.
                                                              Ответить
                                            • К примеру, если ты посмотришь на диск с точки зрения виртуалки -- это тупейший массив секторов.

                                              Для сендбокса же это маунты, файлы, каталоги, симлинки, юникс сокеты, девноды,
                                              права доступа и куча сисколлов для работы со всем этим.

                                              Где больше вероятность отстрелить себе ногу и пропустить неочевидную дыру?
                                              Ответить
                                • Всё лучше, чем вручную на каждый чих устанавливать приложение в отдельном контейнере.
                                  Ответить
                        • Когда на бэке сильнее валидация, имеем дело с некоторыми допущениями в отзывчивости UI. Когда на фронте - значит с юзерским фактором (например галочка "я согласен с правилами" которая нужна тупо для того чтобы юзер обратил внимание на правила)
                          Ответить
  • А еще позабавил джун, который аргументировал объединение кода нескольких функций (это не про функцию в ОП-посте) в одну "чтобы поменьше функций было, а то запутаешься в них". Посоветовала ему почитать/прорешать книжки по дискретной математике, алгоритмам, DDD.
    Ответить
    • > чтобы поменьше функций было, а то запутаешься в них

      Джун просто лиспер был.
      Ответить
      • А Лисп - это сорт оф Бейсик/Ассемблер разве? Да и дело тут не в привычке (на ASM тоже можно писать хорошо структурированный код на уровне макросов/соглашений) к определенному инструменту, а на каких вообще основаниях принимается решение о структуре кода. Чувак явно еще не приноровился абстрагироваться от конкретного инструмента при проектировании решений. Поетому и было посоветована дискретка и DDD.

        Я вот на Си почти не прогаю, но всегда стараюсь чистить внешние ресурсы в cleanup колбэке после их аллокации. Либо неотработавший воркер (например fetch) при изменении какого-то state. Иначе будут race conditions, dangling references (компонент удалился из дерева, а колбэк вызывает метод компонента и он еще висит в очереди неотмененным).
        Ответить
        • В CL есть традиция делать универсальные макросы, которые делают кучу всего: к примеру, вместо множества функций высшего порядка, там один макрос do.
          Ответить
          • Императивная парадигма оказывается когнитивно проще, когда речь идет о множестве состояний которые могут находиться в совершенно разных слоях "мира", да. Что касается монолита, то хороший монолит написать проще чем хорошо декомпозировать программу. Если нужна oneoff портянка - пишешь монолит. Распиливаешь его на куски, когда нужно какой-то его части расшириться например. Если у тебя скрипт выполняющий one-off джобу, то зачем всякие функторы, HOF-ы, ООП и пр когда старый-добрый процедурный подход решает задачу проще?
            Ответить
            • > Распиливаешь его на куски, когда нужно какой-то его части расшириться например

              Или когда на этапе написания кода не проведено исследование по специфичному формату данных и пр., и ты прибегаешь к параметризации чтобы "на всякий случай".
              Ответить
    • Да вообще одной функцией обойтись можно:
      std::any do_shit(std::string action_type, uint8_t action_index, std::vector<std::any> arguments)

      Внутри ифами раскидать, что куда.
      Ответить
      • Младший разработчик. В нашем случае ето не лиспер (у лисперов обычно другая крайность выдрачивать все до красоты математических абстракций, упуская бизнесовый tradeoff), а просто фронтендер на JS-е.
        Ответить
      • Джун — это как джинн, только тереть надо не лампу, а лицо (фейспальмом), и не до исполнения желания, а после.
        Ответить
        • Особенно когда он не копает что делать, когда ему в консоли черным по-белому написали что-то типа "error: this branch already exists". И на каждый такой пук просит созвониться с ним.
          Ответить
          • Вааань... У меня чего-то ничего не работает, по не по нашему написано... Что может быть такое?
            Ответить
            • Смех смехом, а у меня в институте спрашивали что значит фраза в духе "remove floppy disk and press any key to continue" и что сделать чтобы комп загрузился. Тян с пятёркой по инглишу...
              Ответить
          • Какую-то самостоятельность всё-таки надо прививать ему... Подкинь ссылку или попроси погуглить самостоятельно, если проблема известная.
            Ответить
            • >ли попроси погуглить самостоятельно

              через пол часа читай его вопрос на "otevy.mail.ru"
              Ответить
              • Копи на взятку медсестре. Чтобы когда ты начнешь задыхаться, она добила тебя уткой.
                Ответить
    • > объединение кода нескольких функций (это не про функцию в ОП-посте) в одну "чтобы поменьше функций было, а то запутаешься в них"
      Было
      double shifted_sin(double x, double s) {
        return sin(x)+s;
      }
      
      double argshifted_sin(double x, double s) {
        return sin(x+s);
      }
      
      double scaled_sin(double x, double s) {
        return sin(x)*s;
      }
      
      double argscaled_sin(double x, double s) {
        return sin(x*s);
      }

      Предлагал хотя бы
      double sin(double x, double xscale=1., double yscale=1., double xshift=0., double yshift=0.);


      > Посоветовала ему почитать/прорешать
      Почитал и добавил
      1. backshifted_sin, argbackshifted_sin, backscaled_sin, argbackscaled_sin с "-" и "/"
      2. logscaled_sin, arglogscaled_sin
      3. sinsin
      Ответить
      • > double sin

        Это как в питере -- комбо из убийства и чревоугодия?
        Ответить
        • Это как с master/slave в терминах дискушни и веткой master в какой-то репозиторной питушне.
          Придут неравнодушные и либо оставят только cos, либо переименуют sin/cos в wave/swav (shifted wave).
          Ответить
  • поговорим про коммит месседжи.

    Пишите ли вы нормальные коммит месседжи чтобы ревьюер понимал что вы починили и как, или пидорские типа
    [ABC-123] Freeze

    ?
    Ответить
    • Если ты про работу, то там нормальные месседжи и привязка к задаче.
      Ответить
      • Привязка к задаче это понятно, а но её недостаточно
        Пишешь ли ты развернуто
        * что было сломано
        * почему
        * как ты пончили.


        Если issue звучит как "Failed to create Foo" то явно недостаточно указать задачу
        Ответить
        • > что было сломано
          > почему

          Обычно описывается в той же задаче в Жире. А вообще если идет речь про тырпрайз, то ты привязан основное время к одному проекту и ты можешь обсудить с тем же аналитиком или тестировщиком детали. Стартапы плачут, колятся, бросают скоротечные портянки но продолжают пилить бабло на ИТ.

          > что было сломано
          > как ты починил

          А это уже описывается в коммит-месседже да.
          Ответить
        • Развёрнутые детали исследования и починки я обычно в задачу пишу.

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

            У меня просто жопа горит когда есть ишью
            [ABC-123] хуйня рендомли зависает


            И коммент у коммита
            [ABC-123] хуйня рендомли зависает


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

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

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

                        Об этом была написана дока у метода, вставлен ассерт, и все места его использования завернули в код, который ставит задачу пулу, который с этим тредом связан
                        Ответить
      • Да. У тебя тупо прекоммит хук не пропустит мессадж не по правилам. К тому же есть README
        Ответить
    • Обычно емкие, описывающие суть изменений и по правилу "<type-of-changes>(<part-of-application-or-library>): <description>" (формат как в твоем посте встречался мне на прошлом месте). Короткие как в твоем посте только при очень небольших изменениях соответственно (зачем расписывать очередной ренейминг в рамках рефакторинга?). Что и как точно починили должно быть известно из самих изменений. Коммит мессаджи должны подсказывать на что обратить внимание в первую очередь.
      Ответить
      • А то бывает так что мой мр тянет за собой изменения в других пакетах которые я вообще не трогала. А это просто у меня на машине линтер поработал, а фронты из других команд просто глушат прекоммит хуки.
        Ответить
        • >тянет за собой изменения в других пакетах которые я вообще не трогала. А это просто у меня на машине линтер поработал

          ээ

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

              > А это просто у меня на машине линтер поработал
              Кто дал слово этому петуху? Раньше это была просто кукарекалка, которую можно было просто игнорировать. Удивлён, что ей позволили писать своё авторитетное мнение в файлы, которые не изменялись, даже в IDE не открывались.
              Ответить
              • Я однажды видел как чел закоммитил файл настроек и там был путь типа
                C:\Documents and Settings\Пётр Петухов\Проекты\


                Потом другой чел открыл проект, и закоммитил уже
                /home/petuh/projects/



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

          А потом они обижаются, что про фронтендеров столько мемов
          Ответить
          • Все что не убивает, делает нас сильнее (правда не всех). С другой стороны, есть и бэкендеры которые элементарной архитектуры с load balancer-ом, ивенты (сигналы) Линукса не знают. А потом бегают к фронтам, чтобы они починили то что у них не сломано ("да у вас просто в вебпаке роутинг не настроен", когда логирование показывает обратное).
            Ответить
            • про бэкарей тоже достаточно мемасов. мой любимый это

              – Всю ночь на стейдже автотесты гонял. Даже базу грохнул.
              – Но у нас нет стейджа!

              Хотя это больше про aqa, наверное
              Ответить
            • >С другой стороны, есть и бэкендеры которые элементарной архитектуры с load balancer-ом, ивенты (сигналы) Линукса не знают.

              Я бы сказал, что среди веб-макак таких большинсво.
              Ответить
      • кстати, я не сильно в теме

        хук можно глобально как-то для репы прописать, чтоб не каждый питух отдельно это делал?
        Ответить
        • можно на сервере поставить
          pre-receive
          The first script to run when handling a push from a client is pre-receive.

          тогда локально ты можешь себе срать, а запушить не сможешь


          например у нас нельзя пушнуть файл более 10 мегабайт, и вроде нельзя форспушнуть в мастер
          Ответить
          • не, ну это не то

            я имел в виду pre-commit hook, который автоматически подтягивается, когда делаешь clone
            Ответить
            • Какой троян )))

              Проще действительно на серваке не пропускать.
              Ответить
              • Такое уже есть? То есть я могу произвольный репозиторий скачать, чтобы посмотреть, а оказывается, он на git clone уже запустил вредоносную питушню?
                Ответить
                • Были эквивалентные этому баги.

                  Так что можно поставить правильную версию гита и наслаждаться автоматической установкой хуков и майнеров.
                  Ответить
              • то есть запуск какого-нибудь скрипта в билд-фазе проекта это не троян, а в хуке троян?
                Ответить
                • Вообще говоря да. См. коммент от 1024--.

                  Ты просто скачал посмотреть, а тебя уже выебли.

                  А сборка проекта -- это уже осознанное действие обычно.
                  Ответить
                  • я не понял только, почему pre-commit хук у вас срабатывает на clone, ну ладно
                    Ответить
                    • Что ты именно до этого хука доебался, я про общий случай...

                      Ну ок, представь что ты склонил репу, создал бранч (и словил майнера в post-checkout), поправил ридмишку, закоммитил её (и словил майнера в pre-commit) и запушил (и словил майнера в pre-push).

                      Согласись, никто не ожидает, что от правки сраного текстовика на его компе исполнится произвольный код?
                      Ответить
                      • потому что я изначально спрашивал именно про хук

                        > никто не ожидает, что от правки сраного текстовика на его компе исполнится произвольный код
                        – а так же я не ожидаю, что мои коллеги рискнуть влепить майнер в скрипт в рабочей репе.
                        Ответить
                        • > в рабочей репе

                          Ну т.е. уже нужен какой-то переключатель во время загрузки репы, доверяешь ты ей или нет? Какое-то осознанное действие для активации хуков.

                          Т.е. в общем-то можно засимлинкать каталог с ними куда надо после клона и не ебать мозг.
                          Ответить
                          • как можно не доверять рабочей репе?

                            > можно засимлинкать каталог с ними куда надо после клона
                            – ну дык это каждому новому питуху придётся качать архив, распаковывать и делать симлинку. а питухи ленивые пошли и не хотят потратить две минуты на то, что им позже сэкономит часы.

                            вот мне и интересно стало, есть ли какой-то глобальный механизм

                            как я понял, нет, потому что с понтом security issues
                            Ответить
                            • > как можно не доверять рабочей репе?

                              Откуда, блядь, git знает рабочая она или от рандомного Васяна с гитхаба?

                              > качать архив

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

                                > Дык закоммить их в репу!

                                – симлинки ж всё равно придётся руками делать, не?
                                Ответить
                                • > зачем это знать гиту, если достаточно знать мне?

                                  А как он поймёт, надо ему автоматически включать хуки или нет? Пусть из-за одного лентяя все регулярно ловят троянов, как с автораном в винде?

                                  Или ты ему опцию будешь передавать при клоне?
                                  Ответить
                                  • зачем какие-то опции и что-то там включать или выключать? нельзя просто зайти в репу перед тем, как её сливать, и почитать, что в хук-скриптах?

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

                                      Примерно аналогично питушне про sudo. Нельзя просто зайти в исходники луникса и прочитать, что незаконный sudo пишет в Спортлото?
                                      Или почти как с ярлычками. Нельзя просто зайти в бинарники винды и прочитать, что иконка может исполнить вредоносный код?

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

                                – лол, так несекьюрно же
                                Ответить
                                • > так несекьюрно же

                                  Ты его сознательно запустил. Сам. Понимая, что это рабочая репа. Возможно даже прочитав его перед этим.
                                  Ответить
                                  • так я и коммит сознательно делаю

                                    а про то, что в папке hooks лежат скрипты с правами на исполнение и их количество, гиту не так уж сложно напиздеть в кококонсолечку при клоне
                                    Ответить
                                    • > напиздеть в кококонсолечку при клоне

                                      Ну разве что задать вопрос, как это делает ворд: Эта репа содержит хуки. Хуки могут выебать вас в жопу. Введите "ДА Я ХОЧУ ВКЛЮЧИТЬ ХУКИ", если действительно доверяете этой репе и хотите включить хуки.

                                      Ты реально не чувствуешь разницы между "я запустил скрипт для сборки" и "я просто переключил ветку, решил выкачать свежую версию или закоммитил ридмишку, а оно пошло код исполнять"?
                                      Ответить
                                      • я реально не понимаю, почему в 2021-ом году нужно руками писать скрипты на каком-нибудь лапшебаше, чтобы 50 питухов на проекте получили пре-коммит хук. и так для каждой репы в конторе

                                        да, можно задать вопрос, как это делает ворд. это пиздец какое сложное архитектурное решение?

                                        я почитал, как это сделано в fossil, и там вроде хуки добавляются командой для репы

                                        но у них такая дока, что нихуя не понятно
                                        Ответить
    • > В своем telegram-канале Дуров провел опрос: что лучше, удалить картинки или полностью заблокировать социальную сеть. Две трети пользователей проголосовали за тотальную блокировку мессенджера.

      > Создатель и владелец Telegram Павел Дуров сообщил, что в социальной сети у пользователей теперь не будет возможности отправлять анимированный значок с изображением баклажана и персика.

      Какой референдум, какая демократия 🙂
      Ответить
      • Т.е. теперь в юникоде есть запрещённые символы?

        З.Ы. Страйкер вот заранее приготовился и запретил их все.
        Ответить
    • Зачем ты даёшь траффик Венику? Трудно представить более мерзотного журналиста.
      Ответить
      • > представить более мерзотного журналиста
        Представляю CNN, всяки NBC, WaPo и NYT
        Ответить
    • > Вместе с овощем отключили и изображение персика – им часто в переписке обозначают ягодицы.

      – ничо, что там есть стикерпак с чуваком, у которого вместо головы жопа?
      Ответить

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

Семь раз отмерь — один отрежь, guest!

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


    8