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

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


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

t.me/4x_pro

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

Плавная прокрутка до нужного элемента

4X_Pro
На многих сайтах для плавной прокрутки страницы к нужному элементу средствами jQuery рекомендуют использовать примерно такой код:
jQuery('body').animate({
       scrollTop: jQuery("#myTab").offset().top
   }, 1000); // myTab — это элемент до которого нужно прокрутить
Но недавно обнаружил, что такой код перестал работать на одном из сайтов. По всей видимости, причиной этого было свойство height или min-height, прописанное для body. Стал искать, как это исправить, и выяснил, что в качестве селектора нужно указывать и body, и html через запятую: jQuery('html,body').animate({. После этого прокрутка начинает работать нормально.

Два бота для Telegram

4X_Pro
Сегодня запустил двух собственных ботов для Telegram.
https://telegram.me/SiteKnockerBot — мониторинг состояния сайта. Отслеживает доступность сайта, наличие на странице заданных ключевых слов, время ответа сервера, и сообщает о возникновении проблем. Также умеет предупреждать о подозрительных ситуациях (выдается почти пустая страница, присутствуют слова, характерные для дефейса или сообщения об ошибках PHP).
Из соображений безопасности число сайтов на мониторинге ограничено: до 1 сентября 2017 года можно добавить 10 сайтов для одного пользователя, после — 5.
https://telegram.me/TypograferBot — типографирование текста. Расставляет правильные кавычки, тире, многоточия, пробелы вокруг знаков препинания, простейшие дроби, обозначения типа см2, м2 и т.п., а также знаки дюйма, градусы по Цельсию и Фаренгейту. За основу взят типографер из моей давней разработки — TextCMS.

Асинхронная загрузка при наличии 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 по относительному и базовому. Пришлось писать ее самому. И вот что получилось: Читать далее…


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

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