Задать вопрос
  • Попросили проверить код, на что смотреть нужно?

    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 комментариев
  • Как защитить сайт от выкачки через инспектор?

    yarkov
    @yarkov Куратор тега JavaScript
    Помог ответ? Отметь решением.
    И снова супер секретные наработки защитить пытаются =)
    Нет, нельзя защитить. Чтобы отобразить сайт, браузер должен выкачать все нужные файлы. А соответственно когда сайт загрузился, то файлы уже на компе пользователя.
    Ответ написан
    1 комментарий
  • Как сделать имитацию увеличения (картинок, карт) двумя пальцами на компьютере?

    xmoonlight
    @xmoonlight
    https://sitecoder.blogspot.com
    В хроме: Правый клик "мыши" на странице -> Просмотреть код (Ctrl+Shift+I) -> Мобильный вид (включить иконку) -> зажать Shift + зажать и удерживать левый клик "мыши" -> таскать курсор "мыши" с зажатыми клавишами
    Ответ написан
    2 комментария
  • Как развиваться в программировании не привязываясь к языку?

    myjcom
    @myjcom
    Clean Code: A handbook of software craftsmanship / Чистый код: Создание, анализ и рефакторинг
    Год издания: 2013
    Автор: Robert Martin / Роберт Мартин
    ISBN: 978-5-496-00487-9

    The Clean Coder: A Code of Conduct for Professional Programmers / Идеальный программист. Как стать профессионалом разработки ПО
    Год издания: 2012
    Автор: Robert C. Martin / Роберт Мартин
    ISBN: 978-5-459-01044-2

    Алгоритмы. Справочник с примерами на C, C++, Java и Python
    Год издания: 2017
    Автор: Хайнеман Д., Поллис Г., Селков С.
    ISBN: 978-5-9908910-7-4

    Design Patterns. Elements of Reusable Object-Oriented Software/Приемы объектно-ориентированного проектирования. Паттерны проектирования
    Год издания: 2015
    Автор: Erich Gamma, Richard Helm, Ralph Johnson, John Vlissides/Гамма Э., Хелм Р., Джонсон Р., Влиссидес Дж
    ISBN: 978-5-496-00389-6

    Test-driven development by example / Экстремальное программирование. Разработка через тестирование
    Год издания: 2017
    Автор: Kent Beck / Кент Бек
    ISBN: 978-5-496-02570-6

    Грокаем Алгоритмы. Иллюстрированное пособие для программистов и любопытствущих
    Год издания: 2017
    Автор: Бхаргава А
    ISBN: 978-5-496-02541-6

    Алгоритмы. Теория и практическое применение
    Год издания: 2016
    Автор: Стивенс Род
    ISBN: 978-5-699-81729-0

    прочитать нужно все

    ну и на закуску
    C Unleashed / Искусство программирования на C. Фундаментальные алгоритмы, структуры данных и примеры приложений. Энциклопедия программиста
    Год: 2001
    Автор: Heathfield R., Kirby L. / Хэзфилд Р., Кирби Л.
    ISBN: 0-672-31896-2 / 966-7393-82-8
    Ответ написан
    9 комментариев
  • Правильно отдать логотип?

    UtyaPutya
    @UtyaPutya
    фрилансер
    главное не отдавать полностью готовый логотип пока не оплатили. кидал хватает..
    Ответ написан
    Комментировать
  • Как переключить версию PHP в Apache2?

    Austin_Powers
    @Austin_Powers
    Web developer (Symfony, Go, Vue.js)
    a2dismod php5
    a2enmod php7.0
    service apache2 restart
    Ответ написан
    3 комментария
  • Книга о том как правильно должен работать программист?

    un1t
    @un1t
    Чед Фаулер "Программист фанатик"
    Джоэл Спольски "Джоэл о программировании"
    Роберт Мартин "Идеальный программист"
    Том ДеМарко, "Вальсируя с Медведями: управление рисками в проектах по разработке программного обеспечения"
    Том ДеМарко "Человеческий фактор. Успешные проекты и команды"
    Роберт Гласс "Факты и заблуждения профессионального программирования"
    Игорь Савчук "Отъявленный программист. Лайфхакинг из первых рук"
    Питер Сейбел "Кодеры за работой. Размышления о ремесле программиста"
    Хант Эндрю, Томас Дэвид "Программист прагматик"
    Ответ написан
    1 комментарий
  • Как увеличить скорость поиска в sphinx?

    @Fortop
    Tech/Team lead
    • Увеличиваем память до 256, а лучше еще больше.
    • Разносим индексы на разные машины ( у Sphinx есть возможность подключать агентов)
    • Даже в рамках одной машины настраиваем количество агентов поиска равное количеству потоков которые может выполнять сервер (например 4хядерный процессор с HyperThreading = 8 потоков
    • Уточняем срок обновления индекса. Кешируем результаты поиска на отдельном сервере в мемкеш/файлы.


    Все эти рецепты можно применять как по-отдельности, так и совместно.
    Конкретные цифры с количеством машин, агентов поиска, объема памяти под индексы и под кеш нужно высчитывать в зависимости от конкретного решения.
    Ответ написан
  • Скрипт "установки" php движка. Как реализовать?

    @D3lphi
    Реализуемо ли такое вообще?

    Нет, не реализуемо. Это засекреченные разработки советских ученных.

    А если серьезно, то что вы хотите услышать? Как это писать?
    При входе человека на сайт, нужно проверять, установлено ли приложение (Есть множество вариантов, как это можно сделать: проверять наличие какого-либо файла(ов), проверять наличие какой-либо информации в нем (них) и тд). И, в зависимости от результата этой проверки, либо пускать его на сайт, либо выводить "окно установки". Во время установки собираем необходимую информацию. Производим создание необходим таблиц БД (Для подключения к ней, используем то, что указал юзер). Создаем пользователя администратора. В конце, генерируем файлы конфигурации. В них, как минимум, нужно занести информацию для соединения с базой данных. Остальные настройки можно хранить как в таких же файлах конфигурации, так и в базе данных, например.

    Ну вот, собственно, и все.
    Ответ написан
    1 комментарий
  • Как коректно спросить о том куда расти для повышения ЗП?

    gubin_niko
    @gubin_niko
    Я могу лишь своё мнение озвучить, основанное на практике.

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

    Ещё посмею дать совет. Развивайтесь дальше, изучайте свою сферу глубже и шире, задевайте смежные, изучайте иностранные языки и другие языки программирования. Когда будете иметь каждый месят по десятку новых предложений и по 1-2 горячему оферу, уже никаких переживаний не будет, а при отказе поднять ЗП можно смело уходить к конкурентам. Отрастите зубы, чтобы не сосать, а грызть))
    Ответ написан
    16 комментариев
  • Сопровождение проекта: продавать часы или результат?

    xmoonlight
    @xmoonlight
    https://sitecoder.blogspot.com
    Сопровождение проекта - это договор с регламентируемым списком работ и ограниченным количеством часов по каждому из этих типов работ и временем реакции на каждую задачу или сбой.
    Разработка/доработка любого нового функционала или исследование - это НЕ сопровождение и регламентируется отдельным договором подряда.
    The End.
    Ответ написан
    2 комментария
  • Как сохранить GET параметр при переходах по сайту?

    DevMan
    @DevMan
    его нужно передать через get один раз при выборе языка.
    далее сохранить в куку или сессию и использовать.
    Ответ написан
    2 комментария
  • Как правильно сделать logout?

    @x-comzbk Автор вопроса
    Не разлогиниволся из-за того, что он не чистил сессию без ее начала, т.е. надо так
    logout.php
    <?php
        session_start();
        unset($_SESSION['login']);
        unset($_SESSION['id']);
        session_unset();
    	session_destroy();
    	header("Location: ../index.html");
    ?>
    Ответ написан
    Комментировать
  • Шаблон путей к файлам, как правильно использовать в PHP glob ()?

    DevMan
    @DevMan
    glob - достаточно тупой.
    можно хитрить примерно так:
    glob("$dir/2.{,[3-5]}[0-9][0-9][0-9].txt", GLOB_BRACE);
    выберет файлы от 2.3000.txt до 2.5999.txt

    имхо, во многих случаях проще пробежаться по файлам итератором.
    Ответ написан
    1 комментарий
  • Как получить описание ролика на ютубе по url?

    DevMan
    @DevMan
    идете в https://console.developers.google.com, активируете API тюбика и создаете для него API key.
    а дальше все просто:
    $id = /*id ролика*/;
    $url = "https://www.googleapis.com/youtube/v3/videos?part=snippet&id=$id&key=ваш-ключ";
    $json = file_get_contents($url);
    print_r(json_decode($json));

    это даст примерно такой выхлоп:
    stdClass Object
    (
        [kind] => youtube#videoListResponse
        [etag] => "I_8xdZu766_FSaexEaDXTIfEWc0/1GRTHrSXUwp9mfSo8btF2dBTfcA"
        [pageInfo] => stdClass Object
            (
                [totalResults] => 1
                [resultsPerPage] => 1
            )
    
        [items] => Array
            (
                [0] => stdClass Object
                    (
                        [kind] => youtube#video
                        [etag] => "I_8xdZu766_FSaexEaDXTIfEWc0/W9riw6RqmQiwZM4L-fC7SglXIb4"
                        [id] => fVJJ8nzKamU
                        [snippet] => stdClass Object
                            (
                                [publishedAt] => 2014-05-26T21:50:59.000Z
                                [channelId] => UCIM_P-ohGAVGDbZWSPBs1Qw
                                [title] => Chris Isaak - Wicked Game (Gemma Hayes remix)
                                [description] => Absolute - Experience Music like never before.
    » Facebook: http://on.fb.me/15wB9rV
    » Twitter: http://bit.ly/17eu7Xf
                                [thumbnails] => stdClass Object
                                    (
                                        [default] => stdClass Object
                                            (
                                                [url] => https://i.ytimg.com/vi/fVJJ8nzKamU/default.jpg
                                                [width] => 120
                                                [height] => 90
                                            )
    
                                        [medium] => stdClass Object
                                            (
                                                [url] => https://i.ytimg.com/vi/fVJJ8nzKamU/mqdefault.jpg
                                                [width] => 320
                                                [height] => 180
                                            )
    
                                        [high] => stdClass Object
                                            (
                                                [url] => https://i.ytimg.com/vi/fVJJ8nzKamU/hqdefault.jpg
                                                [width] => 480
                                                [height] => 360
                                            )
    
                                        [standard] => stdClass Object
                                            (
                                                [url] => https://i.ytimg.com/vi/fVJJ8nzKamU/sddefault.jpg
                                                [width] => 640
                                                [height] => 480
                                            )
    
                                        [maxres] => stdClass Object
                                            (
                                                [url] => https://i.ytimg.com/vi/fVJJ8nzKamU/maxresdefault.jpg
                                                [width] => 1280
                                                [height] => 720
                                            )
    
                                    )
    
                                [channelTitle] => Absolute
                                [tags] => Array
                                    (
                                        [0] => absolute
                                        [1] => deep
                                        [2] => dance
                                        [3] => house
                                        [4] => music
                                        [5] => 2013
                                        [6] => the
                                        [7] => beat
                                        [8] => lounge
                                        [9] => chill
                                        [10] => theabsolutebeat
                                        [11] => Lounge Music (Musical Genre)
                                        [12] => House Music (Musical Genre)
                                        [13] => chris isaak
                                        [14] => wicked game
                                        [15] => gemma
                                        [16] => hayes
                                        [17] => remix
                                        [18] => majesticcausal
                                    )
    
                                [categoryId] => 24
                                [liveBroadcastContent] => none
                                [localized] => stdClass Object
                                    (
                                        [title] => Chris Isaak - Wicked Game (Gemma Hayes remix)
                                        [description] => Absolute - Experience Music like never before.
    » Facebook: http://on.fb.me/15wB9rV
    » Twitter: http://bit.ly/17eu7Xf
                                    )
    
                            )
    
                    )
    
            )
    
    )

    Ответ написан
    2 комментария
  • Кому нибудь удавалось запустить Photoshop 2015 CC в Wine?

    shambler81
    @shambler81 Куратор тега Linux
    попробуй запустить портабайл версию. Как прваило они под вайном работают даже стабильней чем отстроеный вайн, ибо реально тащят с собой все файлы.
    Ответ написан
    6 комментариев
  • Как конвертировать символы \UXXXX?

    DevMan
    @DevMan
    вангую: это json? угадал?

    если нет, то можно так
    echo json_decode('{"x":"\u043f\u043e\u0441\u0442\u0443\u043f\u043b"}')->x;
    Ответ написан
    Комментировать
  • Как найти отрезок кода в Wordpress который отвечает за публикацию поста?

    bingumd
    @bingumd
    ...
    А почему не сделать так:

    add_action( 'publish_post', 'названия_вашей_функции', 10, 2 );
    Ответ написан
    6 комментариев