• Присвоить id в обратном порядке?

    orlov0562
    @orlov0562
    Привет,
    1) Не у всех есть MySQL 8
    2) Не выдаст корректный результат на наборе данных где id идут не по порядку, например
    INSERT INTO tmp 
      (id, color)
    VALUES 
      (1, 'зеленый'),
      (2, 'красный'),
      (10, 'синий'),
      (20, 'белый')
    ;

    или еще интересней
    INSERT INTO tmp 
      (id, color)
    VALUES 
      (1, 'зеленый'),
      (21, 'красный'),
      (3, 'синий'),
      (4, 'белый')
    ;
  • Дополнить код удаления файлов таймером отсчета?

    orlov0562
    @orlov0562 Куратор тега PHP
    it_pear_yurec,
    - сохраняешь в базу список файлов + метку времени, когда надо удалить
    - затем создаешь скрипт который выбирает из этой базы файлы которые пора удалять
    - этот скрипт запускаешь по расписанию, например каждый час или день - запуск делается с помощью планировщика задач, например Cron. Обычно в панели управления хостингом, есть интерфейс для его конфигурации.

    P.S. так же если, это просто кеш, который надо чистить через неделю, можешь использовать встроенные в ОС команды, для фильтрации файлов по времени создания/модификации. Вот пример для линукса
    /usr/bin/find /path/to/cache/* -mtime +7 -delete
  • Безопасное сохранение нового поста, laravel?

    orlov0562
    @orlov0562
    Алексей Уколов,

    Всё, я понял о чем спрашивает автор - я не внимательно читаю вопросы :)

    Я трактовал вопрос так: что будет если злоумышленник создаст у себя страницу на которой будет форма с автосабмитом отправляющая пост запрос с данными на endpoint как только на нее зайдет пользователь. Затем злоумышленник пригласит на эту страницу авторизованного админа. В таком случае запрос на endpoint будет выполнен с фиктивными данными и пройдет авторизацию (т.к. админ уже авторизован), а вот csrf токен соответствовать не будет, т.к. его не будет у злоумышленника. И в итоге сервер отклонит такой запрос.

    Про то, что речь идет о банальной авторизации и проверке ролей я даже не подумал и подразумевал что она и так есть.

    Ваш ответ заслуженно выбран решением :)
  • Безопасное сохранение нового поста, laravel?

    orlov0562
    @orlov0562
    Я имею ввиду не будет иметь CSRF токена админа, который обычно делают зависимым от сессии авторизованного пользователя. Т.е. у админа будет свой токен, а у пользователя свой. Даже если пользователь подставит токен админа, то он не пройдет валидацию на стороне сервера, т.к. в сессии будет лежать совсем другое значение.
  • Присвоить id в обратном порядке?

    orlov0562
    @orlov0562
    Максим Тимофеев, потому что "не трогайте", подразумевает изменения, а в исходном вопросе изменяется порядок значений только в колонке "id" :)

    На самом деле, я не придираюсь к словам, просто не пойму почему все решили, что ТС пытается измываться над PK, ведь вопрос совсем о другом?
  • Присвоить id в обратном порядке?

    orlov0562
    @orlov0562
    FanatPHP,

    Никаким.

    Способы сделать то, о чем спрашивает ТС есть, об этом я написал в ответе.

    .. что уникальный идентификатор..

    В вопросе нет информации, что это PK или поле с UNIQUE индексом. Надо линейку еще приметить к тем кто к существующим задачам условия додумывает :)

    если надо поменять порядок вывода, то и циферки надо перевесить

    Какой в этом смысл, ведь тут меняются id, а значения остаются те же? В твоем примере, надо вмести с циферками и названия цветов перевешивать, что достигается банальной сортировкой.
  • Не получаеться правильно спарсить с PHP Simple Dom Parser?

    orlov0562
    @orlov0562 Куратор тега PHP
    fomenko_alexandr, привет, уже точно не помню, но всего скорее там трудно выделить нужные для парсинга участки (т.е., это не относится к самой информации, а к коду страницы который там был)
  • Как открывать адрес в новой вкладке из строки адреса по нажатию Enter в Firefox 57?

    orlov0562
    @orlov0562 Автор вопроса
    Привет, спасибо за ответ! Тоже уже на этой версии и нашел эту настройку.

    P.S. Для тех кто придет из поиска, есть еще полезные настройки там же:
    browser.search.openintab - открывает новые вкладки из поля поиска
    browser.tabs.loadBookmarksInTabs - открывает новые вкладки для закладок
  • Какую использовать библиотеку для получения картинок из смайликов и emoji?

    orlov0562
    @orlov0562 Автор вопроса, куратор тега PHP
    Так и поступил :)

    P.S. Для тех кто нагуглит вопрос, можете почерпнуть идеи тут:
    https://github.com/orlov0562/ta-emoji
  • Как настроить grub для загрузки UEFI Windows 8?

    orlov0562
    @orlov0562 Автор вопроса
    Спасибо! Получилось, но не так просто как описано. Ниже опишу, для тех кто столкнется и нагуглит этот решение:

    При запуске, выдало ошибку
    The current session is in Legacy mode. Please reboot the computer, and use this software in an EFI session. This will enable this feature. For example, use a live-USB of Boot-Repair-Disk-64bit (www.sourceforge.net/p/boot-repair-cd), after making sure your BIOS is set up to boot USB in EFI mode.


    Действительно ubuntu была установлена как Legacy+GPT. Скачал указанный образ, записал на флешку через Unetbootin. В Gparted флешке поставил флаги: boot + esp. Загрузился с флешки, появился диалог, с указанием открыть терминал и выполнить пару команд. Сделал. Перезагрузился. В grub-е появились новые пункты по загрузке ubuntu и windows. Выглядят они так
    menuentry 'Ubuntu' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-simple-a249b125-35b9-4a5f-b722-b9a18f318441' {
            recordfail
            load_video
            gfxmode $linux_gfx_mode
            insmod gzio
            if [ x$grub_platform = xxen ]; then insmod xzio; insmod lzopio; fi
            insmod part_gpt
            insmod ext2
            set root='hd0,gpt2'
            if [ x$feature_platform_search_hint = xy ]; then
              search --no-floppy --fs-uuid --set=root --hint-bios=hd0,gpt2 --hint-efi=hd0,gpt2 --hint-baremetal=ahci0,gpt2  a249b125-35b9-4a5f-b722-b9a18f318441
            else
              search --no-floppy --fs-uuid --set=root a249b125-35b9-4a5f-b722-b9a18f318441
            fi
            linux   /boot/vmlinuz-4.4.0-116-generic.efi.signed root=UUID=a249b125-35b9-4a5f-b722-b9a18f318441 ro  quiet splash $vt_handoff
            initrd  /boot/initrd.img-4.4.0-116-generic
    }
    
    menuentry "Windows UEFI bootmgfw.efi" {
    search --fs-uuid --no-floppy --set=root B420-3CF8
    chainloader (${root})/EFI/Microsoft/Boot/bootmgfw.efi
    }
    
    menuentry "Windows Boot UEFI loader" {
    search --fs-uuid --no-floppy --set=root B420-3CF8
    chainloader (${root})/EFI/Boot/bkpbootx64.efi
    }
    
    menuentry "EFI/ubuntu/mmx64.efi" {
    search --fs-uuid --no-floppy --set=root B420-3CF8
    chainloader (${root})/EFI/ubuntu/mmx64.efi
    }
    
    menuentry 'Windows Boot Manager (on /dev/sdb2)' --class windows --class os $menuentry_id_option 'osprober-efi-B420-3CF8' {
            insmod part_gpt
            insmod fat
            set root='hd1,gpt2'
            if [ x$feature_platform_search_hint = xy ]; then
              search --no-floppy --fs-uuid --set=root --hint-bios=hd1,gpt2 --hint-efi=hd1,gpt2 --hint-baremetal=ahci1,gpt2  B420-3CF8
            else
              search --no-floppy --fs-uuid --set=root B420-3CF8
            fi
            chainloader /EFI/Microsoft/Boot/bootmgfw.efi
    }
    set timeout_style=menu
    if [ "${timeout}" = 0 ]; then
      set timeout=10
    fi

    Тут "B420-3CF8" и "hd1,gpt2" это UUID efi раздела созданного Windows, на втором диске (/dev/sdb)

    Загрузка ubuntu работает, загрузка windows работает.

    Но, почему-то произошли пару косяков в ubuntu:
    1) Удалилась запись монтирования райда в fstab. Поэтому, перед процедурой сделайте бэкап:
    sudo cp /etc/fstab /etc/fstab.bak
    2) Почему-то переименовался сетевой интерфейс, был enp14s0 стал enp16s0. Если интефейс сконфигурирован как static, то нужно поправить имя в /etc/network/interfaces
    3) Ссылка /etc/resolv.conf -> /run/resolvconf/resolv.conf была заменена на файл resolv.conf, пришлось вернуть ее обратно. На всякий случай советую также сделать бэкап resolv.conf ссылки/файла
    sudo cp /etc/resolv.conf /etc/resolv.conf.bak
    4) Из grub-а исчез пункт про memtest
    5) Был перезаписан файл /etc/default/grub, поэтому так же советую сделать его бэкап, если делали какие-то настройки там
    sudo cp /etc/default/grub /etc/default/grub.bak

    Так же советую если есть такая возможность, сразу стваить ubuntu в режиме UEFI, почитать про это можно на оф.сайте: https://help.ubuntu.com/community/UEFI
  • Как настроить grub для загрузки UEFI Windows 8?

    orlov0562
    @orlov0562 Автор вопроса
    1) дополнил вопрос, Ubuntu 16.04.4 LTS (Xenial Xerus)
    2) пробовал, не повезло
  • Как правильно перенаправлять пользователя на нужную версию сайта?

    orlov0562
    @orlov0562
    Александр, если у тебя для каждого поддомена свой язык, тебе hreflang не нужен вообще, ты язык и регион устанавливаешь глобально для домена в веб-мастере. С поддержкой не будет никаких проблем, если проект продуман изначально. Вопрос в другом, сколько придется пилить движок, чтобы была хорошая поддержка нескольких языков и возможности модификации для разных версий (например для снг добавить ВК виджет, а для US/EU Facebook). Возьмём, например, Wordpress - 10 поддоменов на 10 языках подготовить 30 минут, и можно раздавать региональным копирайтерам для работы. Разнести на 10 разных серверов = 30 минут или меньше. На, тоже самое, но на 1 сайте с структурой url = site.com/<lang>/* у тебя уйдет минимум неделя, если ты знаешь что и как пилить и где будут проблемы. Я за путь "чем проще и быстрее, тем лучше".
  • Как правильно перенаправлять пользователя на нужную версию сайта?

    orlov0562
    @orlov0562
    Все зависит от задачи и ресурсов на разработку. В большинстве случаев мультиязычность подразумевает что контент будет разный и очень часто не зависим друг от друга. В таком случае нет повода привязываться к одной установке движка и одной базе - на каждый поддомен свою копию движка и базы, в чем проблема-то? Зачем одна админка на все языки, если контент не зависимый? Ну, а если уж надо там связи какие-то организовать (например связь статей), так это ручками допилить 5 минут делов и явно проще, чем делать мультидоменность и многоязычность. Да, еще надо будет следить за обновлениями движков, но опять же полно инструментария чтобы это автоматизировать. Зато плюсов полно: локализация, легко seo, легко разделить копирайтеров, легко делить пользователей, легко следить за региональной статистикой, разнести сайты по серверам в регионах назначения, добавить регионозависимый функционал (где-то основной праздник новый год, а где-то рождество), ну и т.д. Разумеется выбор как организовать проекты и по каким граблям прыгать - личное дело каждого.
  • Какой смысл в boxing/unboxing?

    orlov0562
    @orlov0562
    "int - это просто ведро" - насмешило :)

    Вот оригинал: stackoverflow

    Why

    To have a unified type system and allow value types to have a completely different representation of their underlying data from the way that reference types represent their underlying data (e.g., an int is just a bucket of thirty-two bits which is completely different than a reference type).

    Think of it like this. You have a variable "o" of type object. And now you have an int and you want to put it into "o". "o" is a reference to something somewhere, and the int is emphatically not a reference to something somewhere (after all, it's just a number). So, what you do is this: you make a new object that can store the int and then you assign a reference to that object to "o". We call this process "boxing."

    So, if you don't care about having a unified type system (i.e., reference types and value types have very different representations and you don't want a common way to "represent" the two) then you don't need boxing. If you don't care about having int represent their underlying value (i.e., instead have int be reference types too and just store a reference to their underlying value) then you don't need boxing.

    Where should I use it.

    For example, the old collection type ArrayList only eats objects. That is, it only stores references to somethings that live somewhere. Without boxing you cannot put an int into such a collection. But with boxing, you can.

    Now, in the days of generics you don't really need this and can generally go merrily along without thinking about the issue.
  • Обнаружил 60к внешних ссылок на несуществующий URL моего домена, как правильно поступить?

    orlov0562
    @orlov0562
    Можно:
    1) поставить счетчик (например liveinternet) на страницу 404. Это не очень поможет если это "левые" боты, зато просто и можно сразу увидеть кол-во, реферрер и страну пользователя.
    2) вести свою статистику по запросам приводящим к 404 на стороне бэкэнда (например в php)
    3) проанализировать access.log веб сервер. В нем обычно достаточно простой формат записей, по типу: дата, url страницы, ip. Его обычно можно найти в панели управления хостингом. Потом скачать к себе, открыть в блокноте и по части url удалить существующие ссылки, все что останется и будет "левым" трафиком. Тут будут прямо все и боты и посетители.
  • Как составить план обучения Python/Django?

    orlov0562
    @orlov0562
    Вкратце petstore - это веб приложение, с функционалом интернет магазина. Смысл в том, что при создании интернет магазина, ты ознакомишься с 95% тех техник работы с языком с которыми сталкиваются в любых остальных веб проектах.

    The Java Pet Store 2.0 Reference Application is a sample application brought to you by the Java BluePrints program at Sun Microsystems. This application is designed to illustrate how the Java Enterprise Edition 5 Platform can be used to develop an AJAX-enabled Web 2.0 application. The application comes with full source-code available under a BSD-style license, so you can experiment with it and use it in your own applications.

    The Java Pet Store 2.0 is the reference application for building Ajax web applications on Java Enterprise Edition 5 platform. It illustrates BluePrints for using Ajax with Java, building AJAX-enabled JSF component libraries, using Java Persistence APIs, applying MVC and other design patterns in an Ajax web app, using Mashups such as Google Maps service for location specific searches of pets and PayPal service for purchases, using an RSS feed as a data source, and lots more.

    With real, working code illustrating the BluePrints guidelines, the Java Pet Store 2.0 reduces the learning curve of the Java EE 5 platform, enabling you to deliver complete end-to-end solutions with faster time-to-market.


    Т.е. я тебе советовал, сделать блог, а затем каталог товаров (интернет магазин) с простыми бызовыми функциями: поиском, корзина, форма заказа и админкой. Если ты это сможешь делать, значит у тебя будет достаточный уровень идти на собеседование на позицию джуниора.
  • Как построить дерево?

    orlov0562
    @orlov0562 Куратор тега PHP
  • Как построить дерево?

    orlov0562
    @orlov0562 Куратор тега PHP
    gachkydxvbgd, проблема в том, что не понятно что такое childs в твоем коде

    ['childs'][$node->ID]

    у тебя есть элемент $tree[$node->menu_item_parent]
    WP_Post Object (
                [ID] => 35
                [menu_item_parent] => 0
        )


    ты вызываешь у него ['childs'], как я понимаю список потомков

    но т.к. это объект, то такая конструкция не прокатит, отсюда и ошибки

    Может там быть что-то типа того
    <?php
    
    $items = [
        (object) ['ID'=>35, 'menu_item_parent'=>0],
            (object) ['ID'=>38, 'menu_item_parent'=>35],
            (object) ['ID'=>36, 'menu_item_parent'=>35],
        (object) ['ID'=>37, 'menu_item_parent'=>0],
    ];
    
    function getTree($items){
        $tree = [];
        foreach ($items as $id=>$node) {
            if ($node->menu_item_parent == 0)
                $tree[$node->ID] = ['node'=>$node, 'childs'=>[]];
            else
             $tree[$node->menu_item_parent]['childs'][$node->ID] = ['node'=>$node, 'childs'=>[]];
        }
        return $tree;
    }
    
    $tree = getTree($items);
    
    echo '<pre>';
    print_r($tree);
    echo '</pre>';
    echo '<hr>';
    
    function printer($treeItem, $level) {
        if ($level) echo str_repeat('--', $level);
        echo $treeItem['node']->ID.'<br>';
        foreach($treeItem['childs'] as $subItem) {
            printer($subItem, $level+1);
        }
    }
    
    foreach($tree as $treeItem) printer($treeItem, 0);


    Но это будет работать только до второго уровня вложенности, т.к. должна быть рекурсия которой в твое варианте нет