• Как правильно организовать выполнение программы по времени?

    Mike_Ro
    @Mike_Ro
    Python, JS, WordPress, SEO, Bots, Adversting
    На данный момент рассматриваю только вариант
    Thread.Sleep

    Thread.Sleep блокирует текущий поток, что может быть неэффективным и привести к проблемам, если поток должен выполнять другие задачи.
    Подскажите пожалуйста как запускать программу каждые 15 мин. в цикле?

    Цикл обязательно? Может Cron? Либо PeriodicTimer с методом WaitForNextTickAsync, который ожидает следующий тик таймера и возвращает true, если тик произошел, и false, если таймер был отменен.
    Ответ написан
    Комментировать
  • Как правильно организовать выполнение программы по времени?

    AshBlade
    @AshBlade Куратор тега C#
    Просто хочу быть счастливым
    Для начала, что значит каждые 15 минут:
    • между соседними выполнениями
    • между началами запуска


    В первом случае просто: вынести логику в отдельную функцию и после каждого запуска засыпать.
    Во втором случае надо замерять длительность выполнения: перед запуском сохраняешь время, а после получаешь конец и засыпаешь на оставшееся время

    На счет Thread.Sleep - это ок, но если код асинхронный, то используй Task.Delay
    Ответ написан
    Комментировать
  • Десериализовать массив JSON?

    Mike_Ro
    @Mike_Ro
    Python, JS, WordPress, SEO, Bots, Adversting
    Насколько я помню, для десериализации массива строк json в List не требуется передавать отдельный класс DeserializationJson, можно использовать сразу JsonSerializer.Deserialize<List<string>>, попробуйте так:
    using System.Text.Json;
    
    namespace ReflTest;
    
    internal class DesJson
    {
        public IEnumerable<string> RunDesir(string jsonString)
        {
            var result = JsonSerializer.Deserialize<List<string>>(jsonString) ?? Enumerable.Empty<string>();
            return result.Select(item => item.ToString());
        }
    }
    
    class Program
    {
        static void Main(string[] args)
        {
            string jsonString = "[\"1\",\"2\",\"3\",\"4\",\"5\"]";
            DesJson desJson = new DesJson();
            IEnumerable<string> result = desJson.RunDesir(jsonString);
            result.ToList().ForEach(Console.WriteLine);
        }
    }
    Ответ написан
    Комментировать
  • Десериализовать массив JSON?

    BasiC2k
    @BasiC2k
    .NET developer (open to job offers)
    Здесь
    var deserializationJson = JsonSerializer.Deserialize<List<DeserializationJson>>(jsonString);

    должно быть:
    var deserializationJson = JsonSerializer.Deserialize<List<string>>(jsonString);
    Ответ написан
    2 комментария
  • Как взять значение из одной таблицы и прибавить к значению другой таблицы?

    @alexalexes
    Вывести на просмотр:
    SELECT p.price, od.quantity,
              p.price * od.quantity as cost -- в выборке можно не только поля выбирать, но и делать любые сложные матем. операции в пределах сопоставляемых строк и агрегированных функций
    FROM products p
    JOIN orderdetails od ON p.productid = od.productid --  ну, так соединяйте по ключам. Что мешает?
    Where od.orderid = ? -- если нужно ограничиться в пределах заказа

    Применить изменения:
    update orderdetails
    set orderdetails.totalcost = ( select p.price * orderdetails.quantity
                                                    from products p
                                                  where orderdetails.productid = p.productid
                                                ) -- вычисляем цену из таблицы продуктов и изменяем ее в деталях
    where orderdetails.orderid = ? -- если нужно ограничиться в пределах заказа
    and exists (select 1
                        from products p
                        where orderdetails.productid = p.productid
                      ) -- выбираем детали заказа только по тем продуктам, которые есть в продуктах, можно добавить доп. ограничения по затрагиваемым деталям

    Можно навешать триггер на вставку, изменение таблицы orderdetails. Тогда при изменении количества, цена будет пересчитываться с помощью него автоматически.
    Основа триггера:
    update orderdetails
    set orderdetails.totalcost = ( select p.price * new.quantity
                                                    from products p
                                                  where orderdetails.productid = p.productid
                                                ) -- вычисляем цену из таблицы продуктов и изменяем ее в деталях
    where orderdetails.orderdetailid = new.orderdetailid

    PS: Если это учебная база данных, то сойдет. А если реально используется такая модель, то не хватает таблицы "Цена продукта по состоянию на".
    Ответ написан
    Комментировать
  • Как правильно сделать запрос gPRC Tinkoff.InvestApi методу GetTechAnalysis?

    mindtester
    @mindtester Куратор тега C#
    http://iczin.su/hexagram_48
    а так?
    From = Timestamp.FromDateTimeOffset(new DateTime(2023, 12, 31).ToUniversalTime()),
    To = Timestamp.FromDateTime(DateTime.UtcNow),
    у меня ваш код компилируется и исполняется с отказом авторизации, что логично..
    .. а по сигнатуре метода из нугет пакета (текущий релиз) то что у вас закомментировано, вроде как и не к месту..
    .. если что пишите, обсудим (в профиле у меня телега..

    ps что то мне сдается, что по сигнатуре скорее так
    From = Timestamp.FromDateTime(new DateTime(2023, 12, 31).ToUniversalTime()),
    To = Timestamp.FromDateTime(DateTime.UtcNow),
    проDeviation пока не понял..

    pps offset все таки смещение/разница, а методы api содержат вменяемые описания на нашем родном. оба параметра предполагают точечное указание даты. формат локального и универсального времени один, разница +3 часа для Мск. это не могло быть причиной ошибки. думаю все таки не удачный выбор метода (смещение/разница).. типа вы запросили 2023 года, ни то в прошлое, ни то в будущее..
    Ответ написан
  • Как правильно сформировать запрос Тинькофф API gRPC?

    1. Примеры есть, если напишешь issue, то пример новый добавят рано или поздно.
    Для инструментов пример вот:
    https://github.com/RussianInvestments/invest-api-c...

    2. А что именно тебе нужно?
    Вот например:
    var settings = new Tinkoff.InvestApi.InvestApiSettings
    {
        AccessToken = "..."
    };
    var client = Tinkoff.InvestApi.InvestApiClientFactory.Create(settings);
    var currencies = client.Instruments.Currencies();
    foreach (var currency in currencies.Instruments)
    {
        Console.WriteLine(
            $"{currency.Uid} {currency.Ticker} {currency.Name} {currency.Nominal.Units + currency.Nominal.Nano / 1000000000m} {currency.Nominal.Currency}");
    }


    PS: https://github.com/RussianInvestments/invest-api-c...
    Ответ написан
    1 комментарий
  • Как подключить proto файлы к проекту?

    NikFaraday
    @NikFaraday
    Student full-stack Developer
    Клик сюда
    660ebe1a9e832661047201.jpeg

    Далее сюда
    660ebe371e0df243799837.png

    Подключаете .proto файл. После этого делает Rebuild вашего solution'а. Потом даблклик по проекту, в этом .csproj файле ищите секцию ItemGroup в которой будут ваши Protobuf. К ним додаёте аттрибут ProtoRoot, который (Для удобной работы) должен быть таким же как и пусть в аттрибуте Include без указания названия файла .proto

    UPD:
    Так же стоит отметить, чтобы импортировать в .proto ваш другой .proto, они должны быть хотя бы на одном уровне. Другими словами, вы можете импортировать только файлы, который находятся по архитектуре на том же уровне или ниже, потому что в import запрещено использования символа точки и запятой. Это значит, что вы не сможете выйти на уровень выше
    Ответ написан
    7 комментариев
  • Какой шаблон проекта выбрать при написании телеграмм бота Visual Studio 2022?

    DELAKEY
    @DELAKEY
    Кодю почучуть
    ASP.NET может пригодиться если
    1. Захочешь использовать webhook для приёма сообщений
    2. Будешь использовать в приложении WebApp
    Ну, а так консоли хватит.
    Ответ написан
    Комментировать
  • Какой шаблон проекта выбрать при написании телеграмм бота Visual Studio 2022?

    NikFaraday
    @NikFaraday
    Student full-stack Developer
    А что такое API? Это просто сервер, куда вы будете делать HTTP запросы и получать информацию. Как разница, откуда вы будете делать HTTP запрос используя HttpClient. Ваш шаблон просто будет показывать, как вы это собираетесь выводить пользователю.

    Хотите простенькую программу? Делайте Console Application
    Хотите минимальный, но рабочий GUI? Делайте на Windows Forms/WPF
    Хотите, что бы вашей программой пользовались на телефоне? Можете делать на Xamarin.NET или MUI
    Хотите, что бы ваша программа была доступна без скачивания? Делайте на asp.net mvc
    Хотите, что бы ваша программа была в интернете и имела красивый и быстрый UI? Можете сделать на asp.net web api и прикрепить туда в качестве клиента React, Angular или Vue.js
    Не хотите делать переадресация трафика через API? Можете сделать только на React, Angular или Vue.js
    Хотите быстрый GUI в браузере, но не хотите отходить от технологий Microsoft? используйте asp.net Blazor
    Ответ написан
    Комментировать
  • Какой шаблон проекта выбрать при написании телеграмм бота Visual Studio 2022?

    AshBlade
    @AshBlade Куратор тега C#
    Просто хочу быть счастливым
    Для простого телеграм бота подойдет и консольное.
    ASP.NET Core/Web.API - точно нет, т.к. они для веб-приложений, у тебя не такое.
    Также может подойти шаблон Worker Service, но он больше для каких-то сложных приложений.

    Предлагаю пока остановиться на консольном, но параллельно изучать Worker Service, т.к. в нем много удобных вещей - логирование, обработка исключений, мониторинг, DI и т.д.
    Возможно, однажды пригодится, но пока оставайся на консоли.
    Ответ написан
    2 комментария
  • Как отследить то, что самопроизвольно закрывает приложения NET в Ununtu?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Если приложение, запущенное через &, попробует написать что-то в консоль, то при невозможности написать в эту консоль начнутся проблемы (приложение словит SIGHUP или SIGPIPE). Решение - перенаправить явно весь вывод в /dev/null:

    command > /dev/null 2> /dev/null &

    Вместо двух перенаправлений в /dev/null можно одно перенаправление в /dev/null и одно в другой:

    command > /dev/null 2>&1 &

    Так делать в подобной ситуации необязательно, но часто делают, и полезно знать. Также надо понимать, что запись:

    > file

    эквивалентна:

    >1 file

    А запись:

    < file

    эквивалентна:

    <0 file

    Всё потому, что стандартные файловые идентификаторы такие: 0 - stdin, 1 - stdout, 2 - stderr.

    Также бывают проблемы, когда приложение хочет что-то прочитать с консоли. Можно ему и на вход передать тоже /dev/null:

    command > /dev/null 2> /dev/null < /dev/null &

    Но даже в таком случае при закрытии консоли bash пошлёт висящему в фоне процессу SIGHUP. Чтобы это не случилось, нужно сделать disown сразу после выполнения команды, и это можно сделать в той же строке:

    command > /dev/null 2> /dev/null < /dev/null & disown


    Всё это можно сделать одной командой nohup, которая упрощает все эти действия и вывод записывет в файл nohup.out:

    nohup command &

    Подробнее в man, он довольно короткий и рассказывает всё в деталях.

    Иногда приложения не могут работать совсем без терминала, в этом случае их можно запускать в в screen/tmux или docker.

    Я не просто так рассказываю: понимать теорию очень полезно, в том числе теперь, надеюсь, не возникнет вопроса, почему длительные и просто даже критические к прерыванию операции настоятельно советуют запускать в screen, а не полагаться на то, что они успешно завершатся без отваливания консоли, и добавление & тут ничего не гарантирует!

    Но всё же, совет сразу же научиться использовать systemd (а в других операционных системах и дистрибутивах - возможно свои другие системы управления сервисами) - он ОЧЕНЬ ПРАВИЛЬНЫЙ. Это сложно только в первый раз :)

    Также в особых случаях можно ограничиться специализированными менеджерами типа supervisor или pm2. Особыми являются только случаи, когда подобные менеджеры уже используются для запуска других сервисов, с нуля их использовать при наличии универсального и хорошо работающего systemd практически лишено смысла.
    Ответ написан
    Комментировать
  • Как отследить то, что самопроизвольно закрывает приложения NET в Ununtu?

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

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

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

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

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

    mindtester
    @mindtester Куратор тега C#
    http://iczin.su/hexagram_48
    если ответная строка короткая, нет проблем распарсить ее самостоятельно, несколько строк кода..
    обдумайте..

    ps если строка короткая - видимо ошибка? или уже десериализация в другой класс.. а можно и банальный split по скобкам, кавычками и запятой.. и анализ содержимого - сколько элементов? и оценка значений, тех что интересуют..
    .. а со временем может освоите и получение/распознавание, класса, который не знали ранее ;))
    Ответ написан
    5 комментариев
  • Как передать экземпляр объекта в другой класс?

    AshBlade
    @AshBlade Куратор тега C#
    Просто хочу быть счастливым
    Ты передаешь object, а не HttpClient

    class Class1 (HttpClient client)
        {
            public async Task StartVkAsync()
            {            
                using (HttpResponseMessage response = await client.GetAsync("https://ya.ru/"))
                {
                    var JsonString = await response.Content.ReadAsStringAsync();
                    await Console.Out.WriteLineAsync(JsonString);
                }
            }
        }
    Ответ написан
    1 комментарий
  • Эффективный long polling запрос Telegram API каа правильно сделать?

    AshBlade
    @AshBlade Куратор тега C#
    Просто хочу быть счастливым
    Для чего нужен "timeout" в строке запроса?

    long polling - это когда делаешь запрос и ждешь пока произойдет окончание операции. в данном случае, окончание означает то, что какое-то событие произошло и получены обновления.
    И тут возникает вопрос - сколько ждать?
    Например, ты просто хочешь узнать есть ли новые сообщения - тут ждать не надо, ответ сразу, или это фоновый поток, который должен реагировать на каждое сообщение - тогда надо ждать пока не получишь сообщение, т.е. ждать можешь долго.
    Таймаут - это время, которое будет затрачено на эту операцию. Здесь оно выставляется в секундах.
    Если таймаут превышен, то соединение разрывается и ответа ты не получаешь, иначе в теле ответа будут нужные данные.
    Для твоего случая, ставь таймаут побольше, например, 300 - ждешь 5 минут.
    Лучше не ставить бесконечное время ожидания, т.к. что-то может сломаться, а ты об этом не узнаешь и по-факту будешь ожидать ничего
    Ответ написан
    2 комментария
  • Как собрать JSON из класса?

    AshBlade
    @AshBlade Куратор тега C#
    Просто хочу быть счастливым
    Ты не инициализируешь основной массив. Это таким образом делается.
    Rootobject rootobject = new Rootobject();
    rootobject.keyboard = new string[2][];
    Ответ написан
    1 комментарий
  • Как сформировать Json из массива?

    AshBlade
    @AshBlade Куратор тега C#
    Просто хочу быть счастливым
    Ты записываешь данные в неинициализированные массив.
    Т.е. у тебя каждый элемент внешнего массива - null.

    Просто инициализируй их:
    var keyboard = new Inline_Keyboard[3][];
    keyboard[0] = new Inline_Keyboard[1];
    keyboard[1] = new Inline_Keyboard[2];
    keyboard[2] = new Inline_Keyboard[2];
    rootobject.inline_keyboard = keyboard;


    P.S. но лучше замени на List
    Ответ написан
    6 комментариев
  • Как сформировать Json из массива?

    @mvv-rus
    Настоящий админ AD и ненастоящий программист
    Вы не инициализуете сами массивы (не содаете для них объекты типа Inline_Keyboard[]) нижнего уровня: rootobject.inline_keyboard[0] и rootobject.inline_keyboard[1]. Ну, и rootobject.inline_keyboard[2] тоже стоило бы создать IMHO.
    Ответ написан
    Комментировать