Портрет 4X_Pro
Был в Сети 26 апр. 2024 г., 14:48
Мультиблог
4X_Pro
Кратко о себе: Web-разработчик. Пишу на PHP, Python, JavaScript. Знаю Ruby и Go, со студенческих времён более-менее помню C и asm. Сейчас специализируюсь на ускорении загрузки сайтов и разработке ботов для Telegram. Linuxоид (использую Debian+LXDE). Сторонник IndieWeb.

Социальные сети


Новости сайта в Telegram

t.me/4x_pro

Компьютерное

Асинхронная загрузка при наличии inline JavaScript

4X_Pro

Часто при ускорении загрузки сайта не получается сделать асинхронной загрузку тяжелых библиотек вроде jQuery из-за того, что зависимый от них код вставлен прямо в HTML-страницу с помощью тега script (так называемый inline JavaScript), а вынести его в отдельный файл и использовать HeadJS по каким-либо причинам нет возможности. Чаще всего такое встречается, когда JavaScript генерируется CMS. Но недавно я узнал, как можно сделать загрузку асинхронной и в этом случае: через пользовательские события (custom events). Делается это так: существующий inline-код оборачиваем функцией-обработчиком события с выбранным нами именем, например jQeuryLoaded:

Читать далее…

JSON или XML

4X_Pro

В Интернете часто идут споры на тему того, какой формат лучше использовать для обмена данными: JSON или XML. Причем зачастую споры сводятся к тому, какой из них более удобен для чтения человеком (что есть дело привычки и того, с чем разработчик познакомился раньше — с JSON или с XML) и то, какой из них лучше поддерживается различными языками. Но последнее сегодня уже не столь актуально: поддержка и того, и другого сейчас уже есть во всех основных языках программирования.

Поэтому выбор, на мой взгляд, следует делать, исходя из других параметров: объема передаваемых данных и количества ресурсов (процессорного времени и памяти), требуемых для парсинга этих данных. Но если по объему практически всегда выигрывает JSON, то данных по парсингу в Интернете есть не так уж много. Поэтому я решил провести небольшой собственный эксперимент: провести парсинг данных в том, и в другом формате, используя стандартные фунции языка PHP, и измерить время и максимальный объем занятой оперативной памяти.
Читать далее…

Почтовая рассылка с собственного сервера

4X_Pro

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


  1. Первое, что следует сделать — это настроить запись обратного DNS (она же reverse DNS, она же запись PTR-типа). Сделать это обычно можно через интерфейс хостинга. Если там подобной опции нет, то придется обратиться в техподдержку. Проверить корректность работы обратного DNS можно на MxToolbox.
  2. Если ваш хостер поддерживает IPv6, обязательно создайте в DNS запись типа AAAA с вашим IPv6-адресом. Без него могут не проходить письма на GMail.
  3. Убедитесь, что в заголовках письма есть строка Precedence: bulk.
  4. Обязательно указывайте в полях From и To имена получателя и отправителя. Убедитесь, что они и поле Subject корректно кодируются в Base64, если содержат кириллицу или какие-то спецсимволы (и наоборот, если там только латиница и пробелы, они НЕ ДОЛЖНЫ кодироваться). Для этого, возможно, потребуется модифицировать скрипт отправки в CMS, через которую делается рассылка.  
  5. Если есть возможность, реализуйте отписку одним кликом и пропишите адрес для нее в поле заголовка  List-Unsubscribe: <URL>.
  6. Сделайте SPF-запись для своего домена. Делается она следующим образом: в редакторе DNS нужно создать запись TXT-типа такого вида (запись создается для корня домена):
    v=spf1 ip4:ваш_IP ip6:ваш_IPv6 a mx ~all
    Если вы используете привязку домена к Яндекс.Почте, то запись нужно чуть изменить:
     v=spf1 ip4:ваш_IP ip6:ваш_IPv6 include:_spf.yandex.ru a mx ~all
  7. Установите OpenDKIM, настройте его работу для подписи отправляемых писем и сделайте необходимые записи в DNS. Описание процесса настройки для postfix (внимание: нужно использовать вариант с chroot, если у вас настройки postfix по умолчанию) и для sendmail в Ubuntu.
  8. Создайте DMARC-запись (в  редакторе DNS нужно создать запись типа TXT для имени _dmarc) такого вида:  
    v=DMARC1; p=quarantine; sp=reject; rua=mailto:postmaster@ваш.домен; fo=s; ruf=mailto:postmaster@ваш.домен
    (вместо postmaster может быть другой адрес, главное, чтобы он существовал и был в этом же домене)
  9. Если у вас используется сертификат для HTTPS, настройте его использование и для отправки почты через TLS-соединение вместо обычного SMTP (однако не все сертификаты допускают такое использование). Пример настройки для Postfix.
  10. Регулярно проверяйте логи сервера (обычно это /var/log/mail.log или /var/log/messages.log) на предмет ошибок почты и неработающих адресов (по коду ошибки 550) и удаляйте их из списка рассылки. (Особенно это важно для Mail.Ru, который после примерно двух десятков попыток отправки писем на несуществующие адреса на какое-то время блокирует дальнейший прием писем с сервера.)
  11. Для проверки корректности SPF и DKIM записей можно использовать сервисы MxToolbox и Valimail. С помощью MxToolbox можно также удостовериться, что сервер не внесен в черные списки.
  12. Для проверки доставляемости писем и корректности их заголовков хорошо подходит сервис Mail-Tester.com

Если выполнить все эти пункты, то доля дошедших до подписчиков писем значительно повысится.

SSHFS вместо FTP

4X_Pro

Довольно часто мне приходится заниматься отладкой скриптов прямо на рабочем сервере. Обычно в этом случае я использовал Filezilla, который хорош всем, кроме одного: после каждого изменения какого-либо файла он требует подтвердить его загрузку на сервер, на что и время теряется, и очень раздражает лишнее переключение между окнами. И вот недавно нашел другой вариант: использовать sshfs. Если есть подключение к серверу по SSH, то с ее помощью можно работать с удаленными файлами так же как с локальными. Все изменения будут отправляться на сервер сразу же после сохранения в редакторе, без каких-либо дополнительных действий или подтверждений. В результате отладка ускоряется в разы!

Чтобы использовать sshfs, нужно сначала установить соответствующий пакет. В Debian и Ubuntu это делается так: Читать далее…

Отправка уведомлений на почту и в Telegram

4X_Pro

При написании shell-скриптов, работающих по cron, иногда бывает нужно отправить пользователю уведомление о какой-то ситуации. Простейший способ — отправить EMail с помощью команды mail (работает, если на сервере установлен какой-либо MTA, например, postfix, и пакет mailutils; если MTA нет, можно воспользоваться утилитой msmtp, которая отправляет почту через внешний почтовый сервер):

echo "Текст сообщения" | mail -s "Тема сообщения" admin@example.com

Но иногда требуется сообщить о чем-либо более оперативно, чтобы уведомление пришло на мобильный телефон. Лучшим решением в этом случае является отправка SMS через шлюз EMail=>SMS, но бесплатных шлюзов сейчас не осталось. Поэтому я нашел другое решение: отправлять сообщения в Telegram с помощью Bot API. Делается это так: Читать далее…

Буфер обмена в Putty под Linux

4X_Pro

Каждый, кто пользовался SSH-клиентом Putty под Linux, сталкивался с тем, что в ней не работают привычные способы работы с буфером обмена: ни Ctrl+C/Ctrl+V, ни Ctrl+Ins/Shift+Ins, ни меню по правой кнопке мыши. Тем не менее, поддержка буфера обмена в Putty все же имеется. Делается это так: просто выделяем нужный текст мышью и щелкаем по выделению левой кнопкой. Все, данные в буфере! Но чтобы вставить их оттуда куда-либо еще, например, в текстовый редактор, нужно нажать не Ctrl+V, как обычно, а щелкнуть средней кнопкой (или колесиком) мыши. Аналогично, если нужно вставить данные в Putty из другой программы, тоже нужно щелкать средней кнопкой мыши по окну Putty.

Решение проблемы с mysql_connect в PHP 7

4X_Pro

Как известно, в PHP7 окончательно удалили расширение mysql, и теперь функции вида mysql_connect, mysql_query вызывают ошибку "Call to undefined function". Тем не менее, еще встречается код, который использует именно эти функции, и который, зачастую, бывает сложно быстро исправить. Заставить работать такой код на PHP7 достаточно просто — нужно определить эти функции самостоятельно и вызывать в них соответствующие функции из расширения MySQLi. Недавно столкнулся с такой ситуацией и сделал небольшой файл mysql.php, в котором объявил наиболее часто используемые функции.

Подключить его можно следующим образом:

if (version_compare(PHP_VERSION, '7.0.0','>=')) include 'mysql.php';

Абсолютный URL на PHP

4X_Pro

К моему большому удивлению, в PHP нет готовой функции для построения абсолютного URL по относительному и базовому. Пришлось писать ее самому. И вот что получилось: Читать далее…

Собственный сервис оптимизации загрузки сайтов

4X_Pro
Рад сообщить, что сегодня запустил собственный сервис для оптимизации времени загрузки сайтов: 2Seconds.4XPro.Ru. Он позволяет легко и быстро получить список всех CSS и JavaScript страницы (если они прописаны через теги link и script), минифицировать их и склеить в один файл. Кроме того, сервис позволяет автоматически встраивать в CSS графические файлы меньше указанного размера с помощью data:uri.

Удаление файлов старше N дней

4X_Pro

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

find путь -type f -mtime +дни -print | xargs rm -f

Здесь find находит по указанному пути. все файлы со временем модификации более чем указанное количество дней назад, выводит их список, который передается утилите xargs, которая для каждого полученного аргумента вызывает rf -f. В случае, если команда выполняется через cron, пути нужно прописывать полностью, например:

/usr/bin/find ./ -type f -mtime +2 -print | /usr/bin/xargs /bin/rm -f

Страницы:
Задать вопрос

Здесь можно задать мне вопрос или спросить совета по любой теме, затронутой в блогах или на форуме. После того, как я отвечу, вопрос и ответ появятся в соответствующем разделе. Но не забываем, что я — сторонник slow life, поэтому каких-либо сроков ответов не обещаю. Самые интересные вопросы станут основой для новых тем на форуме или записей в блоге.
Сразу предупреждаю: глупости, провокации, троллинг и тому подобное летит прямо в /dev/null.