...

суббота, 9 августа 2014 г.

Написание пакета для PFSense: Элементы управления

image

В предыдущей статье был рассмотрен процесс создания простого GUI пакета для pfSense. Пакет содержал одно единственное поле с элементом управления типа checkbox, описанное в разделе fields XML файла пакета.


Перед продолжением необходимо дать некоторые пояснения по структуре раздела fields. В этом разделе содержится описание полей формы текущей страницы GUI. Каждое поле описывается в узле field и содержит элементы:



  • fielddescr — название поля, выводится в левой части формы перед элементом управления;

  • fieldname — имя поля, под которым оно будет доступно в системе при обработке введенных данных;

  • description — комментарий, описывающий данное поле, выводится под элементом управления;

  • type — тип элемента управления, используемого в данном поле.






На рисунке ниже показано соответствие элементов XML структуры пакета и элементов графического интерфейса.

image


Элементы управления




Рассмотрим простые элементы управления графического интерфейса пакетов pfSense:


  • сheckbox

  • input

  • password

  • textarea

  • select

  • interfaces_selection




Элемент CHECKBOX

Представляет собой обычный «флажок», позволяющий пользователю возможность сделать выбор да/нет.

<field>
<fielddescr>Enable</fielddescr>
<fieldname>enable</fieldname>
<description>Check this for enable package.</description>
<type>checkbox</type>
</field>


Элемент INPUT

Представляет собой простое текстовое поле для ввода однострочной текстовой информации. Параметр size позволяет задать ширину окна этого элемента.



<field>
<fielddescr>Login</fielddescr>
<fieldname>pkglogin</fieldname>
<description>Enter package login.</description>
<type>input</type>
<size>30</size>
</field>


Элемент PASSWORD

Является разновидностью элемента input и служит для ввода пароля в WEB форме пакета. Но введенные данные здесь отображаются в виде звёздочек.



<field>
<fielddescr>Password</fielddescr>
<fieldname>pkgpass</fieldname>
<description>Enter package password.</description>
<type>password</type>
<size>30</size>
</field>


Элемент TEXTAREA

Представляет собой многострочное текстовое поле. Кроме стандартных опций XML стуктуры поля содержит в описании параметры cols и rows, задающие размеры элемента в колоноках и строках соответственно. Имеется также параметр encoding, указывающий в какой кодировке сохранять введенные пользователем данные. Обычно это кодировка Base64.



<field>
<fielddescr>Comments</fielddescr>
<fieldname>pkgcomments</fieldname>
<description>
Enter you coments here.
</description>
<type>textarea</type>
<cols>60</cols>
<rows>3</rows>
<encoding>base64</encoding>
</field>


Элемент SELECT

Представляет собой выпадающий список значений в виде combo box, задаваемых в секции options. Модификатор multiple превращает обычный combo box в элемент list box, позволяющий выбирать несколько значений одновременно (нажатием Control + Лев. клик). Параметр default_value задает значение по умолчанию из списка в секции options.



<field>
<fielddescr>Age</fielddescr>
<fieldname>pkgage</fieldname>
<description>Choose your age.</description>
<type>select</type>
<default_value>adl</default_value>
<options>
<option><value>chd</value><name>children</name></option>
<option><value>tng</value><name>teenager</name></option>
<option><value>adl</value><name>adult</name></option>
</options>
<multiple/>
</field>


Элемент INTERFACES_SELECTION

Является специальной разновидностью элемента select. В этот список выводятся все основные сетевые интерфейсы pfSense. Также как и в элементе select здесь доступны дополнительные опции multiple и default_value.



<field>
<fielddescr>Interface</fielddescr>
<fieldname>pkginterface</fieldname>
<description>
Select interface(s) for using in the package. Use 'Ctrl' + L_click for multiple selection.
</description>
<type>interfaces_selection</type>
<default_value>lan</default_value>
<multiple/>
</field>


Собрав приведенные выше описания элементов управления в один XML файл получим следующую форму Web интерфейса:

image


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


Исходный код XML файла к статье.


<?xml version="1.0" encoding="utf-8" ?>
<packagegui>
<name>mypkg</name>
<title>My First Package</title>
<category>Test</category>
<version>0.1</version>
<include_file>/usr/local/pkg/mypkg.inc</include_file>
<tabs>
<tab>
<text>My Package</text>
<url>/pkg_edit.php?xml=mypkg.xml</url>
<active/>
</tab>
</tabs>
<fields>
<field>
<fielddescr>Enable</fielddescr>
<fieldname>enable</fieldname>
<description>Check this for enable package.</description>
<type>checkbox</type>
</field>
<field>
<fielddescr>Interface</fielddescr>
<fieldname>pkginterface</fieldname>
<description>Select interface(s) for using in the package. Use 'Ctrl' + L_click for multiple selection.</description>
<type>interfaces_selection</type>
<default_value>lan</default_value>
<required/>
<multiple/>
</field>
<field>
<fielddescr>Login</fielddescr>
<fieldname>pkglogin</fieldname>
<description>Enter package login.</description>
<type>input</type>
<size>30</size>
</field>
<field>
<fielddescr>Password</fielddescr>
<fieldname>pkgpass</fieldname>
<description>Enter package password.</description>
<type>password</type>
<size>30</size>
</field>
<field>
<fielddescr>Comments</fielddescr>
<fieldname>pkgcomments</fieldname>
<description>
Enter you coments here.
</description>
<type>textarea</type>
<cols>60</cols>
<rows>3</rows>
<encoding>base64</encoding>
</field>
<field>
<fielddescr>Age</fielddescr>
<fieldname>pkgage</fieldname>
<description>Choose your age.</description>
<type>select</type>
<default_value>adl</default_value>
<options>
<option><value>chd</value><name>children</name></option>
<option><value>tng</value><name>teenager</name></option>
<option><value>adl</value><name>adult</name></option>
</options>
</field>
</fields>
<custom_php_command_before_form/>
<custom_php_validation_command/>
<custom_php_resync_config_command/>
<custom_php_install_command/>
<custom_php_deinstall_command/>
</packagegui>







PS: Прошу прощения у коллег за такое дробление материала, но не хочется делать длинные статьи.

This entry passed through the Full-Text RSS service — if this is your content and you're reading it on someone else's site, please read the FAQ at http://ift.tt/jcXqJW.


Атаки шейпинга в сетях low latency или почему Tor не спасает от спецслужб


Тайминг-атаки являются известным слабым местом сети Tor и неоднократно обсуждались, в том числе на Хабре, где можно найти порядка 10 статей, так или иначе затрагивающих эту тему. Зачем нужна еще одна? Существует достаточно распространенное заблуждение, что подобные атаки всегда требуют статистического анализа и достаточно сложны в реализации. Ранее опубликованные статьи относятся именно к такому классу атак. Мы рассмотрим вполне реалистичный сценарий, в котором достаточно единственного запроса для деанонимизации пользователя сети.


Поскольку вопрос возможности деанонимизации пользователей Tor в очередной раз активно обсуждается в рунете, я публикую «печатную» версию фрагмента своей презентации с PHDays 2014. Приведенная ниже атака не специфична для Tor и может быть использована против любых low latency средств сокрытия источника трафика – VPN, цепочки прокси и даже их комбинации.



Мы рассмотрим сценарий, для реализации которого в Tor требуется соблюдение двух условий:



  1. Иметь возможность вмешиваться в трафик между exit node и узлом назначения. Это можно сделать, имея доступ к конечному серверу, exit node или любой точке прохождения трафика между ними. То есть фактически это условие может выполнить любой желающий, организовав собственные exit node в достаточном количестве.

  2. Иметь пассивный доступ к трафику между клиентом сети и entry node.




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

Наличие у атакующего доступа к оборудованию СОРМ вполне удовлетворяет второму из условий атаки. А значит у спецслужб, имеющих доступ к оборудованию и способных организовать некое количество exit node в Tor, есть все, что требуется, включая желание заниматься этим вопросом.


Со стороны exit node в трафик вносятся предопределенные изменения, не меняющие передаваемые данные, но затрагивающие «форму» трафика – меняются размеры проходящих пакетов и задержки между ними. Временные характеристики в low latency сетях меняются не значительно, этот факт обычно используется в timing-атаках. Размеры пакетов меняются достаточно прогнозируемым образом, как это будет продемонстрировано. Это значит, что переразбив трафик на пакеты определенной последовательности размеров с определенной последовательностью задержек можно со стороны exit node промаркировать трафик таким образом, что на стороне entry node эта маркировка может быть обнаружена, таким образом может быть сопоставлено соединение или запрос к серверу с пользователем Tor.

Более того, в этом трафике можно передать информацию для прослушивающей стороны, например, уникальный идентификатор клиентского запроса. То есть, при наличии 2 различимых вариантов размера пакета и 2 различимых вариантов временных задержек, можно скрытно от пользователя передать стороне, прослушивающей шифрованный трафик между пользователем и entry node, 2 бита информации каждым пакетом данных, начиная со второго. В действительности, различимых состояний можно ввести больше, но есть и дополнительные ограничения, которые мы рассмотрим ниже.


Я реализовал атаку путем перенаправления трафика exit node в прокси-сервер, в который были внесены небольшие правки для организации шейпинга трафика по заранее определенному шаблону.

Как выглядит «обычный» трафик в Tor? Это фрагмент трафика от entry node к клиенту связанный с передачей результатов HTTP-запроса без внесения в трафик каких-либо маркировок:



Идет TLS-трафик, внутри которого содержатся блобы (пакеты) информации, преимущественно размером 3648 октетов. На уровене TCP они разбиваются на IP-пакеты размером преимущественно 1414 октетов, что связано с Path MTU. TCP-пакет может содержать как фрагмент одного блоба, так и конец одного блоба и начало следующего. Однако, встречаются и блобы размером 560 октетов и TCP-пакеты меньшего размера. Разбиение исходных данных на блобы и разбиение блобов по TCP-пакетам зависит от разных параметров — таймингов серверов, размеров буфера, которыми он передает данные, задержкам сети. При повторном запросе рисунок может быть немного другой. Однако статистически один и тот же запрос к одному и тому же серверу будет иметь достаточно четкую картину. Поскольку при загрузке одной и той же web-страницы происходит достаточно большое количество запросов с передачей, как правило, одних и тех же запросов и ответов, то есть типичных объемов информации с типичными задержками, то сопоставлением данных можно попытаться обнаружить к какому именно ресурсу обращается пользователь, особенно если он посещает его регулярно. На этом основаны классические тайминг-атаки.


Но мы идем другим путем. Вместо пассивного измерения тайминга, в исходный трафик со стороны exit node вносим шейпинговую маркировку (maRk). Чистый нешифрованный трафик, пущенный мимо Tor, теперь выглядит следующим образом:



Как происходит маркировка? Передаем маленькие пакеты двух разных размеров. Различие в размерах в несколько сот байт в данном случае ни на что не влияет, но позволяет визуально различить два разных типа пакетов в серии. Задержки между двумя типами пакетов 60 и 110 миллисекунд, они подобраны так, чтобы показать наиболее интересную картинку на выходе.


Когда тот же трафик проходит через Tor, между entry node и пользователем он выглядит следующим образом:



Что мы теперь видим. Все блобы в TLS теперь имеют размер 560 октетов (а значит мы умеем управлять размером, 3648 или 560 октетов за счет отправки больших или маленьких порций трафика). Кстати, в этом месте наблюдается проблема амплификации трафика — минимальный пакет данных увеличивается более чем в 10 раз. Каждый отправленный нами пакет приходит отдельным блобом в TLS. При этом IP-пакет размером 1414 октетов содержит два полных блоба и начало третьего, пакет 389 октетов — конец третьего блоба и пакет в 619 октетов — отдельный четвертый блоб. То есть 4 IP-пакета исходного трафика приходят в 3 IP-пакетах в трафике Tor. Хорошо это или плохо? Плохо, так как мы потеряли часть информации о таймингах.


Что случилось и почему такая странная последовательность: это вызвано особенностями работы TCP-стека, а именно совместной работой алгоритма Нагла и TCP delayed acknowledgements. Однако между группами пакетов и между пакетами в группе интервал остается неизменным, то есть как минимум половину информации по таймингам мы получаем. Чтобы «побороть» ожидание и группировку в алгоритме Нагла, можно отправить количество трафика такое, чтобы передаваемые блобы превысили размер MTU (но недостаточное для формирования «большого» блоба в 3648 байт).


Если сравнить третью картинку с первой, то понятно, что в трафик вносится достаточно четкая и легко детектируемая аномалия, которая позволяет следящему оборудованию «сработать» при ее обнаружении. Причем в случае СОРМ детектируемость этой аномалии достаточна для доказательной базы.


Данная атака может применяться к практически любому шифрованному или нешифрованному соединению, как по направлению от сервера к клиенту, так и в обратном.


«Нелинейное» поведение трафика из-за алгоритма Нагла может приводить к потере части информации о таймингах, однако, эту потерю можно обнаружить на принимающей стороне и компенсировать избыточностью передаваемой информации. Для того, чтобы трафик можно было шейпить, он должен быть достаточным. Казалось бы, сложно промаркировать таким образом, например, ssh-соединение с запущенным bash’ем и периодически выдаваемыми командами, так как в нем не передается достаточно данных, чтобы сформировать пакеты с нужными maRk-сигнатурами.

На самом деле, промаркировать можно даже соединение, в котором данные совсем не передавалось. Дело в том, что даже после того, как клиентское приложение инициировало закрытие TCP-соединения, данные, отправленные через Tor в сторону клиента, будут продолжать доставляться. Это дает возможность после получения FIN+ACK в соединении со стороны клиента отправить в его сторону промаркированную порцию случайных данных. Эти данные никогда не будут считаны клиентским приложением, но они все равно дойдут до клиента и таким образом раскроют его. То есть атака может быть проведена полностью скрытно от клиента и объем информации, которым можно промаркировать соединение, более чем достаточен. Аналогичный способ можно применить и в большинстве VPN, но, к счастью, он не сработает с прокси и другими прикладными шлюзами.


Атаку может быть сложнее провести при активной работе клиента, так как необходимо детектировать пакеты, относящиеся к одной цепочке, посторонний трафик зашумляет сигнатуру. Можно так же взять на себя роль relay в сети Tor, что затруднит обнаружение маркированного трафика. Есть несколько способов дополнительно усложнить атаку: комбинация Tor, VPN и цепочки прокси затрудняет угадывание финальной формы трафика и частично устраняет атаку через полузакрытое соединение. Можно усложнить обнаружение испортив известные сигнатуры нестандартными параметрами TCP-стека. Но надежного способа полностью устранить подобные угрозы в рамках Tor или распространенных VPN-сетей нет. Атаки шейпинга, как разновидность тайминг-атак находятся за пределами их профиля защиты.

Единственное надежное решение – использовать внутри шифрованного соединения виртуальный линк, в котором идет постоянный поток ячеек фиксированной длины с фиксированной пропускной способностью. Так работают, например, сети ATM (Asynchronous Transfer Mode). Причем шифрование должно проводиться без сжатия данных, то есть потребляемая полоса трафика должна быть неизменной. Такие технологии не могут пока широко использоваться для повседневной работы, так как слишком высоки дополнительные расходы на канал, который активно используется даже в момент простоя.


This entry passed through the Full-Text RSS service — if this is your content and you're reading it on someone else's site, please read the FAQ at http://ift.tt/jcXqJW.


Идеи в массы

Как известно, если не рассказывать свои идеи, новых не появится. Я замечал, что идея может крутиться у меня в голове больше года, до тех пор пока я ее не расскажу кому-нибудь или начну воплощать.

Предложение моё не замысловато: если у вас накопились идеи, которые вы точно никогда не будете воплощатьрасскажите их (можно в комментариях). Возможно кого-то ваши мысли натолкнут на собственные идеи или кто-то загорится воплощать ваши.


Начну с себя:


Нет именам файлов — ориентироваться в файловом менеджере по двум параметрам: приложению в котором создавали и по времени создания файла. Потому что часто ход мыслей у рядового пользователя такой: «Позавчера создавал это файл в ворде, где он лежит?» Сейчас так, наверное, с фото — никто не помнит названия файла, а все ориентируются по дате: «Прошлой весной фотались, в начале мая».


Никнеймы кончатся — спрогнозировать, в каком году закончатся все возможные никнеймы разумной длины (то бишь которые можно запомнить рядовому человеку). Например, логины на для gmail почты. Здесь же можно нарисовать график зависимости повторений твитов от времени. Ведь известно, что твитов конечное число и рано или поздно все уникальные твиты кончатся.


Godcoinрелигиозным течениям думаю стоит обратить свой взор на криптовалюты.


Первый памятник рекламе

Большой пик с рекламой — сделать большую такую стеллу, каждые N сантиметров длины которой — какая-нить реклама, но такая, чтобы не выцветала и не портилась. В конструкцию снизу можно добавлять новые фирмы и стелла после каждой новой рекламы увеличивалась в высоту. Возможно что-то наподобие башенного крана, который сам себя достраивает.


Игра — открытие фирмы Сделать серию квестов, где бы обыгрывались обычные бытовые реалии. Например, ты хочешь открыть фирму, но там оказывается, что тебе нужно получать всякие разрешения и тд. Приходишь к чиновнику, он требует справку. Второй чиновник требует другую справку и не принимает без справки от первого чела. В общем квесты, которые бы отражали реальное получение всяких бумажек, справок и тд. Заодно и познавательно будет, особенно для России.


Создать государство нулевой территорией

Купить территорию за бесценок, площадь которой стремится к нулю. И имея своё государство — мутить там что хочется. Хостить Пиратскую Бухту, например.


Уничтожить Землю (для злых гениев), создав огромное зеркало из фольги и установив его так, чтобы тень падала на землю. Никто не сумеет ничего предпринять, буквально за пару суток температура на земле упадет очень низко.


Схема связей логинов и паролей. Грузим список пароль + логин для всех сайтов, на которых регистрировались и отображаем в виде графа. Где ники связаны с паролями. В зависимости от внешнего вида графа — делать вывод о вашей защищенности в целом.


Рассчитать, через сколько времени весь мир обратится в мусор. Дело в том, что человечество производит некоторое количество неперерабатываемого мусора. С течением времени все вещи переходят в мусор. Рассчитать, когда на земле будет только мусор.


Ачивки для навигаторов. Навигаторы могут соединятся между собой, а вам за достижения дарят ачивки. Мол проехал со скоростью 150 — получил медальку как гонщик и тд. Потом можно хвалиться приобретенными наградами.


Выбор фильма в будущем. Указываем любые слова или сочетания слов и смотрим фильм, потому что количество уникальных названий фильмов будет стремиться к нулю.


This entry passed through the Full-Text RSS service — if this is your content and you're reading it on someone else's site, please read the FAQ at http://ift.tt/jcXqJW.


Используете test.php на своем сайте и Google Chrome?


Про test.php уже была интересная статься хабре. Но в этом небольшом топике я расскажу об одной особенности Google Chrome, которая может подпортить жизнь владельцам test.php.


Работая с очередным веб-приложением я наткнулся на странный баг: открываешь в Google Chrome скрипт http://ift.tt/IcWlJf, а он выполняется несколько раз. Причина оказалась в стандартных настройках Google Chrome, а точнее во включенной опции «Предсказывать сетевые действия для ускорения загрузки страниц».



Среди прочего, она позволяет хрому заранее загружать и рендерить веб-страницу еще до нажатия Enter в омнибоксе (адресной строке), тем самым создавая видимость мгновенной загрузки. Здесь пишут, что функция работает для часто посещаемых страниц (возможно достаточно хотя бы раз посетить страничку, чтобы она осталась в истории омнибокса), test.php у разработчиков часто подходит под этот критерий :)


Неприятная особенность данной функций заключается в том, что если страница успела загрузиться до нажатия Enter, все работает как следует, и страница отображается мгновенно после ввода. Однако если test.php загружается дольше, чем время между отображением подсказки в омнибоксе и переходом на страницу, после нажатия Enter страница будет загружена повторно.


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


Решение простое: в опциях убрать галочку с «Предсказывать сетевые действия для ускорения загрузки страниц»:



Возможно, данная проблема есть и у других современных браузеров с «умной» адресной строкой. Также стоит отметить, что у меня предзагрузка не отображалась во вкладке «Network» в «Developer Tools».


This entry passed through the Full-Text RSS service — if this is your content and you're reading it on someone else's site, please read the FAQ at http://ift.tt/jcXqJW.


Как использовать Томита-парсер в своих проектах. Практический курс

Привет, меня зовут Наталья, я работаю в Яндексе разработчиком в группе извлечения фактов. Весной мы рассказали о том, что такое Томита-парсер и для чего он используется в Яндексе. А уже этой осенью исходники парсера будут выложены в открытый доступ.

В предыдущем посте мы пообещали рассказать, как пользоваться парсером и о синтаксисе его внутреннего языка. Именно этому и посвящен мой сегодняшний рассказ.



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



Грамматика — это набор правил, которые описывают цепочки слов в тексте. Например, если у нас есть предложение «Мне нравится, что вы больны не мной», его можно описать с помощью цепочки [местоимение первого лица, единственного числа], [глагол в настоящем времени и третьем лице], [запятая], [союз] и т.д.



Грамматика пишется на специальном формальном языке. Структурно правило разделяется символом -> на левую и правую части. В левой части стоит один нетермиал, а правая состоит как из терминалов, так и нетерминалов. Терминал в данном контексте — это некий объект, имеющий конкретное, неизменяемое значение. Множество терминалов — алфавит языка Томита, из которого выстраиваются все остальные слова. Терминалами в Томите выступают ‘леммы’ — слова в начальной форме, записанные в одинарных кавычках, части речи (Noun, Verb, Adj…), знаки пунктуации (Comma, Punct, Hyphen…) и некоторые другие спецсимволы (Percent, Dollar…). Всего терминалов в Томите около двадцати, полный их список представлен в нашей документации. Нетерминалы составляются из терминалов, и если проводить аналогию с естественными языками, представляют собой нечто вроде слов. Например, нетерминал NounPhrase, состоящий из двух терминалов Adj и Noun, означает цепочку из двух слов: вначале — прилагательное, потом — существительное.


Чтобы составить нашу первую грамматику, нужно создать файл с расширением .cxx, назовем его first_grammar. Сохранить его можно там же, где лежит сам бинарник парсера. В первой строке файла с грамматикой нужно указать кодировку:



#encoding "utf8"



Далее можно писать правила. В нашей первой грамматике их будет два:

PP -> Prep Noun;
S -> Verb PP;




Первое правило описывает нетерминал PP — предложную группу, состоящую из предлога и существительного (Prep Noun). Второе правило — глагол с предложной группой (Verb PP). В данном случае нетерминал S является корневым, потому что он ни разу не упоминается в правой части правила. Такой нетерминал называется верхушкой дерева. Он описывает целиком ту цепочку, которую мы хотим извлечь из текста.

Наша первая грамматика готова, но прежде чем запускать парсер, нужно проделать ещё несколько манипуляций. Дело в том, что грамматика взаимодействует с парсером не напрямую, а через корневой словарь — сущность, в которой собирается информация обо всех созданных грамматиках, словарях, дополнительных файлах и т.д. Т.е. корневой словарь — это своего рода агрегатор всего, что создается в рамках проекта. Словари для Томита-парсера пишутся с использованием синтаксиса похожего на Google Protobuf (используется модифицированная версия компилятора Protobuf, с поддержкой наследования). Файлам обычно даётся расширение .gzt. Создадим корневой словарь dic.gzt и в начале также укажем кодировку:



encoding "utf8";



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

import "base.proto";
import "article_base.proto";




Далее мы создаём статью. Статья словаря описывает способ выделения цепочки слов в тексте. Грамматика — это один из возможных способов. Цепочку можно выделять при помощи списка ключевых слов, встроенного в парсер алгоритма (цепочки ФИО и дат). Другие способы могут быть добавлены на уровне исходного кода парсера (например, статистический named entity recognizer). Статья состоит из типа, названия и содержания. О том, что такое типы статей и для чего они нужны я расскажу ниже, когда мы будем подробнее говорить о словарях. Пока мы будем использовать базовый тип TAuxDicArticle. Название статьи должно быть уникальным, оно указывается в кавычках после типа. Далее в фигурных скобках перечисляются ключи — содержание статьи. В нашем случае в единственном ключе содержится ссылка на написанную нами грамматику. Сначала мы указываем синтаксис файла, на который мы ссылаемся (в случае файла с грамматикой это всегда tomita), и путь к этому файлу, потом в поле type — тип ключа (его необходимо указывать, если ключ содержит в себе ссылку на грамматику).

TAuxDicArticle "первая_грамматика"
{
key = {"tomita:first_grammar.cxx" type=CUSTOM}
}




Чтобы сообщить парсеру, откуда мы берём исходный текст, куда записываем результат, какие грамматики запускаем, какие факты извлекаем, а также прочую необходимую информацию, создается единый файл конфигурации с расширением .proto. Создадим в папке с парсером файл config.proto. Как обычно, в начале указываем кодировку и переходим к описанию нашей конфигурации.

Единственный обязательный параметр конфигурационного файла — это путь к корневому словарю, который записывается в поле Dictionary. Все остальные параметры опциональны. Информация о входном файле находится в поле Input. Помимо текстовых файлов Томите можно подать на вход папку, архив или stdin. В поле Output записывается, куда и в каком формате (text, xml или protobuf) надо сохранить извлечённые факты. Мы отправим на вход файл input.txt. В поле Articles в перечисляются грамматики, которые мы хотим запустить. Обратите внимание, что здесь мы указываем не сам файл с грамматикой, а название статьи из словаря, которая содержит в себе ссылку на этот файл: как мы уже говорили, парсер взаимодействует со всеми файлами проекта опосредованно через корневой словарь.



encoding "utf8";
TTextMinerConfig {
Dictionary = "dic.gzt";


Input = {File = "input.txt"}

Output = {File = "output.txt"
Format = text}

Articles = [
{ Name = "первая_грамматика" }
]
}




Теперь, когда файл конфигурации готов, нам осталось положить рядом с бинарником файл с текстом для анализа (вы можете воспользоваться нашим тестовым файлом или взять свой) и можно переходить к запуску грамматики. В терминале перейдем в ту папку, где лежит наш парсер. Парсер запускается с единственным аргументом — именем конфигурационного файла. Соответственно, в *NIX-системах команда для запуска будет выглядеть так:

./tomitaparser config.proto



Результаты можно посмотреть в файле output.txt. Однако никаких извлеченных фактов мы там не увидим, потому что в нашей грамматике пока что есть только правила выделения цепочек, а чтобы выделенные цепочки превратились в структурированные факты, надо добавить процедуру интерпретации. О ней мы поговорим чуть ниже. Однако выделенные цепочки мы можем увидеть уже на этом этапе, для этого нужно добавить к файлу конфигурации ещё один параметр — отладочный вывод:

PrettyOutput = "pretty.html"



Благодаря этому параметру результаты работы парсера будут записываться в html-файл с более наглядным представлением. Теперь, если мы перезапустим грамматику и откроем файл pretty.html, который появился в папке, мы увидим, что у нас извлеклись все цепочки, описанные нами в грамматике — глаголы, после которых идет существительное с предлогом:
Результат






















































































































































































































































































































































































































































































































ехать на перекладных
остановиться возле духана
остановиться для ночлега
подойти к нему
ехать в Ставрополь
подвигать с помощью
взять на водку
приехать на Линию
деть против горцев
считаться в третьем
последовать за днем
бывать на юге
идти в гору
оглянуться на долину
требовать на водку
посмотреть на штабс-капитана
наткнуться на корову
приютиться у огня
быть в Чечне
отойти за вал
вытащить из чемодана
пожалеть о том
выйти перед фрунт
отдать под суд
быть в гостях
стоять в крепости
поселиться в крепости
ходить на кабана
надорвать со смеха
быть в нем
быть на деньги
хлопать в ладоши
глядеть на эту
бегать за хозяином
стать в сакле
выйти на воздух
ложиться на горы
Пробираться вдоль забора
быть за Тереком
ездить с абреками
прыгать через пни
бежать по следам
повиснуть на передних
полететь в овраг
убиться до смерти
тянуться по степи
бегать по берегу
лететь из-под копыт
сиять во мраке
зазвенеть об кольчугу
удариться об плетень
кинуться в конюшню
схватиться за ружья
вертеться среди толпы
деть в чужом
заговорить о другом
бывать от любви
поскакать в аул
выехать из крепости
перемениться в лице
перескочить через ружье
скакать на лихом
выхватить из чехла
повалиться на землю
прийти в крепость
ускакать на нем
отправиться в аул
пойти к нему
стать в тупик
стать в тупик
сидеть в углу
зачахнуть в неволе
заглянуть в окно
сидеть на лежанке
зайти к нему
ударить по рукам
мочь в щель
грезиться во сне
дождаться у дороги
быть в сумерки
нырнуть из-за куста
видеть с пригорка
продрогнуть на снегу
выйти из сакли
гаснуть по мере
тронуться в путь
выбиваться из сил
вести на небо
пропадать в облаке
отдыхать на вершине
хрустеть под ногами
приливать в голову
отпадать от души
взобраться на Гуд-гору
слезть с облучка
спускаться с Гуд-горы
происходить от слова
проваливаться под ногами
превращаться в лед
скрыться в тумане
биться о решетку
останавливаться в погоду
дать на водку
разыграться на щеках
объявить о смерти
подмывать за кабанами
выйти за крепостной
ходить по комнате
сидеть на кровати
утащить в горы
упасть на постель
быть в сентябре
походить по крепостному
сесть на дерн
быть с вала
сидеть на углу
стоять на месте
привстать на стременах
вернуться с охоты
быть за речкою
биться об заклад
перемениться к этой
проводить на охоте
тосковать по родным
деть в том
выйти из опеки
поехать в Америку
умереть на дороге
бывать в столице
происходить от пьянства
быть за диковинка
шнырять по камышам
уйти в камыши
собраться в кучу
указывать в поле
рваться из-под седла
поравняться с Печориным
приложиться из ружья
упасть на колени
держать на руках
карабкаться на утес
соскочить с лошадей
литься из раны
быть без памяти
посадить к нему
послать за лекарем
выйти из крепости
сесть на камень
потащить в кусты
вскочить на коня
сидеть у постели
отвернуться к стене
хотеться в горы
встретиться с душою
будет в раю
прийти на мысль
умереть в той
стать на колени
пойти на крепостной
умереть с горя
сесть на землю
пробежать по коже
похоронить за крепостью
уехать в Грузию
возвратиться в Россию
расстаться с Максимом



Извлечённые цепочки парсер пытается нормализовать, приводя главное слово цепочки (по умолчанию — первое) в начальную форму.


Следующий шаг — введение процедуры интерпретации, т.е. преобразование извлеченных цепочек в факты.


Сначала нам нужно создать структуру того факта, который мы хотим извлекать, т.е. описать, из каких полей он состоит. Для этого создадим новый файл fact_types.proto. Снова сделаем импорт файлов с базовыми типами, после чего перейдём к описанию самого факта. После слова message пишется название факта, двоеточие и базовый тип факта, от которого наследуется тип нашего факта. Далее в фигурных скобках мы перечисляем поля нашего факта. В нашем случае поле одно, оно обязательное (required), текстовое (string), называется Field1 и мы присваиваем ему идентификатор 1.



import "base.proto";
import "facttypes_base.proto";
message Fact: NFactType.TFact

{
required string Field1 = 1;
}




Теперь нужно импортировать созданный нами файл в корневой словарь (dic.gzt):

import "fact_types.proto";




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

S -> Verb interp (Fact.Field1) PP;



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

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



Facts = [
{ Name = "Fact" }
]




Теперь можно снова запускать парсер.
Результат






















































































































































































































































































































































































































































































































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





Дополнительные возможности грамматик




Теперь поставим перед собой более сложную задачу: попробуем написать грамматику, с помощью которой можно извлекать из текста названия улиц. Мы будем искать в тексте дескрипторы (слова улица, шоссе, проспект и т.п.) и анализировать цепочки, которые стоят рядом с ними. Цепочки должны начинаться с заглавной буквы и располагаться слева или справа от дескриптора. Создадим новый файл с грамматикой address.cxx и сохраним его в папке c нашим проектом. Сразу же добавим статью с нашей новой грамматикой в корневой словарь:

TAuxDicArticle "адрес"
{
key = {"tomita:address.cxx" type=CUSTOM}
}




Теперь добавим в файл fact_types.proto новый факт Street, который мы хотим извлекать. Он будет состоять из двух полей: обязательного (название улицы) и опционального (дескриптор).

message Street: NFactType.TFact
{
required string StreetName = 1;
optional string Descr = 2;
}




Чтобы перейти непосредственно к написанию грамматики, нужно ввести несколько новых понятий, которых мы не касались ранее.

Первое понятие — это операторы. Они позволяют получить более удобную сокращенную запись правил грамматики:



  • * — символ повторяется 0 или более раз;

  • + — символ повторяется 1 или более раз;

  • () — символ входит в правило 0 или 1 раз;

  • | — оператор «или».




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

#encoding "utf8"

StreetW -> 'проспект' | 'проезд' | 'улица' | 'шоссе';
StreetSokr -> 'пр' | 'просп' | 'пр-д' | 'ул' | 'ш';




Далее мы добавим нетерминал StreetDescr, который объединит в себе два предыдущих:

StreetDescr -> StreetW | StreetSokr;




Теперь нам нужно описать цепочки, которые в случае, если они стоят рядом с дескриптором, могут быть названиями улиц. Для этого введём ещё два понятия: пометы-ограничения и согласование.

Пометы уточняют свойства терминалов и нетерминалов, т.е. накладывают ограничения на множество цепочек, которое описывает терминал или нетерминал. Они записываются в угловых скобках после терминалов/нетерминалов и, в случае нетерминалов, применяются к синтаксически главному слову группы. Пометы могут быть разнообразными по своей структуре. Некоторые представляют собой унарный оператор, некоторые имеют поле, которое может быть заполнено разными значениями. Перечислим некоторые пометы, которые мы будем использовать в дальнейшем (полный список можно найти в нашей документации):



  • Морфологическая помета gram — это поле, которое может быть заполнено любой морфологической категорией из словаря: часть речи, род, число, падеж, время, наклонение, залог, лицо и т.д. <gram = “муж, ед, род”>;

  • Графематические пометы — группа помет, накладывающих ограничение на регистр извлекаемой цепочки: <h-reg1>, <l-reg>;

  • Специальные пометы — могут отражать позицию слова в предложении, алфавит и т.д: <fw>, <mw>, <lat>;

    Почти все пометы поддерживают отрицание: дополнив их тильдой, можно поменять их значение на противоположное: <~fw>, <~lat>.




Несколько особняком стоит синтаксическая помета <rt>. Помеченный ей терминал или нетерминал становится синтаксической вершиной цепочки (главным словом), которая собирается в данном правиле. По умолчанию синтаксической вершиной является первое слово.

Помета согласование также записывается в угловых скобках и означает, что у двух символов, к которым оно приписано, должны совпадать указанные грамматические категории. Чаще всего применяются следующие согласования:



  • По роду, числу и падежу: gnc-agr;

  • По роду и числу: gn-agr;

  • По падежу: c-agr.




В правиле обязательно нужно писать идентификатор согласования, который указывает, какой символ с каким согласуется. Например, в следующем правиле символ A согласуется с B по роду, числу и падежу, а с C — по числу и падежу:

S -> A<gnc-agr[1], nc-agr[2]> B<gnc-agr[1]> C<nc-agr[2]>;




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

StreetNameNoun -> (Adj<gnc-agr[1]>) Word<gnc-agr[1],rt> (Word<gram="род">);




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

StreetNameAdj -> Adj<h-reg1> Adj*;




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

Street -> StreetDescr interp (Street.Descr) StreetNameNoun<gram="род", h-reg1> interp (Street.StreetName);
Street -> StreetDescr interp (Street.Descr) StreetNameNoun<gram="им", h-reg1> interp (Street.StreetName);




Для шаблона названия улицы, выраженного прилагательным, рассмотрим ещё один частный случай, когда в названии стоит числительное, записанное цифрой (1-я Советская улица). Допустим, у нас нет цепочек такого типа в морфологическом словаре, и парсер не может получить для них морфологические характеристики. В таком случае мы можем описать их с помощью регулярных выражений. Для них в Томите существует отдельный набор помет, которые проверяют соответствие цепочки некоторому шаблону, заданному в поле этих помет: wff проверяет первое слово цепочки, wfl — последнее, а wfm — главное.

S -> A<wff=/[0-9]+.?/>;




Цепочка, которая может встретиться в названии улицы, должна содержать число от 0 до 99, после которого может идти или не идти окончание мужского, женского или среднего рода. Таким образом, у нас получается три правила — по одному на каждый род — которые мы объединим в единое правило NumberW.

NumberW_1 -> AnyWord<wff=/[1-9]?[0-9]-?((ый)|(ий)|(ой)|й)/>;
NumberW_2 -> AnyWord<wff=/[1-9]?[0-9]-?((ая)|(яя)|(ья)|я)/>;
NumberW_3 -> AnyWord<wff=/[1-9]?[0-9]-?((ее)|(ье)|(ое)|е)/>;

NumberW -> NumberW_1 | NumberW_2 | NumberW_3;




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

NumberW_1 -> AnyWord<wff=/[1-9]?[0-9]-?((ый)|(ий)|(ой)|й)/> {outgram="муж,ед,им"};
NumberW_2 -> AnyWord<wff=/[1-9]?[0-9]-?((ая)|(яя)|(ья)|я)/> {outgram="жен,ед,им"};
NumberW_3 -> AnyWord<wff=/[1-9]?[0-9]-?((ее)|(ье)|(ое)|е)/> {outgram="сред,ед,им"};




После этого мы можем написать еще одно правило StreetNameAdj: перед прилагательным может идти числительное NumberW, согласованное с ним в роде, числе и падеже.

StreetNameAdj -> NumberW<gnc-agr[1]> Adj<gnc-agr[1]>;




Наконец, мы можем написать корневые правила для StreetNameAdj. Название улицы, выраженное прилагательным, может стоять перед или после дескриптора и согласовано с ним в роде, числе и падеже. Для сокращённых дескрипторов мы не ставим согласование, т.к. их нет в словаре и мы не знаем их морфологических характеристик.

Street -> StreetNameAdj<gnc-agr[1]> interp (Street.StreetName) StreetW<gnc-agr[1]> interp (Street.Descr);
Street -> StreetNameAdj interp (Street.StreetName) StreetSokr interp (Street.Descr);
Street -> StreetW<gnc-agr[1]> interp (Street.Descr) StreetNameAdj<gnc-agr[1]> interp (Street.StreetName);
Street -> StreetSokr interp (Street.Descr) StreetNameAdj interp (Street.StreetName);




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

Street -> StreetDescr interp (Street.Descr) StreetNameNoun<gram="род", h-reg1> interp (Street.StreetName::not_norm);
Street -> StreetDescr interp (Street.Descr) StreetNameNoun<gram="им", h-reg1> interp (Street.StreetName::not_norm);




Наша грамматика готова, нам осталось только внести изменения в файл конфигурации и указать, что мы будем запускать грамматику address.cxx и пытаться извлечь из текста факт Street. Кроме того, мы будем анализировать другой текст, поэтому заменим файл в поле Input на input1.txt

Input = {File = "input1.txt"}

Output = {File = "output.txt"
Format = text}

Articles = [
{ Name = "адрес" }
]
Facts = [
{ Name = "Street" }
]




Запустим парсер и посмотрим, что у нас получилось:
Результат











































Address
StreetName Descr
1-я Дубровскаяул
Нижняя Масловкаул
Мирапроспект
1-я Владимирскаяулица
Большая Семеновскаяул
Комсомольскийпросп
Тимура Фрунзеул
Энтузиастовш



Словари




Теперь подробнее поговорим о словарях. Файл dic.gzt, который мы создали в самом начале — это словарь, но это некоторая особая сущность, своего рода агрегатор всех файлов в рамках проекта, т.е. скорее служебный файл. Однако словари также могут содержать пользовательские данные. В этом смысле они ближе к словарям в традиционном понимании.

Словари в Томите пишутся в формате протобуф. Статья в газеттире описывает множество цепочек, объединённых общим свойством. Это множество может быть задано в явном виде — лексически — когда мы перечисляем все нужные нам цепочки:



TAuxDicArticle "города"
{ key = "Москва" | "Воронеж" | "Самара"}




или функционально, ссылаясь на грамматику:

TAuxDicArticle "адрес"
{ key = {"tomita:address.cxx" type=CUSTOM}}




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

TAuxDicArticle "организация"
{
key = { государственный дума mainword=2 agr=gnc_agr}
}




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

Также в статье можно отдельным полем задать лемму, к которой будут приводиться все ключи данной статьи при нормализации:



TAuxDicArticle "санкт-петербург"
{
key = "санкт-петербург"
key = "спб"
key = "питер"
lemma = "Санкт-Петербург"
}




Мы уже научились ссылаться на грамматики из словаря, теперь разберемся, как ссылаться на словари из грамматики. Делается это при помощи пометы kwtype. Она означает, что слово, которому соответствует данный (не)терминал, должно быть объектом заданного типа, т.е. входить в статью, указанную в поле пометы kwtype. Есть также помета kwset, при помощи которой можно сослаться сразу на несколько статей. Названия статей перечисляются через запятую в квадратных скобках:

Animals -> Word <kwtype="животные">;
Forest -> Word <kwset=["звери", "птицы"]>;




Ссылаться можно не только на название статьи, но и на её тип. На базовый тип TAuxDicArticle, естественно, ссылаться никакого смысла нет, однако в отдельном файле можно описывать пользовательские типы, которые будут наследоваться от базового. Создадим такой файл и назовем его kwtypes.proto. Как всегда, сначала импортируем туда файлы с базовыми типами:

import "base.proto";
import "articles_base.proto";
import "kwtypes_base.proto";




Затем перейдём к описанию нового типа статей. Это делается достаточно просто. Мы пишем message, название нового типа и после него через двоеточие базовый тип, от которого происходит наследование. Завершаю конструкцию фигурные скобки.

message surname : TAuxDicArticle {}




Теперь попробуем создать словарь с использованием этого типа. Создадим новый .gzt-файл surnames.gzt, в котором перечислим все известные нам фамилии, объединённые общим типом surname. В начале указываем кодировку, затем импортируем файл kwtypes.proto, чтобы парсер знал, откуда брать неизвестные типы статей. Далее уже знакомым нам образом пишем статьи, с той лишь разницей, что вместо названия базового типа TAuxDicArticle мы пишем название созданного нами типа surname:

encoding "utf8";
import "kwtypes.proto";
surname "ленин"
{
key = "ленин"
}

surname "пушкин"
{
key = "пушкин"
}

surname "гагарин"
{
key = "гагарин"
}




Файл нужно сохранить и импортировать его в корневой словарь, добавив строку import "surnames.gzt";. Туда же импортируем файл с описанием новых типов import "kwtypes.proto";.

Теперь, когда у нас есть словарь с фамилиями, мы можем попробовать решить в упрощенном виде одну задачу, которая достаточно часто возникает в Яндексе: выделение конструкций типа «имени кого-то». Создадим файл новой грамматики imeni.cxx. Первое правило у нас будет содержать регулярное выражение, описывающее инициал. Второе правило объединяет два инициала. А третье правило содержит в себе пару инициалов и терминал, который включает в себя все цепочки с типом surname из нашего словаря. Если мы добавим в наш словарь ещё несколько фамилий, то они тоже будут входить в этот терминал. В последнем корневом правиле мы добавили к уже собранной цепочке фамилия + инициалы слово “имени” (в начальной форме).



#encoding "utf8"

Initial -> Word<wff=/[А-Я]\./>;

Initials -> Initial Initial;

FIO -> Initials Word<kwtype=surname>;

Imeni ->'имя'<gram="ед, род"> FIO;




Грамматика готова. Теперь нам осталось добавить статью с новой грамматикой в корневой словарь:

TAuxDicArticle "имени"
{
key = {"tomita:imeni.cxx" type=CUSTOM}
}




В файле конфигурации config.proto можно закомментировать (двойным слэшом в начале строки) список фактов, которые мы хотим извлекать — сейчас они нам не понадобятся. Также укажем, что мы запускаем грамматику imeni.cxx на входном файле input2.txt. Теперь можно запустить парсер. Факты у нас в этот раз не извлекались, так что откроем файл pretty.html и посмотрим, какие цепочки удалось извлечь.

Помимо того, что в грамматиках можно использовать ключевые слова из словарей, в них также могут быть использованы результаты работы других грамматик. Включить одну грамматику в другую можно двумя способами: либо через уже знакомую нам помету kwtype, указав в её поле статью из словаря, ссылающуюся на грамматику, либо при помощи директивы #include. Процедура включения грамматик через #include достаточно проста — она подразумевает, что мы включаем текст одной грамматики в текст другой, их правила абсолютно равноправны и выполняются за один проход. А вот добавление грамматик через kwtype заслуживает отдельного рассмотрения. Для примера используем уже созданную нами грамматику imeni.cxx и включим её в другую грамматику, которая будет извлекать названия организаций. Назовем новую грамматику org.cxx. Для начала перечислим несколько дескрипторов организаций.



#encoding "utf8"

OrgDescr -> 'библиотека' | 'театр' | 'музей';




Во втором правиле мы объединим дескриптор и цепочку «имени кого-то». Для этого мы используем помету kwtype, в поле которой укажем статью «имени», ссылающуюся на грамматику imeni.cxx. Парсеру абсолютно безразлично, что находится в статье, на которую мы ссылаемся в помете kwtype — список лемм или ссылка на грамматику. Он трактует их абсолютно одинаково — как список цепочек.

Наконец, в корневом правиле добавим интерпретацию.



Org_ -> OrgDescr Word<kwtype="имени">;

Org -> Org_ interp (Org.Name);




Добавим нашу новую грамматику в корневой словарь:

TAuxDicArticle "организация"
{
key = {"tomita:org.cxx" type=CUSTOM}
}




Также нужно добавить новый факт в файл fact_types.proto:

message Org: NFactType.TFact
{
required string Name = 1;
}




И, наконец, внесём изменения в конфигурационный файл. В этот раз мы запускаем грамматику, которая лежит в статье с названием “организация”. Факты мы на сей раз извлекаем, поэтому раскомментируем строки и поменяем название факта на “Org”.

Articles = [
{ Name = "организация" }
]

Facts = [
{ Name = "Org" }
]




Запустим парсер и посмотрим на результаты в файле pretty.html. У нас извлекся факт «Библиотека имени В. И. Ленина».

Что же произошло при включении одной грамматики в другую? Сначала текст «Библиотека им В.И. Ленина» был подан на вход грамматики imeni.cxx. Она превратила его в «Библиотека им_В.И.Ленина», т.е. собрав свою цепочку, она пять токенов превратила в два и в таком виде текст был передан дальше на вход грамматике org.cxx.



Надо понимать, что так происходит каждый раз, когда грамматика ссылается на статью из словаря (т.е. используется помета kwtype): сначала все цепочки из словаря собираются в так называемые мультитокены, и только потом начинают работать правила грамматики.


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


This entry passed through the Full-Text RSS service — if this is your content and you're reading it on someone else's site, please read the FAQ at http://ift.tt/jcXqJW.


Microsoft закроет поддержку небезопасных версий Internet Explorer в 2016 г


сегодня в 15:34


Разработчики IE объявили о том, что в начале 2016 г. будет закрыта поддержка небезопасных версий браузера, которые все еще могут использоваться на Windows 7 и Windows 8/8.1 при отсутствии там обновлений. Таким образом, компания в очередной раз подталкивает пользователей к использованию новейшей версии Internet Explorer 11 на Windows 7-8-8.1, которая содержит значительное количество возможностей безопасности (Расширенный защищенный режим, 64-битные вкладки, Anti-UAF, HEASLR-модули) и защиты от эксплойтов (могут работать в связке только с последними версиями Windows).


Microsoft выделила так называемые комбинации Windows и Internet Explorer, которые будут продолжать получать обновления. Например, для устаревшей up-to-date версии Windows Vista SP2 + Internet Explorer 9 обновления все еще будут доставляться, в силу того, что Vista как ОС не содержит в себе возможности безопасности, необходимых для правильной работы IE10+, т. е. пользователь не может обновиться до новых версий браузера. Microsoft вынуждена поддерживать подобные устаревшие комбинации, так как существует определенный срок расширенной поддержки Vista и ПО, которое поставляется с ней. Ниже в таблице даны комбинации браузеров и ОС, которые будут поддерживаться после начала 2016 г.


Закрытие поддержки коснется в первую очередь пользователей Windows 7, которые не хотят устанавливать security-обновления для своей системы. Windows 7 поставлялась с IE 8, но полностью обновленная up-to-date ОС с SP1 использует безопасную 11-ю версию браузера.





Только зарегистрированные пользователи могут оставлять комментарии.

Войдите, пожалуйста.


This entry passed through the Full-Text RSS service — if this is your content and you're reading it on someone else's site, please read the FAQ at http://ift.tt/jcXqJW.


Пополняем шпаргалки по C++: неявные перемещающий конструктор и оператор присваивания

Когда не так часто, как хотелось бы, приходится работать с языком, некоторые аспекты забываются. А некоторые никогда и не откладываются в голове. Поэтому, когда возникают вопросы, приходится отвлекаться и лезть в документацию.

Что бы сэкономить время в последующем, а так же, что бы лучше понять в ходе обучения, крайне помогает вести конспекты и делать наглядные шпаргалки. Шпаргалку можно повесить рядом на стену. Хороши шпаргалки в виде блок-схем, по которым можно легко, по шагам, получить нужный результат (например выбрать правильный контейнер).


Под катом я решил опубликовать пару шпаргалок для определения условия когда будет создан компилятором неявный перемещающий конструктор и перемещающий оператор присваивания.


Шпаргалки представлены в виде PDF файлов для печати на принтере A4, в виде картинки PNG, а так же исходников в SVG.


Неявный перемещающий конструктор


Неявный перемещающий оператор присвания




Исходники и PDF формата A4: http://ift.tt/1kQQbCp


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


Используемые материалы:

http://ift.tt/V6FcZ8

http://ift.tt/V6FbVl

http://ift.tt/1kQQbSJ

http://ift.tt/V6Fcbz

http://ift.tt/1eYaI2e

http://ift.tt/V6FcZ9


PS где принято хранить файлы не картинки для хабра?


This entry passed through the Full-Text RSS service — if this is your content and you're reading it on someone else's site, please read the FAQ at http://ift.tt/jcXqJW.


Made with IBM: где используются технологии IBM?


Не так давно в блоге IBM публиковалось несколько постов, в которых показывались возможности суперкомпьютера Watson и сферы практического применения этих возможностей. Вот первый пост по этой теме, а вот второй.


И в первой, и во второй записи упоминался не только Watson, но и другие технологии корпорации, включая IBM Cloud. Сейчас мы хотим показать области применения и других сервисов/технологий. И само собой, такая демонстрация возможностей будет проводиться на практических примерах.


Онкологический центр М. Д. Андерсона


Генетическая информация, расшифрованный геном — это Big Data в прямом смысле слова. Данных — огромное количество, и во многих случаях их необходимо структурировать, а также найти в различных наборах данных нечто общее. Все это, как никто другие, понимают врачи-онкологи, которые говорят, что нет двух одинаковых раковых опухолей.


Борьба с раком должна быть индивидуальной, поэтому все методы борьбы подбираются отдельно для каждого человека. И в этом помогают ресурсы уже много раз упомянутого на Хабре суперкомпьютера IBM Watson.


Его возможности использует Онкологический центр М. Д. Андерсона, где разработали с помощью суперкомпьютера инструмент, получивший название «MD Anderson Oncology Expert Advisor™». Этот инструмент, использующий ресурсы IBM Watson, позволяет диагностировать разновидность рака с одновременным указанием возможных способов лечения рака у конкретного человека.


Для подбора оптимального варианта «MD Anderson Oncology Expert Advisor™» анализирует генетическую карту пациента, тысячи страниц специализированной медицинской литературы, диагнозов и примеров успешного излечения в схожих случаях.


Врач-онколог просто не в состоянии проделать такую же работу за сколько-нибудь вменяемое время. IBM Watson выполняет все задачи за считанные минуты и часы.



Игровой мир Kuma Games


Компания Kuma Games работает в игровой сфере уже много лет, а с 2007 года эта компания использует ресурсы IBM Cloud. В результате команда Kuma Games более эффективно разрабатывает игровые сервисы/приложения, основываясь на такой мощной платформе, как IBM Cloud.


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



Розничная сеть Macy


Macy’s — одна из крупнейших и старейших сетей розничной торговли в США. Основана в 1858 году Роулендом Хасси Мейси (англ. Rowland Hussey Macy). По состоянию на 2010 год в сеть входит более 800 универмагов непродовольственных товаров. Магазины сети ориентированы на торговлю одеждой и обувью, также в магазинах продаётся мебель, товары для дома, постельные принадлежности, украшения, косметика.


При помощи сервисов IBM, включая IBM Big Data & Analytics, компания смогла разработать персонализированного виртуального советника для покупателей, сервис My Macy. Этот сервис отслеживает историю покупок для каждого человека, и на основе индивидуальной информации дает персонализированные советы и делает персонализированные предложения. Надо думать, противникам использования натуральной кожи/шерсти для изготовления одежды и обуви этот сервис вряд ли посоветует «шикарные кожаные туфли». А вот шикарные туфли из кожзама — пожалуйста.



Винный ритейлер Millesima



Компания Millesima продает вина не первый год. Сервис IBM Big Data & Analytics помог компании наладить персонализированную работу с клиентами. Теперь вина предлагаются клиентам, исходя из истории их предыдущих покупок.


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


Продавец вряд ли способен проанализировать все эти данные, особенно, если брать в расчет количество клиентов Millesima, исчисляемое десятками тысяч.



Уимблдон


Это — больше, чем спортивный турнир, Уимблдон — это спортивно-культурное событие мирового масштаба. Само собой, не все любят теннис, но Уимблдон собирает десятки тысяч посетителей и десятки миллионов зрителей.


Само собой, бОльшая часть любителей тенниса смотрят турнир удаленно. Кто по ТВ, кто в онлайн-трансляции. И как раз в последнем случае необходимо уметь прогнозировать, сколько зрителей будет смотреть трансляцию, чтобы соответственно масштабировать инфраструктуру онлайн-вещания.


Раньше с этим были большие проблемы, особенно во время неожиданного наплыва зрителей. Теперь инструмент IBM Cloud помогает прогнозировать увеличение числа зрителей, что, в свою очередь, позволяет адаптировать инфраструктуру онлайн-вещания «на лету».



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


This entry passed through the Full-Text RSS service — if this is your content and you're reading it on someone else's site, please read the FAQ at http://ift.tt/jcXqJW.


«Конфиденциально» — маркетинговый ход или реализованная опция? Проект Sphere Live (beta)



Здравствуйте, дорогие Хабровчане!

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


Сразу оговоримся, в этом посте не будут освещаться проблемы разработки, тем более, что об этом вы сможете узнать из интервью руководителя отдела разработки нашей компании Алексея Глызина, которое у него взял известный среди разработчиков на Delphi блогер — Александр Божко. Мы познакомим вас с результатом, которого добились, используя Delphi XE6. Итак, начнем.


Под катом вас ждет подробное описание функционала, анонс реализованных в коде возможностей, GUI, полезные фичи, планы на будущее и многое другое…

ВНИМАНИЕ! Много скриншотов!..



«Sphere Live» — это бесплатная мультиплатформенная система организации видеоконференцсвязи с неограниченным количеством участников в форме симметричных и ассиметричных лекций с интегрированной биллинговой системой, функциями файлообмена и облачного хранилища, а также защитой информации о пользователе (переписка, отправленные и переданные файлы, видео- и аудиообщение).


На кого ориентирован наш продукт?




Проект Sphere Live ориентирован на самую широкую аудиторию пользователей, как на обычного пользователя, который все время «на связи», так и на бизнесмена, которому нужно проводить конференции и совещания удаленно, контролировать работу сотрудников «вне офиса» посредством функций демонстрации рабочего стола и удаленного доступа к камере, как на студента заочника, который выбрал формат дистанционного обучения, так и на любого преподавателя, консультанта, блогера.

Проект реализовывался «для себя», и мы хотели решить следующие задачи:

— обеспечить качественную и надежную связь во время аудио/видео вызова;

— организовывать групповые видеозвонки;

— иметь инструмент для отправки сразу нескольких файлов с не лимитированным объемов информации неограниченному количеству адресатов на максимально возможной скорости;

— «расшаривать» файлы;

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

— интегрировать переводчик в чате для общения на разных языках;

— быть уверенным, что никто не получит доступ к переданной мной информации, даже разработчик софта;

— знать, что никто не прослушает ваш разговор;

— создать инструмент для проведения взаиморасчетов внутри самой программы с целью организации платных аудио/видеозвонков, чтобы упростить задачу сбора средств и уменьшить вероятность неоплаты за оказанные услуги: индивидуальные и групповые консультации, лекции и т.д.;

— возможность передачи и просмотра любых файлов на мобильных устройствах;

— обеспечить работу с файлами только в программе, чтобы максимально сохранить у автора его права;

— сэкономить трафик для пользователя за счет уникальной технологии передачи аудио/видеопотоков и файлов;

— организовать удобное и надежное хранилище с неограниченным объемом.


Это лишь небольшой список задач, который мы уже решили на уровне кода. Реализацию отдельных задач в интерфейсе, мы как раз и хотим вам сегодня продемонстрировать. Остальные функции и реализованные задачи будут появляться в каждой новой версии, которую мы планируем выпускать еженедельно с подробной историей изменений и обзором на Хабре в нашем блоге и на сайте.


Принцип реализации конфиденциальности в Sphere Live




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

Во-первых, обеспечить полную конфиденциальность от «3-х лиц» нам удалось на уровне архитектуры клиент-серверного приложения. Нет никакого доступа к базе данных. Его просто не существует «из вне». Клиентское приложение не получает никакого доступа к БД. Оно лишь «общается» с сервером. А сервер, в свою очередь, используя контроллеры и специально разработанный интерпретатор, оперирует с данными пользователя: переписка со своими контактами, отправленные/переданные им/ему файлы, доступ к своему профилю и содержащейся в нем информации. В общем организацией всего занимается сервер, а точнее — сервера. Поэтому утечка информации возможна лишь в том случае, если пользователь предоставил логин и пароль «3-му лицу». Однако и в этом случае мы предусмотрели в архитектуре системы дополнительные опции для защиты. В случае утери логина и пароля программа будет Вам сообщать об авторизации новых неизвестных устройств, в т.ч. и SMS-сообщениями и сообщением на e-mail, и позволять блокировать их.


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


Одним из элементов защиты от прослушивания является особенность разработанного нами протокола передачи аудио/видео:

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


Физическое вторжение и изъятие информации из файлового хранилища тоже ни к чему не приведет, иными словами, если вы перед отправкой зашифровали файл (допустим сами), а потом еще использовали встроенный в нашей программе инструмент, то прочитать этот файл просто нереально. Недостаточно знать — кто и когда отправил файлы. Недостаточно даже знать логин с паролем пользователя, чьи файлы вы хотите получить. Как мы описали выше, архитектура приложения и всей системы предусматривает и такой вариант: вам не только будет сообщено о попытке авторизации с неизвестного Вам устройства, но и обо всех действиях данного клиента (данная опция нами уже реализована и сейчас проходит этап тестирования. В нашей программе она появится в ближайшее время). Кроме того, уникальная система хранения файлов позволяет иметь доступ к файлам только клиентам, которым данный файл принадлежит.


На этом пока и остановимся, а то у вас не хватит терпения дочитать нашу статью до конца (очень уж объемная получится).


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


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




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

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


Для установки и запуска приложения вам достаточно посетить наш сайт www.sphere-live.com и нажать кнопку «Загрузить». Будет загружен инсталлятор ПО соответствующий вашей операционной системе. На данный момент приложение нельзя установить для Mac OS X Mavericks, поэтому придется подождать следующего обновления (((.


Для Windows



Запустите файл InstallSphere.exe и пройдите процесс установки (это займет у вас несколько секунд, если вы, конечно, не станете изучать лицензионное соглашение).
Для Android



В папке «Download» вы найдете дистрибутив InstallSphere.apk, который вам нужно запустить. После установки у вас появится ярлык SphereLive в разделе «Меню». Запускайте!

Да, процесс установки разный, но дальше все идентично и для Windows, и для Android, и для Mac OS.


Первый запуск



Вы видите стандартное приветственное окно программы (Рис.1), где можно выбрать язык интерфейса (русский или английский, другие языки мы будут появляться в программе по мере их добавления нами). Идем дальше и нажимаем кнопку «Продолжить».


Перед вами выбор: зарегистрироваться или залогиниться (Рис.2), поэтому если вы впервые запускаете наше приложение, тогда вам в раздел «Регистрация», ну а если вы уже пользовались программой, тогда вы сами знаете, что делать дальше. )))



Процедура регистрации максимально упрощена для удобства пользователя. Вам нужно придумать никнейм/ник/логин на латинском языке длиной более 6 символов, придумать пароль и последовательно ввести его дважды. Далее ввести реальный e-mail, иначе при утере пароля вам придется регистрироваться заново. Прочитайте пользовательское соглашение, поставьте галочку и нажмите на кнопку «Регистрация». (Рис.3)


Обзор интерфейса.


Интерфейс.(Рис.4)



Давайте познакомимся со всеми панелями интерфейса.


1. Основное меню.(Рис.5) Активны (в текущей реализации) только следующие разделы: профиль, поиск и добавление контактов, настройки, выход из учетной записи и выход из программы.



2. Информация о пользователе. (Рис.6)

Здесь вы можете изменить статус, проверить/пополнить баланс (1) (об этом мы расскажем в следующих версиях, в процессе подключения данных опций) и перейти в раздел «Детальная информация». (2)



(2) Детальная информация (Рис.7).



В этом разделе вы можете:

— указать свой номер мобильного телефона, чтобы пользователи, которые внесены в список ваших контактов, смогли отправлять вам SMS из программы, не вводя ваш номер телефона;

-сменить аватар, выбрав его из своего архива или сделав фото с камеры.


3. Горячие клавиши: аудиовызов, видеовызов, открыть чат (активны при выделенном контакте). (Рис.4)


4. Список контактов (ниже описание контекстного меню в этом разделе). (Рис.4)


5. Списки контактов. (Рис.4)


6. Окно вывода информации (для настроек и чата, в ОС Android эти окна открываются в случае вызова соответствующих разделов и функций)… (Рис.4)


Прежде чем перейти к рассмотрению основных функций программы, позволим себе «пробежаться» по разделу «Настройки» без дополнительного описания, т.к. содержимое этих разделов интуитивно понятно любому. (Рис.4)


а) Основные. (Рис. 4)


б) Интерфейс. (Рис.8)



в) Аудио. (Рис.9)



г) Видео. (Рис.10)



д) Видеонаблюдение. (Рис.11)



Здесь мы задержимся, т.к. данные настройки не являются стандартными. Видеонаблюдение организовано по принципу удаленного доступа, поэтому если вы хотите, чтобы ваш собеседник (только тот, кто авторизован в вашем списке контактов) мог в любой момент увидеть вас, то нужно активировать эту функцию, «включив тумблер», далее ввести дважды пароль и, выбрав из своего списка пользователей, добавить их в список разрешенных контактов. «А как использовать эту функцию?» — «Читайте дальше!»


е) Файлы


ж) Переводчик.


Функции




В этом разделе мы рассмотрим все возможные (в данной версии) функции, но сначала нам необходимо обзавестись «друзьями»/контактами. Для этого мы можем использовать «основное меню» или же воспользоваться панелью «управления списками контактов», кликнув на соответствующую кнопку.(Рис.12)

Если вы «одиноки», а также хотите внести свой вклад в развитие проекта Sphere Live, рекомендуем вам ввести в строке поиска следующее имя — support и отправить запрос на добавление в список контактов. (Рис.12)



После подтверждения сотрудником техподдержки вашего запроса, контакт support авторизуется у вас в списке контактов.


Теперь мы можем перейти непосредственно к тестированию основных функций. Для этого вам необходимо выделить контакт и правой кнопкой мыши кликнуть по нему (для Android и девайсов, поддерживающих функцию тачскрин, необходимо выделить контакт и удерживать «LongTap»), чтобы вызвать контекстное меню, в котором отображены все функции. (Рис.13)



1. Отметки. Данная функция позволяет выделить контакты для выполнения групповых команд.

2. Открыть чат. Эта функция открывает чат с выбранным контактом (функции и интерфес чата мы рассмотрим ниже). (Рис.14)



3. Звонок. Аудиозвонок контакту. (Рис.15)



4. Видеозвонок. Видеозвонок контакту. (Рис.16)



5. Звонки. (Рис.17)



Данный пункт содержит субменю: Звонки на мобильный телефон и Видеонаблюдение.


Звонок на мобильный телефон возможен только для устройств под управление ОС Android при условии, что контакт, которому вы хотите позвонить указал свой номер телефона у себя в профиле. ВНИМAНИЕ! Звонок совершается с использованием вашего сотового оператора по действующему тарифу на мобильный телефон контакта.


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


6. Отправить файлы. (Рис.18) Данная опция временно не доступна для ОС Android.



В панели отправки файлов можно добавить неограниченное количество файлов (1), но с ограничением в 200 МБ (суммарный объем упакованных/сжатых файлов), а также добавить в рассылку других адресатов (2) из своего списка контактов.


7.Отправка. (Рис.19)



Субменю включает в себя две активные функции: Отправка e-mail (1) и Отправка SMS (2).


8. Информация о контакте.


9. Контакт. Данный пункт меню включает в себя субменю управления контактами: «В избранное», «Удалить из избранного», «Переименовать контакт», «Удалить контакт».


Интерфейс чата




1. Окно отображения отправленных/принятых текстовых сообщений.(Рис.20)

2. Панель ввода текстовых сообщений с контекстным меню редактора.(Рис.20)

3. Панель идентификации собеседника.(Рис.20)

4. Горячие кнопки (аудиозвонок, отправка файла, смс, отправка e-mail).(Рис.20)

5. Период отображения истории чата.(Рис.20)

6. Переводчик. (Рис.20)


Здесь можно выбрать с какого языка на какой переводить переданные и принятые тестовые сообщения.


Анонс до 31.08.2014 г.



Мы планируем подключить большую часть реализованного нами в коде функционала, а именно:

— настройки качества аудио и видео;

— видеоконференция с неограниченным количеством участников (ограничение на уровне железа и пропускной способности интернета);

— ассиметричная видеоконференция;

— групповой чат;

— история звонков, принятых и преданных файлов, групповых чатов;

а также:

— оптимизация GUI под планшет;

— светлый скин;

— выпустить версию для Mac OS X.

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


Все комментарии (замечания, пожелания, рекомендации, жесткая конструктивная критика) пишите в личку или по следующим контактам:


e-mail: support@sphere-live.com


Sphere Live: support (только предварительно добавьте нас в список контактов)


Форум: forum.sphere-live.com/


В завершение небольшое задание для тех, кто любит подарки и наделен талантом исследователя: найдите в приложении фичи, которые не опубликованы в статье и получите VIP-аккаунт с расширенным функционалом и увеличенным файловым хранилищем. Результаты публикуйте в комментариях.


До встречи в новых публикациях!


P.S. несколько Android скринов:



This entry passed through the Full-Text RSS service — if this is your content and you're reading it on someone else's site, please read the FAQ at http://ift.tt/jcXqJW.