• Удалённая работа в зарубежной компании — какие есть подводные камни?

    gdt
    @gdt
    Программист
    Работаю удалённо, получаю в валюте, всё ок. Если компания грамотная - то даже в текущей ситуации (пока что) все проблемы можно решить. Проблемы с получением валюты есть только у тех банков, которые попали под санкции, в других банках всё работает. Конечно, на работу людей из РФ сейчас стали принимать гораздо меньше из-за рисков (понятно каких я надеюсь), но в целом всё ещё предлагают - с начала марта 2-3 предложения получил, из которых одно достойное (не хуже, чем у меня сейчас).
    Как говорится, стучите - и вам откроют, дорогу осилит идущий и тд и тп. Не слушайте никого, во всем мире полно как идиотов, так и вполне адекватных людей, которые будут к вам относится нормально вне зависимости от национальность.

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

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

    P. S. По упрощенке ИП платит 6% налога + 1% на сумму свыше 300000р (есть ещё другие обязательные взносы, но они идут в вычет, если всё вовремя платить, так что всё равно выходит 6%). В РФ в ФОТ штатских сотрудников отчисления занимают больше 30%.
    Ответ написан
    2 комментария
  • Паттерн фабрики, и передача параметров в выпускаемый объект. Как?

    gdt
    @gdt
    Программист
    Чутьё вас не обманывает, мне кажется с текущим интерфейсом/реализацией IFactory{T} вы можете их убрать (IFactory{T}/Factory{T}) и инжектить напрямую Func{T} - т. к. всё, что делает Factory{T} - вызывает внедрённый Func{T}.

    Далее, если вам нужно передать что-то через DI - это что-то в первую очередь нужно в DI контейнере зарегистрировать. Т. е. вам нужен по желанию интерфейс + реализация либо просто класс параметров, как-то так например:
    public interface ISessionParameters
    {
        string ClientName { get; }
        string UserName { get; }
        string Password { get; }
    }
    
    internal sealed class DefaultSessionParameters : ISessionParameters
    {
        public string ClientName => "ClientName";
        public string UserName => "UserName";
        public string Password => "Password";
    }


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

    Однако более правильный вариант - передавать параметры через фабрику сессий, что в принципе у вас и происходит. Если хочется именно так - есть вариант создавать сессию руками через конструктор, пробросив недостающие зависимости через конструктор фабрики. Ещё есть вариант инжектить не Func{ISession}, а Func{ISessionParameters, ISession}, и настроить контейнер соответствующим образом.

    Ещё насчёт SessionFactory - возможно будет проще воспринимать его как SessionManager. Тогда SessionManager мог бы использовать что-то типа SessionFactory.Create(ISessionParameters) (или Func{ISessionParameters, ISession}), а SessionFactory мог бы создавать какой-то конкретный тип сессий с переданными параметрами и пробрасывать зависимости из контейнера в конструктор сессии. Т. е. вот так:

    public interface ISessionFactory
    {
        ISession Create(ISessionParameters parameters);
    }
    
    internal sealed class SessionFactory
    {
        // Можно и здесь передать параметры - в зависимости от задачи
        public SessionFactory(ILogger<Session> logger, IHttpClientFactory httpClientFactory)
        {
            // Запоминаем
        }
    
        public ISession Create(ISessionParameters parameters)
        {
            // В сессию передаём также параметры.
            return new Session(_logger, _httpClientFactory, parameters);
        }
    }
    Ответ написан
    Комментировать
  • Как улучшить код?

    gdt
    @gdt
    Программист
    Попробуйте метод Array.IndexOf:
    var pattern = Num1.ToString();
    var index = Array.IndexOf(textBox2.Lines, pattern);
    label2.Text = index.ToString();
    Ответ написан
  • Как использовать в регулярном выражении данные из input?

    gdt
    @gdt
    Программист
    Ну значит ваше регулярное выражение должно совпадать со словом, выведенным на странице. В вашем случае - "Тест" (без кавычек), инициализируйте его значением test. Даже проще будет обойтись вовсе без выражений, сравнить строки и всё.
    Ответ написан
    Комментировать
  • C++ Как сделать постоянный вывод, и только тогда, пользователь что-то выполнить ввод в цикле?

    gdt
    @gdt
    Программист
    Вы не указали операционную систему. Если у вас linux (или что-то подобное) - вот тут есть решение при помощи select.

    В общем случае вы можете запустить отдельный поток, который в цикле выводит то, что вам нужно, и проверяет был ли установлен ивент (WaitForSingleObject, с таймаутом 0). В главном потоке создаёте ивент (CreateEvent), ждёте как обычно _getch, когда символ введён - используете SetEvent чтобы сигнализировать об этом второму потоку, также есть функция ResetEvent - чтобы сбросить ивент после обработки (чтобы можно было в цикле после следующего введённого символа его ещё раз установить). Это уже для windows.

    Ну и да, _getch это ни разу не C++, а голый C.
    Ответ написан
    Комментировать
  • Как менять цвет при наведении на контрол?

    gdt
    @gdt
    Программист
    Вот так работает:
    <ControlTemplate x:Key="TestButtonTemplate" TargetType="Button">
        <Border Background="{TemplateBinding Background}"
                BorderThickness="0"
                CornerRadius="5"
                Height="{TemplateBinding Height}"
                Width="{TemplateBinding Width}">
            <ContentControl Foreground="{TemplateBinding Foreground}"
                            Content="{TemplateBinding Content}"
                            VerticalAlignment="Center"
                            HorizontalAlignment="Center"
                            FontSize="{TemplateBinding FontSize}"
                            FontFamily="{TemplateBinding FontFamily}"/>
        </Border>
    
        <ControlTemplate.Triggers>
            <Trigger Property="IsMouseOver" Value="True">
                <Setter Property="Background" Value="Red" />
            </Trigger>
        </ControlTemplate.Triggers>
    </ControlTemplate>


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

    gdt
    @gdt
    Программист
    Как вариант, вы могли бы сделать чуть более мощную регулярку, допускающую 1 или более валидных хэштегов, разделённых пробелами. Очень грубо - добавить в конец вашей регулярки (перед концом строки) \s* и завернуть всё это дело в ()+.
    Например, regex: (#(?<tag>[A-Za-zА-Яа-я]{1,19})\s*)+ (https://regex101.com/r/rfH4AA/1)
    Затем достаём все значения группы tag, я в js не силён но думаю должен быть способ.
    Ответ написан
    2 комментария
  • Как исправить ошибку - длинный путь к файлу?

    gdt
    @gdt
    Программист
    Длина того фрагмента пути из сообщения 193 символа, а в Windows существует ограничение длины пути в 260 сиволов, так что если длина пути до папки "Тест сцен" превышает 66-67 символов (в зависимости оттого, учитывается ли null в конце) - вам придётся переместить репозиторий на уровень выше.
    Вот похожие проблемы:
    * https://github.com/microsoft/MixedReality-WorldLoc... - решилось перемещением проекта в корень диска
    * https://github.com/microsoft/MapsSDK-Unity/issues/51 - тут рекомендуют включить поддержку длинных путей в git командой git config --system core.longpaths true

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

    gdt
    @gdt
    Программист
    Главное правило - поиск нужно осуществлять исходя из поставленной задачи.
    Куда вы идёте за драйверами видеокарты / материнки и т. д.? Правильно, на сайт производителя.
    Так что, если ничего не получилось найти в плане скачать, пишем:
    frap f4218 official site

    Первая же ссылка ведёт на российский сайт производителя, на страницу модели: СМЕСИТЕЛЬ ДЛЯ КУХНИ FRAP H18 F4218

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

    Далее, может быть есть какой-то ещё более официальный сайт Frap? Убираем модель из строки поиска, видим что в РФ есть как минимум ещё один магазин Frap, заходим туда, в поиске вбиваем вашу модель, переходим на страницу товара. Видим:
    jkbbbk6kdbtdv9xyzyu_itg0oji.png

    Берём смеситель и с этой информацией ногами идём в хороший сантехнический магазин, показываем смеситель и говорим, что на сайте написано нужна такая-то кран-букса (Frap). Если их бывает несколько - вам тут же об этом скажут, и имея на руках смеситель, с хорошим консультантом, проблема решится за пару минут. В принципе можно было не гуглить и сразу так сделать.
    Ответ написан
  • Как мгновенно завершить Task?

    gdt
    @gdt
    Программист
    Извините, что не отвечаю на ваш вопрос - а почему не используете https://github.com/XamlAnimatedGif/XamlAnimatedGif ?

    По делу - если мне не изменяет память, нет простого способа прибить Task, для этого нужно использовать CancellationTokenSource, что вы и делаете в приведенном примере. Если отмена через CancellationTokenSource не срабатывает по какой-то причине - поставьте брейкпоинты или навтыкайте логов через каждую строку, найдите проблемное место, и уже исходя из этой информации решайте.
    Исходя из вашей проблемы, для начала после отмены можно просто подождать завершения таска:
    // Метод в котором останавливаете анимацию
    cancellationTokenSource3.Cancel();
    await th_Image3;

    или
    // Метод в котором останавливаете анимацию
    cancellationTokenSource3.Cancel();
    th_Image3.GetAwaiter().GetResult();

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

    Далее, таски можно чуть-чуть проще запускать, вот так:
    th_Image3 = Task.Run(() => 
    { 
        // ......
    });


    Кроме того, если вам действительно нужно, чтобы код внутри Task.Run всегда выполнялся только в единственном экземпляре - это значит, что вам нужна критическая секция. В данном случае можно сделать при помощи семафоров:
    // ......................
    Semaphore _semaphore = new Semaphore(1, 1);
    // ......................
    th_Image3 = Task.Run(() =>
    {
        _semaphore.WaitOne();
    
        try
        {
            // Показ GIF
        }
        finally
        {
            _semaphore.Release();
        }
    });


    Или же можно использовать метод ContinueWith, чтобы организовать какое-то подобие очереди задач:
    // .................................................
    Task th_Image3 = Task.FromResult(0);
    // .................................................
    th_Image3 = th_Image3.ContinueWith(() => 
    {
        // Отображение GIF
    });


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

    gdt
    @gdt
    Программист
    Найдите какой-нибудь список и пройдитесь по нему, проверьте каждый язык на поддержку того, что вам нужно. Я нашёл вот такой:
    rnxb-rpqv11edjmdnkckpnlpuzk.png
    Ответ написан
  • Как изменить значение чексбокса из другого окна?

    gdt
    @gdt
    Программист
    Как всегда, тут есть простой и правильный способ решения проблемы
    Простой метод - просто вызвать метод этого окна. Вы же где-то его отображаете, так ведь? Заведите поле с типом вашего окна с методом, там, где показываете окно - сохраните его туда. Меняете чекбокс - обращаетесь к полю, вызываете метод. Примерно так (код не запускал, где-то может быть нужно немножко иначе написать):
    public class MainWindow : Window
    {
        private WindowWithMetod _windowWithMetod;
        
        // ........................................................................................
    
        private void DisplaySecondWindow()
        {
            _windowWithMethod = new WindowWithMethod;
            _windowWithMethod.Closed += (s, e) => _windowWithMethod = null;
            _windowWithMethod.Show();
        }
    
        private void HandleCheckboxValueChanged(object sender, EventArgs args)
        {
            _windowWithMethod?.Method();
        }
    }


    Правильный метод - подумать, перед тем, как что-то писать. Смотрите, у вас есть какое-то состояние чего-то, выражаемое чекбоксом, это значит, что имеет смысл держать это что-то отдельно от обоих форм. Нам нужно:
    1. Задавать и хранить какое-то булево значение
    2. Иметь возможность реагировать на его изменение


    Определим интерфейсы, с которыми нам было бы удобно иметь дело (имена лучше дать более осмысленные):
    public interface IBooleanState
    {
        public bool State { get; set; }
    }


    public interface IBooleanStateEvents
    {
        public event EventArgs<bool> StateChanged;
    }


    Если у вас нет generic-версии EventArgs, возьмите эту:
    public sealed class EventArgs<T> : EventArgs
    {
        public EventArgs(T value)
        {
            Value = value;
        }
    
        public T Value { get; }
    }


    Далее, реализуем наши интерфейсы, удобнее будет сделать это в одном классе:
    public sealed class BooleanState : IBooleanState, IBooleanStateEvents
    {
        private bool _state;
    
        public event EventArgs<bool> StateChanged;
    
        public bool State
        {
            get => _state;
            set
            {
                if (value == _state)
                {
                    return;
                }
                
                _state = value;
    
               StateChanged?.Invoke(this, new EventArgs(value));
            }
        }
    }


    Далее, нам нужно как-то получить доступ ко всему этому добру из наших форм. Меняем конструкторы и добавляем поля:
    public class MainWindow : Window
    {
        private readonly IBooleanState _state;
        // ..................
        public MainWindow(IBooleanState state)
        {
            _state = state;
        }
    }

    public class WindowWithMethod : Window
    {
        private readonly _stateEvents;
    
        public WindowWithMethod(IBooleanStateEvents stateEvents)
        {
            _stateEvents = stateEvents;
        }
    }

    Когда создаём окна, передаём туда экземпляр нашего BooleanState:
    // Наверное где-то в Program.cs 
    private readonly BooleanState _state = new BooleanState();
    //................................................
    Application.Run(new MainWindow(_state));
    //................................................

    Для второго окна всё зависит от того, где вы его создаёте, если тоже из Program то и передаёте так же, если из MainWindow - придётся кастить:
    new WindowWithMethod((IBooleanStateEvents)_state);
    Теперь дело осталось за малым, нужно поменять значение из MainWindow, и отреагировать на него в WindowWithMethod:
    public class MainWindow : Window
    {
        private void HandleCheckboxValueChanged(object sender, EventArgs args)
        {
            _state.State = _checkBox.Checked;
        }
    }

    public class WindowWithMethod : Window
    {
        // .................
        public WindowWithMethod(IBooleanStateEvents stateEvents)
        {
            // ........................
            _stateEvents = stateEvents;
            _stateEvents.StateChanged += HandleStateChanged;
           // .........................
        }
    
        private void HandleStateChanged(object sender, EventArgs<bool> args)
        {
            Method(args.State);
        }
    }


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

    gdt
    @gdt
    Программист
    Так в виде каких ошибок проблема? Вы приложили сам код меню в качестве ошибок :)
    Посмотрите SFML and Visual Studio, у вас правильно настроен проект? В частности, обратите внимание на Configuration Properties/Linker/Input/Additional Dependencies, у вас там должны быть указаны либы SFML. Как вариант, вместо этого в VS можно писать и так:
    #pragma comment(lib, "sfml-graphics.lib")
    #pragma comment(lib, "sfml-window.lib")
    #pragma comment(lib, "sfml-system.lib")


    Добавьте этот код между #include и main, попробуйте ещё раз.
    Ссылка на неразрешённый внешний символ означает, что вы где-то в коде используете какую-то сущность, для которой есть описание (обычно в header файле, иначе бы у вас ничего не скомпилировалось), а линкер в свою очередь не может найти, где же сама сущность (класс/функция например) с таким описанием. Эти сущности в вашем случае определены в lib-файлах, и они должны быть переданы линкеру сразу после компиляции, чтобы он мог собрать рабочую программу из тех кусков, что у него есть (ваша_программа.obj, lib-файлы из SFML, crt и так далее).
    Ответ написан
  • Почему Visual Studio не удается установить Win10SDK_10.0.19041?

    gdt
    @gdt
    Программист
    Что если нажать "Просмотреть журналы", есть там что-нибудь что можно было бы просмотреть? Если там текстовые логи, алгоритм:
    1. Открываешь лог файл
    2. Ctrl+F
    3. Вводите строчку "error", убеждаетесь что поиск нечувствительный к регистру
    4. Делаете Найти всё (Find All)
    5. Проходитесь по каждому вхождению, ваша проблема там где-то есть, обычно в самом конце

    Если слишком много результатов для "error", ищите "error:" или "): error", в таком духе.
    Далее, установив причину проблемы из логов, решаете её.
    Ответ написан
    Комментировать
  • Почему игнорируется объемный фрагмент кода после выполнения httpClient.GetStreamAsync()?

    gdt
    @gdt
    Программист
    Я бы рекомендовал для начала завернуть ваш кусок кода в try/catch (Exception e), поставить брейкпоинт на следующей строчке после проблемного метода, и в теле catch. Либо там либо там должно сработать, так вы сузите круг подозреваемых :)
    Ответ написан
    Комментировать
  • Как убрать отступы текста в кнопке?

    gdt
    @gdt
    Программист
    В первую очередь в такой ситуации имеет смысл уменьшить Padding до 0 для всех четырёх сторон.
    Если этого недостаточно - тут Reduce Padding Around Text in WinForms Button собрано несколько вариантов решения вашей проблемы.
    Ответ написан
    Комментировать
  • Каким образом исправить системную ошибку PersistenceException?

    gdt
    @gdt
    Программист
    Я думаю что было бы полезно в первую очередь посмотреть на код внутри getParcelShops, ошибка явно идёт оттуда. Вообще перед тем, как задавать вопрос, очень полезно попробовать поискать информацию в вашем любимом поисковике:
    persistenceexception c#
    Первая ссылка - PersistenceException Class
    Написано:
    This exception is thrown by a SqlPersistenceProviderFactory when general connectivity errors are encountered.

    Таким образом, ваш svc где-то внутри себя так или иначе использует SqlPersistenceProviderFactory, и судя по всему испытывает какие-то проблемы с подключением к серверу. Проверьте ваш Connection String, далее если там всё верно, есть два основных варианта:
    • Сервер находится где-то в интернете, тогда у вас проблемы с firewall (либо на вашей либо на серверной стороне)
    • Сервер должен быть развёрнут локально - проверьте что он развернут и запущен, порт доступен для подключения, firewall не блокирует локальные подключения
    Ответ написан
    Комментировать
  • Как присвоить значение элемента строкового массива в bash?

    gdt
    @gdt
    Программист
    Что ж, я выполнил за вас поиск в гугле:
    bash set array element
    Пользуйтесь на здоровье:


    Я ненастоящий сварщик, но рискну предположить, что добавление строки по типу
    declare -a array
    перед циклом может чем-то помочь.
    Ответ написан
    Комментировать
  • Как удалить объект объявленный в функции?

    gdt
    @gdt
    Программист
    В общем с ходу можно предположить два варианта, простой и правильный.
    Простой вариант - исходя из вашего когда, вам не нужно удалять output. Заведите в main новую переменную для результата, и удаляйте её в конце метода main:
    const auto* test2 = testMatrix->mulVec(test);
    delete test2;


    Правильный вариант заключается в том, чтобы по возможности вообще никогда не использовать сырые указатели. Т. е. примерно так (код не проверял, что-то может быть нужно чуть-чуть по-другому написать, но основная идея такая):
    class Matrix4x4{
    public:
      float* data = new float[16];
      std::shared_ptr<Vector> mulVec(std::shared_ptr<Vector> inp){
        const auto output = std::make_shared<Vector>(...);
        /*...*/
        return output;
      }
    }
    
    int main(){
      const auto test = std::make_shared<Vector>(1, -1, 1);
      const auto testMatrix = std::make_sharedMatrix4x4>();
      const auto mulResult = testMatrix->mulVec(test);
    }


    Умный указатель сам позаботится о том, чтобы очистить память. Вместо shared_ptr можно конечно и другие указатели использовать, возможно правильно будет значение return обернуть в std::move.
    Ответ написан
    Комментировать
  • Как сделать уровни сложности для игры Угадай число C# Windows Forms?

    gdt
    @gdt
    Программист
    Смотрите, для того, чтобы угадать число, нужно его сначала загадать.
    Вы сами понимаете, чем различаются уровни сложности - а именно, диапазоном загадываемых значений.
    То есть, если подумать (никогда бы не подумал что над этим нужно думать) - вам нужно генерировать числа из разных диапазонов, в соответствии с уровнем сложности.
    Сначала нужно определиться, какие у вас будут уровни сложности - проще всего завести новый enum:
    enum Level
    {
        Easy,
        Normal,
        Hard,
    }


    Далее, вам необходимо как-то представлять свой диапазон. Можно сделать массив на два элемента, можно использовать кортеж, но мы создадим новую сущность под это дело:

    class Range
    {
        public Range(int min, int max)
        {
            Min = min;
            Max = max;
        }
    
        public int Min { get; }
        public int Max { get; }
    }


    Далее, нужно как-то связать наши уровни сложности и диапазоны. Тут не будем усложнять, пусть будет просто метод:

    private static Range GetRange(Level level)
    {
        switch (level)
        {
            case Level.Easy: return new Range(0, 10);
            case Level.Normal: return new Range(0, 50);
            case Level.Hard: return new Range(0, 100);
        }
    }


    Теперь осталось только сгенерировать случайное число, для этого вам нужен генератор случайных чисел, и метод, собственно генерирующий числа на основе уровней сложности.
    Добавляете в свой класс поле, помним о том, что Random непотокобезопасный (вряд ли это проблема в вашем случае, но знать надо):
    private static readonly Random = new Random();
    Добавляете метод, генерирующий числа:
    private static int GenerateNumber(Level level)
    {
        var range = GetRange(level);
        return Random.Next(range.Min, range.Max);
    }


    И там, где вы будете угадывать число, вызываете этот метод с желаемым уровнем сложности.

    Как видите, если подумать - ничего сложного тут нет, всё дело техники.
    Ответ написан
    Комментировать