• Хороший обфускатор js. Есть такие?

    @SanSYS
    jsfuck.com - самый лучший обфускатор, он позволил на ebay скрипт внедрить )
    Ответ написан
    Комментировать
  • Как создать таблицу с двумя колонками обязательно разного значения?

    @immelnikoff
    Изучаю БД
    Начиная с версии MySQL 8.0.16 (ссылка):
    CREATE TABLE t1
    (
      column_id  INT,
      other_column_id INT,
      CONSTRAINT qwe CHECK (column_id <> other_column_id)
    );
    Ответ написан
    1 комментарий
  • Как решить момент с хлебными крошками и категорией?

    wppanda5
    @wppanda5 Куратор тега WordPress
    WordPress Mедведь
    Тут не для Скайпа, соберитесь с мыслями и объясните письменно
    Ответ написан
    4 комментария
  • Задача для собеседования?

    samodum
    @samodum
    Какой вопрос - такой и ответ
    Это уровень от миддла и выше.
    И вообще, это слишком затратное по времени задание. Поэтому, если и делать, то только за деньги
    Ответ написан
    Комментировать
  • Зачем столько асинхронных инструментов в JavaScript?

    Xuxicheta
    @Xuxicheta
    инженер
    промисы и async это одно и тоже.
    И все это лишь сахар для коллбэков разной степени удобности. И вы еще евенты не упомянули. А так же цикл событий, таски/микротаски, квази-асинхронность.

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

    И этого еще не хватает, неплохо было бы иметь поддержку Observable на уровне языка, многие браузерные api стали бы удобнее.
    Ответ написан
    2 комментария
  • Почему не работает whereHas relation Laravel?

    JhaoDa
    @JhaoDa
    LaravelRUS Team
    Смотрим на огромную плашку с восклицательным знаком.
    Ответ написан
    Комментировать
  • Может ли парсер обойти капчу?

    CellycoMobiles
    @CellycoMobiles
    indi developer @CellycoMobiles
    Да может. Заказываю здесь
    Ответ написан
    1 комментарий
  • Почему выходит ошибка в Search?

    0xD34F
    @0xD34F Куратор тега JavaScript
    Метод search использует для поиска регулярные выражения, и если аргумент таковым не является, он будет в регулярку преобразован. Круглые скобки в регулярных выражениях являются спецсимволами, так что если хотите, чтобы скобка была просто скобкой, её надо экранировать. Поставьте перед ней два обратных слэша: .search('\\('). Или один, если замените строку на литерал регулярного выражения: .search(/\(/).
    Ответ написан
    3 комментария
  • Где кроется ошибка в коде php?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    Пустая строка равна false при нестрогом сравнении.
    Ответ написан
    Комментировать
  • DigitalOcean потерял мои даные, как компенсировать потери?

    SpacePurr
    @SpacePurr
    c#, wpf
    Обычно, предлагают сразу все возможные компенсации. В любых других случаях, плохо не будет, если вы вежливо напишите в поддержку свою просьбу.
    Ответ написан
    3 комментария
  • Что делаю не так в настройке вэб сервера?

    ThunderCat
    @ThunderCat
    {PHP, MySql, HTML, JS, CSS} developer
    example.com реальный интернет домен, имеющий свой сайт, на который вы и попадаете. Если хотите настроить переход на свой внутренний сайт у вас на машине в ответ на example.com, надо настроить хостс, прописав адрес и соответствующий ip (127.0.0.1)
    Ответ написан
  • Ошибка 504, но скрипт выполнился. Что это может быть?

    PavelMonro
    @PavelMonro
    Это может быть 504 Gateway Timeout.
    Увеличьте таймуты на выполнение скрипта на хостинге.
    fastcgi_send_timeout 300;
    fastcgi_read_timeout 300;
    Ответ написан
    Комментировать
  • Как сделать фильтрацию по нескольким значениям в VueJS?

    0xD34F
    @0xD34F Куратор тега Vue.js
    Сложно это всё. Четыре селекта - очень похожие, четыре вычисляемых свойства - очень похожие. Многовато копипасты. Надо упростить.

    Первым делом внимательно посмотрим на все эти похожие куски кода, найдём, где они отличаются, и на основе этих отличий сделаем описание фильтров:

    filters: [
      { name: 'calculator.brand_filter', getter: obj => obj.brand.name, value: '' },
      { name: 'calculator.company_filter', getter: obj => obj.company.name, value: '' },
      { name: 'calculator.country_filter', getter: obj => obj.brand.country, value: '' },
      { name: 'calculator.side_filter', getter: obj => obj.sides, value: '' },
    ],

    Затем сделаем собственно фильтрацию, пропустим данные через массив фильтров (если значение фильтра выставлено - производится фильтрация, нет - оставляем данные как есть):

    computed: {
      filteredProfiles() {
        return this.filters.reduce((profiles, { value, getter }) => {
          return value
            ? profiles.filter(n => getter(n) === value)
            : profiles;
        }, this.profiles);
      },

    Далее, надо дать пользователю возможность задавать значения фильтров. Сделаем компонент фильтра:

    Vue.component('filter-select', {
      props: [ 'name', 'options', 'value' ],
      template: `
    <div>
      <p>{{ name }}<p>
      <select :value="value" @change="$emit('input', $event.target.value)">
        <option value="">-</option>
        <option v-for="n in options">{{ n }}</option>
      </select>
    </div>`
    });

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

    computed: {
      filterOptions() {
        return this.filters.map(n => [...new Set(this.profiles.map(n.getter))]);
      },

    Наконец, создадим сами фильтры:

    <filter-select
      v-for="(n, i) in filters"
      v-model="n.value"
      :options="filterOptions[i]"
      :name="trans(n.name)"
    ></filter-select>

    Также не будем забывать про обнуление значений фильтров. Так что вот метод сброса фильтров и кнопка, по клику на которую он будет вызываться:

    methods: {
      resetFilters() {
        this.filters.forEach(n => n.value = '');
      },

    <button @click="resetFilters">{{ trans('calculator.reset_filter') }}</button>

    Демо можно посмотреть здесь (да, тут меньше фильтров, чем у вас - ну так вы свои данные не показали, а у меня воображения на большее не хватило).
    Ответ написан
    1 комментарий
  • Как удалить повторяющиеся объекты в VueJS?

    0xD34F
    @0xD34F Куратор тега Vue.js
    Сделайте вычисляемое свойство:

    computed: {
      brands() {
        return [...new Set(this.profiles.map(n => n.brand.name))];
      },
    },

    <option v-for="brand in brands" :value="brand">{{ brand }}</option>
    Ответ написан
    1 комментарий
  • Какой ноутбук выбрать? На Ubuntu Linux или OS X?

    Я сам linux-админ, и пользуюсь Ubuntu с 2007 года. Но пару недель назад перешел на MacOS. Могу сразу сказать - сам макбук, его приятно держать в руках, на коленях, он даже приятнее на ощупь. Получаешь некоторое удовольствие от пользования такой вещью, и при этом она не отвлекает. Все пластиковые ноуты кажутся какой-то доской по сравнению с макбуком. Операционка приятная в поведении, но к ней я привыкал дня 4. Это то, что касается GUI.

    Консоль в макоси я не кастомизировал, только поставил fish и brew, но мне в ней не хватает многого, стандартных утилит GNU Coreutils, я понимаю, это все можно поставить, настроить, кастомизировать, но первое впечатление от работы с консолью - неприятные.

    Вообще конечно, обе руки "за" макбук, и выбирать нечего.
    Ответ написан
    Комментировать
  • Как установить PHP 5.4 на Nginx в Ubuntu Server 16.04?

    Если кратко, то можно так собрать:

    Установка php-5.4.45 + fpm

    mkdir -p /opt/php-5.4.45
    rm -rf /usr/local/src/php5-build && mkdir /usr/local/src/php5-build
    cd /usr/local/src/php5-build
    wget de2.php.net/distributions/php-5.4.45.tar.gz
    tar -vzxf php-5.4.45.tar.gz && cd php-5.4.45
    ./configure --prefix=/opt/php-5.4.45 --with-pdo-pgsql --with-zlib-dir --with-freetype-dir --enable-mbstring --with-libxml-dir=/usr --enable-soap --enable-calendar --with-curl --with-mcrypt --with-zlib --with-gd --with-pgsql --disable-rpath --enable-inline-optimization --with-bz2 --with-zlib --enable-sockets --enable-sysvsem --enable-sysvshm --enable-pcntl --enable-mbregex --enable-exif --enable-bcmath --enable-zip --with-pcre-regex --with-mysqli --with-mysql --with-pdo-mysql --with-mysqli --with-jpeg-dir=/usr --with-png-dir=/usr --enable-gd-native-ttf --with-openssl --with-fpm-user=www-data --with-fpm-group=www-data --with-libdir=/lib/x86_64-linux-gnu --enable-ftp --with-imap --with-imap-ssl --with-kerberos --with-gettext --with-xmlrpc --with-xsl --enable-fpm
    make && make install
    cp /usr/local/src/php5-build/php-5.4.45/php.ini-production /opt/php-5.4.45/lib/php.ini
    cp /opt/php-5.4.45/etc/php-fpm.conf.default /opt/php-5.4.45/etc/php-fpm.conf
    mkdir /opt/php-5.4.45/etc/php-fpm.d

    Редактируем некоторые параметры в /opt/php-5.4.45/etc/php-fpm.conf

    include=etc/php-fpm.d/*.conf
    [global]
    pid = run/php-fpm.pid
    log_level = error

    Меняем настройки в /opt/php-5.4.45/lib/php.ini по своему вкусу, у меня так:

    date.timezone = "Asia/Yekaterinburg"
    expose_php = Off
    short_open_tag = On
    max_execution_time = 600
    max_input_time = 300
    max_input_vars = 5000
    memory_limit = 512M
    error_reporting = E_ALL & ~E_DEPRECATED & ~E_STRICT & ~E_NOTICE
    post_max_size = 128M
    ;default_charset = "UTF-8"
    upload_max_filesize = 128M
    default_socket_timeout = 120
    mysql.connect_timeout = 120

    Если в Linux используется sysv, то создаем файл /etc/init.d/php-5.4.45-fpm, см. https://gist.github.com/CHERTS/bcf1006e90777ead77c...

    Назначаем права и автостарт
    # chmod 755 /etc/init.d/php-5.4.45-fpm
    # insserv -v /etc/init.d/php-5.4.45-fpm
    Запускаем:
    # /etc/init.d/php-5.4.45-fpm start

    Если в Linux используется systemd, то создаем файл
    /lib/systemd/system/php-5.4.45-fpm.service
    исходник https://gist.github.com/CHERTS/bcf1006e90777ead77c...

    Если в Linux используется systemd выполняем:
    # chown root:root /lib/systemd/system/php-5.4.45-fpm.service
    # systemctl daemon-reload
    # systemctl enable php-5.4.45-fpm.service
    # systemctl start php-5.4.45-fpm.service

    Проверить статус можно командой
    # systemctl status php-5.4.45-fpm.service

    Удалить
    # systemctl stop php-5.4.45-fpm.service
    # systemctl disable php-5.4.45-fpm.service
    # systemctl daemon-reload
    # systemctl reset-failed
    # rm /lib/systemd/system/php-5.4.45-fpm.service
    # systemctl daemon-reload

    Далее в каталоге /opt/php-5.4.45/etc/php-fpm.d/ создаем файл пула php-fpm с именем к примеру mysite.conf
    Содержание mysite.conf например такое (mysiteuser и mysitegroup - это имена системного пользователя и группу от имени которых будет работать данный пулл, в php_admin_value[open_basedir] указывается путь до корневого каталога сайта, на этот каталог у mysiteuser и mysitegroup должны быть полные права):

    [mysite]
    listen = /var/lib/php5-fpm/mysite.sock
    listen.owner = mysiteuser
    listen.group = mysitegroup
    listen.mode = 0660
    user = mysiteuser
    group = mysitegroup
    pm = dynamic
    pm.max_children = 8
    pm.start_servers = 2
    pm.min_spare_servers = 1
    pm.max_spare_servers = 5
    pm.max_requests = 500
    chdir = /
    php_admin_value[open_basedir] = /var/www/mysite/web:/usr/share/php5:/usr/share/php:/tmp:/usr/share/phpmyadmin:/etc/phpmyadmin:/var/lib/phpmyadmin
    php_admin_value[session.save_path] = /var/www/mysite/tmp
    php_admin_value[upload_tmp_dir] = /var/www/mysite/tmp

    После рестартуем
    systemctl status php-5.4.45-fpm.service
    или
    /etc/init.d/php-5.4.45-fpm restart

    В настройках nginx в качестве сокета php-fpm указываем /var/lib/php5-fpm/mysite.sock

    Вот как то так.
    Ответ написан
    Комментировать
  • На каком языке программирования чаще всего пишется метапоиск?

    @matios
    Technical Team Lead
    Купался я в этой нише.

    1, 2. Поиск можно делать и на PHP
    3. Базы можно и SQL. PostgreSQL вполне потянет такое. В зависимости от функционала может понадобиться MemCached, Redis
    4. Мало сайтов с вакансиями?) тот же hh, например. Использоваться можно тот же GIT или SVN. Кому что удобнее
    5. Не только наверняка, а 100% придется. Уровень крутости специалиста определяется поставленными вами задачами.

    Вы учитывайте еще то, что если вы собираете выводить услуги партнеров, то вам их надо парсить. И вы же не будете их парсить при каждом запросе пользователя, а это значит, что вам надо сохранять эти данные где-то у себя. На примере 6-10 не скажу, но на примере >200 скажу точно, что там огромное кол-во слоев кеширования должно быть, по куче параметров. Парсер в этом случае может выступать вообще как отдельный проект. Плюс динамические фильтры с зависимыми параметрами и т.д.

    Потянете конкуренцию со стороны TourIndex? :)))
    Ответ написан
    6 комментариев
  • На каком языке программирования чаще всего пишется метапоиск?

    eastywest
    @eastywest
    Backend developer
    1. В Aviasales метапоиск переписали на Python/Tornado Отказоустойчивость на примере aviasales
    В случае метапоиска я бы смотрел на инструменты с хорошей поддержкой concurrency, например golang.
    2. Конечно можно, просто выделяете метапоиск в отдельный сервис.
    3. Реляционные базы данных вполне подойдут.
    4. Там используется git.
    5. Сервера возьмите на digitalocean.com или его аналогах - vscale.io, flops.ru
    Ответ написан
    Комментировать