Строки шаблонов для регулярных выражений в правилах транспорта MS Exchange

Строка шаблона Описание
\S Строка шаблона \S соответствует любому единичному символу, который не является пробелом.
\s Строка шаблона \s соответствует единичному символу пробела.
\D Строка шаблона \D соответствует любой цифре, которая не является числом.
\w Строка шаблона \w соответствует любому символу Юникода, который не является буквой или цифрой.
| Вертикальная черта (|) выполняет функцию операции ИЛИ.
* Подстановочный знак () соответствует отсутствию предыдущего символа или одному либо нескольким его вхождениям. Например, abc соответствует следующим строкам: ac, abc, abbbbc.
( ) Скобки выступают в роли группирующего разделителя. Например, a(bc)* соответствует следующим строкам: a, abc, abcbc, abcbcbc и так далее.
\ Обратная косая черта () является escape-символом, который используется вместе со специальным символом. Специальные символы — это приведенные ниже символы, которые используются в строках шаблона.

 

  • Обратная косая черта: \
  • Вертикальная черта: |
  • Звездочка: *
  • Открывающая скобка: (
  • Закрывающая скобка: )
  • «Крышка»: ^
  • Доллар: $

Например, если нужно найти строку, которая содержит (525), следует указать (525).

\\ Если нужно, чтобы символ обратной косой черты распознавался как таковой, а не как escape-символ, следует ввести две косые черты. Например, если нужно найти строку, которая содержит \d, следует указать \d.
^ Символ «крышка» (^) указывает, что следующая за этим символом строка шаблона должна располагаться в начале сопоставляемой текстовой строки. Например, ^fred@contoso соответствует fred@contoso.com и fred@contoso.co.uk, но не alfred@contoso.com.
Этот символ может использоваться также в сочетании с символом доллара ($). В этом случае он указывает, что требуется точное соответствие строке. Например, ^kim@contoso.com$ соответствует только kim@contoso.com и никакой другой строке, в частности, не соответствует строке kim@contoso.com.au.
$ Символ доллара ($) указывает, что предыдущая строка шаблона должна находиться в конце сопоставляемой текстовой строки. Например, contoso.com$ соответствует adam@contoso.com и kim@research.contoso.com, но не kim@contoso.com.au.
Этот символ также может использоваться в сочетании с символом «крышка» (^). В этом случае он указывает, что требуется точное соответствие строке. Например, ^kim@contoso.com$ соответствует только kim@contoso.com и никакой другой строке, в частности, не соответствует строке chris@sales.contoso.com.
Рубрика: Без рубрики | Метки: , , | Добавить комментарий

Смена глобальной папки модулей Node.JS

По умолчанию глобальные модули ставятся в папку C:\Users\{username}\AppData\Roaming\npm
Для смены пути для модулей необходимо:

  1. В папке профиля C:\Users\{username}\ создать файл с названием .npmrc
  2. В файле прописать строчку: prefix = «C:\\path_to_npm_modules»
  3. Проверить правильно ли всё прописалось можно командой: npm config ls -l
Рубрика: Короткие заметки | Добавить комментарий

Конвертер DBF в MySQL на PHP

Конвертер находится по адресу: https://github.com/nchizhov/DBFtoMySQL

Описание

Скрипт предназначен для конвертирования файлов DBASE/FoxPro в MySQL таблицы (с поддержкой MEMO-полей). Используется библиотека iDBF (описание библиотеки находится в папке classes/iDBF)

Инструкция

  1. Отредактируйте файл конфигурации, расположенный в import.php:
    • db_host — адрес MySQL-сервера (по-умолчанию localhost)
    • db_port — порт MySQL-сервера (по-умолчанию 3306)
    • db_username — пользователь на MySQL-сервере (по-умолчанию root)
    • db_password — пароль пользователя MySQL-сервера (по-умолчанию empty)
    • db_name — название БД на MySQL-сервере (необходимо)
    • db_charset — кодировка для таблиц MySQL (по-умолчанию utf8)
    • dbf_path — путь до папки с DBF-файлами (необходимо)
    • dbf_list — список импорта DBF-файлов: без расширений, регистронезависимо. Если указано null, то импортирует все DBF-файлы с папки (по-умолчанию null)
    • table_prefix — добавление префикса к названию таблиц (по-умолчанию null)
    • key_field — добавление индекса после импорта к полю с указанным названием (по-умолчанию null)
    • columns_only — импорт только список столбцов в таблицы из DBF-файлов (по-умолчанию false)
    • deleted_records — импортирование помеченных на удаление записей: создает столбец с названием ‘deleted’ (по-умолчанию false)
    • verbose — отображение процесса импорта в консоли (по-умолчанию true)
    • log_path — путь до log-файла. Если null, то log-файл пишется в текущую директорию скрипта (по-умолчанию текущая директория скрипта)
  2. Запуск скрипта:
    /path/to/php import.php

Примечания

  1. Пустые поля, типа Dates и TimeDate — конвертируются в NULL
  2. Поля типа General и Picture импортируются в BLOB-поля
  3. Логические поля со значениями: ‘t’, ‘y’, ‘д’ конвертируются в ‘1’, все остальные — в ‘0’
  4. MEMO-поля импортируются в TEXT-поля
Рубрика: Без рубрики | Добавить комментарий

Web-приложение Asterisk Call Viewer

Само приложение можно взять отсюда: https://github.com/nchizhov/Asterisk-Call-Viewer

Описание

Web-приложение для просмотра в реальном времени активности телефонных номеров Asterisk’а.

Скриншот интерфейса

2016-01-25 08-42-21 Активность звонков v.2 — Opera_censored

Способ установки

  1. Склонировать репозиторий
  2. Поместить содержимое папки web в директорию на Web-Сервере

Настройки

  1. Отредактировать файл daemon/config.py:
    config = {'host': '192.168.50.250', # IP-адрес AMI Asterisk 
              'port': 5038, # Порт AMI Asterisk 'login': 
              'nikolay', # Логин AMI Asterisk 
              'secret': 'qwerty'} # Пароль AMI Asterisk
    
  2. Отредактировать файл daemon/wraps_config.py:
    config = {'ws_port': 8888}		# Порт WebSocket-сервера
    

    Остальные строки данного конфигурационного файла предназначены для примера обработки событий поступающих с AMI Asterisk’а.

  3. В файле daemon/py-ami.py в функцию wrap_list добавлять свои обработки событий. Примеры:
    self.ami.wrapper({'PeerStatus': {'function': self.wraps.peer_status}})
    

    или

    self.ami.wrapper({'PeerStatus': {'function': self.wraps.peer_status,
                                     'filter': {'PeerStatus': 'Registered'}}})
    

    где ‘PeerStatus’ — это событие из AMI Asterisk’а

    function — указывает на функцию, которая будет обрабатывать данное событие, в функцию передается в виде массива дополнительные данные по данному событию

    filter — дополнительный фильтр по данному событию

    Также есть возможность отменять обработку событий. Пример удаления всех событий с данным названием:

    self.ami.unwrapper('Dial')
    

    Пример удаления всех событий с дополнительным фильтром:

    self.ami.unwrapper({'Dial': {'filter': {'SubEvent': 'End'}}})
    
  4. Запустить AMI-демона командой daemon/py-ami.py start. Параметры командной строки демона:
    • start — Запуск демона
    • stop — Остановка демона
    • restart — Перезапуск демона
  5. Файл index.html в скопированной папке на Web-Сервер отредактировать, указав IP-адрес и порт WebSocket-сервера:
    var ws_ip = "192.168.0.7";
    var ws_port = "8888";
    

Зависимости

  • Python > 2.5
Рубрика: Без рубрики | Добавить комментарий

Сертификат eJabberd с запросом в центре сертификации Active Directory

  1. Генерируем запрос в центр сертификации на выдачу сертификата: 
    openssl req -nodes -newkey rsa:2048 -keyout server.key -out server.csr

    При этом появится запрос на информацию о сертификате:

    Country Name (2 letter code) [XX]:RU
    State or Province Name (full name) []:Default
    Locality Name (eg, city) [Default City]:Default City
    Organization Name (eg, company) [Default Company Ltd]:Default Company Ltd
    Organizational Unit Name (eg, section) []:IT
    Common Name (eg, your name or your server's hostname) []:example.com
    Email Address []:
    

    В поле Common Name указывается домен для которого генерируется сертификат

  2. Копируем в буфер обмена содержимое файла server.csr
  3. В центре сертификации на сервере по адресу http://127.0.0.1/certsrv выбираем: Запрос сертификата -> Расширенный запрос сертификата -> Выдать запрос, используя base-64 шифрованный файл
    В поле Сохраненный запрос вставляем содержимое файла server.csr
    Шаблон сертификата выбираем: Веб-сервер
    Нажимаем Выдать и в новом окне выбираем: Загрузить цепочку сертификатов
  4. Сохраняем полученный файл newcert.p7b на сервере в папке, где производилось генерирование запроса на сертификат
  5. Конвертируем p7b цепочку сертификатов в pem-формат:
    openssl pkcs7 -inform DER -outform PEM -in newcert.p7b -print_certs > chain.pem
  6. Делаем ценпочку сертификатов для eJabberd:
    cat server.key >> ejabberd.pem
    cat chain.pem >> ejabberd.pem
  7. Указываем путь до полученного сертификата в файле ejabberd/conf/ejabberd.cfg:
    {listen,
      [
        {5222, ejabberd_c2s, [
                               {certfile, "путь_до_файла"}, starttls, ...
    
  8. Перегружаем службу eJabberd
Рубрика: Администрирование | Добавить комментарий

PHPStorm и UglifyJS

Для предотвращения создания кучи файлов .min.min.*.js при использовании UglifyJS в File Watchers, необходимо в File->Settings->Appearance & Behavior->Scopes создать новый Scope c условием: file:*.js&&!file:*.min.js и изменить текущий Scope в File Watcher с UglifyJS

Рубрика: Короткие заметки | Метки: , | Добавить комментарий

Заметка по установке GitLab под Fedora 22 Server

1. Установить следующие пакеты:

dnf install @development-tools zlib-devel openssl-devel gdbm-devel readline-devel ncurses-devel libffi-devel redis libxml2-devel libxslt-devel libcurl-devel libicu-devel mariadb-server mariadb mariadb-devel ruby rubygem-bundler ruby-devel patch gcc-c++ libyaml-devel python-docutils cmake nodejs krb5-libs krb5-devel postfix

2. Создать пользователя:

adduser -r -m -U -c 'GitLab' git

3. Далее Gitlab ставится согласно официальной документации: https://github.com/gitlabhq/gitlabhq/blob/master/doc/install/installation.md

Для установки Gitlab совместно с Apache, а не Nginx:

1. Установить пакеты:

dnf install mod_passenger

2. Установить gem:

gem install --no-user-install passenger

3. Настроить виртуальный хост для Apache:

<IfModule mod_passenger.c>
   PassengerRoot /usr/share/passenger//phusion_passenger/locations.ini
   PassengerRuby /usr/bin/ruby
</IfModule>

<VirtualHost *:80>

    ServerName test.git
    DocumentRoot /home/git/gitlab/public
    <Directory /home/git/gitlab/public>
        AllowOverride All
        Options All
        Allow from all
    </Directory>
    ProxyPass / http://localhost:8080/
    ProxyPassReverse / http://localhost:8080/
    ProxyPreserveHost On
    ErrorLog  logs/gitlab_error.log
    CustomLog logs/gitlab_access.log combined
</VirtualHost>

 

Рубрика: Короткие заметки | Метки: , , , | Добавить комментарий

Заметки по работе с Git

Клонирование репозитария:

git clone git://git_remote/ticgit.git

Создание нового репозитария:

git init project-name

Добавление файла в репозитарий:

git add file.php

Удаление файла с репозитария:

git rm file.php

Текущее состояние репозитария:

git status

Сделать коммит в репозитарий:

git commit -m "Commit description"

Отправить все ветки локального репозитария в удаленный:

git push origin

Отправить конкретную ветку в удаленный репозитарий:

git push origin repo_name

Получить все удаленные ветки в локальный репозитарий:

git pull origin

Получить удаленную ветку в локальный репозитарий:

git pull origin repo_name

Начать работу с новой веткой в репозитарии:

git checkout -b branch_name

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

git checkout another_branch

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

git branch

Слияние ветки some_branch в текущую ветку:

git merge some_branch

Удалить ветку после слияния:

git branch -d branch_name

Последние изменения в репозитарии:

git log

Разрешение конфликтов при слиянии веток:

git mergetool

 

Рубрика: Короткие заметки | Добавить комментарий

Dinstar DWG SMS API на Python2

Сам скрипт для Python можно взять здесь:  https://github.com/nchizhov/DINSTAR-DWG-PYTHON-D

Изменение конфигурации осуществляется правкой файла dwgconfig.py:

port = 12000                                                    # Порт DWG-шлюза
login = 'test'                                                  # Логин DWG-шлюза (API > 2.0)
password = 'test'                                               # Пароль DWG-шлюза (API > 2.0)
income_path = '/var/spool/dwgp/incoming/'                       # Папка для принимаемых SMS-сообщений
send_path = '/var/spool/dwgp/send/'                             # Папка для отправляемых SMS-сообщений
ussd_income_path = '/var/spool/dwgp/ussd_incoming/'             # Папка для принимаемых USSD-сообщений
ussd_send_path = '/var/spool/dwgp/ussd_send/'                   # Папка для отправляемых USSD-сообщений
run_program = '/etc/local_scripts/radius2.php'                  # Путь к программе для обработки принимаемых сообщений
debug = True                                                    # Включение/отключение режима отладки

pidfile = '/var/run/dwg_server.pid'                             # Путь к PID-файлу
logfile = '/var/log/dwg_server.log'                             # Путь к Log-файлу

Использование:

  1. Запуск программы /path/to/script/dwg.py с аргументами:
    • debug — запуск в режиме отладки в консоли
    • start — запуск в режиме демона
    • stop — остановка демона
    • restart — перезапуск демона
    • help — показывает справку по аргументам скрипта
  2. Формат файла отправки SMS-сообщения (файл должен быть в UTF-8 формате):
    • Первая строка — Номер телефона, куда отправляется SMS
    • Вторая строка — Порт шлюза, через который отправлять
    • Третья и последующие строки — Сообщение для отправки
  3. Получение сообщений идет в eml-формате.
  4. Формат файла отправки USSD-команды (файл должен быть в UTF-8 формате):
    • Первая строка — Порт шлюза, через который отправлять USSD-команду
    • Вторая строка — USSD-команда (например: *100#)
  5. Получение сообщения USSD-команды идет в eml-формате
Рубрика: Без рубрики | 20 комментариев

Аналог функции characters_to_binary из Erlang в JavaScript

Возможно кому-нибудь пригодится аналог функции characters_to_binary из языка Erlang в Javascript (использовалось для автоматического добавления общих групп в базу данных ejabberd):

function char_to_binary(text)
{
 var binary = new Array();
 for (var i = 0; i < text.length; i++)
 {
   var symbol = text.charAt(i);
   if (symbol.charCodeAt(0) < 128) var code = "%" + symbol.charCodeAt(0).toString(16)
   else var code = encodeURIComponent(symbol);
   binary.push(parseInt(code.substring(1,3), 16));
   if (code.length > 3) binary.push(parseInt(code.substring(4,6), 16));
 }
 return binary;
}

Данная функция возвращает бинарные данные в виде массива.

Пример использования:

var bin = char_to_binary("Тест").join(',');
Рубрика: Короткие заметки | Добавить комментарий