• Можно ли на React Native / Flutter реализовать call overlay?

    RomReed
    @RomReed
    JavaScript, Flutter, ReactNative, Redux, Firebase
    когда то занимался таким проектом и результат был, https://github.com/tariq86/rn-sip-app использовал этот репозиторий за основу. react-native-callkit это для отображения звонка. проект удалось довести до состояния работает через раз. было видно что и сам код старый и лучше данный проект писать нативно на андройд и ios. что касается flutter пока не удалось попробовать свои силы в данном направлении.
    Ответ написан
    Комментировать
  • Как дождаться выполнения dispatch'а с передачей в него async action в redux?

    rockon404
    @rockon404 Куратор тега React
    Frontend Developer
    Если вы хотите дождаться выполнения асинхронных вызовов в асинхронных функциях, то их надо делать с использованием ключевого слова await. Вызовы dispatch с передачей обычных объектов действий выполняются синхронно.
    const someCall = () => async dispatch() => {
      dispatch({type: Constant.SOME_OPERATION_1});
      await dispatch(createAccount());
      dispatch({type: Constant.SOME_OPERATION_2});
    };

    export const createAccount = () => async (dispatch) => {
      await request api;
      dispatch({type: SMTH});
      await another request api;
      dispatch({type: SMTH2});
    }


    Так же для обработки неудачных ответов сервера можно использовать try/catch:
    export const createAccount = () => async (dispatch) => {
      try {
        await request api;
        dispatch({type: SMTH});
        await another request api;
        dispatch({type: SMTH2});
      catch (e) {
        // handle error here
      }
    }
    Ответ написан
    2 комментария
  • Best practices: регистрация на основе номера телефона в мобильной разработке (как)?

    @azShoo
    Если максимально упрощенно:
    1) Проверяем уникальность телефона
    2) Подтверждаем владение телефоном
    3) Выписываем Auth-Token сохраняемый в приложении и в любом хранилище.
    4) Следим за актуальностью Auth-Token: при разлогине удаляем из хранилища, при окончании срока жизни - тоже.
    5) При старте приложения и последующих коммуникациях сервер-клиент-сервер шлем и валидируем AuthToken.
    Ответ написан
    2 комментария
  • Best practices: регистрация на основе номера телефона в мобильной разработке (как)?

    Чаще всего делается схема refresh token + access token, т.к. она является легко масштабируемой.
    1. Пользователь авторизуется на сервере авторизации по телефону, приложение получает refresh token (постоянно действующий), постоянно хранит этот токен безопасным способом.
    2. При старте приложения и с некоторой регулярностью (например раз в 10 минут) или при необходимости обращения к определенному API фронт-сервера, приложением дергается API сервера авторизации с refresh token и получается access token, короткоживущий (например 15 минут). access token может быть некоторой информацией - id пользователя, timestamp, запрошенный тип сервиса и т.п. - подписанной (или зашифрованной) ключом сервера авторизации.
    3. Приложение обращается к API front-серверов с access token, фронт-сервер валидирует токен
    4. При разлогине (или смене пароля если он будет) инвалидируется refresh token. access token'ы "протухают" самоходом в течении интервала жизни.

    Это дает:
    1. совместимость с OAuth, можно использовать вход через сторонние сервисы и наоборот предоставлять им возможность что-то делать за пользователя.
    2. централизованную авторизацию пользователя и управление сессиями (все токены раздаются сервером авторизации)
    3. возможность завершения сессии на стороне сервера (сервер авторизации инвалидирует refresh token)
    4. возможность централизовано давать или не давать доступ к отдельным концам API или серверам (через включения типа сервиса в сессионный токен, для каждого API или сервиса можно запрашивать разные токены, которые будут действительны только для них). Так же можно разделить зоны безопасности, например запрашивать отдельный токен для обращения к менее защищенным сервисам, который не даст доступа к более привилегированным сервисам.
    5. фронт-серверам не требуется проверять каждый запрос на сервере авторизации, они самостоятельно могут проверить правильность таймстампа/подписи и соответсвтие типа токена запросу.

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

    P.S.
    иногда схема усложняется до refresh_token (постоянный) + session_token (временный) + access_token (на доступ к кокретной ручке или сервису)
    Ответ написан
    Комментировать
  • Как прописать поворот текстуры в Unity-шейдере?

    BasmanovDaniil
    @BasmanovDaniil
    Геймдизайнер-телепат
    Для вашей проблемы есть несколько решений. Самое простое - добавить в атлас три повёрнутых картинки травы и использовать их в кисти, которая рисует случайными тайлами. Так вы в будущем сможете перерисовать графику без пересборки карты и вам не придётся поддерживать специальные шейдеры или руками вращать что-то на сцене.

    Второе по простоте решение - воспользоваться возможностями Tiled и вращать тайлы там, Tiled это умеет, Tiled2Unity тоже, скорее всего.

    Если же прям сильно хотите шейдером, то можно, например, с помощью двух флагов поворачивать uv во все четыре стороны.
    Custom/RotationExample
    Shader "Custom/RotationExample"
    {
        Properties
        {
            _MainTex("Texture", 2D) = "white" {}
    
            // Волшебные свойства для инспектора
            [Toggle] _RotateCW90("Rotate Clockwise 90", Float) = 0.0
            [Toggle] _Rotate180("Rotate 180", Float) = 0.0
            ////////////////////////////////////
        }
        SubShader
        {
            Tags { "RenderType"="Opaque" "PreviewType" = "Plane" }
            LOD 100
    
            Pass
            {
                CGPROGRAM
                #pragma vertex vert
                #pragma fragment frag
    
                // Флаги для компиляции нескольких вариантов шейдера
                #pragma multi_compile __ _ROTATECW90_ON
                #pragma multi_compile __ _ROTATE180_ON
                ////////////////////////////////////////////////////
                
                #include "UnityCG.cginc"
    
                struct appdata
                {
                    float4 vertex : POSITION;
                    float2 uv : TEXCOORD0;
                };
    
                struct v2f
                {
                    float4 vertex : SV_POSITION;
                    float2 uv : TEXCOORD0;
                };
    
                sampler2D _MainTex;
                float4 _MainTex_ST;
                
                v2f vert (appdata v)
                {
                    v2f o;
                    o.vertex = UnityObjectToClipPos(v.vertex);
                    o.uv = TRANSFORM_TEX(v.uv, _MainTex);
                    return o;
                }
                
                fixed4 frag (v2f i) : SV_Target
                {
    
                    // Собственно код вращения uv
    #if _ROTATECW90_ON
                    i.uv = float2(1 - i.uv.y, i.uv.x);
    #endif
    #if _ROTATE180_ON
                    i.uv = float2(1 - i.uv.x, 1 - i.uv.y);
    #endif
                    /////////////////////////////
    
                    fixed4 color = tex2D(_MainTex, i.uv);
                    return color;
                }
                ENDCG
            }
        }
    }

    Я комментариями пометил три важных кусочка, которые можно засунуть в любой шейдер для вращения текстуры. Код выше работает только для квадов с простейшей квадратной uv-картой, растянутой на весь диапазон от нуля до единицы, для атласов надо придумывать другое решение. Ну и не забывайте, что эти флаги надо будет как-то выставлять.
    Ответ написан
    4 комментария
  • PHP. Как сделать цикл выполнения до стоп слова?

    rammtw
    @rammtw
    Press CTRL+S to save project
    while($g !== 'EXIT') {
     // do something...
    }

    или
    while(условие) {
     // do something...
        if ($g === 'EXIT') {
            break;  
        }
    }

    Вместо while, может быть любой цикл (for, foreach)
    Ответ написан
    1 комментарий
  • Пакетный менеджер для Unity, какой и как использовать?

    Griboks
    @Griboks Куратор тега C#
    Во-первых, вам надо смириться с мыслью, что в шарпе нет пакетов, а есть библиотеки (*.dll), которые, чаще всего, нельзя просматривать и редактировать.
    Во-вторых, с юнити вообще отдельная история. Либо качаете *.unitypackage (например, из того же asset store), который инкапсулирует всевозможные ассеты, либо подключаете те самые библиотеки (обязательно посмотрев соответствующий раздел документации).
    Так же важно знать, что в юнити используется старый шарп (вроде бы 4).
    Ответ написан
    Комментировать
  • Пакетный менеджер для Unity, какой и как использовать?

    BasmanovDaniil
    @BasmanovDaniil
    Геймдизайнер-телепат
    В основном плагины для юнити устанавливают из Asset Store, реже из GitHub и NuGet. Юнити умеет работать с dll, для этого есть специальный инспектор. Подключать их из своего кода можно точно так же как и обычный код, разве что их нельзя редактировать. Если вы смогли дотащить dll до своего проекта, и в консоли нет ошибок, то, скорее всего, библиотека установилась нормально. Ошибки ещё могут вылезти при сборке под мобильные платформы. Подробнее про плагины можно почитать в мануале.
    Ответ написан
    Комментировать
  • Как работает на низком уровне Node.js и Angular?

    @cluberr
    думаю это Вам поможет Объясняем современный JavaScript динозавру
    Как объяснить 10 лет веб-разработки путешественник...
    NodeJs - это движок для JavaScript , который вынесли из браузера и добавили возможности , которые в браузерном JS были невозможны из-за безопасности , например работа с файловой системой и другие. Сам движок NODEJS называется V8 , написан на C++ и компилит JS в машинный код.

    Вебсервер - это процесс который слушает определенный порт на HTTP запросы , принимает их , парсит и отдает назад ответ в зависимости от запроса. Раньше в этот ответ помещался готовый html код c данными , которые подтягивались из базы, что и было страницей.

    Так как появилась возможность делать JS код вне браузера , то взяли и написали на нем веб-сервер , который все делает на JS . Что дало возможность написать и фронт и бэк сайта на одном языке

    Сейчас же при запросе к серверу , сервер отдает сразу HTML код страницы с JS кодом и из этого js кода посылаются асинхронные запросы к бекенду (AJAX) на определенные url адреса сервера RESTip , которые отдают не готовые страницы , а только данные в чистом виде в формате JSON и JS парсит эти данные и вставляет в стандартные html узлы или же кастомные , которые зовутся WebComponets, но пока имеют слабую поддержку браузеров , страницы. Angular упрощает написание кастомных html узлов и внедрение в них данных плюс позволяет их реиспользовать.

    Получается что у Вас может один раз прийти html + js код и потом вся работа с сайтом будет идти через одну страницу в которую javascript будет вставлять нужные данные, а при необходимости еще и обрабатывать их перед вставкой. Сайты , которые так работают называются SPA (Single Page Aplication).
    Ответ написан
    Комментировать
  • Как разместить запрос к базе данных PDO внутри функции на PHP?

    DevMan
    @DevMan
    так $pdo у вас в функции не определена, о чем вам английским по белому и говорится.
    попробуйте для начала первой строкой в функции написать
    global $pdo;

    да, это плохо, но учить вас хорошему у меня нет сил.
    Ответ написан
    8 комментариев
  • Как можно на php файл в кодировке utf8 with bom преобразовать в without bom?

    nazarpc
    @nazarpc
    Open Source enthusiast
    function without_bom ($text) {
        if (substr($text, 0, 3) == "\xEF\xBB\xBF") {
            return substr($text, 3);
        }
        return $text;
    }

    https://en.wikipedia.org/wiki/Byte_order_mark
    Ответ написан
    2 комментария
  • Говно-код с использованием MVC фреймворков?

    RomaZveR
    @RomaZveR
    CEO AlertMoney, PHP/Golang Developer
    Говнокодят все, а кто утверждает обратное - говнокодит ещё больше.
    Ответ написан
    1 комментарий
  • Как коллективно работать с bitbucket?

    v_decadence
    @v_decadence
    На Битбакете нельзя сделать SSH-ключ с Write-доступом.
    Нужно добавить пользователя в управлении доступом.
    После этого он сможет пушить, указывая СВОЙ логин / пароль.
    Но есть ограничение в 5 пользователей (не помню - на один репозиторий или на все в сумме).
    Ответ написан
  • Как сделать обязательным email у oAuth провайдеров?

    @askarik
    веб-разработчик
    как раз недавно работал с этим
    решение есть, просто кода много будет если я его выложу здесь
    опишу всё так, если не понятно спросите, отвечу

    в общем facebook: да, здесь есть такая ерунда, что сама социалка позволяет убрать галочку пользователю, но есть АПИ метод, который может узнать, какие права дал нам этот пользователь а именно
    /me/permissions?access_token=
    если в ответе от АПИ, в массиве для email status == decline - то нет прав, если granted - то есть
    если нет, можно запросить доступ к email заново
    header("HTTP/1.1 302 Found");
    header(
    'Location: '.$cfg['urls']['authorize_endpoint'].
    'auth_type=rerequest&'.//этот парам. указывает что надо сделать перезапрос доступа к email пользователя (не получится отказать в доступе к email)
    'client_id='.$cfg['client_id'].'&'.
    'response_type='.$cfg['response_type'].'&'.
    'state='.$cfg['state'].'&'.
    'scope='.$cfg['scope'].'&'.
    'redirect_uri='.$cfg['urls']['redirect_uri']);


    тут то уже пользователь не сможет галочку снять, либо ОК либо ОТМЕНА

    что касается ВК:
    тоже всё легко, используй OAuth 2.0
    header("HTTP/1.1 302 Found");
    header(
    'Location: '.$cfg['urls']['authorize_endpoint'].
    'client_id='.$cfg['client_id'].'&'.
    'response_type='.$cfg['response_type'].'&'.
    'scope=email&'.//вот оно то место, где ты запрашиваешь email
    'v='.$cfg['v'].'&'.
    'redirect_uri='.$cfg['urls']['redirect_uri']);

    если используешь OAuth 2.0, там галочку для email снять нельзя
    Ответ написан
    5 комментариев
  • Backbone, функция extend и ее работа?

    fornit1917
    @fornit1917
    В яваскрипте функция это тоже объект, с ней можно делать те же операции, что и с другими объектами
    Ответ написан
    4 комментария
  • Хочу изучать Yii, но есть вопросы…?

    HighQuality
    @HighQuality
    ☁ Ниндзя девелопер
    Каркаса по-большому счету нет. То что видим после webapp это пример того, как всё может быть реализовано.
    По-большому счету каркас — это изначальная структура папок, которая может быть легко изменена, если лезть под капот.
    После webapp удаляем всё из protected/controllers, protected/models, protected/views, protected/data и… вроде всё, но я не уверен.

    И вот перед нами чистая версия над которой и стоит работать дальше.

    Как работать? Изначального разделения для функционала фронт и бек -ендов нет, но это можно исправить (или придумать/украсть свой план на основне стандартный modules).

    Генерация кода будет работать против Вас до тех пор пока всё что генерирует генератор не будет кристально ясно. Когда это случится можно будет исправить templates генератора (или добавить свой) и превратить рутинные вещи в ничего и заниматься чем-то действительно клёвым.

    Насколько гибок фреймворк? Примеры такие просто реализуются в любом современном фреймворке.

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

    Yii — достойный вариант… и для переписывания своей cms уж тем более.

    Конечно же изучать стоит с документации и есть будут вопросы, то сразу на форум.
    Ответ написан
    Комментировать
  • Посоветуйте тяжелую CMS на PHP

    AmdY
    @AmdY
    PHP и прочие вебштучки
    Битрикс, Друпал, Мажента, ну и большинство магазинов с большими каталогами. Собственно, проблема же не в php, а в торадже, много данных расскиданых по разным таблицам, вот и тормоза. Этим тсрадает любая универсальная и гибкая система на любом языке. Спасают лишь денормализация и кэширование, плюс бутылочные горлышки которые сильно зависят от проекта.
    Ответ написан
    Комментировать
  • Посоветуйте тяжелую CMS на PHP

    @egorinsk
    Друпал + любые плагины к нему
    Ответ написан
    Комментировать
  • Git сообщает что файлы были изменены даже после git reset --hard

    eigrad
    @eigrad
    Python-разработчик / Linux-админ
    Комментировать