NopCommerce и почта России. Часть 1. Прописываем области.

Часть 1. Прописываем области.
Это — первая часть серии постов, посвященная настройке CMS на основе NopCommerce для работы с почтой России.
Вносить области рекоменую этим скриптом, это избавит вас в дальнейшем с проблемами по адаптации скриптов к вашему набору областей.

Сам список областей был взят по ссылкам Субъекты Российской Федерации и Federal subjects of Russia

Внимание! Этот скрипт удаляет все предыдущие области России. В случае наличия каких-то адресов, в которых используются области, скрипт не отработает.

Сайт только первоначально настраивается
Если сайт только настраивается и еще не запущен в реальную работу. Можно просто удалить все записи в таблице [Address] или установить столбец [StateProvinceId] таблицы [Address] для всех записей в произвольное значение, например 1.

Сайт находится в работе

В это случае процедура будет сложнее.
  • Комментируем 2 инструкции удаления DELETE в разделе «Очистка старых данных»
  • Запускаем скрипт
  • Когда новые области будут созданы отдельными SQL запросами меняем ID старых областей в таблице Address на ID новых
  • Удаляем старые области из таблиц [StateProvince] и [LocalizedProperty].


Если какие-то изменения в SQL не отображаются на сайте, необходимо нажать «Перезагрузить приложение» в админке. И не забудьте сделать бекап базы данных!


BEGIN TRY

DECLARE @russia_code INT
DECLARE @language_code INT

DECLARE @start_id INT


/*  Получаем коды России и русского языка в таблицах сайта */
SELECT @russia_code = MIN (id) FROM [Country] WHERE [Name] = 'Russia'
SELECT @language_code = MIN (id) FROM [Language] WHERE [Name] = 'Russian'

/* Очистка старых данных */
DELETE FROM [LocalizedProperty] WHERE [LocaleKeyGroup] = 'StateProvince' AND [LocaleKey] = 'Name' AND [LanguageId] = @language_code 
DELETE FROM [StateProvince] WHERE [CountryId] = @russia_code 



/* Создаем временную таблицу и заполняем именами областей и ID для сортировки */

CREATE TABLE #provinces (
	P_Id INT PRIMARY KEY IDENTITY,
	sort_position INT, 
	english_name nvarchar(50), 
	russian_name nvarchar(50))


/* Создаем временную таблицу и заполняем кодами областей и соответствующими номерами магистральных поясов */
INSERT INTO #provinces (sort_position , english_name, russian_name )
	VALUES
	(1, 'Moscow', 'г. Москва'),
	(4, 'Saint Petersburg', 'г. Санкт-Петербург'),
	(7, 'Sevastopol', 'г. Севастополь'),
	(10, 'Adygea, Republic of', 'Адыгея'),
	(20, 'Altai Republic', 'Алтай'),
	(30, 'Bashkortostan, Republic of', 'Башкортостан'),
	(40, 'Buryatia, Republic of', 'Бурятия'),
	(50, 'Dagestan, Republic of', 'Дагестан'),
	(60, 'Ingushetia, Republic of', 'Ингушетия'),
	(70, 'Kabardino-Balkar Republic', 'Кабардино-Балкария'),
	(80, 'Kalmykia, Republic of', 'Калмыкия'),
	(90, 'Karachay-Cherkess Republic', 'Карачаево-Черкесия'),
	(100, 'Karelia, Republic of', 'Карелия'),
	(110, 'Komi Republic', 'Коми'),
	(120, 'Republic of Crimea', 'Крым'),
	(130, 'Mari El Republic', 'Марий Эл'),
	(140, 'Mordovia, Republic of', 'Мордовия'),
	(150, 'Sakha (Yakutia) Republic', 'Саха (Якутия)'),
	(160, 'North Ossetia-Alania, Republic of', 'Северная Осетия — Алания'),
	(170, 'Tatarstan, Republic of', 'Татарстан'),
	(180, 'Tuva Republic', 'Тыва (Тува)'),
	(190, 'Udmurt Republic', 'Удмуртия'),
	(200, 'Khakassia, Republic of', 'Хакасия'),
	(210, 'Chechen Republic', 'Чечня'),
	(220, 'Chuvash Republic', 'Чувашия'),
	(230, 'Altai Krai', 'Алтайский край'),
	(240, 'Zabaykalsky Krai', 'Забайкальский край'),
	(250, 'Kamchatka Krai', 'Камчатский край'),
	(260, 'Krasnodar Krai', 'Краснодарский край'),
	(270, 'Krasnoyarsk Krai', 'Красноярский край'),
	(280, 'Perm Krai', 'Пермский край'),
	(290, 'Primorsky Krai', 'Приморский край'),
	(300, 'Stavropol Krai', 'Ставропольский край'),
	(310, 'Khabarovsk Krai', 'Хабаровский край'),
	(320, 'Amur Oblast', 'Амурская обл.'),
	(330, 'Arkhangelsk Oblast', 'Архангельская обл.'),
	(340, 'Astrakhan Oblast', 'Астраханская обл.'),
	(350, 'Belgorod Oblast', 'Белгородская обл.'),
	(360, 'Bryansk Oblast', 'Брянская обл.'),
	(370, 'Vladimir Oblast', 'Владимирская обл.'),
	(380, 'Volgograd Oblast', 'Волгоградская обл.'),
	(390, 'Vologda Oblast', 'Вологодская обл.'),
	(400, 'Voronezh Oblast', 'Воронежская обл.'),
	(410, 'Ivanovo Oblast', 'Ивановская обл.'),
	(420, 'Irkutsk Oblast', 'Иркутская обл.'),
	(430, 'Kaliningrad Oblast', 'Калининградская обл.'),
	(440, 'Kaluga Oblast', 'Калужская обл.'),
	(450, 'Kemerovo Oblast', 'Кемеровская обл.'),
	(460, 'Kirov Oblast', 'Кировская обл.'),
	(470, 'Kostroma Oblast', 'Костромская обл.'),
	(480, 'Kurgan Oblast', 'Курганская обл.'),
	(490, 'Kursk Oblast', 'Курская обл.'),
	(500, 'Leningrad Oblast', 'Ленинградская область'),
	(510, 'Lipetsk Oblast', 'Липецкая обл.'),
	(520, 'Magadan Oblast', 'Магаданская обл.'),
	(530, 'Moscow Oblast', 'Московская обл.'),
	(540, 'Murmansk Oblast', 'Мурманская обл.'),
	(550, 'Nizhny Novgorod Oblast', 'Нижегородская обл.'),
	(560, 'Novgorod Oblast', 'Новгородская обл.'),
	(570, 'Novosibirsk Oblast', 'Новосибирская обл.'),
	(580, 'Omsk Oblast', 'Омская обл.'),
	(590, 'Orenburg Oblast', 'Оренбургская обл.'),
	(600, 'Oryol Oblast', 'Орловская обл.'),
	(610, 'Penza Oblast', 'Пензенская обл.'),
	(620, 'Pskov Oblast', 'Псковская обл.'),
	(630, 'Rostov Oblast', 'Ростовская обл.'),
	(640, 'Ryazan Oblast', 'Рязанская обл.'),
	(650, 'Samara Oblast', 'Самарская обл.'),
	(660, 'Saratov Oblast', 'Саратовская обл.'),
	(670, 'Sakhalin Oblast', 'Сахалинская обл.'),
	(680, 'Sverdlovsk Oblast', 'Свердловская обл.'),
	(690, 'Smolensk Oblast', 'Смоленская обл.'),
	(700, 'Tambov Oblast', 'Тамбовская обл.'),
	(710, 'Tver Oblast', 'Тверская обл.'),
	(720, 'Tomsk Oblast', 'Томская обл.'),
	(730, 'Tula Oblast', 'Тульская обл.'),
	(740, 'Tyumen Oblast', 'Тюменская обл.'),
	(750, 'Ulyanovsk Oblast', 'Ульяновская обл.'),
	(760, 'Chelyabinsk Oblast', 'Челябинская обл.'),
	(770, 'Yaroslavl Oblast', 'Ярославская обл.'),
	(810, 'Jewish Autonomous Oblast', 'Еврейская АО'),
	(820, 'Nenets Autonomous Okrug', 'Ненецкий  АО'),
	(830, 'Khanty–Mansi Autonomous Okrug – Yugra', 'Ханты-Мансийский АО - Югра'),
	(840, 'Chukotka Autonomous Okrug', 'Чукотский АО'),
	(850, 'Yamalo-Nenets Autonomous Okrug', 'Ямало-Ненецкий АО')

	/* Заполняем список областей */
INSERT INTO [StateProvince]
           ([CountryId]
           ,[Name]
           ,[Published]
           ,[DisplayOrder])
	SELECT    
		@russia_code, 
		english_name, 
		1, 
		sort_position   
	FROM #provinces


SET @start_id = @@IDENTITY - @@ROWCOUNT 

/* Заполняем переводы областей на русский язык*/
INSERT INTO [LocalizedProperty]
           ([EntityId]
           ,[LanguageId]
           ,[LocaleKeyGroup]
           ,[LocaleKey]
           ,[LocaleValue])
	SELECT 
		@start_id + P_ID, 
		@language_code, 
		'StateProvince', 
		'Name', 
		russian_name  
	FROM #provinces

DROP TABLE #provinces

END TRY
BEGIN CATCH 
	SELECT
        ERROR_NUMBER() AS ErrorNumber
        ,ERROR_SEVERITY() AS ErrorSeverity
        ,ERROR_STATE() AS ErrorState
        ,ERROR_LINE() AS ErrorLine
        ,ERROR_MESSAGE() AS ErrorMessage;
END CATCH;

Zoneminder и IP камеры Geovision GV-BL110D и GV-MFD130

В качестве сервера видеонаблюдения у меня выступает:
root@zoneminder:~# uname -srm
Linux 3.2.0-23-generic-pae i686
root@zoneminder:~# lsb_release -a
No LSB modules are available.
Distributor ID:	Ubuntu
Description:	Ubuntu 12.04 LTS
Release:	12.04
Codename:	precise

root@zoneminder:~# dpkg -l|grep zonem
ii  zoneminder                         1.25.0-1                      Linux video camera security and surveillance solution


В настройках камер идем в
«События и тревожные оповещения — RTSP» ставим галку

Далее в настройках Zoneminder жмем «Добавить монитор»


На вкладке Source вбиваем
rtsp://guest:guest@192.168.0.31:8554/CH001.sdp


*обратите внимание на разрешение, соответствующее должно быть и в настройках камеры
Собственно все

Asterisk + H.323 + Энфорта

Небольшой сказ о том, как подружить сабжевую связку.
И так, имеем:
*CLI> core show version 
Asterisk 1.8.15.0 built by root


*CLI> module show like 323
Module                         Description                              Use Count 
chan_ooh323.so                 Objective Systems H323 Channel           0         
1 modules loaded


Конфиг
# cat /etc/asterisk/ooh323.conf
[general] 
;tracelevel=7
port=1720 
bindaddr=172.25.42.50 
h323id=enforta 
e164=90073843ХХХХХХ
callerid=ХХХХХХ
gateway=no 
gatekeeper=DISABLE 
faststart=yes
h245tunneling=yes
logfile=/var/log/asterisk/h323_log 
context=incoming 
rtptimeout=60 
disallaw=all
allow=alaw:30
dtmfmode=rfc2833
dtmfcodec=127
tunneling=cisco

[enforta] 
type=friend
ip=172.24.42.6
port=1720

* ХХХХХХ — это мой 6-и значный номер, светить не буду

Если словили вот такую ошибку(в логе — /var/log/asterisk/h323_log)
22:00:13:328  Received H.2250 Message = {
22:00:13:328     protocolDiscriminator = 8
22:00:13:328     callReference = 73
22:00:13:328     from = destination
22:00:13:328     messageType = 5a
22:00:13:328     Cause IE = {
22:00:13:328        Q931InvalidNumberFormat
22:00:13:328     }


Проверяйте параметр e164 в настройках ooh323.conf

Asterisk 1.8. CDR в MySQL. (cdr_adaptive_odbc)

Для того, чтобы сабж заработал необходимо поставить
aptitude install unixodbc-dev libmyodbc

затем собрать астера включив



Конфиги:
/etc/asterisk/res_odbc.conf

[asterisk]
enabled => yes
dsn => MySQL-asterisk
username => asterisk_user
password => 232d2edxse3e


cdr_adaptive_odbc.conf

[cdr_adaptive_connection]
connection=asterisk
table=cdr
alias start => calldate


/etc/odbc.ini
[MySQL-asterisk]
Description = MySQL Asterisk database
;Trace = Off
;TraceFile = stderr
Driver = MySQL
Server = localhost
User = asterisk_user
Password = 232d2edxse3e
;Port = 3306
Socket = /var/run/mysqld/mysqld.sock
Database = asterisk


/etc/odbcinst.ini
[MySQL]
Description = MySQL driver
Driver = /usr/lib/odbc/libmyodbc.so
Setup = /usr/lib/odbc/libodbcmyS.so
CPTimeout =
CPReuse =

*для x64
[MySQL]
Description = MySQL driver
Driver = /usr/lib/i386-linux-gnu/odbc/libmyodbc.so
Setup = /usr/lib/i386-linux-gnu/odbc/libodbcmyS.so 
CPTimeout =
CPReuse =


Идем в мускул, создадим базу
mysql> create database asterisk;
mysql> use asterisk;
mysql> CREATE TABLE `cdr` (   `id` int(9) unsigned NOT NULL auto_increment,   `calldate` datetime NOT NULL default '0000-00-00 00:00:00',   `clid` varchar(80) NOT NULL default '',   `src` varchar(80) NOT NULL default '',   `dst` varchar(80) NOT NULL default '',   `dcontext` varchar(80) NOT NULL default '',   `channel` varchar(80) NOT NULL default '',   `dstchannel` varchar(80) NOT NULL default '',   `lastapp` varchar(80) NOT NULL default '',   `lastdata` varchar(80) NOT NULL default '',   `duration` int(11) NOT NULL default '0',   `billsec` int(11) NOT NULL default '0',   `disposition` varchar(45) NOT NULL default '',   `amaflags` int(11) NOT NULL default '0',   `accountcode` varchar(20) NOT NULL default '',   `uniqueid` varchar(32) NOT NULL default '',   `userfield` varchar(255) NOT NULL default '',   PRIMARY KEY  (`id`),   KEY `calldate` (`calldate`),   KEY `accountcode` (`accountcode`),   KEY `uniqueid` (`uniqueid`),   KEY `dst` (`dst`),   KEY `src` (`src`) ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=latin1;
mysql> grant all on asterisk.* to 'asterisk_user'@'localhost' identified by '232d2edxse3e';
mysql> \q
Bye


Рестартнем астера, проверим
*CLI> odbc show asterisk 

ODBC DSN Settings
-----------------

  Name:   asterisk
  DSN:    MySQL-asterisk
    Last connection attempt: 1970-01-01 07:00:00
  Pooled: No
  Connected: Yes


позвоним и смотрим
# mysql -e "select * from cdr;" -u root -p asterisk
Enter password: 
+----+---------------------+-----------------------------+-------+------+-----------+--------------------+--------------------+---------+--------------+----------+---------+-------------+----------+-------------+--------------+-----------+
| id | calldate            | clid                        | src   | dst  | dcontext  | channel            | dstchannel         | lastapp | lastdata     | duration | billsec | disposition | amaflags | accountcode | uniqueid     | userfield |
+----+---------------------+-----------------------------+-------+------+-----------+--------------------+--------------------+---------+--------------+----------+---------+-------------+----------+-------------+--------------+-----------+
|  1 | 2012-09-10 12:54:57 | "Romanenko Eugene" <user1> | user1 | 117  | employees | SIP/user1-00000000 | SIP/gsm1-00000001  | Dial    | SIP/gsm1/117 |       21 |      19 | ANSWERED    |        3 |             | 1347256497.0 |           |
|  2 | 2012-09-10 13:11:07 |                             |       | 8255 | incoming  | SIP/gsm1-00000002  | SIP/user1-00000003 | Dial    | SIP/user1,,m |       41 |      37 | ANSWERED    |        3 |             | 1347257467.2 |           |
+----+---------------------+-----------------------------+-------+------+-----------+--------------------+--------------------+---------+--------------+----------+---------+-------------+----------+-------------+--------------+-----------+


Все пишется =)

Сетевой принтер сваливается в состояние "Автономная работа"

Один из сетевых принтеров ВНЕЗАПНО в ОС Windows стал переходить в состояние «Автономная работа». Помогал рестарт «Диспетчера очереди печати», но только на несколько секунд.
Оказалось, что стандартный сетевой порт принтера в ОС Windows имеет возможность настройки параметров взаимодействия с принтером по SNMP-протоколу. Причем по умолчанию эта фитча включена, а порт использует имя сообщества public для общения с принт-контроллером принтера.




Если же в сетевом принт-контроллере принтера (в самой железке) SNMP-протокол отключен или сообщество имеет имя, отличное от заданного в свойствах сетевого порта принтера ОС Windows, то, система, не сумев опросить принтер, переведет его в состояние «Автономная работа». Именно это и произошло в моем случае, когда я изменил имя сообщества в настройках принт-контроллера.

Проблемы с отправкой почты из Outlook после установки обновлений, дубль три (kb2794707)

Очередная порция обновлений, прилетевших в сентябре, привела к уже встречавшимся ранее результатам:
При попытке отправить письмо из MS Outlook получаем сообщение об ошибке «0x800ccc13 Cannot connect to the network. Verify your network connection or modem». При этом, что самое удивительное, если в свойствах учетной записи электронной почты выполнить тестирование учетной записи, нажав соответствующую кнопку, то тестовое сообщение успешно отправляется. Запуск MSOutlook в безопасном режиме не дает положительных результатов, письма не уходят. Никакого exchange-сервера у нас не используется, учетная запись электронной почты использует SMTP-сервер в качестве сервера исходящей почты. Опытным путем было установлено, что к проблемам на сей раз приводит установка обновления kb2794707.
Вышеозначенная проблема замечена только на тех компьютерах, где встречается следующая комбинация ПО:
• Windows 7 x64
• MS Office 2010 x86
• VipNet (разных версий)
Есть подозрение, что проблема возникает именно из-за какой-то несовместимости с VipNet’ом, но, к сожалению, мы не можем отказаться от его использования. Проверка этой гипотезы (путем удаления VipNet’а с проблемных машин) не проводилась.

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

Акция для студентов (ИТ-образование доступно )
Предложение только для студентов и только для тех, кто МЕЧТАЕТ стать сертифицированным специалистом Microsoft
Ты студент 3, 4 или 5 курса? Уже начинаешь задумываться о дальнейшем трудоустройстве? Хочется соответствовать мировым профессиональным стандартам?
Программа льготного обучения студентов по продуктам Microsoft, создана с целью поддержки молодых людей в получении качественного образования. Участие в программе позволяет студентам получить уникальную возможность пройти авторизованное обучение на любом курсе MS в любой точке России со скидкой 80% от его коммерческой стоимости.

Место проведения: Москва, Санкт-Петербург, Волгоград, Воронеж, Иркутск, Казань, Краснодар, Красноярск, Нижний Новгород, Новосибирск, Пермь, Ростов-на-Дону, Ставрополь, Тюмень, Уфа, Хабаровск, Челябинск.

Акция продлена до 31 октября

"Очистка базы логов"

Название топика взято из формулировки задачи=)

В один прекрасный момент свалилось мне на почту такое письмо
"Посмотри, пожалуйста, описание задачки по автоматизации очистки базы логов.

Сервер – БД — Для очистки регламентным заданием таблиц логов в , необходима SQL процедура.
На вход процедура принимает параметры:
ПолеПериод
ИмяТаблицы
ДатаУдаления
ДатаУдаленияПо(Необязательный, если задан то данные удаляются в промежутке между ДатаУдаления и ДатаУдаленияПо, если не задан то удаляются данные меньше ДатаУдаления)
Порция(по умолнчанию можно 10000 записей)

Возвращать результат, числом (какие еще варианты?):
-1 (Нет данных для удаления)
КоличествоУдаленныхДанных"



После разговора с инициатором задачи получилась следующая картина.