Задать вопрос
  • Как сгенерировать шахматный бакграунд в ImageMagick.Net?

    @U235U235
    Зачем рисовать квадратики в цикле? Вообще-то шахматный паттерн уже есть в IM.
    convert -size 8x8 pattern:gray50 -scale 5000%  chessboard.png
    Ответ написан
    6 комментариев
  • Как заблокировать доступ к ресурсу для конкретного региона?

    @Everything_is_bad
    Недавно проверял состояние сервера и заметил в логах много неудачных попыток входа на сервер (В основном через ssh)
    ну как первый раз в интернет вышел, уже сто лет такое, ssh вообще постоянно долбят, ставишь fail2ban, а еще лучше меняешь дефолтный порт и ставишь логин только по ключу. А регион блокировать, так себе идея.
    Ответ написан
    9 комментариев
  • Как заблокировать доступ к ресурсу для конкретного региона?

    ky0
    @ky0 Куратор тега Nginx
    Миллиардер, филантроп, патологический лгун
    Рабочий вариант, не полагающийся на разной степени редко обновляемые географические базы IP-адресов - закрыть SSH совсем и ходить только из локальной сети, например через впн.

    С веб-сервером сложнее - тут без подключения посторонних сервисов выбор невелик - модуль geoip или ручное перечисление диапазонов релевантных стран.
    Ответ написан
    1 комментарий
  • Как заблокировать доступ к ресурсу для конкретного региона?

    Mike_Ro
    @Mike_Ro
    Python, JS, WordPress, SEO, Bots, Adversting
    GeoIP ngx_http_geoip_module

    1. Nginx должен включать модуль ngx_http_geoip_module.
    2. Качаем БД GeoLite2 Country.
    3. Пример конфига (nginx.conf), с отправкой всех из Индии в 403 лес:
    http {
        geoip_country /path/to/GeoLite2-Country.mmdb;
        map $geoip_country_code $allowed_country {
            default yes;
            IN no; # banned india
        }
    }
    
    server {
        if ($allowed_country = no) {
            return 403;
        }
    }
    Ответ написан
    5 комментариев
  • Как ускорить поиск элементов из статичного string[] по подстроке?

    VoidVolker
    @VoidVolker Куратор тега C#
    Dark side eye. А у нас печеньки! А у вас?
    Раз нет ограничений по памяти и надо максимально быстро, то можно разложить весь массив в дерево таблиц переходов с шагом в один символ на таблицу. Самый быстрый и самый затратный по памяти. Таблица на каждый символ - 256 байт. Скорость поиска зависит только от размера строки и не зависит от объема данных: один символ - один переход в таблице к следующей таблице или конец поиска, если ноль. Я так уже делал: использовать имеет смысл на объемах примерно от 4 гигабайт данных (чем больше объем - тем меньше затраты на каждый символ). Но, если память позволяет и цель именно в скорости - то вполне нормальная плата памятью за скорость. Можно сократить расход памяти, если перекодировать строки в кодировку по числу используемых символов. Тогда таблица переходов будет в несколько раз меньше. Более экономный и более медленный вариант - дерево массивов/списков с шагом в 2/4/8 символов, при этом в поиске сравнение не по символам делать, а сразу по 2/4/8 байт: т.е., работаем со строкой как с массивом байтов и получаем оттуда uint16/uint32/uint64 и их и сравниваем, ибо процессору все равно какую инструкцию выполнять - один байт сравнить или 8. Возможно, конечно, оптимизатор в поиске по строке это все и оптимизирует. Я давно уже не смотрю на результаты его работы - так что тут только опытным путем. Ну и щас еще других вариантов накидают с деревьями тоже.

    UPD1:
    Можно все несколько упростить (или усложнить - смотря с какой стороны смотреть), если перекодировать строки из стандартной кодировки во что-то более компактное либо самостоятельно сделать кодировку под набор данных.

    Еще можно ускорить, если искать в несколько потоков, разбив весь набор данных на несколько групп.

    UPD2:
    Таки нашел немного времени и откопал исходники для шарпа и провел несколько тестов по расходу памяти.

    Число строк / общий размер данных / итоговый размер дерева

    5 символов:
    1000000 / 55.9MB / 13.2GB
    2000000 / 111.6MB / 25.2GB

    10 символов:
    100000 / 8.1MB / 4.1GB
    200000 / 16.1MB / 8GB
    300000 / 24.2MB / 11.9GB
    400000 / 32.2MB / 15.7GB
    500000 / 40.3MB / 19.5GB

    15 символов:
    100000 / 10.5MB / 6.6GB
    200000 / 21MB / 13.1GB
    300000 / 31.5MB / 19.5GB
    400000 / 42MB / 25.8GB

    20 символов:
    100000 / 13MB / 9.1GB
    200000 / 25.9MB / 18.1GB
    300000 / 38.9MB / 27GB


    Максимальный размер дерева для глубины в 5 символов на платформе х64:
    • Для диапазона 0-255 - до 8Тб и до 4 311 810 305 узлов
    • Для диапазона 0-70 - до 13.5Гб и до 24 357 971 узлов

    Максимальный размер дерева для глубины в 4 символа для диапазона 0-255: ~17Гб и ~33Гб для х86 и для х64 соответственно и лимит в 16 843 009 узлов. Ну и в коде есть функция для вычисления максимального числа узлов и размера дерева.

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

    И соответственно код: https://github.com/VoidVolker/search-tree/tree/master (предупреждаю сразу: код старый, по сути экспериментальный, не вылизанный и вероятно приведет кого-то в ужас). Но, главное, что работает.
    код

    Тестовый код:
    static Random rnd = new Random();
    static string[] GenStrings(int cnt, int strLen)
    {
        string[] arr = new string[cnt];
        var i = 0;
        while (i < cnt)
        {
            var sb = new StringBuilder();
            for (var j = 0; j < strLen; j++)
            {
                sb.Append(rnd.Next(0, 256));
                //sb.Append(TAbc[rnd.Next(0, TAbc.Length)]);
            }
            arr[i++] = sb.ToString();
        }
        return arr;
    }
    
    var arraySize = 300000;
    var stringSize = 20;
    
    var GCStartArr = GC.GetTotalMemory(true);
    
    var strings = GenStrings(arraySize, stringSize);
    
    var GCEndArr = GC.GetTotalMemory(true);
    var GCStart = GC.GetTotalMemory(true);
    
    var tree = new ArrayTree<string>();
    foreach (string s in strings)
    {
        tree.Add(Encoding.UTF8.GetBytes(s), s);
    }
    
    var GCEnd = GC.GetTotalMemory(true);
    
    Console.WriteLine("Array x string size / Array memory used / Tree memory used");
    Console.WriteLine($"{arraySize} х {stringSize} / {BytesToString(GCEndArr - GCStartArr)} / {BytesToString(GCEnd - GCStart)}");
    Ответ написан
  • Как ускорить поиск элементов из статичного string[] по подстроке?

    wataru
    @wataru Куратор тега Алгоритмы
    Разработчик на С++, экс-олимпиадник.
    Сначала объедините все ваши строки в одну через какой-то раздилитель, которого не может быть в искомой строке (можно и без него, но с ним код чуть проще будет). В конце поставьте этот же разделитель 2 раза. Вроде "строка1$строка2$строка3$...$строкаN$$".

    Вот уже ваша задача - быстро искать какую-то остроку в фиксированном тексте, а не куче строк.
    Тут есть много вариантов. Например, постройте суффиксное дерево алгоритмом Укконена. Вот эта ваша структура. При запросе, как в боре, поищите искомую строку в этом дереве. Если где-то перехода нет - вхождения вы не нашли. Если вы остановились на какой-то вершине (или ребре в дереве), то вам осталось каким-нибудь обходом в глубину найти все листья в поддереве этого места. Каждый лист соответствует вхождению. Еще при построении суффиксного дерева вы каждый лист пометите началом суффикса. Можно в тот же момент место в строке и конкатенаций перобразовать в номер исходной строки (например, бинпоиском по индексам начал строк в тексте. Или просто заведите массив, где для каждого символа в тексте при построении запишите, какая изначальная строка там была).

    Если разделитель не использовать, то могут быть лишние результаты - где искомый шаблон приложился между двух исходных строк в тексте. Их надо будет выкинуть.

    Другой вариант - через преобразование Барроуза — Уилера. Вот есть лекция. Этот алгоритм часто упоминается в курсах по биоинформатике. Реализацию может даже найдете где-то. Потом можно найти номера исходных строк из индексов вхождений через тот же бинпоиск по сортированному массиву индексов начал всех строк в тексте.

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

    Учтите, что построение структуры данных тут будет в несколько раз медленнее простого for+Contains. Выигрыш вы получите, если у вас текст действительно статичный и вы в нем много раз что-то ищите.
    Ответ написан
    7 комментариев
  • Позволяет ли какой-либо ИИ генератор изображений менять не одежду заданного человека на фото, а человека по заданной одежде?

    soundie
    @soundie Автор вопроса
    Преподаватель, программист, писатель
    Посмотрел внимательнее сервисы, которые генерируют одежду по фото человека - оказывается у одного из них (на приведённой мной даже странице внизу ) есть и обратное:
    5z8bploodu1npq8i9j1pxyxb53u.jpeg

    Тем не менее, если кто знает ещё сервисы - прошу подсказать.
    Ответ написан
    4 комментария
  • Что делать если Linux Mint видить флешку только в lsusb?

    CityCat4
    @CityCat4
    Жил да был черный кот за углом...
    Кирдык ей. Все, отработалась. Насчет китайцев кстати, дельное замечание - эти мастера беспарашютного спорта запросто в гиговую флэшку обьем 64G пропишут.
    Ответ написан
    8 комментариев
  • Запрос на удаление, что нём не так?

    @alexalexes
    DELETE FROM joom_user_usergroup_map -- m - забудьте про алиасы в делетах, пока работаете в MariaDB !
    WHERE NOT EXISTS (SELECT * FROM joom_users u WHERE u.id = joom_user_usergroup_map.user_id -- будьте добры указывать имя таблицы полностью, которую обрабатывает delete
    );
    Ответ написан
    3 комментария
  • Можно ли через VBA сделать отправку уведомлений на почту?

    CityCat4
    @CityCat4
    Жил да был черный кот за углом...
    На VBA можно написать вообще все, что угодно.

    Вот пример кода, отправляющего письмо:
    strMailReceiver = "pechkin@derevnya.ru"
    strMailServer = "10.7.1.6"
    
      Set objEmail = WScript.CreateObject("CDO.Message")
    
      objEmail.From = """Dyadya Fedor"" pes-i-kot@derevnya.ru"
      objEmail.To = strMailReceiver
      objEmail.Subject = "Figvam narisuem"
      objEmail.Textbody = strMailBody
    
      ' Send with SMTP server (1 - use local SMTP)
      objEmail.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/sendusing") = 2
    
      ' Specify SMTP server
      objEmail.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/smtpserver") = strMailServer
    
      objEmail.Configuration.Fields.Update
      objEmail.Send
    Ответ написан
    2 комментария
  • Как лучше сохранять результаты логирования приложения NET?

    VoidVolker
    @VoidVolker Куратор тега C#
    Dark side eye. А у нас печеньки! А у вас?
    Добавлю, что есть еще такая замечательная штука, как "сборщик логов" - то, что надо, если хочется собирать логи с нескольких разных источников. Например FluentD, Graylog, Nagios Log Server, NXlog, Elastic Stack: Elasticsearch, Kibana, Beats & Logstash, LOGalyze.
    Ответ написан
    1 комментарий
  • Как лучше сохранять результаты логирования приложения NET?

    @d-stream
    Готовые решения - не подаю, но...
    Serilog для .net - это как log4j для java.
    Если очень хочется универсальноентерпайзности - можно посмотреть в сторону log4net

    Собственно любой из помянутых логгеров умеет и в .txt и в .xml и в .json, а так же гадить в udp (syslog/graylog) и в другие известные коллекторы типа эластика/прометеуса/etc

    p.s. да и по-большому счёту логика и идеология работы у них сходна
    Ответ написан
    Комментировать
  • Как изменить атрибут html элемента через css селектор?

    miraage
    @miraage
    Старый прогер
    HTML аттрибуты нельзя менять через CSS. Только через JS.
    Ответ написан
    Комментировать
  • Как лучше сохранять результаты логирования приложения NET?

    Nlog

    Кмк, он немного переусложнён.
    Я бы посмотрел в сторону стандартного Microsoft.Extensions.Logging или Serilog (но из кода всё равно обращаться к M.E.L.Abstractions)

    SQLite

    Зачем? Какую проблему ты хочешь решить применяя для логов полноценную субд, с которой к тому же не будут нормально интегрироваться другие инструменты для просмотра логов?

    На линуксе уже есть встроенная служба для логов - syslog, ей и пользуйся.

    Хотя опять же зависит от того, что за приложение и что за логи.
    Ответ написан
    2 комментария
  • Как лучше сохранять результаты логирования приложения NET?

    AshBlade
    @AshBlade Куратор тега C#
    Просто хочу быть счастливым
    1. Про NLog давно не слышал - больше про Serilog (стильно, модно, молодежно)
    2. Если это системное какое-нибудь приложение, то лучше используй системный журнал, либо пиши в файл отдельный
    3. Если есть внешний сервер логов (ELK стек, Graylog и т.д.), то отправляй туда (посмотри в сторону агрегаторов логов, )
    4. Если это контейнерное (докер, например) приложение, то логируй в stdout/stderr, а потом собирай логи у самого контейнера. Также, докер можно настроить на формат хранения логов и место хранения (можно локально хранить, а можно и отправлять по сети)

    P.S. фреймворк по большей части не важен, но рекомендую связку Microsoft.Extensions.Logging + Serilog:
    - Первый - предоставляет интерфейс для логирования
    - Второй - бэкэнд логирования
    Ответ написан
    8 комментариев
  • Что делать если в компонентах Windows нет WSL и Hyper-V?

    CityCat4
    @CityCat4
    Жил да был черный кот за углом...
    Удивительно, да? Сначала ставим "сборку от Васяна" где порезано все по мнению Васяна "лишнее" - а потом начинаем, как бы это лишнее включить.

    А никак.

    Ставьте нормальную сборку, ключей в тырнете завались.
    Ответ написан
    Комментировать
  • Как пробросить порты системы за nat сетью?

    @AlexVWill
    Начал было писать вариант решения, но потом понял что много писанины получится, а варианты могут быть разные, и до меня уже писали. На Хабре лежит неплохая статья по этой теме, можно попробовать реализовать, особенно по варианту 4, только когда оба клиента подключаются к ssh, или вообще сделать ssh vpn туннель, короче, надо пробовать...
    Ответ написан
    Комментировать
  • Проблема с изучением C#?

    freeExec
    @freeExec
    Участник OpenStreetMap
    Это просто мало банальной практики. Примерно как в математике, мало уметь складывать и умножать, надо нарешать пулл задач, чтобы мочь применять свои знания на практике.

    И потом, система компонентов Unity это не совсем то ООП.
    Ответ написан
    7 комментариев
  • База по разработке ПО с плагинами на C++?

    Существуют ли книги - я не знаю, но фундаментально ничего не изменилось:

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

    Таким языком может быть lua - очень популярный вариант. Можно даже какой-нибудь свой язык для плагинов придумать - вот Minecraft вообще для плагинов стопку json-ов предлагает писать.

    Из нового ещё появился webassembly: он удобен тем, что разработчик плагина может выбрать в принципе любой язык, и запускаться он сможет на любой платформе.
    Ответ написан
    Комментировать
  • Как понять строчку namespace System.Windows.Forms?

    Не нужно путать неймспейсы из C# с модулями из других языков.
    Неймспейс проще всего воспринимать просто как приставку к названию всех типов, которые внутри неймспейса будут.
    А using - подсказка компилятору, чтобы он попробовал эту приставку добавить ко всем именам, которые он ещё не смог разрешить.
    Ответ написан
    Комментировать