• Правильно ли так организовывать код?

    maksim92
    @maksim92 Куратор тега PHP
    Нашёл решение — пометь вопрос ответом!
    1. Лучше try/catch. Если использовать так, то ваша форма ответа может быть разная в зависимости от сервиса. Сервис выбрасывает ошибку, а в контроллере или промежуточном слое она ловится и форматируется. При этом контроллеры могут быть разные и у каждого свой формат ответа: Web, API, Console
    2. Лучше передавать в сам конструктор и использовать DI.
    3. В методе просто выбрасываете исключение throw new Exeption('Ошибка!'); А в контроллере try/catch.
    4. Пока что нет. Будет только в php8. Метод get должен возвращать ошибку или данные. Метод find должен возвращать null или данные.

    Ответ написан
  • Не могу разобраться с массивом?

    @dzhebrak
    Если я правильно понял вашу задачу, то:

    var o = {'0-1-211': 1, '1-1-290': 2, '2-1-380': 3};
    
    for (var key in o) {
    	console.log(key.split('-')[2]);
    }


    Если же у вас дана строка, а не массив, то:
    var s = '{0-1-211: 1, 1-1-290: 2, 2-1-380: 3}';
    
    s.split(',').forEach(function(v, k, arr) {
    	var vv = v.split(':')[0];
    	console.log(vv.split('-')[2]);
    });
    Ответ написан
  • Что такое end-to-end тестирование?

    pi314
    @pi314
    Президент Солнечной системы и окрестностей
    Понятие еnd-to-end обозначает всего-навсего классификацию тестов по уровню, на котором тестируется система, и, само по себе, ничего не говорит ни о том, какие конкретно должны быть эти тесты, ни о том, какую роль они играют в общей стратегии обеспечения/проверки качества и, также, не является методикой тестирования. (Методика - это совсем другое понятие.)

    Для понимания сути этого понятия хорошо сравнить его с модульным ("нижний" уровень) и интеграционным ("средний") тестированием на каком-нибудь конкретном примере. Давайте рассмотрим некий сферический webshop в вакууме. Предположим, в нем есть 50 классов и для большинства из них написаны модульные тесты. Они проверяют исключительно функционал конкретного модуля (чаще всего, класса), т.е. тот, что зависит только от самого модуля и ни от чего чего более. Потом есть интеграционные тесты. Они проверяют корректность работы отдельных "модулей", если их собрать вместе согласно архитектурe. Например, работает ли правильно "Корзина", состоящая, в свою очередь, из 10 классов (предварительно проверенных модульными тестами), или "Корзина", подключенная к "Вебморде" и т.д. Где-то повыше в этой иерархии есть такие интеграционные тесты, которые проверяют конкретный функционал всей системы. Например, отправляется ли юзеру мейлом копия оплаченного заказа...

    И вот тут начинается самое интересное для понимания того, что такое end-to-end тестирование! Можно представить себе тест, проверяющий, что соответствующий мейл генерируется и сбрасывается SMTP серверу. Если SMTP сервер не рассматривать, как часть разрабатываемой системы, то этот тест вполне можно назвать end-to-end тестом (послали кучку HTTP запросов через "Вебморду" и проверили сброс мыла на SMTP - все зашибись!). Однако, если настройки и эксплуатация SMTP сервера - часть проекта (например, заказана разработка webshop "под ключ"), может оказаться, что это мыло будет отфильтровано каким-нибудь спам-фильтром, превысит лимит почтового ящика пользователя... короче, не дойдет до него. Тогда этот же самый тест уже нельзя считать end-to-end, а нужно бы было написать тест, проверяющий приход мыла в POP3/IMAP ящик. (Опять же, если это действительно нужно! Ибо, в зависимости от конкретных функциональных и нефункциональных требований, архитектор и QA инженер вполне могут найти возможность обеспечить адекватный контроль качества и без такого теста.)

    Таким образом, end-to-end тесты, это такие интеграционные тесты, которые воздействуют на систему через ее самые внешние интерфейсы и проверяют ожидаемую реакцию системы через эти же интерфейсы. Почему именно интеграционные? Потому, что это единственное, что можно о них сказать наверняка: они по определению не могут быть модульными тестами. А все остальное: являются ли они одновременно приемочными, нагрузочными или еще какими - зависит только от общих плана/стратегии тестирования и той роли, которые эти тесты в них играют.
    Ответ написан
  • Зачем что-то передавать в теле гет запроса?

    DevMan
    @DevMan Куратор тега Программирование
    a почему нет?
    техническая возможность для этого есть. кто–то ее использует, кто–то – нет.

    например, в самом запросе передается версия апи, а в теле – данные.
    можно ли так делать? можно.
    нужно ли? имхо, нет.
    Ответ написан
  • Какая есть бесплатная альтернатива Adobe Photoshop для верстальщика?

    HunteR-VRX
    @HunteR-VRX
    Помешанный на развитии
    Здравствуйте.

    1. Figma
    2. Avocode

    Обе программы существуют как для стационарной установки на ОС, так и в рамках облачного использования
    Ответ написан
  • Как правильно выносить данные аналитики в отдельное хранилище?

    inoise
    @inoise
    Solution Architect, AWS Certified, Serverless
    Ну, проблема в концептуальном не понимании что такое аналитика и Warehouse или Data Lake.
    Во-первых давайте определимся чем аналитика отличается от метрик, агрегатов и отчетов.
    • Аналитику делают люди, не регулярно, скорость для них не важна
    • Отчеты происходят автоматически на регулярной основе. Для них важна периодичность
    • Метрики нужны чтобы что-то измерять во временном ряду
    • Агрегаты - сбор данных из разных источников вне зависимости от остальных факторов


    Если мы все еще говорим про аналитику то она не должна обращаться к живым данным вообще. Ее складывают в отдельный Warehouse или Data Lake и анализируют по необходимости. Основными инструментами являются Power BI, Tableau или даже пресловутый Excel.

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

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

    ivinnic
    @ivinnic
    Full-Stack developer
    Добрый день

    Написал два скрипта с замером времени поиска.

    Search by object
    let obj = {}
    
    for(let i =0; i<1000; i++){
        obj['i'+i]=i
    }
    
    console.time('time')
    for(let i =0; i<1000; i++){
    const objResult = obj['i'+i];
    }
    console.timeEnd('time')


    time: 0.156982421875ms

    Search by array
    let obj = []
    
    for(let i =0; i<1000; i++){
        obj.push('i'+i)
    }
    
    console.time('time')
    
    for(let i =0; i<1000; i++){
        const arrResult = obj.find(el => el === 'i'+i);
    }
    console.timeEnd('time')


    time: 32.946044921875ms

    Время конечно может отличатся, но в целом видится что поиск по массиву работаем медленнее обращения по ключу, по крайне мере в промышленном масштабе.
    Ответ написан
  • Правильно ли использовать UTC везде на сервере?

    Sanes
    @Sanes
    !
    Правильно. Часовые пояса лучше регулировать в конечном приложении.
    Я везде выставил UTC, кроме приложения. Так проще оказалось.
    Timezone при отредактированном формате в моделе Laravel?
    Ответ написан
  • Кому принадлежат домены и как они делятся?

    CityCat4
    @CityCat4
    Если я чешу в затылке - не беда!
    Все довольно просто.

    Есть ICANN - Internet Corporation for Assigned Names and Numbers - Корпорация по управлению доменными именами и IP-адресами. Она управляет доменной зоной "." ("точка"), то есть всем пространством имен Интернет.
    В ICANN можно купить право создания и управления TLD (Top Level Domain - домен верхнего уровня). Почему я так подчеркнул слово "купить"? Потому что полученное будет иметь все свойства товара - с ним можно делать все, что угодно, в частности устанавливать любые, какие только вздумается правила регистрации имен в данной зоне.
    Несмотря на то, что купить можно не все TLD - часть зарезервирована под географические зоны, некоторые "хорошие" геозоны все равно можно использовать - кого, например, заинтересует мнение каких-то там Кокосовых Островов (.cc) или Тувалу (.tv)?
    Владелец зоны создает контору по технической регистрации имен. Технический регистратор - один. И именно он вносит изменения в базу. Заявки от конечных клиентов он обычно не принимает, продавая право на это другим конторам, их обычно тоже называют регистраторами, что создает преизрядную путаницу. На самом деле ничего они не регистрируют, они только подают заявки настоящему регистратору.
    Конечные регистраторы продают аренду доменного имени. Это важно. Вы не ПОКУПАЕТЕ имя (то есть оно не имеет свойств товара - Вы не можете его продать, обменять, подарить), Вы его АРЕНДУЕТЕ. Именно поэтому регистратор всегда может этот договор расторгнуть, если посчитает нужным.
    А условия договора аренды - целиком и полностью определяет регистратор, он тут ничем не ограничен. Он обязан платить некую сумму "настоящему" регистратору, а все что намутил - оставляет себе. Примерно, как таксист-частник, работающий под маркой таксопарка :)
    Обычно, когда говорят про домены, подразумевают, что все помнят, что домен купить нельзя, речь идет про аренду и специально этот факт не упоминают.
    Цена регистрации, цена продления и то, почему домен gabbagabbahey.cc будет стоить существенно меньше чем sex.com - определяется исключительно коньюнктурой рынка. На самом деле и то имя и другое не стоит ничего,, и если бы вдруг все люди перестали трахаться и стали фанатами игры Descent - соотношение бы изменилось :)
    Вы и сами можете стать регистратором и гнуть какие хотите цены. Заключаете договор с "настоящим" регистратором - и вперед.
    Иногда спрашивают - как завести свою зону. Обычному человеку как правило - никак. На хабре есть статья, как Яндекс заводил TLD .yandex - это им обошлось примерно в $200000 и год переписки с ICANN.
    Ответ написан
  • Как в новом PhpStorm добавить файлы в гит?

    Andrew_Pinkerton
    @Andrew_Pinkerton
    Backend-разработчик
    Я сейчас проверил у себя в PhpStorm2019.3, такого не происходит.
    Т.е. при нажатии ctrl+alt+a появляется диалог:
    5e1d2165c61e2581319374.png
    и вот тут нужно нажать cancel, тогда файлы из .gitignore не добавляются.
    Ответ написан
  • Как отслеживать, что пользователь подписался на страницу в соцсети?

    Andrew_Pinkerton
    @Andrew_Pinkerton
    Backend-разработчик
    Есть метод VK API groups.getMembers С помощью него получаем массив идентификаторов пользователей, ищем там нужного пользователя (предполагается что мы знаем кто должен был подписаться), далее в зависимости от того подписан пользователь или нет выполняем определенные действия. 5e00c85f36c7c668150887.png

    Еще есть метод groups.get тут мы получаем список сообществ указанного пользователя. Думаю тут ты догадаешься сам как его использовать ) 5e00c86680f9c502676552.png

    + Есть Callback API
    Позволяет получать данные о различных событиях в группе.
    Ответ написан
  • Как установить лимит на выполнение запроса в цикле PHP?

    Sanasol
    @Sanasol Куратор тега PHP
    нельзя просто так взять и загуглить ошибку
    $ctx = stream_context_create(array('http'=>
        array(
            'timeout' => 10,  // Seconds
        )
    ));
    
    echo file_get_contents('http://example.com/', false, $ctx);
    Ответ написан
  • Как собрать приложение JS приложение с помощью Electron вместе с БД?

    MvcBox
    @MvcBox
    Back-end developer
    Код для Electron.js приложений после билда хранится в asar архиве.
    Вы не должны упаковывать свою базу в этот архив.
    Базу можно создавать, к примеру, рядом с исполняемым файлом приложения.
    Удалите db.sqlite3 из списка files, а в своем приложении укажите следующий путь к базе:
    `${process.execPath}/db.sqlite3`
    Ответ написан
  • Какой язык программирования для Back-end производительнее?

    @FanatPHP
    Чебуратор тега PHP
    Ну да, ну да.
    Википедия, фейсбук, порнхаб - все эти сайты жутко лагают и вообще лежат не поднимаясь.
    А наш диванный специалист по социальным сетям, который и гостевую-то написать не может не запутавшись в двух строчках, вещает про зашквар и проблемы с производительностью.

    Ничего в мире не меняется, Моцарту тоже приходилось отвечать на подобные вопросы.
    Ответ написан
  • Какой язык программирования для Back-end производительнее?

    DevMan
    @DevMan
    вы любитель сравнивать теплое с мягким?
    мне кажется, что писать что-то крупное на PHP сегодня "зашквар", и дело даже не в моде, а в производительности.
    среди интерпретируемых языков у пыха, сюрпиз-сюрпиз, скорость на высоте.
    а теперь или трусы оденьте, или крестик снимите определитесь что вам нужно: скорость выполнения или скорость разработки.
    кстати, открою вам секрет: на многих проектах используют несколько языков.
    Ответ написан
  • Можно ли получить 3-НДФЛ, работая неофициально?

    megafax
    @megafax
    web-программист
    Вы можете только задекларировать доходы за 18 и 19й год, заплатить штраф (и немаленький), избежать уголовного/административного преследования и тогда честно получить нужную Вам 3-НДФЛ.
    В противном случае - уточните в нужном ведомстве, устроит ли их справка с банка о наличии именно на Вашем счете нужной суммы (обычно это подтверждение доходов), но никто Вам не запрещает получать поддержку от родственников из-за рубежа вполне легальным способом. Но никогда не рассказывайте что Вы работаете неофициально - так Вы не только себя подставляете, а еще и своего работодателя и косвенно коллег (если работодателя посадят)
    Ответ написан
  • Правильно ли всегда использовать npm ci вместо npm install?

    Lynn
    @Lynn
    nginx, js, css
    На сервере однозначно правильно.
    https://docs.npmjs.com/cli/ci.html

    This command is similar to npm-install, except it’s meant to be used in automated environments such as test platforms, continuous integration, and deployment [...]


    Более того, я и в разработке использую её, кроме случаев когда надо явно что-то обновить.
    Ответ написан
  • Как выбрать динамик на телефоне с помощью JavaScript?

    dantothefuture
    @dantothefuture
    You sleep, she sleeps, they sleep, I... don't.
    Чисто теоретически это возможно через enumerateDevices() и дальнейшее использование deviceId в setSinkId(), но на практике работает не везде. У меня, например, в последнем Chrome for Android только одно устройство вывода в списке. Вот статья на тему.
    Ответ написан
  • Как организовать социальную аутентификацию через Socialite(Laravel)+JWTAuth+Vue.js без редиректа с API-сервера?

    Работает у меня такая схема и в Ionic и в NativeScript.
    В общем схема везде одинаковая.
    Ionic:
    На Laravel нужен Socialite, на клиенте что-то в соответствии с фреймворком. Я использовал ng2-ui-auth. Еще вам нужно установить плагин InAppBrowser.
    Последовательность такая:
    1. В своем приложении вы жмете на кнопку "Войти через GitHub"
    2. Открывается InAppBrowser окно входа GitHub (в урле передается clientId вашего приложения и redirectUri, за это отвечает ng2-ui-auth).
    2а. Обратите внимание что redirectUri из запроса должен быть идентичен Authorization callback URL в настройках вашего приложения на сайте GitHub (Settings / Developer settings / OAuth Apps) и в случае Cordova должен быть равен "localhost:3000".
    3. GitHub авторизирует вас по логину/паролю, спросит разрешения передавать данные Приложению и редиректит страницу на redirectUri добавляя к нему токен.
    4. ng2-ui-auth перехватывает обращение к localhost:3000 (это делается с помощью JS, тут нет никакого локального сервера), достает токен и пересылает его на конечный url (указывается для каждого провайдера в настройках ng2-ui-auth).
    4а. Вот этот конечный url должен быть адресом вашего backend'а, а именно метода, который с помощью Socialite будет запрашивать данные пользователя у GitHub.
    5. С помощь Socialite вы получаете данные о пользователе у GitHub. Создаете пользователя в Laravel, если его нет, и делаете любые другие необходимы действия.
    6. Используя данные пользователя с помощью jwt-auth создаете jwt-токен и возвращаете его клиенту (в пункт 4).
    7. На клиенте запоминаете jwt-токен и тот факт, что пользователь аутентифицирован. Из ответа можете достать email (если вы его передали) и где-нибудь отобразить.
    Все!

    С NativeScript все абсолютно аналогично (там на клиенте я использую nativescript-oauth2) за исключением одного: в NS нет webview, поэтому перехват redirectUri выглядит по-другому:
    1. В Authorization callback URL на GitHub вы пишите что-то вроде blablabla://auth (вместо blablabla какая-то длинная уникальная строка - urlScheme).
    2. Эта urlScheme также пописывается в настройках nativescript-oauth2 и в App_Resources/Android/src/main/AndroidManifest.xml в виде intent-filter
    <intent-filter>
        <action android:name="android.intent.action.VIEW" />
        <category android:name="android.intent.category.DEFAULT" />
        <category android:name="android.intent.category.BROWSABLE" />
        <data android:scheme="blablabla" />
    </intent-filter>

    Приложение перехватывает обращение к этой уникальной urlScheme и дальше все продолжается согласно списка.
    Ответ написан
  • Как сделать авторизацию между двумя api?

    Wolfnsex
    @Wolfnsex Куратор тега Веб-разработка
    Если не хочешь быть первым - не вставай в очередь!
    2. Передавать какой-то секретный ключ с сервера АПИ и проверять его на сервере статистики. Этот вариант мне кажется наиболее удобным, но в каком виде его хранить и как передавать?
    Видится мне, что это самый разумный вариант. Список адресов - не слишком надёжен и не особо логичен.

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