Все сервисы Хабра

Сообщество IT-специалистов

Ответы на любые вопросы об IT

Профессиональное развитие в IT

Удаленная работа для IT-специалистов

Войти на сайт
  • Все вопросы
  • Все теги
  • Пользователи

Хабр Q&A — вопросы и ответы для IT-специалистов

Получайте ответы на вопросы по любой теме из области IT от специалистов в этой теме.

Узнать больше
другие проекты хабра
  • Хабр
  • Карьера
  • Фриланс
Задать вопрос
AlexanderYudakov

Александр Юдаков

C#, 1С, Android, TypeScript
  • 168
    вклад
  • 1
    вопрос
  • 265
    ответов
  • 36%
    решений
Ответы
  • Информация
  • Ответы
  • Вопросы
  • Комментарии
  • Подписки
  • Нравится
  • Достижения
  • Я делаю http сервер с нуля как сделать приём файлов?

    AlexanderYudakov
    Александр Юдаков @AlexanderYudakov
    C#, 1С, Android, TypeScript
    То, что вы здесь привели, называется HTTP-заголовки.
    Данные идут следом за заголовками. Разделитель между заголовками и данными - два перевода строки.
    Длина передаваемых данных указана в заголовке "Content-Length" в байтах: 93611

    Пример того, как работать с "Content-Type: multipart/*; boundary=...", можно посмотреть здесь:
    https://developer.mozilla.org/en-US/docs/Web/HTTP/...

    Обратите внимание, что при использовании boundary спереди добавляется "--".
    Ответ написан 15 мар.
    Комментировать
    Комментировать
  • Какую актуальную библиотеку можно использовать в роли брокера сообщений внутри .NET приложения?

    AlexanderYudakov
    Александр Юдаков @AlexanderYudakov
    C#, 1С, Android, TypeScript
    Решил размяться.

    Вот шина:
    MessageBus.cs

    using System;
    using System.Collections.Generic;
    using System.Diagnostics;
    using System.Threading.Tasks;
    
    namespace SimpleMessageBus
    {
        /// <summary>
        /// Рассылает события заинтересованным подписчикам
        /// в рамках одного приложения.
        /// </summary>
        /// <remarks>Используются WeakReference, чтобы не было утечек памяти
        /// на случай, если кто-то забудет отписаться. Поэтому не рекомендуется
        /// использовать лямбда-обработчики событий.</remarks>
        public static class MessageBus
        {
            private static readonly Dictionary<string, List<WeakReference<Action<string, object>>>> Subscribers =
                new Dictionary<string, List<WeakReference<Action<string, object>>>>();
    
            /// <summary>
            /// Оформляет подписку на событие
            /// </summary>
            /// <param name="topic">Тип события</param>
            /// <param name="handler">Подписчик</param>
            public static void Subscribe(string topic,
                Action<string, object> handler)
            {
                if (String.IsNullOrEmpty(topic))
                    throw new ArgumentNullException(nameof(topic));
    
                if (handler == null)
                    throw new ArgumentNullException(nameof(handler));
    
                List<WeakReference<Action<string, object>>> handlers;
                lock (Subscribers)
                    if (!Subscribers.TryGetValue(topic, out handlers))
                        handlers = Subscribers[topic] = new List<WeakReference<Action<string, object>>>();
    
                lock (handlers)
                    handlers.Add(new WeakReference<Action<string, object>>(handler));
            }
    
            /// <summary>
            /// Отменяет подписку на событие
            /// </summary>
            /// <param name="topic">Тип события</param>
            /// <param name="handler">Подписчик</param>
            public static void Unsubscribe(string topic,
                Action<string, object> handler)
            {
                if (String.IsNullOrEmpty(topic))
                    throw new ArgumentNullException(nameof(topic));
    
                if (handler == null)
                    throw new ArgumentNullException(nameof(handler));
    
                List<WeakReference<Action<string, object>>> list;
                lock (Subscribers)
                    if (!Subscribers.TryGetValue(topic, out list))
                        return;
    
                lock (list)
                {
                    var i = 0;
                    while (i < list.Count)
                    {
                        var reference = list[i];
                        if (!reference.TryGetTarget(out var target))
                            list.RemoveAt(i); // Заодно очищаем список от мертвых подписчиков
                        else if (target == handler)
                        {
                            list.RemoveAt(i);
                            return;
                        }
                    }
                }
            }
    
            /// <summary>
            /// Оповещает подписчиков о наступлении события
            /// </summary>
            /// <param name="topic">Тип события</param>
            /// <param name="data">Данные события</param>
            public static void Publish(string topic, object data = null)
            {
                if (String.IsNullOrEmpty(topic))
                    throw new ArgumentNullException(nameof(topic));
    
                List<WeakReference<Action<string, object>>> list;
                lock (Subscribers)
                    if (!Subscribers.TryGetValue(topic, out list))
                        return;
    
                var handlers = new List<Action<string, object>>();
                lock (list)
                {
                    var i = 0;
                    while (i < list.Count)
                    {
                        var reference = list[i];
                        if (!reference.TryGetTarget(out var target))
                            list.RemoveAt(i);
                        else
                        {
                            handlers.Add(target);
                            ++i;
                        }
                    }
                }
    
                // В Unity вызывать обработчики событий, наверное,
                // нужно как-то так:
                UnityEngine.WSA.Application.InvokeOnAppThread(() =>
                // А в обычном консольном приложении так:
                // Task.Run(() =>
                {
                    foreach (var handler in handlers)
                    {
                        try
                        {
                            handler.Invoke(topic, data);
                        }
                        catch (Exception ex)
                        {
                            Debug.WriteLine(ex);
                        }
                    }
                }, false);
            }
        }
    }


    Вот пример использования:
    using System.Diagnostics;
    using System.Threading.Tasks;
    
    namespace SimpleMessageBus
    {
        public static class Program
        {
            public static async Task Main(string[] args)
            {
                Debug.WriteLine("Started.");
    
                MessageBus.Subscribe("Rain", RainHandler);
                MessageBus.Publish("Rain");
    
                await Task.Delay(100); // Ждем, пока событие поступит
                MessageBus.Unsubscribe("Rain", RainHandler);
                
                Debug.WriteLine("Finished.");
            }
    
            private static void RainHandler(string topic, object data)
            {
                Debug.WriteLine("Event: " + topic);
            }
        }
    }


    P.S. Бесплатно. Опенсорс.

    Upd. Добавил вызов UnityEngine.WSA.Application.InvokeOnAppThread() — все-таки у нас целевая платформа Unity.
    Ответ написан 13 нояб. 2021
    1 комментарий
    1 комментарий
  • Asp.net Как запустить процесс на фоне?

    AlexanderYudakov
    Александр Юдаков @AlexanderYudakov
    C#, 1С, Android, TypeScript
    static bool IsLongTaskRunning = false;
    static object Sync = new object();
    
    static void StartLongTask() {
        lock(Sync) {
            if (IsLongTaskRunning) // Предыдущий вызов еще не завершился
                return;
            IsLongTaskRunning = true;
        }
        Task.Run(async () => {
            Debug.WriteLine("Long task started...");
            try
            {
                await Task.Delay(TimeSpan.FromMinutes(2)); // "Длинный метод" из моей "другой библиотеки"
                Debug.WriteLine("Long task done.");
            } catch(Exception ex) {
                Debug.WriteLine("Long task failed: " + ex);
            }
    
            lock(Sync) {
                IsLongTaskRunning = false;
            }
        });
    }
    Ответ написан 13 нояб. 2021
    Комментировать
    Комментировать
  • Обработка атрибутов xml, как организовать без промежуточного кода?

    AlexanderYudakov
    Александр Юдаков @AlexanderYudakov
    C#, 1С, Android, TypeScript
    5ef96b15ec2a6061332469.png

    Не нужна здесь никакая модель классов.
    Особенно — если на входе у нас информационный мусор.
    Ответ написан более года назад
    1 комментарий
    1 комментарий
  • Как подключиться .net приложением к SpringBoot WebSocket?

    AlexanderYudakov
    Александр Юдаков @AlexanderYudakov
    C#, 1С, Android, TypeScript
    Придется написать клиент. Глаза боятся, руки делают:
    https://tools.ietf.org/html/rfc6455
    Написано понятно, с примерами.

    В стандарте много фич, но на практике реализация их всех вряд ли потребуется.

    P.S. На Гитхабе есть пара поделок на эту тему, но качество там ужасное.
    Ответ написан более двух лет назад
    4 комментария
    4 комментария
  • Kotlin: как пользоваться документацией?

    AlexanderYudakov
    Александр Юдаков @AlexanderYudakov
    C#, 1С, Android, TypeScript
    В Android Studio пишете:
    "hello".
    — и после точки вам студия сама все подсказывает.

    Контекстный поиск работает прям там же.

    5eee17d63f608039130291.png

    Хотите подробное описание метода?
    Жмите Ctrl + Q.
    Ответ написан более двух лет назад
    Комментировать
    Комментировать
  • Вк LongPoll возвращает 404, что делать?

    AlexanderYudakov
    Александр Юдаков @AlexanderYudakov
    C#, 1С, Android, TypeScript
    Не знаком с технологиями, которые вы используете, но рискну предположить.

    Судя по сигнатуре вызова, здесь будет POST:
    std::string res = this->api->request(url, Utils::data2str(data));

    А нужен GET.
    Ответ написан более двух лет назад
    1 комментарий
    1 комментарий
  • Исключение это и есть ошибка?

    AlexanderYudakov
    Александр Юдаков @AlexanderYudakov
    C#, 1С, Android, TypeScript
    Ошибка (bug) — здесь нет исключений:
    decimal Умножить(decimal множитель1, decimal множитель2)
    {
        // программист перепутал операторы
        return множитель1 + множитель2;
    }

    Ошибки допускаются, находятся и исправляются.

    Исключение (exception) — здесь нет ошибок:
    string ReadFileTextUtf8(string fileName)
    {
        if (String.IsNullOrEmpty(fileName))
            throw new ArgumentNullException("fileName");
    
        return File.ReadAllText(fileName, Encoding.UTF8);
    }

    Исключения выбрасываются (throw) и обрабатываются (handle) — с помощью catch (выборочная обработка) либо finally (финальная обработка).

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

    AlexanderYudakov
    Александр Юдаков @AlexanderYudakov
    C#, 1С, Android, TypeScript
    Знак вопроса добавьте:
    PropertyChanged?(this, new PropertyChangedEventArgs(Propertname));


    А то, пока подписчиков нет, там null будет.
    Ответ написан более двух лет назад
    2 комментария
    2 комментария
  • LazyLoad адсенс для андроид?

    AlexanderYudakov
    Александр Юдаков @AlexanderYudakov
    C#, 1С, Android, TypeScript
    Google Chrome Remote Debugging on Android:
    https://youtu.be/ug6TTlSmEvY


    5ed7a55b0e305667141590.jpeg
    Ответ написан более двух лет назад
    Комментировать
    Комментировать
  • Проблема с кодировкой JSON, Android Studio?

    AlexanderYudakov
    Александр Юдаков @AlexanderYudakov
    C#, 1С, Android, TypeScript
    Кодировка текста ответа устанавливается в http-заголовке "Content-Type", например так:

    Content-Type: application/json; charset=utf8

    либо так:

    Content-Type: text/html; charset=windows-1251


    Я получаю JSON с определенного ресурса, я посмотрел исходный код html, там кодировка не установлена никакая.



    Так и должно быть.

    А на всякие там "meta charset" в стандарте не обращайте внимания. Это всего лишь подсказка браузеру для тяжёлых случаев, когда веб-сервер сам не знает, в какой кодировке отдает текст.
    Ответ написан более двух лет назад
    Комментировать
    Комментировать
  • Какие есть виды угроз веб-серверу?

    AlexanderYudakov
    Александр Юдаков @AlexanderYudakov
    C#, 1С, Android, TypeScript
    Все правильно вы делаете.
    Для исключения SQL-injection используются параметры.
    А тот, кто связал эту проблему с администрированием — обычный дебил, никогда не видевший программного кода.

    По поводу delete — то же самое. К администрированию это никакого отношения не имеет.

    Upd. Книжку эту лучше выбросить. Если автор позволяет себе такие ляпы, то читать остальной текст смысла нет.
    Ответ написан более двух лет назад
    2 комментария
    2 комментария
  • Какой тип лучше использовать для представления денег в интернет-магазине?

    AlexanderYudakov
    Александр Юдаков @AlexanderYudakov
    C#, 1С, Android, TypeScript
    Да, стоит.

    https://stackoverflow.com/a/3730040/2558342
    Ответ написан более двух лет назад
    Комментировать
    Комментировать
  • Изменить цвет статус бара в PWA?

    AlexanderYudakov
    Александр Юдаков @AlexanderYudakov
    C#, 1С, Android, TypeScript
    <meta name=apple-mobile-web-app-status-bar-style content=#0080ff>


    Во время работы веб-приложения это — обычный DOM-элемент, значение атрибута "content" можно менять из скрипта.
    Ответ написан более двух лет назад
    1 комментарий
    1 комментарий
  • Приходят ли пуш уведомления в PWA на IOS устройства?

    AlexanderYudakov
    Александр Юдаков @AlexanderYudakov
    C#, 1С, Android, TypeScript
    Не понимает iOS этого ничего. Не доросли ещё до современных технологий.

    На Android-е все ОК.
    Ответ написан более двух лет назад
    Комментировать
    Комментировать
  • Как запретить ставить метку за Poligon (Polyline)?

    AlexanderYudakov
    Александр Юдаков @AlexanderYudakov
    C#, 1С, Android, TypeScript
    Проверить вхождение точки в полигон:
    PolyUtil.containsLocation()

    Подключить Maps SDK:
    https://developers.google.com/maps/documentation/a...
    Ответ написан более двух лет назад
    Комментировать
    Комментировать
  • Как запустить метод в многопотоке?

    AlexanderYudakov
    Александр Юдаков @AlexanderYudakov
    C#, 1С, Android, TypeScript
    return Task.Run(bego.Run());
    Ответ написан более двух лет назад
    Комментировать
    Комментировать
  • Как в c# создать объект в зависимости от типа?

    AlexanderYudakov
    Александр Юдаков @AlexanderYudakov
    C#, 1С, Android, TypeScript
    https://docs.microsoft.com/en-us/dotnet/api/system...
    Ответ написан более двух лет назад
    1 комментарий
    1 комментарий
  • Не работает Mode=OneWay в привязке к свойству объекта, в чём ошибка?

    AlexanderYudakov
    Александр Юдаков @AlexanderYudakov
    C#, 1С, Android, TypeScript
    OneWay тут ни при чем.
    Вы забыли реализовать INotifyPropertyChanged.
    Ваш TextBox просто не в курсе, что MaxLength поменялся.

    Вот пример.
    Ответ написан более двух лет назад
    1 комментарий
    1 комментарий
  • Ошибка вставки специального элемента управления XAML WPF?

    AlexanderYudakov
    Александр Юдаков @AlexanderYudakov
    C#, 1С, Android, TypeScript
    В коде "MainWindow.xaml" нужно заменить "myCtrls:ShowNumberNumberControl" на "local:ShowNumberControl".
    Ответ написан более двух лет назад
    Комментировать
    Комментировать
Оценили как «Нравится»
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • Следующие →
Самые активные сегодня
  • Drno
    • 8 ответов
    • 0 вопросов
  • mayton2019
    • 5 ответов
    • 0 вопросов
  • ProgrammerForever
    Григорий Боев
    • 5 ответов
    • 0 вопросов
  • dimonchik2013
    Dimonchik
    • 4 ответа
    • 0 вопросов
  • Vindicar
    Vindicar
    • 4 ответа
    • 0 вопросов
  • Кирилл Григорьев
    • 4 ответа
    • 0 вопросов
  • © Habr
  • О сервисе
  • Обратная связь
  • Блог

Войдите на сайт

Чтобы задать вопрос и получить на него квалифицированный ответ.
Войти через центр авторизации