• Какой движок/фреймворк можно использовать для разработки интерактивных приложений?

    Сапер, змейка, гонки, арканоид и т.п. с простой графикой (спрайты) - делаются на ванильном js легко. Там где сложная геометрия, 3D графика - там tree.js
    Ответ написан
    Комментировать
  • Какой движок/фреймворк можно использовать для разработки интерактивных приложений?

    @MrColdCoffee
    web
    three.js как вариант
    Ответ написан
    Комментировать
  • Как правильно сохранять файл?

    @Drno
    Веб серверу права на папку выдай
    Ответ написан
    Комментировать
  • Как правильно сохранять файл?

    freeExec
    @freeExec
    Участник OpenStreetMap
    В том, что у вебсервера нет прав на запись в ту директорию.
    Ответ написан
    5 комментариев
  • Как поменять цвет?

    Maksim_64
    @Maksim_64
    Data Analyst
    можно синхронизировать с использованной темой file->preferences->settings->Window затем находите Title Bar Style устанавливаете его в custom по умолчанию там (native). Далее он спросит о том что изменения требуют перезапуска, соглашаетесь и все. Далее ваше меню будет следовать установленной цветовой теме и при ее изменении цвет меню будет меняться вместе с ней.
    Ответ написан
    Комментировать
  • Как правильно писать функцию вызова со скобками или без?

    Во втором варианте создаётся дополнительная функция, внутри которой одна строчка: open().
    Поэтому лучше первый вариант
    Ответ написан
    Комментировать
  • Защита данных в API?

    ThunderCat
    @ThunderCat Куратор тега Веб-разработка
    {PHP, MySql, HTML, JS, CSS} developer
    Здравствуйте, существует проблема защиты данных клиентского приложения передаваемых серверу и обратно.
    Какая конкретно проблема?

    как защитить данные?
    От кого?

    Можно ли использовать HTTPS
    Разрешаю, можно.

    и как это сделать
    На сервере ставите сертификат, в клиенте прописываете урл апи с https.

    или же нужно создавать свои модули шифрования под сессии?
    Если приложение передает критические данные (например банковские транзакции или шпиёнские документы), можно использовать сквозное шифрование с какими-нибудь убердлинными ключами, однако перехват ключей при хэндшейке при атаке митм никто не отменял. Впрочем, как и в случае с хттпс.
    Ответ написан
    Комментировать
  • Как починить сессии, если используется Google Tag Manager?

    @pantsarny
    Отключите gtag и будет работать
    Ответ написан
    Комментировать
  • Как работать с валютой в битриксе?

    @KukuRuku
    в добавок при создании курса нету кнопки запросить курс.

    Скорее всего кнопки нет, т.к. базовая валюта не из списка RUB, BYR, BYN, UAH.

    $showGetRate = ($baseCurrency != '' && in_array($baseCurrency, array('RUB', 'BYR', 'BYN', 'UAH')));


    откуда-то подтягиваются и как-то считаются, где и как?

    Крон, агенты, код в init.php?

    Вообще должно обновляться поле CURRENT_BASE_RATE (а не AMOUNT) в таблице b_catalog_currency через агент
    \Bitrix\Currency\CurrencyManager::currencyBaseRateAgent(). Вот его базовые настройки:
    if (!($currencyAgent = $agentIterator->Fetch())) {
            Currency\CurrencyManager::updateBaseRates();
            $checkDate = Main\Type\DateTime::createFromTimestamp(strtotime('tomorrow 00:01:00'));
            CAgent::AddAgent('\Bitrix\Currency\CurrencyManager::currencyBaseRateAgent();', 'currency', 'Y', 86400, '', 'Y', $checkDate->toString(), 100, false, true);
    }

    А агент работает с курсами.
    Ответ написан
    Комментировать
  • Почему не работает споллер?

    Starina_js
    @Starina_js
    full-stack web dev
    Потому что у вас ошибка на ошибке)

    - не claccList, а classList,
    - не sppollers / sppoller, а spollers / spoller
    и тут
    matchMedia.addEventListener(function () {
            initSpollers(spollersArray, matchMedia);
          });


    Какое событие должно отслеживаться для matchMedia ? click?

    matchMedia.addEventListener('click', function() {
                    initSpollers(spollersArray, matchMedia);
                });


    Сначала смотрите в консоль, она рассказывает где ошибки.
    Но даже исправив такие , то все равно надо разобраться как это все должно работать)
    Ответ написан
    2 комментария
  • VueJS, при добавлении option сбивается selected по умолчанию. Как убрать этот эффект?

    0xD34F
    @0xD34F Куратор тега Vue.js
    выбранным оказывается последний добавленный элемент, несмотря на то, что всем добавленным элементам в GetSelected я вернул ' '

    Не "несмотря на то", а "потому". Пробел и пустая строка - не одно и то же.

    А вообще, ерундой какой-то занимаетесь. Может, стоит освоить использование v-model?
    Ответ написан
    5 комментариев
  • Как сделать автообновляемую таблицу?

    Adamos
    @Adamos
    На любой из тех, что в тегах к вопросу.
    Ответ написан
    2 комментария
  • Удаление/добавление класса при сужении экрана?

    delphinpro
    @delphinpro Куратор тега JavaScript
    frontend developer
    1. лучше не класс удалять, а сам слайдер отключить. У него есть метод unslick
    2. Не нужно ширину чекать, лучше использовать matchMedia и в нем переключать слайдер
    Ответ написан
    3 комментария
  • Зачем тут коллбэк?

    @risejs
    1) Из-за пункта 2, чтобы не множить setTimeout-ы.
    2) if (this.notificationDispose) this.notificationDispose();
    Ответ написан
    3 комментария
  • Выбор фреймворка для нового проекта - Angular? React? Vue?

    Rastishka
    @Rastishka
    Я тоже за Vue. Сделал на нем 2 CRMки, особых проблем не было.

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

    А еще у него звездочек на гитхабе в 2 раза больше чем у ангуляра.
    Ответ написан
    2 комментария
  • Выбор фреймворка для нового проекта - Angular? React? Vue?

    @imikh
    Женись, ты об этом пожалеешь; не женись, ты и об этом пожалеешь
    Ответ написан
    Комментировать
  • Выбор фреймворка для нового проекта - Angular? React? Vue?

    Mamboking
    @Mamboking Автор вопроса
    Наверное самый мощный аргумент - GitLab использует vue.js - https://about.gitlab.com/2016/10/20/why-we-chose-vue/
    Ответ написан
    1 комментарий
  • Выбор фреймворка для нового проекта - Angular? React? Vue?

    @beduin01
    Vue и только он. Сам перешел на него с Ангулара.
    Ответ написан
    6 комментариев
  • Выбор фреймворка для нового проекта - Angular? React? Vue?

    dom1n1k
    @dom1n1k
    Лично для меня Vue - это такой "фреймворк с человеческим лицом".
    В целом JS-мир похож на поле боевых действий, где постоянно то налеты авиации, то кононада гремит, то хипстерская конница с новым логотипом на знамёнах проскачет.
    А "обычный" человек сидит в подвале, обхватив голову руками, и думает - мама дорогая, куда я попал, и чё ваще вокруг происходит?
    Какие-то новые паттерны, подходы, языки... Раньше, чтобы начать, достаточно было блокнота и браузера. Пишешь hello world и сразу его видишь. Теперь нужно поставить ноду, овер 9000 пакетов, десять транспиляторов, таск-менеджеров и бандлеров. Пока увидишь рабочий результат - поседеешь.
    И вдруг какая-то добрая душа взяла у хипстоты всё самое лучшее и разумное, что та родила, но очистив от лишних абстракций и усложнений - и выкатила велосипед в виде велосипеда, а не турбо-космолета с инструкцией толщиной как "Капитал". И снова можно писать в блокноте и смотреть в браузере. При этом почти не проигрывая в возможностях.
    Ответ написан
    1 комментарий
  • Возможно ли добавить use переменные после объявления анонимной функции?

    gzhegow
    @gzhegow
    aka "ОбнимиБизнесмена"
    Процесс, который вы хотите называется "функции высшего порядка"

    // функция "высшего" порядка - что в ней высшего - надо спросить у того кто придумал, высший человек наверное
    
    $fnPow = function ($x, $y) {
      return pow($x, $y);
    };
    
    $fnPowExtended = function () use ($fnPow, $b, $c) {
      var_dump($b);
      var_dump($c);
      return $fnPow($b, $c);
    };
    
    $fnPowExtended(2, 3);
    // 2
    // 3
    // 8


    Таким образом чтобы прокинуть что-то в уже созданную функцию вам нужно создать новую функцию и прокинуть туда существующую и что-то ещё. Более того, вы можете прокинуть функцию саму в себя, чтобы сделать рекурсию.

    $fnRecursion = function () use (&$fnRecursion) {
      $fnRecursion(); // infinite recursion here
    }


    Я полагаю что ваш интерес вызван желанием создать функцию bind()/call()/apply(), как в javascript. В ПХП этим путем не пошли, т.к. ООП все же хоть и дороже в разработке, но понижает порог входа новых людей в проект. Решение спорное, т.к. в ООП надо уметь, а функционалка может быть лишь бы было. И понимая что "старый код не трогать, а заменять" это вроде не так уж плохо. Но в пхп часто старый код именно трогают, доделывают, подпиливают. Функционалка усложняет процесс понимания "что происходит", поэтому ей редко пользуются. К тому же в пхп до недавнего времени вообще короткой записи не было, и писать function () use () {}, и потом переживать, что там чото с памятью может быть и пересылом часто сложнее, чем нажать CTRL+N в IDE и создать новый класс.

    bind() должна бы выглядеть примерно так в PHP (но ей здесь никто не будет пользоваться):

    /**
         * bind
         * копирует тело функции и присваивает аргументы на их места в переданном порядке
         * bind('is_array', [], 1, 2) -> Closure of (function is_array($var = []))
         *
         * @param null|object $newthis
         * @param callable    $func
         * @param mixed       ...$arguments
         *
         * @return \Closure
         */
        public function bind(?object $newthis, callable $func, ...$arguments) : \Closure
        {
            if (! is_string($func)) {
                $bind = $arguments;
    
            } else {
                // string
                $bind = [];
    
                $rf = new \ReflectionFunction($func);
    
                $requiredCnt = $rf->getNumberOfRequiredParameters();
    
                while ( $requiredCnt-- ) {
                    $bind[] = null !== key($arguments)
                        ? current($arguments)
                        : null;
    
                    next($arguments);
                }
    
                $func = \Closure::fromCallable($func);
            }
    
            if (null !== $newthis) {
                if (! $func instanceof \Closure) {
                    $func = \Closure::fromCallable($func); // throws exception if not possible
                }
    
                $func->bindTo($newthis); // throws exception if not possible
            }
    
            $result = static function (...$args) use ($func, $bind) {
                $bind = array_replace(
                    $bind,
                    array_slice($args, 0, count($bind))
                );
    
                return call_user_func_array($func, $bind);
            };
    
            return $result;
        }


    Почему она такая "странная"? Потому в php есть еще одна проблема. Созданные функции (не безымянные, вот только не помню - кажется только встроенные, свои - не такие строгие) требуют строгое число аргументов на своих местах. Если вы передадите больше или меньше - они ломаются и не работают. Рефлексия считывает "а скока надо" и передает ровно столько, на остальное забивает.

    ===

    В ООП для подобных вещей используют декорирование (decoration) (не путать с кАррирование (currying)). Вы пишете класс, который на вход ожидает обьект другого класса, чтобы нарастить его функционал, не влазя в детали.

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

    [send_telegram] // use result to call new function
    [send_email] // use result to call new function
    [push_event] // use result to call new function
    function register() {
      // do some
    }


    В среде разработчиков ООП этот процесс не нашел большого распространения (как бы Симфони не старался продвигать написание кода и валидаций в аттрибутах и аннотациях - это все равно чертова магия, которая требует высокого порога входа и даже специальной теории баз данных, которую не понимает никто кроме программистов - что создает барьер между бизнес-аналитиками, даже теми, кому выставляли порог входа - знание SQL, так и барьер между опытными разработчиками, которые привыкли прослеживать ход программы, а им пытаются навязать изучение какой-то штуки, которая читает приписки и делает что-то описанное черти-где).

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

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

    2) Функции работают с памятью несколько по особенному. То есть если не писать перед функцией слово `static`, что означает "не хранить внутри $this того места где её создали", можно получить интересную картинку если эту функцию вызовут в рекурсии. Оригинальный класс, который для неё $this, накопив данные и начав копировать эту функцию в момент того как вы пишете $a = function () {}, будет каждому экземпляру копировать данные этого объекта. И случайно в коде выполнив циклом 300 раз $a = function () {} вы 300 раз скопируете данные, которые возможно представляли собой "много текста" и ушатаете память.

    С функциями нужно быть осторожным. Чем реже, тем лучше. Но это не значит что они плохие. Так например прослушку постоянного процесса в скрипте, который никогда не завершится с возможностью подключать свои действия сильно проще написать на функциях-обработчиках. Хотя ООП рекомендовал бы использовать имена классов и фабрику их создающую, гарантируя что конфиг будет содержать текст а не объекты.

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