• Почему driver.get() не работает?

    @aqau123
    добавьте тайм слип в 0.3-0.5 перед вызовом драйвер гета.
    Ответ написан
    Комментировать
  • Непонятки с sql_mode=ONLY_FULL_GROUP_BY

    @rakeev
    Если нужны просто все имена без повторений, то SELECT DISTINCT name FROM dates
    Если нужна еще и дата, то нужно явно указывать какая именно. Например SELECT MAX(date), name FROM dates GROUP BY name
    Ответ написан
    5 комментариев
  • Как и в каких случаях использовать DI в Yii2?

    SamDark
    @SamDark
    Yii2 core team
    DI именно в вашем случае не при чём. Это способ реализации, а не сама идея. Идея состоит в том, что вам нужно реализовать принцип инверсии зависимостей. То есть начать работать с интерфейсами, а не с конкретными реализациями.

    Чтобы быть универсальным и переносимым, модуль не должен знать о моделях извне себя. Вместо этого он должен выражать свои требования в виде интерфейса, а внешние модели этот интерфейс должны реализовывать.

    Для вашего примера делаем в модуле Article делаем интерфейсы:

    interface ArticleInterface
    {
        public function getTitle();
        public function getAuthor();
    }
    
    interface ArticleAuthorInterface
    {
        public function getName();
        public function getID();
    }


    Далее в пределах модуля используем только интерфейсы, а не сами модели:

    public function renderArticle(ArticleInterface $article)
    {
        return $this->renderPartial('_article', [
             'author' => $article->getAuthor(), 
             'title' => $article->getTitle()
        ]);
    }


    Вне модуля нам придётся реализовать интерфейсы в моделях:

    class Article extends ActiveRecord implements ArticleInterface
    {
       // ...
    }
    Ответ написан
    34 комментария
  • В чем разница между 'фабричным методом' и 'простой фабрикой'?

    @rundle
    Привет.

    Пример с сайта неудачный. Он не показывает выразительность фабричного метода в отличие от фабрики. Я изменил пример ниже.

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

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

    Например, мы открыли в Москве и Питере магазин по продаже телефонов и в классе BeelineStore есть общие методы для всех телефонов (код на java схематичный). Samsung стал поддерживать 5G интернет, поэтому сделаем тариф для этих телефонов дороже.

    spoiler
    abstract class IMobile {
    	void prepare() {
    		System.out.println("Подготовим документы по продаже от ООО Билайн");
    	}
    	void setInternetTariff() {
    		System.out.println("Установим стандартный тариф Билайна для интернета");
    	}
    	void box() {
    		System.out.println("Упакуем в желтый пакетик");
    	}
    }
    
    class BeelineSamsung extends IMobile {
    	void setInternetTariff() {
    		System.out.println("Установим отдельный тариф для 5G интернета");
    	}
    }
    
    class BeelineIPhone extends IMobile {}
    
    class BeelineStore {
    	public IMobile orderPhone(String type) {
    		IMobile phone = null;
    
    		if (type.equals("samsung")) {
    			phone = new BeelineSamsung();
    		} else if (type.equals("iphone")) {
    			phone = new BeelineIPhone();
    		}
    
    		phone.prepare();
    		phone.setInternetTariff(); 
    		phone.box();
    
    		return phone;
    	}
    }
    
    // использование
    // var mobileStore = new BeelineStore();
    // mobileStore.orderPhone("samsung"); <- клиентский код

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

    spoiler
    class MobileFactory {
    	public IMobile getMobile(String type) {
    		if (type.equals("samsung")) {
    			return new BeelineSamsung();
    		} else if (type.equals("iphone")) {
    			return new BeelineIPhone();
    		}
    
    		return null;
    	}
    }
    
    class BeelineStore {
    	MobileFactory factory;
    
    	public BeelineStore(MobileFactory factory) {
    		this.factory = factory;
    	}
    
    	public IMobile orderPhone(String type) {
    		IMobile phone;
    
    		phone = factory.getMobile(type);
    
    		phone.prepare(); 
    		phone.setInternetTariff();
    		phone.box();
    
    		return phone;
    	}
    }
    // использование 
    // var mobileFactory = new MobileFactory();
    // mobileStore = new BeelineStore(mobileFactory);
    // mobileStore.orderPhone("samsung"); <- замечу, клиентский код не изменился

    Окей - мы вынесли процесс создания телефонов - это и есть фабрика. И тут мы расширяемся, дела в нашей компании пошли хорошо и мы открываем филиалы на Урале. Тарифы на Урале будут дешевле, как стандартные, так и для 5G интернета. А также в Москве и Питере запускается программа по обмену старых телефонов на новые. И тут нам помогает фабричный метод.

    spoiler
    abstract class BeelineStore { // класс становится абстрактным
    	protected abstract IMobile getMobile(String type); // возвращается метод getMobile
    
    	public IMobile orderPhone(String type) {
    		IMobile phone = getMobile(type);
    
    		phone.prepare(); 
    		phone.setInternetTariff();
    		phone.box(); 
    
    		return phone;
    	}
    }
    
    class CenterBeelineSamsung extends IMobile {
    	void setInternetTariff() {
    		System.out.println("Отдельный тариф для 5G интернета в центре России");
    	}
    }
    
    class CenterBeelineIPhone extends IMobile {}
    
    class СenterBeelineStore extends BeelineStore {
    	public IMobile getMobile(String type) {
    		if (type.equals("samsung")) {
    			return new CenterBeelineSamsung();
    		} else if (type.equals("iphone")) {
    			return new CenterBeelineIPhone();
    		}
    
    		return null;
    	}
    	
    	public void tradeIn(String phone) {
    		System.out.println("Вы обменяли старый телефон на новый с доплатой");
    	}
    }
    
    class UralBeelineSamsung extends IMobile {
    	void setInternetTariff() {
    		System.out.println("Отдельный тариф для 5G интернета на Урале");
    	}
    }
    
    class UralBeelineIPhone extends IMobile {
    	void setInternetTariff() {
    		System.out.println("Отдельный тариф для стандартного интернета на Урале");
    	}
    }
    
    class UralBeelineStore extends BeelineStore {
    	public IMobile getMobile(String type) {
    		if (type.equals("samsung")) {
    			return new UralBeelineSamsung();
    		} else if (type.equals("iphone")) {
    			return new UralBeelineIPhone();
    		}
    
    		return null;
    	}
    }
    // использование
    // var centerBeelineStore = new СenterBeelineStore();
    // centerBeelineStore.orderPhone("samsung");
    // var uralBeelineStore = new UralBeelineStore();
    // uralBeelineStore.orderPhone("samsung");

    Мы смогли сохранить единые для всех магазинов стандарты оформления заказа, а также добавили региональные отличия.
    То есть фабричный метод гораздо гибче. Простая Фабрика обладает узкой специализацией, а фабричный метод ведет к созданию инфраструктуры, в которой реализация выбирается субклассами.
    Простая Фабрика инкапсулирует создание объектов, но она лишена гибкости фабричного метода в изменении создаваемых продуктов.
    Ответ написан
    Комментировать
  • Как установить yandex browser в manjaro linux kde plasma?

    xotkot
    @xotkot
    хорошо есть и хорошо весьма
    если не собирается програ из АУРа то идёте на страничку данного пакета и смотрите по нему инфу и коменты
    https://aur.archlinux.org/packages/yandex-browser-beta/
    где видно что пакет помечен как устаревший
    в коментах ниже пишут что не собирается из за за отсутствия необходимого файла на удаленном сервере
    yandex-browser-beta_20.8.3.361-1_amd64.deb not found.
    actual file is yandex-browser-beta_20.9.3.189-1_amd64.deb
    please update pkgbuild

    идём в PKGBUILD к данному пакету и смотрим что в переменной source указанна ссылка
    repo.yandex.ru/yandex-browser/deb/pool/main/y/yand...
    идем по ней и смотрим что действительно там лежит только новая версия yandex-browser-beta_20.9.3.189-1_amd64.deb а старой yandex-browser-beta_20.8.3.361-1_amd64.deb нету, поэтому естественно выдаёт ошибку так как по указанному пути нету нужного файла

    Варианты решения(по уровню сложности):
    • подождать пока сопровождающий пакета обновит PKGBUILD в АУРе
      как скоро это произойдет зависит от сопровождающего
    • скачать новый PKGBUILD и по нему собрать пакет, там в последнем комментарии дана ссылка на него
      в консоли выполняем команды
      git clone https://git.tuxnix.ru/nixscript/yandex-browser-beta.git
      cd yandex-browser-beta
      makepkg -sri


    • Самому исправить PKGBUILD
      git clone https://aur.archlinux.org/yandex-browser-beta.git
      cd yandex-browser-beta

      редактируем файл PKGBUILD изменив в нём значение переменных
      pkgver=20.9.3.189_1
      _pkgver=20.9.3.189-1
      pkgrel=1
      md5sums=("8d06743c89c1f63f18ceeacedd74da84")

      после чего собираем и устанавливаем пакет командой
      makepkg -sri

    Ответ написан
    Комментировать
  • Bitrix SelectedRowsCount?

    yous
    @yous Автор вопроса
    отвечу сам себе))

    $rsData->getSelectedRowsCount()
    Ответ написан
    2 комментария
  • Принцип DIP из SOLID и Autowiring из DI-контейнеров?

    syamskoy
    @syamskoy
    Dependency injection - это когда в класс A мы передаем класс B через конструктор или сеттер, что бы он с ним работал, а не создавал его в своих нутрях.
    Dependency Inversion - это когда мы в классе A работаем не с конкретной реализацией, а с интерфейсами: указываем интерфейсы в конструкторе, в методах, в возвращаемых типах и т.д.
    Это два разных понятия, которые иногда объединяют в одно, и иногда их путают.
    Так вот, autowiring - это про Dependency injection, а D в solid - это про Dependency Inversion. Одно другому не мешает и не нарушает.
    Ответ написан
    1 комментарий
  • После записи объекта в конец файла(append), чтение дописанных данных выдает StreamCorruptedException, какие есть способы справиться?

    ehabarov
    @ehabarov
    IT Specialist
    StackOverflow предлагает такой метод: Appending to an ObjectOutputStream
    Суть метода:
    - Если конечный файл не существует - то пользуемся обычным ObjectOutputStream для его создания (в этом случае в начало файла пишется нужная сигнатура).
    - Если файл уже существует - пользуемся предложенным там классом AppendingObjectOutputStream, который предотвращает повторное формирование сигнатуры.

    UPD: Пример кода, перенес из комментария.

    AppendingObjectOutputStream.java - это копия кода со StackOverflow.
    ObjectStreamTest.java - пример использования в программе.

    Метод writeObject() - выполняет запись очередного объекта в файл.
    В этот методе используется:
    - ObjectOutputStream - если файл не существует (будет создан).
    - AppendingObjectOutputStream - если файл уже существует (будет дозаписан).

    Метод readObjects() - последовательно читает файл с объектами и отображает имя класса каждого считанного объекта. Используется, чтобы удостовериться, что файл читается нормально после дописывания.

    --- AppendingObjectOutputStream.java ---
    import java.io.IOException;
    import java.io.ObjectOutputStream;
    import java.io.OutputStream;
    
    public class AppendingObjectOutputStream extends ObjectOutputStream 
    {
      public AppendingObjectOutputStream(OutputStream out) throws IOException 
      {
        super(out);
      }
      @Override
      protected void writeStreamHeader() throws IOException 
      {
        // do not write a header, but reset:
        // this line added after another question
        // showed a problem with the original
        reset();
      }
    }

    --- ObjectStreamTest.java ---
    import java.io.EOFException;
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.io.ObjectInputStream;
    import java.io.ObjectOutputStream;
    
    public class ObjectStreamTest 
    {
      public static void main(String[] args) throws IOException, ClassNotFoundException 
      {
        String filename = "objFile.bin";
        writeObject(filename, new String("Test1"));
        writeObject(filename, new Integer(10));
        writeObject(filename, new Long(200));
        writeObject(filename, new String("Test2"));
        readObjects(filename);
      }
      public static void writeObject(String filename, Object obj) throws IOException
      {
        File file = new File(filename);
        FileOutputStream  fos = null;
        ObjectOutputStream oos = null;
        if ( file.exists() ) 
        {
          fos = new FileOutputStream(file, true);
          oos = new AppendingObjectOutputStream( fos );
        }
        else
        {
          fos = new FileOutputStream(file);
          oos = new ObjectOutputStream(fos);
        }
        oos.writeObject(obj);
        oos.close();
        fos.close();
      }
      public static void readObjects(String filename) throws IOException, ClassNotFoundException
      {
        FileInputStream  fis = new FileInputStream(filename);
        ObjectInputStream ois = new ObjectInputStream(fis);
        Object obj = null;
        try 
        {
          while ( (obj = ois.readObject() ) != null )
          {
            System.out.println("Object class is : "+obj.getClass().getName());
          }
        } 
        catch (EOFException e) 
        {
          System.out.println("End of file reached.");
        }
        ois.close();
        fis.close();
      }
    }
    Ответ написан
    3 комментария
  • Насколько актуальны эти технологии?

    firedragon
    @firedragon
    Не джун-мидл-сеньор, а трус-балбес-бывалый.
    В Xamarin актуально, в Андроиде Axml.
    Html5 это кстати тоже xml ну типа вы поняли да.

    codeigniter это типа PHP ?
    Не в курсе
    Ответ написан
    Комментировать
  • Как "победить" ошибку: ERROR 1524 (HY000): Plugin 'unix_socket' is not loaded?

    @finc8888 Автор вопроса
    Python Junior
    Нашел ответ в интернете: https://www.versatilewebsolutions.com/blog/2015/05...
    Вкратце:
    1.Находим файл конфигураций my.cnf в каталоге /etc/mysql/ , и редактируем его - добавляем в самом низу файла
    [mysqld]
    plugin-load-add = auth_socket.so

    и сохраняем файл(С этим возникнут проблемы если делать это через Nautilus тем же geditом. В терминале можно ввести
    gksu gedit /путь/к/папке/с_файлом/файл
    предварительно выполнив sudo apt install gksu, если пакет gksu неустановлен, подробнее тут: https://losst.ru/kak-redaktirovat-fajly-v-ubuntu
    2.Перезагружаем mysql командой
    sudo systemctl restart mysql.service
    3.Пробуем зайти в mysql без ввода пароля к mysql, вводим пароль только на требование системы(sudo)
    sudo mysql -u root
    После этих действий у меня все заработало!!!
    Ответ написан
    2 комментария
  • Зачем и где именно писать @Override?

    EugeneP2
    @EugeneP2
    Java Dev
    Это аннотация пишется над методами, которые переопределяются из супер класса.

    Это что-то вроде страховки, гарантирующая что 100% переопределен метод.

    class A {
    public void superMethod() {}
    }
    
    class B extends A {
    @Override
    public void superMethod() {}
    }


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

    Если вдруг вы ошиблись в сигнатуре метода (например пропустили букву в название), то компилятор выдаст ошибку
    Ответ написан
    2 комментария
  • Возможна ли работа с tray (системный трей) средствами JavaFX 8?

    @fattan Автор вопроса
    программист
    Сам спросил, сам ответил:
    Перелопатив кучу англоязычной мукулатуры:

    1. есть ль альтернатива AWT-шным средствам работы с треем в Java 8?
    Да. Через пень-колоду-нативные методы (обращающиеся к вызовам ОС). Как, я понял, копать нужно в сторону SWT и иже с ними. Да так что проще заюзать AWT (для моей задачи)

    2. можно ли средствами JavaFX 8 работать с треем не прибегая к awt/swing?
    Нет. JavaFX 8 не поддерживает работу с треем. Возможно, поддержка работы с треем будет добавлена в 9й версии. А пока - сосите палец, мишки.

    Итог:
    Приложение оставил на JavaFX 8, а работу с треем вынес в отдельный класс, который написан с использованием AWT SystemTray.
    Ответ написан
    Комментировать
  • Как заставить работать WebSockets на HTTPS?

    aprenoir
    @aprenoir Автор вопроса
    программный архитектор
    Как оказалось, в этой проблеме было целых 2 нюанса:

    - первый заключался в адресе обращения к wss (спасибо Дмитрий Беляев)
    - второй в том, что необходимо было убрать из настроек подключения "requestCert: true" (спасибо @andreyma со stackoverflow).
    Ответ написан
    Комментировать
  • Как при помощи phpDoc описать сразу два варианта метода, перегруженных через __call и __callStatic?

    Minifets
    @Minifets
    Hello world!!!
    Нет, такое поведение в IDE не заложенно, и подсказать ей никак нельзя.

    Если вы попытаетесь внутри класса объявить 2 метода - с одинковым именем, то получите точно такую же ошибку. Method with same name already defined in this class. Собственно это и есть ожидаемое поведение, когда вы описываете методы в phpDoc.

    class Test {
    
        public function test() {
        }
    
        public static function test() {
        }
    }
    Ответ написан
    1 комментарий
  • Как убрать PAGEN из пагинации в каталоге товаров Битрикс?

    babarun
    @babarun Куратор тега 1С-Битрикс
    Безумный план моих идей в руках больных людей
    Не устану повторять
    Сеошники выдвигают в качестве требований такую дичь по одной причине, что бы потом оправдать свои плохие результаты. Они прекрасно знают что это повлияет на результат чуть больше чем на ноль процентов. Но когда придут подписывать акт о закрытии работ и на вопрос почему нет результата, первое что они скажут: "Ваши айтишники не выполнили наши требования".
    Ответ написан
    3 комментария
  • Что лучше табы или пробелы?

    Один таб, определенно. Лаконичнее, красивее и четче, чем засорять пространство пробельными символами (да и поставить 3 пробела вместо 4х гораздо легче, чем один таб вместо ни одного таба).
    Табы - для отступов, пробелы - для пробелов между словами. Семантика-с.

    А если табы воспринимаются не так, как кому-то хочется - вэлкам в настройки.

    P.S. А для соблюдения чьих-то стандартов достаточно установить правило замены таба на 4 пробела в сборщике проектов, и будет счастье.

    P.P.S. Сейчас, в 2к20, радикально изменил свое мнение - пробелы выигрывают по всем показателям. Скажу так, джуны любят табы, а сеньоры отдают должное пробелам.
    Ответ написан
    2 комментария
  • Как подключить PDO в Php-fpm?

    Amadeusck
    @Amadeusck
    Файл

    pdo_mysql.ini

    с содержимым

    extension=pdo_mysql.so

    закинь в

    /etc/php.d

    php-fpm автоматом подключает конфиги с этой дирректории. php.ini не трогай.

    Проверь, чтобы был файл

    /usr/lib64/php/modules/pdo_mysql.so

    Отпиши результат. Если не поможет, будем думать.

    P.S> Проверь следующие файлы, может в них что-то не то вписал.

    /etc/php-fpm.conf
    /etc/php.ini
    /etc/php-fpm.d/www.conf
    Ответ написан
    Комментировать
  • Какое посоветуете легкое IDE для PHP под Linux?

    copist
    @copist
    Empower people to give
    phpStorm - слишком монструозный и навязчивый, как будто для проектирования самолета;

    Не стесняйся признаться, что ты всегда мечтал сконструировать ракету. Слезть с phpStorm будет сложно, особенно после взлёта твоей ракеты.
    Ответ написан
    Комментировать
  • Новый способ блокировки любого Skype аккаунта

    @dimedrol2
    Многие люди заблуждаются о причинах блокировки аккаунтов майкрософт/скайп.
    Для примера опишу свой случай.

    Я не пользовался скайпом лет наверное 5.
    2 недели назад я специально создал новую учетку в почте yahoo.
    Используя эту учетку создал новый скайп аккаунт. Не хотел пользоваться старым скайп аккаутом, он был для друзей, а новый я сделал для использования на работе.
    Зашел я в новый аккаунт, посмотрел настройки и вышел.
    У меня там нет ни одного контакта, я не отправил ни одного сообщения, не сделал ни одного голосового вызова. Просто вошел и вышел. Естественно когда нужно было подтвердить почту, я это сделал.
    Это имя/id/email скайпа я нигде не публиковал и никому не сообщал. Кроме меня никто не знает об этой учетке.

    А сейчас (спустя 2 недели) я впервые решил воспользоваться этой учеткой, попытался войти в скайп, а оно меня не пускает, по причине:
    Something went wrong.
    There is a problem with your Microsoft account. To fix this, sign in to account.live.com from a browser.

    Тогда я попытался войти в свою учетку на account.live.com , то оно мне написало:
    Your account has been locked.
    We've detected some activity that violates our Microsoft Services Agreement and have locked your account.

    Добавлю, что я никогда не ошибаюсь в логинах и паролях, всегда ввожу правильно с первого раза, т.к. никогда не запоминаю их на память, всегда записываю в комп. Комп мой никто не ломал. Линуксовые компы пока что мало интересуют хакеров. К тому же мой комп трудно взломать. Я имею опыт защиты линукс систем, в т.ч. предоставляющих сервисы в интернет. А мой домашний комп даже не имеет внешнего айпи. И к тому же при настройке компа я сразу проверяю активные сетевые службы, вырубаю лишнее, при необходимости настраиваю файрвол. Пользуюсь только софтом из стандартных репозиториев дебиана. А если приходится использовать сторонние программы из недоверенных источников, то запускаю их во временных виртуалках (клонирую их за несколько минут), которые потом удаляю вместе с их образом на диске.
    В общем я уверен на 99.9%, что моей новой учёткой никто не пользовался всё это время (две недели).
    Поскольку я недоверяю скайпу, считаю его шпионской программой, то я устанавливал его внутри виртуальной машины. Виртуальную машину сделал специально для скайпа, и не включал виртуалку две недели.

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

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

    Но, оказалось, что забанить могут практически без повода. Неблагоприятные факторы в том числе следующие: проживание в России (санкции), использование линукс, изоляция скайпа от основной операционной системы, чтобы скайп не сливал ваши данные майкрософту (а значит и спецслужбам).
    Ответ написан
    Комментировать