• Зачем нужен sourcemap?

    @lemme
    Frontend
    Вот представь, собрал ты 10 файлов в 1 бандл, потом минифицировал, а как дебажить эту лапшу?

    На помощь приходит sourcemaps, который будет показывать реальную структуру файлов и.т.д
    Ответ написан
    2 комментария
  • Какой MacBook Pro взять для работы с Xcode 7?

    valery_bashkatov
    @valery_bashkatov
    valery.bashkatov.org
    Без SSD сейчас никуда. Никакие н-ядерные процессоры и супербыстрые оперативки не сравнятся с твердотельниками по ускорению работы системы и всех приложений. Xcode, особенно последние версии, достаточно прожорлив на ресурсы. Ретина-не ретина - уже на ваш выбор, с ретиной экран красивый, но все равно в Xcode места на нем мало, так что можно и с обычным экраном + внешний монитор.
    Ответ написан
    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 комментариев
  • Как лучше изучать SQL, если сложно понять?

    dimonchik2013
    @dimonchik2013
    non progredi est regredi
    www.sql-ex.ru/?Lang=0 ресурс специально для, выполни все упражнения
    Ответ написан
    Комментировать
  • Зачем нужны отдельные классы для работы с БД?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    На самом деле это интересный вопрос. А, точнее, два: зачем нужен такой класс, и зачем их пишут.
    Ответ на первый становится очевиден, когда начинаешь не смотреть на код, а писать его ;)
    Практически все библиотеки, представленные в РНР, представляют в пользование программиста довольно низкоуровневые функции, которые позволяют, с одной стороны, довольно гибко управлять процессом, но с другой - делают этот процесс ну очень многословным. Самый яркий пример - CURL. Никто, находясь в здравом уме, не будет писать все время эти бесконечные curlopt. Надо пилить библиотеку, которая реализует стандартные методы пост, гет за один вызов, и только для исключительных случаев позволяет задать кастомные параметры.

    То же самое касается и работы с БД. К примеру, очень часто нам бывает нужно получить из БД массив. Сколько строк нужно написать для этого? Классическим говнокодом - 5:
    $ret = array();
    $res = mysql_query();
    while ($row = mysql_fetch_assoc($res)) {
        $ret[] = $row;
    }

    И такой код надо написать раз 15-20 за приложение. У программиста сразу руки зачешутся уничтожить этот повторяющийся код и написать функцию, которой передаешь запрос, а получаешь массив. За 1 вызов. Вот для этого библиотеки и пишут.

    Но в здесь мы подходим ко второй причине. Дело в том, что "классический говнокод" из видеоуроков всегда очень упрощен. Авторы видеоуроков не знают, что для работы с БД надо делать миллион дополнительных действий - от обработки ошибок до защиты от инъекций. И если все эти действия выполнять вручную, то времени больше ни на что не останется - придется снова и снова переписывать одни и те же тонны кода для каждого запроса.

    Возьмем для примера код примера из мануала. Даже выкинув из него очевидные глупости, мы получаем пол-дюжины строк кода. Это на ОДИН запрос.
    if ($stmt = $mysqli->prepare("SELECT District FROM City WHERE Name=?")) {
        $stmt->bind_param("s", $city);
        $stmt->execute();
        $stmt->bind_result($district);
        $stmt->fetch();
    }

    И это все - чтобы получить единственную строчку!

    В то время как с помощью (нормальной) библиотеки вся работа с БД сведется к 1 (одной) строчке, а все необходимые телодвижения будут выполнены библиотекой автоматически:
    $distr = $db->getOne("SELECT District FROM City WHERE Name=?", $city);

    Теперь перейдем ко второму вопрос - зачем их пишут.
    Самый основной мотив - "шоб було!" "У всех есть - значит, и у меня будет!". При этом, подходя к написанию библиотеки, новички наступают на одни и те же грабли.
    Чаще всего, из-за недостатка опыта авторов, код сокращается только для самых примитивных запросов. Но при этом работа с нестандартными запросами превращается в ад. Но самое ужасное - практически никогда такие самописные библиотеки не поддерживают работу с подготовленными выражениями. А это должно быть их главной фичей, без которых ценность сразу стремится к нулю. А точнее, даже к минусу, потому что инъекции. Ну и по мелочи: к примеру, если в коде действительно написано $db->FetchArray(); - то это ужас, летящий на крыльях ночи, потраченной на отлов неочевидных ошибок .
    Ответ написан
  • Как грамотно начать погружаться в разработку под iOS и что для этого нужно?

    @Sobakus
    Нормально начать разрабатывать для apple можно только на компьютерах apple. Это самая большая преграда. Не стоит связываться со всякими виртуальными машинами и прочими гениальными идеями. Экономия будет очень сомнительная. Только mac. Для начального уровня не важно что именно это будет: MacBook, Macmini, iMac. Если собираетесь брать новое устройство, то по мне лучше взять 13 MacBook Pro без Ретины. Причем взять минимальную конфигурацию. Почему именно ее? Эту модель можно доапгрейдить. Добавить Ram (до 16 Gb), поменять или добавит HD или SSD диск. В остальных MacBook'ах это уже сделать нельзя, память впаяна в плату. Retina, ну не знаю, все таки не бюджетный вариант. Retina хороша 15 дюймовая в топовой комплектации, но там и цены заоблачные. А у 13 дюймовых моделей все равно придете к тому, что нужен внешний монитор. Тогда смысл в ретине пропадает. По поводу устройств их можно вообще не иметь первый год -полтора. Эмуляторы прекрасно работают с основными функциями. Опять таки для запуска приложения на реальном устройстве нужна лицензия разработчика. Стоит она 100$ В год. (Для запуска на эмуляторах такая лицензия не нужна.)
    По поводу самого программирования: тут нужно начинать изучать с ООП, без этого никуда. ( Что такое классы, объекты, указатели, конструкторы и т.д.) т.е. изучать теорию. Лучший выбор это любая книжка про Objective C. Причем в начале просто сидеть и читать изучая термины. В начале будет такая каша в голове, что иногда будет казаться, как этот бред вообще можно понять и освоит. После посмотреть какое-либо обучающее видео на эту тему. И так постепенно, со временем что-то начнет усваиваться. Только ПОСЛЕ этого нужно Обязательно пойти на курсы. Там все систематизируют и раставят по полочкам. Сразу с 0 идти на курсы не советую, тяжело. Усвоите очень мало. Любую информацию нужно переварить, обдумать, а тут бац, новая подвалила, Эээ я еще это не запомнил и т.д. По опыту скажу курсы без подготовки, деньги на ветер.
    P.s. Если остались вопросы пишите, чем смогу помогу. (densobakacom собака mail.ru)
    Ответ написан
    1 комментарий
  • Жив ли Vanilla.js?

    Он живее всех остальных JS фреймворков.
    Vanilla JS - это Чак Норрис среди JS фреймворков.

    Пара ссылок:
    JavaScript MDN
    ECMAScript Programming Language

    vanilla-js.com - на этом сайте можно собрать VanillaJS под себя. Только посмотрите на размеры получаемого файла: 0 bytes uncompressed, 25 bytes gzipped.

    Это самый функциональный и одновременно самый оптимизированный JS фреймворк.
    Ответ написан
    2 комментария
  • Что такое такое rest api?

    @eandr_67
    web-программист (*AMP, Go, JavaScript, вёрстка).
    API социальных сетей - это вполне типичные примеры реализации REST API.

    REST (RESTful) - это общие принципы организации взаимодействия приложения/сайта с сервером посредством протокола HTTP. Особенность REST в том, что сервер не запоминает состояние пользователя между запросами - в каждом запросе передаётся информация, идентифицирующая пользователя (например, token, полученный через OAuth-авторизацию) и все параметры, необходимые для выполнения операции.

    Всё взаимодействие с сервером сводится к 4 операциям (4 - это необходимый и достаточный минимум, в конкретной реализации типов операций может быть больше):
    1. получение данных с сервера (обычно в формате JSON, или XML)
    2. добавление новых данных на сервер
    3. модификация существующих данных на сервере
    4. удаление данных на сервере

    Операция получения данных не может приводить к изменению состояния сервера.

    Для каждого типа операции используется свой метод HTTP-запроса:
    1. получение - GET
    2. добавление - POST
    3. модификация - PUT
    4. удаление - DELETE

    Т.е. :

    GET-запрос /rest/users - получение информации о всех пользователях
    GET-запрос /rest/users/125 - получение информации о пользователе с id=125
    POST-запрос /rest/users - добавление нового пользователя
    PUT-запрос /rest/users/125 - изменение информации о пользователе с id=125
    DELETE-запрос /rest/users/125 - удаление пользователя с id=125
    Ответ написан
    20 комментариев
  • Как вы делаете security аудит сайтов?

    Ваш алгоритм в большей степени относится к аудиту веб-сервера, а не сайта.

    Если же брать конкретный сайт и есть доступ к исходникам, то алгоритм следующий (для PHP)
    1) Открываем исходники в IDE
    2) Делаем поиск вызова функций типа eval и проверяем какие данные передаются в эти функции
    3) Делаем поиск обращения к переменным из массивов POST, GET, REQUEST и проверяем как данные фильтруются и используются
    4) Делаем поиск move_uploaded_file, file_get_contents и проверяем как фильтруются данные передаваемые в функцию

    Если же доступа к исходникам нет, то алгоритм следующий
    1) Пытаемся определить движок, например, тут 2ip.ru/cms/
    1.1) Пытаемся Определяем версию движка
    1.2) Чекаем наличие багов в данном движке
    2) Пытаемся найти админку (Admin Finder)
    2.1) Чекаем стандартные пары логин-пароль
    3) Чекаем наличие папки svn
    3.1) Делаем анализ исходников
    4) Проверяем наличие дампов (папка dump, файлы dump.sql, dump.zip и т.п.)
    4.1) Проверяем наличие паролей в архиве
    4.2) Делаем анализ исходников
    5) Составляем список уникальных URL (http://example.com/q/1 и example/q/2 — не уникальные, но example/q/1 и example.com/p/2 — уникальные).
    5.1) Если включено ЧПУ пытаемся подобрать имя GET переменной
    6) В адресную строку летят кавычки, преобразование переменных в массив (если удалось обнаружить имя GET переменной), HTML теги
    7) Проверяются cookie сайта. При наличии кукисов установленных самим сайтом меняем значения на свои (опять кавычки, html теги
    8) При наличии на сайе форм (комментарии, публикация статей, заметок, строк поиска и т.п.) с последующим выводом введенных данных на странице производится проверка на наличие XSS
    9) Тестируется работа сайта с кривым именем браузера
    Ответ написан
    Комментировать
  • Цвет рамки монитора - черный или серебристый, какой для глаз лучше?

    Iliapan
    @Iliapan
    Рабочее окружение — жесть. Лучше всего вам организовать место в отдельной комнате — кабинет называется.
    Ответ написан
    Комментировать