Запоминаем в куках галочку

Плагин

https://raw.githubusercontent.com/carhartl/jquery-cookie/master/src/jquery.cookie.js

            // read the current/previous setting
            $("#dont_show_message").each(function() {
                var name = $(this).attr('name');
                if ($.cookie(name) && $.cookie(name) == "true") {
                    $(this).prop('checked', $.cookie(name));
                }
            });
            // event management
            $("#dont_show_message").change(function() {
                var name = $(this).attr("name");
                $.cookie(name, $(this).prop('checked'), {
                    path: '/',
                    expires: 365
                });
            });

Отправка почты через postfix


Шаг 1.
Нужно заиметь учётку на работающем почтовике, чтобы мы могли юзать его как relay. Делается не сложно, просто обращаемся к админу того сервера с соответсвующей просьбой. Ну реализацию этого шага я думаю по деталям разъяснять  не стоит.

Шаг 2.
Открываем /etc/postfix/main.cf и ищем там настройку relayhost. Она отвечает за пересылку почты через релай. Указываем адрес, по которому нам доступен почтовик в локалке.

relayhost = [mail.local]
Тут mail.local - это и есть этот адрес.

Шаг 3.
Авторизация на релай-сервере. Отрываем тот же /etc/postfix/main.cf и дописываем такие строки:

defer_transport = smtp
smtp_sasl_auth_enable = yes
smtp_sasl_password_maps = hash:/etc/postfix/saslpass
Это мы активировали функию авторизации через SASL. Учтите, если авторизация какая-то хитро-мудрая, то этот способ может не подойти, на этот счёт лучше поговорить с вашим админом.

Далее в файо /etc/postfix/saslpass, который мы указали раннее прописываем логин а пароль от сервера.

mail.local relayuser@mail.local:password
На всякий случай комментирую: первое - это адрес сервера, второе - логин, третье (после двоеточия) - это пароль. После этого создаём хешированную таблицу (которую postfix и будет читать).

# postmap /etc/postfix/saslpass
Остаётся перегрузить настройки postfix.

# /etc/init.d/postfix reload
Вот собственно и всё. Можно работать. Главное корректно задавать адрес отправителя в заголовках, ибо может не прокатить.


честно стырено с http://adment.org.ua/admin/21-postfix-relay

Amazon S3 около четырех часов работал с перебоями

28 февраля 2017 года, примерно в 21:00 по московскому времени перестали отвечать сервисы  amazon s3 US-EAST-1 региона. Продолжалось все это безобразие 4 часа 17 минут, в это время не работали задачи Trello, платформа Coursera, сервис вопросов Quora, пользователи жаловались на проблемы в работе Open Whisper Systems, Quora, IFTTT, рассылок Sailthru, Business Insider, Giphy, Medium, Slack, Coursera, различных фотохостингов и так далее.

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

https://aws.amazon.com/ru/message/41926/

 

Стоит добавить, что недавно,  31  января 2017 так же из-за человеческой ошибки пострадал GitLab, когда сотрудник их компании, хотел почистить слейв БД, дропнув ее, но перепутал сервера, и дропнул мастер.

https://docs.google.com/document/d/1GCK53YDcBWQveod9kfzW-VCxIABGiryG7_z_6jHdVik/pub

Сертификаты

Еще раз про сертификаты для сервера.

Если что то не выходит делаем следующие проверки.

1. ключ подходит с серитфикату.

Проверяем MD5 ключа и сертификата:

# openssl rsa -noout -modulus -in serov.1.key | openssl md5
(stdin)= 777711dbbab90e1b12e922bbdbde6716
# openssl x509 -noout -modulus -in serov.crt | openssl md5
(stdin)= 910a2dd2db8510094383563ed18c056d

Если строчки разные, то ключ не подходит к сертификату.

Ну и можно посмотреть что внутри

  • Check a Certificate Signing Request (CSR)
    openssl req -text -noout -verify -in CSR.csr
  • Check a private key
    openssl rsa -in privateKey.key -check
  • Check a certificate
    openssl x509 -in certificate.crt -text -noout

 

 

Сортировка данных в php

Например, у нас есть какой то набор данных, в stdClass. Он многомерный, и его надо сортировать, например по дате.
Делаем первое

array_walk_recursive($t, function(&$t) {return $t->date=strtotime($t->Created);});

Здесь мы создаем дополнительный элемент, к каждому набору записи, в которую записываем unix timestamp для сравнения.
Далее, сортируем набор данных по полю date

usort($t, function($a, $b){
return ($b->date - $a->date);
});

Не знаю, насколько это быстрее foreach или for, пока у меня не было несколько миллиардов записей, а до 1000 записей, существенной разницы не увидим.

Для более сложной сортировки, лучше использовать array_multisort, но это уже только для массива, хотя stdClass позволяет работать как с массивом.

Архивирование логов

Бывает так, что на машине остается ну например 5gb места, и все свободное место забито логами.

Чтобы легко выйти из этой ситуации, достаточно выполнить команду архивирования с удалением файлов.

// переименовываем папку logs с текущей датой 
tar --remove-files -cvzf logs_03_11_2015.tar.gz logs_03_11_2015

 

После добавление файла в архив, он будет тут же удален.

 

Если совсем все плохо, и надо перетащить файлы на винте, где совсем нет место, можно сделать это по сети.

tar cvf - / | ssh -p2222 ted@8.8.8.8 "cat > archive.tar"

тут мы все что в корне отправляем на сервер 8.8.8.8 по 2222 порту под пользователем  ted

 

 

Тернарная условная операция

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

Синтаксис следующий

 

Синтаксис:

expression ? true_value : false_value
Выполнение этой инструкции начинается с операнда expression. Если значение выражения expression истинно (true), то возвращается значение выражения true_value, иначе возвращается false_value.
Вроде все ясно.
Например, если в $id нам передается номер статьи, то используем его, если нет, то перевод на первую новость.
Как это будет выглядеть
$id = '1212';
$id = empty($id) ? $id : 1;

Однако все не так просто. Что если передадут в id буквы?

$id = 'asdas';
$id = empty($id) ? $id : 1;
//  выведет asdas

Заюзаем проверку на число

$id = is_numeric($id) ? $id : 1;

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

$id = is_numeric($id)  && $id>0  ? (int)$id : 1;

 

Но мы можем развернуть эту схему в классический if else, т.е. сделать записать в одном из операндов выражение.

 

<?php

$id = 'sfg';
is_numeric($id) && $id>0  ? $id=(int)$id : $id=1;
echo $id;

Идентично

if (is_numeric($id) && $id>0){
    $id=(int)$id;
}else{
    $id=1;
}

 

 

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

<?php

$id = '21';
$id = (is_numeric($id) && $id>0) && $id!=1  ? (int)$id : 1;

echo $id;