• Как произвести аналитику изменений и определить причину роста объёма базы?

    @mletov
    А "в лоб" задача не решается?
    Развернуть 2 базы, новую и старую (у вас же бэкапы есть, надеюсь).
    Выяснить какие именно таблицы распухли, и от этого уже отталкиваться.
    Ответ написан
    Комментировать
  • Стоит ли брать процессор Intel с индексом K, если не собираюсь его разгонять?

    pindschik
    @pindschik
    ФЫВА ОЛДЖ
    Бери обычный домашний, они гонятся по ТЕПЛОВОМУ ПАКЕТУ и по суммарной производительности при этом догоняют К. При этом разгон по теплу доступен на всех материнках, даже на младших дешманских.
    Если смотришь на серию 10400 - то бери память с МИНИМАЛЬНОЙ частотой 3200. Хоть и пишут, что не поддерживается - но материнке и процу просто деваться некуда - и заводятся. Даже на i3. Проверено.
    Кулер - бери с запасом, от 150 ватт. Не верь в TDP 66 ватт, это маркетинг.
    Ответ написан
    1 комментарий
  • Выводит System.String[] вместо строки Windows.Form как испровить?

    freeExec
    @freeExec
    Участник OpenStreetMap
    этот string не имеет функции ToString, которая возращает строку, а имеет ту ToString, которая возращает System.ToString[]

    Тут у вас и проблема. Потому что это не string, а string[]. И вам надо самому написать логику, как из массива строк получить строку.
    Ответ написан
    Комментировать
  • Как написать "62 рубля 00 копеек", и "37 рублей 12 копеек"?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Задача называется "Сумма прописью". Она решена тысячу раз для всех языков программирования. Исходников много. Ищите. Легко найдете.

    Других трудностей здесь нет.
    Ответ написан
    Комментировать
  • Как организовать одновременную работу Telegram бота (Aiogram) и Flask?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    Не надо их смешивать. Просто сделайте отдельно и пусть подключаются к одной БД. Так будет и надёжнее, и безопаснее, и призводительность будет выше, и проще всё это будет устроено, что не мало важно.
    Даже запускал бы я эти процессы в разных докер-контейнерах. Микросервисаня архитектура, масштабирование, прозрачность, элегантность и гибкость.
    Стартуете всё одним compose-файлом, а если будет не хватать в будущем, то куберовский кластер можно будет пристегнуть и нигде не упрётесь в нестандартные проблемы.

    Не изобретайте себе приключения на пустом месте.
    Ответ написан
    2 комментария
  • Как выборочно исключить домены из GoodbyeDPI?

    @As56
    В папке программы есть список доменов, его можно отредактировать
    Ответ написан
    Комментировать
  • Python выдаёт ошибку: SyntaxError: invalid syntax что делать?

    Vindicar
    @Vindicar
    RTFM!
    Строкой выше не закрыта скобка.
    Ответ написан
    Комментировать
  • Не могу понять в чем проблема?

    Vindicar
    @Vindicar
    RTFM!
    description = f"""У тебя , **{ctx.author}** вот столько балов!**{cursor.execute("SELECT cash FROM users WHERE id = {}".format(ctx.author.id)).fetchone()[0]} :polegar_para_cima:**"""

    Вот это - трижды говнокод.
    1. Не засовывай в шаблонные строки ничего сложнее одной арфиметической операции - результат абсолютно нечитаем и неконтролируем (в чем ты убедился).
    Неправильно:
    description = f"""У тебя , **{ctx.author}** вот столько балов!**{cursor.execute("SELECT cash FROM users WHERE id = {}".format(ctx.author.id)).fetchone()[0]} :polegar_para_cima:**"""

    Правильно:
    score = cursor.execute("SELECT cash FROM users WHERE id = {}".format(ctx.author.id)).fetchone()[0]
    description = f"""У тебя , **{ctx.author}** вот столько балов!**{score} :polegar_para_cima:**"""

    2. Никогда не формируй запросы через форматирование строк. Слишком легко словить ошибку, явную или неявную.
    Неправильно:
    score = cursor.execute("SELECT cash FROM users WHERE id = {}".format(ctx.author.id))

    Правильно:
    score = cursor.execute("SELECT cash FROM users WHERE id = ?", (ctx.author.id,) )

    3. Всегда проверяй, что ты получаешь из базы! Нет гарантий, что запись с указанным id и впрямь существует.
    Неправильно:
    score = cursor.execute("SELECT cash FROM users WHERE id = ?", (ctx.author.id,) ).fetchone()[0]
    description = f"""У тебя , **{ctx.author}** вот столько балов!**{score} :polegar_para_cima:**"""

    Правильно:
    score_row = cursor.execute("SELECT cash FROM users WHERE id = ?", (ctx.author.id,) ).fetchone()
    if score_row is not None:
        description = f"""У тебя , **{ctx.author}** вот столько балов!**{score_row[0]} :polegar_para_cima:**"""
    else:
        # что делать, если такого юзера еще нет в базе?
        cursor.execute("INSERT INTO users (id, cash) VALUES (?, 0)", (ctx.author.id,) ) # можно его добавить
        description = f"""У тебя , **{ctx.author}** пока нет ничего! Но скоро будет!"""

    4. БаЛЛов, блин.
    Ответ написан
    5 комментариев
  • Ошибка при попытке передачи аргументов в Eclipse что можно сделать?

    BorLaze
    @BorLaze
    Java developer
    Аргументы тут ни при чем

    Во-первых, класс должен быть публичным (public class NewRoot2), во-вторых, имя файла должно совпадать с именем класса (NewRoot2.java, а не newRoot2.java).
    Ответ написан
    Комментировать
  • Какую актуальную библиотеку можно использовать в роли брокера сообщений внутри .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 комментарий
  • Как должен правильно должен выглядеть тест для простого Java приложения?

    @rPman
    Когда ты разрабатываешь какое то приложение, не важно на сколько сложное, ты же не пишешь его с нуля и до конца полностью (точнее такое бывает но редко, для не сильно больших задач и у этого метода есть недостатки - больше подвержен ошибкам), наоборот, код идеологически разбивается на части или этапы разработки, каждый из которых пишется по очереди, до принципиальной возможности запуска, часто кстати в уже написанные части подставляются заглушки (и/или подсовывается база данных в определенном состоянии) и добавляются отладочные сообщения, чтобы приложение запустилось в нужном состоянии чтобы в принципе была возможность протестировать только что написанную часть.

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

    Что значит ожидаемое поведение? когда ты делишь задачу на подзадачи, у тебя появляются промежуточные данные и состояния, ну как в анекдоте про чайник и программиста, чтобы заварить чай нужно:
    * налить воду в чайник
    * поставить на базу/печку и включить
    * дождаться готовности/выключить
    * налить чай
    на каждом этапе нужно проверять состояние, например первый пункт - есть ли вода в чайнике, горячая ли она или холодная, полный ли чайник, есть ли у тебя чайник в руках, и т.п.

    Тесты создают на основе данных, являющихся нормальными, ненормальными и граничными для тех алгоритмов, что используются в коде. К примеру нет нужды проверять температуру воды в чайнике отдельно на фиксированные значения 10, 20, 30,.. градусов, если в алгоритме заложены естественные их границы - холодная и горячая, вот вокруг этих констант и приходится гулять.

    Вот именно эти проверки и есть тесты, которые необходимо автоматизировать.

    Степень полноты тестирования вопрос философский, в конечном счете тесты нужны не только для автоматического тестирования и составления отчетности на изменения кода, но и собственно для разработки, разрабатывая тесты ты делаешь код полнее и точнее (например проверяя температуру воды на первом шаге ты добавишь в код условие - если вода горячая, то пропустить ее нагрев), почитай про test-driven development, TDD

    p.s. а еще тесты - это способ исследовать неизвестную библиотеку, дело в том что open source реалии таковы, что документации нет от слова совсем, в лучшем случае перед тобой список методов с типами аргументов и пара примеров, все остальное нужно догадываться по логике наименований, здравому смыслу и ковырянии в исходниках. Тесты тут могут быть исключительно как способ изучения этой библиотеки, но не обязательно такие тесты реализовывать в коде, это все же процесс в ручную происходит, но все же, создавать тесты на ответы от чужой библиотеки полезно для длительной поддержки проекта для того, чтобы у тебя были алерты на необычное поведение ее после обновления)

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

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

    Vindicar
    @Vindicar
    RTFM!
    asyncio - это, скорее, как обойтись без многопоточности.
    Она хорошо работает для ситуаций, когда большая часть времени потока выполнения уходит на ожидание ввода-вывода - например, на ответ по сети. Если у тебя есть что-то, что занимает CPU, или любая другая операция, выполняемая вне рамок ввода-вывода через asyncio - это остановит выполнение асинхронной программы.
    Если на пальцах, то асинхронная программа состоит из отдельных корутин. Разница с потоками в том, что потоки переключает ОС, а корутины сами отдают управление, когда уходят в ожидание события (грубо говоря, когда делают вызов с await). Это упрощает синхронизацию корутин, так как ты точно знаешь, когда твоя корутина отдаст управление - меньше шансов налететь на состояние гонки из-за внезапного переключения. Опять же, переключение корутин куда более детерминировано, чем переключение потоков, так что "плавающие" баги встречаются реже.
    Тело асинхронной программы - это рабочий цикл (т.н. реактор, он же loop), который проверяет выполняемые операции ввода-вывода, и возобновляет выполнение корутины, когда её операция завершилась. Когда корутина завершится или запланирует ещё одну операцию, она вернёт управление в цикл. Вот почему "задумавшаяся" корутина остановит всю программу.
    Минус в том, что в отличие от многопоточности, нельзя просто вжжжжжжух и сделать код асинхронным. Он должен писаться как асинхронный с самого начала, с прицелом на исполнение в реакторе.
    Ответ написан
    2 комментария
  • Смог ли кто-нибудь получить работу тестировщика после прохождения популярных курсов типа GB,Skill..,YA? Насколько это реально?

    TonyHunt
    @TonyHunt
    Part-time developer – full-time geek.
    курсов типа GB,Skill..,YA?


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

    Информации для изучения на 1.5-2 года вперёд... Можно изучать до посинения. Бесплатно.

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

    Вы можете в сети найти материалы практически по всем школам/курсам, ознакомиться с качеством, уровнем материала и если вас устроит, пойти опалтить. Но после ознакомления с материалами, у вас отпадёт всякое желание платить хоть что-нибудь.

    Проходил курсы SB/YA за счёт компании и бесплатно скачивал. Качество такое себе. В сети больше информации, доступнее рассказывается, бесплатно.

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

    Насколько это реально?

    Реально. Зависит от упорства.

    Вкратце о себе, мне 28 лет, работаю манагером.

    Вкратце, мне больше 36, работал манагером, учился самостоятельно на разработчика, работаю. Доволен как слон. Со мной параллельно много было ребята 35-40, все что-то нашли.

    Повашему 28 лет, это приговор что-ли? =) Отучились и в рабство на одной работе до самой смерти? До пенсии, вы еще сможете раза 2-3 сменить ориентир, если душе будет угодно.
    Например, недавно освоил аргоновую сварку, сейчас получаю права кат С. Могу пойти сварщиком, на старте 70к+, дальше больше. Могу пойти в дальнобой, на старте 70к+. Можно взять фуру и самому катать, 130-250к в мес и так далее. Вариантов на самом деле море и много есть примеров где можно больше зарабатывать, чем в найме или программистом, или тестировщиком.

    Изучаю Python уже полгода, но чисто для себя, учусь делать боты, хочу попробовать поделать парсеры, это как хобби

    На сегодняшний день в чистом виде знание просто языка не достаточно. Нужно изучать окружение, фреймворк, соответствующие инстурменты. Если это еще и веб, то веб инструменты и в придачу базу JS.
    Одними ботами, парсерами сыт не будешь, к сожалению. Возможен вариант ботоводства, или платформы с агрегацией Х инфомрации для ЦА, но это не простая тема для джуна.

    Так как продажи уже зае...ли

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

    решил промониторить рынок и наткнулся на вакансии тестировщиков и автотестировщиков.
    что тестировщиком попроще войти в рынок it чем программистом.

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

    Типа гарантированное трудоустройство и туда и сюда. НО я же сам продажник и понимаю что никаких гарантий нет.

    Нет никаких гарантий. Никто их вам не даст. Нет в договоре информации про "трудоустройство", есть информацию, что вам дают первичные знания за Х денег и всё. Вы пытаетесь купить рабочее место, продажные компании на этом хотении делают деньги.
    Продажник, который понимает, но не осознает и хочет чтобы ему еще раз сказали. Говорю: Гарантий вообще нет.

    Сколько времени это примерно у вас заняло?

    В среднем 6 месяцев, если есть какой-то бэкграунд. Если с нуля, то 1-1.5 года. Лучше найти компанию и пойти на стажировку, быстрее прокачаешься чем сам или на каких-либо курсах.

    подбором персонала "Рассматриваете ли вы реально кандидатов после курсов в возрасте от 28 лет? Вообще приходят ли к вам люди с какими то знаниями ? Даете ли шанс? Или сливаете?"

    Важен опыт, знания, умения, желательно профильное образование (будет плюсом). Наличие желания развиваться. Некоторые компании берут нулей и обучают, у крупных компаний есть свои внутрении курсы.

    на реальную работу я даже не рассчитываю.

    На реальную работу не рассчитыавет, а вопросы про трудоустройство, курсы задаёт. Странный вы тип. Разберитесь в себе. Чего вы реально хотите. Постройте план и двигайтесь к цели.

    поизучаю Pythonчик и сделаю года через полтора годика какого нибудь крутого бота

    Бот, код, продукт должен решать боль ЦА, быть полезным, а не крутым.
    Ответ написан
    2 комментария
  • В чем причина уменьшения скорости электромагнитных волн в среде?

    15432
    @15432
    Системный программист ^_^
    В материале, через который проходит электромагнитная волна, возникает ответная волна в противоположном направлении (из-за электронов в атоме). Атомы "сопротивляются" проходящему свету, примерно как металлическое кольцо отклоняется при быстром поднесении магнита (возникает ответное магнитное поле).

    Векторное сложение основной волны и "ответной" и дает уменьшение скорости света в материале. Чем компактнее материал (имеется в виду плотность упаковки атомов), тем больше "сопротивление" и тем меньше скорость света.
    Ответ написан
    5 комментариев
  • C# как удвоить символ через отдельную функцию?

    @kttotto
    пофиг на чем писать
    var source = "Test";
    
    // v.1 Заменит первое вхождение этой буквы в слове на удвоенную
    var ch = 's';
    var i = source.IndexOf(ch);
    var result = source.Substring(0, i) + ch + source.Substring(i);
    
    // v.2  Заменит все вхождения этой буквы в слове на удвоенную
    var ch = "s";
    var result = source.Replace(ch, ch + ch);
    Ответ написан
    1 комментарий
  • Почему все расширения в Firefox перестали работать?

    riot26
    @riot26
    <:З )~~
    Какие-то проблемы с каким-то сертификатом, автообновление которого сломалось. Уже исправляют.
    https://bugzilla.mozilla.org/show_bug.cgi?id=1548973

    UPD:
    11:12 p.m. PST: The team is currently testing a fix for this issue. In the meantime, signing of new extensions is disabled until the fix is in place.


    UPD 2:
    Временное решение в блоге Мозиллы. Нормальное обновление на подходе.

    UPD 3:
    Update: Firefox developers are currently reviewing a patch that will fix this issue.


    UPD4:
    Технические подробности произошедшего в блоге Mozilla Hacks:
    https://hacks.mozilla.org/2019/05/technical-detail...

    UPD5 последний:
    Перевод подробностей на хабре.
    Ответ написан
    1 комментарий
  • Почему затирается часть массива в Си?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert

    void get_disks(char * allDisks[])
    {
      char buf[128];
      ...
      for (char *s = buf; *s; s += strlen(s) + 1)
      {
          ...
          allDisks[i] = s;
          ...
          allDisks[7] = "ABC";
          allDisks[8] = "DEF";
      }
    }


    После прохождения массива функцией get_files список дисков исчезает, но "ABC" и "DEF" остаются.
    Подскажите, почему так происходит, куда теряются первые строки и как исправить?

    Так происходит потому что ты кладёшь в allDisks указатели на стековый массив buf, который разрушается после выхода из функции get_disks. А строчки "ABC" и "DEF" -- константные строчки, существуют всё время выполнения программы.
    Исправить можно, например, выделив память для строчек, которые записываются в allDisks:

    void get_disks(char * allDisks[])
    {
      char buf[128];
      int i = 0;
    
      GetLogicalDriveStringsA(sizeof(buf), buf);
      for (char *s = buf; *s; s += strlen(s) + 1)
      {
        if (GetDriveTypeA(s) == 2 || GetDriveTypeA(s) == 3)
        {
          allDisks[i] = strdup(s);
          ++i;
    
          allDisks[7] = "ABC";
          allDisks[8] = "DEF";
        }
      }
    }
    Ответ написан
    Комментировать