• Что делается до декомпозиции ПО?

    sarapinit
    @sarapinit
    Точу водой камень
    Сбор и анализ требований, составление тех задания. Если проектирование ведется по DDD, то составление единого непротиворечивого языка предметной области: выявление сущностей, агрегатов, связанных контекстов, событий предметной области. Это в крупных проектах.

    В мелких на бумажке рисуешь какую-то минимальную схему и приступаешь. В реальном мире не всегда фаза проектирования присутствует.
    Ответ написан
  • Как правильно организовать вложенность папок по тематикам?

    sarapinit
    @sarapinit
    Точу водой камень
    То что должно одновременно попадать в зону вашего внимания — кладите в отдельную папку.
    Ответ написан
    2 комментария
  • Как использовать AutoMapper для уровня Presentation и Bisness а также Data?

    sarapinit
    @sarapinit
    Точу водой камень
    Если соблюдать правила именования, то конфигурацию для автомаппера можно построить с помощью рефлексии.
    Ответ написан
  • Как использовать конкретную зависимость в ASP.NET Core DI?

    sarapinit
    @sarapinit
    Точу водой камень
    В доках вижу вот такую перегрузку:
    public static Microsoft.Extensions.DependencyInjection.IServiceCollection AddHostedService<THostedService> (
    this Microsoft.Extensions.DependencyInjection.IServiceCollection services, 
    Func<IServiceProvider,THostedService> implementationFactory
    ) where THostedService : class, Microsoft.Extensions.Hosting.IHostedService;


    значит вам подойдет что-то вроде:

    services.AddHostedService<Service>(sp => new Service(new Reader("1", "2")));
    services.AddHostedService<Service>(sp => new Service(new Reader("3", "4")));
    services.AddHostedService<Service>(sp => new Service(new Reader("5", "6")));


    UPDATE:
    Но это не работает, потому что регистрации для одного типа перезаписывают друг друга.
    mishkaaaaaa, вы уверены что вам нужен именно HostedService (как служба работающая в фоне)
    Ответ написан
  • Какую стратегию обучения выбрать, когда в запасе есть 1.5 года и смартфон?

    sarapinit
    @sarapinit
    Точу водой камень
    Как уже писали выше, без практики будет очень сложно, поэтому я бы смотрел в сторону инструментов, которые вам доступны вживую. То есть это либо установка интерпретатора языка сразу на смартфон (python например). Либо организация удаленного доступа к полноценному компьютеру, и тогда в принципе любой язык. Например можно арендовать в облаке небольшую виртуалку на линукс, подключаться к ней по ssh и в консоли всё писать. Либо редактировать файл локально на телефоне, потом заливать на удаленный компьютер и там компилировать.
    Ответ написан
    2 комментария
  • C# как выполнить фрагмент кода, не собирая проект?

    sarapinit
    @sarapinit Куратор тега C#
    Точу водой камень
    1) использовать c# interactive
    2) использовать unit test
    3) использовать LinqPad редактор
    4) использовать c# интерпретатор онлайн
    Ответ написан
    Комментировать
  • Все ли методы в репозиториях должны быть асинхронными?

    sarapinit
    @sarapinit
    Точу водой камень
    Да, при правильном использовании асинхронные методы позволяют переиспользовать потоки и за счет этого увеличить пропускную способность приложения.
    Ответ написан
    5 комментариев
  • Отображение app.UseDeveloperExceptionPage в продакшен?

    sarapinit
    @sarapinit
    Точу водой камень
    Либо так, либо добавить нормальное логгирование чтобы не приходилось этого делать.
    Ответ написан
  • Как организовать свое информационное поле?

    sarapinit
    @sarapinit
    Точу водой камень
    Завести книжный шкаф, читать бумажные книги. Всю остальную информацию собирать под задачу. На свободный серфинг интернета ограничивать время до часа в 30-60минут в день.
    Ответ написан
    Комментировать
  • Как разобраться какой сервис с каким жизненным циклом нужно применять?

    sarapinit
    @sarapinit
    Точу водой камень
    Если надо чтобы был всегда один экземпляр — singleton.
    Если надо чтобы в пределах запроса был один экземпляр (например в случае DbContext в EntityFramework), то Scoped.
    В остальных случаях transient.
    Ответ написан
    5 комментариев
  • Где найти массив (базу) строк?

    sarapinit
    @sarapinit Куратор тега C#
    Точу водой камень
    Возьмите любую книгу
    Ответ написан
    Комментировать
  • Как можно объединить два Expression'a в один для получения данных из Entity Framework Core?

    sarapinit
    @sarapinit Куратор тега C#
    Точу водой камень
    Если вы просто добавите к своему запросу Where на каждое выражение то это как раз будет логическое «И». Я обычно так делаю.

    Пример кода:
    Task<Device[]> FilteredDevices(params Expression<Func<Device, bool>> filters)
    {
        IQueryable<Device> query = this.Entities;
        foreach(var filter in filters)
        {
            query = query.Where(filter);
        }
        return query.AsNoTracking().ToArrayAsync();
    }


    PS
    Но если хотете заморочиться по экспрешенам, то вот вам доклад
    Ответ написан
    1 комментарий
  • Существует ли CCITT версия алгоритма CRC32, если да, то какие у него начальные параметры параметры?

    sarapinit
    @sarapinit
    Точу водой камень
    Но по CRC32 нет информации!

    Или... Всё таки есть.

    8.1.1.6.2 32-bit frame check sequence The FCS shall be the 32-bit sequence preceding the closing flag. The 32-bit FCS shall be the ones complement of the sum (modulo 2) of: a) the remainder of xk (x31 + x30 + x29 + x28 + x27 + x26 + x25 + x24 + x23 + x22 + x21 + x20 + x19 + x18 + x17 + x16 + x15 + x14 + x13 + x12 + x11 + x10 + x9 + x8 + x7 + x6 + x5 + x4 + x3 + x2 + x1 + 1) divided (modulo 2) by the generator polynomial x32 + x26 + x23 + x22 + x16 + x12 + x11 + x10 + x8 + x7 + x5 + x4 + x2 + x + 1, where k is the number of bits in the frame existing between, but not including, the final bit of the opening flag and the first bit of the FCS, excluding bits inserted for transparency; and b) the remainder of the division (modulo 2) by the generator polynomial x32 + x26 + x23 + x22 + x16 + x12 + x11 + x10 + x8 + x7 + x5 + x4 + x2 + x + 1, of the product of x32 by the content of the frame existing between, but not including, the final bit of the opening flag and the first bit of the FCS, excluding bits inserted for transparency. As a typical implementation at the transmitter, the initial content of the register of the device computing the remainder of the division is preset to all 1s and is then modified by division by the generator polynomial (as described above) of the address, control and information fields; the ones complement of the resulting remainder is transmitted as the 32-bit FCS. As a typical implementation at the receiver, the initial content of the register of the device computing the remainder is preset to all 1s. The final remainder, after multiplication by x32 and then division (modulo 2) by the generator polynomial x32 + x26 + x23 + x22 + x16 + x12 + x11 + x10 + x8 + x7 + x5 + x4 + x2 + x + 1 of the serial incoming protected bits and the FCS, will be "1100 0111 0000 0100 1101 1101 0111 1011" (x31 through x0, respectively) in the absence of transmission errors.


    Источник

    Реализация на C#
    public static class CRC32
        {
            #region - Static Fields and Constants -
            private static readonly uint[] Crc32Tab =
            {
                0x00000000, 0x77073096, 0xee0e612c, 0x990951ba, 0x076dc419, 0x706af48f, 0xe963a535, 0x9e6495a3,
                0x0edb8832, 0x79dcb8a4, 0xe0d5e91e, 0x97d2d988, 0x09b64c2b, 0x7eb17cbd, 0xe7b82d07, 0x90bf1d91,
                0x1db71064, 0x6ab020f2, 0xf3b97148, 0x84be41de, 0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7,
                0x136c9856, 0x646ba8c0, 0xfd62f97a, 0x8a65c9ec, 0x14015c4f, 0x63066cd9, 0xfa0f3d63, 0x8d080df5,
                0x3b6e20c8, 0x4c69105e, 0xd56041e4, 0xa2677172, 0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b,
                0x35b5a8fa, 0x42b2986c, 0xdbbbc9d6, 0xacbcf940, 0x32d86ce3, 0x45df5c75, 0xdcd60dcf, 0xabd13d59,
                0x26d930ac, 0x51de003a, 0xc8d75180, 0xbfd06116, 0x21b4f4b5, 0x56b3c423, 0xcfba9599, 0xb8bda50f,
                0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924, 0x2f6f7c87, 0x58684c11, 0xc1611dab, 0xb6662d3d,
                0x76dc4190, 0x01db7106, 0x98d220bc, 0xefd5102a, 0x71b18589, 0x06b6b51f, 0x9fbfe4a5, 0xe8b8d433,
                0x7807c9a2, 0x0f00f934, 0x9609a88e, 0xe10e9818, 0x7f6a0dbb, 0x086d3d2d, 0x91646c97, 0xe6635c01,
                0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e, 0x6c0695ed, 0x1b01a57b, 0x8208f4c1, 0xf50fc457,
                0x65b0d9c6, 0x12b7e950, 0x8bbeb8ea, 0xfcb9887c, 0x62dd1ddf, 0x15da2d49, 0x8cd37cf3, 0xfbd44c65,
                0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2, 0x4adfa541, 0x3dd895d7, 0xa4d1c46d, 0xd3d6f4fb,
                0x4369e96a, 0x346ed9fc, 0xad678846, 0xda60b8d0, 0x44042d73, 0x33031de5, 0xaa0a4c5f, 0xdd0d7cc9,
                0x5005713c, 0x270241aa, 0xbe0b1010, 0xc90c2086, 0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f,
                0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4, 0x59b33d17, 0x2eb40d81, 0xb7bd5c3b, 0xc0ba6cad,
                0xedb88320, 0x9abfb3b6, 0x03b6e20c, 0x74b1d29a, 0xead54739, 0x9dd277af, 0x04db2615, 0x73dc1683,
                0xe3630b12, 0x94643b84, 0x0d6d6a3e, 0x7a6a5aa8, 0xe40ecf0b, 0x9309ff9d, 0x0a00ae27, 0x7d079eb1,
                0xf00f9344, 0x8708a3d2, 0x1e01f268, 0x6906c2fe, 0xf762575d, 0x806567cb, 0x196c3671, 0x6e6b06e7,
                0xfed41b76, 0x89d32be0, 0x10da7a5a, 0x67dd4acc, 0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5,
                0xd6d6a3e8, 0xa1d1937e, 0x38d8c2c4, 0x4fdff252, 0xd1bb67f1, 0xa6bc5767, 0x3fb506dd, 0x48b2364b,
                0xd80d2bda, 0xaf0a1b4c, 0x36034af6, 0x41047a60, 0xdf60efc3, 0xa867df55, 0x316e8eef, 0x4669be79,
                0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236, 0xcc0c7795, 0xbb0b4703, 0x220216b9, 0x5505262f,
                0xc5ba3bbe, 0xb2bd0b28, 0x2bb45a92, 0x5cb36a04, 0xc2d7ffa7, 0xb5d0cf31, 0x2cd99e8b, 0x5bdeae1d,
                0x9b64c2b0, 0xec63f226, 0x756aa39c, 0x026d930a, 0x9c0906a9, 0xeb0e363f, 0x72076785, 0x05005713,
                0x95bf4a82, 0xe2b87a14, 0x7bb12bae, 0x0cb61b38, 0x92d28e9b, 0xe5d5be0d, 0x7cdcefb7, 0x0bdbdf21,
                0x86d3d2d4, 0xf1d4e242, 0x68ddb3f8, 0x1fda836e, 0x81be16cd, 0xf6b9265b, 0x6fb077e1, 0x18b74777,
                0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c, 0x8f659eff, 0xf862ae69, 0x616bffd3, 0x166ccf45,
                0xa00ae278, 0xd70dd2ee, 0x4e048354, 0x3903b3c2, 0xa7672661, 0xd06016f7, 0x4969474d, 0x3e6e77db,
                0xaed16a4a, 0xd9d65adc, 0x40df0b66, 0x37d83bf0, 0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9,
                0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6, 0xbad03605, 0xcdd70693, 0x54de5729, 0x23d967bf,
                0xb3667a2e, 0xc4614ab8, 0x5d681b02, 0x2a6f2b94, 0xb40bbe37, 0xc30c8ea1, 0x5a05df1b, 0x2d02ef8d
            };
            #endregion
    
            #region - Members -
            public static uint Crc32(byte[] src, uint initialValue)
            {
                return Crc32Part(src, 0, src.Length, initialValue);
            }
    
            public static uint Crc32Part(byte[] buffer, int offset, int length, uint crc32Val)
            {
                for (var i = 0; i < length; i++)
                {
                    crc32Val = Crc32Tab[(crc32Val ^ buffer[offset + i]) & 0xff] ^ (crc32Val >> 8);
                }
    
                return crc32Val;
            }
            #endregion
        }


    Реализация на остальных языках
    Ответ написан
    4 комментария
  • Как в SpringTemplateRadis производить поиск по записанным сущностям?

    sarapinit
    @sarapinit
    Точу водой камень
    Дело в том что Redis - это key-value БД, то есть ваш загруженный json он воспринимает просто как строку. К тому же Redis не поддерживает поиск по значению, есть команда SCAN (и подобные ей) но они работают только для ключей.
    Лучшим решением для вас будет построение дополнительного индекса на базе SORTEDSET либо на базе HASH, в зависимости от варианта использования.

    https://redis.io/topics/indexes
    Ответ написан
    Комментировать
  • Зачем нужен refresh token?

    sarapinit
    @sarapinit
    Точу водой камень
    Определение токена в RFC
    Refresh tokens are credentials used to obtain access tokens. Refresh
    tokens are issued to the client by the authorization server and are
    used to obtain a new access token when the current access token
    becomes invalid or expires, or to obtain additional access tokens
    with identical or narrower scope (access tokens may have a shorter
    lifetime and fewer permissions than authorized by the resource
    owner). Issuing a refresh token is optional at the discretion of the
    authorization server.

    примерно соответствует вашим рассуждениям о нем. Единственное что явно не запрещено повторное использование refresh_token. Обычно это опция которую можно установить для конкретного клиента OAuth2.0.
    Использовать refresh_token в браузере не рекомендуется, потому что нельзя безопасно его хранить. Обычно он используется в десктоп или мобильных приложениях, которые позволяют реализовать защищенное хранение токена.

    https://tools.ietf.org/html/rfc6749#section-1.5
    Ответ написан
    Комментировать
  • Как использовать статическое свойство из дочернего класса?

    sarapinit
    @sarapinit Куратор тега C#
    Точу водой камень
    Я бы отказался от использования глобального состояния. Если вам действительно нужен один экземпляр, то создавайте его явно в корне приложения и переиспользуйте или доверьте эту обязанность IoC контейнеру.
    Реализация без глобальных переменных:

    public abstract class ActiveRecordEntity
        {
            protected int Id { get; set; }
    
            public readonly string TableName;
            public DataTable DataTable { get; }
    
            public ActiveRecordEntity(string tableName, SQLiteConnection connection)
            {
                TableName = tableName;
                DataTable = new DataTable { Locale = CultureInfo.InvariantCulture };
                var dataAdapter = new SQLiteDataAdapter
                {
                    SelectCommand = new SQLiteCommand($"SELECT * FROM {TableName}", connection)
                };
    
                dataAdapter.Fill(DataTable);
            }
        }
        public class Category : ActiveRecordEntity
        {
            public string Title { get; set; }
            public Category(SQLiteConnection connection) : base("category", connection)
            {
            }
        }
    Ответ написан
    Комментировать
  • Как завернуть HTTP запросы в очереди сообщений?

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

    Есть хороший доклад от СКБ-Контур примерно на эту тему

    Игорь Луканин — Как выжить под нагрузкой: отказоус...
    Ответ написан
    2 комментария
  • Как прописать скрипт, чтобы он ждал остановки службы?

    sarapinit
    @sarapinit
    Точу водой камень
    Использовать командлеты powershell. Они ждут.

    The PowerShell cmdlets Stop-Service and Start-Service will wait until the services are fully stopped and started respectively.


    https://superuser.com/questions/396906/is-there-a-...
    Ответ написан
    Комментировать
  • Как работать с большим количеством таблиц?

    sarapinit
    @sarapinit Куратор тега C#
    Точу водой камень
    Делаете класс:
    class Entry {
      string StoreName;
      string ProductName;
      decimal RetailPrice;
      decimal BulkPrice;
    }


    складываете все записи в список и с помощью LINQ сортируете как вам надо:

    List<Entry> list;
    //заполнение списка
    var sorted = list.GroupBy(e => e.ProductName).ToDictionary(e => e.Key, e => e.OrderBy(k => k.RetailPrice).ToArray());


    в итоге получается словарь в котором ключ = наименование товара, значение = отсортированный по розничной цене массив с записями.

    У вас таблицы-то в чём?
    Ответ написан
    7 комментариев
  • Как правильно передать массив байт из приложения .NET Core, при помощи web api?

    sarapinit
    @sarapinit Куратор тега C#
    Точу водой камень
    Раньше в js не было типа byte, поэтому массив байт кодировался в base64 string и отправлялся в строки. Скорее всего у вас происходит тоже самое. Попробуйте декодировать пришедшие байты с помощью Convert.FromBase64
    Ответ написан
    3 комментария