Управление передачей сообщений Exchange Server 2013 Александр Пичкасов Листинг 1 $mbx1 = (Get-MailboxServer)[0] $mbx2 = (Get-MailboxServer)[1] $mdb1mbx1 = (Get-MailboxDatabase -Server $mbx1)[0] $mdb1mbx2 = (Get-MailboxDatabase -Server $mbx2)[0] $ad0=(Get-AcceptedDomain)[0] $pass = ConvertTo-SecureString 'Pa$$w0rd' –AsPlainText –Force #Создание почтовых ящиков на разных серверах New-Mailbox -Name "Alberto" -LastName "Serra" -Database $mdb1mbx1 -Password $pass -ResetPasswordOnNextLogon $false -DisplayName "Alberto Serra" -Alias alberto -UserPrincipalName "alberto@$ad0" New-Mailbox -Name "Augusto" -LastName "Cavalli" -Database $mdb1mbx2 -Password $pass -ResetPasswordOnNextLogon $false -DisplayName "Augusto Cavalli" -Alias augusto -UserPrincipalName "augusto@$ad0" #Временное отключение теневой избыточности Set-TransportConfig -ShadowRedundancyEnabled $false Листинг 2 #Получение и вывод информации о передаче сообщения #из журналов трассировки всех доступных серверов Get-TransportService | Get-MessageTrackingLog -Sender alberto@$ad0 -Recipients augusto@$ad0 -MessageSubject "Mail flow test message" | Sort TimeStamp,ClientHostname,ServerHostname | fl ClientHostname, ServerHostname, ConnectorId, Source, EventId, Timestamp #Включение механизма теневой избыточности Set-TransportConfig -ShadowRedundancyEnabled $true Листинг 3 #Имя почтового домена в сети Интернет $publicdomain = ($ad0.name.replace(".","-")) + ".ru" #Создание нового обслуживаемого домена New-AcceptedDomain -Name $publicdomain -DomainName $publicdomain -DomainType Authoritative #Создание политики адресов электронной почты New-EmailAddressPolicy -Name "Public domain policy" -EnabledPrimarySMTPAddressTemplate "SMTP:@$publicdomain" -IncludedRecipients AllRecipients Update-EmailAddressPolicy "Public domain policy" Листинг 4 #Прямое указание адресов DNS-серверов, используемых для разрешения внешних имен транспортными службами организации Get-TransportService | Set-TransportService -ExternalDNSAdapterEnabled $false –ExternalDNSServers 8.8.8.8 #Создание коннектора отправки для внешней почты New-SendConnector -name "Internet" -AddressSpaces "*" -Internet -UseExternalDNSServersEnabled $true -SourceTransportServers $mbx1,$mbx2 -FrontendProxyEnabled $true #Создание коннектора отправки, использующего промежуточные узлы New-SendConnector -name "Internet(SmartHost)" -AddressSpaces "example.com" -Internet -UseExternalDNSServersEnabled $true -SourceTransportServers $mbx1,$mbx2 -FrontendProxyEnabled $true -SmartHosts 10.10.0.10,10.20.0.10 Листинг 5 #Выполняется на сервере пограничного транспорта New-EdgeSubscription –FileName c:\EdgeSubscription.xml Листинг 6 #Выполняется на внутреннем сервере организации [byte[]]$Temp = Get-Content -Path "C:\EdgeSubscription.xml" -Encoding Byte -ReadCount 0 New-EdgeSub Листинг 7 #Создание коннектора для анонимного доступа New-ReceiveConnector -Name "Open Relay Connector 1" -Usage Custom -PermissionGroups AnonymousUsers -Bindings 0.0.0.0:25 -RemoteIpRanges 192.168.0.1 -TransportRole FrontendTransport #Назначение разрешений, позволяющих открытую ретрансляцию Get-ReceiveConnector "Open Relay Connector 1"| Add-ADPermission -User "NT AUTHORITY\ANONYMOUS LOGON" -ExtendedRights "Ms-Exch-SMTP-Accept-Any-Recipient" #Создание коннектора открытой ретрансляции указанием набора параметров New-ReceiveConnector -Name "Open Relay Connector 2" -Usage Custom -AuthMechanism ExternalAuthoritative -PermissionGroups ExchangeServers -Bindings 0.0.0.0:25 -RemoteIpRanges 192.168.0.10 -TransportRole FrontendTransport Листинг 8 # Входные параметры для выполнения param([string]$server="localhost", [int]$port=25) # Функция посимвольной передачи строки подготовленному объекту сетевого сокета function write-stream([System.Net.Sockets.NetworkStream]$ns, [String]$s) { $arr = "$s`r`n".ToCharArray() $ns.Write($arr, 0, $arr.Length) } $client = New-Object System.Net.Sockets.TcpClient $client.Connect($server,$port) $stream = $client.GetStream() $sreader = New-Object System.IO.StreamReader($client.GetStream()) $rl = $sreader.ReadLine() if ($rl -notlike "220 *"){throw "Unable to connect: $rl"} else{$rl} Do { $sendstring = Read-Host write-stream $stream $sendstring $rl=$sreader.ReadLine() $rl if ($rl -like "354 *"){ Do { $sendstring = Read-Host write-stream $stream $sendstring } until ($sendstring -eq ".") $rl=$sreader.ReadLine() $rl } } until ($sendstring -eq "quit") Write-Host ----------------------------------------------------------------------------------------- Паллиатив для аккумуляторных батарей Владимир Закляков # rpm -Uvh http://dl.fedoraproject.org/pub/epel/6/i386/epel-release-6-8.noarch.rpm # yum install apcupsd UPSCABLE usb UPSTYPE usb DEVICE UPSCABLE 940-0024C UPSTYPE apcsmart DEVICE /dev/ttyXX $ dmesg|grep tty -n1 $ lsusb # service apcupsd stop # /sbin/apctest # /sbin/apctest # service apcupsd status # service apcupsd start ----------------------------------------------------------------------------------------- Создание сайта вики-семейства. Википедия по своим правилам. Пошаговая инструкция. Шаг 2 Павел Малахов " echo " или: $0 []" echo "" echo " – каталог с файлами движка MediaWiki, не обязательный параметр, по умолчанию = '$mw'" echo "" echo "Расположение вики: $base/w-" fi $ new_wiki.sh main # Rules to rewrite URL RewriteEngine On RewriteRule ^/*$ /w-main/index.php [L,QSA] RewriteRule ^main/(.*)$ /w-main/index.php?title=$1 [PT,L,QSA] RewriteRule ^main/*$ /w-main/index.php [L,QSA] –SipAddress Enable-CsUser –Identity "Дудкин Виктор Андреевич" –RegistrarPool b-lync01.es –SipAddress sip:dudkin@es Disable-CsUser Disable-CsUser dudkin@es. Set-CsUser –Identity или "имя" -EnterpriseVoiceEnabled $True Set-CsUser -Identity dudkin@es -EnterpriseVoiceEnabled $True Set-CsUser -Identity или "имя" –LineURI Set-CsUser -Identity dudkin@es –LineURI tel:6663477. ^666(\d{4})$ -> (987\d{4})$1 //Настройка типа карты card type e1 0 3 //Тип сигнализации ISDN isdn switch-type primary-qsig //Номер слота, где находятся платы с микросхемами DSP voice-card 0 //Включается конструкция dspfarm для DSP в слоте 0 Dspfarm //Разрешаем прохождение SIP-трафика voice service voip sip //Описание класса кодеков voice class codec 1 //Кодек европейский, предпочитаемый codec preference 1 g711alaw //Кодек американо-японский, применяется вторым codec preference 2 g711ulaw //Описание контроллера controller E1 0/3/0 //Отключаем контроль четности framing NO-CRC4 //Формирование группы. Использовать каналы с 1-го по 31-й, канал 0 – служебный pri-group timeslots 1-31 //Линия E1 настраивается как POTS, определяет характеристики соединения с обычной телефонной сетью. Определяет локальную точку вызова, которая подключается к интерфейсу POTS dial-peer voice 2000 pots //Шаблон назначения сопоставляет набранным цифрам телефонное устройство. «.» – любое количество символов, «Т» – тайм-аут destination-pattern .T //Напрямую выполнять вызов direct-inward-dial //Привязка диал-пира к физической линии, D-канал настроен на 15-й порт port 0/3/0:15 //Настраивает метод пересылки цифр. Указывает маршрутизатору направить строку набора целиком forward-digits all //Определяет характеристики соединения по сети c коммутацией пакетов. Определяет удаленную точку вызова VoIP dial-peer voice 1111 voip //Нашли нужный диал-пир и другие не ищем huntstop //Определение, откуда пришел звонок. «….» означает четыре любые цифры answer-address 666.... //Шаблон назначения сопоставляет набранные цифры destination-pattern 666.... //Применение кодеков voice-class codec 1 //Использование протокола SIPv2 session protocol sipv2 //IP-адрес SIP-сервера (Lync-сервера) session target ipv4:10.7.87.99 //По умолчанию используется протокол UDP. Изменили на TCP, так как MS Lync c UDP не работает session transport tcp //При передаче информации DTMF использовать пакеты RTP Named Telephony Event (NTE), а не голосовые dtmf-relay rtp-nte //Отменяем дополнительные функции передачи факсового трафика, вызов идет через голосовой канал fax rate disable //Отключаем функцию, которая отменяет передачу пакетов во время паузы в разговоре no vad ----------------------------------------------------------------------------------------- Практика использования хинтов в Oracle. Подстановка хинтов в SQL-запрос без модификации запроса Валерий Михеичев /*+ optimizer_features_enable=’10.2.0.5’ */ /*+ optimizer_features_enable ('11.1.0.7') */ /*+ opt_param ('_optim_peek_user_binds' 'false') */ GRANT select on v$sql to aif; GRANT execute on dbms_spm to aif; GRANT administer sql management object to aif; GRANT select on dba_sql_plan_baselines to aif; SELECT a.updated FROM aif.agrext a, aif.buhbody b WHERE a.x1=b.isn and a.agrisn=:b1 and b.dateval<= last_day(:b2) and a.classisn = c.get('AXINVESTAGRBUH'); /*+ index(b x_buhbody) */ SELECT sql_id, plan_hash_value, sql_fulltext FROM v$sql v WHERE sql_fulltext LIKE 'SELECT a.updated FROM aif.agrext a, aif.buhbody b WHERE a.x1=b.isn and a.agrisn=:b1 and b.dateval<= last_day(:b2) and a.classisn = c.get(''AXINVESTAGRBUH'')%'; SELECT /*+ index(b x_buhbody) */ a.updated FROM aif.agrext a, aif.buhbody b WHERE a.x1=b.isn and a.agrisn=:b1 and b.dateval<= last_day(:b2) and a.classisn =c.get('AXINVESTAGRBUH'); SELECT sql_id, plan_hash_value, sql_fulltext FROM v$sql v WHERE sql_fulltext LIKE 'SELECT /*+ index(b x_buhbody) */ a.updated FROM aif.agrext a, aif.buhbody b WHERE a.x1=b.isn and a.agrisn=:b1 and b.dateval<= last_day(:b2) and a.classisn = c.get(''AXINVESTAGRBUH'')%'; SELECT sql_id, plan_hash_value, child_number, sql_fulltext FROM V$SQL WHERE sql_fulltext LIKE '% a.agrisn=:b1%’ and sql_fulltext LIKE '% last_day(:b2)%’ and sql_fulltext LIKE '%AXINVESTAGRBUH %' DECLARE -- sql_id исходного запроса l_sql_id_trg varchar2(13) :='gkspub0rjcnpy'; -- sql_id подменяемого запроса l_sql_id_src varchar2(13) :='b83t2dtc9ymd1’; -- plan_hash_value подменяемого запроса l_plan_hash_value_src number := 276709323; l_sql_text_trg clob; l_res number; Begin SELECT a.sql_fulltext into l_sql_text_trg FROM v$sql a WHERE a.sql_id = l_sql_id_trg and rownum=1; -- загрузка плана и создание SQL plan baseline l_res := dbms_spm.load_plans_from_cursor_cache (sql_id => l_sql_id_src, plan_hash_value => l_plan_hash_value_src, sql_text => l_sql_text_trg); End; EXPLAIN PLAN FOR --текст исходного запроса SELECT a.updated FROM agrext a, buhbody b WHERE a.x1=b.isn and a.agrisn=:b1 and b.dateval<= last_day(:b2) and a.classisn = c.get('AXINVESTAGRBUH'); --получение результата SELECT * FROM TABLE(dbms_xplan.display(null,null, 'basic +note')); SELECT * FROM TABLE(dbms_xplan.display(null,null, 'all allstats advanced last')); SELECT created, plan_name, sql_handle, last_executed,module, sql_text FROM DBA_SQL_PLAN_BASELINES order by 1; SELECT t.* FROM TABLE(dbms_xplan.display_sql_plan_baseline('SQL_b5d17a72e124048b')) t; DECLARE l_sql_plan_baseline varchar2(30) :=’SQL_PLAN_bbnbufbhk814bd10b97f2’; l_sql_handle varchar2(30); l_res number; BEGIN SELECT sql_handle into l_sql_handle FROM dba_sql_plan_baselines b WHERE plan_name = l_sql_plan_baseline; l_res := dbms_spm.drop_sql_plan_baseline(sql_handle => l_sql_handle); END; GRANT execute on sys.dbms_sqldiag_internal to aif; GRANT execute on dbms_sqldiag to aif; GRANT select on v$sql_plan to aif; DECLARE -- sql_id исходного запроса l_sql_id_trg char(13) := 'gkspub0rjcnpy'; BEGIN -- Удаление sql-патча, если такой есть dbms_sqldiag.drop_sql_patch(name => 'patch_' || l_sql_id_trg, ignore => true); FOR cur in (SELECT sql_fulltext FROM v$sql WHERE sql_id = l_sql_id_trg) LOOP sys.dbms_sqldiag_internal.i_create_patch( sql_text => cur.sql_fulltext, hint_text=>'index(b x_buhbody)’, --текст хинта name => 'patch_'||l_sql_id_trg); --имя патча END LOOP; dbms_output.put_line('patch_'||l_sql_id_trg); END; BEGIN dbms_sqldiag.drop_sql_patch('patch_gkspub0rjcnpy'); END; EXPLAIN PLAN FOR --текст исходного запроса SELECTt a.updated FROM aif.agrext a, aif.buhbody b WHERE a.x1=b.isn and a.agrisn=:b1 and b.dateval<= last_day(:b2) and a.classisn = c.get('AXINVESTAGRBUH'); SELECT * FROM TABLE(dbms_xplan.display(format=>'+outline')); SELECT * FROM TABLE(dbms_xplan.display_cursor('gkspub0rjcnpy ',0,'all allstats advanced last')); SELECT substr(extractvalue(value(f), '/hint'), 1, 512) sql_patch_hints FROM xmltable('/outline_data/hint' passing (Select xmltype(comp_data) xmlval FROM sys.sqlobj$data a, sys.sqlobj$ b WHERE a.obj_type = 3 and b.obj_type = 3 and b.signature = a.signature and comp_data is not null and b.name = 'patch_brbhzv4mu55sk')) f; BEGIN sys.dbms_sqldiag_internal.i_create_patch(sql_text => ' SELECT a.updated FROM agrext a, buhbody b WHERE a.x1=b.isn and a.agrisn=:b1 and b.dateval<= last_day(:b2) and a.classisn = c.get(''AXINVESTAGRBUH'')', hint_text=>'index(b x_buhbody)', name => 'patch_1'); END; BEGIN dbms_sqldiag.drop_sql_patch('patch_1'); END; EXPLAIN PLAN FOR SELECT a.updated FROM agrext a, buhbody b WHERE a.x1=b.isn and a.agrisn=:b1 and b.dateval<= last_day(:b2) and a.classisn = c.get('AXINVESTAGRBUH'); SELECT * FROM TABLE(dbms_xplan.display(format=>'+outline')); SELECT to_char(created, 'dd.mm.yyyy hh24:mi:ss') created, name, category, status, force_matching, sql_text FROM DBA_SQL_PATCHES order by created; ----------------------------------------------------------------------------------------- Использование нейронных сетей и генетических алгоритмов в 1С Олег Филиппов hiddenLayerSize = [20 10]; trainFcn = 'trainlm'; NN = cascadeforwardnet(hiddenLayerSize,trainFcn); NN.divideParam.trainRatio = 80/100; NN.divideParam.testRatio = 10/100; NN.divideParam.valRatio = 10/100; NN.trainFcn = 'trainbr'; [NN,tr] = train(NN, Data', Targets'); genFunction(NN3,'NNFunc','MatrixOnly','yes'); [Имя библиотеки].[Имя Класса] Новый COMОбъект(«NNLib.NNClass»); ----------------------------------------------------------------------------------------- Использование технологического журнала 1С для поиска и исправления проблем с производительностью. Часть 2 Тимур Шамиладзе Листинг 1. Настройка ТЖ для расследования исключительных ситуаций Листинг 2. Пример циклической ссылки Данные= Новый Структура; Данные.Вставить(«Ключ»,Данные); Листинг 3. Отслеживание утечек памяти Листинг 4. Настройка на длительные события Листинг 5. Настройка ТЖ для ошибок в управляемом режиме НачатьТранзакцию(); Блокировка = Новый БлокировкаДанных; ЭлементБлокировки = Блокировка.Добавить("РегистрСведений.СведенияОКонтрагенте"); ЭлементБлокировки.УстановитьЗначение("Контрагент",Объект.Контрагент); ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный; Блокировка.Заблокировать(); ----------------------------------------------------------------------------------------- Еще раз про шардинг Александр Календарев CREATE TABLE tab_name_Ntab ( `id` bigint(20) NOT NULL AUTO_INCREMENT, …. /* прочие данные*/ PRIMARY KEY (`id`), … /* прочие ключи */ ) AUTO_INCREMENT= Nfirst /* вписываем конкретное число*/ return [ 'profile' => 'local', // тип профиля local | prodaction 'user' => ..., // имя пользователя 'pass' => ... // и пароль для БД (см instance) 'main' => [...] // данные подключения центральной БД 'instance' => […] // данные по каждому экземпляру БД SELECT sum(data_length+index_length), TABLE_SCHEMA. FROM information_schema.tables GROUP BY TABLE_SCHEMA; хост 0: 'db' => [ 'lines' => [0,1,4], 'months' => [0,1], ] хост 1: 'db' => [ 'lines' => [2,3], 'months' => [2,3], ] git clone https://github.com/akalend/mysql_shard.git docker pull mysql dockeer pull redis docker run --name redis -d redis docker run --name mysql -e MYSQL_ROOT_PASSWORD=12345 -d -p 127.0.0.1:3306:3306 -e MYSQL_USER=username -e MYSQL_PASSWORD=12345 mysql docker run --name mysql2 -e MYSQL_ROOT_PASSWORD=12345 -d -p 127.0.0.1:3307:3306 -e MYSQL_USER=username -e MYSQL_PASSWORD=12345 mysql mysql -u username -P 3306 -p -h 127.0.0.1 < configs/create_1.sql mysql -u username -P 3307 -p -h 127.0.0.1 < configs/create_2.sql GRANT ALL PRIVILEGES ON *.* TO 'username'@'%'; FLUSH PRIVILEGES; docker start/stop redis docker start/stop mysql docker start/stop mysql2 getConfig()); 06 $shard->query("SELECT 1", $strategy); static public function getCreateTableSQL($shard_id) static public function getDropTableSQL($shard_id) 01 $shard = new MysqlShard(); 02 $strategy = new LinearStrategy(null, 'lines', $shard->getConfig()); 03 for ($i=0; $i < 10; $i++) { 04 $query = LinesGenerator::getCreateTableSQL($i); 05 $strategy->setId($i * LinearStrategy::MAX_RECORD_COUNT +1 ); 06 $shard->query( $query, $strategy); 07 } CREATE TABLE %db.lines_0 ( id bigint unsigned NOT NULL AUTO_INCREMENT, ts int DEFAULT NULL, ua_id int DEFAULT NULL, PRIMARY KEY (id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1' 01 $sql = "CREATE TABLE `%db`.`cycle` ( `user_id` int unsigned NOT NULL, `data` VARCHAR(64) NOT NULL, KEY `idx` (`user_id`) )"; 02 $shard = new MysqlShard(); 03 $strategy = new CycleStrategy(null, 'months', $shard->getConfig()); 04 $shard->setStrategy($strategy); 05 foreach ($shard as $shardItem) { 06 $shardItem->query($sql); 07 } INSERT INTO %db.lines_%t (data) VALUES ("$data") 01 $sql = "SELECT * FROM %db.lines_%t WHERE user_id=$user_id"; 02 $shard = new MysqlShard(); 03 $strategy = new LinearStrategy($user_id, 'lines', $shard->getConfig()); 04 $res = $shard->query($sql,$strategy); 01 $sql = "SELECT * FROM %db.lines_%t WHERE city_id=$city_id"; 02 $shard = new MysqlShard(); 03 $strategy = new LinearStrategy(null, 'lines', $shard->getConfig()); 04 $shard->setStrategy($strategy); 05 $data = []; 06 foreach ($shard as $shardItem) { 07 $res = $shardItem->query($sql,$strategy); 08 while($row=$res->fetch() != null){ 09 $data[] = $row; 10 } 11 } 01 $shard = new MysqlShard(); 02 $strategy = new CycleStrategy(null, 'months', $shard->getConfig()); 03 $shard->setStrategy($strategy); 04 for ($i=0; $i < 100; $i++) { 05 $query = "INSERT INTO %db.xdata VALUES (‘****’)"; 06 $strategy->setId($i); 07 $shard->push($query); 08 } 09 $shard→flush(); 01 $shard = new MysqlShard(); 02 $strategy = new MonthStrategy($adv_id, 'months', $shard→getConfig(), date(‘Y-m’)); 03 $shard→query("SELECT * FROM %db.stats_%t WHERE adv_id=$adv_id", $strategy); ----------------------------------------------------------------------------------------- Система контроля версий Mercurial. Работа без ввода пароля Анна Сергеева ---- BEGIN SSH2 PUBLIC KEY ---- Comment: "rsa-key-20160823" AAAAB3N…………………...yFOopE= ---- END SSH2 PUBLIC KEY ---- ssh-rsa AAAAB3N…………………...yFOopE= chmod 600 authorized_keys chmod 700 .ssh PLINK.EXE -i "%USERPROFILE%\asergeeva_private.ppk" asergeeva@server pwd PLINK.EXE -i "%USERPROFILE%\asergeeva_private.ppk" asergeeva@server <команда для выполнения на сервере> [ui] ssh = "C:\Program Files\PuTTY\plink.exe" -ssh -2 -i "%USERPROFILE%\asergeeva_private.ppk" -l asergeeva hg clone --verbose ssh://asergeeva@server//home/hg/ProjectsDocs C:\Repo source: ssh://asergeeva@server//home/hg/ProjectsDocs destination: C:\Repo -----------------------------------------------------------------------------------------