суббота, 17 октября 2015 г.

Досадная проблема автосигнализации Cyclon 555D и как я ее решил

Доброго времени суток!

В 2011 г. купил я авто Nissan Note у официального дилера. Радость от покупки была столь серьезной, что при согласовании дополнительной комплектации я совершенно не обратил внимание на марку устанавливаемой в машину сигнализации - Cyclon
В автосалоне установили сигнализацию Cyclon 555D, двустороннюю, как мне показалось, обладающую большим функционалом.
Время шло и спустя два года неожиданно перестал работать один из брелковПри нажатии на его кнопки сигнализация не реагировала. 
Ну думаю, ладно, ведь у меня есть другой брелок, который хорошо функционирует и до того, как он сломается я машину продам. Однако не тут то было. На днях я преспокойно заблокировал машину, а когда вернулся, мой брелок уже не действовал. Попасть в машину я не мог. 
Пришлось находить в бумагах секретный код для кнопки VALET и инструкцию по отключению сигнализации без брелка. Отключить - отключил, но как пользоваться сигнализаций без брелков?  Стал искать на рынках, съездил в Митино - безрезультатно. 
Предлагают купить только полный комплект данной сигнализации Cyclon. однако не хочется платить 5000 рублей и выше, когда нужны только брелки. В российских интернет-магазинах брелки для нее тоже не найти.
Выяснилось, что  Cyclon - это торговая марка украинской фирмы "Автолок". Производят сигнализации в Китае. 
Поэтому Cyclon  мало представлена в России и брелки  можно купить только в украинских интернет-магазинах, что достаточно сложно в нынешней политической ситуации.

Осталось 2 пути:

1. не пользоваться сигнализаций, а закрывать машину кнопкой на ключе. 

2. демонтировать эту сигнализацию и установить какую-нибудь более распространенную.


Первый способ не способствует безопасности. 
Второй  - затратен. По нынешним ценам это обойдется мне в 15000 руб.

Я листаю инструкцию к сигнализации и натыкаюсь на пункт "Программирование брелоков для сигнализации".  Этот пункт описывает настройку сигнализации на новые брелки. Но что если мои брелки сами по себе не вышли из строя, а просто настройка сигнализации на них пропала.
Я решил применить настройку еще раз, то есть запрограммировал мои старые брелки (якобы вышедшие из строя) на сигнализацию Cyclon 555D
Запутанный алгоритм программирования предполагал использование VALET, зажигания, секретного кода и кнопок брелков.   Но способ все-таки сработал! :))))
Не пришлось покупать новые брелки в Украине или  полностью менять сигнализацию.


Проблема сигнализации  Cyclon 555D в том, что может пропадать связь с ее брелками (даже при наличии питания от аккумулятора).


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

Таким образом я сэкономил нервы и деньги, чего и вам советую.

среда, 7 октября 2015 г.

Как запретить удаление строк из таблицы Postgres

Доброго времени суток. Как-то раз при работе с базой данных  Postgres возникла потребность запретить удаление каких-либо данных из таблицы заказов. Конечно ограничения constraint не позволят это сделать, если есть внешние ключи к другой таблице.  Однако некоторые разработчики баз данных могут не использовать foreign keys, утверждая, что внешние ключи могут замедлять работу с таблицами.

Чтобы запретить коду с правами на удаление из таблицы удаление данных можно использовать 2 метода:

1) Не давать удалять с помощью  триггера
2) Не позволять удалять с помощью правила.

Я выбрал последний вариант, поскольку триггер писать дольше.
Вот пример правила, запрещающего удаление строк из таблицы заказов:


CREATE RULE orders_rl AS ON DELETE TO public.orders
DO INSTEAD NOTHING;

вторник, 8 сентября 2015 г.

Получение внешних связей для таблицы в PostgreSQL

Иногда бывает необходимо удалить строки из таблицы, с которыми связаны через внешние ключи строки в других таблицах.
Интерфейс PgAdmin не позволяет узнать все внешние связи для  данной таблицы.
Разработчики фактически предлагают нам проверять каждую таблицу, кликая на пункт "Ограничения" (constraints) в дереве, и проверять, есть ли связь с исходной таблицей или нет.
Чтобы обойти это ограничение я пользуюсь следующим запросом, позволяющим выявить внешние связи для полей определенной таблицы:



select confrelid::regclass as table_source
, af.attname as source_key,
conrelid::regclass as table_dest,
a.attname as dest_key,
ss2.conname as constraint_name
from pg_attribute af, pg_attribute a,
(select conrelid,confrelid,conkey[i] as conkey, confkey[i] as confkey,conname
from (select conrelid,confrelid,conkey,confkey,
generate_series(1,array_upper(conkey,1)) as i,conname
from pg_constraint where contype = 'f') ss) ss2
where af.attnum = confkey and af.attrelid = confrelid and
a.attnum = conkey and a.attrelid = conrelid
AND confrelid::regclass = 'gateway.as_goods'::regclass
order by conrelid::regclass,a.attname;



gateway.as_goods - это исходная таблица, для которой выявляются внешние связи ( с указанием схемы )


Выходные столбцы:

table_source - исходная таблица (в примере - gateway.as_goods)
source_key - поле-ключ из исходной таблицы 
table_dest - таблица, связанная с исходной
dest_key - внешний ключ, находящийся в таблице table_dest
constraint_name - наименование внешней связи

Выявив наименование внешней связи, ее можно удалить с помощью команды:


ALTER TABLE table_dest
DROP CONSTRAINT constraint_name;


пятница, 10 апреля 2015 г.

Система форматирования программного кода в HTML

Сайт http://www.tohtml.com/ позволяет  оформить программный код  в HTML для публикации. Мне он показался удобнее других. 

Foreign tables в Postgresql и неработающая команда ALTER SERVER

Всем доброго дня и прекрасного настроения.

Я работаю в крупной торговой компании и поддерживаю принадлежащий компании интернет-магазин (ИМ). 
Практически каждый час цены и другая информация в нашем ИМ должны обновляться. При этом из 1С  цены и информация по товарам выгружается в неудобном формате с идентификаторами 1С. Данная информация выгружается в большом объеме и требует серьезной предварительной обработки. Соответственно когда мы с командой реализовывали этот проект, была выявлена  проблема большой загруженности сервера сайта при обработке выгрузок из 1С. Страдала производительность сайта и соответственно качество обслуживания клиентов. 
Было принято решение обрабатывать данные из 1С с помощью процедур plpgsql в базе Postgresql на отдельном сервере в специальной базе-обработчике, а затем передавать обработанные данные выгрузки из 1С на сервер сайта. При подготовке данных в этой базе-обработчике я использую внешние таблицы  (foreign tables) из модуля расширения postgres_fdw. 

Версия PostgreSQL -  9.3.1, версия postgres_fdw - 1.0


Примерный код создания одной из внешних таблиц ft_goods, позволяющей получить доступ к таблице goods на site_server:

CREATE SERVER site_server FOREIGN DATA WRAPPER postgres_fdw OPTIONS (host '192.168.0.100', dbname '#####', port '#####');
create user mapping for public server site_server OPTIONS (user '#####', password '#####');
CREATE FOREIGN TABLE ft_goods
(
id integer, 
name character varying(300),
code character varying(20),
clear_code character varying(20),
brand_id integer,
description character varying(1000))
SERVER site_server OPTIONS (schema_name 'public', table_name 'goods');


Недавно возникла задача по реализации быстрой смены в базе-обработчике адреса сервера сайта (для возможности горячего переключения).
Вначале показалось, что это достаточно просто. Не нужно пересоздавать все внешние таблицы. Достаточно выполнить 2 простые команды


ALTER SERVER site_server OPTIONS (set host 'new IP address',set dbname 'new dbname',set port 'new port');
ALTER USER MAPPING FOR public SERVER site_server OPTIONS (set user 'new user name', set password 'new password');



Тем самым мы меняем настройки соединения сервера для внешних таблиц. Все так и было сделано, но не тут-то было.
Внешние таблицы, несмотря на смены настроек, упорно были привязаны к прежнему серверу.
Запрос вида

select * from ft_goods


возвращал данные со старого сервера привязки, команда ALTER SERVER  не произвела никакого эффекта. 

Возникли следующие пути решения задачи:

1. сменить у всех внеших таблиц SERVER

Выяснилось, что не существует команды 

ALTER FOREIGN TABLE ft_goods
SET SERVER new_site_server;

2. пересоздать объект сервер (CREATE SERVER) и пересоздать все внешние таблицы (CREATE FOREIGN TABLE)

Это неудобное решение поскольку нужно каждый раз при смене основного site_server на new_site_server (настройка в таблице параметров соединения с сервером назначения) выполнять скрипт пересоздания всех этих внешних объектов. Скрипт должен содержать 
все внешние таблицы, иначе при дальнейшей работе будут ошибки.


Гораздо удобнее было бы найти в системных таблицах связь между объектом SERVER и foreign tables и сменить привязку. Я стал исследовать эту возможность и нашел нужные системные таблицы pg_foreign_server, pg_foreign_table.

Посмотреть информацию по объектам SERVER можно запросом:

select oid,* from pg_foreign_server

Привязка внешней таблицы к серверу выявляется другим запросом:

select * from pg_foreign_table

Столбец ft_server - это как раз oid актуального сервера из таблицы pg_foreign_server.

Для решения проблемы я принял решение создавать новый  объект SERVER и привязывать к нему существующие внешние таблицы через обновление столбца ft_server в pg_foreign_table.

--создаем новый объект
CREATE SERVER new_site_server FOREIGN DATA WRAPPER postgres_fdw OPTIONS (host 'new IP address', dbname 'new dbname', port 'new port');
create user mapping for public server new_site_server OPTIONS (user 'new user name', password 'new password');
--теперь все таблицы привязываем к новому серверу
update pg_foreign_table set ftserver=(select oid from pg_foreign_server where srvname='new_site_server' limit 1);


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

пятница, 13 февраля 2015 г.

Витамины, необходимые для зрения

Достаточно давно я заинтересовался вопросом, какие продукты особенно полезны для нашего зрения. Оказалось, что эти продукты отличаются от других большим содержанием витаминов, полезных для глаз. Привожу схему, показывающую информацию об основных витаминах, а также информирующую, в каких продуктах особенно много содержится тех или иных витаминов.





Схему можно также скачать в pdf-формате.

Каталог блогов Blogolist