• Как в VSCode отключить это?

    @mezhuev
    Системный администратор
    Просто щёлкните по «don't show» и подсказка не будет появляться. Или откройте параметры (Ctrl+,) и в поиске введите workbench.editor.empty.hint.
    Ответ написан
    3 комментария
  • Почему у меня неправильно определяется IP пользователя?

    @rPman
    $_SERVER['REMOTE_ADDR'] устанавливает твой веб сервер, ему вы доверяете.
    Но, если пользователь заходит через прокси сервер - то тут будет выходной ip адрес этого прокси.

    Если прокси сервер не скрывает информацию о своих клиентах то
    $_SERVER['HTTP_X_FORWARDED_FOR'] и $_SERVER['HTTP_CLIENT_IP'] должны содержать ожидаемое, но это значит нужно доверять этому прокси серверу.

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

    Cамый известный и достаточно надежный способ (его сразу отключают любые адекватные анонимизеры) - это WebRTC. Технология позволяет двум браузерам открывать прямое соединение (да еще и udp) друг с другом, а веб сервер только организует процесс. Т.е. подняв соответствующего клиента WebRTC (погугли, правда я для php с ходу готовой библиотеки не нашел) и организовав подключение клиента с этим твоим сервером, который представляется обычным веб клиентом), ты сможешь по тому, с какого ip адреса пришло соответствующее соединение, определить настоящий, даже если пользователь использует прокси.

    Это не защитит от vpn, тут никакими способами определить ip адрес пользователя не получится, потому что с точки зрения сетевых технологий, vpn - это как бы проводок пользовательского компьютера подключили к vpn-серверу, и никакие коммуникации не пойдут иначе, если пользователь не укажет иного (можно настроить маршрутизацию на выход через разные шлюзы в зависимости от геолокации, кстати этим можно воспользоваться, разместив кучу своих серверов в разных локациях и, обращаясь к ним из браузера клиента, сравнивать ip адреса)
    Ответ написан
    2 комментария
  • Как выключить Windows через Linux?

    hint000
    @hint000
    у админа три руки
    #!/bin/bash
    DOMAIN="roga-i-kopyta.com"
    USER="V.Pupkin"
    PASS="Pa$$w0rd"
    HOST="192.168.77.66"
    net rpc shutdown -f -U "$DOMAIN"'\'"$USER"'%'"$PASS" -t 2 -I "$HOST"
    Ответ написан
    Комментировать
  • Какие есть способы у ViewModel привязать Model ко View?

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

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

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

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

    public class Person
    {
        public string FirstName { get; set; }
        public string LastName { get; set; }
        public string MiddleName { get; set; }
    }
    public class EditPersonVm : BaseViewModel // который реализует INotifyPropertyChanged
    {
        private readonly Person _person;
        public Person Person => _person;
    
        private string _firstName;
        public string FirstName
        {
            get => _firstName;
            set { _firstName = value; RaisePropertyChanged(); }
        }
        private string _lastName;
        public string LastName 
        {
            get => _lastName;
            set { _lastName= value; RaisePropertyChanged(); }
        }
        private string _middleName;
        public string MiddleName 
        {
            get => _middleName;
            set { _middleName= value; RaisePropertyChanged(); }
        }
    
        public string InitFullName => $"{_person.LastName} {_person.FirstName[0]}. {_person.MiddleName[0]}.";
    
        public RelayCommand OkButton { get; set; } = new RelayCommand(Save);
    
        public EditPersonVm(Person person)
        {
            _person = person;
            FirstName = person.FirstName;
            LastName = person.LastName;
            MiddleName = person.MiddleName;
        }
    
        private void Save()
        {
            //
        }
    }

    <Window ...>
        <StackPanel Orientation="Vertical">
            <Label Content="Изначальное имя:"/>
            <StackPanel>
                <TextBlock Text="{Binding Person.LastName}"/>
                <TextBlock> </TextBlock>
                <TextBlock Text="{Binding Person.FirstName}"/>
                <TextBlock> </TextBlock>
                <TextBlock Text="{Binding Person.MiddleName}"/>
            </StackPanel>
            <Label Content="Фамилия:"/>
            <TextBox Text="{Binding LastName, UpdateSourceTrigger=PropertyChanged}"/>
            <Label Caption="Имя:"/>
            <TextBox Text="{Binding FirstName, UpdateSourceTrigger=PropertyChanged}"/>
            <Label Caption="Отчество:"/>
            <TextBox Text="{Binding MiddleName, UpdateSourceTrigger=PropertyChanged}"/>
            <Button Content="OK"  Command="{Binding OkCommand}">
        </StackPanel>
    </Window>
    Ответ написан
    Комментировать