• Почему не получается создать собственную игру?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    Для начала нужно определиться с целью игры.

    Зачем вы делаете игру?

    Если для того, чтобы потренироваться или просто пощупать геймдев, то, возможно, цель УЖЕ достигнута. Если же для того, чтобы игра принесла денег, то с изложенным вами бекграундом вам до этой цели, как до луны. В приносящей деньги мобильной игре программирования дай бог 20%.

    Пользуясь интуицией, могу предположить, что ваша цель сделать хоть что-то, чтобы это хоть как-то работало, что-то показывало и имело какой-то функционал. На мобилки это делается примерно в два этапа:
    1. Сделать так, чтобы игра запускалась и работала в Unity.
    2. Опубликовать готовую игру в сторе (Google Play пока для вас проще будет).


    Из вопроса не ясно, на каком этапе у вас затык. Начните с первого этапа. Пустой экран должен у вас запускаться из коробки. То есть нужно просто запустить пустой проект. Дальше нужно разбираться с тем, как работает Unity - что может интерфейс, что предоставляет API и т.д. Тупо копировать чужой код не нужно. Копировать можно только с понимаем, что делает каждая строчка и каждый символ этого кода. То есть чужой код можно рассматривать, как пример. А дальше на его основе делать свой код. И даже если вы вставляете чужой код в свою игру без изменений, вы должны понимать, как он работает, чтобы он заработал именно у вас и не поломал игру, и сам не поломался при интеграции в игру.
    Ответ написан
    2 комментария
  • Как сделать блур заднего фона в unity для мобильной игры?

    mopsicus
    @mopsicus
    Когда-то делал так: https://mopsicus.ru/all/unity-blur-effect-2-cameras/
    Но правильно говорят, это достаточно ресурсозатратно
    Ответ написан
    Комментировать
  • Как плавно менять цвет у краев спрайта unity?

    MrMureno
    @MrMureno Куратор тега Unity
    VR for all
    Если кратко - то один из самых адекватный и простых способов - вам нужен градиентный шейдер.
    приблизительно о чем речь почитайте тут
    https://answers.unity.com/questions/913898/horizon...

    управлять параметрами шейдера из кода - тоже труда не составит.
    возможно еще пригодится этот класс ,для задания самого градиента в скрипте.
    https://docs.unity3d.com/ScriptReference/Gradient.html
    Ответ написан
    5 комментариев
  • Как получить размер layout в android?

    thelongrunsmoke
    @thelongrunsmoke
    Программист
    getWidth() и getHeight() получают актуальные значения после подготовки интерфейса к отрисовке.
    Самый простой способ - использовать ViewTreeObserver.
    ViewTreeObserver vto = someView.getViewTreeObserver();
    vto.addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() {
        @Override
        public boolean onPreDraw() {
            someView.getViewTreeObserver().removeOnPreDrawListener(this); // удаляем листенер, иначе уйдём в бесконечный цикл
            <здесь getWidth() и getHeight() уже инициализированы>
            }
    });
    Ответ написан
    1 комментарий
  • Как сделать тень у view, в android api меньше 21?

    gim0
    @gim0
    Java, Android, Python
    Если тебе нужно конкретно как на картинке, то используй CardView, там есть support-атрибуты которые тебе нужны.
    <android.support.v7.widget.CardView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        app:cardCornerRadius="10dp"
        app:cardElevation="10dp">
    
        <!-- Views -->
    </android.support.v7.widget.CardView>

    app:cardCornerRadius="10dp" - радиус закруглений углов
    app:cardElevation="10dp" - высота карточки, от неё зависит тень

    Не забудь добавить 'com.android.support:cardview-v7:26.1.0' в зависимости.
    Ответ написан
    4 комментария
  • Как организуется работа с AWS S3?

    @stoitli
    Для мультимедии я использую Clodo Storage.
    Дешевле получается чем любой заграничный
    https://hostsuki.pro/news/cena-cloud-storage-snizh...
    А если трафик по России, то еще и быстрее.

    Из минусов - нужно иметь бэкапы обязательно.
    Иногда файлы исчезают
    ;)
    Ответ написан
    Комментировать
  • Как динамически обрабатывать видео в зависимости от его параметров?

    Paul_Nice
    @Paul_Nice
    Ну такое
    А чем не подходит использование чего-то вроде этого:
    ffprobe -v quiet -print_format json -show_format -show_streams имя-файла.что-то

    Затем уже на питоне писаная логика должа решить как из ответа выдёргивать что нужно и применять настройки кодирования.
    Ответ написан
    4 комментария
  • Как защищать сервер от вредоносных файлов?

    dummyman
    @dummyman
    диссидент-схизматик
    Если сервер на linux или bsd то проверять mime-тип:
    file -b --mime-type путь_до_файла
    или
    xdg-mime query filetype путь_до_файла
    Ну а если на винде - любой антивирус решит проблему
    Ответ написан
  • Почему recyclerview использует один viewHolder несколько раз? И как исходя из этого правильно обработать нажатие?

    zagayevskiy
    @zagayevskiy Куратор тега Android
    Android developer at Yandex
    Holder используется несколько раз, потому что в этом его суть. Вангую, что когда вы жмете на первый элемент, пятнадцатый ещё не виден. Вьюхи и холдер переиспользуются, а цвет, который вы выставили при нажатии, остался прежним.
    Вывод. Если вы меняете какое-либо свойство, вы должны менять его во всех возможных случаях. В вашем примере нужно при баинде холдер выставлять цвет по-умолчанию.
    Ответ написан
    1 комментарий
  • Нужно разобраться с тем что такое DASH (mpeg-dash) и как его юзать?

    chupasaurus
    @chupasaurus
    Сею рефлекторное, злое, временное
    DASH работает поверх HTTP, а не RTMP, rtmp в конфиге nginx - настройки модуля nginx-rtmp-module. Для статического контента rtmp-модуль не нужен (сам DASH построен на том, что все фрагменты должны быть доступны как обычные файлы).
    Соответственно от вашего конфига нужна только вторая часть.
    mp4box -dash XXXX -rap -profile "dashavc264:onDemand"
    - для статики, "dashavc264:live" - для стримов.
    И ещё нужно натравить проигрыватель на всю эту радость.
    Раз уж добрались до моего ответа по предыдущему вопросу про DASH, могли прочитать спеку - там есть краткое описание того, как всё устроено.
    Ответ написан
    4 комментария
  • Как защитить денежный баланс на сайте от накрутки?

    copist
    @copist
    Empower people to give
    Пользуйтесь ключами RSA, у каждого пользователя своя пара ключей. Один (публичный) передаётся на сервер, другой (приватный) остаётся у пользователя. Когда делается транзакция, например покупка, то на сервер должна поступать информация:
    1. идентификатор покупателя
    2. номер счёта покупателя
    3. идентификатор продавца
    4. номер счёта продавца
    5. идентификатор покупки
    6. валюта
    7. точная сумма покупки
    8. точное время транзации в таймзоне UTC

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

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

    Проверяйте время транзакций. У каждого покупателя все транзакции должны быть строго хронологическими. Не должно быть чтобы покупка N+1 была ДО покупки N.

    Это вычисляется долго. Чтобы ускорить вычисление остатка, можно ввести специальный тип транзакции "состояние на начало месяца". Его должны выполнять сторонний доверенный сервер, имеющий свою специальную пару ключей. Тогда текущий баланс = последний остаток на начало месяца + все поступления - все оплаты. Вычисляется значительно быстрее.

    Если злоумышленник взломает базу данных, то внесёние записей будет чрезывычайно затруднительным, потому что подделать отпечаток транзакции будет невозможно. Слабое звено - можно просто выгрузить базу или таблицу в файл и затем дропнуть таблицу или базу и шантажировать вас потерянными данными. Чтобы исключить такое, запретите пользователям (не покупателям, а тем, которые подключаются к базе) делать DROP TABLE/DATABASE. Ещё делайте резервные копии. Ещё держите зеркало базы данных.

    Всё что я описал, будет бесполезно, если злоумышленник заменит исходный код платёжного сервера, так как он сможет просто вырубить все проверки на отпечатки. Поэтому платёжный сервер не должен быть скриптовым. То есть не PHP, node, Python, Ruby. Это должен быть компилируемый код. С цифровой подписью. Сервер не должен исполнять приложения с отсутствующей или неправильной цифровой подписью.

    Но это не мешает подменить список доверенных центров сертификации на сервере, чтобы запустить поддельное приложение вместо платёжного сервера. Поэтому на стороне СУБД нужно реализовать механизм, который не даёт подключиться к базе любому приложению. Это приложение должно иметь специальный механизм доступа. Ограничение по IP, специальные заголовки, особенная сессия. Значит это не MySQL и, скорее всего, не PostgreSQL.

    Ещё о каком-нибудь головняке рассказать или уже достаточно?

    Специалисты из WebMoney, PayPal, Yandex.Деньги и онлайн-банков сейчас не скрывая улыбки смотрят на мой алгоритм. Привет вам всем, друзья!

    Относительно реализации на PHP. Два сервера с запросами через AJAX не сделают сервер надёжнее, потому что всё можно подделать в браузере.

    Нужно предотвратить доступ пользователя к серверу. В Интернет огромное количество статей на эту тему. Я боюсь, что полный список средств предотвращения доступа я просто не вспомню. В любом случае, способов взлома больше, чем методов защиты в PHP.

    Вот списочек способов проникнуть на сервер:
    • Через уязвимости серверных компонентов;
    • Через уязвимости в веб-окружении сервера;
    • Через удаленное выполнение произвольного кода;
    • Через наличие переполнений;
    • Через инъекции (внедрение кода) (например, SQL Injection);
    • Через обход системы аутентификации веб-ресурса;
    • Через XSS / CSRF;
    • Через перехват привилегированных аккаунтов (или сессии таких аккаунтов);
    • Через Remote File Inclusion / Local File Inclusion;
    • Через компоненты CMS, CMF и фреймворков с известными уязвимостями;
    • Через перенаправление на другие сайты c помощью открытых редиректов;
    • Через сканирование директорий и файлов (поиск дампов, данных про git, svn);
    • Через подбор паролей.


    И вот списочек способов снижения вероятности проникновения и нанесения непоправимого ущерба:

    Состояние серверов
    • Держи сервера в актуальном состоянии, следи за найденными уязвимостями, обновляй серверные приложения
    • Делай бакапы файлов и баз данных, держи зеркальную базу данных; в случае беды - используй копию
    • Используй виртуальные машины, делай периодически снимки, а в случае взлома восстанавливай машины из снимков
    • Больше не вспомню. Держи админа под рукой.


    Доступ к серверам
    • Не подключайся от имени пользователя root, заведи другого.
    • Установи на всех пользователей длинный пароль.
    • Запрети всем пользователям делать sudo. Можно разрешить делать некоторые отдельные операции, например, nginx reload.
    • Для подключения к серверам пользуйтя SSH или SFTP, авторизация по ключам
    • Смени порты сервисов SSH и SFTP
    • Установи ограничение на список IP, с которых можно подключиться к серверу. Сделай себе белый IP адрес.


    Внутренние сервисы
    • Если всё приложение на одном сервисе, то все внутренние службы (mysql, memcached, raddis, rabbit) должны слушать только интерфейс 127.0.0.1. ( habrahabr.ru/post/212265 )
    • Если приложение включает несколько серверов (отдельно база, отдельно PHP), то есть представляет собой кластер, то службы должны слушать только те IP, которые относятся к кластеру.
    • Смени стандартные порты всех сервисов
    • Пользователю UNIX от которого работает PHP-FPM / NGINX/ APACHE, должны быть открыты для записи только несколько директорий (upload, логи, временные файлы), а для исполнения - вообще ничего нельзя.
    • Пользователю базы данных не должны быть доступны деструктивные и небезопасные операции (DROP/ALTER/CREATE PROCEDURE), может быть даже для INSERT/UPDATE/DELETE в данных по финансам использовать другой аккант в базе данных


    Приложение PHP
    • Защищай сайт с помощью SSL
    • Используй дополнительный платёжный пароль, ограничивай количество попыток оплаты с неверным паролем
    • Используй server side http cookie, короткие сессии с привязкой ключа сесии к IP и UserAgent клиента
    • Все запросы к базу должны быть только с использованием связываемых параметров, никаких конкатенаций запроса с параметрами (Внедрение SQL-кода, SQL injection, php.net/manual/ru/security.database.sql-injection.php и другое по фразе SQL injection )
    • Не доверяй проверкам данных на стороне клиента. Да, они ускоряют работу, но их можно легко подделать. Поэтому все проверки дублируй в коде на сервере.
    • Не доверяй данным пользователя: фильтруй строки, отрезай теги, укорачивай до допустимой длины, приводи к числам все числа (wikipedia: CSS, Cross Site Scripting — «межсайтовы..., XSS для новичков, Яндекс: XSS-атаки и другое по фразе "XSS")
    • Все запросы на сервер должны сопровождаться токеном безопасности ( https://ru.wikipedia.org/wiki/%D0%9C%D0%B5%D0%B6%D... https://learn.javascript.ru/csrf habrahabr.ru/post/235247 и другое по фразе "CSRF" )
    • Нигде не делай авто-редирект на страницу, указанную в параметрах запроса - так обычно делают, чтобы после логина вернуться туда, откуда была вызвана форма логина
    • Про содержимое транзакций уже писал, не знаю что из этого тебе пригодится
    Ответ написан
    4 комментария
  • Как безопасно хранить информацию о балансе счета в бд?

    @ralaton121
    А если все упирается в одно единственное поле которое может самопроизвольно изменится и вы даже не ведете списка операций, чтобы сверить соответствует ли сумма в этом поле сумме всех операций - то, конечно, такая система никак не защищена.

    И даже не от злодея, а от простого программного сбоя не защищена.

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

    2. Договор на бумаге. Будет отвечать за последствия.

    3. Зашифрованная БД. То есть он админит её файлами, но не может админить содержимое.

    4. Логи со всеми операциями прихода и расхода денег со счета, где ведется баланс, сохраняются отдельно и время от времени сверяются с остатками баланса. Должно сходиться всегда.

    5. Распечатка баланса (это такая весьма и весьма компактная таблица) и сохранение их в месте недоступном админу. Это баланс переходящий из даты в дату, то есть невозможно скорректировать так чтобы не видно было. Если убавит баланс в одном месте, то должен прибавать в другом - чтобы итог сохранился. Как сделать чтобы было видно, что человек исправил баланс в этом другом месте - вопрос не технический.

    6. Все уже придумано до нас - называется двойная бухгалтерская запись.
    В Европе известна с 15 века.
    А в Америке - и того раньше, еще инки знали.

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

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

    @MadridianFox
    Web-программист, многостаночник
    Чем вас не устраивает первый вариант и в чём плюсы второго?
    Логика подсказывает, что дублировать пост для каждого юзера, который на него подписан это абсурд.
    Хотите сказать, что если я делаю пост в группу в которой 100к подписчиков, то я сразу создаю 100к записей в базе?
    Количество постов в таблице постов будет больше чем в первом варианте на несколько порядков и это только замедлит выборку.

    Однако, и первый способ гиганты вряд-ли используют прямо так. Постов в соцсетях и так миллиарды. Не могут они храниться в одной таблице так чтобы простой
    select * from posts join subscribe sub on(...) where sub.user_id=123
    выдавал результат за адекватное время.
    Скорее всего там какие-то архисложные индексы строятся, какие-то умные кэши используются, база распределена так, чтобы сотня машин одновременно искала, но каждая машина в своём куске таблицы...

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

    @RidgeA
    Поищите доклад Arsen Kostenko How Twitter Works, вот например https://www.youtube.com/watch?v=tlPkM0lxMKc

    Если коротко - лента для каждого пользователя рассчитана заранее.
    Но
    Не парьтесь. Делайте так как считаете нужным, но знайте, что при росте количества пользователей вам придётся ещё разок всё переписать, а при выходе на мировой уровень, скорее всего у вас уже будет команда спецов, и вы ещё пару раз всё перепишете с нуля на других технологиях.
    - 100%
    Ответ написан
    Комментировать
  • Как сохранять в бд список людей на которых подписан пользователь?

    @Cheri
    Одназночно первый вариант. Во втором варианте обратный поиск будет сложнее, к прим. вытащи мне всех людей, кто подписан мне. С реляционной моделью это проще - select user_id from smth where subscriber_id=[id of your user]. Если будешь хранить это в массиве , тебе придется пробежаться по всем данным в таблице + проверять в массиве , содержит ли он id этого пользователя.
    Ответ написан
    Комментировать
  • Как сохранять в бд список людей на которых подписан пользователь?

    Не проще ли завести отдельную таблицу где писать user_id, subscribe_user_id ну и дату подписки?
    Ответ написан
  • Сервис приема платежей с массовыми выплатами для физлиц?

    RomaZveR
    @RomaZveR
    CEO AlertMoney, PHP/Golang Developer
    Тык
    Работают с физиками, более того, абсолютно анонимно, поэтому с ними всякие пирамидки да казино работают. По законам у них вроде всё хорошо, работают с Российскими банками на вывод и приём денег, но вот как раз из-за всяких заманушных сервисов они с Webmoney поссорились, правда мне их директор говорил что с ними можно устную договорённость заключить и персонально приём WM сделают.
    Ответ написан
    1 комментарий