• Как изменить структуру БД для оптимизации запросов?

    @Everything_is_bad
    А рекурсия где, в питоне? может пора узнать про рекурсию на уровне SQL? Так же иногда "дешевле" разом выбрать все записи, а потом уже на уровне python собрать иерархию. Ну и сразу, есть минимум три распространённых способа хранения "вложенности" adjacency list, materialized path, nested sets изучи их.
    Ответ написан
    1 комментарий
  • Почему в ответе скрипта появляется закрывающий тег РНР?

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

    Человек с адекватным восприятием реальности сделает очень простое умозаключение: если в ответе появляются посторонние символы, то это значит, что они присутствуют в скрипте. После этого найдет эти символы и удалит. Тупо проверив все файлы, которые участвуют в обработке запроса.
    А для неразрешимой проблемы "почему на локалке посторонних символов нету" найдет простое рациональное объяснение: файлы "на локалке" и "не на локалке" отличаются.

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

    Ну и поскольку у меня глаза не могут смотреть на эти хаотичные телодвижения, то вот как этот код может выглядеть на самом деле

    файл init.php
    <?php
    $conn = new PDO('mysql:host='.DB_HOST.';dbname='.DB_NAME.';charset=utf8mb4', DB_USER, DB_PASSWORD);  
    $conn -> setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION ); 
    
    set_exception_handler(function ($e)
    {
        http_response_code(500);
        error_log($e);
        echo json_encode([
                'code' => 'error',
                'message' => 'Internal server error'
        ]);
    });

    файл с кодом
    <?php
    // Подключаемся к базе данных
    require 'init.php';
    
    // Получаем данные
    $list = get_list($conn);
    
    echo json_encode([
        'code' => 'success',
        'data' => $list
    ]);


    Без всей этой кропотливой возни и самоповторов.
    Отсутствие данных ошибкой не является. В JS можно проверить массив data и вывести сообщение, что он пустой. Никакой специальный код для этого передавать не нужно.
    А настоящие ошибки надо обрабатывать единообразно, в одном месте. А не писать обработку после каждой строчки, причем каждый раз по-разному.
    Ответ написан
    3 комментария
  • Как делать максимально безотказные бэкапы корня сайта и mysql в динамике?

    alexey-m-ukolov
    @alexey-m-ukolov Куратор тега MySQL
    Делают read-only реплику и бэкапят её обычным способом.
    Ответ написан
    Комментировать
  • Можно ли всем строковым полям задавать тип TEXT и повлияет ли это сильно на производительность?

    AshBlade
    @AshBlade
    Просто хочу быть счастливым
    Судя по этой статье можно всегда использовать TEXT вместо CHAR(N) и VARCHAR(N), т.к. производительность особо не страдает.

    А если самому пойти в документацию, то можно увидеть следующее:
    There is no performance difference among these three types, apart from increased storage space when using the blank-padded type, and a few extra CPU cycles to check the length when storing into a length-constrained column. While character(n) has performance advantages in some other database systems, there is no such advantage in PostgreSQL; in fact character(n) is usually the slowest of the three because of its additional storage costs. In most situations text or character varying should be used instead.

    Т.е. в производительности разницы нет - только в стоимости хранения. (в отличие от других СУБД)
    Ответ написан
    5 комментариев
  • Как ведут себя данные при удалении?

    mayton2019
    @mayton2019
    Bigdata Engineer
    В реляционных БД не существует гарантий относительно порядка записей внутри таблицы. Этот порядок
    - это особенности технической реализации хранения данных внутри блоков и сегментов. Это - "know how"
    и это будет зависеть от типа DBMS (Postgres, MySQL, Oracle) и от типа таблицы (heap, index-organized, clustered e.t.c)

    Если говорить грубо, то записи (data-rows) лежат не плотно а вразнобой с пробелами с выравниванием
    к блокам. Ну тоесть вообще-вообще не так как в Excel. Удаление data-rows в Postgres насколько я помню
    физически не удаляет запись а помечает ее мертвой используя служебные поля. Впоследствии VACUUM
    делает работы по уплотнению.

    Поэтому порядок ты сам обеспечиваешь, делая запрос с опцией ORDER BY some_date_time.
    Ответ написан
    1 комментарий
  • Почему у черной дыры есть электрический заряд?

    Vindicar
    @Vindicar
    RTFM!
    Причина раз: правило сохранения заряда. Электрический заряд нельзя создать и уничтожить, только перераспределить в пространстве.
    Причина два: с точки зрения внешнего наблюдателя тело будет падать в чёрную дыру за бесконечное время. Его влияние на окружающую вселенную - например, испущенный свет - будет бесконечно ослабевать, но никогда не станет нулевым. При этом с точки зрения падающего тела, падение займёт очень даже конечное (и не слишком большое) время. Относительность - она такая.
    Ответ написан
  • Идти ли на аутстаф как на первую работу програмистом?

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

    AshBlade
    @AshBlade
    Просто хочу быть счастливым
    Как уже было сказано - это называется IPC
    Если нужно обмениваться данными, то можно использовать техники:
    - Сокеты: TCP/IP можно практически везде, Unix-domain - только в unix системах, но будет быстрее
    - Сигналы: можно передавать данные вместе с сигналом, но только int/указатель, т.е. вариантов не много
    - stdout/stdin: при создании дочернего процесса получить его stdout/stdin потоки и работать с ними
    - Каналы: можно создать канал (анонимный или именованный) и общаться через него
    - Внешний сервис для общения: какой нибудь RabbitMQ, но это чересчур
    - Общая память (Shared Memory): но может не работать во некоторых ЯП
    - Общение через файлы: один процесс пишет в файл и по окончании шлет сигнал другому процессу, который этот файл читает
    - Memory Mapped File : тот же вариант, что и с файлами, но быстрее и при больших данных можешь словить OOM и большое потребление памяти
    - ZeroMQ - это очередь сообщений, которая работает в user-space

    Дополнительно надо помнить, что есть ограничения различных платформ, ОС, ЯП и некоторые варианты там работать не будут
    Ответ написан
    Комментировать
  • Когда нужен MVC, а когда API?

    ipatiev
    @ipatiev
    Потомок старинного рода Ипатьевых-Колотитьевых
    Понятно же, что человек просто использует термины не по назначению. А имеет в виду способ взаимодействия с клиентом.
    Словом "mvc" он называет классический способ, при котором сервер отдает клиенту HTML (а не JSON).
    А словом "api" - REST сервис, при котором сервер отдает клиенту как раз JSON.

    И суть вопроса сводится именно к различию между этими двумя способами:
    - когда сервер генерирует HTML на основе полученных из БД данных, и отдает его браузеру
    - или когда в браузере выполняется программа на JS, которая запрашивает с сервера только данные, а потом на их основе генерирует HTML

    Поскольку первый способ является, условно говоря, "классическим", то про него в вакансиях и не пишут особо. А второй, поскольку является относительно "новым", и требует наличия пары несложных скиллов в дополнение к классическому, его оговаривают отдельно.

    При этом с точки зрения бэкенд программиста разницы принципиальной между этими способами нет.
    Главное в программе - это её бизнес-логика. И уметь надо в первую очередь писать её.
    А в каком формате отдавать данные в браузер - дело десятое. И выбирать между "mvc HTML" и "api REST" нет смысла - уметь надо и то и то.

    Ну и, как уже объяснили, MVC - это совсем другое. Архитектура приложения. Причем она используется для любых приложений, независимо от типа отдаваемых данных. M и C в "api" приложениях используются в полный рост. Только V немного упрощается. при этом поскольку MVC подразумевается по умолчанию, то и писать её в вакансиях тоже особого смысла нет.
    Ответ написан
    4 комментария
  • Как максимально быстро найти в диапазоне IP-адресов или подсетях нужный IP-адрес?

    wataru
    @wataru
    Разработчик на С++, экс-олимпиадник.
    Вообще, лучшая структура данных для этого - trie. Диапазоны, я уверен, идут так, что там фиксированно сколько-то начальных бит, а все оставшиеся - любые - все попадают в эту подсеть. Более того, все эти коды префиксные - ни один не будет началом другого.

    Поэтому вам надо лишь эти префиксы в trie сложить, а в вершине сохранить саму запись. При запросе надо спускаться по битам айпишника в trie, пока не упретесь в лист - вот он и соответсвтует искомому диапазону.

    Если хотите использовать существующие БД, то можно сохранить в любой реляционной базе данных начала диапазонов. По запросу IP вам надо найти последнюю стороку не больше его. Буквально
    where range_start <= IP order by range_start desc limit 1
    .

    Смотрите только аккуратно, что сравнивать их надо как битовые строки/32-битные числа, а не просто как строки. Ибо должно выполнятся 127.0.01 > 8.8.8.8. Сравнение как строки же не сработает. Или храните как битовые строки, или преобразуйте в числа, или нулями отбивайте октеты, короче трех символов.

    Раскрывать все 4 миллиарда айпишников в отдельные записи - вообще не работающая идея.
    Ответ написан
    Комментировать
  • Как максимально быстро найти в диапазоне IP-адресов или подсетях нужный IP-адрес?

    rozhnev
    @rozhnev
    Fullstack programmer, DBA, медленно, дорого
    В PostgreSQL есть специальный тип данных для хранения адресов и набор функций для работы с ними
    Ответ написан
    Комментировать
  • Как числа из строки поместить в массив?

    kawabanga
    @kawabanga
    $arr = explode(',', $str);
    foreach ($arr as $value) {
        $new_arr[] = trim($value);
    }


    Зачем использовать регулярки, если они не нужны в задаче.
    А если нужны по заданию, то
    Ответ написан
    3 комментария
  • Какие примеры кода показывать работадателю, если ты под NDA?

    xez
    @xez
    TL Junior Roo
    всем нужны примера кода, понятно почему

    Мне не понятно.
    Ни разу не собеседованиях у меня примеры кода не спрашивали.
    Я сам на собеседованиях ни разу примеры кода не спрашивал; я прошу рассказать о предыдущем проекте чисто с технической точки зрения, бизнес логика мне не интересна и на собеседовании не нужна.
    Ответ написан
    2 комментария
  • Как повысить уровень создания проектов на чистом php?

    mayton2019
    @mayton2019
    Bigdata Engineer

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

    Еще спрашивюат какие патерные проектирования используешь, придерживаешься ли принципов Solid?

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

    Очень часто рекрутеры слушают не твои ответы а считывают твой уровень уверенности.
    Эти чортовы засранки - настоящие психологи. И они обучены распознавать лузеров и всяких мамкиных
    вайтишников.

    Шаблоны проектирования... Темя душная и нудная. Способна убить любой энтузиазм. Тебе не надо их знать
    все. Все - никто не знает. Прочитай про 3-4 штуки и попробуй узнать знакомые. Например singleton - достаточно
    известный шаблон и почти все разработчики всегда его использовали только не знали об этом. Или пул объектов.
    Например везде где есть базы данных - он используется. Или фабрика. Да я и сам их не знаю. Надо будет
    почитать - почитаю. Но для собеса - выучи хотя-бы классификацию. Они там разбиты по категориям
    как порождающие, поведенческие и так далее. Как в химии например. Я химию не знаю но примерно
    догадываюсь что есть кислоты и щелочи. Что действие их взаимо-нейтрализующее.

    А сейчас я не только ради прохождения собеседований, но и ради повышения скилла хотел бы углублённо погрузиться в написание кода без фреймворков. Но как к этому подойти? Не писать .же бложег или интернет-магазин на чистом php? А если даже и напишу, то где гарантия, что это было сдлано путёво с использованием нужных патернов и соблюдением принципов Solid?

    Нет нет это - чепуха. И это тебе не надо. Никто этот код все равно смотреть не будет (вообще никогда
    сцуко не смотрят).

    Главный совет. На собеседовании ты должен непрерывно говорить. Как оратор с трибуны. Тебя
    должны остановить когда - достаточно. Но если ты сказал 2 предложения и замолчал - это выглядит
    как будто ты не знаешь или не уверен в себе.

    Для проверки - закажи тестовое собеседование у друзей. Пускай они тебя поспрашивают. И запроси
    фидбек. Пускай они честно ответят что не понравилось. Записывай все пункты. Повторяй учебное
    собеседование до тех пор пока все будут довольны.

    Собеседования - как олимпиады. К ним надо привыкнуть и войти в некое астральное состояние духа.
    Вот как только ты в него зашел - так ты и сразу готов пройти любое настоящее.
    Ответ написан
    Комментировать
  • Как решить php выдает ошибку при подключении к БД?

    syamskoy
    @syamskoy
    У вас код написан с синтаксисом PHP 8, а запускаете вы код на более старой версии PHP, которая не понимает этот синтаксис. Конкретно речь идёт об именованных аргументах. Обновите PHP или пишите без имен аргументов.
    Ответ написан
    Комментировать
  • Kubernetes, десятки configmap и как это готовить?

    saboteur_kiev
    @saboteur_kiev
    software engineer
    У вас просто организационная проблема, нужно переделать архитектурный подход.

    В глаза кидаются мелочи типа

    В каждом сервисе подключен бутстрап конфиг, в котором подключены 4-5 конфигмапов дополнительно

    А почему у вас несколько конфигмапов на одно приложение, а не один конфигмап?

    При выдаче изменений версионных, в основном, требуется к примеру в 10-и конфигах сделать изменения

    Почему из-за изменения версии, нужно делать изменения в конфигмапах, тоже неясно. Что-то себе придумали, и при масштабировании оно оказалось неудобным.

    По итогу можно провтыкать изменить на каком-то окружении параметр, и всё..окружения уже не одинаково настроены.

    Делать статические параметры, и в конфигмапы выносить исключительно environment-related опции.

    По вашему вопросу никто не скажет решения. Это нужно сесть и переделать.
    У меня свыше 100 компонентов, десяток енвайрнментов. Конфигмап один на неймспейс, секрета два на неймспейс, в принципе достаточно.
    Ответ написан
    2 комментария
  • Kubernetes, десятки configmap и как это готовить?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Тут читается не техническая а организационная проблема.

    Не очень понятно но попробую дать совет.

    Вот ты говоришь что требуется в 10 конфигах сделать изменения.
    Какие? Они - взаимосвязаны? - Это должен быть 1 коммит в git.
    Эти все изменения должны быть просмотрены глазами хотя-бы несколькими людьми.
    Если цена изменения дорого стоит (инфраструктура) то по любому должна
    быть бригада девопсов. Они - страхуют друг друга от случайной ошибки.
    Если ты будешь брать на себя падения датацентров - то очень скоро
    станешь пациентом кардиолога. Бери коллег для подстраховки.

    Константы и зависимости - надо объявлять отдельно. Чтоб если меняется hostname
    или имя свойства - то это должно быть ровно одно изменение. Как поддержать
    константы в конфигах - я щас не помню но была куча всяких штук... толи Puppet
    толи Ansible вобщем поищи сам. Я думаю таких много конфигураторов.

    Когда несколько environments то на проекте создается просто несколько фолдеров типа
    /dev
    /qa
    /uat

    и в каждом фолдере лежит полностью сконфигурированная и оттестированная
    копия всех конфигов. Переключение между env тоже должны происходит
    изменением ровно 1 свойства.

    Если внутри конфигов есть некая базовая конфигурация которая очень похожа
    (прототип) то сделайте аналог COC (Convention Over Configuration). Пускай
    прототип будет всегда. А наследники dev, qa, uat будут просто изменять
    дельту. Пароль поменялся - в конфиге-наследнике - лежит ровно 1 строчка с паролем.
    Других строк - не надо. Потому что они наследуются от прототипа.

    Как технически реализовать COC - я не скажу. Это надо обсуждать. Я это делал
    на Java проектах но это как-бы идея "на подумать". На проектах у меня были
    *.properis файлы и эту конвенцию было реализовать несложно. С ЯМЛ ами я не делал.
    Ну думаю что это возможно. Почему нет?
    Ответ написан
    2 комментария
  • Как реализовать зависимость аргумента одного класса от другого класса?

    ipatiev
    @ipatiev
    Потомок старинного рода Ипатьевых-Колотитьевых
    Соглашусь с предыдущими комментаторами, пример СЛИШКОМ высосан из пальца, чтобы по нему давать какие-то рекомендации.
    Но в целом, бак должен быть отдельным объектом в составе машины, а никаким не "аругментом".
    И у него может быть метод consumeFuel(miles)
    Который может принимать длину дороги в качестве аргумента, и уменьшать количество топлива в соответствии с заложенной формулой.

    Car.Tank.fillMax()
    print Car.Tank.getLevel()
    Car.Тank. consumeFuel(Road.length)
    print Car.Tank.getLevel()

    По поводу последнего варианта - всегда исходите из здравого смысла. Может ли быть дорога частью автомобиля? Нет, это очевидная бессмыслица. Дорога может быть частью поездки. Как и автомобиль. Вот в рамках объекта Trip они вполне могут взаимодействовать друг с другом.

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

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

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

    В одном соглашусь с ними: никогда не нужно делать два дела одновременно: и решать конкретную задачу, и учить новые концепции.
    Поэтому лучшим вариантом написания кода будет такой: сначала наговнякать процедурный, но рабочий вариант.
    А потом заняться его рефакторингом: посмотреть, какие можно использовать классы, как они могут взаимодействовать.
    Ответ написан
    4 комментария
  • Что такое событие в ООП?

    mayton2019
    @mayton2019
    Bigdata Engineer
    В первоначальном варианте ООП Аллана Кея было событие. Грубо говоря Кей считал объекты акторами.
    И от этого рисовал своё видение разработок. Но его кунг-фу не полетело в свое время. Слишком рано
    было.

    В современном классическом ООП в его реализации С++ и Страуструпа
    нет никаких событий. Нету ключевых слов. И нету среды которая-бы обеспечивала путешествие
    этих события вне объектов.

    Событие может появляться например как абстракция прикладного уровня в библиотеках типа MFC
    которы должны были работать с UI и регистрировать мышко-клики и прочее. Но там была ОС которая
    обеспечивала буфер событий. Отдельный life cycle для каждого из них. Вот. А языс Microsoft Visual C++ / MFC
    предоставляли как-бы фреймворк который регистрировал хендлеры и там соотв. эти события ловил и обрабатывал. Но это было сами понимаете никакое ни ООП. А это была очередная абстракция от Microsoft
    которая по их задумке должна была упрощать процесс разработки графического софта.

    В Borland C++ тоже есть свои абстракции для событий. Но они тоже лежат как-бы отдельно от языка. Скорее
    во фреймворке или в библиотеках.

    Откуда в PHP-OOP вдруг появляется событие? В ключевых словах PHP есть class, trait, function, abstract, extends.

    Но никаких event нету. Осталось задать вопрос. Кто вообще дает такую информацию? Что за курсы? Что
    за книга? Что за преподаватель?
    Ответ написан
    3 комментария