• Чем отличается запрос от транзакции?

    saboteur_kiev
    @saboteur_kiev
    software engineer
    Транзакция может содержать несколько запросов.
    Транзакция является атомарной, обычный запрос не обязательно.
    Ответ написан
    Комментировать
  • Как можно вызвать класс без создания экземпляра?

    @gian_tiaga
    Для нестатических методов экзампляр создавать обязательно, но вы можете сделать так

    (new FileSystem())->DeleteAllDirectory('../../server/users/' . $_SESSION['user']['user_folder']);
    Ответ написан
    Комментировать
  • Где посмотреть примеры архитектур/связей БД?

    @Barmunk
    https://drawsql.app/templates

    Collection of real world database schemas from open-source packages and real-world apps that you can use as inspiration when architecting your app.


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

    CityCat4
    @CityCat4
    Внимание! Изменился адрес почты!
    Руководство "Как пользоваться гуглом для поиска информации".
    Потому что на эту тему здесь стопицот вопросов.
    Ответ написан
    Комментировать
  • Как драйвер подключается к базе данных?

    vabka
    @vabka
    Токсичный шарпист
    У каждой БД есть свой api - он может быть как на TCP, так и на HTTP. Обычно, он где-то задокументирован для разработчиков драйверов, но не всегда.
    Например у clickhouse есть задокументированный HTTP-api, но не задокументирован TCP, но это не особо мешает людям, тк исходники открыты.
    Вот, например, реализация драйвера для postgresql на C#: https://github.com/npgsql/npgsql/tree/main/src/Npgsql
    Вот он-же, но на Java: https://github.com/pgjdbc/pgjdbc
    В 99% случаев нет никакого смысла разрабатывать свой драйвер, тк это не такая уж и простая задача, а разработчики СУБД уже и так запиливают свои реализации для самых популярных платформ.
    Ответ написан
    Комментировать
  • Какое направление выбрать, если не хочешь до конца жизни пилить формочки и гонять json?

    Adamos
    @Adamos
    Предпочитаете до конца жизни пилить государственную статистику так, чтобы она показывала нужные цифры?
    Чтобы не заниматься скучной работой, нужно искать интересную и самому быть интересным работодателю. Вузовские курсы могут кое-чем помочь на этом пути, но выбор конкретного курса совершенно ничего не решает. Уж поверьте инженеру-строителю, четверть века назад положившему диплом на полочку.
    Ответ написан
    7 комментариев
  • Какое направление выбрать, если не хочешь до конца жизни пилить формочки и гонять json?

    alexgp13
    @alexgp13
    Руководитель ИТ-проектов
    За свою жизнь мне довелось поработать в веб-разработке, автоматизации газопроводов, бухгалтерии, автоматизации бизнеса и даже дизайнером рекламы и журналистом. И останавливаться пробуя новое пока не собираюсь) При этом образование у меня - радиотехника.

    Образование не ограничивает круг возможных профессий, а жизнь иногда складывается так, что приходится заниматься совершенно неожиданными вещами. Выбирайте ту специальность, которая ближе Вам в данный момент, интернет здесь вряд ли подскажет оптимальный выбор, тем более что у каждого здесь свой собственный путь и своя правда - кто-то оканчивает ВУЗ и всю жизнь работает по специальности, а кто-то ищет себя в самых неожиданных областях.
    Ответ написан
    1 комментарий
  • Можно ли создать сайт одному на java?

    @acwartz
    Тут должна быть ваша реклама.
    Я знаю основы java и spring и могу создавать простые сайты но у меня есть крутая идея

    Может быть мне стоит изучить php или python и попытаться

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

    Другой язык программирования не сделает задачу проще и легче, двигайтесь в одном направлении, а то слона питоном перетянете, после чего кинетесь в расты, го и прочее... с мыслью "там же легче будет, даа" Нет не легче. Вопрос практики, упертости, и возможно упоротости.
    Ответ написан
  • Как добавить favicon в веб-проект python?

    sergey-gornostaev
    @sergey-gornostaev Куратор тега Python
    Седой и строгий
    Либо отдавать изображение при get-запросах на /favicon.ico, либо добавить соответствующие теги в разметку страниц.
    Ответ написан
    Комментировать
  • Где и как лучше прехватывать/обрабатывать исключения?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Главная вещь, которую надо понимать про исключения, это то что они бывают двух основных видов.
    После этого вся обработка становится совершенно естественной и очевидной.

    - Error exceptions, или по простому говоря - ошибки. Обычные ошибки при выполнении программы. Обычно код бросает их сам. Решение "обрабатывать все ошибки через set_exception_handler" будет вполне логичным.
    - Business logic exceptions - это не ошибка в строгом понимании этого слова, а скорее нормальное поведение программы. Ситуация исключительная, но только для бизнес-логики. Их всегда кидает программист.

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

    - Error exceptions почти никогда не ловятся через try-catch, по крайней мере на месте. За исключением редких исключительных ситуаций обработка ошибок производится в единой точке, обработчике ошибок
    - Business logic exceptions всегда ловятся через try-catch

    Отсюда мы видим, что

    - //PDOException при коннекте (эммм... я понимаю что пример, но блин, new PDO в конструкторе репы, серьёзно?ладно, мы сейчас не об этом) - это однозначно ошибка
    - //PDOException в запросе - это тоже ошибка, тут два раза думать не надо
    - условно пустое имя. Ну вот здесь мы уже переходим в область бизнес-логики. Коду тут без разницы, пустое имя, или полное. Это важно нам - программисту, пользователю.

    Но тут есть один, блин, тонкий момент.
    Валидация, по сути, пытается разорваться между всеми слоями приложения.
    С одной стороны, это функция Сущности (которую ошибочно называют моделью) - проверять валидность своих данных.
    С другой - если нам надо донести результаты валидации до пользователя, то как быть с переводами? Тащить в модель переводчик, серьёзно? Ну ок, ладно, возвращаем ключи для перевода. Хотя тоже как-то...
    Но вот проверка емейла на уникальность. Её-то где делать?
    В Сущности? И тащить в нее соединение с БД?
    На уровне БД? А где ловить тогда исключение? В сервисе? И ломиться через несколько уровней абстракции к сырому PDOException? Не вариант.
    Или, к примеру, для модели естественно проверять каждое поле отдельно, и кидать исключение. А для пользовательского интерфейса это неприемлемо - надо выдавать все ошибки валидации скопом, а не скармливать по одной.
    Вопросы...

    Но "где валидировать данные" - это отдельная тема, которая не относится напрямую к вопросу "где ловить ошибки".

    В данном случае я предлагаю оставить Сущность Юзер без валидации, а всю валидацию делать в сервисе.

    Хотя опять же - в современных фреймворках валидацию (Не будем показывать пальцем, но это был Ларавель) вообще делают еще до запуска контроллера, в миддлвари. Это кстати спорное решение, которое нарушает целостность модели. Если мы обращаемся к модели через другую точку входа, не контроллер, а, к примеру, создаем юзера через командную строку, то нам нужна точно такая же валидация. Запускать команды через мидлварь? В сущности, это мысль... Но всё равно, мы в итоге бизнес-логику размазываем между моделью и точками входа в неё, а это костыль.
    И при всём при этом оставлять Сущность Юзер совсем без валидации тоже как-то не комильфо... А если оставлять - то получится по сути дублирование кода.
    Вопросы, вопросы...

    Но вернемся к нашим баранам, в смысле юзерам.

    Начнем с того, что проверка имени на равенство пустой строке или нулю - это какой-то детский лепет (и кстати, почему ноль нельзя? вот у Маска ребеночка зовут X Æ A-12 - почему у кого-то не может быть имя "0.0"?).

    Отдельно побурчу насчет empty. Вообще, это один из самых сложных операторов, на нем спотыкаются все поголовно. В частности,
    function f($name){
        if (empty($name))...

    - это бессмыслица. Звучит, в переводе на русский, немного шизофренически: "пусть у нас будет переменная $name. Если у нас нет переменной $name...". Ну как нет, если мы только что ее в функцию передали?
    empty() проверяет переменную на существование И "пустоту". И в данном случае первая проверка будет бессмысленной. Никогда не надо писать бессмысленный код.
    Поэтому логичнее будет написать просто if(!$name). Хотя по нынешним временам это тоже говнокод. Что мы имеем здесь в виду? Имя не может быть пустой строкой? Пустым массивом? Нулём? null? false? А true или заполненный массив - это, получается, хорошее, годное имя?
    Лучше все-таки четче определять свои претензии. К примеру, проверять длину строки.

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

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

    class ValidationError extends Exception{ ... };
     
    class User
    {
        private string $name;
    
        public function __construct(string $name)
        {
            $this->name = $name;
        }
    }
    
    class UserRepository
    {
        public function __construct(PDO $pdo)
        {
            $this->builder = $pdo;
        }
        public function add(User $user): User
        {
            $saved = $this->builder->query('INSERT INTO users (name) VALUES ("user")'); //PDOException
        }
    }
    
    class UserSerivce
    {
        private UserRepository $repository;
        private Validator $validator;
    
        public function new(array $data): User
        {
            $rules = [...] ;
            $errors = $this->validator->validate($data, $rules);
            if ($errors) {
                throw new ValidationException("", $errors);
            }
            $user = new User($data['name']); // в принципе, сучность может здесь бросить своё ValidationException
            return $this->repository->add($user);
        }
    }
    
    class UserController
    {
        private UserSerivce $service;
    
        public function store(array $data)
        {
            try {
                $user = $this->service->new($data);
            catch (ValidationError $e) {
                // рассказываем юзеру что он дурак
            }
            return redirect()->to('/' . $user->id);
        }
    }


    Но опять же, в современных фреймворках вручную этот catch не пишут, там уже при вызове контроллера мы либо в роутере, либо в миддлвари, либо еще где у черта в ступе - но, главное, в одном месте, чтобы не писать одно и то же каждый раз, ловим определенные исключения, скажем исключения которые потом сконвертируются в 4хх ошибки НТТР. И вот ошибки валидации тоже можем там ловить.

    Как можно заметить, вот весь этот длинный и путанный текст посвящен исключительно ошибкам бизнес-логики.
    Поскольку с ошибками кода всё куда проще - единый хендлер тупо их обрабатывает в одном месте, как описано в статье по ссылке @Spartak-2205
    За исключением редких случаев, когда они ловятся по месту. Когда ошибка некритичная, или есть сценарий обработки - например, попробовать выполнить то же действие еще раз.
    Ответ написан
    3 комментария
  • Kestrel на боевом сервере - альтернатив нет?

    vabka
    @vabka Куратор тега .NET
    Токсичный шарпист
    Наружу его пускать нельзя, должен быть nginx

    Вообще-то можно.
    Просто могут возникнуть сложности с балансировкой нагрузки и кэшированием.
    И nginx и Kestrel - веб серверы. Их даже иногда сравнивают.

    Да, только kestrel - это встраиваемый веб-сервер. Наподобие netty и jetty с жавы, или http стека с nodejs и go.
    Но nginx это на порядки более надежный и проверенный сервер, с кучей плагинов и настроек.

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

    Если опустить вариант с IIS, то kestrel в принципе единственный доступный вариант, тк nginx просто не умеет напрямую с aspnet общаться.
    CGI в дотнете нет, и слава богу
    Если без kestrel, то есть ещё вариант с http.sys на винде

    PS: страница из документации про то, когда стоит использовать kestrel с nginx, а когда можно обойтись одним кестрелом:
    https://docs.microsoft.com/en-us/aspnet/core/funda...
    Кратко: можно не брать обратный прокси, но тогда потеряешь немного в гибкости, например нельзя будет несколько сайтов на одном порту держать.
    Ответ написан
  • Где можно посмотреть список из 50-100 наиболее используемых встроенных функций / методов в языке php?

    Adamos
    @Adamos
    Какой только хренью люди не занимаются вместо практики, которая реально даст им нужные знания.
    Работа разных разработчиков - разная. Кто-то каждый день использует SimpleXML, а кто-то его принципиально избегает. Кому-то проще по поводу и без повода написать array_map, кто-то не использовал его ни разу.
    Занимайся работой, и багаж подтянется. А посмотреть аргументы и возвращаемое значение любой функции несложно на том же php.net, если IDE их не показывает.
    Ответ написан
    Комментировать
  • Как использовать js переменную в php методе?

    Stalker_RED
    @Stalker_RED
    Php код выполнится ещё до того, как пользователь увидит страницу в браузере.

    1. Юзер кликает по ссылке
    2. Браузер отправляет запрос на сервер
    3. На сервере работает серверный код (включая php)
    4. Сервер отправляет ответ со страницей
    5. Браузер отрисовывает страницу исполняя в процессе этого js скрипты.
    6. Юзер что-то там нажимает на странице.

    И вот вы захотели после пункта 6 передать переменную в п. 3. Без машины времени у вас это не получится.

    Но вы можете после юзерского выбора отправить ещё один запрос!
    Обычную отправку формы, переход по ссылке или ajax-запрос, например. И при этом обновить всю страницу или её часть.
    Ответ написан
    Комментировать
  • Компилятор для простого к примеру main.cpp файла?

    vabka
    @vabka
    Токсичный шарпист
    1. Visual Studio build tools - MSVC тулчейн, и прочие инструменты, но без Visual Studio.
    2. msys2 или mingw - юниксовый тулчейн
    3. WSL2 - нормальный линукс со всеми тулзами, но требовательный к ресурсам, тк запускается виртуалка, и места не мало занимает. Зато по производительности не уступает полноценному линуксу, в отличие от mingw/msys.
    Ответ написан
    2 комментария
  • Стоит ли начинающему веб-разработчику учить PHP?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Начинающему веб-разработчику следует учиться искать информацию в интернете.
    Это умение пригодится ему во множестве жизненных ситуаций.
    Например, перед тем как задавать вопрос на каком-либо ресурсе, стоит сначала поискать, а не задавал ли кто-то уже такой вопрос ранее.
    Ответ написан
  • Можно ли установить 32 гб ОЗУ на макбук про mid 2012 год?

    fedorez
    @fedorez
    Хатуль мадан
    1) установить можно. и даже работает (с известной оглядкой на совместимость маков с памятью конкретных производителей - но в общем случае - принципиально оно работает)
    2) там всего два слота под память. вы интересовались стоимостью модулей SODIMM DDR3 на 16 гигабайт? Цена делает подобные апгрейды совершенно бессмысленными - продать старичка и проапгрейдиться выйдет в те же деньги или дешевле.
    Ответ написан
    Комментировать
  • Что означает эта ошибка при открытие файлы PHP?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    Английским по белому же написано, вызов не определённой функции get_header().
    Ответ написан
    2 комментария
  • Как скачать и установить Apache?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    гоподи, не надо никаких апачей, и уж тем более всяких опенсерверов, вампы, мампы и прочей мумбы-юмбы

    скачать пхп, распаковать, перейти в папку с пхп файлами, запустить команду
    c:\путь куда распакован РНР\php -S localhost:80
    Ответ написан