-Поиск по дневнику

Поиск сообщений в rss_rss_hh_full

 -Подписка по e-mail

 

 -Постоянные читатели

 -Статистика

Статистика LiveInternet.ru: показано количество хитов и посетителей
Создан: 17.03.2011
Записей:
Комментариев:
Написано: 1

Habrahabr








Добавить любой RSS - источник (включая журнал LiveJournal) в свою ленту друзей вы можете на странице синдикации.

Исходная информация - http://habrahabr.ru/rss/.
Данный дневник сформирован из открытого RSS-источника по адресу http://feeds.feedburner.com/xtmb/hh-full, и дополняется в соответствии с дополнением данного источника. Он может не соответствовать содержимому оригинальной страницы. Трансляция создана автоматически по запросу читателей этой RSS ленты.
По всем вопросам о работе данного сервиса обращаться со страницы контактной информации.

[Обновить трансляцию]

tig — улучшаем продуктивность работы с git

Понедельник, 11 Сентября 2017 г. 13:29 + в цитатник
imrobot2002 сегодня в 13:29 Разработка

tig — улучшаем продуктивность работы с git

    Всем привет,


    хочу рассказать о консольной утилите, которая значительно увеличила мою продуктивность работы с Git, и, надеюсь, ускорит и вашу также. Называется она tig и была написана канадским программистом Джонасом Фонсека (Jonas Fonseca) ещё в далёком 2006-м году, но по настоящий день она активно развивается и поддерживается в великолепном состоянии. Я хочу показать её функционал (внимание, есть относительно тяжелые gif-ки внутри) и поделиться самыми удобными способами использования.



    Несмотря на обилие визуальных GUI для работы с git, многие разработчики всё же предпочитают работать в консоли. В git есть много средств для увеличения производительности — алиасы, автодополнение, автоматическая коррекция ошибок и т.д., но всё же многие рядовые действия, такие как навигация по истории коммитов, анализ diff-ов, просмотр git blame и прочее — отнимают прилично времени и не всегда удобны.


    Установка


    Установка подробно описана в документации на главной странице проекта.
    Если вы работаете в MacOS, то tig доступен через Homebrew:


     brew install tig

    В Linux она тоже доступна для всех основных репозиториев:


    apt-get install tig
    yum install tig

    Для остальных вариантов, стандартная схема — скачать исходный код (из релизов или через git clone и выполнить make && make install. Это подробно описано в ссылке выше.


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


    Вот коротенькое демо того, как выглядит интерфейс при запуске команды tig из директории репозитория:



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


    Главная клавиша это — h: показать окно помощи :)



    Как видим, есть несколько режимов (views) — главный, режим просмотра diff-ов, режим лога, режим просмотра дерева файлов, blame режим, просмотр текущего статуса и т.д.


    Между всеми этими режимами переключаться довольно просто, обычно достаточно стрелочками (или j/k) выбрать нужную запись в логе или файл и нажать Enter, либо, как, например, в случае с blame — соответствующую клавишу (b).


    Режимы отображаются либо на весь экран либо в dual-split режиме. Последний бывает либо горизонтальный, либо вертикальный — программа сама выбрает его в зависимости от соотношения сторон терминала, и умеет обновлять на лету. Чтобы закрыть текущий режим (и вернуться к предыдущему) — просто нажимаем q (quit). Чтобы, наоборот, развернуть окно с текущим режимом на полный экран — O. Переключаться между режимами в dual-split режиме — Tab.


    В режиме просмотра diffочень удобно увеличивать количество строк сверху и снизу изменённой строки с помощью [ и ] (уменьшить и увеличить, соответственно):



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


    Drop-in замена git


    Для некоторых команд tig может спокойно работать как drop-in замена git.


    tig status
    tig log
    tig show
    tig blame file
    tig grep pattern
    tig refs
    tig stash
    tig status

    Также, в режиме pager-а:


    git show | tig

    Конфигурация


    tig достаточно гибкий в плане настройки — у него есть файл конфигурации (путь к которому также можно конфигурировать через TIGRC_USER) — ~/.tigrc и поддержка readline.


    Можно создавать свои собственные команды. Например, следующая команда копирует ID коммита в буфер обмена на MacOS X:


    bind generic 5 !@sh -c "echo %(commit) | pbcopy"


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


    Заключение


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


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


    Ссылки


    Original source: habrahabr.ru (comments, light).

    https://habrahabr.ru/post/337644/


    Метки:  

    tig — улучшаем продуктивность работы с git

    Понедельник, 11 Сентября 2017 г. 13:29 + в цитатник
    imrobot2002 сегодня в 13:29 Разработка

    tig — улучшаем продуктивность работы с git

      Всем привет,


      хочу рассказать о консольной утилите, которая значительно увеличила мою продуктивность работы с Git, и, надеюсь, ускорит и вашу также. Называется она tig и была написана канадским программистом Джонасом Фонсека (Jonas Fonseca) ещё в далёком 2006-м году, но по настоящий день она активно развивается и поддерживается в великолепном состоянии. Я хочу показать её функционал (внимание, есть относительно тяжелые gif-ки внутри) и поделиться самыми удобными способами использования.



      Несмотря на обилие визуальных GUI для работы с git, многие разработчики всё же предпочитают работать в консоли. В git есть много средств для увеличения производительности — алиасы, автодополнение, автоматическая коррекция ошибок и т.д., но всё же многие рядовые действия, такие как навигация по истории коммитов, анализ diff-ов, просмотр git blame и прочее — отнимают прилично времени и не всегда удобны.


      Установка


      Установка подробно описана в документации на главной странице проекта.
      Если вы работаете в MacOS, то tig доступен через Homebrew:


       brew install tig

      В Linux она тоже доступна для всех основных репозиториев:


      apt-get install tig
      yum install tig

      Для остальных вариантов, стандартная схема — скачать исходный код (из релизов или через git clone и выполнить make && make install. Это подробно описано в ссылке выше.


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


      Вот коротенькое демо того, как выглядит интерфейс при запуске команды tig из директории репозитория:



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


      Главная клавиша это — h: показать окно помощи :)



      Как видим, есть несколько режимов (views) — главный, режим просмотра diff-ов, режим лога, режим просмотра дерева файлов, blame режим, просмотр текущего статуса и т.д.


      Между всеми этими режимами переключаться довольно просто, обычно достаточно стрелочками (или j/k) выбрать нужную запись в логе или файл и нажать Enter, либо, как, например, в случае с blame — соответствующую клавишу (b).


      Режимы отображаются либо на весь экран либо в dual-split режиме. Последний бывает либо горизонтальный, либо вертикальный — программа сама выбрает его в зависимости от соотношения сторон терминала, и умеет обновлять на лету. Чтобы закрыть текущий режим (и вернуться к предыдущему) — просто нажимаем q (quit). Чтобы, наоборот, развернуть окно с текущим режимом на полный экран — O. Переключаться между режимами в dual-split режиме — Tab.


      В режиме просмотра diffочень удобно увеличивать количество строк сверху и снизу изменённой строки с помощью [ и ] (уменьшить и увеличить, соответственно):



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


      Drop-in замена git


      Для некоторых команд tig может спокойно работать как drop-in замена git.


      tig status
      tig log
      tig show
      tig blame file
      tig grep pattern
      tig refs
      tig stash
      tig status

      Также, в режиме pager-а:


      git show | tig

      Конфигурация


      tig достаточно гибкий в плане настройки — у него есть файл конфигурации (путь к которому также можно конфигурировать через TIGRC_USER) — ~/.tigrc и поддержка readline.


      Можно создавать свои собственные команды. Например, следующая команда копирует ID коммита в буфер обмена на MacOS X:


      bind generic 5 !@sh -c "echo %(commit) | pbcopy"


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


      Заключение


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


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


      Ссылки


      Original source: habrahabr.ru (comments, light).

      https://habrahabr.ru/post/337644/


      Метки:  

      tig — улучшаем продуктивность работы с git

      Понедельник, 11 Сентября 2017 г. 13:29 + в цитатник
      imrobot2002 сегодня в 13:29 Разработка

      tig — улучшаем продуктивность работы с git

        Всем привет,


        хочу рассказать о консольной утилите, которая значительно увеличила мою продуктивность работы с Git, и, надеюсь, ускорит и вашу также. Называется она tig и была написана канадским программистом Джонасом Фонсека (Jonas Fonseca) ещё в далёком 2006-м году, но по настоящий день она активно развивается и поддерживается в великолепном состоянии. Я хочу показать её функционал (внимание, есть относительно тяжелые gif-ки внутри) и поделиться самыми удобными способами использования.



        Несмотря на обилие визуальных GUI для работы с git, многие разработчики всё же предпочитают работать в консоли. В git есть много средств для увеличения производительности — алиасы, автодополнение, автоматическая коррекция ошибок и т.д., но всё же многие рядовые действия, такие как навигация по истории коммитов, анализ diff-ов, просмотр git blame и прочее — отнимают прилично времени и не всегда удобны.


        Установка


        Установка подробно описана в документации на главной странице проекта.
        Если вы работаете в MacOS, то tig доступен через Homebrew:


         brew install tig

        В Linux она тоже доступна для всех основных репозиториев:


        apt-get install tig
        yum install tig

        Для остальных вариантов, стандартная схема — скачать исходный код (из релизов или через git clone и выполнить make && make install. Это подробно описано в ссылке выше.


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


        Вот коротенькое демо того, как выглядит интерфейс при запуске команды tig из директории репозитория:



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


        Главная клавиша это — h: показать окно помощи :)



        Как видим, есть несколько режимов (views) — главный, режим просмотра diff-ов, режим лога, режим просмотра дерева файлов, blame режим, просмотр текущего статуса и т.д.


        Между всеми этими режимами переключаться довольно просто, обычно достаточно стрелочками (или j/k) выбрать нужную запись в логе или файл и нажать Enter, либо, как, например, в случае с blame — соответствующую клавишу (b).


        Режимы отображаются либо на весь экран либо в dual-split режиме. Последний бывает либо горизонтальный, либо вертикальный — программа сама выбрает его в зависимости от соотношения сторон терминала, и умеет обновлять на лету. Чтобы закрыть текущий режим (и вернуться к предыдущему) — просто нажимаем q (quit). Чтобы, наоборот, развернуть окно с текущим режимом на полный экран — O. Переключаться между режимами в dual-split режиме — Tab.


        В режиме просмотра diffочень удобно увеличивать количество строк сверху и снизу изменённой строки с помощью [ и ] (уменьшить и увеличить, соответственно):



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


        Drop-in замена git


        Для некоторых команд tig может спокойно работать как drop-in замена git.


        tig status
        tig log
        tig show
        tig blame file
        tig grep pattern
        tig refs
        tig stash
        tig status

        Также, в режиме pager-а:


        git show | tig

        Конфигурация


        tig достаточно гибкий в плане настройки — у него есть файл конфигурации (путь к которому также можно конфигурировать через TIGRC_USER) — ~/.tigrc и поддержка readline.


        Можно создавать свои собственные команды. Например, следующая команда копирует ID коммита в буфер обмена на MacOS X:


        bind generic 5 !@sh -c "echo %(commit) | pbcopy"


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


        Заключение


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


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


        Ссылки


        Original source: habrahabr.ru (comments, light).

        https://habrahabr.ru/post/337644/


        Метки:  

        [Из песочницы] Learnopengl. Урок 2.5 — Источники света

        Понедельник, 11 Сентября 2017 г. 12:44 + в цитатник

        Метки:  

        [Из песочницы] Learnopengl. Урок 2.5 — Источники света

        Понедельник, 11 Сентября 2017 г. 12:44 + в цитатник

        Метки:  

        [Из песочницы] Learnopengl. Урок 2.5 — Источники света

        Понедельник, 11 Сентября 2017 г. 12:44 + в цитатник

        Метки:  

        Кто все эти люди? Давайте спросим К50

        Понедельник, 11 Сентября 2017 г. 12:37 + в цитатник
        i-cat сегодня в 12:37 Разработка

        Кто все эти люди? Давайте спросим К50



          Привет, Хабр. Не будем лить воду до ката, сразу приступим к делу. Оптимизатор ставок в контекстной рекламе платформа К50 предлагает своим клиентам инструменты для увеличения эффективности рекламы. Большая часть имеет отношение к онлайн-среде, что вполне логично, ведь речь идет о сетевых технологиях. Для компаний, у которых обращения по телефону составляют 30% (а в некоторых тематиках – до 70-80%) от общего числа входящих обращений, данных для анализа рекламы было недостаточно. Именно для таких клиентов К50 решили разработать сервис, чтобы получить детальную информацию по каждому звонку, включая его длительность, запись, ключевое слово и цепочку событий-визитов, которая и привела клиента. Звучит сложно, но реализовано это было достаточно оперативно благодаря готовым компонентам Voximplant (ну, чуть-чуть себя похвалили, простите).


          Динамичный конструктор для динамического колл-трекинга


          Как вы могли догадаться, речь идет о статическом и динамическом колл-трекинге. Напомним, чем они отличаются друг от друга. Статический колл-трекинг помогает узнать, какой из каналов наиболее эффективный: фейсбук, контекстная реклама или наружка. А динамический колл-трекинг – не только каналы, но и эффективность разных ключевых слов с оценкой действий отдельных клиентов.

          С точки зрения телефонии, в первом случае виртуальный номер выделяется на каждый рекламный канал, а во втором – на каждого посетителя сеанса.

          Ребята из К50 продумали всю логику и даже подняли собственную телефонию. Всё было бы хорошо, но своя телефония была очень капризная и требовала чуть ли не специально выделенного человека на ее поддержку. Конфетно-букетный период закончился тем, что К50 узнали о Voximplant – и безболезненно перешли на новую платформу. Понадобилось несколько строк кода, чуть времени и, конечно, хорошее настроение (без него вообще никак, да).

          Испытание Voximplant в полевых условиях


          К50 арендует у нас пул виртуальных номеров. Если их клиенты подключили статический колл-трекинг, то виртуальных номеров нужно немного: достаточно по одному на каждый канал. В динамическом колл-трекинге номер-«маска» “подменяется” для каждого пользователя, поэтому количество номеров рассчитывается в зависимости от количества юзеров и длительности сеанса. К50 предлагают своим клиентам номера для 60 городов России и 30 стран (столько же, сколько и мы предлагаем всем разработчикам Voximplant).

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


          После звонка Voximplant отдает все данные в K50: время, длительность и запись разговора, номер подмены, номер переадресации и прочее. Собранные данные К50 анализирует и ранжирует для каждого из пользователей отдельно, в соответствии с данными, которые уже собраны: цепочка визитов, источник и ключевое слово.

          Теперь все сказанное, только в виде картинки, так нагляднее.



          Ещё рекомендуем посмотреть нашу статью на Хабре, с примерами реализации отслеживания звонков.

          И обратно


          Ещё К50 предлагает своим клиентам виджет для обратных звонков – в котором посетитель сайта может оставить свой номер, чтобы ему перезвонили.

          Когда на сайте клиента К50 появляется заявка на обратный звонок, К50 динамически собирает «анкету пользователя». В нее попадают его имя, интересы, страница сайта. И тогда Voximplant, дозвонившись менеджеру, проговаривает ему сформированное сообщение. Например, «Алладин, интересует волшебная лампа». И пока менеджер прослушивает это сообщение и морально готовится рассказать про модели волшебных ламп с джиннами, Voximplant дозванивается до Алладина и соединяет его с менеджером. Довольны в этом случае все (кроме, наверное, джиннов).

          Еще картинка:


          И что в итоге?


          Для того чтобы начать отслеживать звонки, клиент К50 должен установить код счетчика на свой сайт. Ничего сложного.

          Трекер синхронизирован с аналитикой К50, Google Analytics и CRM клиента, и поэтому клиенты могут проследить всю воронку продаж – и узнать, какой именно звонок привел к покупке. На основе данных от Трекера (просмотр страниц, звонил ли за консультацией), можно в режиме реального времени настраивать рекламные кампании и показывать новые сообщения – для этого есть специализированные сервисы К50.

          К50 работают на нас с ноября 2015 года. Ну и для того, чтобы вы оценили масштаб сотрудничества наших платформ, укажем объемы обрабатываемых звонков – 180 тысяч ежемесячно, с определением источника каждого звонка и получением детализированной информации об абоненте. Вроде неплохо, как считаете? Если нужно больше технической информации, с удовольствием предоставим, спрашивайте.

          Картинка до ката взята с сайта The Irish Time.
          Original source: habrahabr.ru (comments, light).

          https://habrahabr.ru/post/336522/


          Метки:  

          Кто все эти люди? Давайте спросим К50

          Понедельник, 11 Сентября 2017 г. 12:37 + в цитатник
          i-cat сегодня в 12:37 Разработка

          Кто все эти люди? Давайте спросим К50



            Привет, Хабр. Не будем лить воду до ката, сразу приступим к делу. Оптимизатор ставок в контекстной рекламе платформа К50 предлагает своим клиентам инструменты для увеличения эффективности рекламы. Большая часть имеет отношение к онлайн-среде, что вполне логично, ведь речь идет о сетевых технологиях. Для компаний, у которых обращения по телефону составляют 30% (а в некоторых тематиках – до 70-80%) от общего числа входящих обращений, данных для анализа рекламы было недостаточно. Именно для таких клиентов К50 решили разработать сервис, чтобы получить детальную информацию по каждому звонку, включая его длительность, запись, ключевое слово и цепочку событий-визитов, которая и привела клиента. Звучит сложно, но реализовано это было достаточно оперативно благодаря готовым компонентам Voximplant (ну, чуть-чуть себя похвалили, простите).


            Динамичный конструктор для динамического колл-трекинга


            Как вы могли догадаться, речь идет о статическом и динамическом колл-трекинге. Напомним, чем они отличаются друг от друга. Статический колл-трекинг помогает узнать, какой из каналов наиболее эффективный: фейсбук, контекстная реклама или наружка. А динамический колл-трекинг – не только каналы, но и эффективность разных ключевых слов с оценкой действий отдельных клиентов.

            С точки зрения телефонии, в первом случае виртуальный номер выделяется на каждый рекламный канал, а во втором – на каждого посетителя сеанса.

            Ребята из К50 продумали всю логику и даже подняли собственную телефонию. Всё было бы хорошо, но своя телефония была очень капризная и требовала чуть ли не специально выделенного человека на ее поддержку. Конфетно-букетный период закончился тем, что К50 узнали о Voximplant – и безболезненно перешли на новую платформу. Понадобилось несколько строк кода, чуть времени и, конечно, хорошее настроение (без него вообще никак, да).

            Испытание Voximplant в полевых условиях


            К50 арендует у нас пул виртуальных номеров. Если их клиенты подключили статический колл-трекинг, то виртуальных номеров нужно немного: достаточно по одному на каждый канал. В динамическом колл-трекинге номер-«маска» “подменяется” для каждого пользователя, поэтому количество номеров рассчитывается в зависимости от количества юзеров и длительности сеанса. К50 предлагают своим клиентам номера для 60 городов России и 30 стран (столько же, сколько и мы предлагаем всем разработчикам Voximplant).

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


            После звонка Voximplant отдает все данные в K50: время, длительность и запись разговора, номер подмены, номер переадресации и прочее. Собранные данные К50 анализирует и ранжирует для каждого из пользователей отдельно, в соответствии с данными, которые уже собраны: цепочка визитов, источник и ключевое слово.

            Теперь все сказанное, только в виде картинки, так нагляднее.



            Ещё рекомендуем посмотреть нашу статью на Хабре, с примерами реализации отслеживания звонков.

            И обратно


            Ещё К50 предлагает своим клиентам виджет для обратных звонков – в котором посетитель сайта может оставить свой номер, чтобы ему перезвонили.

            Когда на сайте клиента К50 появляется заявка на обратный звонок, К50 динамически собирает «анкету пользователя». В нее попадают его имя, интересы, страница сайта. И тогда Voximplant, дозвонившись менеджеру, проговаривает ему сформированное сообщение. Например, «Алладин, интересует волшебная лампа». И пока менеджер прослушивает это сообщение и морально готовится рассказать про модели волшебных ламп с джиннами, Voximplant дозванивается до Алладина и соединяет его с менеджером. Довольны в этом случае все (кроме, наверное, джиннов).

            Еще картинка:


            И что в итоге?


            Для того чтобы начать отслеживать звонки, клиент К50 должен установить код счетчика на свой сайт. Ничего сложного.

            Трекер синхронизирован с аналитикой К50, Google Analytics и CRM клиента, и поэтому клиенты могут проследить всю воронку продаж – и узнать, какой именно звонок привел к покупке. На основе данных от Трекера (просмотр страниц, звонил ли за консультацией), можно в режиме реального времени настраивать рекламные кампании и показывать новые сообщения – для этого есть специализированные сервисы К50.

            К50 работают на нас с ноября 2015 года. Ну и для того, чтобы вы оценили масштаб сотрудничества наших платформ, укажем объемы обрабатываемых звонков – 180 тысяч ежемесячно, с определением источника каждого звонка и получением детализированной информации об абоненте. Вроде неплохо, как считаете? Если нужно больше технической информации, с удовольствием предоставим, спрашивайте.

            Картинка до ката взята с сайта The Irish Time.
            Original source: habrahabr.ru (comments, light).

            https://habrahabr.ru/post/336522/


            Метки:  

            Кто все эти люди? Давайте спросим К50

            Понедельник, 11 Сентября 2017 г. 12:37 + в цитатник
            i-cat сегодня в 12:37 Разработка

            Кто все эти люди? Давайте спросим К50



              Привет, Хабр. Не будем лить воду до ката, сразу приступим к делу. Оптимизатор ставок в контекстной рекламе платформа К50 предлагает своим клиентам инструменты для увеличения эффективности рекламы. Большая часть имеет отношение к онлайн-среде, что вполне логично, ведь речь идет о сетевых технологиях. Для компаний, у которых обращения по телефону составляют 30% (а в некоторых тематиках – до 70-80%) от общего числа входящих обращений, данных для анализа рекламы было недостаточно. Именно для таких клиентов К50 решили разработать сервис, чтобы получить детальную информацию по каждому звонку, включая его длительность, запись, ключевое слово и цепочку событий-визитов, которая и привела клиента. Звучит сложно, но реализовано это было достаточно оперативно благодаря готовым компонентам Voximplant (ну, чуть-чуть себя похвалили, простите).


              Динамичный конструктор для динамического колл-трекинга


              Как вы могли догадаться, речь идет о статическом и динамическом колл-трекинге. Напомним, чем они отличаются друг от друга. Статический колл-трекинг помогает узнать, какой из каналов наиболее эффективный: фейсбук, контекстная реклама или наружка. А динамический колл-трекинг – не только каналы, но и эффективность разных ключевых слов с оценкой действий отдельных клиентов.

              С точки зрения телефонии, в первом случае виртуальный номер выделяется на каждый рекламный канал, а во втором – на каждого посетителя сеанса.

              Ребята из К50 продумали всю логику и даже подняли собственную телефонию. Всё было бы хорошо, но своя телефония была очень капризная и требовала чуть ли не специально выделенного человека на ее поддержку. Конфетно-букетный период закончился тем, что К50 узнали о Voximplant – и безболезненно перешли на новую платформу. Понадобилось несколько строк кода, чуть времени и, конечно, хорошее настроение (без него вообще никак, да).

              Испытание Voximplant в полевых условиях


              К50 арендует у нас пул виртуальных номеров. Если их клиенты подключили статический колл-трекинг, то виртуальных номеров нужно немного: достаточно по одному на каждый канал. В динамическом колл-трекинге номер-«маска» “подменяется” для каждого пользователя, поэтому количество номеров рассчитывается в зависимости от количества юзеров и длительности сеанса. К50 предлагают своим клиентам номера для 60 городов России и 30 стран (столько же, сколько и мы предлагаем всем разработчикам Voximplant).

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


              После звонка Voximplant отдает все данные в K50: время, длительность и запись разговора, номер подмены, номер переадресации и прочее. Собранные данные К50 анализирует и ранжирует для каждого из пользователей отдельно, в соответствии с данными, которые уже собраны: цепочка визитов, источник и ключевое слово.

              Теперь все сказанное, только в виде картинки, так нагляднее.



              Ещё рекомендуем посмотреть нашу статью на Хабре, с примерами реализации отслеживания звонков.

              И обратно


              Ещё К50 предлагает своим клиентам виджет для обратных звонков – в котором посетитель сайта может оставить свой номер, чтобы ему перезвонили.

              Когда на сайте клиента К50 появляется заявка на обратный звонок, К50 динамически собирает «анкету пользователя». В нее попадают его имя, интересы, страница сайта. И тогда Voximplant, дозвонившись менеджеру, проговаривает ему сформированное сообщение. Например, «Алладин, интересует волшебная лампа». И пока менеджер прослушивает это сообщение и морально готовится рассказать про модели волшебных ламп с джиннами, Voximplant дозванивается до Алладина и соединяет его с менеджером. Довольны в этом случае все (кроме, наверное, джиннов).

              Еще картинка:


              И что в итоге?


              Для того чтобы начать отслеживать звонки, клиент К50 должен установить код счетчика на свой сайт. Ничего сложного.

              Трекер синхронизирован с аналитикой К50, Google Analytics и CRM клиента, и поэтому клиенты могут проследить всю воронку продаж – и узнать, какой именно звонок привел к покупке. На основе данных от Трекера (просмотр страниц, звонил ли за консультацией), можно в режиме реального времени настраивать рекламные кампании и показывать новые сообщения – для этого есть специализированные сервисы К50.

              К50 работают на нас с ноября 2015 года. Ну и для того, чтобы вы оценили масштаб сотрудничества наших платформ, укажем объемы обрабатываемых звонков – 180 тысяч ежемесячно, с определением источника каждого звонка и получением детализированной информации об абоненте. Вроде неплохо, как считаете? Если нужно больше технической информации, с удовольствием предоставим, спрашивайте.

              Картинка до ката взята с сайта The Irish Time.
              Original source: habrahabr.ru (comments, light).

              https://habrahabr.ru/post/336522/


              Метки:  

              MBLTdev 2017: первые спикеры, последние билеты по выгодной цене

              Понедельник, 11 Сентября 2017 г. 12:00 + в цитатник
              tankaz сегодня в 12:00 Разработка

              MBLTdev 2017: первые спикеры, последние билеты по выгодной цене



                Привет, Хабр! 27 октября в Москве состоится Международная конференция мобильных разработчиков MBLTdev 2017.

                MBLTdev — это хардкорные доклады уровней Middle+ и Senior, нетворкинг, новые знакомства и полное погружение в мир мобайла. Приглашённые эксперты из США, Европы и России поделятся опытом iOS- и Android-разработки.

                Под катом — подробности о программе и последние билеты по выгодной цене!

                iOS-трек




                iOS-разработчик Люк Пархэм помимо работы над приложением “Fyuse” пишет туториалы для raywenderlich.com. На MBLTdev он выступит с докладом «Во имя скорости: ускоряем работу iOS-приложений». Люк расскажет о причинах падения скорости работы приложения и механизмах её увеличения.

                «Путь джедая или от REST до GraphQL» — доклад Макара Стеценко о необходимом минимуме для работы с GraphQL. Развеем связанные с ним мифы и рассмотрим, как начать использовать его в нативных приложениях, написанных на Swift и Kotlin.

                Научись использовать Audio Unit Extension для генерации и обработки звука вместе с Виктором Стариковым, VoltMobi. Audio Unit Extension — технология, которая позволяет создавать DSP-модули, реализующие преобразование аудио-сигналов. В докладе рассмотрим возможности аудио-расширений и способы их создания.

                Android-трек




                Иван Шорич из PSPDFKit рассмотрит в своём докладе эффективную цепочку Android-анимации с использованием RxJava2 и Kotlin. При анимации элементов пользовательского интерфейса платформа Android предоставляет различные события, такие как запуск, аннулирование, остановка и так далее. Рассмотрим перенос логики анимаций в последовательные вызовы RxJava, делая процесс «реактивным» с улучшенным синтаксисом и контролем потока управления.

                Мобильное приложение «Кошелёк» собирает в телефоне платёжные, транспортные и скидочные карты. Чтобы сделать их использование удобным и «красивым», применяются нативный рендер и Google Awareness API. О них расскажет Данил Терновых в докладе «Как мы оживляем карты».

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

                Ищи больше спикеров на официальном сайте конференции. Следи за обновлениями программы на страницах в социальных сетях: Facebook, Twitter, VK.

                Билеты


                До 16 сентября ты можешь приобрести билет по выгодной цене — 7500 руб.
                Регистрируйся прямо сейчас.

                До встречи на MBLTdev 2017!

                Организаторы конференции: e-Legion и РАЭК
                Original source: habrahabr.ru (comments, light).

                https://habrahabr.ru/post/337480/


                MBLTdev 2017: первые спикеры, последние билеты по выгодной цене

                Понедельник, 11 Сентября 2017 г. 12:00 + в цитатник
                tankaz сегодня в 12:00 Разработка

                MBLTdev 2017: первые спикеры, последние билеты по выгодной цене



                  Привет, Хабр! 27 октября в Москве состоится Международная конференция мобильных разработчиков MBLTdev 2017.

                  MBLTdev — это хардкорные доклады уровней Middle+ и Senior, нетворкинг, новые знакомства и полное погружение в мир мобайла. Приглашённые эксперты из США, Европы и России поделятся опытом iOS- и Android-разработки.

                  Под катом — подробности о программе и последние билеты по выгодной цене!

                  iOS-трек




                  iOS-разработчик Люк Пархэм помимо работы над приложением “Fyuse” пишет туториалы для raywenderlich.com. На MBLTdev он выступит с докладом «Во имя скорости: ускоряем работу iOS-приложений». Люк расскажет о причинах падения скорости работы приложения и механизмах её увеличения.

                  «Путь джедая или от REST до GraphQL» — доклад Макара Стеценко о необходимом минимуме для работы с GraphQL. Развеем связанные с ним мифы и рассмотрим, как начать использовать его в нативных приложениях, написанных на Swift и Kotlin.

                  Научись использовать Audio Unit Extension для генерации и обработки звука вместе с Виктором Стариковым, VoltMobi. Audio Unit Extension — технология, которая позволяет создавать DSP-модули, реализующие преобразование аудио-сигналов. В докладе рассмотрим возможности аудио-расширений и способы их создания.

                  Android-трек




                  Иван Шорич из PSPDFKit рассмотрит в своём докладе эффективную цепочку Android-анимации с использованием RxJava2 и Kotlin. При анимации элементов пользовательского интерфейса платформа Android предоставляет различные события, такие как запуск, аннулирование, остановка и так далее. Рассмотрим перенос логики анимаций в последовательные вызовы RxJava, делая процесс «реактивным» с улучшенным синтаксисом и контролем потока управления.

                  Мобильное приложение «Кошелёк» собирает в телефоне платёжные, транспортные и скидочные карты. Чтобы сделать их использование удобным и «красивым», применяются нативный рендер и Google Awareness API. О них расскажет Данил Терновых в докладе «Как мы оживляем карты».

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

                  Ищи больше спикеров на официальном сайте конференции. Следи за обновлениями программы на страницах в социальных сетях: Facebook, Twitter, VK.

                  Билеты


                  До 16 сентября ты можешь приобрести билет по выгодной цене — 7500 руб.
                  Регистрируйся прямо сейчас.

                  До встречи на MBLTdev 2017!

                  Организаторы конференции: e-Legion и РАЭК
                  Original source: habrahabr.ru (comments, light).

                  https://habrahabr.ru/post/337480/


                  MBLTdev 2017: первые спикеры, последние билеты по выгодной цене

                  Понедельник, 11 Сентября 2017 г. 12:00 + в цитатник
                  tankaz сегодня в 12:00 Разработка

                  MBLTdev 2017: первые спикеры, последние билеты по выгодной цене



                    Привет, Хабр! 27 октября в Москве состоится Международная конференция мобильных разработчиков MBLTdev 2017.

                    MBLTdev — это хардкорные доклады уровней Middle+ и Senior, нетворкинг, новые знакомства и полное погружение в мир мобайла. Приглашённые эксперты из США, Европы и России поделятся опытом iOS- и Android-разработки.

                    Под катом — подробности о программе и последние билеты по выгодной цене!

                    iOS-трек




                    iOS-разработчик Люк Пархэм помимо работы над приложением “Fyuse” пишет туториалы для raywenderlich.com. На MBLTdev он выступит с докладом «Во имя скорости: ускоряем работу iOS-приложений». Люк расскажет о причинах падения скорости работы приложения и механизмах её увеличения.

                    «Путь джедая или от REST до GraphQL» — доклад Макара Стеценко о необходимом минимуме для работы с GraphQL. Развеем связанные с ним мифы и рассмотрим, как начать использовать его в нативных приложениях, написанных на Swift и Kotlin.

                    Научись использовать Audio Unit Extension для генерации и обработки звука вместе с Виктором Стариковым, VoltMobi. Audio Unit Extension — технология, которая позволяет создавать DSP-модули, реализующие преобразование аудио-сигналов. В докладе рассмотрим возможности аудио-расширений и способы их создания.

                    Android-трек




                    Иван Шорич из PSPDFKit рассмотрит в своём докладе эффективную цепочку Android-анимации с использованием RxJava2 и Kotlin. При анимации элементов пользовательского интерфейса платформа Android предоставляет различные события, такие как запуск, аннулирование, остановка и так далее. Рассмотрим перенос логики анимаций в последовательные вызовы RxJava, делая процесс «реактивным» с улучшенным синтаксисом и контролем потока управления.

                    Мобильное приложение «Кошелёк» собирает в телефоне платёжные, транспортные и скидочные карты. Чтобы сделать их использование удобным и «красивым», применяются нативный рендер и Google Awareness API. О них расскажет Данил Терновых в докладе «Как мы оживляем карты».

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

                    Ищи больше спикеров на официальном сайте конференции. Следи за обновлениями программы на страницах в социальных сетях: Facebook, Twitter, VK.

                    Билеты


                    До 16 сентября ты можешь приобрести билет по выгодной цене — 7500 руб.
                    Регистрируйся прямо сейчас.

                    До встречи на MBLTdev 2017!

                    Организаторы конференции: e-Legion и РАЭК
                    Original source: habrahabr.ru (comments, light).

                    https://habrahabr.ru/post/337480/


                    Инженерные системы наших дата-центров и их мониторинг, часть первая

                    Понедельник, 11 Сентября 2017 г. 12:00 + в цитатник
                    NobleD5 сегодня в 12:00 Администрирование

                    Инженерные системы наших дата-центров и их мониторинг, часть первая

                      Привет, Хабр! Я инженер компании «Миран», которая занимается выдачей в аренду различных серверов, размещением клиентского оборудования в своих дата-центрах и прочими подобными делами.



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

                      Осторожно, много картинок!

                      1. Введение в ЦОДоведение
                      2. ТП, ВРУ, PDU
                      3. Окунись в прохладу ©
                      4. От клеммного зажима до ПЛК

                      Введение в ЦОДоведение


                      Что есть центр обработки данных? Говорим «ЦОД» — представляем себе бескрайние ангары, заполненные бесчисленными рядами стоек с мерно гудящими железками. Железки загадочно перемигиваются разноцветными огоньками из полумрака. С лицевой стороны их обдувает прохладным бризом от промышленных кондиционеров. В холодных зонах можно наотличненько просквозить себе шею и простудиться. Поэтому админы всегда носят свитера.

                      Нашей компанией построены два отдельно стоящих дата-центра, бесхитростно именуемые «Миран-1» и «Миран-2». Первый представляет собой вполне привычный тип, с одним большим машинным залом и несколькими поменьше этажом выше. Второй ЦОД представляет из себя ангар, в котором на данный момент установлены два мобильных малых ЦОДа, а также строится третий. Мобильные ЦОДы — двухэтажные конструкции-контейнеры, первый этаж которых есть серверный зал со стойками и кондиционерами, он еще именуется серверным блоком, на втором же смонтированы ВРУ, установлены ИБП и различные щиты управления.

                      Так исторически сложилось, что «Миран-1» не имел единого мониторинга инженерной инфраструктуры (посыпаем голову пеплом) и мы стремимся исправить этот недостаток. Посему речь большей частью пойдет о втором дата-центре.

                      Все картинки взяты из нашей системы мониторинга!
                      P.S.: фотографии щитов и их внутренностей тоже наши!

                      ТП, ВРУ, PDU


                      В «Миран-2» реализована система гарантированного электроснабжения (СГЭ). Как видно из схемы ниже, в обычных условиях дата-центр питается от двух независимых внешних вводов от ТП; в случае пропадания напряжения на внешних вводах (а такое у нас иногда случается) — питание идет от дизель-генераторной установки ДГУ2, фактически; под будущий задел предусмотрено место  для еще двух.


                      Общая мнемосхема ввода электропитания «Миран-2»

                      Идем дальше. ВРУ выполнено двухсекционным с секционным выключателем под управлением АВР1. Контроллер АВР замкнет секционник в случае пропадания напряжения на одном или обоих вводах, в последнем случаем через 15 секунд будет дан сигнал на запуск ДГУ. Все эти неприятности «Модуль-1 и «Модуль-2» переживают на своих внутренних ИБП.


                      Фото ВРУ «Миран-2». Кликабельно

                      Основное назначение секций и их автоматов, помимо питания различных вспомогательных щитов освещения, управления вентиляцией и прочего — исполнять роль вводов электропитания для «Модуль-1» и «Модуль-2» (QF1.1-.2 и QF2.1-.2 на схеме, соответственно). Каждый модульный ЦОД имеет внутри себя свое собственное ВРУ.


                      Мнемосхема главного распределительного щита «Модуль-2»


                      Фото главного распределительного щита «Модуль-2». Кликабельно


                      Мнемосхема энергоблока «Модуль-1»


                      Мнемосхема стоек «Модуль-1»

                      Большая часть стоек в «Модуль-1» и «Модуль-2» — производителей Rittal и RiT. Из PDU используем: в «Модуль-1» — сборную солянку из Eurolan, APC, DELTA. «Модуль-2» — целиком на PDU фирмы RiT.

                      Окунись в прохладу ©


                      Все клиентское железо, а также инженерная инфраструктура в процессе своей работы выделяют много тепла. Это тепло необходимо отводить, иначе железо быстро умрет. Отводом у нас занимаются шесть инверторных фреоновых кондиционеров фирмы Daikin. Вся их деятельность гордо называется «фреоновым режимом», который обеспечивает сухой тропический прохладный климат от +15 до +23 С° в холодном коридоре. Данная система охлаждения применяется и в «Модуле-1», и в «Модуле-2».

                      Также в «Модуле-1» существует еще один режим охлаждения, «режим фрикулинга». Его должны обеспечивать четыре приточных установки и дюжина вытяжек. В теории. К сожалению, на практике отвод тепла таким образом был не слишком эффективным, если внутри было задействовано чуть больше половины стоек. Поэтому данный режим для первого модульного ЦОДа так и не используется, оставаясь, по сути, резервным.


                      Мнемосхема серверного блока «Модуль-1»


                      Мнемосхема серверного блока «Модуль-2». Никаких приточек, только хардкор! фреон!

                      От клеммного зажима до ПЛК


                      Опросом и агрегацией информации от всей периферии дата-центра «Миран-2» занимаются три ПЛК: по одному на «Модуль» и один общий. Эти вундержелезки носят имя небезызвестной компании WAGO.

                      Рассмотрим структуру системы опроса на основе решения для «Модуль-2».


                      Схема шины ПЛК с модулями, скриншот из WAGO-IO-Check


                      Фото щита диспетчеризации «Модуль-2». Кликабельно

                      Как видно из схемы, на шине установлен сам ПЛК серии 750-881, четыре дискретных модуля 750-1405 на 16 каналов каждый и один аналоговый модуль 750-455 на четыре канала. Через дискретные модули ПЛК получает данные о состоянии автоматических выключателей питания («сухие» дополнительные контакты) в обеих секциях ГРЩ, о состоянии автоматов в собственном щите, а также о состоянии вентиляции энергоблока. Посредством аналогового модуля — получает данные от двух датчиков температуры и влажности (4-20 мА) здесь же, внутри энергоблока.

                      ПЛК также оснащен двумя Ethernet-портами и через них он общается по Modbus TCP/IP с еще несколькими железяками, как то:

                      • два вводных автомата фирмы Schneider Electric, от них же получается информация о входных мощностях, напряжениях, токах и прочем;
                      • две системы измерения токов фирмы АВВ в тандеме с двумя модулями ввода от фирмы ОВЕН — результатом их совместного труда есть вычисление по-стоечной мощности;
                      • контроллеры CAREL и 6 их подопечных — кондиционеры Daikin;
                      • и, наконец, младший братик — каплер 750-342 c семью дискретными модулями.  Их задача отслеживать состояние 48 выключателей + 12 резервных в серверном блоке на 24 стойки.


                      Фото ABB CMS-600 и трансформаторов тока. Кликабельно


                      Фото ОВЕН МЭ110-220.3М. Кликабельно


                      Фото ПЛК CAREL. Кликабельно


                      Фото щита слаботочных систем «Модуль-2». Кликабельно

                      Отдельно стоит упомянуть ИБП, они опрашиваются непосредственно SCADA, минуя ПЛК, по SNMP-протоколу.



                      Фото ИБП «Модуль-2». Кликабельно

                      Вся получаемая информация посредством программы формируется в собственный список Modbus-регистров, которая уже опрашивается SCADA.

                      Небольшой кусочек из основной программы
                      (* PLC_A2 *)
                      %QX256.0 := A2_1QF1;	//присваиваем каждому биту 256го слова
                      %QX256.1 := A2_1QF2;	//текущее состояние различных автоматов
                      %QX256.2 := A2_QS1;
                      %QX256.3 := A2_QS2;
                      %QX256.4 := A2_3QF1;
                      %QX256.5 := A2_3QF2;
                      %QX256.6 := A2_3QF3;
                      %QX256.7 := A2_3QF4;
                      %QX256.8 := A2_3QF5;
                      %QX256.9 := A2_3QF6;
                      %QX256.10 := A2_3QF7;
                      %QX256.11 := A2_3QF8;
                      %QX256.12 := A2_3QF9;
                      %QX256.13 := A2_3QF10;
                      %QX256.14 := A2_KM1;
                      %QX256.15 := A2_KM2;
                      
                      (* QF1 *)   //вводной автоматический выключатель № 1
                      %QW332 := QF1_I_L1;    //токи по фазам
                      %QW333 := QF1_I_L2;
                      %QW334 := QF1_I_L3;
                      %QW335 := QF1_U_L12;   //линейные (межфазные) напряжения
                      %QW336 := QF1_U_L23;
                      %QW337 := QF1_U_L31;
                      %QW338 := QF1_U_L1;   //фазные (фаза-нуль) напряжения
                      %QW339 := QF1_U_L2;
                      %QW340 := QF1_U_L3;
                      %QW341 := QF1_P_L1;   //активная мощность по фазам
                      %QW342 := QF1_P_L2;
                      %QW343 := QF1_P_L3;
                      %QW344 := QF1_P_Sum;  //суммарная активная мощность (кВт)
                      %QW345 := QF1_Q_L1;   //реактивная мощность по фазам
                      %QW346 := QF1_Q_L2;
                      %QW347 := QF1_Q_L3;
                      %QW348 := QF1_Q_Sum;  //суммарная реактивная мощность (квар)
                      %QW349 := QF1_S_Sum;  //полная мощность (кВА)
                      %QW350 := QF1_CosF;   //коэффициент мощности
                      


                      Еще один кусочек из другой подпрограммы
                      
                      //Это работа кодогенератора CODESYS, в котором есть удобный настройщик связи
                      //с периферией по Modbus TCP/IP. Эта подпрограмма, в частности, отвечает 
                      //за получение от ОВЕН МЭ110-220.3М показаний 
                      //по трем напряжениям фаза-нейтраль
                      
                      PROGRAM MBCFG_subCMS_1(* generated by config one prg for each slave *)
                      
                      VAR_OUTPUT
                      U_L1  :  WORD; (**) 
                      U_L2  :  WORD; (**) 
                      U_L3  :  WORD; (**)
                      
                      /*--- system variables (read only) ----------------------------------------*/
                      MBCFG_IpAddress    :   STRING(12) := 'XXX.XXX.XXX.XXX';//IP-адрес Slave-устройства
                      MBCFG_Port         :   UINT := 502;               //Порт, дефолтный
                      MBCFG_UnitID       :   BYTE := 2;                 //ID Slave-устройства
                      MBCFG_TimeOut      :   TIME := t#300ms;           //Таймаут на получение ответа
                      MBCFG_RequestDelay :   TIME := t#1000ms;          //Задержка до следующего опроса
                      MBCFG_Error        :   MBCFG_eERROR := MBCFG_START_UP;
                      MBCFG_LastJob      :   MBCFG_typCOM_JOB;
                      /*-------------------------------------------------------------------------*/
                      END_VAR
                      
                      VAR CONSTANT
                          zz_VARIABLECOUNT:   INT := 3; (* number of variables  *)
                          zz_JOBCOUNT     :   INT := 1; (* number of jobs *)
                      END_VAR
                      VAR
                      
                      /*=== VARIABLE LIST =============*/
                      zz_VariableList :   ARRAY[1..zz_VARIABLECOUNT] OF MBCFG_typVARIABLE :=
                          ( DataType        := MBCFG_TYPE_WORD,  
                            ByteOrder       := MBCFG_BYTE_ORDER_0,
                            BitSize         := 16,
                            ptVar           := 0,
                            ReadJobIndex    := 1,
                            ReadStartBitNo  := 0,
                            WriteJobIndex   := 0,
                            WriteStartBitNo := 0 ),
                         (  DataType        := MBCFG_TYPE_WORD,
                            ByteOrder       := MBCFG_BYTE_ORDER_0,
                            BitSize         := 16,
                            ptVar           := 0,
                            ReadJobIndex    := 1,
                            ReadStartBitNo  := 32,
                            WriteJobIndex   := 0,
                            WriteStartBitNo := 0 ),
                         (  DataType        := MBCFG_TYPE_WORD,
                            ByteOrder       := MBCFG_BYTE_ORDER_0,
                            BitSize         := 16,
                            ptVar           := 0,
                            ReadJobIndex    := 1,
                            ReadStartBitNo  := 64,
                            WriteJobIndex   := 0,
                            WriteStartBitNo := 0
                         );
                      
                      /*=== JOB LIST ==================*/
                      zz_JobList     :   ARRAY[1..zz_JOBCOUNT] OF MBCFG_typCOM_JOB :=
                         (  Functioncode            := 3, //Номер функции, 0x03, Read Holding Registers
                            ReadStartAddress        := 26,//Адрес первого регистра
                            ReadQuantity            := 5, //Кол-во регистров, которые следует прочесть
                            WriteStartAddress       := 0,
                            WriteQuantity           := 0,
                            ptReadData              := 0, 
                            ptWriteData             := 0
                         );
                      
                      zz_DataField_1_Read       :       ARRAY[1..5] OF WORD;
                      
                      /*=== MODBUS MASTER ==============*/
                      zz_MBCFG_MASTER_ETH :       MBCFG_MASTER_TCP;
                      
                      END_VAR
                      
                      /*--- for each variable -------------------------*/
                         zz_VariableList[1].ptVar := ADR(U_L1);
                         zz_VariableList[2].ptVar := ADR(U_L2);
                         zz_VariableList[3].ptVar := ADR(U_L3);
                      /*-----------------------------------------------*/
                      
                      /*--- for each job -----------------------------------*/
                      zz_JobList[1].ptReadData   := ADR(zz_DataField_1_Read);
                      /*----------------------------------------------------*/
                      
                      /*#### START OF FIXED CODE #####################################*/
                      zz_MBCFG_MASTER_ETH(	strIpAddress    := MBCFG_IpAddress,
                                              uiPort          := MBCFG_Port,
                                              bUnitID         := MBCFG_UnitID,
                                              tTimeOut        := MBCFG_TimeOut,
                                              iVariableCount  := zz_VARIABLECOUNT,
                                              ptVariableList  := ADR(zz_VariableList),
                                              iJobCount       := zz_JOBCOUNT,
                                              ptJobList       := ADR(zz_JobList),
                                              tRequestDelay   := MBCFG_RequestDelay,
                                              eError          => MBCFG_Error,
                                              LastJob         => MBCFG_LastJob
                                          );
                      
                      %QW377 := U_L1;
                      %QW378 := U_L2;
                      %QW379 := U_L3;
                      


                      Продолжение следует
                      Original source: habrahabr.ru (comments, light).

                      https://habrahabr.ru/post/336134/


                      Метки:  

                      Инженерные системы наших дата-центров и их мониторинг, часть первая

                      Понедельник, 11 Сентября 2017 г. 12:00 + в цитатник
                      NobleD5 сегодня в 12:00 Администрирование

                      Инженерные системы наших дата-центров и их мониторинг, часть первая

                        Привет, Хабр! Я инженер компании «Миран», которая занимается выдачей в аренду различных серверов, размещением клиентского оборудования в своих дата-центрах и прочими подобными делами.



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

                        Осторожно, много картинок!

                        1. Введение в ЦОДоведение
                        2. ТП, ВРУ, PDU
                        3. Окунись в прохладу ©
                        4. От клеммного зажима до ПЛК

                        Введение в ЦОДоведение


                        Что есть центр обработки данных? Говорим «ЦОД» — представляем себе бескрайние ангары, заполненные бесчисленными рядами стоек с мерно гудящими железками. Железки загадочно перемигиваются разноцветными огоньками из полумрака. С лицевой стороны их обдувает прохладным бризом от промышленных кондиционеров. В холодных зонах можно наотличненько просквозить себе шею и простудиться. Поэтому админы всегда носят свитера.

                        Нашей компанией построены два отдельно стоящих дата-центра, бесхитростно именуемые «Миран-1» и «Миран-2». Первый представляет собой вполне привычный тип, с одним большим машинным залом и несколькими поменьше этажом выше. Второй ЦОД представляет из себя ангар, в котором на данный момент установлены два мобильных малых ЦОДа, а также строится третий. Мобильные ЦОДы — двухэтажные конструкции-контейнеры, первый этаж которых есть серверный зал со стойками и кондиционерами, он еще именуется серверным блоком, на втором же смонтированы ВРУ, установлены ИБП и различные щиты управления.

                        Так исторически сложилось, что «Миран-1» не имел единого мониторинга инженерной инфраструктуры (посыпаем голову пеплом) и мы стремимся исправить этот недостаток. Посему речь большей частью пойдет о втором дата-центре.

                        Все картинки взяты из нашей системы мониторинга!
                        P.S.: фотографии щитов и их внутренностей тоже наши!

                        ТП, ВРУ, PDU


                        В «Миран-2» реализована система гарантированного электроснабжения (СГЭ). Как видно из схемы ниже, в обычных условиях дата-центр питается от двух независимых внешних вводов от ТП; в случае пропадания напряжения на внешних вводах (а такое у нас иногда случается) — питание идет от дизель-генераторной установки ДГУ2, фактически; под будущий задел предусмотрено место  для еще двух.


                        Общая мнемосхема ввода электропитания «Миран-2»

                        Идем дальше. ВРУ выполнено двухсекционным с секционным выключателем под управлением АВР1. Контроллер АВР замкнет секционник в случае пропадания напряжения на одном или обоих вводах, в последнем случаем через 15 секунд будет дан сигнал на запуск ДГУ. Все эти неприятности «Модуль-1 и «Модуль-2» переживают на своих внутренних ИБП.


                        Фото ВРУ «Миран-2». Кликабельно

                        Основное назначение секций и их автоматов, помимо питания различных вспомогательных щитов освещения, управления вентиляцией и прочего — исполнять роль вводов электропитания для «Модуль-1» и «Модуль-2» (QF1.1-.2 и QF2.1-.2 на схеме, соответственно). Каждый модульный ЦОД имеет внутри себя свое собственное ВРУ.


                        Мнемосхема главного распределительного щита «Модуль-2»


                        Фото главного распределительного щита «Модуль-2». Кликабельно


                        Мнемосхема энергоблока «Модуль-1»


                        Мнемосхема стоек «Модуль-1»

                        Большая часть стоек в «Модуль-1» и «Модуль-2» — производителей Rittal и RiT. Из PDU используем: в «Модуль-1» — сборную солянку из Eurolan, APC, DELTA. «Модуль-2» — целиком на PDU фирмы RiT.

                        Окунись в прохладу ©


                        Все клиентское железо, а также инженерная инфраструктура в процессе своей работы выделяют много тепла. Это тепло необходимо отводить, иначе железо быстро умрет. Отводом у нас занимаются шесть инверторных фреоновых кондиционеров фирмы Daikin. Вся их деятельность гордо называется «фреоновым режимом», который обеспечивает сухой тропический прохладный климат от +15 до +23 С° в холодном коридоре. Данная система охлаждения применяется и в «Модуле-1», и в «Модуле-2».

                        Также в «Модуле-1» существует еще один режим охлаждения, «режим фрикулинга». Его должны обеспечивать четыре приточных установки и дюжина вытяжек. В теории. К сожалению, на практике отвод тепла таким образом был не слишком эффективным, если внутри было задействовано чуть больше половины стоек. Поэтому данный режим для первого модульного ЦОДа так и не используется, оставаясь, по сути, резервным.


                        Мнемосхема серверного блока «Модуль-1»


                        Мнемосхема серверного блока «Модуль-2». Никаких приточек, только хардкор! фреон!

                        От клеммного зажима до ПЛК


                        Опросом и агрегацией информации от всей периферии дата-центра «Миран-2» занимаются три ПЛК: по одному на «Модуль» и один общий. Эти вундержелезки носят имя небезызвестной компании WAGO.

                        Рассмотрим структуру системы опроса на основе решения для «Модуль-2».


                        Схема шины ПЛК с модулями, скриншот из WAGO-IO-Check


                        Фото щита диспетчеризации «Модуль-2». Кликабельно

                        Как видно из схемы, на шине установлен сам ПЛК серии 750-881, четыре дискретных модуля 750-1405 на 16 каналов каждый и один аналоговый модуль 750-455 на четыре канала. Через дискретные модули ПЛК получает данные о состоянии автоматических выключателей питания («сухие» дополнительные контакты) в обеих секциях ГРЩ, о состоянии автоматов в собственном щите, а также о состоянии вентиляции энергоблока. Посредством аналогового модуля — получает данные от двух датчиков температуры и влажности (4-20 мА) здесь же, внутри энергоблока.

                        ПЛК также оснащен двумя Ethernet-портами и через них он общается по Modbus TCP/IP с еще несколькими железяками, как то:

                        • два вводных автомата фирмы Schneider Electric, от них же получается информация о входных мощностях, напряжениях, токах и прочем;
                        • две системы измерения токов фирмы АВВ в тандеме с двумя модулями ввода от фирмы ОВЕН — результатом их совместного труда есть вычисление по-стоечной мощности;
                        • контроллеры CAREL и 6 их подопечных — кондиционеры Daikin;
                        • и, наконец, младший братик — каплер 750-342 c семью дискретными модулями.  Их задача отслеживать состояние 48 выключателей + 12 резервных в серверном блоке на 24 стойки.


                        Фото ABB CMS-600 и трансформаторов тока. Кликабельно


                        Фото ОВЕН МЭ110-220.3М. Кликабельно


                        Фото ПЛК CAREL. Кликабельно


                        Фото щита слаботочных систем «Модуль-2». Кликабельно

                        Отдельно стоит упомянуть ИБП, они опрашиваются непосредственно SCADA, минуя ПЛК, по SNMP-протоколу.



                        Фото ИБП «Модуль-2». Кликабельно

                        Вся получаемая информация посредством программы формируется в собственный список Modbus-регистров, которая уже опрашивается SCADA.

                        Небольшой кусочек из основной программы
                        (* PLC_A2 *)
                        %QX256.0 := A2_1QF1;	//присваиваем каждому биту 256го слова
                        %QX256.1 := A2_1QF2;	//текущее состояние различных автоматов
                        %QX256.2 := A2_QS1;
                        %QX256.3 := A2_QS2;
                        %QX256.4 := A2_3QF1;
                        %QX256.5 := A2_3QF2;
                        %QX256.6 := A2_3QF3;
                        %QX256.7 := A2_3QF4;
                        %QX256.8 := A2_3QF5;
                        %QX256.9 := A2_3QF6;
                        %QX256.10 := A2_3QF7;
                        %QX256.11 := A2_3QF8;
                        %QX256.12 := A2_3QF9;
                        %QX256.13 := A2_3QF10;
                        %QX256.14 := A2_KM1;
                        %QX256.15 := A2_KM2;
                        
                        (* QF1 *)   //вводной автоматический выключатель № 1
                        %QW332 := QF1_I_L1;    //токи по фазам
                        %QW333 := QF1_I_L2;
                        %QW334 := QF1_I_L3;
                        %QW335 := QF1_U_L12;   //линейные (межфазные) напряжения
                        %QW336 := QF1_U_L23;
                        %QW337 := QF1_U_L31;
                        %QW338 := QF1_U_L1;   //фазные (фаза-нуль) напряжения
                        %QW339 := QF1_U_L2;
                        %QW340 := QF1_U_L3;
                        %QW341 := QF1_P_L1;   //активная мощность по фазам
                        %QW342 := QF1_P_L2;
                        %QW343 := QF1_P_L3;
                        %QW344 := QF1_P_Sum;  //суммарная активная мощность (кВт)
                        %QW345 := QF1_Q_L1;   //реактивная мощность по фазам
                        %QW346 := QF1_Q_L2;
                        %QW347 := QF1_Q_L3;
                        %QW348 := QF1_Q_Sum;  //суммарная реактивная мощность (квар)
                        %QW349 := QF1_S_Sum;  //полная мощность (кВА)
                        %QW350 := QF1_CosF;   //коэффициент мощности
                        


                        Еще один кусочек из другой подпрограммы
                        
                        //Это работа кодогенератора CODESYS, в котором есть удобный настройщик связи
                        //с периферией по Modbus TCP/IP. Эта подпрограмма, в частности, отвечает 
                        //за получение от ОВЕН МЭ110-220.3М показаний 
                        //по трем напряжениям фаза-нейтраль
                        
                        PROGRAM MBCFG_subCMS_1(* generated by config one prg for each slave *)
                        
                        VAR_OUTPUT
                        U_L1  :  WORD; (**) 
                        U_L2  :  WORD; (**) 
                        U_L3  :  WORD; (**)
                        
                        /*--- system variables (read only) ----------------------------------------*/
                        MBCFG_IpAddress    :   STRING(12) := 'XXX.XXX.XXX.XXX';//IP-адрес Slave-устройства
                        MBCFG_Port         :   UINT := 502;               //Порт, дефолтный
                        MBCFG_UnitID       :   BYTE := 2;                 //ID Slave-устройства
                        MBCFG_TimeOut      :   TIME := t#300ms;           //Таймаут на получение ответа
                        MBCFG_RequestDelay :   TIME := t#1000ms;          //Задержка до следующего опроса
                        MBCFG_Error        :   MBCFG_eERROR := MBCFG_START_UP;
                        MBCFG_LastJob      :   MBCFG_typCOM_JOB;
                        /*-------------------------------------------------------------------------*/
                        END_VAR
                        
                        VAR CONSTANT
                            zz_VARIABLECOUNT:   INT := 3; (* number of variables  *)
                            zz_JOBCOUNT     :   INT := 1; (* number of jobs *)
                        END_VAR
                        VAR
                        
                        /*=== VARIABLE LIST =============*/
                        zz_VariableList :   ARRAY[1..zz_VARIABLECOUNT] OF MBCFG_typVARIABLE :=
                            ( DataType        := MBCFG_TYPE_WORD,  
                              ByteOrder       := MBCFG_BYTE_ORDER_0,
                              BitSize         := 16,
                              ptVar           := 0,
                              ReadJobIndex    := 1,
                              ReadStartBitNo  := 0,
                              WriteJobIndex   := 0,
                              WriteStartBitNo := 0 ),
                           (  DataType        := MBCFG_TYPE_WORD,
                              ByteOrder       := MBCFG_BYTE_ORDER_0,
                              BitSize         := 16,
                              ptVar           := 0,
                              ReadJobIndex    := 1,
                              ReadStartBitNo  := 32,
                              WriteJobIndex   := 0,
                              WriteStartBitNo := 0 ),
                           (  DataType        := MBCFG_TYPE_WORD,
                              ByteOrder       := MBCFG_BYTE_ORDER_0,
                              BitSize         := 16,
                              ptVar           := 0,
                              ReadJobIndex    := 1,
                              ReadStartBitNo  := 64,
                              WriteJobIndex   := 0,
                              WriteStartBitNo := 0
                           );
                        
                        /*=== JOB LIST ==================*/
                        zz_JobList     :   ARRAY[1..zz_JOBCOUNT] OF MBCFG_typCOM_JOB :=
                           (  Functioncode            := 3, //Номер функции, 0x03, Read Holding Registers
                              ReadStartAddress        := 26,//Адрес первого регистра
                              ReadQuantity            := 5, //Кол-во регистров, которые следует прочесть
                              WriteStartAddress       := 0,
                              WriteQuantity           := 0,
                              ptReadData              := 0, 
                              ptWriteData             := 0
                           );
                        
                        zz_DataField_1_Read       :       ARRAY[1..5] OF WORD;
                        
                        /*=== MODBUS MASTER ==============*/
                        zz_MBCFG_MASTER_ETH :       MBCFG_MASTER_TCP;
                        
                        END_VAR
                        
                        /*--- for each variable -------------------------*/
                           zz_VariableList[1].ptVar := ADR(U_L1);
                           zz_VariableList[2].ptVar := ADR(U_L2);
                           zz_VariableList[3].ptVar := ADR(U_L3);
                        /*-----------------------------------------------*/
                        
                        /*--- for each job -----------------------------------*/
                        zz_JobList[1].ptReadData   := ADR(zz_DataField_1_Read);
                        /*----------------------------------------------------*/
                        
                        /*#### START OF FIXED CODE #####################################*/
                        zz_MBCFG_MASTER_ETH(	strIpAddress    := MBCFG_IpAddress,
                                                uiPort          := MBCFG_Port,
                                                bUnitID         := MBCFG_UnitID,
                                                tTimeOut        := MBCFG_TimeOut,
                                                iVariableCount  := zz_VARIABLECOUNT,
                                                ptVariableList  := ADR(zz_VariableList),
                                                iJobCount       := zz_JOBCOUNT,
                                                ptJobList       := ADR(zz_JobList),
                                                tRequestDelay   := MBCFG_RequestDelay,
                                                eError          => MBCFG_Error,
                                                LastJob         => MBCFG_LastJob
                                            );
                        
                        %QW377 := U_L1;
                        %QW378 := U_L2;
                        %QW379 := U_L3;
                        


                        Продолжение следует
                        Original source: habrahabr.ru (comments, light).

                        https://habrahabr.ru/post/336134/


                        Метки:  

                        Инженерные системы наших дата-центров и их мониторинг, часть первая

                        Понедельник, 11 Сентября 2017 г. 12:00 + в цитатник
                        NobleD5 сегодня в 12:00 Администрирование

                        Инженерные системы наших дата-центров и их мониторинг, часть первая

                          Привет, Хабр! Я инженер компании «Миран», которая занимается выдачей в аренду различных серверов, размещением клиентского оборудования в своих дата-центрах и прочими подобными делами.



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

                          Осторожно, много картинок!

                          1. Введение в ЦОДоведение
                          2. ТП, ВРУ, PDU
                          3. Окунись в прохладу ©
                          4. От клеммного зажима до ПЛК

                          Введение в ЦОДоведение


                          Что есть центр обработки данных? Говорим «ЦОД» — представляем себе бескрайние ангары, заполненные бесчисленными рядами стоек с мерно гудящими железками. Железки загадочно перемигиваются разноцветными огоньками из полумрака. С лицевой стороны их обдувает прохладным бризом от промышленных кондиционеров. В холодных зонах можно наотличненько просквозить себе шею и простудиться. Поэтому админы всегда носят свитера.

                          Нашей компанией построены два отдельно стоящих дата-центра, бесхитростно именуемые «Миран-1» и «Миран-2». Первый представляет собой вполне привычный тип, с одним большим машинным залом и несколькими поменьше этажом выше. Второй ЦОД представляет из себя ангар, в котором на данный момент установлены два мобильных малых ЦОДа, а также строится третий. Мобильные ЦОДы — двухэтажные конструкции-контейнеры, первый этаж которых есть серверный зал со стойками и кондиционерами, он еще именуется серверным блоком, на втором же смонтированы ВРУ, установлены ИБП и различные щиты управления.

                          Так исторически сложилось, что «Миран-1» не имел единого мониторинга инженерной инфраструктуры (посыпаем голову пеплом) и мы стремимся исправить этот недостаток. Посему речь большей частью пойдет о втором дата-центре.

                          Все картинки взяты из нашей системы мониторинга!
                          P.S.: фотографии щитов и их внутренностей тоже наши!

                          ТП, ВРУ, PDU


                          В «Миран-2» реализована система гарантированного электроснабжения (СГЭ). Как видно из схемы ниже, в обычных условиях дата-центр питается от двух независимых внешних вводов от ТП; в случае пропадания напряжения на внешних вводах (а такое у нас иногда случается) — питание идет от дизель-генераторной установки ДГУ2, фактически; под будущий задел предусмотрено место  для еще двух.


                          Общая мнемосхема ввода электропитания «Миран-2»

                          Идем дальше. ВРУ выполнено двухсекционным с секционным выключателем под управлением АВР1. Контроллер АВР замкнет секционник в случае пропадания напряжения на одном или обоих вводах, в последнем случаем через 15 секунд будет дан сигнал на запуск ДГУ. Все эти неприятности «Модуль-1 и «Модуль-2» переживают на своих внутренних ИБП.


                          Фото ВРУ «Миран-2». Кликабельно

                          Основное назначение секций и их автоматов, помимо питания различных вспомогательных щитов освещения, управления вентиляцией и прочего — исполнять роль вводов электропитания для «Модуль-1» и «Модуль-2» (QF1.1-.2 и QF2.1-.2 на схеме, соответственно). Каждый модульный ЦОД имеет внутри себя свое собственное ВРУ.


                          Мнемосхема главного распределительного щита «Модуль-2»


                          Фото главного распределительного щита «Модуль-2». Кликабельно


                          Мнемосхема энергоблока «Модуль-1»


                          Мнемосхема стоек «Модуль-1»

                          Большая часть стоек в «Модуль-1» и «Модуль-2» — производителей Rittal и RiT. Из PDU используем: в «Модуль-1» — сборную солянку из Eurolan, APC, DELTA. «Модуль-2» — целиком на PDU фирмы RiT.

                          Окунись в прохладу ©


                          Все клиентское железо, а также инженерная инфраструктура в процессе своей работы выделяют много тепла. Это тепло необходимо отводить, иначе железо быстро умрет. Отводом у нас занимаются шесть инверторных фреоновых кондиционеров фирмы Daikin. Вся их деятельность гордо называется «фреоновым режимом», который обеспечивает сухой тропический прохладный климат от +15 до +23 С° в холодном коридоре. Данная система охлаждения применяется и в «Модуле-1», и в «Модуле-2».

                          Также в «Модуле-1» существует еще один режим охлаждения, «режим фрикулинга». Его должны обеспечивать четыре приточных установки и дюжина вытяжек. В теории. К сожалению, на практике отвод тепла таким образом был не слишком эффективным, если внутри было задействовано чуть больше половины стоек. Поэтому данный режим для первого модульного ЦОДа так и не используется, оставаясь, по сути, резервным.


                          Мнемосхема серверного блока «Модуль-1»


                          Мнемосхема серверного блока «Модуль-2». Никаких приточек, только хардкор! фреон!

                          От клеммного зажима до ПЛК


                          Опросом и агрегацией информации от всей периферии дата-центра «Миран-2» занимаются три ПЛК: по одному на «Модуль» и один общий. Эти вундержелезки носят имя небезызвестной компании WAGO.

                          Рассмотрим структуру системы опроса на основе решения для «Модуль-2».


                          Схема шины ПЛК с модулями, скриншот из WAGO-IO-Check


                          Фото щита диспетчеризации «Модуль-2». Кликабельно

                          Как видно из схемы, на шине установлен сам ПЛК серии 750-881, четыре дискретных модуля 750-1405 на 16 каналов каждый и один аналоговый модуль 750-455 на четыре канала. Через дискретные модули ПЛК получает данные о состоянии автоматических выключателей питания («сухие» дополнительные контакты) в обеих секциях ГРЩ, о состоянии автоматов в собственном щите, а также о состоянии вентиляции энергоблока. Посредством аналогового модуля — получает данные от двух датчиков температуры и влажности (4-20 мА) здесь же, внутри энергоблока.

                          ПЛК также оснащен двумя Ethernet-портами и через них он общается по Modbus TCP/IP с еще несколькими железяками, как то:

                          • два вводных автомата фирмы Schneider Electric, от них же получается информация о входных мощностях, напряжениях, токах и прочем;
                          • две системы измерения токов фирмы АВВ в тандеме с двумя модулями ввода от фирмы ОВЕН — результатом их совместного труда есть вычисление по-стоечной мощности;
                          • контроллеры CAREL и 6 их подопечных — кондиционеры Daikin;
                          • и, наконец, младший братик — каплер 750-342 c семью дискретными модулями.  Их задача отслеживать состояние 48 выключателей + 12 резервных в серверном блоке на 24 стойки.


                          Фото ABB CMS-600 и трансформаторов тока. Кликабельно


                          Фото ОВЕН МЭ110-220.3М. Кликабельно


                          Фото ПЛК CAREL. Кликабельно


                          Фото щита слаботочных систем «Модуль-2». Кликабельно

                          Отдельно стоит упомянуть ИБП, они опрашиваются непосредственно SCADA, минуя ПЛК, по SNMP-протоколу.



                          Фото ИБП «Модуль-2». Кликабельно

                          Вся получаемая информация посредством программы формируется в собственный список Modbus-регистров, которая уже опрашивается SCADA.

                          Небольшой кусочек из основной программы
                          (* PLC_A2 *)
                          %QX256.0 := A2_1QF1;	//присваиваем каждому биту 256го слова
                          %QX256.1 := A2_1QF2;	//текущее состояние различных автоматов
                          %QX256.2 := A2_QS1;
                          %QX256.3 := A2_QS2;
                          %QX256.4 := A2_3QF1;
                          %QX256.5 := A2_3QF2;
                          %QX256.6 := A2_3QF3;
                          %QX256.7 := A2_3QF4;
                          %QX256.8 := A2_3QF5;
                          %QX256.9 := A2_3QF6;
                          %QX256.10 := A2_3QF7;
                          %QX256.11 := A2_3QF8;
                          %QX256.12 := A2_3QF9;
                          %QX256.13 := A2_3QF10;
                          %QX256.14 := A2_KM1;
                          %QX256.15 := A2_KM2;
                          
                          (* QF1 *)   //вводной автоматический выключатель № 1
                          %QW332 := QF1_I_L1;    //токи по фазам
                          %QW333 := QF1_I_L2;
                          %QW334 := QF1_I_L3;
                          %QW335 := QF1_U_L12;   //линейные (межфазные) напряжения
                          %QW336 := QF1_U_L23;
                          %QW337 := QF1_U_L31;
                          %QW338 := QF1_U_L1;   //фазные (фаза-нуль) напряжения
                          %QW339 := QF1_U_L2;
                          %QW340 := QF1_U_L3;
                          %QW341 := QF1_P_L1;   //активная мощность по фазам
                          %QW342 := QF1_P_L2;
                          %QW343 := QF1_P_L3;
                          %QW344 := QF1_P_Sum;  //суммарная активная мощность (кВт)
                          %QW345 := QF1_Q_L1;   //реактивная мощность по фазам
                          %QW346 := QF1_Q_L2;
                          %QW347 := QF1_Q_L3;
                          %QW348 := QF1_Q_Sum;  //суммарная реактивная мощность (квар)
                          %QW349 := QF1_S_Sum;  //полная мощность (кВА)
                          %QW350 := QF1_CosF;   //коэффициент мощности
                          


                          Еще один кусочек из другой подпрограммы
                          
                          //Это работа кодогенератора CODESYS, в котором есть удобный настройщик связи
                          //с периферией по Modbus TCP/IP. Эта подпрограмма, в частности, отвечает 
                          //за получение от ОВЕН МЭ110-220.3М показаний 
                          //по трем напряжениям фаза-нейтраль
                          
                          PROGRAM MBCFG_subCMS_1(* generated by config one prg for each slave *)
                          
                          VAR_OUTPUT
                          U_L1  :  WORD; (**) 
                          U_L2  :  WORD; (**) 
                          U_L3  :  WORD; (**)
                          
                          /*--- system variables (read only) ----------------------------------------*/
                          MBCFG_IpAddress    :   STRING(12) := 'XXX.XXX.XXX.XXX';//IP-адрес Slave-устройства
                          MBCFG_Port         :   UINT := 502;               //Порт, дефолтный
                          MBCFG_UnitID       :   BYTE := 2;                 //ID Slave-устройства
                          MBCFG_TimeOut      :   TIME := t#300ms;           //Таймаут на получение ответа
                          MBCFG_RequestDelay :   TIME := t#1000ms;          //Задержка до следующего опроса
                          MBCFG_Error        :   MBCFG_eERROR := MBCFG_START_UP;
                          MBCFG_LastJob      :   MBCFG_typCOM_JOB;
                          /*-------------------------------------------------------------------------*/
                          END_VAR
                          
                          VAR CONSTANT
                              zz_VARIABLECOUNT:   INT := 3; (* number of variables  *)
                              zz_JOBCOUNT     :   INT := 1; (* number of jobs *)
                          END_VAR
                          VAR
                          
                          /*=== VARIABLE LIST =============*/
                          zz_VariableList :   ARRAY[1..zz_VARIABLECOUNT] OF MBCFG_typVARIABLE :=
                              ( DataType        := MBCFG_TYPE_WORD,  
                                ByteOrder       := MBCFG_BYTE_ORDER_0,
                                BitSize         := 16,
                                ptVar           := 0,
                                ReadJobIndex    := 1,
                                ReadStartBitNo  := 0,
                                WriteJobIndex   := 0,
                                WriteStartBitNo := 0 ),
                             (  DataType        := MBCFG_TYPE_WORD,
                                ByteOrder       := MBCFG_BYTE_ORDER_0,
                                BitSize         := 16,
                                ptVar           := 0,
                                ReadJobIndex    := 1,
                                ReadStartBitNo  := 32,
                                WriteJobIndex   := 0,
                                WriteStartBitNo := 0 ),
                             (  DataType        := MBCFG_TYPE_WORD,
                                ByteOrder       := MBCFG_BYTE_ORDER_0,
                                BitSize         := 16,
                                ptVar           := 0,
                                ReadJobIndex    := 1,
                                ReadStartBitNo  := 64,
                                WriteJobIndex   := 0,
                                WriteStartBitNo := 0
                             );
                          
                          /*=== JOB LIST ==================*/
                          zz_JobList     :   ARRAY[1..zz_JOBCOUNT] OF MBCFG_typCOM_JOB :=
                             (  Functioncode            := 3, //Номер функции, 0x03, Read Holding Registers
                                ReadStartAddress        := 26,//Адрес первого регистра
                                ReadQuantity            := 5, //Кол-во регистров, которые следует прочесть
                                WriteStartAddress       := 0,
                                WriteQuantity           := 0,
                                ptReadData              := 0, 
                                ptWriteData             := 0
                             );
                          
                          zz_DataField_1_Read       :       ARRAY[1..5] OF WORD;
                          
                          /*=== MODBUS MASTER ==============*/
                          zz_MBCFG_MASTER_ETH :       MBCFG_MASTER_TCP;
                          
                          END_VAR
                          
                          /*--- for each variable -------------------------*/
                             zz_VariableList[1].ptVar := ADR(U_L1);
                             zz_VariableList[2].ptVar := ADR(U_L2);
                             zz_VariableList[3].ptVar := ADR(U_L3);
                          /*-----------------------------------------------*/
                          
                          /*--- for each job -----------------------------------*/
                          zz_JobList[1].ptReadData   := ADR(zz_DataField_1_Read);
                          /*----------------------------------------------------*/
                          
                          /*#### START OF FIXED CODE #####################################*/
                          zz_MBCFG_MASTER_ETH(	strIpAddress    := MBCFG_IpAddress,
                                                  uiPort          := MBCFG_Port,
                                                  bUnitID         := MBCFG_UnitID,
                                                  tTimeOut        := MBCFG_TimeOut,
                                                  iVariableCount  := zz_VARIABLECOUNT,
                                                  ptVariableList  := ADR(zz_VariableList),
                                                  iJobCount       := zz_JOBCOUNT,
                                                  ptJobList       := ADR(zz_JobList),
                                                  tRequestDelay   := MBCFG_RequestDelay,
                                                  eError          => MBCFG_Error,
                                                  LastJob         => MBCFG_LastJob
                                              );
                          
                          %QW377 := U_L1;
                          %QW378 := U_L2;
                          %QW379 := U_L3;
                          


                          Продолжение следует
                          Original source: habrahabr.ru (comments, light).

                          https://habrahabr.ru/post/336134/


                          Метки:  

                          Монетизация приложений в iOS 11: таргетируем встроенные покупки в новом App Store

                          Понедельник, 11 Сентября 2017 г. 11:34 + в цитатник
                          Groozze сегодня в 11:34 Разработка

                          Монетизация приложений в iOS 11: таргетируем встроенные покупки в новом App Store



                            На WWDC’17 Apple показала обновленный интерфейс App Store и представила ряд нововведений. Среди них были продвигаемые встроенные покупки, которые с выходом iOS 11 будут выводится прямо в поиске и редакторских подборках наряду с приложениями.

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

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

                            - (BOOL)paymentQueue:(SKPaymentQueue *)queue 
                            shouldAddStorePayment:(SKPayment *)payment 
                                      forProduct:(SKProduct *)product;

                            Пока в приложении не реализован этот метод, продвигаемые встроенные покупки нельзя будет приобрести из App Store. Но они будут отображены в специальном разделе на странице приложения.

                            Для того чтобы встроенную покупку сделать продвигаемой, необходимо заполнить специальные метаданные, недавно появившиеся в iTunes Connect: рекламное изображение, заголовок и краткое описание. После прохождения review изменений покупка появится в новом разделе «Продвижение в App Store», где можно в любой момент поменять значения видимости по умолчанию для всех пользователей и их порядок отображения на странице приложения в App Store. Так можно продвигать до 20 встроенных покупок одновременно и неограниченное количество покупок держать в режиме готовности к включению.



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

                            Важнейшей составляющей нововведения становится возможность программно изменять порядок и видимость продвигаемых встроенных покупок. Теперь мы можем подстраиваться под каждого пользователя приложения: выводить в топ горсть кристаллов игроку, у которого они на нуле; предлагать премиум-аккаунт активному пользователю; или открывать новый уровень игроку, который прошел весь основной контент. Или же вообще сделать специальное очень выгодное предложение покупки премиум-валюты видимым игроку только в тот момент, когда он столкнулся с острой нехваткой ресурсов, но при этом не воспользовался основным предложением по ее приобретению. Можно устроить A/B тестирование для нахождения оптимального порядка.

                            А конкретнее?


                            Рассмотрим новые методы API, предоставляемые Apple для совершения данных манипуляций.

                            Сделаем продвигаемыми две встроенные покупки приложения. До установки и после запуска, если ничего не делать, они будут отображаться у пользователя в соответствии с настройками из iTunes Connect:


                            Чтобы изменить порядок и видимость этих покупок, нам нужно получить объекты покупок по их sku через SKProductsRequest:

                            - (void)requestProducts
                            {
                                SKProductsRequest* productRequest = [[SKProductsRequest alloc] initWithProductIdentifiers:[NSSet setWithObject:@"gold.iap.example.com"]];
                                productRequest.delegate = self;
                                [productRequest start];
                            }
                            
                            - (void)productsRequest:(SKProductsRequest *)request didReceiveResponse:(SKProductsResponse *)response
                            {
                                NSArray* products = response.products;
                                // do some stuff
                            }

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

                            - (void)productsRequest:(SKProductsRequest *)request didReceiveResponse:(SKProductsResponse *)response
                            {
                                if (@available(iOS 11.0, *)) {
                                    NSArray* products = response.products;
                                    [[SKProductStorePromotionController defaultController] updateStorePromotionOrder:products completionHandler:^(NSError * _Nullable error) {
                                        if(error != nil) {
                                            NSLog(@"Update store promotion order failed with error: %@", [error description]);
                                        } else {
                                            NSLog(@"Success");
                                        }
                                    }];
                                } else {
                                    // Fallback on earlier versions
                                }
                            }

                            После выполнения закроем и заново откроем страницу приложения в магазине, и взглянем на раздел встроенных покупок:


                            Порядок изменился. Данным вызовом мы установили приоритет для товара gold.iap.example.com. Теперь он показывается первым.

                            Если бы мы передали несколько товаров, они бы отображались в том порядке, в котором мы их передали. Далее идут остальные товары в их порядке по-умолчанию (то есть заданном в iTunes Connect). Если в качестве списка товаров передать nil, переопределение сбросится и все товары вернутся в первоначальное положение. Получить текущий установленный порядок можно вызовом:

                            - (void)fetchPromotionOrder
                            {
                                if (@available(iOS 11.0, *)) {
                                    [[SKProductStorePromotionController defaultController] fetchStorePromotionOrderWithCompletionHandler:^(NSArray * _Nonnull storePromotionOrder, NSError * _Nullable error) {
                                        if(error != nil) {
                                            NSLog(@"Fetch store promotion order failed with error: %@", [error description]);
                                        } else {
                                            NSMutableString* productIds = [NSMutableString string];
                                            for (SKProduct* product in storePromotionOrder) {
                                                [productIds appendString:product.productIdentifier];
                                                [productIds appendString:@"; "];
                                            }
                                            NSLog(@"Got promotion order: %@", productIds);
                                        }
                                    }];
                                } else {
                                    // Not supported
                                }
                            }

                            Метод вернет только те товары, порядок которых был переопределен, в порядке их переопределения.

                            Другая доступная пара методов взаимодействует с видимостью товаров. Выполнив следующий код мы переопределим видимость переданного товара gold.iap.example.com (в этих методах передается только один товар):

                            - (void)productsRequest:(SKProductsRequest *)request didReceiveResponse:(SKProductsResponse *)response
                            {
                                if (@available(iOS 11.0, *)) {
                                    SKProduct* product = [response.products objectAtIndex:0];
                                    [[SKProductStorePromotionController defaultController] updateStorePromotionVisibility:SKProductStorePromotionVisibilityHide forProduct:product completionHandler:^(NSError * _Nullable error) {
                                        if(error != nil) {
                                            NSLog(@"Update store promotion visibility failed with error: %@", [error description]);
                                        } else {
                                            NSLog(@"Success");
                                        }
                                    }];
                                } else {
                                    // Fallback on earlier versions
                                }
                            }

                            Наш приоритетный товар исчез из списка на странице магазина.


                            Другим методом можно получить текущую установленную видимость товара:

                            - (void)productsRequest:(SKProductsRequest *)request didReceiveResponse:(SKProductsResponse *)response
                            {
                                if (@available(iOS 11.0, *)) {
                                    SKProduct* product = [response.products objectAtIndex:0];
                                    [[SKProductStorePromotionController defaultController] fetchStorePromotionVisibilityForProduct:product completionHandler:^(SKProductStorePromotionVisibility storePromotionVisibility, NSError * _Nullable error) {
                                        if(error != nil) {
                                            NSLog(@"Fetch store promotion visibility failed with error: %@", [error description]);
                                        } else {
                                            NSLog(@"Promotion visibility %ld", (long)storePromotionVisibility);
                                        }
                                    }];
                                } else {
                                    // Fallback on earlier versions
                                }
                            }

                            Enum SKProductStorePromotionVisibility имеет следующие доступные значения: Show (товар виден), Hide (товар скрыт), Default (значение видимости берется из iTunes Connect).

                            Таким образом, список встроенных покупок можно подстраивать для каждого конкретного пользователя как угодно. Инструмент — в руках разработчика, остается самое главное: продумать правила показа, ведь именно от них зависит успех продаж тех или иных встроенных покупок и доход от приложения в целом. Все это демонстрирует желание Apple сделать App Store настоящим местом для покупок, а не банальным сервисом для хранения и поиска приложений.

                            Ссылка на документацию от Apple: developer.apple.com/app-store/promoting-in-app-purchases
                            Original source: habrahabr.ru (comments, light).

                            https://habrahabr.ru/post/337482/


                            Монетизация приложений в iOS 11: таргетируем встроенные покупки в новом App Store

                            Понедельник, 11 Сентября 2017 г. 11:34 + в цитатник
                            Groozze сегодня в 11:34 Разработка

                            Монетизация приложений в iOS 11: таргетируем встроенные покупки в новом App Store



                              На WWDC’17 Apple показала обновленный интерфейс App Store и представила ряд нововведений. Среди них были продвигаемые встроенные покупки, которые с выходом iOS 11 будут выводится прямо в поиске и редакторских подборках наряду с приложениями.

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

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

                              - (BOOL)paymentQueue:(SKPaymentQueue *)queue 
                              shouldAddStorePayment:(SKPayment *)payment 
                                        forProduct:(SKProduct *)product;

                              Пока в приложении не реализован этот метод, продвигаемые встроенные покупки нельзя будет приобрести из App Store. Но они будут отображены в специальном разделе на странице приложения.

                              Для того чтобы встроенную покупку сделать продвигаемой, необходимо заполнить специальные метаданные, недавно появившиеся в iTunes Connect: рекламное изображение, заголовок и краткое описание. После прохождения review изменений покупка появится в новом разделе «Продвижение в App Store», где можно в любой момент поменять значения видимости по умолчанию для всех пользователей и их порядок отображения на странице приложения в App Store. Так можно продвигать до 20 встроенных покупок одновременно и неограниченное количество покупок держать в режиме готовности к включению.



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

                              Важнейшей составляющей нововведения становится возможность программно изменять порядок и видимость продвигаемых встроенных покупок. Теперь мы можем подстраиваться под каждого пользователя приложения: выводить в топ горсть кристаллов игроку, у которого они на нуле; предлагать премиум-аккаунт активному пользователю; или открывать новый уровень игроку, который прошел весь основной контент. Или же вообще сделать специальное очень выгодное предложение покупки премиум-валюты видимым игроку только в тот момент, когда он столкнулся с острой нехваткой ресурсов, но при этом не воспользовался основным предложением по ее приобретению. Можно устроить A/B тестирование для нахождения оптимального порядка.

                              А конкретнее?


                              Рассмотрим новые методы API, предоставляемые Apple для совершения данных манипуляций.

                              Сделаем продвигаемыми две встроенные покупки приложения. До установки и после запуска, если ничего не делать, они будут отображаться у пользователя в соответствии с настройками из iTunes Connect:


                              Чтобы изменить порядок и видимость этих покупок, нам нужно получить объекты покупок по их sku через SKProductsRequest:

                              - (void)requestProducts
                              {
                                  SKProductsRequest* productRequest = [[SKProductsRequest alloc] initWithProductIdentifiers:[NSSet setWithObject:@"gold.iap.example.com"]];
                                  productRequest.delegate = self;
                                  [productRequest start];
                              }
                              
                              - (void)productsRequest:(SKProductsRequest *)request didReceiveResponse:(SKProductsResponse *)response
                              {
                                  NSArray* products = response.products;
                                  // do some stuff
                              }

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

                              - (void)productsRequest:(SKProductsRequest *)request didReceiveResponse:(SKProductsResponse *)response
                              {
                                  if (@available(iOS 11.0, *)) {
                                      NSArray* products = response.products;
                                      [[SKProductStorePromotionController defaultController] updateStorePromotionOrder:products completionHandler:^(NSError * _Nullable error) {
                                          if(error != nil) {
                                              NSLog(@"Update store promotion order failed with error: %@", [error description]);
                                          } else {
                                              NSLog(@"Success");
                                          }
                                      }];
                                  } else {
                                      // Fallback on earlier versions
                                  }
                              }

                              После выполнения закроем и заново откроем страницу приложения в магазине, и взглянем на раздел встроенных покупок:


                              Порядок изменился. Данным вызовом мы установили приоритет для товара gold.iap.example.com. Теперь он показывается первым.

                              Если бы мы передали несколько товаров, они бы отображались в том порядке, в котором мы их передали. Далее идут остальные товары в их порядке по-умолчанию (то есть заданном в iTunes Connect). Если в качестве списка товаров передать nil, переопределение сбросится и все товары вернутся в первоначальное положение. Получить текущий установленный порядок можно вызовом:

                              - (void)fetchPromotionOrder
                              {
                                  if (@available(iOS 11.0, *)) {
                                      [[SKProductStorePromotionController defaultController] fetchStorePromotionOrderWithCompletionHandler:^(NSArray * _Nonnull storePromotionOrder, NSError * _Nullable error) {
                                          if(error != nil) {
                                              NSLog(@"Fetch store promotion order failed with error: %@", [error description]);
                                          } else {
                                              NSMutableString* productIds = [NSMutableString string];
                                              for (SKProduct* product in storePromotionOrder) {
                                                  [productIds appendString:product.productIdentifier];
                                                  [productIds appendString:@"; "];
                                              }
                                              NSLog(@"Got promotion order: %@", productIds);
                                          }
                                      }];
                                  } else {
                                      // Not supported
                                  }
                              }

                              Метод вернет только те товары, порядок которых был переопределен, в порядке их переопределения.

                              Другая доступная пара методов взаимодействует с видимостью товаров. Выполнив следующий код мы переопределим видимость переданного товара gold.iap.example.com (в этих методах передается только один товар):

                              - (void)productsRequest:(SKProductsRequest *)request didReceiveResponse:(SKProductsResponse *)response
                              {
                                  if (@available(iOS 11.0, *)) {
                                      SKProduct* product = [response.products objectAtIndex:0];
                                      [[SKProductStorePromotionController defaultController] updateStorePromotionVisibility:SKProductStorePromotionVisibilityHide forProduct:product completionHandler:^(NSError * _Nullable error) {
                                          if(error != nil) {
                                              NSLog(@"Update store promotion visibility failed with error: %@", [error description]);
                                          } else {
                                              NSLog(@"Success");
                                          }
                                      }];
                                  } else {
                                      // Fallback on earlier versions
                                  }
                              }

                              Наш приоритетный товар исчез из списка на странице магазина.


                              Другим методом можно получить текущую установленную видимость товара:

                              - (void)productsRequest:(SKProductsRequest *)request didReceiveResponse:(SKProductsResponse *)response
                              {
                                  if (@available(iOS 11.0, *)) {
                                      SKProduct* product = [response.products objectAtIndex:0];
                                      [[SKProductStorePromotionController defaultController] fetchStorePromotionVisibilityForProduct:product completionHandler:^(SKProductStorePromotionVisibility storePromotionVisibility, NSError * _Nullable error) {
                                          if(error != nil) {
                                              NSLog(@"Fetch store promotion visibility failed with error: %@", [error description]);
                                          } else {
                                              NSLog(@"Promotion visibility %ld", (long)storePromotionVisibility);
                                          }
                                      }];
                                  } else {
                                      // Fallback on earlier versions
                                  }
                              }

                              Enum SKProductStorePromotionVisibility имеет следующие доступные значения: Show (товар виден), Hide (товар скрыт), Default (значение видимости берется из iTunes Connect).

                              Таким образом, список встроенных покупок можно подстраивать для каждого конкретного пользователя как угодно. Инструмент — в руках разработчика, остается самое главное: продумать правила показа, ведь именно от них зависит успех продаж тех или иных встроенных покупок и доход от приложения в целом. Все это демонстрирует желание Apple сделать App Store настоящим местом для покупок, а не банальным сервисом для хранения и поиска приложений.

                              Ссылка на документацию от Apple: developer.apple.com/app-store/promoting-in-app-purchases
                              Original source: habrahabr.ru (comments, light).

                              https://habrahabr.ru/post/337482/


                              Монетизация приложений в iOS 11: таргетируем встроенные покупки в новом App Store

                              Понедельник, 11 Сентября 2017 г. 11:34 + в цитатник
                              Groozze сегодня в 11:34 Разработка

                              Монетизация приложений в iOS 11: таргетируем встроенные покупки в новом App Store



                                На WWDC’17 Apple показала обновленный интерфейс App Store и представила ряд нововведений. Среди них были продвигаемые встроенные покупки, которые с выходом iOS 11 будут выводится прямо в поиске и редакторских подборках наряду с приложениями.

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

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

                                - (BOOL)paymentQueue:(SKPaymentQueue *)queue 
                                shouldAddStorePayment:(SKPayment *)payment 
                                          forProduct:(SKProduct *)product;

                                Пока в приложении не реализован этот метод, продвигаемые встроенные покупки нельзя будет приобрести из App Store. Но они будут отображены в специальном разделе на странице приложения.

                                Для того чтобы встроенную покупку сделать продвигаемой, необходимо заполнить специальные метаданные, недавно появившиеся в iTunes Connect: рекламное изображение, заголовок и краткое описание. После прохождения review изменений покупка появится в новом разделе «Продвижение в App Store», где можно в любой момент поменять значения видимости по умолчанию для всех пользователей и их порядок отображения на странице приложения в App Store. Так можно продвигать до 20 встроенных покупок одновременно и неограниченное количество покупок держать в режиме готовности к включению.



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

                                Важнейшей составляющей нововведения становится возможность программно изменять порядок и видимость продвигаемых встроенных покупок. Теперь мы можем подстраиваться под каждого пользователя приложения: выводить в топ горсть кристаллов игроку, у которого они на нуле; предлагать премиум-аккаунт активному пользователю; или открывать новый уровень игроку, который прошел весь основной контент. Или же вообще сделать специальное очень выгодное предложение покупки премиум-валюты видимым игроку только в тот момент, когда он столкнулся с острой нехваткой ресурсов, но при этом не воспользовался основным предложением по ее приобретению. Можно устроить A/B тестирование для нахождения оптимального порядка.

                                А конкретнее?


                                Рассмотрим новые методы API, предоставляемые Apple для совершения данных манипуляций.

                                Сделаем продвигаемыми две встроенные покупки приложения. До установки и после запуска, если ничего не делать, они будут отображаться у пользователя в соответствии с настройками из iTunes Connect:


                                Чтобы изменить порядок и видимость этих покупок, нам нужно получить объекты покупок по их sku через SKProductsRequest:

                                - (void)requestProducts
                                {
                                    SKProductsRequest* productRequest = [[SKProductsRequest alloc] initWithProductIdentifiers:[NSSet setWithObject:@"gold.iap.example.com"]];
                                    productRequest.delegate = self;
                                    [productRequest start];
                                }
                                
                                - (void)productsRequest:(SKProductsRequest *)request didReceiveResponse:(SKProductsResponse *)response
                                {
                                    NSArray* products = response.products;
                                    // do some stuff
                                }

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

                                - (void)productsRequest:(SKProductsRequest *)request didReceiveResponse:(SKProductsResponse *)response
                                {
                                    if (@available(iOS 11.0, *)) {
                                        NSArray* products = response.products;
                                        [[SKProductStorePromotionController defaultController] updateStorePromotionOrder:products completionHandler:^(NSError * _Nullable error) {
                                            if(error != nil) {
                                                NSLog(@"Update store promotion order failed with error: %@", [error description]);
                                            } else {
                                                NSLog(@"Success");
                                            }
                                        }];
                                    } else {
                                        // Fallback on earlier versions
                                    }
                                }

                                После выполнения закроем и заново откроем страницу приложения в магазине, и взглянем на раздел встроенных покупок:


                                Порядок изменился. Данным вызовом мы установили приоритет для товара gold.iap.example.com. Теперь он показывается первым.

                                Если бы мы передали несколько товаров, они бы отображались в том порядке, в котором мы их передали. Далее идут остальные товары в их порядке по-умолчанию (то есть заданном в iTunes Connect). Если в качестве списка товаров передать nil, переопределение сбросится и все товары вернутся в первоначальное положение. Получить текущий установленный порядок можно вызовом:

                                - (void)fetchPromotionOrder
                                {
                                    if (@available(iOS 11.0, *)) {
                                        [[SKProductStorePromotionController defaultController] fetchStorePromotionOrderWithCompletionHandler:^(NSArray * _Nonnull storePromotionOrder, NSError * _Nullable error) {
                                            if(error != nil) {
                                                NSLog(@"Fetch store promotion order failed with error: %@", [error description]);
                                            } else {
                                                NSMutableString* productIds = [NSMutableString string];
                                                for (SKProduct* product in storePromotionOrder) {
                                                    [productIds appendString:product.productIdentifier];
                                                    [productIds appendString:@"; "];
                                                }
                                                NSLog(@"Got promotion order: %@", productIds);
                                            }
                                        }];
                                    } else {
                                        // Not supported
                                    }
                                }

                                Метод вернет только те товары, порядок которых был переопределен, в порядке их переопределения.

                                Другая доступная пара методов взаимодействует с видимостью товаров. Выполнив следующий код мы переопределим видимость переданного товара gold.iap.example.com (в этих методах передается только один товар):

                                - (void)productsRequest:(SKProductsRequest *)request didReceiveResponse:(SKProductsResponse *)response
                                {
                                    if (@available(iOS 11.0, *)) {
                                        SKProduct* product = [response.products objectAtIndex:0];
                                        [[SKProductStorePromotionController defaultController] updateStorePromotionVisibility:SKProductStorePromotionVisibilityHide forProduct:product completionHandler:^(NSError * _Nullable error) {
                                            if(error != nil) {
                                                NSLog(@"Update store promotion visibility failed with error: %@", [error description]);
                                            } else {
                                                NSLog(@"Success");
                                            }
                                        }];
                                    } else {
                                        // Fallback on earlier versions
                                    }
                                }

                                Наш приоритетный товар исчез из списка на странице магазина.


                                Другим методом можно получить текущую установленную видимость товара:

                                - (void)productsRequest:(SKProductsRequest *)request didReceiveResponse:(SKProductsResponse *)response
                                {
                                    if (@available(iOS 11.0, *)) {
                                        SKProduct* product = [response.products objectAtIndex:0];
                                        [[SKProductStorePromotionController defaultController] fetchStorePromotionVisibilityForProduct:product completionHandler:^(SKProductStorePromotionVisibility storePromotionVisibility, NSError * _Nullable error) {
                                            if(error != nil) {
                                                NSLog(@"Fetch store promotion visibility failed with error: %@", [error description]);
                                            } else {
                                                NSLog(@"Promotion visibility %ld", (long)storePromotionVisibility);
                                            }
                                        }];
                                    } else {
                                        // Fallback on earlier versions
                                    }
                                }

                                Enum SKProductStorePromotionVisibility имеет следующие доступные значения: Show (товар виден), Hide (товар скрыт), Default (значение видимости берется из iTunes Connect).

                                Таким образом, список встроенных покупок можно подстраивать для каждого конкретного пользователя как угодно. Инструмент — в руках разработчика, остается самое главное: продумать правила показа, ведь именно от них зависит успех продаж тех или иных встроенных покупок и доход от приложения в целом. Все это демонстрирует желание Apple сделать App Store настоящим местом для покупок, а не банальным сервисом для хранения и поиска приложений.

                                Ссылка на документацию от Apple: developer.apple.com/app-store/promoting-in-app-purchases
                                Original source: habrahabr.ru (comments, light).

                                https://habrahabr.ru/post/337482/


                                [recovery mode] Индия приняла закон о «выключении» интернета

                                Понедельник, 11 Сентября 2017 г. 10:00 + в цитатник
                                VASExperts сегодня в 10:00 Администрирование

                                Индия приняла закон о «выключении» интернета

                                В конце августа жители Индии из штатов Харьяна и Пенджаб обнаружили, что 2G, 3G, 4G, CDMA и GPRS перестали работать. Были отключены и СМС-сообщения. На несколько дней 50 млн человек остались без доступа к мобильному интернету. С учетом, что 77% городских и 92% сельских жителей Индии пользуются мобильными телефонами для выхода в Сеть, почти все цифровые каналы распространения информации для жителей оказались перекрыты.

                                Это не первый раз, когда власти страны прибегли к такой мере: с начала 2017 года в разных районах производилось 20 частичных отключений. После случая с Харьяном и Пенджабом СМИ обратили внимание на документ, который был выпущен правительством Индии в начале августа. В нем описываются правила и процесс отключения интернета в стране.


                                / Flickr / Field Engineer / CC

                                Право на блэкаут


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

                                Согласно новым правилам распоряжение о блокировке интернета может быть вынесено должностным лицом высшего уровня, отвечающим за внутреннюю безопасность, как на уровне страны, так и на уровне штата. Поводом для отключения могут быть «непреодолимые обстоятельства». Документ разрешает любому сотруднику Объединенного секретариата распорядиться о блокировке, если получение разрешения от Министерства внутренних дел «не представляется возможным». Запрет может сохраняться в течение 24 часов без разрешения Главного управления. Однако любое распоряжение о блокировке должно иметь под собой определенные основания.

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

                                Почему блокируют?


                                По данным доклада IMRB, общее распространение интернета в Индии в марте 2017 года составляло 31%. В городской черте этот показатель возрастает вдвое. С учетом объема цифровой экономики, согласно исследованию Института Брукингса, в 2015 году Индия потеряла почти миллиард долларов из-за остановок интернета. Это больше, чем любая другая страна за тот же период.

                                Правительство Индии объясняет блокировку попыткой защитить граждан. После терактов в ноябре 2008 года в Мумбаи индийский парламент утвердил поправки к «Закону об информационных технологиях», которые расширили возможности правительства по мониторингу. Ограничение доступа встало в один ряд с введением комендантского часа для обеспечения безопасности в случае беспорядков.

                                В 2017 году большая часть блокировок пришлась на штат Кашмир, территория которого имеет спорный статус. Блокировки также совершались в Харьяне, Раджастхане, Уттар-Прадеше, Мадхья-Прадеше, Западной Бенгалии и Махараштре.

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

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

                                «Инвесторы больше не будут закрывать глаза на финансовые потери, вызванные приостановкой обслуживания, — считает Питер Мисек (Peter Micek), юрисконсульт в Access Now. — Отключение напрямую вредит крупнейшим мультинациональным компаниям и самым маленьким стартапам, препятствуя мобильным транзакциям и блокируя доступ к рынкам».

                                Институт Брукингса пришел к выводу, что в период с 1 июля 2015 года по 30 июня 2016 года страны мира понесли ущерб в размере $2,4 млрд в связи с локальными отключениями.

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

                                P.S. О чем еще мы пишем в нашем блоге VAS Experts:

                                Original source: habrahabr.ru (comments, light).

                                https://habrahabr.ru/post/337584/


                                Метки:  

                                [recovery mode] Индия приняла закон о «выключении» интернета

                                Понедельник, 11 Сентября 2017 г. 10:00 + в цитатник
                                VASExperts сегодня в 10:00 Администрирование

                                Индия приняла закон о «выключении» интернета

                                В конце августа жители Индии из штатов Харьяна и Пенджаб обнаружили, что 2G, 3G, 4G, CDMA и GPRS перестали работать. Были отключены и СМС-сообщения. На несколько дней 50 млн человек остались без доступа к мобильному интернету. С учетом, что 77% городских и 92% сельских жителей Индии пользуются мобильными телефонами для выхода в Сеть, почти все цифровые каналы распространения информации для жителей оказались перекрыты.

                                Это не первый раз, когда власти страны прибегли к такой мере: с начала 2017 года в разных районах производилось 20 частичных отключений. После случая с Харьяном и Пенджабом СМИ обратили внимание на документ, который был выпущен правительством Индии в начале августа. В нем описываются правила и процесс отключения интернета в стране.


                                / Flickr / Field Engineer / CC

                                Право на блэкаут


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

                                Согласно новым правилам распоряжение о блокировке интернета может быть вынесено должностным лицом высшего уровня, отвечающим за внутреннюю безопасность, как на уровне страны, так и на уровне штата. Поводом для отключения могут быть «непреодолимые обстоятельства». Документ разрешает любому сотруднику Объединенного секретариата распорядиться о блокировке, если получение разрешения от Министерства внутренних дел «не представляется возможным». Запрет может сохраняться в течение 24 часов без разрешения Главного управления. Однако любое распоряжение о блокировке должно иметь под собой определенные основания.

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

                                Почему блокируют?


                                По данным доклада IMRB, общее распространение интернета в Индии в марте 2017 года составляло 31%. В городской черте этот показатель возрастает вдвое. С учетом объема цифровой экономики, согласно исследованию Института Брукингса, в 2015 году Индия потеряла почти миллиард долларов из-за остановок интернета. Это больше, чем любая другая страна за тот же период.

                                Правительство Индии объясняет блокировку попыткой защитить граждан. После терактов в ноябре 2008 года в Мумбаи индийский парламент утвердил поправки к «Закону об информационных технологиях», которые расширили возможности правительства по мониторингу. Ограничение доступа встало в один ряд с введением комендантского часа для обеспечения безопасности в случае беспорядков.

                                В 2017 году большая часть блокировок пришлась на штат Кашмир, территория которого имеет спорный статус. Блокировки также совершались в Харьяне, Раджастхане, Уттар-Прадеше, Мадхья-Прадеше, Западной Бенгалии и Махараштре.

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

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

                                «Инвесторы больше не будут закрывать глаза на финансовые потери, вызванные приостановкой обслуживания, — считает Питер Мисек (Peter Micek), юрисконсульт в Access Now. — Отключение напрямую вредит крупнейшим мультинациональным компаниям и самым маленьким стартапам, препятствуя мобильным транзакциям и блокируя доступ к рынкам».

                                Институт Брукингса пришел к выводу, что в период с 1 июля 2015 года по 30 июня 2016 года страны мира понесли ущерб в размере $2,4 млрд в связи с локальными отключениями.

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

                                P.S. О чем еще мы пишем в нашем блоге VAS Experts:

                                Original source: habrahabr.ru (comments, light).

                                https://habrahabr.ru/post/337584/


                                Метки:  

                                Поиск сообщений в rss_rss_hh_full
                                Страницы: 1824 ... 1526 1525 [1524] 1523 1522 ..
                                .. 1 Календарь