• Комп или ноут для ue5?

    Get-Web
    @Get-Web
    Front-End Developer
    Если будешь работать в офисе, тебе предоставят рабочее место и ПК и ты сам все будешь настраивать как тебе нужно в рамках доступного ПО. То есть если у тебя например винда, то в офисе вполне возможно будет линукс, если тебе нужно что-то поставить, зовешь сис админа. Все зависит от компании, хорошие компании, даже для удаленной работы предоставляют свой ПК и мониторы, чтобы ты использовал его только для работы и тебе было максимально комфортно.

    Ориентируйся чисто для себя, как тебе будет удобно в текущих реалиях. Но если у тебя будет только ноут, то в любом случае дома должен быть еще и нормальный монитор для работы ибо на маленьком мониторе ноутбука кодить это тот еще фетиш.

    Если работодатель просит тебя принести свой компьютер в офис, то лучше не связывайся с такой компанией..
    Ответ написан
    Комментировать
  • Комп или ноут для ue5?

    @rPman
    Постарайся избегать компаний, требующих приносить на работу свой ноутбук, но возможны исключения - если ты работаешь удаленно.

    Единственная причина выбирать ноутбук для работы - вынужденная мобильность.

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

    Ноутбуки и планшетники это устройства потребления контента
    Ответ написан
    Комментировать
  • Материал для изучение Fullstack?

    Sanes
    @Sanes
    Документацию читайте. На курсах не учат, а знакомят с предметом. Как только это поймёте, так сразу всё встанет на свои места.
    Ответ написан
    Комментировать
  • Как запретить скачивание торрентов на своем VPN сервере?

    ky0
    @ky0
    Миллиардер, филантроп, патологический лгун
    Разрешите наружу с впна только нужные порты - HTTP(S), почту и т. д. Это решит 90% проблем.
    Ответ написан
    2 комментария
  • ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: NO): что делать?

    @lexadef
    Это может быть, если пароль не был задан при установке.

    Порядок действий для установки/смены пароля root в mysql следующий:

    1. Остановить mysql:
    sudo service mysql stop

    2. Запустить сервис со следующими параметрами:
    sudo mysqld --skip-grant-tables --user=root

    Если выдал ошибку то в файле /etc/mysql/mysql.conf.d/mysqld.cnf в секцию [mysqld] добавить строчкуskip-grant-tables и выполнить sudo service mysql restart

    3. После этого подключиться к mysql командой:
    mysql -u root

    4. Обновить пароль root'a:
    UPDATE mysql.user SET authentication_string=PASSWORD('<новый пароль>'), plugin='mysql_native_password' WHERE User='root' AND Host='localhost';    
    FLUSH PRIVILEGES;


    5. И перезапустить сервис:
    sudo service mysql restart
    Если на шаге 2 вы добавляли skip-grant-tables в /etc/mysql/mysql.conf.d/mysqld.cnf - удалить эту строчку.


    Подробнее в Русскоязычной документации Ubuntu
    Ответ написан
    3 комментария
  • Кто такой кодер? и чем он отличается от программиста?

    RiseOfDeath
    @RiseOfDeath
    Диванный эксперт.
    Кодер пишет код программы. Программист чинит микроволновки, настраивает телефоны, ремонтирует офисную мебель и, в исключительных случаях, пишет программы.
    Ответ написан
    Комментировать
  • Структура базы данных магазина/каталога для SQL. Как лучше хранить атрибуты и их значения в БД?

    @dimoff66
    Кратко о себе: Я есть
    1) Не очень понятно назначение таблицы product_value, допустим у вас есть товар Куртка зимняя, у него есть два варианта (цвет: черный, размер: 42), (цвет: красный, размер: 43), и что будет в таблице?
    Четыре записи:
    Куртка зимняяЦвет черный
    Куртка зимняяЦвет красный
    Куртка зимняяразмер 42
    Куртка зимняяразмер 43


    И как вы определите, как эти свойства соотносятся и главное как вы это будете использовать?
    У вас же будут вноситься данные по продажам?

    Назначение этой таблицы в таком виде непонятно, я бы предложил сделать таблицы

    attributes_sets (модификации товара)
    • id
    • product_id
    • title


    и

    attributes_sets_values (значения свойств данной модификации)
    • attributes_set_id
    • value_id


    Тогда получится таблица вида

    Куртка: вариант 1 Цвет черный
    Куртка: вариант 1размер 42
    Куртка: вариант 2 Цвет красный
    Куртка: вариант 2размер 43


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

    Также можно писать в поле title таблицы attributes_sets значения модификации через запятую "черный, 42", это упростит вывод информации о модификации в отчетах.

    2) В product_value(или attributes_sets_values, если примените пункт 1) можно добавить поля attribute_id, value_int, это позволит для числовых атрибутов не задавать заранее список значений в values, а сразу указывать числовое значение

    3) Цены лучше не хранить в товаре, а сделать отдельные таблицы

    price_types: id, name
    prices: price_type_id, product_id, set_date, price

    Это позволит назначать товару разные цены в зависимости от всякого рода условий, можно также добавить в prices поле user_id, чтобы не возникал вопрос кто поменял цену
    Ответ написан
    1 комментарий
  • Нужно ли использовать interface?

    gzhegow
    @gzhegow
    aka "ОбнимиБизнесмена"
    Вы когда на работу устраиваетесь - заключаете контракт. Контракт описывает что вы должны уметь. Это вот интерфейс "на вас".
    Тогда как вы сами - это "класс", который что-то уже умеет.

    Если ваши классы ничего ЧТО ТРЕБУЕТСЯ ДРУГИМ не делают - интерфейс на них не обязателен.

    Интерфейс выполняет две задачи. Даёт классу назначение (имя в рамках задачи) и контроллирует, что класс что-то умеет.

    * Ещё он умеет константы хранить, но этим редко пользуются (а зря, интерфейс меняется от проекта-к-проекту, а реализация - от задачи-к-задаче, стало быть объявленные константы вполне себе могут быть в интерфейсе, т.к. реализацию могут удалить)

    Назначение чаще всего применяется в контейнерах зависимостей (см. Psr\ContainerInterface), там два интерфейса можно (и нужно) использовать, чтобы два одинаковых объекта положить в разные "коробки" и достать одну в одном классе, а другую - в другом.

    Вторая функция применяется для проверки входных данных, когда вы в функции указываете тип данных для параметра, и программа упадет в ошибку, если тип данных неверный. Этот же принцип используется для организации ПОДМЕНЫ одного класса на другой. Если смотреть на вашу задачу (хотя здесь интерфейс не нужен) , то вместо того, чтобы на входе писать RurMoney вы сможете написать MoneyInterface, если вам не важно, какая валюта придет в функцию, но они все умеют в ваш ->getName()

    В некоторых программах есть классы-данные, в которых нет методов (либо есть только геттеры и сеттеры - это вот ваш случай). Эти классы называют ValueObject. Для них интерфейс писать не надо. Чаще всего для них даже несколько классов делать не надо, просто один класс с разными свойствами. Но вот если методы есть - то нужно сделать АБСТРАКТНЫЙ КЛАСС, от него наследовать конкретные классы, тогда на входе проверять не интерфейс, а абстрактный класс. Абстрактный класс объединяет в себе "действия по-умолчанию" и "проверку умения" (через абстрактные методы). Они похожи на те, что в вашей задаче - getName() есть у всех - отличный способ положить этот метод в абстракцию, и не писать интерфейс, т.к. у вас уже есть абстрактный класс.

    К чему мы приходим.
    Интерфейсы чаще всего применяются, когда мы делаем класс умеющий несколько разных действий, класс-сервис, и мы подразумеваем, что когда класс кому-то не понравится, он возможно захочет удалить ваш и написать свой. Поэтому мы на входе пишем интерфейс и пусть свой туда подсовывает изменив настройки контейнера.

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

    Конкретно вашу задачу лучше решать разобравшись как настраивать вот этот пакет:
    https://github.com/moneyphp/money
    Ответ написан
    6 комментариев
  • Как сделать онлайн-расчет через API ТК Энергия?

    New_Horizons
    @New_Horizons
    Бред:
    В элементе items массива забыл ещё одни квадратные скобки
    Ответ написан
    1 комментарий
  • Golang подходит ли для создания сайтов?

    @MadridianFox
    Web-программист, многостаночник
    1) Go компилируемый, само собой скорость выше, но если вы на маленьком сайте упираетесь в скорость исполнения кода, то проблема скорее в коде, и выбор более быстрого языка избавит вас только от симптома, но не от болезни
    2) на seo влияет только то ЧТО вы отдаёте пауку. Не важно на каком языке пишется программа, которая отдаёт html
    3) Программа написанная на go сама работает как сервер. Более того, это не какой-то сервер приложений, как например tomcat, нет, вы сами будете писать цикл обработки входящих соединений - т.е. вам необходимо этот самый серер реализовать. В отличие от php+apache, где в качестве сервера выступает apache, который при необходимости вызывает php. Ставить ли apache или nginx перед go сервером вы решаете сами.
    4) Поддерживает. На скорость работы СУБД не влияет то, на каком языке написана программа, которая к ней обращается.
    5) Фреймворков уровня Yii2 или Symfony не наблюдается. Ситуация такая же как и с NodeJS - что-то есть, но комбайнов нет.
    6) Если что-то может слушать соккет - на этом можно написать сайт. Любой. Другое дело, что сайты визитки на Go не пишут (только ради забавы), а крупные сайты вообще имеют сложную архитектуру, такую что язык уже не имеет значения.
    7) Для php разработчика - да. Как минимум вы меняете скриптовый язык на компилируемый. Это значит что любое изменение кода требует компиляции, остановки работающего сервера, загрузки бинарника на его место и запуск. Кроме того вы меняете Stateless модель работы кода на полноценно работающую программу. Если на php у вас скрипт запускался заново при каждом http запросе, то программа на go запускается один раз и после этого принимает множество запросов.
    Ответ написан
    10 комментариев
  • Могу ли я заниматься коммерческой разработкой (backend с php) на Windows 10?

    @ArduinoFlow
    FullStack разработчик.
    Почему то у меня таких глупых вопросов не было. Тупо сел и учил, узнал что сервера на линукс, снёс на фиг винду поставил линукс, 2 недели со слезами поразберался. Если честно пока учился, да в мыслях не была "а дайка я задам вопрос, может что то мне не надо знать". Я считаю знать Linux обязательно.
    Ответ написан
    1 комментарий
  • Какой лучший бесплатный CRUD генератор для Laravel?

    @lolrofl01
    Сколько не брал разные готовые решения - все равно приходилось разбираться что к чему, читать доку, часть переписывать. Лично я не увидел какой-то большой экономии времени по сравнению с самостоятельным написанием. Если часто пишете админки, то зачем каждый раз писать разное? Суть то одна, возьмите crud из предыдущей админки.
    Ответ написан
    1 комментарий
  • Как по уму организовать собственную легальную систему E-mail рассылки ?

    @impass
    Основной вопрос который волнует — как это реализуют на обычных shared хостингах, у которых стоят ограничения на отправку писем за раз, за час

    Арендуйте VDS или выделенный сервер. Установите собственный MTA и рассылайте сколько влезет, если получатели не забанят. :)

    как не нарваться на блокировку как спам рассылки

    От особо тупых фильтров спасает добавление какого-то рандомного текста к письмам, чтобы они не были совсем идентичны. Но в целом нет никакой гарантии, что ваша рассылка, отправленная 100 пользователям с ящиками на одном и то же сервисе, не будет расценена как спам.
    В идеале, безусловно, свой домен и MTA на отдельном сервере ближе к телу + прикрутить SPF и/или DomainKeys.
    Ответ написан
    Комментировать
  • Как по уму организовать собственную легальную систему E-mail рассылки ?

    greyhard
    @greyhard
    Программист, автолюбитель
    Для рассылки 300 000 писем в сутки со свежими предложениями по клиентской базе я сделал так:

    Взял сервер с большим безлимитным каналом и выделенным айпи.
    Зарегестрировал отдельный домен.

    Добавил записи в TXT PRT где указал доверенные айпи для домена и обратную зону что бы по айпи выдавался адрес сервера.
    В качестве рассылщика заменил Sendmail на Exim.

    Дальше начинаю отправку и смотрю логи Exim.
    Не существующие аккаунты удаляю из базы.

    Если у вас все красиво и правильно (не спам) то кнопочки пожаловаться на спам не сразу зарабатают… только если реально куча народу пожалуется… (но вы же не шлете тем кто не просил? тогда с чего им жаловаться ).

    Контролировать успешность доставки недоставки можно так же по логам почтового сервера там же и вся онформация по отклонению блокировке ) и там же вы увидите сообщения от почтовых систем что делать если письмо отклонено как спам.
    Ответ написан
    Комментировать
  • Как поставить права на папку /var/www?

    Endru9
    @Endru9
    Админ Linux
    Давать файлам права на исполнение потенциально опасно.
    Все директории должны иметь права 775, а файлы 664, поэтому:
    find /var/www/ -type d -exec chmod 755 {} \;
    find /var/www/ -type f -exec chmod 644 {} \;

    иначе привет от shell
    Ответ написан
    2 комментария
  • Микросервисная архитектура: насколько микро? и почему не возникает проблем с долгим ожиданием?

    sergey-gornostaev
    @sergey-gornostaev
    Седой и строгий
    Вы задаётесь очень сложными вопросами, развёрнутый ответ на каждый из которых вряд ли влезет в лимит символов ресурса. Чтобы разобраться с первой проблемой, стоит прочитать "Предметно-ориентированное проектирование" Эванса. Грубо говоря, микросервис должен оперировать небольшим самостоятельным подмножеством данных. Для поиска ответов на вторую и третью проблему хорошим стартом может быть "Высоконагруженные приложения" Клепмана. Да, взаимодействие внутри микросервисной системы очевидно медленнее, чем вызовы внутри монолита, у всего есть цена. Но при правильно написанном коде, правильно выбранной архитектуре и правильно построенной инфраструктуре скорость всё ещё достаточно, чтобы отвечать на запросы за доли секунды. А для согласованности приходится применять подходы вроде паттерна "сага".
    Ответ написан
    Комментировать
  • Как на лету поменять название скачиваемого файла?

    berezuev
    @berezuev
    #define TRUE FALSE
    <a href="http://test.ru/upload/10-testoviy-file.doc" download="10 тестовый файл.doc">10 тестовый файл</a>
    Ответ написан
    1 комментарий
  • Как можно обновлять div не перезагружая страницу целиком?

    ThunderCat
    @ThunderCat Куратор тега PHP
    {PHP, MySql, HTML, JS, CSS} developer
    1) Каждую секунду обновлять данные - плохо, рано или поздно это приведет к неоправдано высокой нагрузке сервера.
    2) По уму на такие задачи поднимают сокет, и при изменении на сервере рассылают в нужные сокеты изменившуюся информацию.
    3) Как простой вариант - по setInterval() запускайте аякс запрос и полученные данные выводите в нужный див.
    Ответ написан
    Комментировать
  • Корзина интернет-магазина: данные в cookies, или в базе

    Bartez
    @Bartez
    Раньше было принято хранить корзину в куках.
    Сейчас хорошей практикой является хранение корзины в БД.

    Преимущества хранения в БД:
    1) Корзина может храниться сколько угодно долго.
    2) Корзина не теряется, если покупатель зашёл с другого браузера/компьютера.
    Ответ написан
    2 комментария
  • Как правильно написать метод модели с динамическими полями?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Вопрос очень хороший. И код в целом неплохой. А ошибки совершенно стандартные, их делают все.

    Начнем с того, что это никакая не модель.
    Модель - это вся бизнес-логика приложения.
    А это примитивный класс для манипуляции одной таблицей в базе данных. Подходит под паттерн TableGateway

    Причем никакие преимущества ООП в нем не используются.
    Этот класс - тупо набор функций. Причем для следующей таблицы придется писать точно такой же.

    Соответственно, сначала надо сделать код универсальным, и вынести в абстрактный класс.
    Заодно исправив в нём одну критическую ошибку (с безопасностью) и одну логическую.
    Что будет, если значения двух последних элементов массива совпадут? Тогда уж надо ключи сравнивать, а не значения.
    И зачем вообще такие ухищрения с поиском последнего элемента, если у тебя есть переменная $fields? Если она пустая - значит это первый оборот цикла. Всё, этого достаточно

    По поводу безопасности я уже устал объяснять.
    Мы старательно защищаем значения, передаваемые в запрос, но при этом не моргнув глазом пропускаем инъекцию через имена полей.
    Список полей всегда надо писать явно. Тем более что это потом пригодится в миллионе случаев.

    abstract class AbstractTableGateway
    {
        protected $db;
        protected $table;
        protected $fields;
        protected $primary = 'id';
    
        public function __construct(DB $db)
        {
            $this->db = $db;
        }
        public function update(array $params): void
        {
            $this->validate($params);
    
            $set = "";
            foreach($params as $key => $value)
            {
                if ($key !== $this->primary)
                    $set .= ($set ? "," : "") . "`$key` = :$key";
                }
            }
            $sql = "UPDATE `$this->table` SET $set WHERE `$this->primary`=:$this->primary";
            $this->db->query($sql, $params);
        }
        protected function validate($data)
        {
            $diff = array_diff(array_keys($data), $this->fields);
            if ($diff) {
                throw new \InvalidArgumentException("Unknown field(s): ". implode(",",$diff));
            }
        }
    }


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

    После этого уже можно создавать класс юзер (и не повторять, как попугай, user user по 10 раз)

    class UserGateway extends AbstractTableGateway {
        protected $table = 'users';
        protected $fields = ['email', 'password', 'name', 'birthday'];
        protected $primary = 'user_id';
    }


    И спокойно к нему обращаться в коде

    $user = new UserGateway();
    $user->update($params);
    Ответ написан