Задать вопрос
  • Где собраны образцы топовых лендингов?

    lexxpavlov
    @lexxpavlov
    Программист, преподаватель
    Шикарный дизайн успешного сайта.

    Смотреть без звука!

    P.S. sarcasm mode off
    P.P.S. ну или для азиатского рынка...
    Ответ написан
    Комментировать
  • Какой простой и надежный способ хэширования пароля ASP.NET MVC?

    lexxpavlov
    @lexxpavlov
    Программист, преподаватель
    Для хеширования пароля лучше всего использовать BCrypt (пример).
    Если не нравится BCrypt, то можно использовать SHA512 - он уже есть в .NET Framework.
    Ответ написан
    Комментировать
  • Разработка сервера под игру, с чего начать?

    lexxpavlov
    @lexxpavlov
    Программист, преподаватель
    Есть к примеру игра GTA SA я так понимаю сторонние разработчики сделали клиент

    Не совсем так. Любая многопользовательская игра состоит из двух частей - клиентской и серверной, и они не работают друг без друга (бывают бессерверные игры, но и в таких случаях обычно один из клиентов становится сервером, так работает и в Doom/Quake/UT). В GTA и клиент, и сервер сделали Rockstar Games, а не отдельные разработчики. И даже - больше, Rockstar Games постарались сделать так, чтобы спрятать протокол взаимодействия - чтобы хакеры и крякеры не взламывали игру, получая игровые преимущества неигровыми способами. "Сделать сервер GTA", с которым заработает клиент GTA, не получится, по крайней мере, цена такой разработки будет сопоставима с ценой работы над GTA (которая стоила десятки миллионов долларов).

    То, что может сторонний разработчик, это сделать моды для готового сервера, используя те инструменты, которые разработчик предложил, либо пытаясь "грабить" протокол взаимодействия. Моды бывают серверными и клиентскими, и возможны только в том случае, если у вас есть доступ к компьютеру, на котором запущен сервер и клиент (клиент у вас всегда есть, так и делают большинство модов).

    К примеру сделать сервер майнкрафт не состовляет проблем.

    Майнкрафт заметно проще, чем GTA. Хотя бы потому, что майнкрафт сделал один человек, а GTA сделали десятки программистов. И вот для майнкрафта можно сделать свой сервер,а не мод (хотя и моды к нему тоже есть). Как пример, отличная статья.

    Скачал, настроил, запустил

    "Скачал, настроил, запустил" - это не "разработка сервера", это взял то, что уже разработал кто-то.

    P.S. Всё написанное - имхо. Я не любитель GTA и не знаю рынка неофициальных серверов GTA, только знаю, что такие есть (вроде как). Но лично я считаю, что вряд ли кто-то сможет написать сервер, если не будет либо его исходников (украсть), либо разработчики сделают инструменты для разработки модов.
    Ответ написан
    2 комментария
  • Какой уровень математики нужен в GameDev (Unity, UE4)?

    lexxpavlov
    @lexxpavlov
    Программист, преподаватель
    Математика в gamedev нужна в любом случае. Даже если делается маленькая игрушка, то нужно хотя бы понимать, как работает пропорция...
    Но вот вопрос - какой уровень математики нужен в gamedev.
    TL;DR: очень желателен средний уровень (хотя бы уровень 11 класса).
    Долгое объяснение:
    1) Игру можно делать вообще без математики - движок берёт на себя сложную математику. Но чем больше игра, тем больше будет нужно понимание математики - математика может пригодиться при расчёте выстрелов, при расчёте "хитрого" поиска пути, обязательно пригодится в при разработке ИИ, и уж точно пригодится при расчёте баланса (но это работа гейм-дизайнера, а не программиста).
    2) Причём, нужно именно понимание - не столько умение решать типовые задачки, сколько способность анализировать формулы придумывать свои. Например, какую-то фишку можно сделать несколькими способами, и вероятнее всего, более производительным будет тот способ, который лучше использует математику. Помимо обычной математики, может пригодиться геометрия. И уж точно пригодится булева алгебра.
    3) Начиная с восьмого класса, в школе учат не только считать тривиальные задачки, но и развивают так называемое "математическое мышление". Особенно этому учат "задачки со звёздочкой" (более сложные, но необязательные, не знаю, во всех ли учебниках есть такие). Именно математическое мышление позволяет лучше продумывать алгоритмы. (N.B. рекомендую почитать Я.И.Перельмана с его "Занимательной математикой")
    4) ААА-игры делаются не одним-двумя программистами, при разработке ААА-игр программистов используются десятки (а всего разработчиков может быть сотни, от гейм-дизайнеров до композиторов). Все из них не обязательно должны знать математику хорошо. Но если не знать, то вероятность развиться "повыше" - то сложнее.
    5) При некоторых играх математика почти не нужна (при использовании приличного движка), а в некоторых играх математика точно нужна.
    6) Программирование - техническая наука. Да, "гуманитарии" тоже могут стать программистами, но им будет сложнее. Ещё Ломоносов сказал: "Математика ум в порядок приводит" - в нашем классе математики в школе была такая картинка на стене. И я как учитель могу подтвердить эту мысль.

    Итог.
    Можно ли сделать игру без математики? Можно.
    Математика поможет разработке игры? Почти наверняка.
    Хочется развиваться хотя бы до сениора? Учи математику.
    Ответ написан
    Комментировать
  • Как можно реализовать проверку подлинности данных на игровом сервере?

    lexxpavlov
    @lexxpavlov
    Программист, преподаватель
    как реализовать логику, при которой сервер будет понимать, что данные - это действительно результат игры

    100% защититься невозможно, но возможно сделать так, чтобы взлом стал гораздо дороже, чем выгода. Например, валидация данных в игровом сервере в условной "Flappy Bird" может быть заметно проще, чем GTA.

    Очень хорошая и полезная статья Борьба с читерами в онлайн-играх: 22 «нужно» и «нельзя» на Хабре (плюс, важные комментарии). Выберите, какой уровень защиты вам нужен для вашей игры. Например, некоторые способы защиты невозможно сделать одному программисту (слишком долго и дорого).
    Ответ написан
    Комментировать
  • C#. Как удалить часть строки которая идет после последнего символа, например запятой?

    lexxpavlov
    @lexxpavlov
    Программист, преподаватель
    string aaa = "Привет, что делаешь, как дела";
    int pos = aaa.LastIndexOf(',');
    string bbb = aaa.Substring(pos);
    aaa = aaa.Substring(0, pos);
    Ответ написан
  • Можно ли откомпилировать код в Visual Studio 2015/2017 без создания проекта?

    lexxpavlov
    @lexxpavlov
    Программист, преподаватель
    Можно использовать онлайн-компилятор, например
    https://www.tutorialspoint.com/compile_csharp_onli...
    Ответ написан
    Комментировать
  • Как создать общее свойство для элементов?

    lexxpavlov
    @lexxpavlov
    Программист, преподаватель
    Нужно указать тип элементов, которым требуется указать стили. В DataGrid ячейки находятся в элементе DataGridCell, а заголовки - в DataGridColumnHeader.
    <DataGrid>
        <DataGrid.Columns>
            <DataGridTextColumn Header="Qwe"/>
            <DataGridTextColumn Header="Rty"/>
            <DataGridTextColumn Header="Uio"/>
        </DataGrid.Columns>
        <DataGrid.Resources>
            <Style TargetType="DataGridColumnHeader">
                <Setter Property="Width" Value="100"/>
            </Style>
        </DataGrid.Resources>
    </DataGrid>

    Можно положить стиль не в ресурсы, а в специальный контейнер. Разница в том, что стиль в ресурсах применяется во все вложенные подходящие элементы, даже вложенные внутри ячеек (например, в другой DataGrid внутри ячейки). Стиль в ColumnHeaderStyle будет использован только в заголовках этого DataGrid. Пример:
    <DataGrid.ColumnHeaderStyle>
        <Style TargetType="DataGridColumnHeader">
            <Setter Property="Width" Value="100"/>
        </Style>
    </DataGrid.ColumnHeaderStyle>

    Если указывать стиль элементов, то этот стиль не добавляется к текущему, а заменяет предыдущий стиль. Чтобы стиль добавлялся к уже существующем стилю, то стиль нужно наследовать от старого:
    <DataGrid.ColumnHeaderStyle>
        <Style TargetType="DataGridColumnHeader" BasedOn="{StaticResource {x:Type DataGridColumnHeader}}">
            <Setter Property="Width" Value="100"/>
        </Style>
    </DataGrid.ColumnHeaderStyle>
    Ответ написан
    4 комментария
  • Порядок изучения C#?

    lexxpavlov
    @lexxpavlov
    Программист, преподаватель
    Неплохая книга Бена Ватсона "С# 4.0 на примерах" - много примеров, как делать конкретные вещи, в том числе, по WPF.

    Программирование зиждется на трёх китах - 1) знание (синтаксис) языка, 2) алгоритмы и 3) архитектура. Причём, последние не связаны с языком. Читайте не только о языке, но и общие знания - паттерны, архитектура, алгоритмы. В большинстве классических книг примеры написаны не на c#, но их чтение сильно развивает как программиста.
    Мартин Р. Чистый код. Создание, анализ и рефакторинг рекомендую прочитать хотя бы до 12 главы, дальше - углубление. Первые главы дают шикарный базис для построения архитектуры - почему писать так, а не иначе. Примеры на Java, но этот язык довольно сильно похож на C#.
    Фаулер М. Рефакторинг. Улучшение существующего кода классическая книга
    Гамма Э и др. Приёмы объектно-ориентированного проектирования суперклассическая книга, так называемая "банда четырёх"
    Скиена С. Алгоритмы. Руководство по разработке книга о алгоритмах, проще, чем известная книга Д. Кнута

    Ну и посмотрите этот список книг.
    Ответ написан
    Комментировать
  • Есть ли готовые либы для JS, PHP, C#, Java, ObjC/Swift для манипуляции с датой и временем, типа красиво писать "3 часа назад" и т.д.?

    lexxpavlov
    @lexxpavlov
    Программист, преподаватель
    Вы хотите одну библиотеку, в которой все языки? Так не бывает, библиотека связана с конкретным языком, но на некоторых языках есть порты. Языков несколько сотен (1, 2), вы хотите, чтобы автор эдакой убер-библиотеки сделал все языки?

    >Но может следует просто взять готовое?
    Конечно, готовое, если уже есть и если приличного качества.
    Stalker_RED показал библиотеки для js и php. Для c# есть https://github.com/Eonasdan/MomentSharp
    Ответ написан
    3 комментария
  • Как правильно заполнить List данными?

    lexxpavlov
    @lexxpavlov
    Программист, преподаватель
    var names = new[] { "n1", "n2", "n3" };
    var descriptions = new[] { "d1", "d2", "d3" };
    var companies = new[] { "c1", "c2", "c3" };
    var products = Enumerable.Range(0, names.Length-1)
                  .Select(i => new Product { Name = names[i], Description = descriptions[i], Company = companies[i]})
                  .ToList();

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

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

    lexxpavlov
    @lexxpavlov
    Программист, преподаватель
    Нужно все переводимые строки хранить в отдельном массиве. А в шаблоне использовать нужный массив.
    Пример с шаблоном на php и использованием глобальной переменной (для упрощения кода примера):
    $ru = array(
        'site.title' => "Мой сайт",
        'author.name' => "Иванов И.И.",
    );
    $en = array(
        'site.title' => "My site",
        'author.name' => "John Doe",
    );
    $LANG = $_GET['lang'] === 'ru' ? $ru : en;
    
    // где-то в шаблоне:
    <html>
    <head>
        <title><?=$LANG['site.title']?></title>
    </head>
    <body>
        <p><?=$LANG['author.name']?></p>
    </body>
    </html>


    Подобным образом делается на любом фреймворке и/или шаблонизаторе. Приличные фреймворки уже имеют готовые инструменты для создания таких словарей.
    Ответ написан
    5 комментариев
  • Аналог компонентов 1C-Bitrix в Symfony?

    lexxpavlov
    @lexxpavlov
    Программист, преподаватель
    В Symfony обычно основной код работает в сервисах, а контроллер вызывает нужный сервис. Большой плюс - один раз создал код работы с сущностью, и можно использовать его в любом месте - в любом контроллере, в другом сервисе, в шаблоне. Весь год работы с сущностью - в одном месте (в одном сервисе).
    1) Сделать сервис, который строит список последних новостей (этот же сервис использует кэш).
    2) Создать Twig расширение, которое добавляет функцию получения списка последних новостей (получение из созданного сервиса). Например, создать функцию "lastNews". Ссылку на сервис новостей настроить через контейнер (в services.yml, или где там делаете сервисы). (ссылки для создания функций: 1, 2)
    3) В основном шаблоне (app/Resources/views/layout.html.twig) вызвать созданную функцию. Упрощённо примерно вот так:
    {# app/Resources/views/base.html.twig #}
    <!DOCTYPE html>
    <html lang="ru">
        <head>
        </head>
        <body>
            {% block body%}{% endblock %}
            {% block javascripts %}{% endblock %}
        </body>
    </html>


    {# app/Resources/views/layout.html.twig #}
    {% extends 'base.html.twig' %}
    
    {% block body %}
    <div class="container">
        <div class="sidebar">
            {% block sidebar %}
                <ul class="sidebar-menu">
                {% for item in lastNews() %}
                  <li><a href="{{ item.href }}">{{ item.title }}</a></li>
                {% endfor %}
                </ul>
            {% endblock %}
        </div>
        <div class="content">
            {% block content %}
            {% endblock %}
        </div>
    </div>
    {% endblock %}
    Ответ написан
    5 комментариев
  • Как реализовать кэш sql?

    lexxpavlov
    @lexxpavlov
    Программист, преподаватель
    Лучше не нагружать БД лишней работой (кэшированием), которую можно сделать в другом месте. Масштабирование БД - более сложная работа, чем масштабирование кода. Поэтому, кэшировать лучше в коде, а не в СУБД (который, кстати, и так использует кэш).
    Лучше кэшировать запрос как можно раньше. Например, запрос получает 5 запросов в БД, лучше делать один кэш всех пяти запросов в БД, чем пять разных кэшев каждого из запросов.

    Как сделать работу с кэшем удобнее - см. другой ответ Symfony и Redis куда писать логику получения кэша?
    Ответ написан
    Комментировать
  • Symfony и Redis куда писать логику получения кэша?

    lexxpavlov
    @lexxpavlov
    Программист, преподаватель
    Сделать сервис, в нём методы получения данных. В методах доступ к кэшу и к репозитоиям.
    В идеале, в контроллере вообще не нужны репозитории - вся работа с ними в этом сервисе.
    В этом сервисе и инвалидация делается.
    Методы могут быть по конкретной сущности, а могут быть по типу (getEntity($type, $id)), если удобно.

    UPD. В качестве инструмента рекомендую использовать компонент Cache Component, в нём есть возможность использовать тегирование записей, это очень удобно (для инвалидации)! Doctrine Cache устарел, имхо.
    Ответ написан
    Комментировать
  • Какой сегодня порог вхождения в апстор и гуглплей?

    lexxpavlov
    @lexxpavlov
    Программист, преподаватель
    $25 в гуглплей, $100 в аппстор.
    А вообще, раз у вас возникают такие вопросы, то вы ничего не читали. Почитайте статьи про это, хотя бы на хабре. Большинство подобных статей связано с играми, а не про неигровые приложения, но и те статьи вам сильно помогут, потому что, помимо самого приложения, есть другие важные темы (например, монетизация, ASO, продвижение).
    Ответ написан
  • Каким способом правильнее разрешить зависимости класса?

    lexxpavlov
    @lexxpavlov
    Программист, преподаватель
    4. Передать B аргументом метода ab() (function ab(B $b))

    Лучше первый способ. Если класс обрастет зависимостями, тогда можно подумать о рефакторинге. А вдруг не обрастёт?..

    Но точнее вам никто не скажет, не посмотрев код - мало данных в тексте вопроса.
    1) Как часто вызывается метод ab()? В каждом запросе? или в одном из сотни запросов?
    2) используется ли B в других местах класса A?
    3) Как передаются зависимости через конструктор?
    new A(new B) или $b = new B; new A($b); new A($b); new A($b); или из контейнера? Ведь если B уже есть в контейнере, то передать в конструктор очень просто и быстро.
    Ответ написан
    3 комментария
  • Как написать свой функционал в пределах одного Bundle?

    lexxpavlov
    @lexxpavlov
    Программист, преподаватель
    А в чём проблема? Нормально придумано. Классы Tab и TabStack поместить в папку Tab, TabStack сделать сервисом, в контроллере использовать (или в шаблоне).

    >и метод register. В SourceBundle.php регистрировать табы
    А для чего регистрировать? чтобы в разных контроллерах появлялись разные табы? Я бы подумал о тегах у таба - у каждого таба определённые теги, которые указывают, где их использовать. И в контроллере получать по тегам.
    Сколько табов у вас?
    Ответ написан
  • Как правильно работать с PersistentCollection в Doctrine ORM?

    lexxpavlov
    @lexxpavlov
    Программист, преподаватель
    Скорее всего, это происходит, если вы во втором случае берёте $entityA->getEntitiesB(); у другого объекта, полученного из репозитория.
    $entityA1 = $entity_manager->getRepository(...)->find(1);
    $entityA1->addEntitiesB(new EntityB());
    
    $entityA2 = $entity_manager->getRepository(...)->find(1); // получаем новый объект (из базы)
    $entitiesB = $entityA2->getEntitiesB(); // пусто
    $entitiesB = $entityA1->getEntitiesB(); // а тут будет сохранённый объект
    Ответ написан
    Комментировать