• Почему 0,5 округляется до чётного числа?

    AshBlade
    @AshBlade Куратор тега C#
    Просто хочу быть счастливым
    Округляет до четного, потому что так написано в документации к функции:

    The integer nearest a. If the fractional component of a is halfway between two integers, one of which is even and the other odd, then the even number is returned. Note that this method returns a Double instead of an integral type.


    Если нужное другое округление, то есть перегрузки:
    Math.Round(4.5, MidpointRounding.ToEven);
    Math.Round(4.5, MidpointRounding.ToZero);
    Math.Round(4.5, MidpointRounding.AwayFromZero);
    Math.Round(4.5, MidpointRounding.ToNegativeInfinity);
    Math.Round(4.5, MidpointRounding.ToPositiveInfinity);
    Ответ написан
    2 комментария
  • Какие есть бинарный сериализаторы для React?

    vabka
    @vabka
    Токсичный шарпист
    cbor? https://www.npmjs.com/package/cbor
    bson? https://www.npmjs.com/package/bson
    protobuf? https://www.npmjs.com/package/protobufjs

    А может всё-таки msgpack? Почему он не подходит?
    Ответ написан
    Комментировать
  • Какие есть бинарный сериализаторы для React?

    AshBlade
    @AshBlade
    Просто хочу быть счастливым
    Protobuf - https://github.com/protobufjs/protobuf.js
    Avro - https://github.com/mtth/avsc
    Parquet - https://github.com/ironSource/parquetjs (проект давно не обновлялся)
    Thrift - https://thrift.apache.org/tutorial/js

    P.S. React или нет без разницы - тут js главное
    Ответ написан
    Комментировать
  • В чём разница между DI, DI-контейнером и сервис-локатором?

    delphinpro
    @delphinpro
    frontend developer
    DI - Внедрение зависимостей.
    DI-container – хранилище зависимостей
    Service Locator - механизм, обеспечивающий неявное извлечение "зависимости" (то есть некоторого объекта) из хранилища зависимостей.
    Ответ написан
    1 комментарий
  • В чём разница между DI, DI-контейнером и сервис-локатором?

    AshBlade
    @AshBlade
    Просто хочу быть счастливым
    DI, Dependecy Injection - это сам процесс внедрения зависимостей (например, когда ты зависимости через конструктор получаешь)
    Пример:
    class User
    {
        IService _service;
        
        // DI
        User(IService service)
        {
              _service = service;
        }
    }


    DI-Container - это специальный контейнер, который может необходимую зависимость предоставить. Сначала ты в него регистрируешь все зависимости, а потом вызываешь метод по типу .getService("UserService") и он сам понимает какой сервис ты хочешь, какая у него реализация и как его создать (возможно для него нужны другие зависимости)
    Пример
    // DI-контейнер
    var container = new DependencyContainer();
    container.Register(typeof(IService), new ConcreteService());
    
    var service = container.Get<IService>();


    Сервис-локатор - это (анти) паттерн, когда, грубо говоря, у тебя есть статический класс этого DI контейнера, к которому обращаются все сервисы. Т.е. вместо того, чтобы использовать тот же самый DI или передавать интерфейс DI контейнера они напрямую обращаются к конкретному DI-контейнеру. Так делать не надо - будут трудности с тестированием, обновлением и всем сопутствующим
    Пример
    // Сервис-локатор
    class ServiceRegistry
    {
         IService Service;
         static IService GetService()
         {
               return Service;
         }
    }
    
    class User
    {
         void DoSomething()
         {
               var service = ServiceRegistry.GetService();
               service.MakeStuff();
         }
    }
    Ответ написан
    2 комментария
  • Есть ли хороший курс/книга про использование паттерна page object на C#?

    AshBlade
    @AshBlade Куратор тега C#
    Просто хочу быть счастливым
    Курс/книга ради одного паттерна - вряд ли можно найти хорошие.
    Page Object паттерн из GUI тестирования, поэтому искать там. Рекомендую курс от Selenium - https://www.seleniumtraining.com/selenium-c-sharp-...
    Там как раз есть 6 часовой туториал с проектом по Page Object, но он в платной подписке.

    Также по тестированию на C# есть книга Selenium with C# - в 12 главе описывается Page Object

    Есть статья на хабре, но думаю она только описывает этот паттерн, только для знакомства
    Ответ написан
    1 комментарий
  • Фреймворки для кросс-платформенной разработки. Практикуют ли переписывание под разные платформы?

    AshBlade
    @AshBlade Куратор тега C#
    Просто хочу быть счастливым
    Windows Forms - это только Windows, т.к. он построен вокруг нативных системных вызовов Windows. Вообще-то я однажды писал Windows Forms для Linux, но там очень много было костылей и багов, поэтому - нет, не надо.

    Что касается кросс-платформенной разработки на C#.
    Если речь идет про разработку оконных приложений, то тут 2 варианта:
    - Avalonia UI - это кросс-платформенный фреймворк, разрабатываемый сообществом (не майкрософтом), очень похож на WPF. Есть почти все платформы
    - MAUI - это новый кросс-платформенный фреймворк, разрабатываемый майкрософтом. Он довольно новый, поддерживает множество платформ (по странице документации даже Linux (GTK#)). Но он довольно сырой и по отзывам очень много багов
    - WebAssembly/Blazor - фреймворк для создания PWA, веб-приложений, но можно и для мобильных приложений
    Ответ написан
    3 комментария
  • Почему у черной дыры есть электрический заряд?

    Vindicar
    @Vindicar
    RTFM!
    Причина раз: правило сохранения заряда. Электрический заряд нельзя создать и уничтожить, только перераспределить в пространстве.
    Причина два: с точки зрения внешнего наблюдателя тело будет падать в чёрную дыру за бесконечное время. Его влияние на окружающую вселенную - например, испущенный свет - будет бесконечно ослабевать, но никогда не станет нулевым. При этом с точки зрения падающего тела, падение займёт очень даже конечное (и не слишком большое) время. Относительность - она такая.
    Ответ написан
  • Как отследить то, что самопроизвольно закрывает приложения NET в Ununtu?

    ky0
    @ky0
    Миллиардер, филантроп, патологический лгун
    Никакое это не автономное приложение. Запускайте как systemd-сервис - тогда будет вам и контроль состояния, и логирование, и перезапуск.
    Ответ написан
    5 комментариев
  • Как отследить то, что самопроизвольно закрывает приложения NET в Ununtu?

    AshBlade
    @AshBlade Куратор тега C#
    Просто хочу быть счастливым
    Автономные приложения под линуксом надо запускать как сервисы через systemd.
    Как это сделать можно почитать тут - https://habr.com/ru/companies/timeweb/articles/759966/

    С помощью этого, можно будет выставить политику повторного запуска при остановке, логи можно в syslog сохранять и подобное.
    Так как ты запускал это все в фоновом режиме и вышел, то родительским процессом стал init, все логи потерялись. Максимум можно дамп ядра получить, но это еще при выставленных настройках.

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

    Могу также порекомандовать запускать это все в докере. Немного замороченно, но та же самая функциональность (логи и рестарт), что и в systemd сервисе.
    Ответ написан
    1 комментарий
  • Как правильно вызвать функцию на клиенте через SignalR за учётом авторизации?

    BasiC2k
    @BasiC2k
    .NET developer (open to job offers)
    Получается что нужен список клиентов (браузеров), на которых открыт определённый блог.
    И при добавлении поста рассылку нужно выполнять только на них. В этом случае возможно решением будет использование групп SignalR
    При открытии страницы, клиент подписывается на группу (блог) и получает оповещения вместе с другими подписчиками.
    О группах также можно почитать здесь.
    Ответ написан
    1 комментарий
  • Как создать hover поверх элемента?

    Mike_Ro
    @Mike_Ro
    Python, JS, WordPress, SEO, Bots, Adversting
    Нужно, чтобы при наведение на любую из кнопку верхний и нижний бордер меняли цвет.

    Ответ написан
    2 комментария
  • Разработчик недисциплинированно трекает время. Что делать?

    BasiC2k
    @BasiC2k
    .NET developer (open to job offers)
    Вы рассмотрели возможные причины "со своей колокольни" и сами дали на них ответ. Что показывает Ваш авторитарный (директивный) стиль управления.
    Постарайтесь быть ближе к подчинённым, разговаривайте с ними, вникайте в их проблемы. Тогда они сами расскажут - почему они не трекают, а Вы поймёте как это решить.
    Сейчас у Вас нет обратной связи.
    Ответ написан
    Комментировать
  • Как сделать функцию ping?

    Get-Web
    @Get-Web Куратор тега JavaScript
    Front-End Developer
    setIntrval не самое лучшее решение так как, если пользователь перейдет на другую вкладку или свернет браузер, то вызовы могут накапливаться и выполняться одновременно, когда пользователь вернется.

    Лучше использовать setTimeout:
    function ping(url, fn) {
      fetch(url);
      setTimeout(fn, 10000, url, fn);
    }
    
    ping("https://google.com", ping);

    Можно сделать повторный вызов уже после ответа с сервера, причем не важно удачный или нет:
    function ping(url, fn) {
      fetch(url).then((response) => {
        setTimeout(fn, 10000, url, fn);
      });
    }
    
    ping("https://google.com", ping);
    Ответ написан
    2 комментария
  • Как сделать функцию ping?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    1 комментарий
  • Какой лучший способ передать объект с приватными полями?

    VoidVolker
    @VoidVolker Куратор тега C#
    Dark side eye. А у нас печеньки! А у вас?
    Если на обоих концах у вас dotNet или на одном JS, то можно попробовать MemoryPack - он умеет работать с приватными полями. Но есть нюанс: он хочет partial класс и сам генерирует основной класс с нужными ему статическими полями. Ну и для передачи по сети можно архиватором упаковать с контрольной суммой.

    spoiler

    Небольшой класс для упрощения упаковки/распаковки - наследуем от этого класса целевой объект и через расширение вызываем методы упаковки/распаковки:
        /// <summary>
        /// Класс [де]сериализуемый MemoryPack
        /// <br />Необходим для добавления всем наследуемым классам метода сериализации через расширение
        /// <br />Наследование данного метода не работает из-за каста в целевой класс
        /// </summary>
        public class Packable { }
    
        /// <summary>
        /// Расширение для [де]сериализуемых классов MemoryPack
        /// </summary>
        public static class PackableExtension
        {
            /// <summary>
            /// Сериализовать класс в массив байтов
            /// </summary>
            /// <typeparam name="T">Целевой класс</typeparam>
            /// <param name="data">Объект целевого класса</param>
            /// <returns></returns>
            public static byte[] Pack<T>(this T data) where T : Packable
                => MemoryPackSerializer.Serialize(data);
    
            /// <summary>
            /// Десериализовать класс из массива байтов
            /// </summary>
            /// <typeparam name="T">Целевой класс</typeparam>
            /// <param name="data">Массив байт</param>
            /// <returns></returns>
            public static T Unpack<T>(this byte[] data) where T : Packable
                => MemoryPackSerializer.Deserialize<T>(data);
        }
    Ответ написан
    1 комментарий
  • Как заставить провайдера предоставлять стабильное интернет соединение?

    @Drno
    Скорее всего причина банальна - вечером идет наплыв юзеров, и у провайдера либо начинает тупить оборудование на доме, либо не хватает ширины канала от дома до узла связи.
    Я такое наблюдал у домру например.

    Вариант решения тут один - смена провайдера.

    Конечно это всё при условии что витая пара к Вам нормальная и Ваше оборудование тоже. И проверяется это всё надеюсь по кабелю, а не по вифи. В целом это проверить достаточно просто - подключив ПК напрямую в прова, минуя роутеры. Если косяк сохраняется - то 100% вина провайдера. тем более раз это не постоянно, а только в часы пик
    Ответ написан
    2 комментария
  • Как заставить провайдера предоставлять стабильное интернет соединение?

    leahch
    @leahch
    3D специалист. Dолго, Dорого, Dерьмово.
    1) Пинг, увы, ничего не говорит о качестве связи. ОН говорит, что могут быть потеряны ICMP пакеты. Но обычно у них самый низкий приоритет. И да, они могут теряться.
    2) Надеюсь, все тесты делаем по кабелю, а не по WiFi?
    3) Точно ли уверены, что все оборудование у вас работает нормально? Другое пробовали?
    4) Сам входящий кабель проверяли?
    5) Как интернет подключен?
    6) Если уж и тестировать, то возьмите iperf и потестируйте хоть до своей vps.

    Но как обычно, скорее всего проблема на вашей стороне, если только провайдер не из мухосранска...
    Ответ написан
    2 комментария
  • Объясните модификаторы доступа?

    AshBlade
    @AshBlade Куратор тега C#
    Просто хочу быть счастливым
    В спецификаци C# ECMA-334 это описывается в терминах доменов доступности - Accessibility domain.
    Каждый модификатор доступа выставляет определенные ограничения на эту доступность. В результате, у тебя будут следующие "области" - A -> Method.
    Главное правило - ты не можешь получить доступ к member, которые не в твоем домене.
    Пример оттуда:
    Example: In the following code
    public class A
    {
     public static int X;
     internal static int Y;
     private static int Z;
    }
    internal class B
    {
     public static int X;
     internal static int Y;
     private static int Z;
     public class C
     {
     public static int X;
     internal static int Y;
     private static int Z;
     }
     private class D
     {
     public static int X;
     internal static int Y;
     private static int Z;
     }
    }

    the classes and members have the following accessibility domains:
    • The accessibility domain of A and A.X is unlimited.
    • The accessibility domain of A.Y, B, B.X, B.Y, B.C, B.C.X, and B.C.Y is the program text of the
    containing program.
    • The accessibility domain of A.Z is the program text of A.
    • The accessibility domain of B.Z and B.D is the program text of B, including the program text of
    B.C and B.D.
    • The accessibility domain of B.C.Z is the program text of B.C.
    • The accessibility domain of B.D.X and B.D.Y is the program text of B, including the program
    text of B.C and B.D.
    • The accessibility domain of B.D.Z is the program text of B.D. As the example illustrates, the
    accessibility domain of a member is never larger than that of a containing type. For example,
    even though all X members have public declared accessibility, all but A.X have accessibility
    domains that are constrained by a containing type.
    end example

    Для твоего примера - домены доступности для этих методов одни и те же (неявно возвращается глобальный System.Void), поэтому корректная конструкция.
    А вот если из публичного метода возвращать боле ограниченный тип, то будет нарушение. Т.к. возвращаешь более ограниченный из глобального.
    Ответ написан
    2 комментария
  • Как всё успевать и не быть роботом?

    В последнее время сам меняю свою образ жизни с фриланс-свободы на офис/8 часов, так что подобными вопросами сам задаюсь. И я для себя все решил на текущее время, поэтому могу поделиться уже законченными мыслями.

    Вы сейчас хотите из одной крайности прыгнуть в другую, это ожидаемо, кажется, что так будет лучше и т.п. Все успевать - это нереально. Спорт, правильное питание отнимает очень много времени; я жил с людьми, которые занимались регулярно и тем и тем, там часа 2 точно в день уходит на еду, плюс еще на спорт столько же. Но там чувак фанател по этому.

    Какая там музыка, 1-3 часа? Реально? С чем, а с музыкой (и с творчеством вообще) это точно не работает. Я недавно решил накидать ударку для демки, потратил порядка 5 часов на 16 тактов, расставлял всякие крутые фичи, думал, как будет качать. Здоровая еда и спорт - это не про вас, если вы хотите, чтобы музыка качала. Образно, конечно, я говорю.

    Ответ очень простой. Просто забить на то, как правильно, а делать только то, что по фану. Мне вот, например, английский как-то не сильно критичен... Я довольно легко общаюсь на нем письменно, читаю доки еще проще, общаюсь очень плохо, лучше слышу американский акцент. Не хочу вот им заниматься систематически и все тут) Мне проще провалить 5 собеседований из-за плохого английского и учить его в экстремальных условиях, чем по распорядку что-то там делать, потому что успешные люди сказали, что это круто. Делайте то, как у вас душа лежит, не гонитесь за всем.

    Не смотрите на успешных людей, которые все успевают. Это какая-то модная фича в 21 веке... на работе ты все успел, в воскресенье взял велик, поехал за город, покатался, вернулся, типа отдохнул. Если у вас появляются какие-то вопросы, то это, скорее всего, не для вас.

    Обычно человек чем-то занимается профессионально и чем-то для хобби (в свободное время). Причем хобби вполне может быть профессиональным, но "для себя". Что касается профессиональной деятельности, то можно особо никуда не бежать и при этом развиваться. Уроки по разработке 1-2 часа в день после 8 часов работы? Да ладно, это не работает)) Не бегите так сильно: просто хорошо работайте, старайтесь брать интересные проекты, периодически "горизонтально ходите" по своей области. И все будет хорошо. Вы разработчик? Читайте алгебру по фану, она очень мышлению помогает. Скажите в субботу всем, что вы решили "посидеть за компом", и посмотрите интересный фреймворк или допилите что-то в опенсорс. Делайте главное все это систематически или относительно систематически. И через какое-то время вы поймете, что развитие идет. Главное делайте все круто, что касается работы (чувствуется кривой подход? надо это поправить, это будет и скилл и проекту лучше). И мониторьте разные хабры, модные течения, но не пристально. В общем, кто-то бежит очень сильно, а кто-то медленнее. К качеству это вряд ли имеет какое отношение.

    А что касается того, что хочется делать хобби и делать его круто... Здесь выхода нет, придется отставить спорт, правильное питание, не тратить на это время, да. Переехать поближе к работе, возможно, сменить город на поменьше и делать весь вечер игры или музыку, чтобы качала. Мешать соседям, все это не важно... Как и сердечно-сосудистые заболевания (у меня, кстати, есть зачатки, так что я очень хорошо знаю, что такое аритмии/экстрасистолия, повышенное давление, частые головные боли и так далее).

    Семья? Говорят еще, что надо семью. Это все чуть позже (имею в виду детей, т.к. именно они реально обременяют). Не могу представить, как можно жить одному (давно не жил), но если человек рядом понимает, то проблем быть не должно быть.

    В качестве вывода:

    1) Найти свой темп. Пусть он медленнее, чем у самого медленного человека в мире, но главное - быть качественным.
    2) Не гнаться за всем, сделать акцент на самом важном. Обычно, кстати, у человека все интересы смежные или их не более двух (больших таких категорий/классов интересов), так что тут легко сделать акцент на самом важном. Это чувствуется всегда (мой субъективный опыт, исключения вижу оооочень редко).
    3) Забить на модные штуки 21 века а-ля спорт, ЗОЖ. Делайте зарядку по утрам и не всегда ешьте фастфуд, и все будет хорошо.
    4) Работа... Не то, чтобы это центр вашей жизни. Я для себя уяснил одно только правило: делайте круто то, что вы делайте. Вы можете не брать много проектов/ответственности, уходить с работы строго в 6 и ни минутой позже, в общем, в разное время относиться к работе по-разному. Когда-то стрелять там и блистать идеями, когда-то просто работать, когда-то особо не развиваться и заниматься хобби. Относитесь к ней проще. Такая идея лично мне дает свободу, я лучше работаю так. Тем более, что мы с вами в мире IT. У нас работа совпадает с тем, что интересно по-настоящему. Вы же не пьете чай каждую минуту, потому что он очень крутой? Иногда можно не пить его целый день, но это не важно, вы все равно вернетесь к нему через день или два, потому что он нравится. :)
    5) Как успевать все и не быть роботом? Никак :)

    p.s. Я старался вас успокоить немного, у вас больше психология, нежели реальные проблемы. Не то, чтобы надо всегда быть таким спокойным, нет. Можно адско побегать неделю или месяц. Вы слишком сильно подвержены влиянию разных течений в обществе, они конфликтуют с видением мира настоящего внутри вас. Надо всегда что-то терять. Нельзя повысить уровень абстракции и не усложнить систему (= повысить входной порог). Нельзя очень напрячь руку и сохранить ее мобильность. И да, нельзя повысить количество занятий, не потеряв в качестве (есть какой-то порог, но ваш план перешел порог нормального человека после 3.5 пункта).
    Ответ написан
    1 комментарий