AlarmManager и SetInterval на Android

Начиная с API 19, SetInterval в приложениях срабатывает не так как раньше — в строго заданное время, а в тот момент, когда считает необходимым ядро системы. Иногда разрыв между «задуманным» и фактом выполнения аларма достигает нескольких минут.

Вариант обхода: разовый аларм срабатывает корректно. Следовательно после его срабатывания, необходимо создать его снова.

private void restartNotify() {
 am = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
 Intent intent = new Intent(this, TimeNotification.class);
 PendingIntent pendingIntent = PendingIntent.getBroadcast(this, 0,
 intent, PendingIntent.FLAG_CANCEL_CURRENT );
 // На случай, если мы ранее запускали активити, а потом поменяли время,
 // откажемся от уведомления
 am.cancel(pendingIntent);
 // Устанавливаем разовое напоминание
 am.set(AlarmManager.RTC_WAKEUP, stamp.getTime(), pendingIntent);
 }<code></code>

Нет логов под отладкой на телефоне из Android Studio

Актуально для телефонов Huawei На некоторых устройствах  логи по-умолчанию отключены.

Чтобы их включить, нужно набрать:

*#*#2846579#*#*

Далее Background SettingLog setting, и там включить все логи.

Экранирование специальных символов в curl

Неожиданно подобного вида конструкция вызвала ошибку:

root@ares:~ # /usr/local/bin/curl -k -v --url 'https://dwedwed.do?userName=23уй3уй&password=wdedwe{dwe&orderNumber=00107103933&amount=5100&failUrl=http://edes.tv/client/fail.php&clientId=00107&returnUrl=http://bilewdis.tv/client/payok.php'
curl: (3) [globbing] unmatched brace in column 97
root@ares:~ #

Порыскал в интернетах, ничего толкового не нашел по этой ошибке.  А дело в простом — curl не экранирует специальные символы типа {. Чтобы всё работало, нужно добавить перед этим символом \

/usr/local/bin/curl -k -v --url 'https://swedwdded.do?userName=23уй3уй&password=wdedwe\{dwe&orderNumber=00107103933&amount=5100&failUrl=http://edes.tv/client/fail.php&clientId=00107&returnUrl=http://bilewdis.tv/client/payok.php'

Ubuntu синхронизация времени на сервере

Сначала установим ntp и ntppdate

sudo apt-get install ntp ntpdate

Синхронизируем время:

root@xn--90acbu5aj5f:/var/www# ntpdate -s ntp.ubuntu.com
root@xn--90acbu5aj5f:/var/www# date
Mon Feb 12 14:35:13 UTC 2018

Чтобы выставить часовой пояс, сервера можно выполнить:

root@xn--90acbu5aj5f:/var/www# sudo dpkg-reconfigure tzdata

Current default time zone: 'Europe/Moscow'
Local time is now:      Mon Feb 12 17:35:57 MSK 2018.
Universal Time is now:  Mon Feb 12 14:35:57 UTC 2018.

root@xn--90acbu5aj5f:/var/www# date
Mon Feb 12 17:36:00 MSK 2018
root@xn--90acbu5aj5f:/var/www#

 

Jquery и маска ввода телефона

К сожалению наиболее часто упоминаемый в «интернетах» плагин maskedinput не очень хорошо работает на мобильных устройствах. Адекватной заменой может служить плагин inputmask: https://github.com/RobinHerbots/Inputmask

Один огромный минус — уж очень «жирноват» плагин для простых задачь. Иногда лучше использовать «чистый» javascript:

<!DOCTYPE HTML>

<html>

<head>
  <title>Untitled</title>
  <meta charset="utf-8">
</head>

<body>
    <input  value="+7(___)___-____">
    <script>
window.addEventListener("DOMContentLoaded", function() {
function setCursorPosition(pos, elem) {
    elem.focus();
    if (elem.setSelectionRange) elem.setSelectionRange(pos, pos);
    else if (elem.createTextRange) {
        var range = elem.createTextRange();
        range.collapse(true);
        range.moveEnd("character", pos);
        range.moveStart("character", pos);
        range.select()
    }
}

function mask(event) {
    var matrix = this.defaultValue,
        i = 0,
        def = matrix.replace(/\D/g, ""),
        val = this.value.replace(/\D/g, "");
        def.length >= val.length && (val = def);
    matrix = matrix.replace(/[_\d]/g, function(a) {
        return val.charAt(i++) || "_"
    });
    this.value = matrix;
    i = matrix.lastIndexOf(val.substr(-1));
    i < matrix.length && matrix != this.defaultValue ? i++ : i = matrix.indexOf("_");
    setCursorPosition(i, this)
}

    var input = document.querySelector("input");
    input.addEventListener("input", mask, false)
});
  </script>
</body>

</html>

Жизнь замечательных грибов