Производство фотообоев в Новосибирске. Интернет магазин фотообоев. Изготовление - один день! Каталог 10 000 изображений!
5 Февраль 2015

Не работает BASH скрипт выполняемый по CRON

Итак — настроил файловую синхронизацию по RSYNC — запихал в скрипт — всё синхронизится, всё устраивает.
Сам скрипт поставил в крон и успокоился… а зря !
Оказывается скрипт по времени запускался, но сама синхронизация нет!!!
В итоге разборок получилось, что переменные окружения при запуске через CRON для пользователя не подгружаются!
Соответственно, система не находила rsync и скрипт не работал!!!
Прописал абсолютные полные пути — всё завелось, с пол-пинка.
Я с подобной проблемой уже сталкивался при отправке писем php скриптом по крону — и снова те же грабли 🙁
Внимание и контроль!
Внимание и контроль!
🙂

рубрики: NIX, Администрирование, Полезности, Программирование | Комментарии (0)

29 Январь 2015

MYSQL cинхронизация баз данных

Итак, первый шаг для создания «горячей копии» виртуальной машины, физически расположенной на другом сервере — файловая синхронизация сделана (5 раз в сутки думаю достаточно) — см. предыдущий пост.
Второй шаг для достижения цели — онлайн репликация MYSQL баз данных.
(преследуемая цель: если первый сервер умирает — перебиваем IP в запасной виртуалке, выключаем slave в MYSQL и вуаля — с минимальными затратами во времени и без потерь поднимаем рабочий сервер).

Сразу оговорюсь, что физические сервера у меня находятся в одной физической сети — соответственно я назначил каждой виртуалке свой IP адрес сети класса С/24 192.168.100.ххх
Практически всю информацию для репликации я взял из статьи

НА МАСТЕРЕ добавляем в конфиг my.cnf секция mysqld и рестартим mysql

server-id = 1
log-bin = /var/lib/mysql/mysql-bin
replicate-do-db = testdb

Далее, несколько запросов в БД (сбрасываем кэш, блокируем таблицы)
flush logs;
reset master;
FLUSH TABLES WITH READ LOCK;
SET GLOBAL read_only = ON;
show master status;
Бэкапим данные для переноса на слейв + переписываем название файла и циферку (то, что show master status выдал)
Разблокируем таблицы
SET GLOBAL read_only = OFF;
UNLOCK TABLES;

НА СЛЕЙВЕ правим конфиг и рестартим mysqld
server-id = 2
relay-log = /var/lib/mysql/mysql-relay-bin
relay-log-index = /var/lib/mysql/mysql-relay-bin.index
replicate-do-db = testdb

Выполняем MYSQL запросы (название файла и позицию берём из show master status на мастере)
CHANGE MASTER TO MASTER_HOST = «192.168.1.101 «, MASTER_USER = «replication «, MASTER_PASSWORD = «password «, MASTER_LOG_FILE = «mysql-bin.000003 «, MASTER_LOG_POS = 98;
start slave;

Проверяем как пошло
show slave status;

Лично у меня какие то дубликаты всплыли при первой синхронизации, что недавало дальше синхронизировать
для решения проблемы добавил slave-skip-errors = 1062 в конфиг

Если нужно заново стартануть — делаем всё тоже самое, но на слейве сначала нужно выполнить
stop slave;
flush logs;
CHANGE MASTER TO ….
start slave;

Проверим «руками» — правим значение в какой нить таблице на мастере, смотрим изменилось ли на слейве.

P.S.
Немного о ‘подводных’ камнях:
Настраивал на виртуалках с 2мя разными средами (FreeBSD, CentOS) — на каждой столкнулся с проблемой видимости порта 3306 извне, поэтому некоторые моменты:
* iptables
* для диагностики на мастере netstat -ln | grep mysql
* для диагностики со слейва на мастер telnet master 3306
* комментируем bind-address на мастере
* комментируем skip-networking на мастере
* ну и следим за синтаксисом, логинами и паролями 🙂 (ошибся в пароле в CHANGE MASTER TO … — долго парился пока заметил)

P.P.S
О контроле размера бинарных файлов тут http://forum.hostdvor.com/viewtopic.php?p=132
я поставил SET GLOBAL expire_logs_days =2

рубрики: NIX, Администрирование, Программирование | Комментарии (0)

26 Декабрь 2014

Как добавить в архив только новые файлы

Перетаскиваю довольно крупный проект — в сжатом виде >40 Гб.
Даже физически файлы перетащить — по времени половина дня уйдёт.
Пока перетащил, настроил, потестил — уже заново нужно перетаскивать в силу произошедших на сайте изменений.
Вот тут то и пригодится очень полезная команда, вернее связочка, добавляющая в архив только файлы созданные/изменённые за последние N дней


find . -type f -mtime -10 -print0 | xargs -0 tar -cjf archive.tar.bz2

В закладки, полезняшки и т.д. однозначно!

P.S.

ВНИМАНИЕ — на рабочем проекте у меня такая связка даёт сбой!!! думаю из за ограничения на длину данных передаваемых xargs

такая конструкция вроде пашет


find . -type f -mtime -10 -print0 | zip archive.zip @

ещё экспериментирую с параметром -n в xargs — пока безрезультатно

P.S.S.
Спасибо большое drBatty за помощь в решении проблемы в ветке форума

всё правильно: xargs режет список аргументов дозами по несколько сотен..тысяч имён файлов. Дальше у вас записано «tar —create» что значит «создать архив». Он и создаётся несколько раз. Вы наблюдаете только последний вариант.

Если вы хотите делать обязательно так, то вам следует использовать —append, которая не работает для сжатых файлов, потому вам следует ещё потом сжать, как в третьем варианте.

А вообще мне понравился вариант с промежуточным файлом — сначала выдёргиваем в файл все файлы find-ом, потом уже скармливаем его tar-у

#!/bin/bash
set -x
TMP=$(mktemp)
find -mtime -10 >$TMP
tar —create —files-from $TMP
rm —force $TMP

рубрики: NIX, Администрирование, Полезности, Программирование | Комментарии (0)

19 Декабрь 2014

Быстрое редактирование элементов в интернет магазине Битрикс

Продолжаю работать с ИМ Планета Обоев — корейские обои

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

Собственно, сваял на коленке очень полезный скриптик (см.рисунок) — клик по цвету ниже фотки сразу же присваивает этот цвет элементу без каких либо лишних окошек и вопросов.
Такая обработка ИМХО в разы ускорит процесс.
(аналогичные скрипты можно написать для работы с любым свойством)

Быстрое редактирование элементов в интернет магазине Битрикс

рубрики: Bitrix, Полезности, Программирование | Комментарии (0)

16 Декабрь 2014

FireBug сеть — анализ скорости загрузки страницы

Продолжаю мучать интернет магазин корейских обоев.
Сейчас решил посмотреть сайт с точки зрения Запрос-Ответ, скорости отдачи контента и в целом как страничка принимается браузером.

Для этой цели я использовал расширение для браузера FireBug — закладка «Сеть» (см.рис).

site-speed

Сразу же обнаружил косячёк — какого то хрена морда дёргает детальные изображения товара, что конечно же сильно притормаживает отдачу страницы в целом!
Рекомендую!

Тяжесть страницы давали все компоненты размещённые на морде.
В данном шаблоне интернет магазина используется MORE_PHOTOS как дополнительные фотки, и у меня там лежат детальные — для возможности просмотра в увеличенном виде.
Эти же детальные используются для вывода дополнительных (вторых) фоток для превьюшки (имхо по идее нужно новое поле делать и пихать туда умешьшенные).
Вырубить эту возможность в настройках компонент не получилось — пришлось «рубить» на живую.
Копирнул все шаблоны и там заменил дополнительные картинки на превью.
(по специфике моего товара мне дополнительные картинки не требуются).

Сраничка стала открываться В РАЗЫ быстрее!!!

Ту же процедуру придётся применить ко всем шаблонам выводящим списком 🙁

рубрики: Полезности, Программирование, Сайтостроение | Комментарии (0)

16 Декабрь 2014

Разработка интернет магазина на Битрикс — добавление умного фильтра на главную страницу

Итак, продолжаю доработки интернет-магазина Планета обоев на движке Битрикс, фактически знакомство с этим модулем.
Кратко о том, что уже сделал:
* Импорт каталога из выгрузки 1С сделал полностью с нуля свой — так я полностью контролирую процесс 🙂
* Прикрутил «обратный звонок»
* Прикрутил «прокрутку к началу страницы»
* Прикрутил «почтовик» — отправка писем через сторонний SMTP сервер (в моём случае это yandex т.к. почту домена в виде @dekorplanet.ru прикрутил именно туда) — так адресат увидит свои письма с гораздо большей вероятностью 😉
* Воткнул сторонний слайдер (тут ещё видимо буду переделывать)
остальные модули стандартные Битриксовые
* В целях сбора поискового трафика подготовлены отдельные страницы с уже отфильтрованными товарами * 3D Обои, Детские обои и т.д. (есть сомнения в правильности реализации — тут тоже не закрыто)

Решил «прикрутить» на главную фильтр! а именно в область под вертикальным меню слева
Под эту задачу отлично подошла статья Дмитрия Акифьева Перенос умного фильтра в Битриксе

Результат:
smartfilter-1

Всё описанное в видео получилось сразу НО мне захотелось большего — прикрутить умный фильтр на главную страницу сайта (имхо там ему и место).
Добавил смарт фильтр на морду в тоже место — не пашет. Не работает как подсчёт количества, так и переход по кнопке.
Ответ Дмитрия на мои вопросы оптимизма не придал:
* «Умный фильтр работает в жесткой сцепке с компонентом списка товаров. Если на странице нет списка товаров, то и отбирать нечего и фильтр бесполезен.»
* «Делайте свой компонент, реализуйте в нем нужную логику (из каких инфоблоков что берет, как фильтрует, сортирует и т.д. ), делаете для этого компонента шаблоны и выводите все это безобразие на любой странице.»

Что придало уверенности так это то, что фильтр правильно увидел все характеристики и «подтянул» их для выбора, так же я знаю что по сути работа фильтра — это генерация GET запроса в массив фильтра arrFilter, который уже может подхватываться любым компонентом отображающим товары, а запрос этот фильтр генерирует верно.
Значит по сути должно работать — осталось просто разобраться почему не пашет и починить 🙂

smartfilter-2

Первое — это корректировка темлейта фильтра на предмет form action на страницу с каталогом, проверка — работает!

Далее разбирался с AJAX подсчётом товара — роем компонент:
В фильтр передаётся значение SECTION_ID через GET параметр, соответственно для морды у меня SECTION_ID = 0 и он же передаётся в $arrFiler GetList
Добавляем в компонент проверку
if ($arFilter[‘SECTION_ID’]==0) unset($arFilter[‘SECTION_ID’]);
и подсчёт тоже начинает работать корректно!

smartfilter-3

Одно НО — ссылка в появляющемся окошке должна так же вести на каталог.
Т.к. окошко появляется — это явно Javascript + Ajax — роем script.js в темлейте и обнаруживаем необходимый нам код

hrefFILTER[0].href = BX.Utils……….
который меняем на
hrefFILTER[0].href = ‘/catalog/oboi’+BX.Utils……….

Вуаля! Всё пашет!

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

рубрики: Bitrix, Полезности, Программирование | 4 комментария

13 Декабрь 2014

Битрикс API — создание торгового предложения товара

Взято отсюда и всвязи с особой ценностью информации сохранено в блоге.

рубрики: Bitrix, Программирование | Комментарии (0)

10 Октябрь 2014

Динамическое подключение Яндекс.Карт в AJAX запросе

Итак, задача такова — выбираем из списка город, отображается карта с расставленными на ней магазинами.

Магазины я расставил в конструкторе Яндекс.Карт который на выходе генерит подключаемый javascript код

map-nsk

Собственно, вроде всё просто — при выборе разных городов динамически подключаем нужный скрипт и вперёд!
Но тут то и фишка — код нужно не только подключить, но и выполнить.
Не буду долго томить — вот готовое решение, которое я повесил на success событие ajax запроса.
Последняя строчка — самая важная (почему то в выложенных в сети примерах этого момента нигде не было — .appendchied() и всё на этом).

yandex-map

рубрики: Javascript, Программирование | Комментарии (1)

11 Август 2014

Bash скрипт контроль места на диске linux

Куда-то начало «уходить» место на диске, из-за чего нехватка места под временные таблицы mysql — как результат падение всех сайтов на серваке, что весьма неприятно.
Куда именно «ушло» свободное место — это я разберусь чуть позже, а вот сейчас на повестке у меня вопрос контроля подобных ситуаций.
Т.е. нужен скрипт по крону проверяющий (раз в час думаю достаточно) свободное место и в случае его нехватки сигнализирующий мне об этом на почту и СМС уведомлением на мобильный.
После недолгих поисков скрипт был найден тут

#!/bin/bash
# Free space check
# $1 - device name
# $2 - space limit in Gb
# $3 - mount point synonym (not mand.)
if [ -z "$2" ]; then
echo empty parameters
exit 100
fi
TEMP=$(df -B G | grep $1 | awk '{print $4}' | sed 's/G//')
FREE=$(echo $TEMP | cut -d. -f1)
MNT=$3
if [ -z "$MNT" ]; then
MNT=$1
fi
if [ $2 -ge $FREE ]; then
echo $MNT" -=> "$FREE"Gb"
fi

В последней проверке я ещё добавил пару строк отсылающих мне результат на почту и в мыло.
Всё — теперь, как говориться, «предупреждён значит вооружен» 🙂

P.S.
При чистке — само собой по сайтам и базам данных всё лишнее проверить (бэкапы старые, сайты и базы для разработки, вообще старые сайты и т.д. и т.п.)
почта юзеров /var/mail/
все логи /var/log/
и у меня ещё забилась очередь postfix
postsuper -d ALL deferred

/var/spool/postfix/defer — тут хидеры
/var/spool/postfix/deferred — а тут тушки писем
чистим postsuper -d ALL deferred и postsuper -d ALL deferr соответственно

рубрики: NIX, Администрирование, Полезности, Программирование | Комментарии (1)

19 Июнь 2014

Получаем из прямоугольного изображения квадратное

При создании превью картинок заданного (в моём случае квадратного) размера сталкиваемся с проблемой изменения размеров изображения без искажения самого изображения.

Например есть картинка — карандаш. ширина 100 высота 1000
нужно сделать квадратную превью картинку 100х100

если просто уменьшить с сохранением пропорций получаем 10х100
как бы нарастить по бокам для получения квадратной картинки (карандаш должен быть в центре)?

либо наоборот — тот же карандаш но горизонтально расположен
ширина 1000 высота 100

превью картинка так же должна получиться 100х100 — с полями сверху и снизу

Обычный ресайз с сохранением геометрии — сплошь и рядом.
НО до его применения нужно отквадратить искомое изображение!
В случае с карандашем — сделать 1000х1000 а потом уже уменьшить до 100

Собственно, ниже фукнция уквадрачивания 🙂

function image_resize($src, $dst){
if(!list($w, $h) = getimagesize($src)) return "Unsupported picture type!";
$type = strtolower(substr(strrchr($src,"."),1));
if($type == 'jpeg') $type = 'jpg';
switch($type){
case 'bmp': $img = imagecreatefromwbmp($src); break;
case 'gif': $img = imagecreatefromgif($src); break;
case 'jpg': $img = imagecreatefromjpeg($src); break;
case 'png': $img = imagecreatefrompng($src); break;
default : return "Unsupported picture type!";
}
$x = $y = 0;
if($w < $h) { $x = $h/2 - $w/2; $new = imagecreatetruecolor($h, $h); } else { $y = $w/2 - $h/2; $new = imagecreatetruecolor($w, $w); } $color = imagecolorallocate($new, 255, 255, 255); imagefill($new, 0, 0, $color); imagecopyresampled($new, $img, $x, $y, 0, 0, $w, $h, $w, $h); switch($type){ case 'bmp': imagewbmp($new, $dst); break; case 'gif': imagegif($new, $dst); break; case 'jpg': imagejpeg($new, $dst); break; case 'png': imagepng($new, $dst); break; } return true; }

рубрики: Полезности, Программирование | 2 комментария