• Как почистить историю гит?

    @MadridianFox
    Web-программист, многостаночник
    Как вариант можно сделать git reset до "чистого" чистого коммита, так чтобы файлы сами не откатились (там опцию надо указать то ли --soft то ли без опции, но точно не --hard), и снова сделать git add уже только нужных файлов.
    Но тогда у вас все ваши коммиты превратятся в один коммит.

    Возможно через git rebase как-то можно, так чтобы и коммиты сохранить и лишнее из них убрать, но это не точно.
    Ответ написан
    Комментировать
  • Как найти все палиндромы в терабайтном файле?

    @MadridianFox
    Web-программист, многостаночник
    В большинстве ЯП поддерживается чтение некоторого количества байт с определённого места из файла.
    Т.е. можно открыть файл (не считать его весь, а только открыть), после этого в цикле читать по N байт и итерировать по ним. Дальше уже дело за алгоритмом, который принимает по одному символу и пытается в потоке символов вычислить палиндром. Т.е. это машина состояний. Думаю там нужен стэк ограниченного размера с выталкиванием самых старых символов при поступлении новых.
    // псевдокод
    file = open("my_big_file.txt","r");
    buffer = byte[1024];
    palindrome_scanner = new PalindromeScanner(4, 64); // min and max palindrome size
    while(canRead($file)){
        buffer = fread(file, &buffer);
        for(int i=0; i<2024; i++){
            palindrome_scanner->next(buffer[i]);
        }
    }
    Ответ написан
    Комментировать
  • Php mysql из базы брать сообщения только для определенной комнаты?

    @MadridianFox
    Web-программист, многостаночник
    В таблице chats должно быть поле id_room. И делать запросы
    select * from chats where id_room=?
    Ответ написан
    Комментировать
  • Как не плодить процессы php демона?

    @MadridianFox
    Web-программист, многостаночник
    При запуске демона создавать файл, и смотреть создан ли он уже. Если создан - значит демон уже работает. Если нет - можно запускать.
    Ответ написан
  • Простой вопрос по Docker-у?

    @MadridianFox
    Web-программист, многостаночник
    Сам по себе Docker работает под Linux (есть какие-то мутки с запуском на нём вёнд, но я туда не лезу, религия не позволяет).
    Под Windows доккер запускается в виртуалке. Раньше для этого использовался Docker Toolbox, который работает с Virtualbox, ну и с другими гипервизорами, если настроите. Сейчас это считается legacy, хоть его и можно скачать и всё работает.
    Docker for Windows - актуальный на данный момент способ запуска контейнеров, работает только в Windows 10 Pro. И не просто так он работает только там, ведь ему нужен HyperV, который, ой как неожиданно - гипервизор, в котором запускается такой же Linux как и в Docker Toolbox.

    Я пользуюсь Docker Toolbox. Работает нормально. Один только нюанс - проброс папок. Хотите делать volume который подтягиваться с винды - убедитесь что папка винды расшарена в виртуалку, и монтируя volume в контейнер указывайте путь до папки в виртуалке. Естественно, такой двойной проброс влияет на производительность, но мы же не прод тут хостить собрались, для редактирования кода норм.

    По поводу статей вот тут есть чутка инфы для начала. Рядом же есть и пример.
    Ответ написан
    3 комментария
  • Как сделать кнопку доступной админу?

    @MadridianFox
    Web-программист, многостаночник
    Вам нужно для каждого пользователя хранить его роль. В простейшем случае вы можете хранить нолик или единичку - нолик это простой пользователь, единичка - админ.
    Дальше, когда вы рендерите страницу, вы вывод кнопки обрамляете в условие - если у пользователя роль единичка, то показываем, иначе нет. Вот так:
    <?if($user["admin"] == 1):?>
        <button>Delete record</button>
    <?endif?>


    Хотя единичка это самый тривиальный случай и чаще требуется создавать полноценную систему авторизации. Например концепция авторизации RBAC - работает с ролями и разрешениями. Есть список разрешений, например:

    - создавать запись
    - редактировать запись свою
    - удалять запись свою
    - редактировать любую запись
    - удалять любую запись
    - назначать пользователя модератором
    - снимать с пользователя роль модератора

    И есть набор ролей

    - пользователь
    - модератор
    - админ

    вполне очевидно, какая роль какими правами должна обладать. Но есть одна оссобенность, роли могут наследоваться. Т.е. модератор является так же и пользователем. А админ является модератором. Это логично. Поэтому вводится иерархия ролей.

    Все эти данные о ролях мы конечно-же храним в БД. Итого имеем 3 таблицы:

    - таблица прав
    - таблица ролей
    - таблица связи ролей и прав

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

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

    В конце концов, мы должны прикрепить роль к пользователю. Мы можем разрешать пользователю иметь одну роль, или сразу несколько. И тут мы либо пишем id роли прямо в таблицу пользователя, либо делаем таблицу связи пользователей с ролями.

    После этого пишем код, который будет отвечать на вопрос - имеет ли этот пользователь указанное право?
    Этот код смотрит на его роль/роли, ищет в них такое право, если в них нет - то ищет в родительских ролях поднимаясь всё выше и выше по дереву ролей. Если дошёл до конца и права нет - сорян, тебе сюда нельзя.
    <?if(hasPermission($user, "delete_any_record") or hasPermission($user, "delete_own_record")):?>
        <button>Delete record</button>
    <?endif?>
    Ответ написан
    Комментировать
  • Как удалить из двух таблиц одновременно?

    @MadridianFox
    Web-программист, многостаночник
    Вообще, когда у вас есть две таблицы и одна (назовём её таблица А) имеет внешний ключ на другую (таблица Б), то при удалении записи из таблицы Б вы должны сначала удалить связанную с ней запись в таблице А.
    Т.е. перед удалением какой-то записи вы должны удалить все другие записи, которые на неё ссылаются.

    Как уже написал Rsa97 можно настроить автоматическое удаление этих записей, если в ограничение FOREIGN KEY, которое у вас на столбце type_id добавить опцию ON DELETE CASCADE. Тогда, при удалении записи из таблицы types у вас автоматически удалятся все связанные с ней записи из таблицы group_types.
    Ответ написан
    Комментировать
  • Как обновить строку в базе данных?

    @MadridianFox
    Web-программист, многостаночник
    Когда вы делаете update запрос вам не надо указывать данные, которые не изменяются
    и не надо указывать в where больше условий чем необходимо для идентификации изменяемой строки. Если в строке есть primary key, то достаточно указать только его.
    Ответ написан
    4 комментария
  • Как избежать переполнения типа данных?

    @MadridianFox
    Web-программист, многостаночник
    Точность вычислений вы устанавливаете выбирая тип данных - float или double. Не важно как сильно вы раздробили число, количество занимаемой им памяти не меняется. Т.е. вам нужно "обрезать" его только при выводе, чтобы лишние цифры глаза не мозолили.

    Обрезание производлится по некоторым правилам, которые вы наверняка учили в школе, и называть это надо "округление". Т.е. вам достаточно набрать в гугле "Как округлить число до нужного знака после запятой в Си".

    Переполнением в Си называется случай, когда вы увеличивая значение переменной достигаете предела и следующее увеличение обнуляет переменную или меняет её знак.
    Ответ написан
    Комментировать
  • Как сделать условие на класс body через php?

    @MadridianFox
    Web-программист, многостаночник
    1) технически на php именно то что вы хотите сделать невозможно, но можно на js, на стороне клиента такое провернуть
    2) если надо всё-таки на php, то привязываться надо не к разметке, а к какой-нибудь пременной
    3) если уж очень очень хочется сделать костыль, то можно проверить строку регулярным выражением. Именно строку, а не как вы написали - тэг в условии.
    Ответ написан
    Комментировать
  • Как сконфигурировать nginx для того чтобы он работал как http прокси?

    @MadridianFox
    Web-программист, многостаночник
    Чтобы nginx проксировал запросы другому серверу надо в папку /etc/nginc/conf.d/ добавить файл с расширением .conf в котором написано:
    server{
      listen 5556
      server_name _;
      location / {
        proxy_pass localhost:5555
      }
    }


    Но если можно сконфигугрировать вашу вещь, которая слушает localhost:5555 чтобы она слушала 0.0.0.0:5555 то она и сама станет доступной из локальной сети.
    Ответ написан
    Комментировать
  • Как добавить babel в gulp?

    @MadridianFox
    Web-программист, многостаночник
    Вот тут надо кликнуть на кнопку с надписью Gulp (в третьей строке примерно в середине) и появится код, там всё понятно.
    Ответ написан
    4 комментария
  • Присваивание куки к таблицам бд?

    @MadridianFox
    Web-программист, многостаночник
    Нет. Вы неправильно понимаете куки. Куки - это то, что браузер хранит для определённого сайта определённое время. Сайт может сказать браузеру - запомни для меня что под ключом myVar лежит значение banana, а через час забудь.
    Ответ написан
  • Как проверить отправленные значения формы, с использованием ООП?

    @MadridianFox
    Web-программист, многостаночник
    public function checkValue($arr) {
          if(!empty($_POST[$arr['name']])) {
            $this->value = $_POST[$arr['name']];
          }
          
           parent::checkValue($arr);
        }
    Ответ написан
    3 комментария
  • Почему ssh-сервер всё равно запрашивает пароль?

    @MadridianFox
    Web-программист, многостаночник
    Проверьте чтобы в /etc/ssh/sshd_config был разрешён вход по ключу
    PubkeyAuthentication yes
    Ответ написан
    6 комментариев
  • Как писать собственные функцит на PHP?

    @MadridianFox
    Web-программист, многостаночник
    она будет правильной?

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

    Надо знать стандартную библиотеку и то api которое предоставляет тебе та CMS под которую ты пишешь. Этому очень легко научиться. Берёшь - и пишешь код. Когда сталкиваешься с чем-то чего не знаешь - гуглишь. Например - как отсортировать массив? Гугл знает. Раз загуглишь, два загуглишь, на третий раз вспомнишь, на четвёртый - начнёшь примерять те или иные функции ещё на этапе придумывания идеи. На это уходят месяцы и годы, но никто не говорил что научиться программировать легко.
    Придумай себе идею. Надо хотеть сделать что-то, а не просто хотеть написать код.
    Ответ написан
    Комментировать
  • Правильно ли будет, если поставить GitLab на сервере разработки?

    @MadridianFox
    Web-программист, многостаночник
    Центральный репозиторий (тот в котороый пушат несколько разработчиков) должен быть bare - т.е. без файлов.
    Например GitLab как раз хранит bare репозитории.

    Если /var/www/project это хост только чтобы показывать сайт (не разрабатывать прямо тут), то туда надо клонировать репозиторий из центрального. Когда разрабы пушат в центральный - руками или автоматически делаете pull в /var/www/project.

    Где ставить гитлаб - вопрос наличия и мощности ваших машин. У меня в последнем проекте машин было мало и на dev-машине работали и гитлаб и хосты разработчиков, но в docker-контейнерах, т.е. они никак не были связаны.

    Если же /var/www/project это хост с которым работают все разрабы сразу (прямо редактируют код), то срочно заваривайте чай - придётся переделывать. Лучше каждому разрабу выделить свой хост где он будет редактировать файлы своей копии сайта.
    Ответ написан
    7 комментариев
  • Что можно сделать с файлом logs?

    @MadridianFox
    Web-программист, многостаночник
    Можете удалять содержимое этих файлов. Сайту они не нужны. Но если завтра выяснится что что-то произошло и надо найти причину, и её можно было выяснить посмотрев в лог, то вы пожалеете что просто взяли и удалили.
    Обычно делается т.н. ротация логов - копирование логов в новый файл при достижении некотого лимита. Ну например, если накопилось 10 мегабайт логов, то копируем их в файл logname.log.1, а текущий файл очищаем. Ещё раз накопилось - переименовываем logname.log.1 в logname.log.2 и снова копируем содержимое лога в logname.log.1. При этом часто логи с цифрами архивируются, чтобы занимали меньше места. Ну и чтобы забыть про то что логи могут забить вам диск, какой-нибудь logname.log.10 уже не переписывается в следующий файл, а удаляется.

    Обычно ротация делается автоматически той программой (сайт, web-сервер, СУБД), которая пишет эти самые логи, её надо только настроить. Но программа может и не уметь делать ротацию. Тогда можно написать какой-нибудь bash скрипт, который будет запускаться по крону раз в N часов и делать ротацию указанного файла.

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

    @MadridianFox
    Web-программист, многостаночник
    1) 1к +7к... да хоть 100к + 700к - фигня. Вы гораздо раньше упрётесь в то что вам не хватает места на сами файлы изображений чем на то что БД не справляется с количеством записей.
    2) 43 атрибута это если вы всё в одну таблицу пишете. Даже это не много, хотя и вызывает удивление, но если вынести миниатюры в соседнюю таблицу, то получится 15 атрибутов в одной и 4 в другой - вообще ни о чём.
    Ответ написан
    Комментировать