• Как удалить всё, кроме букв?

    0xD34F
    @0xD34F Куратор тега Регулярные выражения
    Regex.Replace(str, "(?i)[^А-ЯЁA-Z]", "")
    Ответ написан
    1 комментарий
  • Как спарсить страницу с json и контент который подгружается при листании на Python?

    hottabxp
    @hottabxp Куратор тега Python
    Сначала мы жили бедно, а потом нас обокрали..
    Здесь ни selenium, ни BS4 не нужен. Здесь достаточно requests и json.
    Так получаем список стран:
    import requests
    import json
    
    url = 'https://de1.api.radio-browser.info/json/countries'
    
    response = requests.get(url)
    countries = json.loads(response.text)
    
    for country in countries:
    	name = country['name']
    	stationcount = country['stationcount']
    	print(f'{name} - {str(stationcount)}')

    Что бы получить данные по стране, обращаемся по адресу:
    https://de1.api.radio-browser.info/json/stations/b...
    вместо россия, указываем страну из предыдущего ответа.

    страницу грузит, но на вкладке Network пуста и тоже ничего не выходит
    и
    Вижу что отправляется json запрос xhr /countries
    несостыковка).
    Посмотрите в интернете, что такое xhr. А также почитайте про инструменты разработчика, это упростит анализ сайта.
    5ec190758bce4994130778.png
    Ответ написан
    Комментировать
  • Как спарсить страницу с json и контент который подгружается при листании на Python?

    origami1024
    @origami1024
    went out for a night walk
    Тут не нужно парсить что-то, просто забирай из API данные.
    Например список стран тут: https://de1.api.radio-browser.info/json/countries
    Данные по конкретной стране так: https://de1.api.radio-browser.info/json/stations/b...

    Например, через requests.get:
    import requests
    raw = requests.get("https://de1.api.radio-browser.info/json/stations/bycountryexact/Ukraine")
    print(raw.content)


    Ну и конвертируй JSON в объект так, для полноты ответа:
    import json
    jsoned = json.loads(raw.content)
    print(jsoned[0])
    Ответ написан
    Комментировать
  • Как работает .NET?

    ayazer
    @ayazer
    Sr. Software Engineer
    код превращается в IL, который уже будет превращаться в машинный по мере необходимости (см. JIT компиляцию). Т.е. по сути первый вызов метода будет происходить чуть дольше т.к. будет происходить оптимизация и компиляция IL кода под реальную аппаратную платформу. После чего все последующие вызовы будут выполняется быстрее. Если такой вариант по каким-то причинам не подходит - есть ngen который позволяет сразу скомпилировать код под известную платформу (выиграв на холодных запусках, по потеряв в переносимости). И в этом случае jit компиляция во время работы приложения уже выполнятся не будет.

    В CLR не входит CIL?

    не совсем понял вопрос. cil/msil/il - просто промежуточный в который превращается код на С#/F#/VN.NET/etc. Можно расценивать его как ассемблер для .нета. Мало того, никто не запрещает написать свой DSL, который будет генерировать IL, который в свою очередь будет работать везде где работает .нет

    JIT запускается каждый раз при сборке проекта или только один раз чтобы запомнить архитектуру платформы?

    оба варианта нет. jit компиляция = just-in-time и запускается прямо во время работы приложения. как-раз она и превращает IL код в нужный набор машинных кодов.
    Ответ написан
    3 комментария
  • Почему при заряде / разряде конденсатор пропускает ток?

    gbg
    @gbg Куратор тега Электроника
    Любые ответы на любые вопросы
    Сначала картинка из серии "физики шутят":
    120737_original.jpg
    С ее помощью можно запомнить, что там конденсатор пропускает, а что - нет.

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

    Вынос из каментов:

    Чем диэлектрик отличается от проводника? В проводнике есть свободные носители заряда - то есть штуковины (электроны (в металле), ионы (в жидкости)), которые могут свободно перемещаться в веществе.

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

    Это не может продолжаться бесконечно, потому что в какой-то момент все "резинки" натянутся (емкость зарядилась) и ток течь перестанет. Но если приложить слишком большое поле, "резинки" порвет, заряды свалят со своих мест - наступит пробой диэлектрика.
    Ответ написан
    2 комментария
  • Как сделать проверку поля у переменной класса object?

    SpacePurr
    @SpacePurr
    c#, wpf
    Попробуйте вот так

    if(CurrentContentVM is WatchNoteVM wnVM && wnVM.WatchNote == deleteNote)
    Ответ написан
    Комментировать
  • Как задать минимальную ширину кнопки (не её содержимого)?

    SpacePurr
    @SpacePurr
    c#, wpf
    Используйте свойство MinWidth у класса Window, а не Button.
    Ответ написан
    Комментировать
  • Возможно ли улучшить качество кода?

    SpacePurr
    @SpacePurr
    c#, wpf
    Если мучаешься - бросай. Если интересно - продолжай и код станет лучше. Как и ты. Как и весь мир.
    Ответ написан
    1 комментарий
  • Кто может подсказать видеокурс или книгу(с переводом на русский) для обучения java с нуля?

    SpacePurr
    @SpacePurr
    c#, wpf
    Здравствуйте.

    1. Герберт Шилдт - Java 8 Руководство для начинающих 6-е издание. Читается книга достаточно легко. Предварительно, тем не менее, советую забежать на Youtube на канал Уроки Java. Там есть плейлист с 400 уроками, просмотрите хотя бы первые 20, установка IDE, переменные, ООП, а также, чтобы увидеть как кодить. Это вам очень поможет на первых этапах.
    2. Лекции Golovach Courses на Youtube. Мега крутой чувак с самым полным разбором Java, который я видел.
    3. Брюс Эккель - Философия Java. Полный справочник(не самоучитель) всего самого необходимого.
    4. Ну и напоследок сервис JavaRush. Курс в игровом стиле. Задачи с самых простых до сложных со стажировкой на последних уровнях обучения. Подписка по скидке на год стоит около 6к, но если вы серьезно настроены, то прокачать она вас сможет сильно. Я к сожалению до конца курс не прошел так как заинтересовался c#. Прокачивают даже умение поиска информации в google.

    Дерзайте, удачи.
    Ответ написан
    Комментировать
  • Как деактивировать все toggle button кроме одного при клике?

    SpacePurr
    @SpacePurr
    c#, wpf
    Определите такой стиль
    <Window.Resources>
        <Style TargetType="RadioButton" BasedOn="{StaticResource {x:Type ToggleButton}}">
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate>
                        <ToggleButton IsChecked="{Binding IsChecked, RelativeSource={RelativeSource TemplatedParent}, Mode=TwoWay}"
                            Content="{Binding Content, RelativeSource={RelativeSource TemplatedParent}, Mode=TwoWay}"/>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Style>
    </Window.Resources>


    Теперь просто объявите нужное количество RadioButton
    <Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="*"/>
            <ColumnDefinition Width="*"/>
            <ColumnDefinition Width="*"/>
        </Grid.ColumnDefinitions>
    
        <RadioButton Grid.Column="0" Width="50" Height="50" />
        <RadioButton Grid.Column="1" Width="50" Height="50" />
        <RadioButton Grid.Column="2" Width="50" Height="50" />
    </Grid>


    При нажатии на кнопку только она становится активной. При повторном нажатии на нее она становится неактивной.

    5de755219b192060452254.gif

    Также, если вы хотите сделать группы таких кнопок, вам нужно добавить к RadioButton свойство GroupName с именем группы.
    <RadioButton GroupName="Group1"/>
    <RadioButton GroupName="Group1"/>
    <RadioButton GroupName="Group1"/>
    
    <RadioButton GroupName="Group2"/>
    <RadioButton GroupName="Group2"/>
    <RadioButton GroupName="Group2"/>


    Тогда нажатие на кнопку из Group1 никак не будет влиять на кнопки из Group2.
    Ответ написан
    5 комментариев
  • В DataGridView появляются лишние строки после применения фильтра TreeView, как исправить?

    SpacePurr
    @SpacePurr
    c#, wpf
    На сколько я понял, лишняя строка, которая появляется - это выделенная строка в CurrencyManager.
    Я смог найти два подхода к решению этой проблемы:
    • Отключить CurrencyManager в начале метода фильтрации по дереву
      CurrencyManager currencyManager = (CurrencyManager)BindingContext [dataGridView1.DataSource];
      currencyManager.SuspendBinding();

      Отключение сделает недоступным некоторые возможности, например CurrentRow, CurrentCell и, возможно, еще что-то.

    • Переключать выделение на одну из строк, которые должны быть видимыми.
      dataGridView1.CurrentCell = this.dataGridView1[columnNumber, visibleRowNumber];

      Однако, этот вариант не работает в случае, когда все строки должны быть скрыты.
    Ответ написан
    Комментировать
  • Как распечатать .PDF?

    @nApoBo3
    Free Spire.PDF for .NET
    У вас вероятно платная версия. В бесплатной печатается нормально.
    Бесплатная лимитирована 10 страничными pdf.

    Найтивная печать pdf, насколько я понял, зависит от принтера. У нас kyocera и hp без проблем pdf кушают, правда отправляем с cups, а не с машины пользователя( через веб сервис ).
    Ответ написан
    1 комментарий
  • Как динамически менять значение TextBox, если Binding идет через Dictionary?

    FoggyFinder
    @FoggyFinder
    Чтобы сообщить представлению (View) об изменении значения конкретного свойства из VM нужно передать его название в виде параметра:

    OnPropertyChanged(nameof(TextBoxes));

    Непосредственно в самих свойствах вы можете увидеть что идет вызов без передачи параметров:

    OnPropertyChanged();

    Дело в том, что в типичной реализации имя свойства извлекается при помощи атрибута CallerMemberName:

    public event PropertyChangedEventHandler PropertyChanged;
    public void OnPropertyChanged([CallerMemberName]string prop = "")
    {
    // ...
    }


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

    В вашем случае с TextBoxes вы не используете сеттер - его можно даже совсем убрать.
    Ответ написан
    2 комментария
  • Как использовать объект из другого метода в консольном приложении C#?

    lexxpavlov
    @lexxpavlov
    Программист, преподаватель
    Обратиться к объекту можно обратиться только по ссылке на него. Если есть ссылка - можно использовать.
    Ссылка на объект port1 сохранена в локальной переменной метода Data. После окончания вызова этого метода, все локальные переменные исчезают. Чтобы обратиться на этот объект из другого метода, есть несколько способов:
    1) сохранить ссылку в поле класса, а не в локальную переменную. Доступ к полям есть во всех методах класса (кроме статических).
    2) если второй метод вызывается из первого, то во второй метод можно передать ссылку аргументом. У вас второй метод не вызывается из метода Data, в этом случае, так не получится использовать.
    3) сам объект может передать ссылку на себя другим объектам, тогда те смогут его использовать (это как раз у вас и происходит, как и сказал Петр)

    Обратите внимание, что если бы вы не сделали добавление обработчика события, то после завершения вызова метода Data, не оставалось бы ни одной ссылки на этот объект, и сборщик мусора (GarbageCollector, GC) отметил бы его мусором и удалил бы его (раньше или позже). А раз вы сделали обработчик события, то этот объект не является мусором (он используется другим объектом). Мусором он станет, когда вы удалите обработчик события.

    Каким способом передавать ссылку лучше всего? В зависимости от контекста (т.е. от способа использования этого объекта):
    1) если вы создали временный объект, который вы использовали и больше не нужен, то передавайте ссылку на него аргументами при вызове методов, его используемых. Когда объект больше не нужен, GC быстро и безболезненно удалит его.
    2) если вы создали постоянный объект, который должен работать какое-то время после окончания метода, в котором объект создан, то нужно положить ссылку на него в поле класса (или в список, или ещё куда-нибудь). Пока есть ссылка, остаётся объект. Когда он уже не нужен, то нужно удалить ссылку на него (присвоить в поле null или новую ссылку, удалить из списка и пр.). Не забывайте обнулять ссылки на не нужные объекты!
    3) Можно использовать косвенные ссылки (например, обработчики события), но это обычно неудобно - не ясно, когда исчезнут ссылки на объект, а в некоторых случаях, удалить обработчик уже не получится (опять же, это сложно сделать без ссылки). Подобные вещи - места для трудноуловимых багов. Поэтому, лучше использовать способы 1 или 2.
    Ответ написан
    Комментировать
  • Как использовать объект из другого метода в консольном приложении C#?

    petermzg
    @petermzg
    Самый лучший программист
    Никак.
    Метод это изолированное пространство и доступа к локальным переменным этого пространства нет.
    Но в вашем случае инстанс обьекта SerialPort передает ссылку на свой экземляр в подсоединяемый делегат, через параметр sender и в нем вы можете сделать так:
    var port = (SerialPort)sender;
    Ответ написан
    1 комментарий
  • C# com-порт получение информации, обработка старт-бита, стоп-бита?

    @vitvov
    Если я правильно понял ваш вопрос, то ваше устройство шлёт постоянно данные и вам нужно только читать.
    Все что вам нужно, это создать подключение к порту и подписаться на событие обновления. При возникновении события вы получите массив данных с порта, этот массив вы сохраняете в буфер или разбираете на лету (как вам удобнее). Напишу для вас маленький пример:
    //  Наследуем наш клас от SerialPort для более красивого кода
    public class MySerialPort : SerialPort
    {
            private const int DataSize = 54;    //  я так и не понял, какой размер данных нужен. Укажите правильное число в байтах
            private readonly byte[] _bufer = new byte[DataSize];
            private int _stepIndex;
            private bool _startRead;
    
            public MySerialPort(string port)
                : base()
            {
                //  все папаметры вы должны указать в соответствии с вашим устройством
                //base.PortName = COM1;
                base.BaudRate = 115200;
                base.DataBits = 8;
                base.StopBits = StopBits.Two;
                base.Parity = Parity.None;
                base.ReadTimeout = 1000;
    
                //  тут подписываемся на событие прихода данных в порт
                //  для вашей задачи это должно подойт идеально
                base.DataReceived += SerialPort_DataReceived;
            }
    
            //  открываем порт передав туда имя
            public void Open(string portName)
            {
                if (base.IsOpen)
                {
                    base.Close();
                }
                base.PortName = portName;
                base.Open();
            }
    
            //  эта функция вызвется каждый раз, когда в порт чтото будет передано от вашего устройства
            void SerialPort_DataReceived(object sender, SerialDataReceivedEventArgs e)
            {
                var port = (SerialPort)sender;
                try
                {
                    //  узнаем сколько байт пришло
                    int buferSize = port.BytesToRead;
                    for (int i = 0; i < buferSize; ++i)
                    {
                        //  читаем по одному байту
                        byte bt = (byte)port.ReadByte();
                        //  если встретили начало кадра (0xFF) - начинаем запись в _bufer
                        if (0xFF == bt)
                        {
                            _stepIndex = 0;
                            _startRead = true;
                            //  раскоментировать если надо сохранять этот байт
                            //_bufer[_stepIndex] = bt;
                            //++_stepIndex;
                        }
                        //  дописываем в буфер все остальное
                        if (_startRead)
                        {
                            _bufer[_stepIndex] = bt;
                            ++_stepIndex;
                        }
                        //  когда буфер наполнлся данными
                        if (_stepIndex == DataSize && _startRead)
                        {
                            //  по идее тут должны быть все ваши данные.
    
                            //  .. что то делаем ...
                            //  var item = _bufer[7];
    
                            _startRead = false;
                        }
                    }
                }
                catch {}
            }
    }

    использовать это нужно так:
    var port = new MySerialPort();
    port.Open("COM5");

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

    @Mercury13
    Программист на «си с крестами» и не только
    Перед нами такая конструкция
    0 . 1000 . 1100 . 1 . 0 . 0101 . 0000 . 1
    Каждый байт начинается стартовым битом 0 и кончается стоповым битом 1. Передаётся, начиная с младшего бита.
    Итого два байта, 31+0A, или "1" + LineFeed.
    Ответ написан
    9 комментариев