• Как правильно возвращать JSON с контроллеров Laravel для API приложения?

    @Kostik_1993
    Web Developer
    1. Для того чтобы какие-то поля модели не отображались нужно использовать переменную hidden, с помощью нее мы указываем какие поля не должны отображаться в JSON ответе.
    protected $hidden = [
            'type_id',
            'created_at',
            'updated_at',
        ];

    2. У каждой модели вы должны указать свои поля которые должны быть скрыты
    protected $hidden = [
            'type_id',
            'created_at',
            'updated_at',
        ];

    3. Category::with('posts.comments')->get();
    4. Для этого также есть специальные переменные и методы.
    Также доступен такой метод
    public function getDateAttribute () {
            return date('Y-M-D', $this->date);
        }
    public function getUrlAttribute () {
            return url($this->slug);
        }

    этот метод выведет $post->date в нужном формате
    чтобы такой метод был доступен в json нужно указать его в
    protected $appends = [
            'url',
            'topic',
        ];
    Ответ написан
    Комментировать
  • Какой язык имеет хорошие перспективы для back end под web приложения?

    @asd111
    php+laravel
    Ответ написан
    Комментировать
  • Какие разделы английского стоит выучить для фриланса?

    webinar
    @webinar
    Учим yii: https://youtu.be/-WRMlGHLgRg
    If you understand the meaning of this text without an interpreter - so you can work on the english-speaking freelance
    Если ты нихрена не понял в тексте выше. Скачай учебник Английский язык 5 класс
    Ответ написан
    17 комментариев
  • В чем может быть причина очень долгой загрузки symfony3 на вагранте?

    @AlexeyKosov
    Причина - в очень медленном механизме shared folders в Virtual Box.
    Варианты:
    Если host на линуксе - использовать NFS.
    Если host Windows - то нужно сделать так, чтобы как минимум директории var и vendor были вынесены за пределы shared folders, а ещё лучше чтобы весь код проекта "жил" внутри линукса, а из host-машины доступ к нему получать, например, через samba.
    Ответ написан
    Комментировать
  • Как сканировать старые фотографии?

    saboteur_kiev
    @saboteur_kiev
    software engineer
    Недавно отсканировал ВСЕ альбомы. Ушло пару недель (несколько тысяч фото)

    Из опыта:
    Сканировать с максимальным разрешением - реально НЕ нужно. Переглядывать фотки раз в десять лет, причем важно просто разглядеть что там, а не высматривать щербинки и родинки. Поэтому на 600 DPI хватает выше крыши для всех обычных семейных фото, а для фоток сделанных мыльницей - 300 dpi за глаза.

    Отдельные фотки для реставрации, можно постараться отсканить с бОльшим разрешением, 1200, аккуратно прижимать, но нужно понимать, что если вы начнете реставрировать сами, то через 30-40 фоток вам это надоест, и вы поймете что не так уж и важно сверх-качество. Следовательно хорошо подумайте, стоит ли фотка дополнительных усилий, или ее в общую стопку. Редкие студийные фото, сделанные не на цифровые камеры тоже можно отсканить в 1200.

    Слайды, диафильмы - 1200 хватило. немного размыто, но на самом деле сами слайды не дают слишком большое разрешение, то есть сканируя слайд на 2400, особо качества не добавилось, а размер - в разы. Его потом просто неудобно смотреть.

    На что нужно обращать внимание:
    1) Положение фото на сканере. Чем ровнее положить, чем аккуратнее закрыть крышкой, тем ровнее будет фотка, проще обрезать, меньше работы.
    2) Сразу придумать каталогизацию. Пока фото сканируется, можно его переименовать, положить в нужный каталог.
    Вот такое - не очень.
    серый_альбом/фото10.jpg
    белый_альбом/фото10.jpg

    А сквозная нумерация - гораздо лучше, особенно если в будущем фотки будут перекладываться из папки в папку.
    серый_альбом/фото10.jpg
    белый_альбом/фото20.jpg

    В идеале, если альбомы велись корректно, то год-месяц-день_номер.jpg. Если с этим тяжело, можно например 2001-xx-xx-01.jpg, будет хотя бы год.
    Ответ написан
    1 комментарий
  • Попросили проверить код, на что смотреть нужно?

    apavlyut
    @apavlyut
    www.pavlyut.ru
    Все комментаторы совершили одни и те же ошибки управления потому что, при всем уважении, скорее всего за эти ошибки (в стратегировании) они не платят из своего кармана.

    На пальцах отвечаю на ваш вопрос:

    1) По структуре - при проверки качества кода / решения / задачи / продукта / настройки сервера и так далее нужно проходить по списку (чеклист) критериев контроля качества - обычно они выглядят как списки определенных параметров которые может замерить третье лицо или сама система - формат проверяемого параметра прямо вот соответсвует / не соответсвует. На сколько процентов пройден чеклист - на столько процентов результат "качественный"
    2) Почему ребята ошиблись - потому что стали приводить конкретные списки. Дело в том что у каждого проекта / сиутации / команды / набора компетенций - свои наборы таких чеклистов на разные ситуации. В больших командах сущесвтует основной чеклист который регламентирует CodeReview - и за него отвечает как правило тим лид - он его обновляет, развивает, обосновывает внесенные правила и следит за тем чтобы ПЕРЕД началом разработки все разработчики были ЗАРАНЕЕ ОЗНАКОМЛЕНЫ с этим порятком проверки качества, а все потому что:
    3) Количество стайлгайдов и критериев в приципе существует огромное количество - и то как каждому в одной части света / компании удобно делать одно дело - не регламентирует ни разу что именно так же другому человеку в другой ситуации применять эти правила к своему контексту. В виде открытых стайлгайдов они существуют для накопления практик и навыков в первую очередь для их же развития (процесс формулировки наводит порядок в голове) а также дают возможность "на них конкретно" нанизать точечные ответы огромного сообщества людей, и получить те самые разные взгляды на ситуации, и по возможности опять же привести к общему знаменателю. Но это все мелочи жизни, а в вашем случае вы совершите серьезную ошибку если прямо сейчас возьметесь (примите на себя ответственность) проверять чужой код на предмет оценки, потому что:
    4) Вас явно используют как внешнего эксперта на которого можно сослаться, от которого можно получить якобы аргументацию для давления на свою позицию при решении какой-то возникшей ситуации во взаимоотношениях клиент-разработчик на проекте куда вас приглашают за экспертизой.
    Если вы, не предупредив, о том что "качество кода" начинается с декларации этого качества (в случае если речь идет о проверке этого внутреннего качества в рамках сотрудничества, а не самих задач которые поставлены перед создаваемой системой - фичесов) - любая ваша оценка будет недостоверна контексту ее применения (вы напишете про строки или еще что-то - а у человека будут либо взыскивать деньги / либо недоплатят за работу / или инкапсулируют в договоренности пост фактум за те же деньги работу над соотвествием определенным стилям - это все работа которая должна быть оплачена). Поэтому вот вам вилка ваших дейсвтий:

    1) Если у вас просто просят менторства молодые коллеги - дайте им ссылку на гугл и ключевое словосочетание php style guide github
    2) Если вас спрашивают (либо вы сами являетесь таким заказчиком который ищет за что зацепиться в коде чтобы продавить свою позицию) - нет критериев качества кода ДО начала работ подписанных на бумаге / пересланных по почте - никакие критерии не могут быть применены к текущим отношениям - только к следующей итерации за следующие деньги.
    3) Если вы все же разработчик и вас попросили оценить код - донесите данную ситуацию до стадии корректного закрытия текущего этапа работ - но дальше предложите уже введение стайл гайда если оно того требует. Я полагаю что на самом деле нет. Дав сейчас ответ на вопрос в виде оценки качества кода вы сделаете только одно - абсолюно необоснованно дадите агрумент в явно перекошенном споре, и просто возьмете на себя еще один мешок кармогрязи которую будуете еще сколько-то положенного времени отрабатывать.

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

    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 комментариев
  • Резиновый DIV чётко по центру

    Sk8er
    @Sk8er
    Жесток, опасен, вспыльчив. Щеголь.
    Есть ещё вот такое решение, с помощью Flexbox: blog.sk8er.name/rabota/vyravnivanie-bloka-po-centru
    Ответ написан
    Комментировать
  • Удаленный работадатель требует сделать ИП, зачем это нужно?

    Prognosticator
    @Prognosticator
    TODO: Здесь будут ворованные умные мысли, типа мои
    • Если лично вам ИП не нужно, шлите в ..... заказчика (завуалированно и иносказательно, особенно если это порядочные люди).
    • Любая компания может найти способ платить физику, белая, серая, цвета детской неожиданности. Из копилки, из личных средств, как списание на средства для мытья окон. Вопрос захотят-ли.
    • Если без этого заказчика вам нечего будет кушать, откройте ИП.
    • ИП абсолютно никак не делает вас привлекательнее для заказчиков, привлекательным вас делают качественная работа, опыт и рекомендации людей. ИП несет потери времени и денег на бумажную возню и отчисления. Вычтите это время из вашего рабочего времени, получатся еще некоторые потери. Также есть категория заказчиков, которые предпочитают работать официально. Но тем не менее воруют другими способами.
    • ИП лично вам, может быть нужно в случае получения ипотеки или крупного кредита, для подтверждения доходов за последние полгода. Но при высоких доходах и разумных тратах с накоплениями и кредиты не нужны.
    • 99% удаленной работы оплачивается в серую. Никто не спрашивает. Всем срать на ваши 500-2000$, полученные из-за бугра или соседней страны, через 10 платежных систем или с карты на карту.
    • Пообщайтесь с такими же удаленщиками из этой фирмы, если это возможно, соберите данные на доброго дядю.
    • Спросите дядю напрямую, с кем можно поговорить о его репутации.
    • Спросите дядю напрямую, зачем ему ваше ИП.
    • Приостановить/закрыть ИП можно в любой момент.
    • Вдумчиво читайте договор, между вами и дядей, с усердием переписывайте мутные моменты и формулировки.
    • Заключая договор вы не продаете душу и тело в рабство. Вы не обязаны умирать на проекте и овертаймить. Вы можете договор расторгнуть. Особенно по случаю "вновь открывшихся обстоятельств". Мы можете и заболеть и форсмажорить другими путями, возвращаемся к пункту с договором.
    • Чтобы получить опыт в сфере предпринимательства, начните его получать.
    • Глубоко осознайте тот факт, что вы мужчина и вам многое по плечу.
    • Мир разработки в целом и удаленной в частности - это поле боя, учитесь конкурировать, драться и побеждать.
    DETAIL_PICTURE_676265_71935315.jpg

    PS
    Был на обеих сторонах баррикад. Если быть правдивым до конца - исполнители косячат на порядок больше.
    99% кода идет под нож или хранится будучи никогда не использованным. Написанного и запущенного, написанного и не дошедшего в продакшен. По разным причинам - раздолбайство, распил, экспериментальный юмор, невостребованность стартапов для лайканья котиков, моральное устаревание и банкротство. Просираются бюджеты сопоставимые с отправкой человека на марс. Такова эта отрасль.
    Успевайте во всем этом хаосе жить полной жизнью, получать опыт, творить ценное для людей.
    Ответ написан
    1 комментарий
  • Почему это java говнокод?

    scapp
    @scapp
    JS фрилансер
    Потому что у твоего начальника говнонастроение!
    Ответ написан
    Комментировать
  • Как в Yii2 работать со связанными таблицами при помощи ActiveRecord?

    @Mishutka2000
    Создать связь c моделью getContents(). После этого можно обратиться к атрибутам связанной таблицы через связь: $model->getContents()
    Ответ написан
    Комментировать
  • Почему один и тот же jQuery-скрипт на одном хостинге работает, а на другом нет?

    backflipper
    @backflipper
    Front-end dev
    У меня на 2 сайтах, все нормально с уведомлением.
    Ответ написан
    Комментировать
  • Как в Yii2 basic убрать web/ из url при помощи .htaccess и правил urlManager'а?

    IvanCher
    @IvanCher
    Мысли шире
    Если коротко, то вам нужно WebRoot указать не корневую папку с проектом (***/project), а папку web(***/project/web).
    Ответ написан
    Комментировать
  • Как отправить сообщение к конкретным пользователям?

    Aliansys
    @Aliansys
    Из документации socket.io (отправка сообщений)
    // отправить текущему сокету сформировавшему запрос (туда откуда пришла)
    socket.emit('message', "this is a test");
    
    // отправить всем пользователям, включая отправителя
    io.sockets.emit('message', "this is a test");
    
    // отправить всем, кроме отправителя
    socket.broadcast.emit('message', "this is a test");
    
    // отправить всем клиентам в комнате (канале) 'game', кроме отправителя
    socket.broadcast.to('game').emit('message', 'nice game');
    
    // отправить всем клиентам в комнате (канале) 'game', включая отправителя
    io.sockets.in('game').emit('message', 'cool game');
    
    // отправить конкретному сокету, по socketid
    io.sockets.socket(socketid).emit('message', 'for your eyes only');
    Ответ написан
    19 комментариев
  • Как подружить php и nodejs?

    nepster-web
    @nepster-web Автор вопроса
    честно говоря я даже растерялся что использовать. Опишу проблему, может будет что то конкретное:

    Я пишу игровой портал, где пользователи могут играть между собой к примеру в шашки. Весь сайт реализован на Yii, а игры на node.js. Теперь как это все выглядит и что мне нужно.

    К примеру пользователь на сайте создает заявку на игру, 2 пользователь присоединяется к заявке (тут полномочия yii заканчиваются) далее необходимо передать данные об этих пользователя в node.js где начнется игра.

    Я работаю с базой данных mysql поэтому думаю, что редис мне не нужен. К примеру в node.js я передаю user_id пользователей и id заявки. Далее уже на сервере node.js с помощью socket.io я формирую комнату для двух игроков и они играют. После завершения игры, мне нужно обратно скинуть данные в php , а именно информацию о победе, после чего php посчитает рейтинг и тп.

    Отправить данные в node.js я смог с помощью http://elephant.io, а обратно простым пост запросом. Все работает как нужно, но будет ли это безопасно ? Могут ли перехватить как-то данные и подменить на свои ? будет обидно если игрок проиграет и подменит данные, таким образом, что он победитель.

    Собственно задача у меня такая и я честно говоря потерялся между вариантами.
    Ответ написан
    1 комментарий
  • Повернуть изображение в канвасе так чтобы оно помещалось в область канваса

    pratamishus
    @pratamishus Автор вопроса
    Решил сам в конце-концов. Но решение сложноватое. Если кто придумает что-нибудь более оптимальное был бы признателен :)

    $(document).ready(function(){
    var canvas=document.getElementById('iconCanvas');//<canvas id="iconCanvas" width="128" height="128"></canvas>
    var context=canvas.getContext("2d");
    var imgObj=new Image();
    imgObj.src='people.jpg';
    var iconWidth=128;
    var iconHeight=128;
    var width=200;
    var height=128;
    var angleToRotate=30;
    
    
    $(imgObj).load(function() {
        context.clearRect(0, 0, canvas.width, canvas.height);
    
        var rad = angleToRotate * Math.PI / 180;
    	var newAngle=angleToRotate;
    	
    	//in case angle is >90
    	if(newAngle>90 && newAngle<=180){
    		newAngle=180-newAngle;
    	}
    	else if(newAngle>180 && newAngle<=270){
    		newAngle=270-newAngle;
    	}
    	else if(newAngle>270){
    		newAngle=360-newAngle;
    	}
    
        context.translate(0 + iconWidth / 2, 0 + iconWidth / 2);
    
        context.rotate(rad);
    
        //draw the image
    	
    	var newImageWidth=Math.floor((Math.cos((Math.atan(iconWidth/iconHeight)*180/Math.PI)*Math.PI/180)*height)/Math.sin((parseInt(newAngle)+Math.atan(iconHeight/iconWidth)*180/Math.PI)*Math.PI/180));
    	var newImageHeight=Math.floor((Math.cos((Math.atan(iconWidth/iconHeight)*180/Math.PI)*Math.PI/180)*height)/Math.sin((newAngle+Math.atan(iconHeight/iconWidth)*180/Math.PI)*Math.PI/180));
    	
        context.drawImage(imgObj,newImageWidth / 2 * (-1),newImageHeight / 2 * (-1),newImageWidth,newImageHeight);
    
    });
    });
    
    Ответ написан
    Комментировать