Задать вопрос
  • Как можно заработать запустив на своем сервере какие-нибудь скрипты?

    Zoominger
    @Zoominger
    System Integrator
    что бы такого можно было написать чтоб само работало и приносило какую-нибудь копеечку

    Так не бывает.
    Ответ: никак.
    Ответ написан
    6 комментариев
  • Какую актуальную библиотеку можно использовать в роли брокера сообщений внутри .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.
    Ответ написан
    1 комментарий
  • Как реализовать jquery event delegation на чистом js?

    Stalker_RED
    @Stalker_RED
    document.addEventListener('click', function myClickHandler(evt) { // слушаем все клики
      if (evt.target.matches('.selector')){ // проверяем был ли это клик по .selector
        // do your stuff
      }
    });

    но обычно лучше так:
    document.addEventListener('click', function myClickHandler(evt) { // слушаем все клики
      const elem = evt.target.closest('.selector');
      if (elem){ // если клик мимо, то тут null
        // do your stuff
      }
    });

    такой подход срабатывает когда внутри вашего .selector еще какие-то элементы, иконки, и прочая, и вам все равно нужно отследить. Более универсальное решение.
    Ответ написан
    4 комментария
  • Как легально собрать ПК имея комплектующие и OEM лицензию?

    @falsus
    Информационная безопасность (госсектор)
    Вы, простите, что закупали то? Комплектующие или всё-таки ПК? Закупали комплектующие и договорились с поставщиком, что он Вам всё соберет, а он не собрал и отдал "как есть", или же покупали ПК, а вам пришли запчасти?
    Если покупали комплектующие, то, насколько я понимаю, поставщик Вам вообще не имел право продавать OEM лицензии, т.к. они предназначены для готовых сборок. Тогда Вы не имеете права их принимать, а значит контракт в этой части должен признаться неисполненным со всеми вытекающими.
    Если покупали ПК, а они поставили кучу наборов "собери сам", то тем более такую поставку нельзя принимать и, опять же, контракт считается невыполненным.
    Ответ написан
    Комментировать
  • Как легально собрать ПК имея комплектующие и OEM лицензию?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    На упаковке OEM-Windows напечатана Лицензия для сборщика систем (или есть ссылка на неё), которую вы примете, если вскроете упаковку.
    Сборщик систем — это изготовитель оборудования, сборщик, восстановитель или предустановщик ПО, реализующий Пользовательскую систему (системы) третьему лицу.
    Поскольку вы не собираетесь продавать эти компьютеры, то вы не являетесь сборщиком систем, и, таким образом, не можете устанавливать OEM-Windows.
    Ответ написан
    Комментировать
  • Почему интернет провайдеры не могут мне дать "белый" + "динамический" IP?

    ky0
    @ky0
    Миллиардер, филантроп, патологический лгун
    Технически - разумеется, они могут. Но не хотят, потому что вы такой плюс-минус один, а сложившаяся инфраструктура уже настроена под один из указанных вами вариантов. По меркам среднего клиента интернет-провайдера вы хотите странного.
    Ответ написан
    18 комментариев
  • Как понять нижеуказанный код Javascript?

    ZerdoX-x
    @ZerdoX-x
    Frontend developer influenced by web, a11y, crypto
    function largestOfFour(matrix) {
      let results = []; // переменная для хранения самых больших чисел из каждой строки матрицы
    
      // итерация по матрице
      for (let rowIndex = 0; i < matrix.length; i++) {
        // переменнная, в которой будет храниться самое большое число из текущей строки матрицы
        let largestNumber = matrix[rowIndex][0]; // первый элемент текущей строки в качестве значения по умолчанию
        // итерация по строке матрицы
        for (let rowElementIndex = 1; j < matrix[rowIndex].length; j++) {
          // если текущий элемент больше самого большого числа на текущем этапе итерации_
          if (arr[rowIndex][rowElementIndex] > largestNumber) {
            // самым большим числом становится текущий элемент строки матрицы
            largestNumber = arr[rowIndex][rowElementIndex];
          }
        }
        // после итерации по строке матрицы сохраняет самое большое число
        results[rowIndex] = largestNumber;
      }
      
      return results;
    }


    Этот код очень императивный, не пиши так. Ты можешь конечно разобраться как работает этот код, но самому тебе такой код не придётся писать (я надеюсь). Вот пример этой же функции, которая делает всё то же самое, но код получился гораздо лаконичнее:
    function largestOfFour(arr) {
      return arr.map((row) => Math.max(...row))
    }


    UPDATE: в комментариях под этим ответом есть обсуждение касаемо императивного кода. Отвечая автору вопроса я не имел в виду, что императивный код плохой и нельзя писать императивный код. Я имел в виду, что фронтендеру зачастую следует избегать императивности во время разработки (тем более, во время решения тривиальных задач)
    Ответ написан
    8 комментариев
  • Как записать несколько строк в файл bash?

    @antares4045
    ещё можно так, если строчки короткие

    printf "str1\nstr2\nstr3" >> /home/2.txt
    Ответ написан
    Комментировать
  • Как записать несколько строк в файл bash?

    Zoominger
    @Zoominger
    System Integrator
    cat << EOF > your_file.txt
    str1
    str2
    str3
    EOF


    А, ну можно и эхом:
    echo "str1
    str2
    str3" >> myfile.txt
    Ответ написан
    Комментировать
  • Как убрать любое потенциальное слежением за рабочим Macbook?

    Zoominger
    @Zoominger
    System Integrator
    Фигнёй страдаете.
    Просто поставьте какой WireShark и последите, сливается чего или нет. По умолчанию в macOS сетевая активность очень низкая, статистику за сутки посмотреть не проблема.
    Ну и по списку процессов можете посмотреть, в macOS они не скрываются.
    И по списку установленных программ тоже, кста. Если даже что-то и следит, то в "Программах" вы его увидите.
    Ответ написан
    Комментировать
  • Тернарный оператор, ?? вместо ?:, зачем?

    @Everybody_Lies
    //Null-коалесцентный оператор нужен когда переменная может быть не определена, дабы не делать проверку на isset
    $bar = $foo ?? 'default';   //default
    $bar = $foo ?: 'default';   // Undefined variable $foo
    Ответ написан
    Комментировать
  • Знает ли кто-то как собрать сайт в 1 файл?

    @markak
    Frontend developer
    Можно, если стили из файла перенести в тэг style, изображения сконвертировать в base64 и заменить в соответствующих атрибутах src и значениях свойств background-*
    Например вот так:

    https://jsfiddle.net/71emtqoL/

    <!doctype html>
    
    <html lang="en">
    <head>
      <meta charset="utf-8">
      <meta name="viewport" content="width=device-width, initial-scale=1">
      <title>example</title>
      <style>
        .bg-img{
          background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHElEQVQI12P4//8/w38GIAXDIBKE0DHxgljNBAAO9TXL0Y4OHwAAAABJRU5ErkJggg==");
    	    background-repeat:  no-repeat;
    	    padding-top: 10px;
        }
      </style>
    </head>
    
    <body>
      <div>
        <img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHElEQVQI12P4//8/w38GIAXDIBKE0DHxgljNBAAO9TXL0Y4OHwAAAABJRU5ErkJggg==" alt="Red dot" />
        <p>Изображение красной точки в base64 (img src)</p>
      </div>
      <div class="bg-img">Изображение красной точки в base64 (background-image)</div>
    </body>
    </html>
    Ответ написан
    Комментировать
  • Пример ASP .NET Core Web Api приложения со сложной аутентификацией?

    @AndromedaStar
    .Net - monkey
    https://github.com/dotnet/AspNetCore.Docs
    Тут есть вся официальная документация.
    В каталоге /security находятся ответы на ваш вопрос.
    Ответ написан
    Комментировать
  • C# - плавающий глюк - насколько правильно исправил?

    Casper-SC
    @Casper-SC
    Программист (.NET)
    Подпишись на событие FormClosing (если ещё не подписан) и в его обработчике отпишись от обработчиков событий TitleChanged, AddressChanged, LoadingStateChanged:
    public partial class BrowserMain : Form
    {
        public BrowserMain()
        {
            InitializeComponent();
            
            WebBrowser = new ChromiumWebBrowser(
                string.IsNullOrWhiteSpace(address) ? "about:blank" : address)
            {
                // ...
            };
    
            Controls.Add(WebBrowser);
    
            WebBrowser.TitleChanged += WebBrowser_TitleChanged;
            WebBrowser.AddressChanged += WebBrowser_AddressChanged;
            WebBrowser.LoadingStateChanged += webBrowser_DocumentCompleted;
        }
    
        private void BrowserMain_FormClosing(object sender, FormClosingEventArgs e)
        {
           // После вызова этих строк методы WebBrowser_TitleChanged, WebBrowser_AddressChanged
           // и webBrowser_DocumentCompleted не будут выполняться. 
           // Это и не нужно, так как окно закрывается.
            WebBrowser.TitleChanged -= WebBrowser_TitleChanged;
            WebBrowser.AddressChanged -= WebBrowser_AddressChanged;
            WebBrowser.LoadingStateChanged -= webBrowser_DocumentCompleted;
        }
    }
    Ответ написан
    3 комментария
  • Как проигнорировать контейнер в контейнере?

    Aetae
    @Aetae Куратор тега JavaScript
    Тлен
    Тебе нужен event.stopPropagation(), но лучше всё-таки почитай в учебнике как работают события в javascript, там не сложно, чтоб не тратить своё время на метод тыка.
    Ответ написан
    3 комментария
  • Как считаете, стоит пытаться сохранить аккаулятор ноутбука или нет?

    80 процентов времени я работаю с ноутбуком, подключенным к зарядке.
    Ноуту уже 4 года, вполне себе нормально работает и от аккумулятора, но, справедливости ради, проболжительность работы не замерял, небыло надобности.
    Не уверен в том, что на срок жизни аккумулятра влияет место проживания, и специализация в универе.
    Ответ написан
    Комментировать
  • Что можно попробовать сделать для восстановления жёсткого диска?

    nidalee
    @nidalee
    никто этот диск ни в какой специализированный дорогой сервис относить не будет
    Что можно попробовать сделать, чтобы диск запустился и хоть что-то с него попытаться вытащить?
    Ничего.
    Ответ написан
    Комментировать
  • Что можно попробовать сделать для восстановления жёсткого диска?

    Zettabyte
    @Zettabyte
    Проф. восстановление данных ▪ Вопрос? См. профиль
    seagate 2012 года на терабайт, при подключении головка бегает туда-сюда некоторое время, затем диск отключается

    У дисков Сигейт такие симптомы (щелчки / клики, затем остановка двигателя) означают выход из строя головок. Очень часто с повреждением магнитной поверхности пластин той или иной степени.

    Фото повреждённой головки жесткого диска под микроскопом
    foto-golovok-zhestkogo-diska-pod-mikroskopom.jpg

    Диск явно подвергался пыткам во время работы: на блине есть отчётливая царапина и несколько точечных царапин.

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

    Говоря в целом, вы очень зря вскрыли гермоблок жёсткого диска. Даже если бы на блинах не было царапин, это сделало бы ситуацию хуже, а стоимость восстановления данных - выше.

    Что можно попробовать сделать, чтобы диск запустился и хоть что-то с него попытаться вытащить? Контакты платы уже почищены до блеска

    Уж простите мой сарказм, но это примерно как спросить врача: "Человек на спорткаре влетел в столб на скорости 250 км/ч. Наклеили ему на лоб аж три лейкопластыря, как ещё можно попробовать его подлечить?"

    Сами вы не сделаете уже ничего. Контакты на плате здесь совершенно не при чём.
    Класть диск в холодильник и менять плату - тоже не поможет.
    Диск нужно тщательно очищать от магнитной пыли внутри и менять блок головок. Скорее всего, не один раз.
    А с учётом описания ситуации, не факт, что в таком состоянии его получится запустить вообще.

    этот диск ни в какой специализированный дорогой сервис относить не будет

    Тогда всё. Такой случай (концентрические царапины, вскрытие) требует специалиста по восстановлению информации очень высокой квалификации. А те, кто умеют работать с такими случаями, расстроят вас ценой и сроками.
    Ответ написан
    Комментировать
  • Как вы уведомляете сотрудников о новых обновлениях?

    DevMan
    @DevMan
    по разному: рассылкой или интро при заходе на сайт.
    Ответ написан
    Комментировать
  • Как убрать кавычки при перетаскивании файла в консоль?

    Zoominger
    @Zoominger
    System Integrator
    Никак. Это штатное поведение системы, чтобы избежать ошибки, если в пути есть пробелы, иначе консольные (и не только) приложения могут вести себя непредсказуемо.
    Ответ написан
    1 комментарий