• Что означают угловые скобки?

    ayazer
    @ayazer
    Sr. Software Engineer
    https://docs.microsoft.com/en-us/dotnet/csharp/pro...

    это уточнение типа для обобщенного List
    Ответ написан
    Комментировать
  • Как Dictionary.KeyCollection преобразовать (или привести тип) в массив?

    ayazer
    @ayazer
    Sr. Software Engineer
    var dict = new Dictionary<string, string>()
    {
        { "key1", "val1" },
        { "key2" , "val2" }
    };
    var result = string.Format("{0} {1}", dict.Keys.ToArray());


    String.Format("{0}{1}", Collection.Keys)

    не будет работать т.к. у KeyCollection нет доступа по индексу
    Ответ написан
    3 комментария
  • Что может сделать команда MyValues > 10?

    ayazer
    @ayazer
    Sr. Software Engineer
    Понятное дело правильные варианты 1 и 4, но вдруг я чего-то не знаю.


    угу, 1 и 4
    Ответ написан
    Комментировать
  • Где взять .spritefont для Monogame?

    ayazer
    @ayazer
    Sr. Software Engineer
    .spritefont = конфиг как нужно рендерить шрифт.

    самый простой способ - создать самому. т.е. для того чтоб добавить шрифт `Montserrat-Regular.otf`, просто создаете рядом файл "Montserrat-Regular.spritefont" с содержанием (поправить в зависимости от реальной необходимости)

    <?xml version="1.0" encoding="utf-8"?>
    <!--
    This file contains an xml description of a font, and will be read by the XNA
    Framework Content Pipeline. Follow the comments to customize the appearance
    of the font in your game, and to change the characters which are available to draw
    with.
    -->
    <XnaContent xmlns:Graphics="Microsoft.Xna.Framework.Content.Pipeline.Graphics">
      <Asset Type="Graphics:FontDescription">
    
        <!--
        Modify this string to change the font that will be imported.
        -->
        <FontName>Montserrat-Regular.otf</FontName>
    
        <!--
        Size is a float value, measured in points. Modify this value to change
        the size of the font.
        -->
        <Size>12</Size>
    
        <!--
        Spacing is a float value, measured in pixels. Modify this value to change
        the amount of spacing in between characters.
        -->
        <Spacing>0</Spacing>
    
        <!--
        UseKerning controls the layout of the font. If this value is true, kerning information
        will be used when placing characters.
        -->
        <UseKerning>true</UseKerning>
    
        <!--
        Style controls the style of the font. Valid entries are "Regular", "Bold", "Italic",
        and "Bold, Italic", and are case sensitive.
        -->
        <Style>Regular</Style>
    
        <!--
        If you uncomment this line, the default character will be substituted if you draw
        or measure text that contains characters which were not included in the font.
        -->
        <!-- <DefaultCharacter>*</DefaultCharacter> -->
    
        <!--
        CharacterRegions control what letters are available in the font. Every
        character from Start to End will be built and made available for drawing. The
        default range is from 32, (ASCII space), to 126, ('~'), covering the basic Latin
        character set. The characters are ordered according to the Unicode standard.
        See the documentation for more information.
        -->
        <CharacterRegions>
          <CharacterRegion>
            <Start>&#32;</Start>
            <End>&#126;</End>
          </CharacterRegion>
        </CharacterRegions>
      </Asset>
    </XnaContent>


    тогда при компиляции ресурсов для каждой пары (шрифт+конфиг) будет создан .xnb, который уже и будет использоватся
    Ответ написан
    Комментировать
  • C# HttpWebRequest получить описание ошибки сервера при StatusCode 500?

    ayazer
    @ayazer
    Sr. Software Engineer
    Никак. На то это и внутренняя ошибка, что клиенту ничего про нее знать не нужно. В браузере вы можете что-то видеть только если сервер запущен с тестовой конфигурацией (когда в случае ошибки отображает страницу со стектрейсом).

    UPD

    нужное вам поведение можно получить как-то так:

    [ApiController]
        public class TestController : ControllerBase
        {
            [HttpGet]
            public Task ChangeStatus()
            {
                throw new Exception("My test exception");
            }
        }


    public class HttpResponseExceptionFilter : IActionFilter, IOrderedFilter
    {
            public void OnActionExecuted(ActionExecutedContext context)
            {
                if (context.Exception != null)
                {
                    context.Result = new ObjectResult(new
                    {
                        ErrorText = context.Exception.Message,
                        Stacktrace = context.Exception.StackTrace
                    })
                    { StatusCode = (int)HttpStatusCode.BadRequest };
    
                    context.Exception = null;
    
                    return;
             }
    }


    тогда дергнув контроллера вы обратно получите 400ую ошибку с контентом

    {
    "errorText": "My test exception",
    "stacktrace": "stacktrace was here"
    }

    UPD2:
    ну и насколько я помню (а я могу быть не прав, но не могу перепроверить сейчас) - HttpWebRequest будет кидать ексепшн для всех не 200 хттп статусов. Потому возможно стектрейс прийдется доставать не очень красиво

    WebRequest request = ...;
    try
    {
      using var response = request.GetResponse();
      ...
    }
    catch (WebException e)
    {
      using var webResponse = (HttpWebResponse)e.Response;
      var code = webResponse.StatusCode;
      var body = ...;
    
      //...
    
    }


    или использовть HttpClient, который ексепшн кидает только если попросить
    Ответ написан
    4 комментария
  • Как задать пилообразную функцию в lua?

    ayazer
    @ayazer
    Sr. Software Engineer
    зависимо от того как это будет применятся, это можно сделать

    и через ряд Фурье:
    729ada16fa189be498408ad44594b90c.png

    и просто:
    x(t) = t - math.floor(t)
    Ответ написан
  • Как работают ObscuredTypes у Anticheat?

    ayazer
    @ayazer
    Sr. Software Engineer
    как-то так

    public struct WrappedInt
        {
            private readonly int _value;
    
            public WrappedInt(int val)
            {
                _value = val;
            }
    
            public static implicit operator WrappedInt(int val)
            {
                return new WrappedInt(val);
            }
    
           ... 
        }
    
    ....
    
    WrappedInt wrapped = 1;
    Ответ написан
    Комментировать
  • Как исправить ошибку "System.InvalidOperationException: "Недопустимая попытка чтения при отсутствии данных.""?

    ayazer
    @ayazer
    Sr. Software Engineer
    вы неправильно ридер используете.

    SqlDataReader loginReaderData = LoginData.ExecuteReader();
    
     while (loginReaderData.Read())
     {
        var id = loginReaderData["ID"];
        // ...    
      }


    Но судя по примеру - вам вообще не ридер нужен, а нужно https://docs.microsoft.com/en-us/dotnet/api/system...

    string sqlExpression = "SELECT ID FROM Users WHERE ID = 1";
    SqlCommand loginData = new SqlCommand(sqlExpression, connection);
    var id = (string)loginData.ExecuteScalar();
    //...
    Ответ написан
    Комментировать
  • Нужно ли самостоятельно реализовывать механизм "Mark and Sweep" или он уже есть в сборщике мусора?

    ayazer
    @ayazer
    Sr. Software Engineer
    Не надо ничего самому писать, все уже есть с коробки.
    Ответ написан
    Комментировать
  • Как исправить несовместимость версий .NET?

    ayazer
    @ayazer
    Sr. Software Engineer
    у вас одна часть на .нет фреймворке, а вторая - на неткоре. Либо приведите все к чему-то одному, либо используйте нетстандарт нужной версии (тогда библиотека будет совместима и с нетфреймворком, и с неткором).

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

    <Project Sdk="Microsoft.NET.Sdk">
    
      <PropertyGroup>
        <TargetFramework>netstandard2.0</TargetFramework>
      </PropertyGroup>
    
      <ItemGroup>
        <PackageReference Include="..." Version="..." />
           ...
      </ItemGroup>
    
      ...
    
    </Project>
    Ответ написан
    Комментировать
  • Какие существуют кодировки на подобии Base64?

    ayazer
    @ayazer
    Sr. Software Engineer
    base64 - просто формат представления массива байт, с шифрованием не имеет ничего общего вообще
    md5 - не алгоритм шифрования, это алгоритм хеширования.

    Алгоримы "как md5" можно искать по hash/sign/digest algorithms. Чаще всего используются md5 или вариации sha (sha1, sha224, sha256, sha384, sha512), но на этом они тоже не заканчиваются.

    Алгоритмов именно шифрования тоже много, искать как encryption algorithms. C того что первое вспоминается - aes/des/tripledes/blowfish/twofish/rc2/seed
    Ответ написан
    Комментировать
  • С т.з. сложности алгоритма генератор списка аналогичен циклу? O(n)?

    ayazer
    @ayazer
    Sr. Software Engineer
    сложность обоих решений O(n), разница только в константе. Но в первом случае вы пробегаетесь по всему списку 1 раз, и сразу считаете все что нужно. во втором - вы это делаете 3 раза. Ну и да - во втором случае вы еще и память выделяете.
    Ответ написан
  • Может ли быть переход объекта от SOH to LOH и наоборот? Если да, то какие процессы в это время происходят? Простой переход или что-нибудь ещё?

    ayazer
    @ayazer
    Sr. Software Engineer
    нет, не может

    upd:
    не нужно путать общий размер занимаемой памяти и размер объекта. В loh попадет условный массив на 100мб/ большая строка. Но объект который ссылается на это - нет, т.к. в нем будет только ссылка весом в пару байт.

    подозреваю что вы думали о чем-то таком

    public class TestClass
        {
            public byte[] Bytes;
    
            public TestClass(byte[] bytes)
            {
                Bytes = bytes;
            }
    
            public void Upd()
            {
                Bytes = new byte[101 * 1024 * 1024];
            }
        }
    
    ...
    
        static void Main(string[] args)
        {
            var data = new TestClass[3];
    
            for (int i = 0; i < 3; i++)
            {
                data[i] = new TestClass(new byte[1]);
            }
    
            data[1].Upd();
        }


    но нет, это не заставит переиестить объект с soh -> loh, т.к. в loh попадет только массив, а в объекте будет просто ссылка. И если заглянуть в память - это видно

    5f23ca2621fda807535079.png
    Ответ написан
    3 комментария
  • Как правильно вписать Bool в If?

    ayazer
    @ayazer
    Sr. Software Engineer
    судя по ошибке - enemyStatus это не метод

    if(other.tag == "Player" && Input.GetKeyDown(activateEnemies) && !enemyStatus)
    Ответ написан
    Комментировать
  • Как быстро изменить схему таблиц?

    ayazer
    @ayazer
    Sr. Software Engineer
    есть 2 проверенных варианта:
    1) github gh-ost.
    2) percona toolkit

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

    percona toolkit - работает через триггеры. потому мигрировать таблицу для которой уже есть триггеры не выйдет. но зато она работает быстрее

    gh-ost - читает бинлог. соотв. будет работать даже если есть триггеры, но работать будет медленно (в моем случае он переливал данные с где-то с такой-же скоростью как они добавлялись)

    в итоге я в свое время использовал для миграций перкону. миграции мелких таблиц в пару гигабайт проходили в течении 10-15 минут незаметно для бекенда.
    Ответ написан
    1 комментарий
  • Как правильно организовать очереди?

    ayazer
    @ayazer
    Sr. Software Engineer
    я конечно мимокрокодил с другого стека, но как вариант:

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

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

    как узнать какой сервис на каких пользователей подписан

    по идентификатору мы сразу понимаем на какой конкретно инстанс идти. если обрыв коннекшена - сходить куда-то в окестратор уточнить куда теперь слать данные.

    хранить эту связь в redis
    можно и в редис. по сути прийдется хранить только маски какой диапазон на какой сервер идут. и при скейлинге - обновлять.

    Или на каждого пользователя создавать по очереди? Или это все одна очередь и каждое сообщение должно быть вычитано каждым инстансом сервиса_1 а затем отфильтровано?

    если честно выглядит как оверхед, не вижу проблемы чтоб все пихать в 1 очередь, с которой воркеры будут разгребать работу. только перепроверьте что ваша очередь действительно гарантирует что сообщение прочитают именно 1 раз, у того-же амазоновского скса формулировка про "точно 1 раз".
    Ответ написан
    Комментировать
  • Регулярное выражение в mysql при update?

    ayazer
    @ayazer
    Sr. Software Engineer
    mysql 8.0 + ? тогда
    UPDATE products SET full_description = REGEXP_REPLACE(full_description, "<h2.+>", "<h2>");


    https://dev.mysql.com/doc/refman/8.0/en/regexp.htm...
    Ответ написан
  • Что хранит в себе неинициализированная переменная в C#?

    ayazer
    @ayazer
    Sr. Software Engineer
    если переменная объявлена, но ЕЩЕ не инициализирована - там будет дефолтное значение (null для классов, конкретное значение для структур (см. default)). Проверить это можете в прямо в дебаггере.

    обратится к переменной которая ЯВНО не инициализирована в момент обращения (как раз та ситуация когда в ней в с++ находится какой-то хлам) - нельзя, т.к. это считается потенциальным багом и такой код даже не скомпилируеться. (подозреваю что вопрос был как-раз про эту часть)
    Ответ написан
    Комментировать
  • Как правильно присвоить локальное значение переменной в C#?

    ayazer
    @ayazer
    Sr. Software Engineer
    float result;

    Если пользователь введет в качестве операции не что-то с { +, -, *, / } - выйдет неопределенное поведение т.к. result будет не инициализирован в момент
    string value = $"Результат: {result}";

    Либо делайте
    float result = 0f;

    Либо (что правильней) - не допускайте возможности такой ситуации вообще
    if (o == "+")
                    {
                        result = add(f, s);
                    }
                    else if(o == "-")
                    {
                        result = subtraction(f, s);
                    }
                    else if(o == "*")
                    {
                        result = multiplication(f, s);
                    }
                    else if(o == "/")
                    {
                        result = division(f, s);
                    }
                    else
                          throw new Exception($"Unexpected operation '{o}'");
    Ответ написан
    Комментировать