• Как правильно спарсить div получая значение из него?

    @DarkByte2015
    Начать с того что перестать использовать регулярки по возможности вообще везде, ну или хотя бы для парсинга. И юзать нормальные библиотеки. К тому же есть масса API отдающих курсы валют в json или xml что куда удобнее...
    Ответ написан
    Комментировать
  • Как включить звук, или музыка в javascript?

    Stalker_RED
    @Stalker_RED
    Добавляете на страницу элемент <audio>
    <audio src="..." id="player"></audio>

    При клике по кнопке делаете ему play
    <button onclick="player.play()">кнопка</button>
    https://jsfiddle.net/obpp67va/

    Пример посложнее: https://jsfiddle.net/dnsL0nxt/1
    С регулятором громкости: https://jsfiddle.net/dnsL0nxt/4/
    Ответ написан
    1 комментарий
  • Попросили проверить код, на что смотреть нужно?

    index0h
    @index0h
    PHP, Golang. https://github.com/index0h
    Смотря зачем)). Я когда делаю Code Review критерии следующие:

    * Безопасность:
    - Каждый аргумент метода простого типа должен проверяться на тип в случае его проксирования и на граничные значения в случае обработки. Чуть что не так - бросается исключение. Если метод с кучкой аргументов на 80% состоит из поверки из аргументов - это вполне норм))
    - Никаких trigger_error, только исключения.
    - Исключения ДОЛЖНЫ быть человеко-понятны, всякие "Something went wrong" можно отдавать пользователю, но в лог должно попасть исключение со стектрейсом и человеко-понятным описанием, что же там пошло не так.
    - Каждый аргумент (объект) метода должен быть с тайпхинтингом на этот его класс, или интерфейс.
    - За eval как правило шлю на **й.
    - @ допускается только в безвыходных ситуациях, например проверка json_last_error.
    - Перед работой с БД - обязательная проверка данных.
    - Никаких == и !=. Со swtich - единственное исключение, по ситуации.
    - Если метод возвращает не только bool, а еще что-то - жесткая проверка с ===, или !== обязательна.
    - Никаких условий с присваиваниями внутри. while($row = ...) - тоже идет лесом.
    - Магические геттеры/сеттеры разрешаются только в безвыходных ситуациях, в остальном - запрещены.
    - Конкатенации в sql - только в безвыходных ситуациях.
    - Параметры в sql - ТОЛЬКО через плейсхолдеры.
    - Никаких глобальных переменных.
    - Даты в виде строки разрешаются только в шаблонах и в БД, в пхп коде сразу преобразуется в \DateTimeImmutable (в безвыходных ситуациях разрешено \DateTime)
    - Конечно зависит от проекта, но как приавло должно быть всего две точки входа: index.php для web и console(или как-то по другому назваться) - для консоли.

    * Кодстайл PSR-2 + PSR-5 как минимум, + еще куча более жестких требований (для начала все то что в PSR помечено как SHOULD - становится MUST)
    - В PhpStorm ни одна строчка не должна подсвечиваться (исключением является typo ошибки, например словарик не знает какой-то из аббревиатур, принятых в вашем проекте). При этом разрешается использовать /** @noinspection *** */ для безвыходных ситуаций.
    - Если кто-то говорит, что пишет в другом редакторе и у него не подсвечивается, на эти отговорки кладется ВОТ ТАКЕЕЕНЫЙ мужской половой **й и отправляется на доработку)).

    * Организация кода:
    - Никаких глобальных функций.
    - Классы без неймспейса разрешаются только в исключительно безвыходных ситуациях.

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

    * Принципы MVC:
    - Никаких обработок пользовательского ввода в моделях, от слова совсем.
    - Никаких ***ть запросов в БД из шаблонов.
    - Никаких верстки/js/css/sql-ин в контроллерах.
    - В моделях НИКАКОЙ МАГИИ, только приватные свойства + геттеры с сеттерами.
    - В моделях разрешено использовать метод save(при наличии такого разумеется) только в исключительных ситуациях. Во всех остальных - либо insert, либо update.

    * Принципы SOLD:
    - Никаких божественных объектов умеющих во все.
    - Если метод для внутреннего пользования - private, никаких public.
    - Статические методы разрешаются только в случае безвыходности.

    * Принцип DRY разрешено нарушать в случаях:
    - Явного разделения обязанностей
    - В тестах (каждый тест должен быть независимым, на сколько это возможно)

    * Работа с БД:
    - Запрос в цикле должен быть РЕАЛЬНО обоснован.
    - За ORDER BY RAND() - шлю на***й.
    - Поиск не по ключам (конечно если таблица НЕ на 5 строк) запрещен.
    - Поиск без LIMIT (опять же если таблица НЕ на 5 строк) запрещен.
    - SELECT * - запрещен.
    - Денормализация БД должна быть обоснована.
    - MyISAM не используется (так уж)) )
    - Множественные операции обязательно в транзакции, с откатом если чо пошло не так.
    - БД не должна содержать бизнес логики, только данные в целостном виде.
    - Не должно быть нецелесообразного дерганья БД там, где без этого можно обойтись.

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

    * О людях:
    - "Я привык писать так и буду дальше" - не вопрос, ревью пройдешь только когда поменяешь свое мнение.
    - "Я пишу в vim-е и мне так удобно" - здорово, код консолью я тоже в нем пишу)) но есть требования к коду, если в них не сможешь - не пройдешь ревью.
    - "Я скопировал этот страшный метод и поменял 2 строчки" - это конечно замечательно, но по блейму автор всего этого метода ты, так что давай без говняшек, хорошо?
    - "Оно же работает!" - вот эта фраза переводится примерно так: "да, я понимаю, что пишу полную хрень, но не могу писать нормально потому, что руки из жо", я правильно тебя понял?))
    - "У меня все работает!" - рад за тебя, а как на счет продакшна?
    - "Там все просто" - не используй слово "просто", от слова "совсем". Вот тебе кусок кода (первого попавшегося с сложной бизнес логикой), где там ошибка (не важно есть она, или нет)? Ты смотришь его уже 2 минуты, в чем проблема, там же все "просто"))

    * Всякое:
    ActiveRecord (это я вам как в прошлом фанат Yii говорю) - полное говно, примите за исходную. По факту у вас бесконтрольно по проекту гуляют модельки с подключением к БД. Не раз натыкался на то, что в тех же шаблонах вызывают save, или update (за такое надо сжигать).
    То, что используется Laravel - это печально((. Что бы выполнить требования приведенные выше, приходится "воевать" с фреймворком.

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

    UPD

    Формализировал данные критерии по ссылочке: https://github.com/index0h/php-conventions
    Ответ написан
    55 комментариев
  • Есть ли инструмент для анализа кода на совместимость с PHP7?

    Eugene_Sh
    @Eugene_Sh
    1) https://github.com/sstalle/php7cc - инструмент для проверки PHP-кода версий 5.3-5.6 на совместимость с PHP 7. Генерирует отчеты с краткой информацией о проблемных местах.
    2) https://github.com/Alexia/php7mar - альтернативный инструмент с тем же предназначением.
    Ответ написан
    1 комментарий
  • Как найти монитор без ШИМ-мерцания подсветки?

    ValdikSS
    @ValdikSS
    На заметку, если кому интересно: на ноутбуках можно регулировать частоту ШИМ программными средствами. Для интела это, например, IntelPWMControl
    Ответ написан
    1 комментарий
  • Что можете посоветовать для написания своего движка на PHP?

    dmitriylanets
    @dmitriylanets
    веб-разработчик
    Смотря какая цель создания движка
    Ответ написан
    Комментировать
  • Какой дистрибутив Linux выбрать для офисных задач?

    @NortH21
    linux mint +1
    Ответ написан
    Комментировать
  • Что сделать для безопасности в linux на домашней машине?

    @fpir
    Однажды к мастеру учения пришёл неофит и сказал:
    Учитель, меня терзают сомнения. Когда я исповедовал путь Windows, у меня были и антивирусы, и брандмаузеры, и чистильщики реестра, и другие утилиты, которые меня защищали. Сейчас-же, я чувствую себя беззащитным перед опасностями интернета.
    Тогда учитель связал ему шнурки и велел-Беги!
    Что-же это значит, Учитель?
    Когда дом изначально хорошо спроектирован, нет смысла в дополнительных подпорках.
    И тогда неофит познал дзен.
    Ответ написан
    Комментировать
  • Что сделать для безопасности в linux на домашней машине?

    @zhum
    программист, администртор
    • chkrootkit+rkhunter = и не надо никаких касперских.
    • Добавить в списки репозиториев обновления безопасности, регулярно накатывать обновления (обычно в графическом режиме она сама предлагает), при выходе новых версий ОС обновляться (лучше всего через месяцок после релиза). В отличие от RH-подобных, тут версию обновить можно на ходу, даже без перезагрузки (потом как-нибудь хорошо бы перегрузиться, чтобы новое ядро заработало).
    • Для перестраховки - если есть какие-то сервисы типа почты (на приём), ssh, vnc и т.п., то запретить вход по ssh по паролю (только ключ), поставить fail2ban.
    • Можно ещё logwatch/logcheck, чтобы в логи смотреть проще (они сами обо всём нестандартном/подозрительном расскажут). SELinux/apparmor - по желанию, ибо если настроить раз, то потом на каждый системный чих надо отключать/править, что может подзадолбать.
    Ответ написан
    3 комментария
  • Я не знаю как это называется, анимированый background движется за курсором?

    mannaro
    @mannaro Куратор тега JavaScript
    Умею профессионально гуглить
    Это называется херня, которая раздражает 50% пользователей =)
    Но если таки надо, то parallax.
    Ответ написан
    6 комментариев
  • Удобная php библиотека/класс для работы с файлами?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    • getAllFiles() - glob()
    • readFile() - file_get_contents()
    • updateFile() - ты, боюсь, сам не понимаешь, что должна эта функция делать, но в любом случае fopen()/fwrite()
    • writeFile() - file_put_contents();
    • deleteFile() - unlink()

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

    Spetros
    @Spetros
    IT-шник
    Нормальный компьютер для XP и 7-ки 32-битной.
    Интернет тормозит, потому что памяти для обработки современных страничек у него уже маловато. Можно часть плагинов и красивостей в браузере отключить и меньше страниц одновременно открывать. Замена ОС ситуацию не изменит.
    Ответ написан
    Комментировать
  • PHP-инъекции в прошлом?

    @inkvizitor68sl
    Linux-сисадмин с 8 летним стажем.
    В php 5.4 убрали дырень, из-за которой возникало большинство инъекций (www.php.net/manual/ru/security.globals.php). Так что их постепенно становится меньше (по мере обновления php по миру).
    Но так как разработчики писать лучше не стали - исчезнуть они не исчезнут.
    Ответ написан
    Комментировать
  • PHP-инъекции в прошлом?

    @ikeagold
    PHP-инъекция становится возможной, если входные параметры принимаются и используются без проверки.
    Источник То есть, они есть, были и будут пока есть те кто не защищает входные параметры/данные/и т.д.
    Сейчас все нацелены на XSS, даже гугл готов платить 7500$ за уязвимость.
    Вот и мини игра - https://xss-game.appspot.com/
    Недавний пост на habr о XSS habrahabr.ru/post/224773
    Ответ написан
    Комментировать
  • Какой выбрать дистрибутив линукса "чтоб ездить", а не курить форумы и "допиливать"?

    @inkvizitor68sl
    Linux-сисадмин с 8 летним стажем.
    > экран по win-L лочится через раз, кликаешь на другое окно, ура - залочилось
    Потому что раскладка в другом окне английская. А по русской не лочится, ога. Второй хоткей навесь.

    > намертво и неожиданно виснет, иногда позволяя в течение нескольких секунд поводить липнущим курсором мыши, замена видюшных драйверов не помогла
    Дай ка угадаю - intel hd sandy bridge?

    > прописываем команду в автозапуск, но почему-то она не запускается
    Жму на газ а машина не едет. (то ли не завел, то ли заправить забыл, то ли машины нет, то ли жму на тормоз). Где у вас там автостарт-то? Правильный - /etc/rc.local, еси чо. И там $PATH отличается от того, который у вас в .bashrc прописан. Ну это не говоря о том, что можно написать правильный init-скрипт.

    > тачпадный курсор мыши скачет по экрану как ненормальный
    Чувствительность на скорость движения и длительность касания не снизил? Или помыть забыл?

    > поднять VNC- сервер - проблема, а клиент так и не научился просовывать русские буковки через клипбоард и отваливается каждые пять минут
    apt-get install vino remmina
    Дальше гуетыканием всё заводится.
    Впрочем, если vnc сервер нужен независимый от запущенных иксов (винда и макось без иксов аще так не умеют) - то да, придется написать скрипт в 10 строчек, 1 из которых шабанг, а 7 - запуск нужных приложений.

    > Mint не hibernate-ит систему если батарея пуста, при том даже не пищит: проморгал - грузись с нуля
    всё больше и больше убеждаюсь в том, что у вас толи sandy bridge, то ли ivy bridge

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

    > SL минут пять свопится после пробуждения, после firefox приходится прибивать и запускать заново, скайп на него так и не встал, курение форумов не помогло
    яннп

    Но да, в целом вы правы - проблем в пингвинах полно и сравнение с жигулями правильное. Правда, я бы сравнивал с Subaru impreza wrx или мустангами, которые ездит как говно с завода, но если в них покопаться - то потом на других машинах ездить не станешь.
    Что, впрочем, не отменяет того, что все ваши "проблемы" навскидку решаются примерно за одну минуту, кроме аппаратных проблем с неудачной серией бриджей у Intel, для которых они года два как не могут написать нормальные драйвера под acpi/видео.

    На какие-то странные форумы ходите, господа. В IRC мы в своё время такие проблемы сотнями за день щелкали.
    Ну а самым подходящим дистрибутивом для вас должен стать Ubuntu 12.04 без мерзкого Unity, с православным Gnome Classic + compiz режиме.
    Ответ написан
    7 комментариев
  • На что перейти с Win XP в связи с окончанием поддержки?

    tsarevfs
    @tsarevfs
    C++ developer
    Со скайпом проблем на linux последнее время не было. Ставьте Mint.
    *похожа на XP несколько больше чем Ubuntu
    *поставляется с большим набором предустановленного софта(почти ничего не надо устанавливать)
    *совместима с Ubuntu (99% программ будут работать так же)

    Есть варианты оболочек (Xfce, Mate, Cinnamon, KDE), Mate и Cinnamon достаточно интуитивны и просты.
    Ответ написан
    4 комментария
  • Древовидные комментарии

    nixmale
    @nixmale
    Если речи идет о SQL, то есть одно очень хорошее решение для сортировки древовидных комментариев в один SQL запрос без LEFT JOIN, кстати которое с применением AJAX позволяет перезагружать отдельные ветки, начинающиеся с любого комментария в цепочки.

    Предположим добавление комментариев к теме выглядит следующим образом:
    $arr = array(
         array('id'=>1, 'pid'=>0, 'name'=>'Comment 1'),
          array('id'=>2, 'pid'=>1, 'name'=>'Comment 1.1'),
          array('id'=>3, 'pid'=>1, 'name'=>'Comment 1.2'),
          array('id'=>6, 'pid'=>1, 'name'=>'Comment 1.3'),
           array('id'=>4, 'pid'=>2, 'name'=>'Comment 1.1.1'),
           array('id'=>5, 'pid'=>2, 'name'=>'Comment 1.1.2'),
           array('id'=>7, 'pid'=>2, 'name'=>'Comment 1.1.3'),
         array('id'=>8, 'pid'=>0, 'name'=>'Comment 2'),
          array('id'=>12, 'pid'=>8, 'name'=>'Comment 2.1'),
          array('id'=>17, 'pid'=>8, 'name'=>'Comment 2.2'),
           array('id'=>13, 'pid'=>12, 'name'=>'Comment 2.1.1'),
            array('id'=>16, 'pid'=>13, 'name'=>'Comment 2.1.1.1'),
         array('id'=>9, 'pid'=>0, 'name'=>'Comment 3'),
          array('id'=>14, 'pid'=>9, 'name'=>'Comment 3.1'),
           array('id'=>15, 'pid'=>14, 'name'=>'Comment 3.1.1'),
         array('id'=>10, 'pid'=>0, 'name'=>'Comment 4'),
         array('id'=>11, 'pid'=>0, 'name'=>'Comment 5'),
         );
    


    Каждый комментарий имеет id и id родителя (pid). Ответ на тему должен принимать pid = 0, а ответ на комментарий — id комментария на который отвечаете соответственно. В конечном итоге дерево должно выглядеть так, как показано в массиве образце.

    Чтобы раскрыть дерево за 1 SQL, достаточно достать из базы все комментарии имеющие идентификатор темы, отсортировав их так: ORDER BY pid ASC, id ASC. В результате получим следующий массив.

    $arr = array(
         array('id'=>1, 'pid'=>0, 'name'=>'Comment 1'),
         array('id'=>8, 'pid'=>0, 'name'=>'Comment 2'),
         array('id'=>9, 'pid'=>0, 'name'=>'Comment 3'),
         array('id'=>10, 'pid'=>0, 'name'=>'Comment 4'),
         array('id'=>11, 'pid'=>0, 'name'=>'Comment 5'),
          array('id'=>2, 'pid'=>1, 'name'=>'Comment 1.1'),
          array('id'=>3, 'pid'=>1, 'name'=>'Comment 1.2'),
          array('id'=>6, 'pid'=>1, 'name'=>'Comment 1.3'),
           array('id'=>4, 'pid'=>2, 'name'=>'Comment 1.1.1'),
           array('id'=>5, 'pid'=>2, 'name'=>'Comment 1.1.2'),
           array('id'=>7, 'pid'=>2, 'name'=>'Comment 1.1.3'),
         array('id'=>12, 'pid'=>8, 'name'=>'Comment 2.1'),
          array('id'=>17, 'pid'=>8, 'name'=>'Comment 2.2'),
          array('id'=>14, 'pid'=>9, 'name'=>'Comment 3.1'),
          array('id'=>13, 'pid'=>12, 'name'=>'Comment 2.1.1'),
           array('id'=>16, 'pid'=>13, 'name'=>'Comment 2.1.1.1'),
           array('id'=>15, 'pid'=>14, 'name'=>'Comment 3.1.1'),
         );
    


    Теперь требуется изменить структуру массива.

         for ($i = 0, $c = count($arr); $i < $c; $i++)
         {
           $new_arr[$arr[$i]['pid']][] = $arr[$i];
         }
    


    И завершающая рекурсионная функция.

         function my_sort($data, $parent = 0, $level = 0)
         {
           $arr = $data[$parent];
    
           for($i = 0; $i < count($arr); $i++)
           {
             echo '<div style="padding-left:' . $level . 'px;">';
             echo $arr[$i]['name'];
               if(isset($data[$arr[$i]['id']])) my_sort($data, $arr[$i]['id'], 20);
             echo '</div>';
           }
         }
    


    Теперь чтобы показать все дерево одним разом, достаточно вызвать

    my_sort($new_arr, 0);
    Ответ написан
    6 комментариев