• Как исправить долгое выключение (перезагрузку) в ubuntu 18?

    @romanwb Автор вопроса
    Модераторы скрыли решение (проблему), которую я нашел в комментарий.
    Проблема была в сервисе под пользователем app (laravel horizon) - долго завершался.
    А спасибо, за то что подсказали, как включать детальные логи - не пригодилось, но на будущее буду иметь введу:)
  • Как исправить долгое выключение (перезагрузку) в ubuntu 18?

    @romanwb Автор вопроса
    Интервал, если присмотритесь, 3 минуты между окончанием выключения и загрузкой.
    Модераторы скрыли решение (проблему), которую я нашел в комментарий.
    По логам видно, что долго завершаются процессы root и app.
    Я выключил сервисы пользователя app (supervizor / laravel horizon) и сервер перезагрузился моментально.
    Собственно в этом сервисе laravel horizon и была проблема.
  • Как исправить долгое выключение (перезагрузку) в ubuntu 18?

    @romanwb Автор вопроса
    В офф руководстве используется супервизор, поэтому сделал так.
  • Как исправить долгое выключение (перезагрузку) в ubuntu 18?

    @romanwb Автор вопроса
    Вопрос решен, сервис в supervisor (laravel horizon) долго завершается.
  • Как исправить долгое выключение (перезагрузку) в ubuntu 18?

    @romanwb Автор вопроса
    Например:


    Aug 16 18:14:15 marafon systemd[1]: Closed Load/Save RF Kill Switch Status /dev/rfkill Watch.
    Aug 16 18:14:15 marafon systemd[1]: Stopping User Manager for UID 0...
    Aug 16 18:14:15 marafon systemd[1]: Stopped target Graphical Interface.
    Aug 16 18:14:15 marafon systemd[1]: Stopping Authorization Manager...
    Aug 16 18:14:32 marafon kernel: [ 0.000000] Linux version 4.15.0-112-generic (buildd@lcy01-amd64-027) (gcc version 7.5.0 (Ubuntu 7.5.0-3ubuntu1~18.04)) #113-Ubuntu SMP Thu Jul 9 23:41:39 UTC 2020 (Ubuntu 4.15.0-112.113-generic 4.15.18)
  • Как исправить долгое выключение (перезагрузку) в ubuntu 18?

    @romanwb Автор вопроса
    У меня порядка 5 серверов и такое только на этом. Реактивное не надо, но 3 минуты не нормально.
  • Как отобразить snapshot в NavigationController с кастомной AnimateTransition?

    @romanwb Автор вопроса
    doublench21, Стало более понятно, следовательно, для fromVC.view мы можем сделать snapshotView(afterScreenUpdates: false) и скрыть его нормально, а для toVC.view не получится т.к. вьюша не на экране. Вызов перерисовки через setNeedsLayout setNeedsDisplay layoutIfNeeded layoutSubviews не дал результата.

    Возникает вопрос для анимации, где между переходами должен быть виден пустой фон (допустим черный), fromVC.view уезжает по диагонали вниз, а toView приезжает по диагонали сверху, как правильно реализовать?

    У меня две идеи:
    1 Добавить в containerView сначала toVC.view, потом временную вьюшку с непрозрачным фоном, далее снимки и т.д., в конце удалить снимки и временную вьюшку (анимация отрабатывает, как нужно).
    guard let fromVC = transitionContext.viewController(forKey: .from),
        let fromSnapshot = fromVC.view.snapshotView(afterScreenUpdates: false),
        let toVC = transitionContext.viewController(forKey: .to),
        let toSnapshot = toVC.view.snapshotView(afterScreenUpdates: true)
        else {
            return
    }
    
    let containerView = transitionContext.containerView
    
    containerView.addSubview(toVC.view)
    let blackView = UIView(frame: containerView.frame)
    blackView.backgroundColor = .black
    containerView.addSubview(blackView)
    
    containerView.addSubview(fromSnapshot)
    containerView.addSubview(toSnapshot)
    
    toSnapshot.frame.origin.x = containerView.frame.width
    toSnapshot.frame.origin.y = -containerView.frame.height
    
    UIView.animate(withDuration: duration, delay: 0, options: [.curveEaseInOut], animations: {
        fromSnapshot.frame.origin.x = -containerView.frame.width
        fromSnapshot.frame.origin.y = containerView.frame.height
        toSnapshot.frame.origin = .zero
    }) { _ in
        blackView.removeFromSuperview()
        fromSnapshot.removeFromSuperview()
        toSnapshot.removeFromSuperview()
        transitionContext.completeTransition(!transitionContext.transitionWasCancelled)
    }


    2 В блоке после анимации, добавить в containerView сначала toVC.view, а потом удалять снимки), но тут получается беда, вероятно, с аутолейаутом снимка, кнопка возврата прыгает вниз, я думаю из за навигейшин бара (кнопка привязана сверху к safe area и на момент снимка о нем ничего не знает). Можно что-то с этим сделать?
    func animateTransition(using transitionContext: UIViewControllerContextTransitioning) {
            guard let fromVC = transitionContext.viewController(forKey: .from),
                let fromSnapshot = fromVC.view.snapshotView(afterScreenUpdates: false),
                let toVC = transitionContext.viewController(forKey: .to),
                let toSnapshot = toVC.view.snapshotView(afterScreenUpdates: true)
                else {
                    return
            }
            
            let containerView = transitionContext.containerView
            
            containerView.addSubview(fromSnapshot)
            containerView.addSubview(toSnapshot)
            
            toSnapshot.frame.origin.x = containerView.frame.width
            toSnapshot.frame.origin.y = -containerView.frame.height
            
            fromVC.view.isHidden = true
            
            UIView.animate(withDuration: duration, delay: 0, options: [.curveEaseInOut], animations: {
                fromSnapshot.frame.origin.x = -containerView.frame.width
                fromSnapshot.frame.origin.y = containerView.frame.height
                toSnapshot.frame.origin = .zero
            }) { _ in
                containerView.addSubview(toVC.view)
                
                fromSnapshot.removeFromSuperview()
                toSnapshot.removeFromSuperview()
                transitionContext.completeTransition(!transitionContext.transitionWasCancelled)
            }
        }
  • Как отобразить snapshot в NavigationController с кастомной AnimateTransition?

    @romanwb Автор вопроса
    doublench21, убрал)

    Последняя просьба, посмотрите пожалуйста этот переход, во время анимации (push) черный экран (после конечно показывается нужная вьюшка):

    func animateTransition(using transitionContext: UIViewControllerContextTransitioning) {
            guard let fromVC = transitionContext.viewController(forKey: .from),
                let fromSnapshot = fromVC.view.snapshotView(afterScreenUpdates: true),
                let toVC = transitionContext.viewController(forKey: .to),
                let toSnapshot = toVC.view.snapshotView(afterScreenUpdates: true)
                else {
                    return
            }
            
            let containerView = transitionContext.containerView
            
            toSnapshot.frame.origin.x = containerView.frame.width
            
            containerView.addSubview(fromSnapshot)
            containerView.addSubview(toVC.view)
            containerView.addSubview(toSnapshot)
            
            fromVC.view.isHidden = true
            toVC.view.isHidden = true
            
            UIView.animate(withDuration: duration, delay: 0, options: [.curveEaseInOut], animations: {
                fromSnapshot.frame.origin.x = -(containerView.frame.width / 2.0)
                toSnapshot.frame.origin.x = 0
            }) { _ in
                toVC.view.isHidden = false
                fromSnapshot.removeFromSuperview()
                toSnapshot.removeFromSuperview()
                transitionContext.completeTransition(!transitionContext.transitionWasCancelled)
            }
        }
  • Как отобразить snapshot в NavigationController с кастомной AnimateTransition?

    @romanwb Автор вопроса
    doublench21, согласен, удалять не нужно

    посмотрите, как будет возможность https://github.com/romanwb/testcustomtransition

    у меня получается вот это
    5c70030b78b3e670549886.png
  • Как отобразить snapshot в NavigationController с кастомной AnimateTransition?

    @romanwb Автор вопроса
    @doublench21

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

    Анимации бывают разные и видеть уже отрендереную toView бывает не нужно (например делаем модальное окно с частичным перекрытие и анимацией одновременно toView (toSnapshot) и fromView (fromSnapshot).

    Сделать все это можно и без снимков, анимировать сами вьюшки, но эффективность будет падать при загруженных элементах.

    Вопрос именно почему не работает мой код, который в вопросе, это был вопрос не реализации, а понять почему. И вот буквально сейчас я нашел вероятное решение:

    1 https://stackoverflow.com/questions/54812883/navig...
    2 https://forums.developer.apple.com/thread/63438

    Это баг, когда снапшот получается с черным экраном.

    Решается созданием снимка как изображение:

    extension UIView {
        // Replacement of `snapshotView` on iOS 10.
        // Fixes the issue of `snapshotView` returning a blank white screen.
        func snapshotImageView() -> UIImageView? {
            UIGraphicsBeginImageContextWithOptions(bounds.size, true, 1)
            guard let context = UIGraphicsGetCurrentContext() else {
                return nil
            }
            layer.render(in: context)
            let viewImage = UIGraphicsGetImageFromCurrentImageContext()
            UIGraphicsEndImageContext()
            return UIImageView(image: viewImage, highlightedImage: viewImage)
        }
    }


    Вводило в заблуждение, что в обычном контроллере работает, а в навигейшене нет.

    В любом случае, благодарю за ответы.
  • Как отобразить snapshot в NavigationController с кастомной AnimateTransition?

    @romanwb Автор вопроса
    1 Контроллер нигде не удаляется, удаляется ВЬЮШКА старого контроллера (не важно удалил я ее или просто скрыл, эффект тот же). Логика перехода назад тут не рассматривается, я знаю как ее делать.

    2 Разумеется представляю через расширение UINavigationControllerDelegate и в основном контроллере делаю navigationController?.delegate = self. Тут все работает однозначно, я поэтому не привожу код.

    3 Ваш код работает с обычными контроллерами, мой тоже. Проблема только при использовании его в NavigationController.
  • Как использовать Telegram Bot API и MTProxy?

    @romanwb Автор вопроса
    К другим серверам и не надо, надо через MTProxy (установленный на моем сервере) к Telegram.

    У меня есть сервера на русских хостингах, а этот сервер (не в россии разумеется) используется, как прокси к Telegram, сейчас там SOCK5.

    Писать свою обертку слушающую http и проксировать свободно в Bot API желания конечно же нет.
  • Как сделать ссылку на элемент, который имеет определенный id?

    @romanwb
    Если определенную статью надо получить, то цифру .
    Но обычно мы хотим видеть пост указанный в URL, поэтому берем ID способом params[:id] (: двоеточие важно)
  • Кто проходил удачные дистанционные курсы по Ruby on rails?

    @romanwb
    Отличный курс, когда проходил, уже достаточно знал, но некоторые моменты были очень важны. В частности подход к тестированию.
  • Как в ROR можно отрендерить slim из базы данных?

    @romanwb
    liquid не пробовали, от него безопасность не страдает?
  • Gem для метрики посещаемости ruby on rails?

    @romanwb
    Лучше использовать singleton или классовый метод, глобальная переменная это не гуд.
  • Связать модели через имя одной из модели, а не через id?

    @romanwb
    Просто для того что б добавить Song в Album нужно указЫвать его id - не очень то удобно когда пользователю видно только имя и картинка альбома.
    --
    Сделайте выпадающий список по названиям или автокомплит - это вполне логично.
    В вашем случае, если поменяется название альбома, нужно заного будет выставлять к каждой песне альбом.