Обо мне

4X_Pro
4X_Pro
Живу в Сети с 25 ноября 2000 г.
Веду блог с 8 января 2011 г.

Контакты

Немного рекламы

Рубрика: "Сайтостроительство" - Xpro.Su: заметки о жизни в Интернете

Рубрика: "Сайтостроительство"

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

Web-программирование, Сайтостроительство Оставить отзыв »

На многих сайтах для плавной прокрутки страницы к нужному элементу средствами jQuery рекомендуют использовать примерно такой код:

jQuery('body').animate({
        scrollTop: jQuery("#myTab").offset().top 
    }, 1000); // myTab — это элемент до которого нужно прокрутить

Но недавно обнаружил, что такой код перестал работать на одном из сайтов. По всей видимости, причиной этого было свойство height или min-height, прописанное для body. Стал искать, как это исправить, и выяснил, что в качестве селектора нужно указывать и body, и html через запятую: jQuery('html,body').animate({. После этого прокрутка начинает работать нормально.

JSON или XML

Сайтостроительство Оставить отзыв »

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

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

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

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

Администрирование, Сайтостроительство, Linux Оставить отзыв »

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

  1. Первое, что следует сделать — это настроить запись обратного DNS (она же reverse DNS, она же запись PTR-типа). Сделать это обычно можно через интерфейс хостинга. Если там подобной опции нет, то придется обратиться в техподдержку. Проверить корректность работы обратного DNS можно тут:
  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=none; sp=none; rua=mailto:postmaster@ваш.домен
    (вместо postmaster может быть другой адрес, главное, чтобы он существовал и был в этом же домене)
  9. Если у вас используется сертификат для HTTPS, настройте его использование и для отправки почты через TLS-соединение вместо обычного SMTP (однако не все сертификаты допускают такое использование). Пример настройки для Postfix.
  10. Регулярно проверяйте логи сервера (обычно это /var/log/mail.log или /var/log/messages.log) на предмет ошибок почты и неработающих адресов (по коду ошибки 550) и удаляйте их из списка рассылки. (Особенно это важно для Mail.Ru, который после примерно двух десятков попыток отправки писем на несуществующие адреса на какое-то время блокирует дальнейший прием писем с сервера.)
  11. Для проверки корректности SPF и DKIM записей можно использовать сервисы MxToolbox и Mail-Tester. С помощью MxToolbox можно также удостовериться, что сервер не внесен в черные списки.

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

SSHFS вместо FTP

Администрирование, Сайтостроительство, Linux, Личная эффективность Оставить отзыв »

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

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

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

Как перейти на формат WebP с минимальными изменениями сайта

Администрирование, Сайтостроительство, Ускорение сайтов Оставить отзыв »

Некоторое время назад появился новый формат для графических изображений — WebP. Этот формат обладает рядом преимуществ по сравнению с JPEG: поддерживает как сжатие с потерями, так и сжатие без потерь, а также прозрачность изображений (альфа-канал), и во многих случаях сжимает изображения эффективнее (на моих сайтах — изображения в WebP получаются 30-35% меньше). Но к сожалению, полностью перейти на этот формат пока не так просто. Во-первых, сейчас его полноценно поддерживают только Web-броузеры, работающие на основе WebKit, а Firefox и IE/Edge — нет. Во-вторых, исправить на уже существующем сайте расширения всех файлов с .jpg на .webp может быть весьма трудоемкой задачей. Но недавно я нашел интересное решение, которое предложил Vincent Orback на Github: использовать подмену JPEG на WebP с помощью mod_rewrite. Для этого добавим в .htaccess такие строки:

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

Безопасный редирект или как защититься от спамвертайзинга

Web-программирование, Сайтостроительство 3 отзывов »

Сегодня получил письмо от хостера, в котором говорилось, что на один из моих сайтов поступила жалоба на спамвертайзинг, и приводился пример спамного письма. Из него выяснилось, что на самом деле спамом рекламируется совершенно другой сайт, а от моего используется только скрипт, который делал редирект со статусом 301 на указанный ему в параметрах адрес.
Таким образом, в современных условиях наличие на сайте скрипта, который позволяет делать редирект без какой-либо проверки, небезопасно. Возникла мысль, как можно его защитить, но при этом не слишком усложнять. Решение нашлось быстро: передаем в скрипт редиректа два параметра, один из которых — это сам URL, второй — хеш, который считается от URL и некоторой строки-ключа. Редирект происходит только тогда, когда рассчитанный на основе URL хеш совпадет с переданным, в остальных случаях выдается ошибка 404. (Естественно, при этом придется поправить все те места на сайте, где генерируется ссылка на скрипт с редиректом, чтобы рассчитать и добавить хеш.) В результате получаем вот такой скрипт:

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

Несколько советов, как делать резервные копии баз данных

Администрирование, Сайтостроительство, Linux 3 отзывов »

На первый взгляд, сделать резервную копию базы данных какого-либо сайта предельно просто, если есть доступ к утилите mysqldump и планировщику заданий cron. Добавляем в планировщик запись вида:

3 14 * * * /usr/bin/mysqldump -u root -pпароль имя_базы > путь/backup.sql

и все, каждый день в 3 часа 14 минут будет сниматься дамп. Время для резервного копирования следует выбирать так, чтобы в этот момент нагрузка на сервер была минимальной за сутки.
Но такое решение недостаточно надежно. Если база повредится, скажем, в 3:12, то дамп будет перезаписан пустым файлом.
Для защиты от этого имеет смысл сохранять перед снятием новой копии сохранять старую, а также делать отдельные копии через определенные промежутки времени. Например, я сохраяю еженедельную и ежемесячную, а чтобы меньше нагружать SQL-сервер, просто копирую файлы дампа:

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

Как отформатировать сумму и дату на JavaScript

Web-программирование, Сайтостроительство Оставить отзыв »

Недавно потребовалось вывести в Интернет-магазине сумму заказа с десятичными разделителями, причем сделать это с помощью JavaScript. Стал искать, есть ли встроенные средства для этого и обнаружил объект NumberFormat. В простейшем случае форматирование выполняется так: var str = new Intl.NumberFormat().format(value), где value — это число, которое нужно отформатировать. По умолчанию используются свойства системной локали, но можно и указать ее явно: new Intl.NumberFormat('ru-RU'), и хеш с опциями в качестве второго параметра. Напримр, new Intl.NumberFormat('ru-RU', { style: 'currency', currency: 'RUB', currencyDisplay: 'symbol'}) явно указывает, что нужно использовать форматирование, применяемое для денежных сумм, использовать валюту рубль и выводить не "руб.", а ₽. О других опциях можно узнать в справочнике.

Поскольку некоторые старые броузеры с этим объектом работать не умеют, рекомендую выполнять проверку с помощью такой функции:

function formatPrice(value) {
  if (Intl.NumberFormat) return new Intl.NumberFormat('ru-RU',{ style: 'currency', currency: 'RUB', currencyDisplay: 'symbol'}).format(value); 
  else return value; // если броузер не поддерживает этот объект, оставляем все как есть, без обработки
}

Для форматирования даты используйте объект Intl.DateTimeFormat c аналогичным методом format.

Упрощаем разделение тем в PunBB

Сайтостроительство Оставить отзыв »

Есть у меня с давних времен один форум, работающий на PunBB. В целом в нем меня все устраивало, кроме одного: очень неудобного разделения темы на несколько в случае возникновения оффтопика. Неудобство заключалось в том, что при разделении тема разбивалась на страницы точно так же, как при обычном просмотре, в результате чего если оффтопик шел на нескольких страницах, каждую из них приходилось вырезать в отдельную тему, а потом склеивать.
Наконец, мне это надоело, и я решил немного подредактировать исходный код moderate.php (который лежит в корне).

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

Обновление TextCMS до версии 1.01

Разное, Сайтостроительство, Полезный софт Оставить отзыв »

Рад сообщить всем читателям, что недавно я выпустил новую версию одной из своих разработкой — TextCMS. Она представляет собой предельно простую систему управления сайтом, работающую без использованя баз данных, где на одной странице любое динамическое содержимое можно комбинировать произвольным образом. В новой версии был заменени визуальный редактор и исправлено несколько незначительных ошибок.