Профиль пользователя заблокирован сроком с 10 апреля 2022 г. и навсегда по причине: систематические нарушения правил сервиса
  • Какова правда в работе и обучении будущего ИБшника?

    CityCat4
    @CityCat4 Куратор тега Информационная безопасность
    Внимание! Изменился адрес почты!
    80% работы и обучения - рутина, бесконечная и муторная работа с бумажками, зарплата колеблется около 20к в районах,

    Не бывает "средней температуры по больнице". ИБ - это огромная область, в которой десятки направлений, которые делятся еще на десятки поднаправлений.
    Все очень зависит от того, где работаешь - в одного в конторе в сотню-другую рыл, в небольшом отделе в конторе человек на 500 или в Сбербанке, например.
    Чем меньше контора - тем ширше круг обязанностей, чем больше - тем уже. В небольшой конторе ты можешь быть не очень связан регламентами, тем более, что половину из них тебе же и писать. В Сбере у тебя и 100% времени может уйти на регламенты.
    Со стороны в ИБ можно попасть только в контору типа Сбера - где ты долго будешь расти внутри подразделения. В небольшой конторе рыл на сотню-две - ИБ-шник (если он вообще есть) как правило один, максимум два и занимается он всем и имеет доступ всюду и ждут от него решения всего, в том числе весьма неприятных вопросов (например просмотреть сто тысяч (это не оборот речи - их реально было сто тысяч!) фотографий и удалить компроментирующие определенного человека).
    Работу админа он должен знать лучще админа - потому что ему их контролировать приходится.
    Работу юриста - в определенной области законодательства - не хуже юриста
    Работу психолога - не хуже психолога средней руки (ИБ это далеко не всегда про компы. ИБ зачастую про людей)

    Здесь нет никакой романтики. Здесь нет никаких эмоций - только суровая безжалостная правда, которая крошит иллюзии безжалостно, когда ты видишь на оперативном мониторе СМП, что девочка с ресепшн, о кторой ты втайне мечтаешь, переписывается с мальчиком из продаванов, и при этом матерится как сапожник и собирается отдаться за покатушки на тачке...
    Это скучная, рутинная работа, где много микротиков (или цисок, или даже фортигейта), много конфигов прокси и правил iptables, много логов и их анализа, много СМП/DLP и никакой хакерской романтики
    Ответ написан
    2 комментария
  • Допустимо ли создавать массивы в php без части элементов?

    Immortal_pony
    @Immortal_pony Куратор тега PHP
    В php ключи массива могут быть любыми.
    Можете сразу создавать с нужными ключами
    $myArray = [
        1 => $array2
    ];
    Ответ написан
  • Как лучше сохранять дату и время?

    @Akina
    Сетевой и системный админ, SQL-программист.
    Дата в описанном случае - это не отдельная сущность-свойство сущности Измерение, а атрибут экземпляра этой сущности.

    Соответственно "справочник дат" - дурь, не имеющая права на существование.

    Для хранения дат в любой СУБД есть соответствующие встроенные типы (их, как правило, не один). Хранение значения даты "кусками" - точно такая же не имеющая право на существование дурь. До тех пор пока выделяемые в отдельные поля компоненты этой даты не являются самостоятельной сущностью. Но в этом случае вычисляемое поле скорее всего будет более разумным решением.
    Ответ написан
    Комментировать
  • Какие ограничения несёт в себе INSERT IGNORE для секционированных таблиц?

    @Akina
    Сетевой и системный админ, SQL-программист.
    INSERT INTO может привести к ошибке. По любой причине. При этом процесс вставки прерывается, а все уже внесённые в таблицы изменения - откатываются.

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

    Замечание. Дублирование - не единственное событие, которое может вызвать ошибку. Может быть ещё куча причин (CHECK constraint, SIGNAL из триггера, нарушение внешнего ключа и т.п.). Причём далеко не все типы ошибок восстановимы и могут быть проигнорированы/преобразованы в предупреждение. Если ошибка невосстановимая (как правило, это системные или внешние ошибки) - запрос прерывается по ошибке и откатывается обычным образом.

    Замечание 2. Всё вышеописанное никак не пересекается с секционированием. За исключением случая, когда значение поля не соответствует диапазону ни для одной из секций. В этом случае IGNORE срабатывает штатно - ошибка преобразуется в предупреждение, проблемная запись не вставляется.

    Нужно игнорировать дублирующиеся данные. Буду делать INSERT IGNORE

    Кроме INSERT IGNORE INTO есть ещё два типа запросов, которые обрабатывают ошибку дублирования данных - это INSERT .. ON DUPLICATE KEY UPDATE и REPLACE INTO. Изучите их - возможно, какой-то из них лучше подходит для Вашей конкретной задачи. При этом REPLACE не поддерживает модификатор IGNORE и не может игнорировать другие ошибки.
    Ответ написан
    Комментировать
  • Как собрать сервер на устаревшем ПО?

    Adamos
    @Adamos
    ПО, написанное на PHP, которое представляет из себя электронный библиотечный каталог. Это ПО может работать на версиях PHP не выше 5.2 и MySQL не выше 5.

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

    Есть, конечно, вариант поставить на новый сервер нормальную ОС, а в ней поднять виртуальную систему с этим ископаемым, но это, имхо, только накопит проблемы, а не решит.
    Ответ написан
    9 комментариев
  • Как вывести строки с бд в зависимости от их количества с ограничением?

    @Vitsliputsli
    Наверное, потому что:
    PDOStatement::fetch — Извлечение следующей строки из результирующего набора
    в то время, как есть:
    PDOStatement::fetchAll — Выбирает оставшиеся строки из набора результатов
    Ответ написан
    Комментировать
  • Как можно автоматизировать добавление повторяющегося кода в HTML?

    AlexNest
    @AlexNest
    Работаю с Python/Django
    Вариант 1:
    1. Изучаете основы работы с СУБД, sql, php
    2. Проектируете базу
    3. Подключаете к сайту с помощью php.
    4. Пишете CRUD-функции для работы с записями.

    Вариант 2:
    Используйте CMS-ку по типу вордпреасса
    Ответ написан
  • Как работает статистика?

    DevMan
    @DevMan
    есть просто лог.
    а статистика - выборка из этого лога, агрегированая по определённым критериям.
    в вашем варианте - выборка за определенный период.
    Ответ написан
    4 комментария
  • Как передать длинный текст в запросе для MySQL из python?

    @galaxy
    Данные надо передавать отдельно
    query = "INSERT INTO table (id, name, text) VALUES (%s, %s, %s)"
    cursor.execute(query, (id, name, text))

    https://dev.mysql.com/doc/connector-python/en/conn...
    Ответ написан
    Комментировать
  • Проблема с пониманием проектирования бд, поможете?

    vabka
    @vabka
    Токсичный шарпист
    к примеру, у одного объявления в среднем 3 тега, на 1 миллион объявлений будет 3 миллиона записей в "объявления-теги", как там будет по скорости при выборке? Сильно я выиграю, если нарушу правило и буду писать теги, перечисляя их в строку через запятую?

    1. Представим, что промежуточная таблица объявление-тег - это два гуида.
    Тогда одна строчка будет занимать около 32 байт. 3*32*1000000 = 96 мегабайт (метрических)
    2. Естественно, выборка будет медленной, если не добавить индекс. Индекс по id объявления ещё примерно столько же займёт. Выборка уже будет быстрее. Для фильтров ещё надо будет добавить индекс в обратную сторону - от id тега.
    3. Ещё и фильтроваться по тегам можно будет, что, мне кажется, является одним из важнейших качеств тегов.
    4. Если 96 мегабайт тебя пугает - используй int64 или int32 - тогда будет меньше в 2 или в 4 раза соответственно
    Сильно я выиграю, если нарушу правило и буду писать теги, перечисляя их в строку через запятую?

    Как уже сказали в комментах - очень сильно обосрёшься.
    Выборка, конечно, будет очень быстрая, но
    1. Представим что тег - это 6 букв на русском языке, а храним мы строки в Utf8 кодировке.
    Тогда на каждое объявление будет тратиться 6*2*3+3+4=45 байт. Соответственно на миллион объявлений уйдёт 45 метрических мегабайт.
    2. Но тут не будет индексов, по тому и фильтроваться будет очень дорого

    PS: все прикидки по памяти взяты с потолка. В реальной БД числа будут другие, но примерно похожие.
    PPS: если не совсем понятно, что я предлагаю, то вот:
    ._________.             .______________.           .____________.
    | post    |             | post_tag     |           | tag        |
    |=========|             |==============|           |============|
    | id: int |<------------| post_id: int |           | id: int    |
    | ...     |             | tag_id: int  |---------->| name: text |
    |_________|             |______________|           |____________|
    Ответ написан
    1 комментарий
  • Как в PHP вычисляется count()?

    Maksclub
    @Maksclub Куратор тега PHP
    maksfedorov.ru
    Массив в PHP внутри — хэш-таблица (точнее чуть-сложнее), в ней есть необходимые данные для оптимизаций (отдельно ключи хранятся, отдельно значения и мета-информация, в которой есть все необходимые данные)
    Ответ написан
    Комментировать
  • Какая разница между генераторами и массивами?

    profesor08
    @profesor08 Куратор тега PHP
    Это разные вещи. Массив - структура данных. Генератор - функция.
    Ответ написан
    Комментировать
  • Как вставить переменную в строку в РНР?

    rozhnev
    @rozhnev Куратор тега PHP
    Fullstack programmer, DBA, медленно, дорого
    Как то так:
    class Stopwatch 
    {
    	private $mysqli;
    	private $stopwatch_id;
    	private $db;
    	
    	function __construct($mysqli, $stopwatch_id) 
        {
            $this->db = $_ENV['BD_NAME'];
           	$this->mysqli = $mysqli;
            $this->stopwatch_id = $stopwatch_id;
        }
    	
    	public function start()
        {
            $timestamp = time();
            $query = "
                INSERT INTO `$this->db`.`stopwatch` (`chat_id`, `timestamp`)
                VALUES (?, ?)
                ON DUPLICATE KEY UPDATE timestamp = ?
            ";
            $stmt = $this->mysqli->prepare($query);
    
            /* bind parameters for markers */
            $stmt->bind_param("iii", $this->stopwatch_id, $timestamp, $timestamp);
    
            /* execute query */
            return $stmt->execute();
        }
    }


    PHP sandbox
    Ответ написан
    3 комментария
  • Как убрать форматирование запроса MySQL?

    @Kadabrov
    Нет времени изучать, нужно срочно майнить коины и взламывать пентагон
    Ответ написан
    Комментировать
  • Как правильно написать свой обработчик ошибок php?

    @rPman
    Если в скрипте произошла ошибка, то как мне откатить транзакцию
    старайся чтобы все, что касается работы с каким то объектом, у которого состояние требует реакции (закрытие файла, транзакции бд и т.п.) то настоятельно рекомендуется описывать всю логику примерно на одном уровне/в одном месте

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

    Язык программирования php рекомендует и предлагает для этого конструкцию try catch finaly, там где может произойти ошибка, в catch прописывай логику завершения именно данной секции (откатить транзакцию) и вызывай следующий throw по цепочке, в finaly же прописывай то что нужно исполнить в любом случае.

    Да это потребует вдумчиво везде где только можно следить за ошибками, но такова селяви, либо ты надеешься на авось и автоматизацию либо следишь за всем сам.
    Ответ написан
    2 комментария
  • Как всё таки работает асинхронность?

    Vindicar
    @Vindicar
    RTFM!
    Передразнивая одного человека, асинхронность это кооперативная многозадачность плюс цикл обработки событий.

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

    Ядром асинхронной программы является паттерн "реактор" - рабочий цикл. В контексте клиентского JS это рабочий цикл браузера, в контексте ноды - что-то отдельное, я полагаю (с нодой не работал).
    Цикл делает следующее:
    - ожидает завершения одной из операций ввода/вывода или ожидания (любой)
    - определяет, какая корутина ожидала эту операцию
    - передаёт ей управление
    - корутина делает своё дело, обрабатывая результат операции
    - потом корутина либо завершается, либо планирует еще одну операцию. И цикл возобновляется.

    Отсюда и вытекают все плюсы и минусы. С одной стороны, переключение между корутинами происходит в явно указанные моменты времени, так что меньше возни с синхронизацией.
    С другой стороны, длинные вычисления так не распараллелишь - только ввод/вывод. Ну или в длинном вычислении время от времени делать паузу, но выигрыша все равно не будет. Так что это имеет смысл только для IO-bound программ.
    Ответ написан
    3 комментария
  • Как сделать чтобы sql не выдавала синтаксическую ошибку?

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

    Spartak-2205
    @Spartak-2205
    Разработка и создание сайтов
    setcookie

    PHP >= 8
    Именованные аргументы
    setcookie(
    	name: 'user',
    	value: $user["login"],
    	path: '/'
    );


    PHP >= 7.3.0
    Альтернативная сигнатура
    setcookie('user', $user["login"], ['path' => '/']);


    Можно использовать функцию обёртку, в которой задать свой порядок аргументов и их значения по умолчанию:
    function cust_setcookie(
    	$name,
    	$value = "",
    	$path = "/", 
    	$expires = 0,
    	$domain = "",
    	$secure = false,
    	$httponly = false
    ) {
    	setcookie($name, $value, $expires, $path, $domain, $secure, $httponly);
    }
    
    cust_setcookie('user', $user["login"]);


    Либо в php.ini задать необходимые значения по умолчанию для path и других аргументов, тогда просто используйте:
    setcookie('user', $user["login"]);
    Ответ написан
    Комментировать
  • Как в Guzzle сделать так, чтобы исключения не завершали скрипт?

    toxa82
    @toxa82
    Ну вам нужно ловить исключения с помощью try ... catch. Куда его воткнуть в этой дичи колбэков я без понятия, но примерно подозреваю что вокруг "return $client->request...".
    Ответ написан
    2 комментария