• Как из textarea извлечь текст по строкам?

    @Arik
    var array = textarea.innerHTML.split("\n");
    Ответ написан
    Комментировать
  • Имеет ли юридическую силу запрет на парсинг сайта?

    @nirvimel
    Любые дополнительные юридические ограничения (сверх того, что требует государственное законодательство) можно навязать пользователю лишь одним способом - путем ДОБРОВОЛЬНОГО (с обеих сторон) заключения договора. Это обычно реализуется в виде пользовательского соглашения при регистрации на сайте. При этом одна сторона (сайт) обязуется предоставить какие-то услуги (например, доступ к некоторой информации), в то время как другая сторона (пользователь) добровольно принимает на себя какие-то ограничения (например, не пользоваться никакими автоматизированными средствами для извлечения, предоставляемой ему, информации). Это соглашения вступает в юридическую силу с момента нажатия на кнопку "Принимаю условия" (см. акцепт).
    Поскольку с анонимом в принципе невозможно заключить никакой договор (очевидно), то на, не прошедшего регистрацию пользователя, невозможно возложить никакие ограничения (сверх существующих в законе).

    Но все вышеописанное касается только СПОСОБА, которым пользователь взаимодействует с сайтом (автоматизированный/ручной/ножной/и.т.д.). Что касается самого контента, который пользователь потребляет, то на него распространяется все нормы авторского права (независимо от способа, которым он получен). Поскольку авторское право (как государственный закон и международное соглашение) распространяется на всех без исключения (в том числе и на анонимов), то не требуется заключать с пользователем никакого договора (и заставлять проходить регистрацию). Достаточно упомянуть (желательно на видном местом) запрет на использование данного контента в любых целях, кроме личного ознакомления. Это допустимо на основании того, что владелец исключительных прав на контент может определять любые ограничения на его использование. Что это дает: контент, собранный автоматизированными средствами, в дальнейшем не может быть использован никак без нарушения закона о защите авторских прав (это серьезнее, чем нарушение пользовательского соглашения). Это полный юридический тупик для того, кто захочет заняться парсингом (пусть даже само по себе это будет законно).
    Ответ написан
    2 комментария
  • Чем отличается ассемблер от машинного кода?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    Ассемблер - это язык программирования. Машинный код - представление программы в виде байтов (битов, слов и т.п.), понятное процессору. Для перевода ассемблера в машинный код необходим компилятор. При этом одна команда ассемблера, как правило, компилируется в одну команду машинного кода, но может занимать несколько байтов в памяти. Конкретное представление зависит от процессора, для которого предназначена программа.
    Если электронные часы имеют микропроцессор и перезаписываемую память, то да, их можно перепрограммировать. Для этого понадобится соответствующее устройство - программатор. Потом надо прочитать и декомпилировать текущую прошивку, разобраться в коде, изменить его, скомпилировать и залить обратно.
    Если же в часах память с однократной записью или они вообще без микропроцессора, на обычной логике - то придётся взять в руки паяльник.
    Ответ написан
    2 комментария
  • Как отключить для сайта всплывающие ссылки в браузере?

    aliencash
    @aliencash
    Партизан
    Самый простой вариант - ссылки на js, типа
    <a onclick="location='http://site.com';">ссылка</a>
    .
    Только учтите что у этого подхода есть куча негативных эффектов.
    Ответ написан
    Комментировать
  • Как вести лог запросов на сервере и при этом не уронить сервер?

    @Fortop
    Tech/Team lead
    С уточнениями по результатам комментариев
    Логи. Именно логи пишите в syslog.

    А хранение и обработка истории операций это не логи. Это аналитика. Для этого существуют отдельные инструменты в зависимости от длительности истории. Для краткосрочной подойдут key-value БД типа Redis, которые будут накапливать информацию затем она будет агрегироваться и удаляться из них.

    Ну и проверьте, что все 200-300 rps вам реально нужны к базе, а не к кешу.

    Обычная практика показывает, что 1 млн пользователей в сутки создаёт нагрузку меньше 10 rps.
    И при этом позволяет содержать 3-5 серверов
    Ответ написан
    3 комментария
  • Как упростить такой код?

    Negwereth
    @Negwereth
    lvivcss.com.ua
    Мой ответ будет содержать две части - в первой я поясню как оптимизировать конкретно ваш код, а во второй покажу как такое надо делать правильно.

    Часть первая.

    Первым делом сохраним элемент, к которому вы обращаетесь больше всего, в отдельную переменную:

    $('.faq__question').click(function() {
      $(this).siblings('.faq__answer').slideToggle();
      const icon = $(this).find('.faq__icon');
      const iconSrc = icon.attr('src');
    
      if (iconSrc == 'imgs/dropdown/dropdown__women.png') {
        iconwomen = iconSrc;
        icon.attr('src', 'imgs/dropdown/dropdown__open.png');
      } else if(iconSrc == 'imgs/dropdown/dropdown__man.png') {
        iconman = iconSrc;
        icon.attr('src', 'imgs/dropdown/dropdown__open.png');
      } else if(iconSrc == 'imgs/dropdown/dropdown__manwomen.png') {
        iconmanwomen = iconSrc;
        icon.attr('src', 'imgs/dropdown/dropdown__open.png');
      } else {
        if (icon.attr('class') == 'faq__icon faq__icon--women') {
          icon.attr('src', iconwomen);
        } else if (icon.attr('class') == 'faq__icon faq__icon--man') {
          icon.attr('src', iconman);
        } else if (icon.attr('class') == 'faq__icon faq__icon--manwomen') {
          icon.attr('src', iconmanwomen);
        }
      }
    });


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

    var iconman, iconwomen, iconmanwomen;
    var icons = ['imgs/dropdown/dropdown__women.png', 'imgs/dropdown/dropdown__man.png', 'imgs/dropdown/dropdown__manwomen.png'];
    
    $('.faq__question').click(function() {
      $(this).siblings('.faq__answer').slideToggle();
      const icon = $(this).find('.faq__icon');
      const iconSrc = icon.attr('src');
    
      if (icons.includes(iconSrc)) {
        if (iconSrc == 'imgs/dropdown/dropdown__women.png') {
          iconwomen = iconSrc;
          icon.attr('src', 'imgs/dropdown/dropdown__open.png');
        } else if(iconSrc == 'imgs/dropdown/dropdown__man.png') {
          iconman = iconSrc;
          icon.attr('src', 'imgs/dropdown/dropdown__open.png');
        } else if(iconSrc == 'imgs/dropdown/dropdown__manwomen.png') {
          iconmanwomen = iconSrc;
          icon.attr('src', 'imgs/dropdown/dropdown__open.png');
        }
      } else {
        if (icon.attr('class') == 'faq__icon faq__icon--women') {
          icon.attr('src', iconwomen);
        } else if (icon.attr('class') == 'faq__icon faq__icon--man') {
          icon.attr('src', iconman);
        } else if (icon.attr('class') == 'faq__icon faq__icon--manwomen') {
          icon.attr('src', iconmanwomen);
        }
      }
    });

    Теперь можно вынести повторяемый код:

    var iconman, iconwomen, iconmanwomen;
    var icons = ['imgs/dropdown/dropdown__women.png', 'imgs/dropdown/dropdown__man.png', 'imgs/dropdown/dropdown__manwomen.png'];
    
    $('.faq__question').click(function() {
      $(this).siblings('.faq__answer').slideToggle();
      const icon = $(this).find('.faq__icon');
      const iconSrc = icon.attr('src');
    
      if (icons.includes(iconSrc)) {
        if (iconSrc == 'imgs/dropdown/dropdown__women.png') {
          iconwomen = iconSrc;
        } else if(iconSrc == 'imgs/dropdown/dropdown__man.png') {
          iconman = iconSrc;
        } else if(iconSrc == 'imgs/dropdown/dropdown__manwomen.png') {
          iconmanwomen = iconSrc;
        }
        icon.attr('src', 'imgs/dropdown/dropdown__open.png');
      } else {
        let iconOldSrc;
        if (icon.attr('class') == 'faq__icon faq__icon--women') {
          iconOldSrc = iconwomen;
        } else if (icon.attr('class') == 'faq__icon faq__icon--man') {
          iconOldSrc = iconman;
        } else if (icon.attr('class') == 'faq__icon faq__icon--manwomen') {
          iconOldSrc = iconmanwomen);
        }
        icon.attr('src', iconOldSrc);
      }
    });


    Теперь код стал чище и, за счёт работы с переменными, будет проще находить проблемы. Но всё-равно этот код неоптимален с точки зрения логики. Намного проще хранить состояние в самом объекте:

    $('.faq__question').click(function() {
      $(this).siblings('.faq__answer').slideToggle();
      const icon = $(this).find('.faq__icon');
      const iconSrc = icon.attr('src');
      const dataIconSrc = icon.attr('data-src');
    
      if (!dataIconSrc) {
        icon.attr('data-src', iconSrc);
        icon.attr('src', 'imgs/dropdown/dropdown__open.png');
      } else {
        icon.attr('src', dataIconSrc);
        icon.attr('data-src', null);
      }
    });


    Теперь если аттрибут `data-src` имеет значение, значит таб открыт.

    Часть вторая.

    А вообще такие задачи решаются с помощью CSS. Иконку лучше делать блоком с фоновым изображением:

    .icon.man {
      background-image: "imgs/dropdown/dropdown__man.png";
    }
    .icon.woman {
      background-image: "imgs/dropdown/dropdown__woman.png";
    }
    .icon.manwoman {
      background-image: "imgs/dropdown/dropdown__manwoman.png";
    }
    .icon.open {
      background-image: "imgs/dropdown/dropdown__open.png";
    }

    И тогда скрипт будет выглядеть как-то так (я подозреваю, я просто именно с jQuery не люблю работать):
    $('.faq__question').click(function() {
      $(this).siblings('.faq__answer').slideToggle();
    
      $(this).find('.faq__icon').toggleClass("open");
    });
    Ответ написан
    1 комментарий
  • Как сделать в консоли меняющююся строку?

    SerafimArts
    @SerafimArts
    Senior Notepad Reader
    \r
    Ответ написан
    Комментировать
  • PHP 5,2: почему временный файл не создается или создается без расширения?

    Stalker_RED
    @Stalker_RED
    Для умных: воспользоваться отладчиком, и посмотреть по шагам что происходит в вашем коде.

    Для усердных: добавить во все if'ы вывод echo с каким-то текстом, как-то так:
    if($_FILES['img']['error'] == 0){
                        echo "img error = 0\n";
                        echo "tmp path = {$_FILES['img']['tmp_name']}\n";
                        echo "new path = $full_path\n";
                        if(move_uploaded_file($_FILES['img']['tmp_name'], $full_path)){
    
                            $this->CertificatesNew->query("INSERT INTO certificates_new(title, img) VALUES ('$title', '$new_name');");
                        } else {
                          echo "move_uploaded_file error";
                        }
                    } else {
                        echo "img error = " . $_FILES['img']['error'];
                    }

    Может там прав на запись нет, или еще какая беда. Некоторым людям проще написать тучу строчек с этими echo чем запустить отладчик.

    И да, вам следовало бы предусмотреть что с клиента вам могуть прислать файл без расширения или с двойным расширением "котик.jpg.rar" а внутри файла при этом будет php код, например. И mime type могут подменить на что угодно.
    Хорошей практикой является проверка не по расширению а по самому файлу. Вызовом getimagesize() или exif_imagetype().
    Ответ написан
    Комментировать
  • Как изменять размер фото с помощью GET-запросов?

    search
    @search
    мама говорит что я особенный
    Стратегия такая: на сервере хранится только оригинальное изображение. Когда юзер пытается получить сжатое, он идет на адрес, например /images/userpic-100x100.jpg Если по этому адресу еще нет такого изображения, то сервер перенаправит юзера на скрипт /generate.php?address=/images/userpic-100x100.jpg. Этот скрипт сожмёт оригинальное изображение, сохранит его по адресу /images/userpic-100x100.jpg и покажет пользователю. В следующий раз при запросе адреса /images/userpic-100x100.jpg будет показано уже сгенерированное изображение.

    Для того чтоб сервер знал, куда перенаправлять юзера в случае, если сжатого изображения еще нет, нужно в файл .htaccess добавить этот код:

    RewriteCond %{REQUEST_URI} ^/images/
    RewriteCond %{DOCUMENT_ROOT}%{REQUEST_URI} !-f
    RewriteRule (.*) /generate.php?address=$1 [L]


    Ну и в файле generate.php уже разбирать переменную $_GET['address'], выяснять какую именно картинку хотел получить юзер, жать её, сохранять и перенаправлять обратно на $_GET['address'].
    Ответ написан
    Комментировать
  • Как должен быть обжат сетевой провод чтоб оба светодиода не проявляли активности, но передача данных шла?

    leahch
    @leahch
    3D специалист. Dолго, Dорого, Dерьмово.
    Диоды зажигает драйвер. А кабель должен быть обжат по стандарту.
    Драйвер карточки проверяет микросхему MII-трансмиттера, и по сигналу от нее (по прерыванию), зажигает соответствующую комбинацию диодов. Если диоды не горят, то просто нет линка.
    Есть микросхемы MII, в которых комбинация диодов выбрана по умолчанию, и лампочками особенно и управлять не нужно, достаточно активировать линк, остальное делает железка по умолчанию. Но можно и из драйвера помигать :-)
    Но в любом случае, лампочки никак с кабелем не связаны. И если вам кто-то говорит, что есть такая "волшебная" комбинация обжима, то он просто вас дурит!
    Ответ написан
    5 комментариев
  • Плохо ли создавать проекты с нуля? Что значит быть про?

    И вот никак не могу понять, зачем писать ООП классы для, например, изменения группы пользователя, когда это делается 1 строчкой?


    Пишутся не классы. Пишутся объекты. И объект пишется не под изменение какого-либо свойства. Объект описывает пользователя всевозможными свойствами и методами. И в эту обёртку помещается метод изменения группы конкретного пользователя.


    //Типо ООП
    $user->delete;
    //Типо функция процедурная
    delete($user);
    //Один хрен же, нет?


    Так то оно один хрен, да только не один. Абстрактный пример.
    У вас, кроме $user, есть еще $group, $catalogue, $order и еще с десяток объектов, с которые вам нужно будет работать. Теперь представим, что вам нужно будет удалить объекты. В ооп стиле вам нужно будет просто вызвать метод ->delete для каждого объекта. А в процедурном вы будете писать 10 функций delete с разными названиями? Или одна, но внутри вы будете писать 10 проверок, что бы понять, какие данные к вам пришли и как их правильно обработать. А если таких объектов будет 100?

    В ооп есть свои + и -. И ни в коем случае ООП не является панацеей ото всех бед. Где-то процедурный стиль выиграет, где-то ооп. Как мне кажется, профессионал обязан понимать, когда и зачем использовать ту или иную технику или инструмент.

    UPD
    нужно проводить тесты над кодом

    И вы, вероятно, путаете понятия "тестировщик" и TDD
    Ответ написан
    7 комментариев
  • Как изучать алгоритмы?

    leahch
    @leahch
    3D специалист. Dолго, Dорого, Dерьмово.
    Рекомендую купить 4-х томник (уже) "Исскуство программирования" Дональда Кнута, как раз про алгоритмы. Рекомендую на полном серьезе, как прочитанное лично!
    Также, этого же автора "Конкретная математика", но ее еще не прочитал, лежит, ждет.
    Увы, явой там и не пахнет. Но потом, когда разберетесь, что ява, что не ява, все едино :-)
    Ответ написан
    7 комментариев
  • Как решить проблему с концентрацией?

    search
    @search
    мама говорит что я особенный
    sim3x уже сказал об этом, но я повторю - медитация. Способность фокусироваться - это как мышца. Её тоже можно качать. Медитация как раз качает мышцу, отвечающую за концентрацию. 10 минут утром и 10 минут вечером. Как и с любой здоровой привычкой, ощутимый результат настаёт настолько постепенно, что для вас он будет почти незаметным. Но в один прекрасный день (недели через две ежедневных тренировок) вы отметите что концентрироваться и контролировать своим мысли/эмоции стало легче.
    Ответ написан
  • Как решить проблему с концентрацией?

    saboteur_kiev
    @saboteur_kiev Куратор тега Организация работы
    software engineer
    Мозг работает так, как он привык работать.

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

    Нарабатывать умение концентрироваться на неприятных и неинтересных вещах делается таким же способом - стараетесь через силу регулярно это делать. Через несколько лет мозг привыкнет к новому поведению.
    Можно это назвать силой воли - умение осознанно приспособиться к некомфортным условиям.

    P.S. С детства такие вещи тренируются. Чем взрослее тем сложнее, и даже факт того что ты осознаешь конкретный недостаток не облегчает того, что избавиться от него тяжело.
    Ответ написан
    2 комментария
  • Как решить проблему с концентрацией?

    opium
    @opium
    Просто люблю качественно работать
    откажитесь от интернета
    купите кнопочный телефон за 300 рублей
    Ответ написан
    17 комментариев
  • Тупиковое и медленное развитие, лекарство?

    @Levhav
    Возьмусь за разработку проектов любой сложности.
    Можно наверное свою нишу поискать. Например я не могу на скорость решать олимпиадные задачи. Не разу не занимал на олимпиадах по программированию нормальные места. Так как там всё надо на скорость. Но это не мешает делать крупные проекты где есть время продумать архитектуру, написать код который будет можно без большого труда расширять и дополнять.
    Ведь одно не правильное архетектурное решение может усложнить проект в разы. Просто поищите свои сильные стороны и вероятно это не будет написание говнокода на скорость.
    Ответ написан
    Комментировать
  • Насколько легко трудоустроиться программисту в 40+, 50+ итд лет?

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

    maximw
    @maximw
    Ответ написан
    Комментировать
  • Как правильно в PHP принять форму на одном сервере, а файл из неё передать на другой?

    sergiks
    @sergiks Куратор тега PHP
    ♬♬
    Вариант I. Смонтировать по NFS папку с сервера B на сервере A.

    Вариант II. Средством PHP сразу слать принятый файл на сервер B – это чуть удлинит время обработки принятой формы, но зато самое простое решение. Используйте cURL и CURLFile:
    $ch = curl_init();
    curl_setopt_array( $ch, [
      CURLOPT_POST => true,
      CURLOPT_RETURNTRANSFER => true,
      CURLOPT_POSTFIELDS => [
    	  "file" => new CURLFile("/tmp/" . $tmpFileName) // путь к принятому файлу
      ],
      CURLOPT_URL => "http://server-B.domain.com"
    ]);
    
    curl_exec( $ch); // выполнить запрос

    Опции cURL см. подробнее – может, вам понадобится отключать проверку SSL сертификата, увеличить таймайут и т.п.
    Ответ написан
    3 комментария
  • Как показать отсчет таймера одинаковым для всех?

    sergiks
    @sergiks Куратор тега PHP
    ♬♬
    Нужно, чтобы клиент максимально точно «знал», сколько сейчас времени на сервере. Для этого можно несколько раз послать запрос на сервер, и предположить, что время ответа сервера лежит точно посередине между отправкой запроса и получением ответа. Примерно так работает NTP – протокол сетевого времени.

    Второе предположение, что ход собственных часов точен: 1 секунда на клиенте и на сервере точно равны.

    На сервере разместить простейший скрипт, который возвращает время с миллисекундами до События:
    // getTimeTill.php
    $deadline = strtotime("2017-07-01 03:00:00");
    echo round( 1000 * $deadline - 1000 * microtime(true)); // в миллисекундах

    На клиенте в JS надо засечь время, выполнить ajax запрос, получить ответ, и считать, что полученное число микросекунд оставалось до события половину разницы назад:
    var start = (new Date).getTime();
    $.get("getTimeTill.php", function( ms ){
      var bias = Math.round(((new Date).getTime() - start) / 2);
      var remains = ms + bias; // сколько остаётся микросекунд до события на данный момент
      var deadline = (new Date).getTime() + remains; // локальное время События
      // можно запускать таймер, который раз в 200 ms будет обновлять время до События
      var el = document.getElementById("timer");
      window.setInterval( function(){
        var remains = Math.floor((deadline - (new Date).getTime())/1000);
        var H = Math.floor( remains / 3600);
        remains -= 3600 * H;
        H = ( '0' + H ).substr(-2);
        var M = Math.floor( remains / 60);
        remains -= 60 * M;
        M = ( '0' + M ).substr(-2);
        var S = ( '0' + remains ).substr(-2);
        timer.innerText = "" + H + ":" + M + ":" + S;
      }, 200);
    });

    Такие запросы можно выполнять неоднократно, каждый раз уточняя таймер отсчёта на клиенте.
    Ответ написан
    1 комментарий