Задать вопрос
  • Что такое уровни абстракции в книге 'Чистый код' Мартина?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    Уровни абстракции - разбиение программы на модули, каждый из которых реализует свой уровень, предоставляя интерфейс для следующего уровня и скрывая от него детали реализации.

    Например:
    Первый уровень - драйверы базы данных. Они реализуют соединение с базой, протокол обмена данными.
    Второй - универсальный интерфейс базы данных (PDO). Он реализует работу с любой базой данных в едином стиле.
    Третий - ORM. Он представляет объектную модель данных, хранящихся в БД.
    Четвёртый - основные операции бизнес-логики.
    Пятый - бизнес-логика верхнего уровня.

    При этом, драйвер БД использует сетевой интерфейс, у которого семь уровней абстракции (модель OSI), не вдаваясь в детали реализации.
    Ответ написан
    Комментировать
  • Как расположить плоскую текстуру сегмента на кольцо?

    wataru
    @wataru
    Разработчик на С++, экс-олимпиадник.
    Не знаю, как UV-маппинг задается в этом вашем JS, но формулы для получения координат в прямоугольной текстуре по координатам на кольце такие:

    x_r = (sqrt(x^2+y^2)-r0)/(r1-r0)*Width
    y_r = (atan(y/x)/pi+1/2)*Height


    Тут (x,y) - координаты на кольце. Центр кольца в (0,0), внутренний радиус r0, внешний r1. Width, Height - размеры прямоугольной текстуры.
    Ответ написан
    1 комментарий
  • Как использовать объект VNodeRef?

    Aetae
    @Aetae Куратор тега TypeScript
    Тлен
    Зачем ты огород то городишь?
    :ref="setPostRef"
    -->
    ref="postRefs"

    И всё, в postRefs.value у тебя массив элементов.

    В твоём варианте ты прям в кишки vue лезешь.
    Ответ написан
    Комментировать
  • Как стилизовать данную фигуру?

    Aetae
    @Aetae
    Тлен
    transform: matrix3d
    Ответ написан
    Комментировать
  • Как убрать/запретить выделение картинки?

    delphinpro
    @delphinpro Куратор тега CSS
    frontend developer
    не актуально
    Если картинка вообще не должна реагировать на указатель, то явно напишите это

    .your-image {
      pointer-events: none;
    }


    Или запретить выделение

    .your-image {
      user-select: none;
    }


    Или вообще полностью запретить выделение на странице

    body {
      user-select: none;
    }


    UPD. На мобилках это не выделение, а подсветка тапа.
    Обычно добавляют в стили такое правило, чтобы сделать ее прозрачной
    body {
      -webkit-tap-highlight-color: transparent;
    }
    Ответ написан
    4 комментария
  • Как узнать какое будет следующее число?

    wataru
    @wataru Куратор тега Математика
    Разработчик на С++, экс-олимпиадник.
    Выглядит случайно. Так что надо или постигнуть запретную черную магию, чтобы видеть будущее, или изобрести машину времени.
    Ответ написан
    Комментировать
  • Как сделать динамический тип с опциональными полями?

    Alexandroppolus
    @Alexandroppolus
    кодир
    можно через infer:

    type Schemas<P extends keyof paths> = paths[P]['post'] extends {requestBody: infer R} ? R : never;


    playground
    Ответ написан
    Комментировать
  • Как правильно выстроить архитектуру игры-головоломки про спички?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Плохо что ты не занимался радиотехникой. Цифры на экране - очень похожи на классический
    7-сегментный индикатор. И его состояние может быть представлено 7 битами.
    Например цифра 8 - горят все элементы можно представить как
    1111111
    Цифра 1 - горят соотвественно 2 и другие пять равны нулю. Отображение придумай сам.

    Итого у тебя будет матрица 7 х 5 бит. Эта матрица и будет состоянием игры.

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

    Что еще. В твоей игре будут запрещенные комбинации цифр которые надо отдельно проверить.
    Ответ написан
    1 комментарий
  • Где россиянину купить домен для иностранного бизнеса?

    Zettabyte
    @Zettabyte
    Проф. восстановление данных ▪ Вопрос? См. профиль
    До этого покупал домен на GoDaddy , но сейчас они вроде как собраются (или собрались) блокиовать домены

    Всё так. Русских забанили, причём, как говорится, with a very short notice.
    К GoDaddy в любой стране мира лучше не подходить даже близко - это редкостные упыри.

    Также избегайте namecheap и spaceship (дочерняя компания NC) - эти заблокировали Россию ещё раньше и весьма политизированы в целом.

    Cloudflare тоже не стоит - эти хотят подмять под себя весь интернет и обязывают использовать только их нейм-серверы.

    Кроме того, могут и отжать домен, и потребовать много денег. Пара примеров сходу:
    1. Шанс вернуть обратно - только через очень широкую огласку: https://news.ycombinator.com/item?id=31573854

      Everything was working well (Mainly use this domain for my personal emails) and now nothing is working no warnings, nothing.
      Hello, Your account violated our terms of service specifically fraud. The suspension is permanent and we will not be making changes on our end.

    2. Never register domains directly on CF. If you do this and they block you, I have no idea how you can get your domain back in a reasonable time frame. Luckily we only had our NS pointed to CF.
      https://robindev.substack.com/p/cloudflare-took-do...

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

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

    В РФ тоже опасаюсь

    Очень может быть, что и зря.
    Избегайте ру-центр (nic.ru) и reg.ru. Можете выбрать, например, WebNames - ЕМНИП, они аккредитованный регистратор .COM.
    Домен от них будет самым обычным доменом, но в случае проблем у вас будет бонус - возможность полноценно разбираться, отстаивать свои права, и невозможность регистратора вас просто проигнорировать.
    Ответ написан
    5 комментариев
  • Адрес сайта с нормальными гайдами по алгоритмам?

    wataru
    @wataru Куратор тега Алгоритмы
    Разработчик на С++, экс-олимпиадник.
    Есть русский сайт e-maxx.ru/algo
    Есть сборник кучи алгоритмов, но там мало объяснений: https://rosettacode.org/wiki/Rosetta_Code
    Ответ написан
    2 комментария
  • Как в typescript объединить ключи, и если появляются повторы, то сделать объединение типов?

    WblCHA
    @WblCHA
    Решение за один проход с поддержкой массивов и таплов. Глубина любая.

    https://www.typescriptlang.org/play/?#code/C4TwDgp...

    Основное отличие от решения Alexandroppolus, ключи собираются последовательно и не парсятся, но результат, понятное дело, одинаковый.

    type JoinKeys<T extends object> = JoinKeysDeep<T> extends infer J extends Record<
      string,
      unknown
    >
      ? { [Key in J extends J ? keyof J : never]: J extends J ? J[Key] : never }
      : never;
    
    type JoinKeysDeep<
      T extends object,
      K extends keyof T = JoinKeysDeep.GetKeys<T> & keyof T,
    > = K extends K & (string | number)
      ? T[K] extends object
        ? JoinKeysDeep<T[K]> extends infer J extends Record<string, unknown>
          ? J extends J
            ? Record<`${K | '*'}.${keyof J & (string | number)}`, J[keyof J]>
            : never
          : never
        : Record<K | '*', T[K]>
      : never;
    namespace JoinKeysDeep {
      export type GetKeys<T> = T extends unknown[]
        ? keyof T &
            (number extends T['length']
              ? // array
                number
              : // tuple
                `${number}`)
        : keyof T;
    }
    Ответ написан
    7 комментариев
  • Как в typescript объединить ключи, и если появляются повторы, то сделать объединение типов?

    Alexandroppolus
    @Alexandroppolus
    кодир
    Запилил такой вариант.

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

    Решение влоб: сначала находим все пути до простых значений, потом по множеству этих путей собираем объект.
    Ответ написан
    3 комментария
  • Как добавить/ удалить класс каждые 3 секунды в Vue?

    0xD34F
    @0xD34F Куратор тега Vue.js
    const blocks = ref(Array.from({ length: 5 }, (_, i) => (-~i) ** 2));
    const active = ref(0);
    
    function next() {
      active.value = (active.value + 1 + blocks.value.length) % blocks.value.length;
    }
    
    let intervalId = null;
    onMounted(() => intervalId = setInterval(next, 500));
    onUnmounted(() => clearInterval(intervalId));

    <div
      v-for="(n, i) in blocks"
      v-text="n"
      :class="[ 'box-item', { active: i === active } ]"
    ></div>

    Конечно, зашивать в стили цвета блоков и их количество - все эти :nth-child - не круто. Лучше сделать компонент, принимающий массив цветов и создающий блоки на его основе. Соответственно, вместо класса будет назначаться цвет фона напрямую, как-то так:

    <div
      v-for="(n, i) in colors"
      :style="{ backgroundColor: i === active ? n : '' }"
      ...
    Ответ написан
    2 комментария
  • Почему подвисают дочерние компоненты vue?

    @null_object
    Тормозить начинает из-за большого количества нод в dom дереве. Решается использование "виртуального скролла", суть которого заключается в отрисовки только видимых элементов.

    Подробнее - https://www.patterns.dev/vanilla/virtual-lists

    Утилита для Vue - https://vueuse.org/core/useVirtualList/
    Ответ написан
    1 комментарий
  • Почему не делают табы радио-кнопками?

    alexey-m-ukolov
    @alexey-m-ukolov Куратор тега HTML
    Семантично делать их ссылками.
    Радио-кнопки предполагают наличие формы, оборачивать табы в форму нелогично, так что вам кажется неправильно.
    Ответ написан
    5 комментариев
  • Не могу удалить элемент input из списка - всегда удаляется последний?

    0xD34F
    @0xD34F Куратор тега Vue.js
    v-for="(address, i) in form.addresses_to" :key="i"

    всегда удаляется последний

    Конечно последний. Индекс в качестве ключа - хуже, чем ничего. Индекс ключом быть не может, думаете, что ключи есть, а на самом деле их нет. А если ключей нет, то

    Vue использует алгоритм, который минимизирует перемещение элементов

    Т.е., было в массиве N значений, на основе которых создано N элементов. Одно значение из массива выкидывается, значит, и элементов должно остаться N - 1. Какой удалить проще всего? - последний, не надо будет перемещать элементы, расположенные за ним.

    Сделайте нормальные ключи - добавьте объектам address свойства id, имеющие уникальные значения, и используйте их в качестве ключей.
    Ответ написан
    Комментировать
  • Можно ли как либо защитить php-проект от "угона" другим наёмным программистом (фрилансером)?

    @alexalexes
    Меры безопасности такие же как и в любом коммерческом банке.
    1. Разделение информационной системы предприятия на контуры по готовности релиза: продакш (к управлению допускаются только ключевые технические специалисты компании), предпродакш (к управлению допускается только помощники ключевых технических специалистов, в контуре могут испытываться как тестовые данные, так и часть боевых данных), дев-контур для разработчиков (допускаются разработчики только по узкому направлению, в контуре циркулируют только тестовые данные).
    2. Разделение информационной системы предприятия по функционалу и делегирование прав доступа от рядового разработчика к ключевому специалисту в рамках одной подсистемы. Разработчики и их руководители должны иметь только те права доступа, которые необходимы для текущей работы.
    Ответ написан
    1 комментарий
  • Можно ли передавать CSS классы через props?

    Aetae
    @Aetae Куратор тега Vue.js
    Тлен
    Передавать класс в props можно, многие библиотек так делают, но осторожно и только когда без этого не обойтись.

    Особенно стоит обратить внимание на это при использовании scoped стилей: переданный внутрь класс не будет работать сам по себе, т.к. привязан к scope родительского компонента, придётся использовать псвевдоселектор :deep(), а это уже чревато коллизиями.

    Лучше же разбить всё на максимально небольшие компоненты с простыми api конфигурации и повсеместно использовать слоты, чтобы такие вещи не требовались слишком часто.
    Ответ написан
    2 комментария