Задать вопрос
  • В чём ошибка в задаче?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    Без ошибок тут только заголовок функции.
    Причём, ошибки как семантические - неверные формулировки условий, так и логические - условия неверны в принципе.
    Ответ написан
    Комментировать
  • Программа для сетевого доступа к файлам (аналог Netlook), как реализовать?

    @rPman
    это netlook? читаем описание:
    Поддержка трех протоколов: SMB, FTP и HTTP.

    SMB - это майкрософтовский протокол доступа к файлам по сети в локальных сетях с машинами с windows, в linux поддержка этого протокола обеспечена с помощью samba и соответствующих библиотек. В терминах этой сети share (шара) - это опубликованный каталог на машине (расшарить) или сервере

    на windows для работы с файлами по сети не требуется дополнительных библиотек, и все функции работы с файлами принимают \\имя_сервера\имя_шары\путь\файл
    на linux придется пользоваться библиотеками либо монтировать шару на какой-либо каталог (smbmount или файловая система cifs)

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

    Есть одна проблема, ключевая, получение списка машин в сети и списка шар на каждой. В зависимости от языка программирования и ОС будут свои нюансы.
    на c++ с использованием win32 api - используй это, ну и пример с поиском всех шар в сети
    Ответ написан
    Комментировать
  • Typescript и cp1251?

    firedragon
    @firedragon
    Не джун-мидл-сеньор, а трус-балбес-бывалый.
    добавьте iconv в конвеер все будет автоматом

    вот и пакет для вас
    https://www.npmjs.com/package/iconv-lite
    Ответ написан
    6 комментариев
  • Как правильно связать php сайт с mysql?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    На частные вопросы ответили в комментариях, поэтому ответим на вопрос из заголовка.

    Чтобы соединить сайт с mysql, в РНР вообще-то есть два API - mysqli и PDO. Несколько лет назад с mysqli вообще невозможно было нормально работать, но на данный момент они выровнялись, хотя PDO все равно удобнее, по трем причинам
    1. Единый интерфейс при работе с различными СУБД (неактуально, если mysql для нас является синонимом слова база данных)
    2. Набор функций-хелперов для получения данных из БД в различных форматах (при желании легко воспроизводится вручную)
    3. Именованные плейсхолдеры (для некоторых это главная причина использовать PDO)

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

    1. Создаём файл`config.sample.php` куда кладем все настройки приложения, в том числе базы данных
    return [
    	'db' => [
    		'host' => '127.0.0.1',
    		'username' => '',
    		'password' => '',
    		'dbname' => '',
    		'port' => 3306,
    		'charset' => 'utf8mb4',
    	],
    ];

    2. В файле, который включается во все скрипты сайта, добавляем код
    if (!file_exists('config.php'))
    {
    	throw new \Exception('Create config.php based on config.sample.php');
    }
    $config = require 'config.php';

    3. И дальше в этом же файле пишем собственно нормальный код подключения к БД
    либо к mysqli
    // включаем режим информирования об ошибках
    mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
    // подключаемся к серверу
    $dbc = $config['db'];
    $db = new \mysqli($dbc['host'], $dbc['username'], $dbc['password'], $dbc['dbname'], $dbc['port']);
    // не забываем установить кодировку, чтобы не было ошибок с кракозябрами
    $db->set_charset($dbc['charset']);

    либо к PDO
    $options = [
        \PDO::ATTR_ERRMODE            => \PDO::ERRMODE_EXCEPTION,
        \PDO::ATTR_DEFAULT_FETCH_MODE => \PDO::FETCH_ASSOC,
        \PDO::ATTR_EMULATE_PREPARES   => false,
    ];
    $dbc = $config['db'];
    $dsn = "mysql:host=$dbc[host];dbname=$dbc[dbname];charset=$dbc[charset];port=$dbc[port]";
    $pdo = new \PDO($dsn, $dbc['username'], $dbc['password'], $options);

    После того как будет освоена работа с системой контроля версий (а по-хорошему это надо было сделать уже давно) добавляем config.php в файл .gitignore
    Таким образом на каждом хосте, где исполняется этот код, будет собственный файл с настройками, создаваемый по образцу из config.sample.php

    Да, и Очень Важное Дополнение:
    почему нельзя сделать 1 соединение для сайта и не тратить каждый раз время на коннект к БД?

    Никогда не следует переживать по поводу воображаемых проблем. Вот только когда создание коннекта каждый раз станет реальной проблемой, только тогда и начинать переживать по этому поводу и искать пути решения (спойлер: никогда).
    Ответ написан
    14 комментариев
  • Сколько времени уделять теории/практике?

    sergey-gornostaev
    @sergey-gornostaev
    Седой и строгий
    Вопрос звучит дико, как "Сколько времени уделять чтению рецептов, а сколько готовке?" Не надо отделять одно от другого и планировать почасовой график, учатся не так. Читаете главу учебника столько времени, сколько нужно для понимания материала. Потом экспериментируете с примереами столько времени, сколько нужно чтобы разобраться. Возвращаетесь к перечитыванию главы столько раз, сколько нужно для выяснения непонятного и решения проблем. Когда всё дочитаете и прорешаете, пишите пет-проект столько, сколько это займёт времени, возвращаясь к учебнику или обращаясь к доментации не по расписанию, а по мере надобности.
    Ответ написан
    Комментировать
  • Как сделать автоматический дамп mysql базы на MariaDB с виртуальной машины из под Linux на хостовую Windows?

    SignFinder
    @SignFinder
    Wintel\Unix Engineer\DevOps
    Делать дамп базы виндовым mysqldump.exe или любым другим бекапером, подключаясь к порту mysql сервера.
    Ответ написан
    1 комментарий
  • Изменить объем раздела /home linux?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Могу ли я на время удалить swap, либо создать его из свободного места, чтобы добавить свободное место в /home?

    легко. ты это можешь сделать даже из запущенного линукса, отключи его (swapoff /dev/nvme1n1p8), а дальше -- делай с разделом что хочешь.
    Ответ написан
    1 комментарий
  • Как изолировать клиентов друг от друга в wireguard?

    karabanov
    @karabanov
    Системный администратор
    Создай ещё один интерфейс с отдельной подсетью и закрой доступ из нее к рабочим ресурсам.
    Ответ написан
    5 комментариев
  • Список технологий необходимых для backend php developer?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Технологию надо знать ровно одну: называется google search или "базовые навыки пользования интернетом".
    К примеру, перед тем как задать вопрос на форуме (и мычать невнятное "ну я искал, марьванна, нинашол"), надо сначала воспользоваться такой секретной технологией, как поиск по конкретно этому формум, site:qna.habr.com php middle
    И обнаружить примерно 100500 готовых ответов на свой вопрос.
    Ответ написан
    4 комментария
  • Нарушает ли переопределение конструктора принцип подстановки Лисков в частных случаях?

    @Akela_wolf
    Extreme Programmer
    Нет, не нарушает. Принцип подстановки Лисков говорит о том, что клиент не должен видеть разницы между базовым объектом (в вашем случае интерфейсом) и его потомком. То есть потомки должны соблюдать контракт, определенный предком (могут делать его строже, но не слабее)

    Конструктор не является частью интерфейса, поэтому переопределение конструктора никак принцип подстановки Лисков нарушать не будет.
    Ответ написан
    3 комментария
  • Как решить проблему Segmention Fault?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    Segmentation fault - это ошибка работы с памятью. Или выход за границы массива, или что-то не так с указателями.

    Я подозреваю, что в файле у вас не 50 строк (мне лень считать). Вот вы и вылезаете за границу массива.

    Ну или там какие-то лишние переводы строк, пробелы имеются. поэтому fin.eof() не выполняется после считывания последней строки. Потом вы пытаетесь что-то еще прочитать, но получаете назад пустую строку. Это бы не было проблемой, но вы потом пытаетесь это все запихать в 51-ый элемент массива.

    Советую вместо define N и статического массива использовать std::vector. В цикле считывания файла делайте push_back нового объекта в вектор (а еще лучше, emplace_back для экономии лишнего копирования).

    При выводе берите size() у вашего вектора.

    Если вы в выводе заметите лишнюю книгу в конце с пустыми данными, то можно добавить проверку при вводе - если хоть одна из 5 строк пустая - то не надо создавать новую книгу.
    Ответ написан
    Комментировать
  • Почему PHP не видит запрос AJAX?

    @denisus16
    Попробуй вместо type:'POST' указать method:"POST"
    function addToCart(id){
              $.ajax({
                        url: 'kek.php',
                       method: 'POST',
                        data: {
                               'balance':"1234"
                        },success:function(){
                               console.log(data);
                        },error:function(error, data){
              	          console.log(eval(error), data);
                       }
            })
    }
    Ответ написан
    Комментировать
  • Как выделить именно float из переменной типа float?

    DevMan
    @DevMan
    1. 1.945910526046646E-6 - абсолютно валидная форма
    2. если округлять до 3 знака, какой должен быть результат?

    читаем https://ru.m.wikipedia.org/wiki/Экспоненциальная_запись в целом или в частности

    1.945910526046646E-6 = 0.000001945910526046646
    вот и думай, что же пошло не так.
    Ответ написан
    Комментировать
  • Как провести соответствие между строкой и классом с точки зрения SOLID?

    @Akela_wolf
    Extreme Programmer
    Если уж совсем идеально, то:
    interface Voice {
      void say();
    }
    
    class Dog implements Voice { ... }
    class Cat implements Voice { ... }
    
    interface VoiceFactory {
      Voice getVoice(String voiceType);
    }
    
    class VoiceFactoryImpl implements VoiceFactory {
      private Map<String, Supplier<Voice>> suppliers = new HasMap<>();
      
      void addSupplier(String type, Supplier<Voice> supplier) { suppliers.put(type, supplier); }
    
      @Override
      Voice getVoice(String type) {
        final Supplier<Voice> supplier = suppliers.get(type);
        if (supplier != null) {
          return supplier.get();
        } else {
          throw new RuntimeException("No supplier for type: "+type);
        }
      }
    }


    Класс VoiceFactoryImpl выполняет принцип OCP - открыт для дополнений через метод addSupplier, в него можно добавлять новые сопоставления строка - животное и закрыт для изменений.
    Ответ написан
    9 комментариев
  • Как провести соответствие между строкой и классом с точки зрения SOLID?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Это всё очень плохо.
    В первом варианте человек должен знать, как мяукают кошки, а в последнем "правильном" варианте человек трогает не кошку, а кошачий голос(?!).
    В "идеальном" варианте опять же выбирается не животное, которое надо погладить, а его голос.

    Чтобы следовать принципам солид, надо понять в первую очередь ЗАЧЕМ это всё делается.
    А делается это для того чтобы уменьшить связность. Чтобы класс, использующий какой-либо функционал, не знал деталей его реализации. И, соответственно, мы могли бы менять реализацию без опасения поломать что-то в классе-пользователе.

    При этом extends, кроме как от абстрактного класса, эту связность всегда увеличивает.
    И его надо избегать. А использовать принцип Composition over inheritance. То есть нужный функционал получать не наследованием, а передачей независимых функциональных модулей в виде параметров.

    Соответственно, нам надо сделать иерархию: голос - животное - потрогать.
    И вот теперь у нас хоть голос, хоть животное, будут открыты для каких угодно изменений, до тех пор пока они поддерживают публичный контракт.
    / ******* голоса *******/
    abstract class VoiceEngine {
    	public function getVoice() {}
    }
    class CatVoiceEngine extends VoiceEngine {
    	public function getVoice() {
    		return "Meow!";
    	}
    }
    class DogVoiceEngine extends VoiceEngine {
    	public function getVoice() {
    		return "Bark!";
    	}
    }
    class HumanVoiceEngine extends VoiceEngine {
    	public function getVoice() {
    		return "Да пошёл ты!";
    	}
    }
    / ******* животные *******/
    abstract class Animal {
    	public function __construct(public VoiceEngine $voiceEngine) {}
    	public function say() {
    		echo $this->voiceEngine->getVoice();
    	}
    }
    class Cat extends Animal{}
    class Dog extends Animal{}
    class Human extends Animal{
    	public function touchAnimal(Animal $animal) {
    		$animal->say();
    	}
    }
    / ******* исполнение *******/
    $cat = new Cat(new CatVoiceEngine());
    $dog = new Dog(new DogVoiceEngine());
    $human = new Human(new HumanVoiceEngine());
    $human->touchAnimal($cat);
    $human->touchAnimal($dog);
    $human->touchAnimal($human);


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

    class AnimalFactory {
        public static function create($type) {
            return match($type) {
                'cat' => new Cat(new CatVoiceEngine()),
                'dog' => new Dog(new DogVoiceEngine()),
                'human' => new Human(new HumanVoiceEngine()),
            };
        }
    }
    $human = new Human(new HumanVoiceEngine());
    $human->touchAnimal(AnimalFactory::create('cat'));

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

    @galaxy
    100% вариант сейчас вряд ли может быть. Ставьте Letsencrypt, по крайней мере, деньги не потеряете
    Ответ написан
  • Могу ли я заниматься коммерческой разработкой (backend с php) на Windows 10?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Очередной дурацкий вопрос.
    И дело даже не в том что линукс действительно на первых порах не нужен.

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

    Что - уже все основы выучил? Теперь на перепутье стоишь, уже идти устраиваться или линукс мучать? Какой там линукс? Базовые операторы, основы БД, отладку, обработку ошибок, разделение кода и представления, основы НТТР, основы безопасности уже выучил? Нет? Ну так надо садиться и учить то что и на винде прекрасно учится. И задавать вопросы если что-то непонятно. Для этого тостер придуман.
    А не ковырять в носу мечтательно, "все у нас хорошо, только линукса не хватает!".

    Надо меньше мечтать и больше работать. И задавать вопросы по ходу дела. Тогда станешь программистом.
    А с таким подходом дальше дивана не продвинешься.
    Ответ написан
    11 комментариев
  • Как выбрать ноутбук для Linux?

    @AVKor
    Посмотреть модели с предустановленным Линуксом. На них он будет работать точно.
    Навскидку: Dell.
    Ответ написан
    Комментировать
  • Возможно ли устроиться программистом с общим образованием?

    sergey-gornostaev
    @sergey-gornostaev
    Седой и строгий
    Нельзя устроиться с таким уровнем поисковых навыков. Этот вопрос здесь задавался уже сотники раз.
    Ответ написан
    3 комментария
  • Компьютер с какими характеристиками нужен для нормальной работы докер десктоп в винде?

    xez
    @xez
    TL Junior Roo
    Проще Линукс поставить.
    Памяти докер жрет очень много: критически важен объём ОЗУ.
    Рекомендую устанавливать минимум 32гб
    Ответ написан
    9 комментариев