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

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

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

 

 -Статистика

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

Habrahabr/New








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

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

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

Окно в сердце конференции Гейзенбаг 2017 Piter

Суббота, 03 Июня 2017 г. 10:57 + в цитатник
Где находятся сердца конференций, организуемых JUG.ru Group? Сердца конференций, конечно же, в их главных залах. И если на конференцию в Питер вас не отпустил начальник и даже не согласовал онлайн-участие — мы откроем для вас окно в сердце Гейзенбаг 2017 Piter. Смотрите в это окно сами, пригласите коллег и начальника — в следующий раз вы точно сможете прийти лично (или получить полный онлайн-доступ) и целиком окунуться в стремительный и бурлящий поток жизни конференции.

4 июня 2017 в 10 утра (по московскому времени) мы откроем бесплатную онлайн-трансляцию из главного зала конференции.



Ссылка на онлайн-трансляцию первого трека конференции Гейзенбаг 2017 Piter и краткое описание докладов — под катом.

Смотреть трансляцию



В первом треке конференции, проходящем в главном зале, выступают:

  • Ilari Henrik Aegerter — Think Bigger – How to Truly Become World-Class in Testing
  • Алексей Виноградов — Как улучшить автотесты: сеанс черной магии
  • Алексей Лавренюк — Учимся анализировать результаты нагрузочного тестирования
  • Андрей Сатарин — Мойте руки перед едой, или Санитайзеры в тестировании
  • Игорь Хрол — Тестирование в мире данных
  • Артем Ерошенко — Allure 2: тест-репорты нового поколения
  • Николай xpinjection Алименков — Паттерны проектирования в автоматизации тестирования

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



Программа первого трека


10:30-11:20 Ilari Henrik Aegerter — Think Bigger – How to Truly Become World-Class in Testing

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

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

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



11:40-12:30 Алексей Виноградов — Как улучшить автотесты: сеанс черной магии

Писать UI-автотесты можно по-разному. Какие приёмы стоит применять профессиональному разработчику, а какие лучше обходить стороной? Где кроется боль в современном автоматизированном тестировании? Алексей продемонстрирует свою позицию на наглядных примерах. Начнём с простого кода и последовательно применим к нему популярные дизайн-паттерны, как-то: PageFactory, LoadableComponents, Single Responsibility Principle и другие.



12:50-13:40 Алексей Лавренюк — Учимся анализировать результаты нагрузочного тестирования

Мы «обстреляем» демонстрационный web-сервис на Python Tornado, который специально написан так, чтобы проявились проблемы производительности. Алексей покажет, как в отчётах нагрузочных тестов проявляются утечки ресурсов, тяжёлые cron job, плохие алгоритмы и тяжёлые запросы в базы данных. Мы сделаем выводы, поправим узкие места и сравним производительность сервиса «до» и «после».



14:25-15:15 Андрей Сатарин — Мойте руки перед едой, или Санитайзеры в тестировании

Как известно, «с большой силой приходит и большая ответственность». С++ – это язык с большой выразительной силой и огромными возможностями. За эти возможности приходится платить потенциальными дефектами, которые отсутствуют в программах на управляемых (managed) языках.

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



15:35-16:25 Игорь Хрол — Тестирование в мире данных

Руководство компаний старается принимать решения не по наитию, а на основе цифр и объективных данных. Как же тестировать работу программного обеспечения, которое эти цифры считает? Если код, обработав данные компании за год, показывает 42% — это правильный ответ, или же там ошибка, и мы должны были получить 43%? На основе практик, наработанных в отделе аналитики компании Toptal, хотелось бы ответить на эти вопросы. BI, ETL, DWH, ML… Если вы знаете, что означают эти аббревиатуры — приходите поговорить о тестировании в мире данных.



16:45-17:35 Артем Ерошенко — Allure 2: тест-репорты нового поколения

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

Allure Framework — популярный инструмент построения отчётов автотестов, упрощающий их анализ. В докладе Артем расскажет про новую версию Allure 2. В ней появилось много нового: окружение, перезапуски и история теста, отображение фикстур, категории ошибок и многое другое. Одной из ключевых особенностей является возможность адаптировать Allure под себя с помощью системы плагинов.



17:50-18:40 Николай Алименков — Паттерны проектирования в автоматизации тестирования

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

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

Ограничения


  • Поскольку трансляция бесплатная, она предоставляется по принципу as is: мы уверены, что все будет хорошо, но если вдруг что – не обессудьте!
  • Видеозаписей не будет. То есть они, конечно, будут, но только для участников конференции, оставивших фидбек. А для всех остальных мы традиционно выложим их через 3-4 месяца.
  • Вы не сможете смотреть, что происходит в других залах. А там будет много интересного. В следующий раз регистрируйтесь и смотрите все без ограничений.
Original source: habrahabr.ru (comments, light).

https://habrahabr.ru/post/329698/


Интеграция SaltStack и Telegram

Пятница, 02 Июня 2017 г. 23:21 + в цитатник

image
В данной статье хотел бы рассказать об отправке уведомлений в Telegram чат при использовании SaltStack. Начиная с версии 2015.5.0, SaltStack предоставляет интеграцию со Slack из коробки, однако Telegram также является популярным мессенджером и активно используется среди российских пользователей. Поэтому надеюсь, что статья окажется полезна ее читателям.


Введение


Вообще говоря, SaltStack представляет собой конструктор и, как и многие другие инструменты, предоставляет возможности для кастомизации и расширения. В частности, собственные исполняемые модули.
О том, как можно создать Telegram бота на Python подробно рассказывается здесь. В качестве дополнения будет описано, как, используя небольшой Python-модуль, такой подход можно привязать к SaltStack.


Процесс настройки


Приступать к написанию модуля следует после того, как:


  1. Создан бот
  2. Бот дабавлен в чат
  3. Получен chat_id

Примечание. Получить id чата можно с помощью следующего скрипта на python:


import requests

URL = 'https://api.telegram.org/bot'
TOKEN = <токен вашего бота>

try:
    request = requests.post('{url}{token}/getUpdates'.format(url=URL, token=TOKEN))
    print request.json()['result'][0]['message']['chat']['id']
except Exception,e:
    print str(e)

Итак, переходим к главному. Как описано в документации, SaltStack модуль должен располагаться в директории _modules/ и выглядеть следующим образом:


import requests

URL='https://api.telegram.org/bot'

def notify(message, token, chat_id):
        message_data = {
                'chat_id': chat_id,
                'text': message
        }

        try:
                request = requests.post('{url}{token}/sendMessage'.format(url=URL, token=token), data=message_data)
        except Exception,e:
                return False, str(e)

        if not request.status_code == 200:
                return False, "Return status is unsuccessful"
        # для наглядности вторым значением возвращается строка со служебной информацией.
        return True, "Message was successfully sent"

Далее необходимо выполнить команду синхронизации модулей, чтобы они появились на миньонах:
salt '*' saltutil.sync_modules


Если все завершилось успешно, результат будет примерно следующим:
image


И, напоследок, создаем файл состояния (в данном примере — send_telegram.sls)


send message about minion id:
  module.run:
    # telegram - имя python-модуля, notify - метод в этом модуле
    - name: telegram.notify
    - kwargs:
      message: command executed on minion with id {{ grains['id'] }}
      token: <токен вашего бота>
      chat_id: 

Проверяем работоспособность созданного модуля:
salt '*' state.apply send_telegram


На стороне мастера:
image


В чате:
image


Источники


  1. Телеграм бот на Python с использованием только requests
  2. Writing execution modules
  3. How do I use salt states?

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

https://habrahabr.ru/post/330028/


Метки:  

Security Week 22: В Samba нашлась уязвимость, ShadowBrokers открыли подписку на эксплойты, фишеры массово освоили HTTPS

Пятница, 02 Июня 2017 г. 21:51 + в цитатник
Говорят, что если долго смотреть в 445-й порт, оттуда выглянет сетевой червь. В последние недели он привлек столько внимания, что на свет вышли уязвимости даже в НЕУЯЗВИМОМ (как всем известно) Linux. Точнее, в популярной сетевой файловой системе Samba, без которой Linux с Windows в сети не подружиться.

Напрямую найденный баг к известному набору эксплойтов отношения не имеет, однако сравнения напрашиваются – тот же протокол и похожий сценарий использования. Злоумышленнику достаточно найти Linux с SMB-ресурсом, открытым на запись из Интернета, загрузить туда библиотеку, которую сервер радостно запустит. Сей процесс элементарно автоматизируется, то есть от уязвимости явственно пахнет сетевыми червями.

Ксавье Мертенс из SANS Internet Storm Center указал, что уязвимость можно использовать тривиально, «эксплойтом в одну строчку кода». Rapid7 просканировали Сеть, как это сейчас модно, и нашли там 104 тысячи систем с уязвимой Samba. Потом вспомнили про порт 139, просканировали еще и его, и нашли уже 110 тысяч систем.

Возможно, вы скажете, что поставить Linux и держать открытыми в мир SMB-шары – больная идея. И в чем-то будете правы. Однако есть большой пласт устройств, для которых это нормальный сценарий. Речь о сетевых хранилищах, которые часто используют Linux, а вот обновляются ой как нечасто.

Кстати, для тех версий Samba, что стоят на 90% уязвимых систем, патча до сих пор нет, поэтому технических подробностей тоже нет (хотя кое-кто уже выложил код доказательства концепции в Twitter). Мертенс рекомендует, если для вашего хранилища нет обновления на этот счет, добавить в секцию [global] файла smb.cof параметр nt pipe support = no. Просто на всякий случай.

ShadowBrokers будут сливать эксплойты по подписке

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

С одной стороны, снабжать деньгами откровенно киберкриминальную группировку не годится. С другой стороны, эти эксплойты и троянцы однозначно попадут в нехорошие руки, так что безопасникам надо быть готовыми. Промедление может караться эпидемией похуже воннакрая, так что кто-то из ИБ-компаний наверняка оформил подписку. Цена в 100 Zcash (примерно $23000) ежемесячно выглядит невысокой, учитывая мощную «рекламную кампанию», проведенную посредством WannaCry.

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

Фишинговые сайты массово используют HTTPS

Новость. Пользователей долго приучали к тому, что серфить безопасно можно только по HTTPS. Мол, видите зеленый замочек слева от url – можно смело вбивать свои учетные данные. Что ж, многие привыкли к этому и доверяют сайту, если замок зеленый. Зря.

Стремление криптоэнтузиастов зашифровать весь интернет и все коммуникации в нем привели к появлению сервисов автоматической выдачи сертификатов, вроде Let’s Encrypt. Удостоверяющим центром это называть как-то не хочется, так как оно ничего, в общем-то, и не удостоверяет. В результате любой фишер, создав сайт-подделку, быстренько обзаводится зеленым замочком, что здорово помогает дурить народ.

Согласно выводам исследователей из группы Cisco Talos, такое вот вредоносное использование HTTPS приняло в Интернете массовый характер, и пора бить тревогу. По данным SSL Store, в прошлом году выдано 15270 бесплатных SSL-сертификатов для сайтов со словом «PayPal» в доменном имени или идентификаторе владельца.
Что с этим делать, пока не очень ясно. Даже если научить пользователей внимательно читать url, это поможет лишь отчасти, так как не всегда понятно, фишинговый ли это домен, или лишь один из многочисленных легитимных доменов организации. Аналогично и с проверкой сертификата – каждый раз надо точно знать название юрлица. Рано или поздно помощь придет со стороны технологий, ну а пока что можно лишь посоветовать «разуть глаза».

Древности


«Klaeren-971»

Резидентный неопасный вирус, зашифрован, заражает .COM- и .EXE-файлы, кроме COMMAND.COM, при их запуске. Перехватывает int 21h. В мае стирает CMOS, заполняет экран надписями «Klaeren Hac, Hac!» и при этом мигает индикаторами NumLock, CapsLock, ScrollLock.

Цитата по книге «Компьютерные вирусы в MS-DOS» Евгения Касперского. 1992 год. Страницa 73.

Disclaimer: Данная колонка отражает лишь частное мнение ее автора. Оно может совпадать с позицией компании «Лаборатория Касперского», а может и не совпадать. Тут уж как повезет.
Original source: habrahabr.ru (comments, light).

https://habrahabr.ru/post/330116/


Метки:  

Сеть TOR в России полностью подконтрольна ФСБ

Пятница, 02 Июня 2017 г. 21:39 + в цитатник
Прямых доказательств здесь не будет.
1) Сеть TOR используется для сокрытия информации о пребывании в сети.
2) Вскрытие сети TOR и деанонимизация — одна из приоритетных задач спецслужб.

Как это сделано:
1) В оборудовании ЛЮБОГО провайдера стоит сервер «СОРМ» — который может собирать всю информацию о любом трафике абонентов провайдера.
2) Работа сети TOR обеспечивается прохождением пакетом цепочки серверов, и на выходе таким образом трафик имеет не тот IP, что у абонента.
3) Тот кто контролирует сервера TOR — тот совершенно свободно знает о всех движениях внутри сети.
4) В РФ серверов TOR (exit nodes) несколько десятков, угадайте под чьим контролем?

Итого: мы знаем все входы (СОРМ) и все выходы (exit nodes).
Именно поэтому TOR не спешат блокировать — ловить там проще чем перерыть весь остальной трафик обычных пользователей.
Original source: habrahabr.ru (comments, light).

https://habrahabr.ru/post/330114/


Метки:  

Dotty уже на пороге

Пятница, 02 Июня 2017 г. 21:19 + в цитатник
Следующее поколение языка Scala, третью версию которой лично я жду с большим нетерпением, кажется уже не за горами. Новый компилятор и новый набор фич для Scala 3 .0 разрабатывается в рамках проекта Dotty. 17 месяцев назад Дотти отпраздновал небольшую победу — bootstrap, т.е. он смог скомпилировать сам себя. В планах на новые фичи было много вкусностей, которым были посвящены публикации на хабре (тыц — если кто не читал, то советую пройти по ссылке).

И вот пару дней назад на гитхабе проекта появился многообещающий коммит от Дмитрия Петрашко (один из ключевых разработчиков dotty), озаглавленный «Start writing release anouncement.», т.е. «Начинаем писать новость о выпуске».

Если вкратце пересказать суть написанного, то
  • скоро выходит alpha-версия 0.1.2
  • уже реализовано очень многое из обещанного (Intersection Types, Union Types, Trait Parameters, Enumerations, Algebraic Data Types, By-Name Implicits)
  • нереализованное (в основном оптимизации) реализуется довольно быстро
  • поэтому теперь каждые 6 недель будет выходить новый релиз
  • заявляется поддержка Visual Studio Code (зачем-то) и sbt, включая параллельную компиляцию dotty и scala2

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

А медлить нельзя. Конкуренты не дремлют: Kotlin уже стал вторым официальным языком Android. Чем scala пока похвастаться не сможет в первую очередь из-за «scala is too slow», т.е. чрезмерной тормознутости при компиляции и неоптимизированности стандартных библиотек — того, что dotty должен исправить.
Original source: habrahabr.ru (comments, light).

https://habrahabr.ru/post/330112/


Метки:  

Интеграция сайта и прочего ПО с онлайн-кассами

Пятница, 02 Июня 2017 г. 18:21 + в цитатник
Онлайн касса Хочу поделиться опытом разработки ПО для бюджетной онлайн-кассы VikiPrint 57. В связи с вступлением в силу закона ФЗ-54, это может быть актуально и полезно техническим специалистам, которые впервые в жизни выполняют задачу по интеграции ПО или сайта с физическим оборудованием. Особенно с этих онлайн-касс «бзднут» вебмастеры, разрабатывающие на WordPress магазины и по-другому понимающие термин «онлайн».

Да, судя по всему, когда вы что-то заказываете в Интернет-магазине, в каком-то бутике в ТЦ сам по себе будет «вылазить» чек из кассы. Иначе владельца магазина оштрафуют. Если, конечно, ничего не изменится в головах тех людей, кто это придумал. Просто чудо как оно есть!

Тезисы для тех, кто не понимает о чем речь:

  • Через месяц федеральный закон 54 обязует перейти весь бизнес со старых ККМ на новые, с приставкой онлайн;
  • Через год, в 2018 году, онлайн-кассу обязуют купить даже тех, чей тип налогооблажения позволяет сейчас не использовать ККМ совсем (например — ЕНВД);
  • Стоимость онлайн кассы — от 20 тыс. рублей; Из них 7 тысяч рублей — это, собственно, инновации в виде встроенной флешки и шифрующего устройства;
  • Онлайн-кассы шлют данные о каждой продаже операторам фискальных данных (ОФД) — это посредники между налоговым органом и бизнесом, стоимость столь нужной услуги — от 3 тыс. рублей в год;
  • В целом, новые онлайн кассы — это старые кассы в новом корпусе и с новым видом фискального накопителя. Просто все упаковано маркетологами в «продукт». Нередко в «продукт» к онлайн-кассе упаковывается китайский планшет, который служит интерфейсом взаимодействия с кассой.

Устройство онлайн-кассы


Итак, изменилось лишь устройство хранения информации внутри кассы, формат корпуса и названия юрлиц, которые производят и продают эти кассы (сами организации физически не поменялись). Теперь устройство умеет получать, шифровать и отдавать данные. Онлайн онлайном, а данные о покупках все равно хранятся внутри устройства. Черный ящик с данными стоимостью 7 тыс. рублей нужно менять раз в 13-36 месяцев. Теперь в нем хранятся еще наименования продуктов и артикул, наценка, скидка, тип налога и т.д. До 2021 года точные данные не обязательны, можно продавать товары вида «LOL — 10 рублей.», все пока по-игрушечному.

Подключение онлайн-кассы к компьютеру


Касса подключается к компьютеру через COM-порт. Никто из производителей не хочет дорабатывать все, что внутри корпуса, поэтому нормальных касс для компьютера с USB интерфейсов нет, все ориентировано на старые POS-терминалы. Если COM-порта в вашем компьютере нет, на сайте производителя сайта можно скачать костыль, эмулятор COM-порта для USB, большинство касс продаются с USB проводом в комплекте.

Если работаете с USB VikiPrint, обязательно прочитайте про танцы с бубном чуть ниже. Как взаимодействует с ОФД АТОЛ и Штрих-М — пока не могу сказать.

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

Принцип работы кассы


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

  1. Открыть документ определенного типа (сервисный, регистрация продажи, отмена покупки и т.д.);
  2. Занести в документ позиции: артикул, наименование, цена, количество;
  3. Внести деньги в кассу;
  4. Внести скидку в кассу, если это необходимо. Есть два вида скидки: процент и фиксированная сумма;
  5. Вывести итог;
  6. Закрыть документ.

Так оно все работало и раньше, но теперь онлайн-кассы печатают также QR код при закрытии документа и появилась возможность указать E-mail покупателя. Кассы, с которыми я работал, не умеют отправлять чек ни по СМС ни по почте. Пока что это задача кассира, программы или ОФД. Хотя, возможно, скоро появятся варианты со встроенной СИМ-картой.

На основании внесенных данных, касса формирует чек и печатает его на термопринтере. Далее, отправляет в ОФД. ОФД моментально перенаправляет данные в налоговый орган.

Интеграция ПО с онлайн кассой


Порядок действий таков:

  1. Скачать на сайте производителя нужный тип драйвера (для Windows, как правило, выпущен обычный dll);
  2. Скачать документацию на драйвер, ознакомиться с основными публичными интерфейсами. Реально все не очень сложно, быстро сможет разобраться даже веб-разработчик, далекий от физического оборудования;
  3. Импортировать dll в ЯП, на котором вы пишите. Это возможно даже в PHP, особенно удобно работать с Active-X драйверами.
  4. Слать COM-порту через высокоуровневый драйвер нужные команды. Для некоторых ОС некоторые производители касс еще не выпустили драйверы, — в этом случае придется писать свой драйвер или ждать;
  5. Скачать сервисную утилиту (в случае с VikiPrint — Fito), через нее подключиться к кассе и задать в настройках ОФД нужные URL и порт. Все настройки можно найти на сайте ОФД.

При этом нужно иметь в виду, что:

  • В документации может быть одно, в примерах второе, а по факту вообще третье. В случае с VikiPrint, разработку я вел методом тыка. У АТОЛ сравнительно хорошие драйвера и документация почти всегда соответствует действительности. Кстати, Эвотор — это по факту Атол с упаковкой от маркетологов Сбербанка;
  • Мир драйверов выглядит так, как UI на скриншоте ниже. Любителям мира продуманных интерфейсов лучше держаться подальше от этого наркоманского района:


Пример интеграции с программой на C#


Далеко не всем магазинам нужны POS-терминалы. Тем людям, которые сейчас не используют кассовую технику (в том числе владельцы ИМ без офлайн точки совсем), придется таки купить кассовый аппарат до июня 2018 года, закон больнее всего ударит именно по таким предпринимателям. Также, скорее всего, придется почесать репу и нам, разработчикам, чтобы заинтегрировать онлайн-кассу в бизнес, которому чужда кассовая техника.

Опенсорс-часть компании, где я тружусь, решила поиграть в Win-Lose игре на стороне лузера и приступила к разработке бесплатной программы без лишнего функционала для тех, кому все это навязывают. Программа подойдет тем, у кого уже стоит компьютер в торговом зале для выполнения повседневных задач администратора — общение с клиентами в соц. сетях, использование программ подбора товара и т.д. Чуть позже добавим функционал взаимодействия с Интернет-магазином и пример модуля для какой-нибудь популярной CMS.

Программа называется Движ.Кассир, исходный код на C# открыт. Нас интересует папка drivers, в ней лежат классы, реализующие интерфейс взаимодействия с драйвером: Atol.cs и VikiPrint.cs. Первый использует высокоуровевый драйвер в виде Active-X компонента, все достаточно просто и соответствует документации на сайте производителя. Второй может оказаться более полезным для разработчиков, потому что работает со свеженаписанным драйвером, который опубликовали на сайте и закрыли там комментарии. И никто, видимо, не может теперь сказать им там, что инструкция к этому файлу не соответствует действительности. Тех. поддержка работает по скрипту и всех отшивает со словами «все заняты, мы вам перезвоним.» Думаю, к 2018 году все будет работать более стабильно, понятно и надежно, а пока пришлось немного попотеть и применить методы тыка, чтобы импортировать эту dll в C# класс.

Примерно вот так DLL любого драйвера кассы импортируется в C#, см. PiritLib.cs:

//openPort
[DllImport("PiritLib.dll", CallingConvention = CallingConvention.StdCall)]
public static extern int openPort(string fileName, int speed);

//commandStart
[DllImport("PiritLib.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]
public static extern int commandStart();

[DllImport("PiritLib.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]
public static extern int libAddDiscount(byte typeDiscount, string nameDiscount, int sum);

Далее, с PiritLib можно удобно работать через более дружелюбный класс VikiPrint.cs, который наследует PiritLib и в конструкторе сам на автомате открывает порт.

    //Создаем объект драйвера, передавая имя COM порта и его скорость
    drivers.FiscalInterface driver = new VikiPrint("COM5", 57600);
    //Открываем документ типа регистрации покупки:
    driver.OpenDocument(2); 
    //Регистрируем нужный товар (название, артикул, кол-во, цена, номер позиции):
    driver.RegisterProduct("Кроссовки", "33111", 1, 2099, 1);
    //Регистрируем скидку (тип, примечание и размер). Типы: 0 - процент, 1 - фикс.
    driver.RegisterDiscount(1, "За то, что ты был хорошим поцом", 1);
    //Выводим итог
    driver.PrintTotal();
    //Регистрируем занесение в кассу денег (сумма, тип оплаты)
    driver.RegisterPayment(2099, 0);
    //Закрываем документ. При этом печатаетcя QR код
    driver.CloseDocument();

Теперь нужно собрать вашу программу и настроить взаимодействие с кассиром через GUI или с сайтом через REST. Обмен должен происходить раз в N минут\часов\недель, касса должна слать\печатать все чеки скопом. Формально чек должен отправиться в ОФД сразу, но, понятно, из-за отсутствия Интернета или по другим техническим причинам, это может произойти через какой-то промежуток времени. Никакой конкретики в законе пока нет, все очень сыро. Есть еще такой нюанс — если в течение месяца касса не отправила ни одного чека, фискальная память блокируется (во всяком случает, так хотят законотворцы).

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

Танцы с бубном


Большинство бюджетных онлайн-касс — это старые кассы без возможности соединения с Интернетом напрямую (нет нужного порта). Поэтому существует костыль под названием ComProxy. Данная программа запускает сервис, который служит прокси для дополнительных виртуальных COM-портов, именно через эти порты касса получает Интернет с компьютера и отправляет свои данные в ОФД. Танцы с бубном описаны в этой статье.

В итоге, после недели фейспалма, мне удалось все настроить — после обмена данными между цепочкой физических устройств и серверов, я увидел тестовые покупки в личном кабинете в ОФД. Надеюсь, статья будет полезна другим. Скидывайте, пожалуйста, в комменты примеры интеграции на других ЯП и с другим оборудованием.
Original source: habrahabr.ru (comments, light).

https://habrahabr.ru/post/330110/


Метки:  

К вопросу о числах

Пятница, 02 Июня 2017 г. 18:06 + в цитатник

«Ну что, без драки? Волейбол — так волейбол!»
Ну что же, USB — так USB



Не в моих правилах баловать читателя КДПВ, но не мог удержаться.

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

Как мы можем решить эту задачу, и причем тут Уроборос?

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

Т = С + И

— как только данное равенство выполнится, мы достигли нужного нам момента времени.

Все бы хорошо, но есть проблема проскальзывания — время течет независимо от нашего поведения, одновременно с ним изменяется переменная Т, и если мы по каким-то причинам не выполним сравнения в момент равенства, то условие будет утеряно и мы никогда не узнаем, что нужное нам время наступило (на самом деле в реальном мире узнаем, но об этом позже). Поэтому жесткое условие = следует заменить на мягкое >=, либо <=, если переменная Т уменьшается со временем и мы получаем условие Т >= С + И, которое пропустить уже намного сложнее (если вообще возможно) и все получается просто замечательно, непонятно, чем будет заполнена оставшаяся часть поста.

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

Проблема возникает в силу того, что время бесконечно, а разрядность чисел в МК ограничена и мы принципиально не можем натянуть несчетное множество на счетное, это аксиома. Поэтому наше число Т, какого бы размера оно не было, не может однозначно определить некоторый момент времени, а будет иметь период. Длительность этого периода будет составлять максимальное число, уменьшающееся в Т + 1, умноженное на время увеличения Т на единицу Пр = (Mах + 1) * То. К примеру, если Т увеличивается на 1 каждую микросекунду, а ширина Т составляет 32 бита, то период составит (2^32)*1е-6=4*(2^10)^3*1е-6 ~ 4 * 10^3^3 *1е-6 = 4 * 10^(9-6) = 4000 секунд, что составляет чуть больше часа. Если же Т увеличивается на 1 каждую миллисекунду, то период увеличится в тысячу раз и составит 4е6 секунд, то есть приблизительно 46 дней. Конечно, второе значение намного больше первого, но они оба меркнут по сравнению с вечностью.

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

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

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

Так чем же нам грозит периодичность значений Т и связанное с этим переполнение (wraparound, recount, reroll, warp) — тем, что нарушается монотонность поведения Т, то есть некоторой следующий момент времени может быть представлен числом, не большим предыдущего (если у нас Т нарастает со временем), а меньшим и, соответственно, наша формула перестанет работать, причем проявления этого будут весьма неприятными — программа будет формировать интервал времени существенно меньший, нежели ожидаемый.

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



Рассмотрим пример подобного, для краткости написания будем считать, что Т размещается в байте и максимальное значение его составит 255. Если начальный момент времени для формирования интервала С = 20, а интервал И = 08, то по нашей формуле время истечет, начиная с момента 28, что правильно, а вот в случае С = 250 уже при значении Т = 251 будет выполнено условие 251 >= (250+8) = 258 — 256 = 2, что явно не соответствует нашим ожиданиям. Происходить это будет не слишком часто, вблизи конца периода и, если Вы абсолютно уверены, что Ваше устройство никогда столько времени непрерывно не проработает, то Вы можете данной особенностью пренебречь и использовать предложенную ранее формулу для отслеживания интервалов времени, что многие авторы библиотек и делают. Я категорически против подобной практики по двум причинам — во первых, надо всегда программу делать правильно, чтобы не возникало вредных привычек, а во вторых, сделать правильно совсем несложно.

Для получение правильной (верной в любом случае) формулы надо подвергнуть исходную Т >= С + И простому преобразованию и отнять от обоих частей С, получая новое условие Т — С >= И. С точки зрения математики эти условия эквивалентны, но математика работает с идеальными числами, которые имеют бесконечную ширину, хотя она совсем не беспомощна и в случае с числами ограниченными, просто надо наложить соответствующие условия. Так вот, с учетом этих условий наша новая формула правильно работает всегда. Разумеется, она верна в случае, когда Т больше С, но она работает и когда Т меньше С и происходит это в силу замечательного свойства вычитания. Представим Т в виде

Т = С + Д, где Д — добавка по отношению к старту, причем пусть даже в процессе этого прибавления мы могли получить переполнение и тогда значение Т = С + Д — Мах < С, в любом случае наша формула превращается в

(С + Д) — С = С — С + Д = Д

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

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

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

Т >= С + И

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

П = С + И,

и формула превратится в выражение

Т >= П.

К сожалению, главный ее недостаток — ложное срабатывание при переполнении, остается в силе, но мы можем пойти испытанным путем и использовать вычитание Т — П >= 0.

К сожалению, обычная уличная магия нас подвела (факир был пьян и фокус не удался), поскольку данное условие выполняется всегда, так как разность любых двух чисел составляет число от 0 до Мах и всегда не меньше нуля. Вообще то, результат предсказуем, поскольку для двух произвольных чисел совершенно невозможно определить, какое из них предшествует другому, от слова «совсем» невозможно.

Попробуем создать дополнительный критерий и будем считать, что Т предшествует П в том случае, если (Т — П) < (П — Т). Неплохо для начала, но прямое вычисление по этой формуле потребует трех вычитаний — будем уменьшать. Прежде всего установим неоспоримый факт, что (Т — П) + (П — Т) = 0 = Мах + 1.

Из этого очевидного факта мы можем вывести, что Т — П будет больше, чем П — Т в том, и только том случае, если Т — П >= (Мах+1)/2. Поскольку второе выражение совершенно очевидно константное и будет вычислено на этапе компиляции, получившееся условие П — Т >= (Мах+1) /2 требует только двух операций вычитания, а память мы уже сократили на одну единицу хранения, но можно пойти и дальше.

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

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

if ( (long) (Т - П) < 0) ....

Итак, нам требуется помнить только одно число (П) и вычислительная сложность проверки составляет одну операцию вычитания (сравнение будет использовать ее результат и дополнительных операций не потребует), едва ли можно достигнуть лучших показателей. Чем нам пришлось заплатить за такую красоту — мы теперь не можем заказать интервал более половины максимально возможного числа, вернее, заказать можем, но он прекратится мгновенно, так что Вам решать, стоит ли выигрыш подобного ограничения. В Linux системах принят именно последний вариант, а то, что подробности скрыты за макросом — так это синтаксический сахар.

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

typedef unsigned char Timet;
Timet S = 0xF8, I = 12, T = S + I + 2;
// прости, MISRA, за предыдущую строку, я знаю, что так нельзя, но это в учебных целях
if ( (T - S) >= I) printf ( "time"); // не всегда срабатывает
register Timet D = (T - S);
if (D >= I) printf ("time"); // а вот это всегда

Мне совершенно непонятно, почему в таком виде я вижу только одно сообщение об истечении времени, а если меняю тип Timet на unsigned long, то получаю два сообщения. То есть я, конечно, лукавлю, я понимаю, почему это происходит, я не понимаю, почему было принято именно такое решение при реализации компилятора. Но, впрочем, эта проблема практически решается очень легко — включаете поддержку MISRA ( правило 10.1.b) и получаем запрет использования неудачной строки и нам придется делать все правильно, то есть надежно, нас просто заставят написать промежуточное присвоение. Причем это присвоение не стоит ничего и хороший компилятор сделает весьма эффективный код. Да, это костылик, «но ведь работает», к сожалению, другого решения просто нет.

Надо сказать, что еще более забавно выглядит следующий фрагмент кода

if ( (c = uc ) == uc) printf ( "is equal");

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

Проголосовало 14 человек. Воздержалось 8 человек.

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

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

https://habrahabr.ru/post/330094/


Метки:  

[Перевод] Как работать с отзывами в App Store (и с отрицательными тоже)

Пятница, 02 Июня 2017 г. 18:03 + в цитатник
Apple наконец-то дал девелоперам зеленый свет: с выпуском iOS 10.3 можно отвечать на пользовательские отзывы и рейтинги. Новая версия, по словам компании, исключает баги и существенно упрощает работу с фидбэком.

Кроме того, Apple представила новый API, который позволяет владельцам айфонов и айпадов оставлять отзывы и проставлять рейтинг без перенаправления в приложение Аппстора. Более того, компания ограничила ежегодное число запросов на ревью и рейтинги до трех на одно приложение — это должно успокоить пользователей, которых достали бесконечные напоминалки от App Store.

Почему отзывы и рейтинги в App Store — это важно


App Store забит приложениями, и каждая страничка вашего продукта в магазине имеет значение в этой нелегкой борьбе. Хотя Apple постоянно меняет алгоритмы поиска, отзывы и рейтинги по-прежнему сильно влияют на выдачу в поиске, конверсию приложения и эффективность рекламы.

В общем-то, наверх в рейтинге поднимаются приложения, у которых есть как минимум 4 звезды. Более того, опрос пользователей от Apptentive показал, что рост рейтинга оказывает колоссальное влияние на успех приложения.
image

Cложно переоценить значение отзывов, когда дело доходит до оценки приложения в iOS. Около 13% посетителей App Store читают как минимум семь отзывов перед установкой приложений, и этот процент вырастает до 33% в случае платных приложений.
image
Источник: mobileaction.co

Как мониторить отзывы и оценки


Разработчики приложений могут получить доступ к рейтингам в секции “Мои приложения” (My Apps) через Apple iTunes Connect. Вы не можете удалять отзывы, зато можете отвечать на них.

image
Источник: developer.apple.com

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

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

Как работать с отзывами в App Store, не удаляя их


За результативными ответами на отзывы в App Store стоит несколько базовых принципов (и удаление критических отзывов — явно не в их числе):

  • Адекватность: ваш ответ должен полностью соотноситься с содержанием отзыва и запускать процесс положительной коммуникации
  • Последовательность: ваш ответ должен быть лаконичным и четким. Хорошо бы разработать язык вашего бренда, который будет включать понятные и близкие пользователям формулировки.
  • Скорость: оперативные ответы помогают сохранять вовлечение аудитории и состоять с ней в прямом диалоге. Как только проблема, о которой сообщил пользователь, решена, вы можете попросить юзеров оценить приложение в App Store или обновить оценку в отзыве.
  • Расстановка приоритетов: лучше всего начать с самых низких рейтингов и плохих отзывов, в которых указаны технические проблемы последней версии вашего приложения. Помните, что время основного релиза — жизненно важный период для работы с фидбэком. li>
  • Признательность: положительные отзывы тоже заслуживают вашего внимания. Не забывайте благодарить пользователей за их вклад в развитие приложения.

Гайдлайны App Store


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

Если юзер сочтет ваш ответ неправомерным, он вполне может нажаловаться в службу поддержки Apple — в некоторых случаях даже есть вероятность вылететь из программы для разработчиков.

Как удалить отзыв в App Store.

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

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

Как получать отзывы


Некоторым разработчикам не нравится органические рейтинги и отзывы, и они прибегают к платным источникам. Разумеется, тысячи платформ предлагают поддельные отзывы и помогают купить рейтинг в App Store.

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

iOS девелоперам стоит исключить слово “хитрость” из своего словаря. Честность и открытость должны лежать в основе вашего бизнеса. Следовательно, вместо того, чтобы скупать отзывы и рейтинги или пытаться удалить негатив, улучшайте свое приложение и выбирайте правильное время для работы с отзывами.

image
Источник: techcrunch.com

Как понять, какой рейтинг привлекает пользователей?


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

Еще одна причина поэкспериментировать с рейтингом приложения — это то, что он влияет на TTR (tap-through rate), когда вы запускаете поисковую рекламу. Что лучше: иметь средний рейтинг или выпустить обновление и запустить кампанию с нулевым рейтингом? К сожалению, в базовой аналитике App Store нет ответа на эти вопросы.

Вы можете проверить влияние рейтинга на поведение юзеров и конверсию с помощью A/B тестирования и сравнения разных результатов. Для этих целей есть множество инструментов — например, те же SplitMetrics.

image
Источник: splitmetrics.com

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

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

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

Благодарим за возможность опубликовать перевод статьи наших друзей Splitmetrics.
Original source: habrahabr.ru (comments, light).

https://habrahabr.ru/post/330108/


[Из песочницы] 19 бесплатных утилит и 89 скриптов для мониторинга и управления базами данных

Пятница, 02 Июня 2017 г. 17:35 + в цитатник
Ты сидишь — база растёт, ты идешь — база растёт, ты спишь, ешь или делаешь ещё много всего, а база всё растёт и растёт. Кто-то очень умный сказал, что единственное, что в нашей жизни постоянно — это изменения. Главное — правильно на них реагировать. Любая нештатная ситуация с базой данных происходит именно из-за таких изменений. К сожалению, не всегда есть возможность вложиться в расшитую золотом и усыпанную драгоценными камнями в 60 карат промышленную систему мониторинга. И это заставляет прибегнуть к бесплатным или условно-бесплатным решениям. В статье я собрал 20 бесплатных утилит от компании IDERA (кстати, у них полно и промышленных решений), которые некисло могут помочь закрыть некоторые вопросы с мониторингом и управлением базами данных. Поехали!

halyava_sir.jpg

#1 SQL Check
Утилита позволяет контролировать производительность SQL сервера. Не требуется установка агента на сервере БД и инжекция специальных объектов непосредственно в саму БД.
sqlcheck-Large.png

#2 SQL Fragmentation Analyzer
Утилита помогает находить фрагментированные таблицы и предупреждает, когда нужно делать дефрагментацию.

SQL Frag v11 screenshot.png

#3 SQL XEvent Profiler
Просмотр сессий и выполняемых SQL-выражений. Из дополнительных плюшек — группировка, сортировка и экспорт событий.

Xevent Profiler Screenshot.png

#4 SQL Heat Map
Визуальное представление использования дискового пространства в разрезе всех таблиц в БД. Поможет управлять мощностями и сделать прогноз ресурсов, которые могут потребоваться в будущем. Быстро определит таблицы и индексы, которые требуют выделения дополнительного дискового пространства.

SQL heat map FT.JPG

#5 SQL Page Viewer
Удобный просмотр и управление объектами и событиями БД.

SQL page viewer screenshot.png

#6 SQL Update Statistics
Определение устаревшей статистики по таблицам и индексам, просмотр и изменения опций статистики.

SQLUpdateStatistics-Large.JPG

#7 SQL Statistics Aggregator
Агрегация статистики по IO для идентификации проблемных таблиц, корреляция дисковой активности с планами выполнения.

SQLStatsQueryWindow.PNG

#8 SQL Hekaton Memory Check
Мониторинг влияния утилизации памяти конкретными таблицами БД.

SQLHekatonMemCheck-IndexStats.PNG

#9 SQL Instance Check
Сбор данных и инвентаризация БД, проверка актуальности установленных обновлений на БД.

SQL Instance Check.png

#10 SQL BI Check
Мониторинг в реальном времени для SSAS, просмотр и аналитика потребления CPU, памяти и диска.

SQLBICheck.jpg

#11 SQL Query Store Optimizer
Повышение производительности сервиса Query Store.

SQLQueryStoreOptimizer.png

#12 MySQL Query Explorer
Мониторинг топа ресурсоёмких запросов MySQL, просмотр статистики выполнения запросов для проведения тюнинга БД.

MySQLQueryExplorer.PNG

#13 SQL Backup Status Reporter
Определение баз данных, не имеющих бэкапа, просмотр истории бэкапов.

sqlbackupstatusreporter-Large.PNG

#14 SQL Integrity Check
Умеет запускать CHECKDB для SQL базы данных по запросу.

SQL-Integrity-Check.jpg

#15 SQL Job Manager
Просмотр текущих и прошлых джобов.

sqljobmanager-Large.png

#16 PowerShell Plus
Специальное IDE для работы с PowerShell скриптами.

psplus-Large.png

#17 PowerShell Scripts for SQL Server
А вот и они! 89 скриптов для управления SQL сервером, скрипты для анализа, интеграции, отчетности.

powershellscripts-Large.JPG

#18 SQL Permissions Extractor
Умеет генерировать T-SQL скрипты для копирования разрешений пользователя.

sqlpermissionsextractor-Large.PNG

#19 SQL Column Search
Поиск и экспорт чувствительных данных (номера кредитных карт и прочие персональные данные).

SQLColumnSearch.PNG

#20 Rapid Database Extractor
Управление источниками данных для SQL и Oracle, манипуляции с объектами БД, выполнение SQL-запросов для извлечения данных.

RapidDatabaseExtractor.png

Эффективного использования!
Original source: habrahabr.ru (comments, light).

https://habrahabr.ru/post/330106/


Метки:  

В преддверии Гейзенбага: Grid Dynamics о тестировании

Пятница, 02 Июня 2017 г. 17:11 + в цитатник


Как заметить, что для компании важно тестирование? Если компания спонсирует соответствующую конференцию, а её сотрудник выступает там с докладом — значит, важно. В случае с Grid Dynamics и конференцией Гейзенбаг всё обстоит именно так, и перед конференцией мы решили задать вопросы двум сотрудникам компании:

  • Евгению Хорохорину, генеральному директору Grid Dynamics в России — о компании в целом
  • Илье korobochka Коробицыну, ведущему QA инженеру, который и выступит на конференции — непосредственно о его работе


Евгений Хорохорин


— Не все знают Grid Dynamics — расскажите вкратце, чем занимается компания?

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

Среди наших клиентов — такие компании, как Google, American Eagle, eBay, Microsoft, VMware, PayPal, Yahoo!, Macy’s.

— В каких городах расположены офисы, и насколько они большие? Головной офис у вас в Кремниевой долине — приходится ли российским сотрудникам подстраиваться под время работы в нём?

— Компания была основана в 2006 году, и сейчас у нас уже более семисот человек в шести городах мира. У нас есть офисы в Украине (Харьков и Львов) и в Польше (Краков), а самый большой по численности — в Санкт-Петербурге, там сейчас работают более 250 человек. Также есть еще один офис в России — Саратов (170 человек).

График работы выстраивается с учётом солидной разницы во времени с головным офисом и клиентами в США (-10 часов). У сотрудников максимально гибкий график. Главное для нас — результат. Офис доступен круглосуточно. Тем не менее, необходимо присутствовать на всех рабочих митингах (встречах), не забывать о деловых звонках и выполнять свои задачи в срок.

— А что конкретно с тестированием — можете ли сказать, в каких городах у вас больше людей, связанных с ним, и сколько их именно?

— Самое большое число QA инженеров у нас в Санкт-Петербурге — 54 человека. На втором месте по численности Харьков — 42 человека. Тройку лидеров замыкают Саратов и Менло Парк в США, где численность QA инженеров примерно одинаковая: 24 и 23 человека соответственно. Мы, конечно же, не планируем на этом останавливаться — наша команда в каждой локации активно растёт.

Илья Коробицын


— Чем именно вы занимаетесь в Grid Dynamics?

— Во-первых, обычная тестовая автоматизация: написание тестов к сервисам (чаще всего REST) на Java или UI-тестов на JavaScript, тут ничего необычного. Во-вторых, попадаются чуть менее обычные проекты. В-третьих, помогаю коллегам со всякими мелкими задачами, вроде советов по решению каких-то проблем («а как написать вот это одним SQL запросом», «как тут организовать Maven модули», «как лучше вот это написать на JS»), провожу код-ревью. И, наконец, занимаюсь всякими внутренними задачами, провожу собеседования и разрабатываю тесты, которые мы даём для прескрининга кандидатов.

— Слова про «менее обычные проекты» интригуют. Можно пример?

— Ну, например, недавно наш заказчик купил другую компанию, и происходил процесс интеграции. Нужно было перенести информацию о примерно 100 000 клиентов из одной CRM-системы (Client Relationship Management, всякие личные данные вроде дней рождения, имён жены и любимой собаки) в другую, причём это была не просто копия данных один к одному, а ещё происходили некоторые трансформации, фильтрация невалидных данных и прочее. Я написал тесты, которые проверяли, что в процессе переноса ничего не потерялось и не попортилось.

— Правильно ли понимаем, что вы оказываетесь на границе сразу нескольких миров: тестирования и разработки, Java и JavaScript? Каково там живётся? :)

— Да, занимаюсь тестированием, но я и разработчик не в меньшей степени. При написании тестов, например, компонентного уровня, мы интегрируемся со Spring и Hibernate из основного приложения, разбираться во всём этом приходится не хуже разработчиков. Плюс для пресловутых «необычных» задач часто приходится писать что-то новое с нуля, так как нет готовых решений, которые бы подходили конкретно сейчас.

Да и вообще я считаю, что надо хорошо разбираться во всех инструментах, с которыми приходится работать, а также постоянно изучать что-то новое — знания, даже если они не пригодятся вот прямо сразу, всё равно будут полезны. Чем шире кругозор, тем легче видеть знакомые «паттерны» (не в смысле GoF) в незнакомых областях, это сильно помогает быстро решать даже не очень знакомые задачи.

— В случае с DevOps разработчику достаётся всё больше задач администратора — а оказывается ли так, что с автоматизацией тестирования тестировщик всё чаще и чаще оказывается «разработчиком в не меньшей степени»? К чему всё идёт?

— Тестирование — это не только про обеспечение качества, но и про сокращение расходов на разработку и поддержку. Есть задачи, где автоматизация невыгодна (сложно разрабатывать и поддерживать тесты), эти условные 5-10% по прежнему проверяют вручную, и это разумно. В остальном автоматизация отлично вписывается в нынешнее видение процесса разработки: можно быстро прогнать приложение через пайплайн, и разработчик получает фидбек с некой уверенностью в своих изменениях, это помогает быстрее двигаться вперёд. Отдельный тестировщик всегда будет полезен тем, что смотрит на задачу с другой стороны и ему не мешает ментальная модель точной архитектуры приложения, которая накладывает ограничения и не даёт рассмотреть некоторые случаи.

— Ранее в другом докладе вы призывали «заглядывать внутрь» протокола JsonWire. А насколько, по-вашему, важно вообще «лезть внутрь» для автоматизатора тестирования — это резко повышает квалификацию, или просто «nice to have»?

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

К сожалению, абстракции имеют тенденцию «протекать», и чаще всего это происходит, когда что-то ломается. С одной стороны, хотелось бы про нижние слои не знать и не думать, а с другой — приходится. Вот такие дела. Заглядывание внутрь может помочь понять, какие ограничения накладываются слоями, лежащими снизу, и что там может пойти не так. Что, опять же, поможет быстро разобраться с какой-нибудь «WAT»-проблемой, когда всё выглядит так:



— В последнее всё чаще слышно про Kotlin — а в автоматизации тестирования он даёт о себе знать? Какие JVM-языки используют для тестов в Grid Dynamics?

— Пока что не особо, но мне кажется, что его час настанет. Из JVM-семейства у нас есть Groovy и даже немного Scala (для Gatling-тестов), думаю, и Kotlin найдётся место.

— Есть ли в связи с тестированием какая-то общая мысль, которую хотелось бы донести до сообщества?

— Донести хотелось бы следующее: для разных задач стоит использовать подходящие инструменты, это поможет сэкономить и силы, и время. Именно этим полезен широкий кругозор и способность разбираться в устройстве вещей: даже если не получится применить сам инструмент, можно узнать что-то полезное из того, как он работает. Именно поэтому у нас есть тесты на Java, JS, Groovy, смотря что подходит конкретному проекту.

Разумеется, не стоит впадать в крайности: если какая-то задача небольшая и одноразовая, то может быть быстрее сделать всё руками и забыть.

— К вопросу об инструментах: а есть ли какие-то, которых вам в работе не хватает, или ощущаете, что сейчас все потребности уже покрыты?

— В современной фронтенд-разработке большая часть фреймворков пришла к тому, чтобы собирать интерфейс из отдельных компонентов. Не покидает ощущение, что Page Objects для UI-тестов можно было бы генерировать автоматически из этих компонентов, но подходящего инструмента пока найти не удалось, а написать самому не дошли руки.

— Расскажите вкратце, о чём будете говорить на Гейзенбаге?

— Мой доклад будет интересен в первую очередь тем, кто будет писать UI-тесты для Angular приложений, и тем, кто писал Selenium-тесты на Java или Python, но никогда этого не делал на JavaScript. Мы рассмотрим, почему разработчики Angular решили сделать специальный фреймворк (Protractor) в помощь тестировщикам, и с какими WTF-моментами можно столкнуться, если броситься писать с его помощью тесты, не особо разбираясь в JS (благо язык простой). И в конце будет, на мой взгляд, самое интересное: мы заглянем внутрь Protractor, чтоб понять, как он делает свою магию, и попробуем её перенести в Java-тесты.
Original source: habrahabr.ru (comments, light).

https://habrahabr.ru/post/330104/


Метки:  

[Перевод] Как обучать вычислительному мышлению?

Пятница, 02 Июня 2017 г. 16:48 + в цитатник

Перевод поста Стивена Вольфрама (Stephen Wolfram) "How to Teach Computational Thinking".
Выражаю огромную благодарность Полине Сологуб за помощь в переводе и подготовке публикации



Содержание


Вычислительное будущее
Что такое вычислительное мышление?
Знакомство с Wolfram Language
А что насчет…
Основы
Куда может вписаться вычислительное мышление?
Что дети могут делать?
Во главе с детьми
Что такое вычисления и программирование?
Как все это будет происходить?


Вычислительное будущее


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

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

Я заметил одну интересную тенденцию. Выберите любую область X — от археологии до зоологии. Там либо уже есть «вычислительное X», либо скоро появится.



Посмотрите на примеры вычислений из этой статьи в Wolfram Open Cloud »

Так как же нам подготовить сегодняшних детей для этого будущего? Я уже 40 лет связан с темой вычислительного мышления, и столько же времени создаю для него технологии и применяю их. На сегодняшний день у меня есть четкое представление о том, что требуется для формирования вычислительного мышления. Вопрос заключается в том, как обучить этому детей. Думаю, что теперь у меня есть хороший ответ на него: это Wolfram Language. В Wolfram Language есть технологии, благодаря которым можно обучать вычислительному мышлению даже детей.

Я лично очень заинтересован в этом: например, доступ к Wolfram|Alpha в Интернете уже несколько лет бесплатный. А теперь, после запуска сервиса Wolfram Open Cloud, любой человек в любом месте может начать изучение вычислительного мышления с Wolfram Programming Lab с помощью Wolfram Language. Но это только начало, и дальше я буду рассказывать об интересных новых вещах, которые сейчас стали возможны.

Что такое вычислительное мышление?


Ну, во-первых, давайте попробуем определить, что мы подразумеваем под "вычислительным мышлением". Его интеллектуальное ядро состоит в систематическом формулировании чего-либо с достаточной степенью ясности (чтобы можно было объяснить компьютеру, что нужно делать). Математическое мышление связано с формулировкой чего-либо таким образом, чтобы можно было решить это математически (когда это возможно). Вычислительное мышление гораздо шире.

Но как «сказать» компьютеру что-нибудь? Нужен язык. Благодаря Wolfram Language мы можем теперь непосредственно общаться с компьютерами о том, что нас интересует. Wolfram Language основан на знаниях: он знает, какие есть города, или специи, или песни и фотографии; и он знает, как проводить с ними вычисления. И как только у нас появляется идея, которую мы можем сформулировать вычислительно, тогда мы с помощью языка можем ее выразить и (благодаря трем десятилетиям развития технологии) максимально автоматизированно реализовать.

Wolfram Language — язык программирования. Поэтому, когда вы пишете на нем, вы занимаетесь программированием. Однако это новый вид программирования. Это такой язык, в котором вы можете максимально непосредственно реализовать вычислительное мышление, а не просто шаг за шагом говорить компьютеру, какие низкоуровневые операции он должен выполнять. Это такое программирование, с помощью которого люди (в том числе дети) воплощают свои идеи.





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

Конечно, в мире необходимо некоторое количество разработчиков программного обеспечения, которые могут писать низкоуровневые программы на языках вроде C++, или Java, или JavaScript, и могут работать с деталями. Но это число очень невелико по сравнению с количеством людей, которые должны быть в состоянии думать вычислительно.

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

Семь лет назад мы выпустили Wolfram|Alpha, которую дети (и взрослые) используют для ответов на вопросы. В Wolfram|Alpha в качестве входного сигнала используется повседневный английский язык, а затем производятся сложные вычисления на Wolfram Language с последующей автоматической генерацией страниц результатов. Я думаю, что Wolfram|Alpha — это прекрасная иллюстрация того, что можно делать с помощью Wolfram Language. Правда, речь здесь идет о «быстрых» вопросах, которые могут быть выражены в нескольких словах.

А что насчет более сложных вопросов? Обычного английского языка здесь будет недостаточно Для того, чтобы достичь определенного уровня точности и получить определенные результаты, можно было бы создать очень сложный и непонятный язык. Хорошая новость в том, что есть альтернатива: Wolfram Language, который был создан для того, чтобы с его помощью можно было легко выражать сложные вещи.

Для того, чтобы начать использовать Wolfram|Alpha, не требуется никаких навыков. Но если вы хотите пойти дальше, то нужно научиться формулировать и структурировать. Другими словами, нужно научиться вычислительному мышлению. А главное заключается в том, что Wolfram Language — это язык, на котором можно сделать что-то постольку, поскольку он сумел превзойти простое программирование.

Знакомство с Wolfram Language


На что похоже первое знакомство детей с Wolfram Language? Чтобы понять, как научить вычислительному мышлению, за последние несколько лет я потратил довольно много времени на занятия Wolfram Language с детьми. Иногда я занимался с большими группами, иногда — с небольшими, а иногда просто замечал ребенка на каком-то взрослом мероприятии и в конечном проводил время с ним, а не со взрослыми. Я работал как со старшеклассниками, так и с учениками средней школы (11-14 лет).



Если я занимаюсь с одним ребенком или с небольшой группой, я всегда настаиваю на том, чтобы дети сами вводили данные. Обычно я начинаю с чего-то, что все знают. Например, мы хотим вычислить 2 + 2. Дети вводят это выражение и видят, что, да, компьютер выдает знакомый им результат:



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

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



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

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



Range — хорошая функция в том смысле, что она несложная, и при этом очень наглядная и позволяет быстро получить ощущение того, что действительно можно заставить компьютер делать то, что хочется. Функция Range хороша также и потому, что ее легко использовать для создания чего-то большого. Часто я предлагаю им попробовать применить эту функцию к [1000]. Потом обычно кто-то спрашивает, можно ли построить диапазон чисел от 1 до 10000. Я предлагаю попробовать и это.



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



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



А потом — построить график:



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



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



Можно использовать текущее изображение с камеры:



И найти все «границы» элементов на нем:



Можно также придумать с цветом кое-что посложнее:



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



Если у ребенка есть лингвистические способности, мы могли бы попытаться выбрать некоторые случайные слова:



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



Затем с помощью функции WordСloud можно сделать облако из первых букв слов и посмотреть относительную частоту их встречаемости:



Некоторые дети спрашивают: «а как насчет первых двух букв?».



Еще можно поговорить некоторое время о том, сколько слов начинается с «не-» и т.д. Можно пойти дальше и посмотреть на переводы слов:



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



Так как мы говорили о цвете, интересно посмотреть, в какой точке цветового пространства находятся флаги (например, не так уж много «розовых стран»):



Wolfram Language позволяет не просто проводить абстрактные вычисления, но вычисления, основанные на реальных знаниях. Он охватывает огромный спектр областей: от традиционных STEM-областей до искусства, истории, музыки, спорта, литературы, географии и так далее. Детям часто нравится делать что-то с картами.

Мы могли бы начать с того места, где мы находимся (функция Here). Или отталкиваться от какого-то ориентира. Вот, например, карта с окружностью радиуса 100 миль вокруг Эйфелевой башни:



Вот еще изображения:



А что насчет истории? Как может Wolfram Language взаимодействовать с этой областью? На самом деле, в Wolfram Language полно исторических знаний. О странах (
график роста и упадка Римской империи
), или кино (
сравните постеры фильмов в разные годы
), или, например, о словах.

Вот, к примеру, сравнение использования слов «лошадь» и «автомобиль» в книгах за последние 300 лет:



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

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



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



Детям всех возрастов нравится создавать интерактивный материал. Вот простой «глаз циклопа», который можно легко поэтапно построить:



Иногда с помощью Wolfram Language я создаю мелодии. Вот случайная последовательность из музыкальных нот:



Есть много интересных направлений. Для начинающего врача есть анатомия в 3D — вы можете взять геометрию кости и напечатать ее в 3D. И так далее.



А что насчет…


Я бы никогда не стал всерьез пытаться работать с детьми (хотя у меня четверо своих) до начала моих занятий вычислительным мышлением. Так что я не знал, чего ожидать. Окружающие люди постоянно напоминали мне о сложных моментах, которые могли помешать в реализации задуманного. Во-первых, они были настроены скептически по отношению к тому, что дети действительно смогут работать с исходным кодом в Wolfram Language; они думали, что те просто запутаются в синтаксисе и прочем. И вторая сложность заключалась в том, что дети, по их мнению, не будут мотивированы делать что-нибудь с кодом, если это не приведет к созданию игры, в которую можно будет поиграть.

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

Что касается ввода кода, необходимо понять одну вещь: в современном мире большинство детей среднего школьного возраста привыкло к использованию клавиатуры. Иногда, когда они начинают набирать код, им приходится сначала посмотреть, где находятся клавиши в функциях используются квадратные скобки" или "имена функций начинаются с заглавной буквы" не составляет большого труда. И, конечно, в Wolfram Language нет всех тех исключений из правил, которые существуют в естественном языке.

Я увидел, что автоматические подсказки (элементы становятся красными, если они находятся в неправильном месте, предлагаются различные автодополнения, и т.д.) очень важны для детей, набирающих код. Суть в том, что, несмотря на теоретические опасения взрослых, реальным детям, кажется, легко дается набор синтаксически правильного кода в Wolfram Language. На самом деле, я был поражен тем, как быстро многие дети «схватывают» его. Увидев лишь несколько примеров, они сразу же начинали обобщать. А главное заключается в том, что, поскольку Wolfram Language разработан очень последовательно, придуманные ими обобщения на самом деле работают. Для меня, как для создателя языка, это трогательный момент.

ОК, дети могут вводить код Wolfram Language. Но чего они хотят? Многим детям нравится играть в игры на компьютере, и взрослые часто думают, что им понравится создавать их. Однако, по моим наблюдениям, это не так. Для большинства детей самым главным в Wolfram Language является то, что они могут сразу сделать с его помощью что-то реальное. Они могут ввести код, и компьютер сразу же сделает то, что они хотят. Они могут создавать изображения, звуки или тексты. Они могут заниматься искусством. Они могут заниматься наукой. Они могут исследовать языки. Они могут анализировать покемонов (да, в Wolfram Language встроены большие данные о покемонах). И, если они действительно хотят, они могут делать игры.

Если вы спросите детей о том, что им может быть интересно в программировании, до того, как они познакомились с Wolfram Language, чаще всего ответом будет «игры». Но как только они узнают о возможностях Wolfram Language, они перестают говорить об играх и хотят делать вместо этого что-то «реальное».

Основы


Несмотря на свою тридцатилетнюю историю, Wolfram Language только недавно достиг такого уровня, при котором можно быстро и убедительно продемонстрировать детям, что представляет из себя вычислительное мышление. Важно, что это не только язык и содержащиеся в нем знания; это также окружающая среда.

Концепция документов Wolfram, которую мы изобрели почти 30 лет назад, — это хороший способ взаимодействия с языком как для детей, так и для взрослых. Документ Wolfram — это прежде всего интерактивный документ, который свободно смешивает коды, результаты, графику, текст и все остальное. Можно проводить вычисления, набирать код и получать результаты прямо в документе. Результаты могут быть динамическими с собственными автоматически сгенерированными пользовательскими интерфейсами. И записывать и читать пояснения или инструкции можно непосредственно в документе. На то, чтобы довести до ума документы, потребовалось несколько десятилетий. Зато теперь у нас есть чрезвычайно эффективная среда, в которой удобно работать и думать (и, конечно, изучать вычислительное мышление).

В течение многих лет документы и Wolfram Language были доступны только в качестве настольного программного обеспечения. Теперь они также стали доступны в облаке прямо с вашего мобильного устройства. Это значит, что любой ребенок может просто открыть браузер и сразу же начать взаимодействовать с Wolfram Language, создавая или редактируя любой документ или код.

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

Когда мы создали Wolfram|Alpha, я принял решение сделать ее бесплатной в Интернете по всему миру. И было здорово видеть, что множество людей (и особенно детей) пользуются ею ежедневно. Когда технология была готова, я решил также предоставить свободный доступ ко всему Wolfram Language в нашем Wolfram Open Cloud и настроить его таким образом, чтобы дети (и взрослые) могли бы обучаться там вычислительному мышлению.

Wolfram|Alpha настроена таким образом, что любой желающий может задавать ей вопросы на разговорном английском языке. Это хороший способ поддержки образования. Однако если вы захотите углубиться в изучение вычислительного мышления, то придется выйти за пределы привычного английского языка. И вот тут приходит на помощь Wolfram Language.

Так с чего же начать взаимодействие с Wolfram Language? Вероятно, существует много ответов на этот вопрос, которые, помимо всего прочего, зависят от особенностей окружающей среды и ресурсов, которые доступны разным детям. Хочется верить, что лично я неплохо поработал с детьми в нашем летнем лагере Wolfram для старшеклассников: я видел очень неплохие результаты, полученные благодаря личному наставничеству над каждым ребенком.

Важно также иметь решения для «самообслуживания». Мой вклад в это — книга (см. статью на Хабре), которая называется Элементарное введение в язык Wolfram Language. Это книга о вычислительном мышлении. Ее изучение не предполагает каких-либо предварительных знаний о программировании, или, например, математике. Но в процессе повествования читатели доходят до точки, где они могут писать реальные программы.

Книга доступна в Интернете бесплатно. Там также есть упражнения. Я первоначально намеревался написать книгу для средней школы и выше. Закончилось все тем, что пришло довольно много учеников средней школы (от 11 и старше), которые с энтузиазмом занимались по ней.

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

Ну хорошо. Когда ребенок открывает браузер, чтобы изучать вычислительное мышление и Wolfram Language, в каком направлении ему двигаться? Несколько месяцев назад мы запустили Wolfram Programming Lab. Бесплатная версия находится в Wolfram Open Cloud (там даже логин не нужен до тех пор, пока вам не захочется сохранить свою работу).

У Wolfram Programming Lab есть две основные ветви. Первая представляет собой набор Explorations, каждый из которых представляет собой документ с кодом, который вы можете редактировать и запускать. Затем документ предлагает варианты, куда двигаться дальше, чтобы самостоятельно заниматься исследованиями.

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

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

Вы можете использовать Wolfram Programming Lab в полном объеме как через браузер, так и через облако. Однако есть и версия для стационарных ПК, которая работает на любом стандартном компьютере. Если у вас есть Raspberry Pi, значит, у вас уже есть и настольная версия Wolfram Programming Lab, которая поставляется в комплекте прямо с операционной системой, в том числе — специальные функции для получения данных от датчиков, подключенных к Raspberry Pi.

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

Стоит отметить, что одной из важных особенностей инфраструктуры Wolfram Cloud является то, что она позволяет всем (студентам и преподавателям) публиковать результаты своих исследований в интернете.

Мы находимся еще в самом начале развития Wolfram Programming Lab и продолжаем работать над ее усовершенствованием. Некоторое время назад мне довелось разговаривать с детьми в школе в Корее, и я спросил, считают ли они, что они смогут выучить Wolfram Language. Один ребенок ответил, что единственная сложность заключается в том, чтобы читать названия функций на английском языке.

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

Куда может вписаться вычислительное мышление?


Итак, я немного рассказал о преподавании вычислительного мышления. Но как вычислительное мышление вписывается в стандартную учебную программу? Легко!

Можно подумать, что вычислительное мышление каким-то образом относится только к STEM-образованию, но это не так. Вычислительное мышление применимо ко всей учебной программе. Это и социологические исследования. И языки. И музыка. И искусство. Спорт. В каждой из этих областей есть много того, что может быть сделано с помощью вычислений и вычислительного мышления. А главное, что все это доступно для детей. Wolfram Language обеспечивает работу всех внутренних процессов, так что можно сосредоточиться на вычислительном мышлении без концентрации на них.

Одним из способов достижения этого является пересмотр того, что представляет собой «математическое» образование (что и было достигнуто в рамках инициативы Сomputer Based Math). Другой подход предполагает вставить вычислительное мышление непосредственно в любую другую область учебного плана. Я заметил, что на практике (особенно среди учителей начальных классов) те преподаватели, которые полны энтузиазма в отношении обучения вычислительному мышлению, зачастую не имеют технической подготовки. Это как с нынешним поколением детей: не нужно быть технарем, чтобы разбираться в программировании и вычислительном мышлении.

Раньше для изучения низкоуровневых компьютерных языков вроде C ++ и Java вы действительно должны были мыслить как инженер. С Wolfram Language совсем другая история. Конечно, для того, кто хочет знать язык хорошо, нужно узнавать многие вещи. Однако изучать при этом нужно общее вычислительное мышление, а не инженерные детали компьютерных систем.

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

Как это может быть? Суть в том, что вычислительное мышление представляет собой своего рода фундамент, который облегчает понимание многих явлений. Когда вы формулируете что-то вычислительно, каждый может попробовать и ясно увидеть, как это работает.

Вот история многолетней давности, когда Wolfram Language — в виде Mathematica — впервые использовался для обучения вычислениям. Очень часто студенты испытывают трудности с пониманием понятий и функций. И вот профессора сказали мне, что они стали замечать, что, когда студенты узнавали о возможности проводить вычисления посредством системы Mathematica, никого из студентов функции не смутили. А причина заключается том, что они узнали об этих функциях посредством компьютерного мышления — наблюдая их явно, а не слыша о них абстрактно, как в случае со стандартной методикой преподавания.

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

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

Вы могли бы говорить о стилях в искусстве (см. перевод на Хабре "Пропорции в искусстве. Есть ли что-то лучше золотого сечения? Исследование более 1 000 000 старых и современных картин") и использовать множество изображений известных картин, которые встроены в Wolfram Language. Тогда вы могли бы сравнить использование цветов в различных картинах, и, возможно, нарисовать график, демонстрирующий изменение цветовой палитры с течением времени и с появлением новых стилей.

Вы могли бы рассказывать об экономике разных стран, а могли бы сразу же создавать свои собственные инфографики, чтобы увидеть, как лучше всего представить важный материал. Вы могли бы говорить об истории, а могли бы использовать данные исторических карт в Wolfram Language для сравнения завоеваний Александра Македонского и Юлия Цезаря. Или вы могли бы сделать графики для каждого из президентов США с указанием состава администрации для каждого из них, и сравнить их посредством экономических или культурных показателей.

Или, к примеру, вы изучаете грамматику английского языка. Wolfram Language поможет вам в этом, автоматически составляя схемы предложений. Также вы можете позволить студентам попробовать использовать свои собственные правила для генерации предложений. А что насчет правописания? Может ли вычислительное мышление помочь в этом? Я не уверен. Можно, конечно, взять все общеупотребительные слова английского языка и поэкспериментировать с различными правилами… Это может быть интересно для обнаружения исключений (например, всегда ли «u» следует за «q»: с помощью Wolfram Language очень просто это узнать).

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

Со временем перечень подобного рода примеров будет становиться все больше и больше. В прошлом с математикой результаты были довольно разочаровывающими: работающих примеров было немного. Конечно, существуют понятия вроде экспоненциального роста, которые появляются в куче мест, но со временем каждый понимает, что примеры в книгах о вычислениях не меняются с 1700-х гг. И в случае с программированием картина не намного лучше: последовательность Фибоначчи много где можно обнаружить. Но с программированием на основе знаний в Wolfram Language картина складывается совершенно иная, поскольку язык непосредственно подключается к данным и вычислениям, которые имеют отношение к сути каждого направления.

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

Какие же нужны вложения, чтобы студенты могли заниматься вычислительным мышлением? С имеющимися на данный момент технологиями — крайне небольшие. С Wolfram|Alpha — никаких. С Explorations в Wolfram Language они близки к нулю. С помощью задания кода в свободной форме ввода в Wolfram Language для начала работы знать достаточно совсем немного.

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

Что дети могут делать?


Каждый день множество ученых и технологов используют Wolfram Language для сложных вычислений. А теперь и дети легко могут воспользоваться Wolfram Language. И я не говорю о какой-то упрощенной игрушечной версии. Я говорю о том же самом Wolfram Language, который используют профессионалы (и, да, так же, как и с английским языком, в котором есть неясные слова, которые дети обычно не используют, есть также неясные функции в Wolfram Language, которые дети также обычно не используют).

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

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

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

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

Дети тратят много усилий, чтобы в результате получить один ответ по математике или, к примеру, по химии. Если дети пишут эссе, они должны записать каждое слово. Но с вычислительным мышлением возникает другая история. После того, как ребенок понял, как сформулировать что-то и написать это на Wolfram Language, язык берет на себя построение большого и сложного результата.

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

Чему же научатся дети, описывая что-либо на языке Wolfram? В первую очередь — вычислительному мышлению. Это действительно новый способ мышления. Но у него есть определенное сходство с другими вещами, которые делают дети. Как занятия математикой, например, формируют определенную точность и ясность мышления. Это, как и письмо, принципиально творческая деятельность. Хорошо написанный код в Wolfram Language, как и хороший текст, точен и элегантен, и его легко читать и понимать. Но, в отличие от обычного текста, целевой аудиторией для него оказываются не только люди: код предназначается также для компьютеров.

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

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

Но отладка — это, в конечном счете — о понимании и решении проблем. Что действительно классно в Wolfram Language, так это мгновенная обратная связь. Вы изменили что-то: помогло? Или нужно снова углубиться в код, чтобы выяснить что-то еще?

Часть отладки состоит только в получении куска кода, необходимого для создания чего-то. Но другая часть состоит в понимании того, правильную ли вещь вы создали. К примеру, почему в пьесах Шекспира существует множество персонажей, которые, кажется, ни с кем не контактируют? Давайте разберемся, как мы определяем термин «контакт». Действительно ли это имеет смысл? Есть ли определение получше?

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


Во главе с детьми


Когда я демонстрирую детям примеры вычислительного мышления и Wolfram Language, я стараюсь выяснить, чем дети интересуются. Искусством? Или наукой? Историей? Или видеоиграми? Чем? Я стараюсь придумать пример, который лежит в сфере их интересов. А затем мы его запускаем. А в результате мы получаем какие-то изображения или визуализации. И тогда дети смотрят на полученный результат и обдумывают его, основываясь на том, что они уже знают. А потом почти всегда начинают задавать вопросы. «Каким образом это распространяется на это?»; «а как насчет сделать это вместо этого?», и т.д. И вот это действительно хорошо. Потому что, когда дети задают вопросы, вы понимаете, что они занимаются всерьез; они думают о том, что происходит.

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

Однако с помощью Wolfram Language как инструмента можно сделать много нового. Потому что с Wolfram Language учитель и не должен знать весь ответ на вопрос: он просто должен быть в состоянии сформулировать вопрос вычислительно, а Wolfram Language поможет вычислить ответ. Конечно, чтобы писать код на Wolfram Language, учителю нужно овладеть определенными навыками. Но это действительно интересно и полезно — вместе получать ответы на вопросы.

Я часто делал то, что можно назвать «живыми экспериментами». Я беру какую-то тему (либо ту, что предложила аудитория, либо ту, которая только что пришла мне в голову), — и затем я изучаю эту тему в режиме реального времени с помощью Wolfram Language, и смотрю, что я могу узнать о ней. С каждым годом это становится все проще, поскольку возможности и уровень автоматизации в Wolfram Language растут. И именно живым экспериментом мы открываем нашу летнюю школу Wolfram. В течение примерно часа мы создаем документ, который может стать заделом для статьи. Это довольно нервное занятие. Но почти всегда это хорошо работает. Большинство людей не понимает: всего за час можно с нуля сделать открытие, достойное публикации. Wolfram Language делает это возможным. Понятно, что я всю жизнь нарабатываю опыт в области вычислительного мышления и делаю открытия; однако для тех, кто обладает приличным знанием вычислительного мышления и Wolfram Language, сделать убедительный живой эксперимент окажется довольно легким делом.

Когда я был ребенком, мне никогда не нравились упражнения из учебников. Я всегда думал, что не слишком интересно делать то, что было сделано множеством людей до меня. И поэтому я всегда старался думать о различных вещах, в которых я мог бы увидеть нечто, чего прежде не видел никто. Сейчас, когда у нас есть Wolfram Language, это стало гораздо проще. Не у каждого ребенка мотивационная структура такая же, какая была у меня. Но многие люди получают удовлетворение от того, что они в состоянии сделать нечто свое, а не просто повторить многократно сделанное до них. С помощью Wolfram Cloud можно легко поделиться тем, что вы сделали, и, например, создать собственный сайт или приложение, которое можно показать — друзьям или целому миру.

Так где же есть такие открытия, которые могут быть сделаны детьми? Везде! Даже в такой хорошо развитой области, как математика, существует бесконечное поле для экспериментов, где могут быть сделаны открытия. В науке есть небольшое дополнительное препятствие: необходимость работать с фактическими данными. Конечно, много данных встроено прямо в Wolfram Language. И получить больше данных стало проще, чем когда-либо. Может быть, кто-то использует камеру или микрофон, или датчики, подключенные через Raspberry Pi или Arduino, или что угодно еще.

А как насчет гуманитарных областей? Для этого опять необходимы данные. Но, опять-таки, в Wolfram Language встроено множество изображений известных произведений искусства, текстов книг, исторической информации о странах, и так далее. И в современном мире легко найти в интернете подробные данные и импортировать их в Wolfram Language. Удивительно, насколько легко стало в наше время например искать в интернете даже малоизвестные документы многовековой давности (это очень помогло мне в моем хобби — изучении истории).

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

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

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

Когда кто-то пишет кусок кода, это, как и написание эссе, творческий акт. Но теперь вы делаете то, что должно быть передано на компьютер. Тогда имеет смысл дать компьютеру прочитать это и оценить. Это по-прежнему нетривиальная задача. Для этого требуются высокие технологии; однако, используя символьный характер Wolfram Language, а также некоторые автоматизированные доказательства и машинное обучение, можно неплохо реализовать это на практике. Например, это позволило нам разместить в Интернете автоматически генерируемые варианты упражнений из моей книги Элементарное введение.

Глядя на конечный код, написанный студентами, можно на каком-то уровне оценить, что происходит. Несмотря на то, что существует бесконечное число возможных программ, можно оценить, какие из них являются правильными, и даже определить, какие из них удовлетворяют определенным критериям эффективности. Но можно пойти гораздо дальше. Потому что в отличие от математики, где студенты обдумывают решение с помощью черновика, в кодировании каждый шаг в процессе написания программы, как правило, делается на компьютере, и каждое нажатие клавиши фиксируется. Я сам уже давно энтузиаст личной аналитики, и время от времени пишу небольшие анализы тех процессов, которые участвуют в написании и отладке программ. Однако для этого в сфере образования есть прекрасные возможности: речь идет, во-первых, о создании образовательной аналитики (для которой Wolfram Language и Wolfram Cloud идеально подходят), а затем для создания путей адаптации к реальному поведению и образовательному процессу каждого студента индивидуально.

В итоге мы хотим получить точную математическую модель каждого учащегося. И с учетом современных технологий машинного обучения, которые есть в Wolfram Language, я думаю, что у нас есть все необходимое для этого. А дальше мы запустили бы моделирование различных ситуаций: например, что произойдет, если студент сказал одно или другое (это нужно, чтобы определить, как именно объяснять материал или какое давать упражнение).

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

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

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

Я думаю, что людям может быть полезно сделать что-то «как компьютер». Это способствует пониманию того, что такое вычисления, и как этот процесс вычислений работает. Однако акцент нужно делать на обучении людей тому, что они сами будут делать. Технологии и автоматизация будут только распространяться. Нет смысла обучать людей тому, чтобы они делали работу компьютера; нужно научить их работать с компьютером в качестве инструмента.

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

Чему же именно нужно учить? Вычислительное мышление — это действительно о мышлении. Речь идет о структурировании идеи и формулировании ее таким образом, чтобы можно было потом передать ее на компьютер, который затем может делать интересные вещи.

Безусловно, есть факты и идеи, которые стоит знать. Некоторые из них касаются абстрактного процесса вычислений. Некоторые — того, как систематизировать мир вокруг нас. Как определяется цвет? Как определяются точки на Земле? Как можно представить глифы различных человеческих языков? И так далее. Несколько лет назад мы сделали плакат по истории систематического представления данных. Его содержание составило бы полноценный курс.

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

Часто речь идет об «изобретении алгоритма». Как сравнить рост Римской империи с распространением монголов? Как это правильно вычислить? Как отобразить? Можно ли сказать, вблизи полюсов Луны действительно есть большие кратеры? Каким образом можно идентифицировать кратер на картинке?

Это аналог таких вещей, которые лежат в основе развития практически во всех областях («вычислительная X»). И есть люди, которые учатся быть успешными в такого рода вещах. В рамках нашей компании многие из проблем уровня «изобрести алгоритм» решаются каждый день, — и это составляет большую часть работы над Wolfram Language и Wolfram|Alpha.

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

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

Что такое вычисления и программирование?


Про обучение написанию кода за последние годы было сказано очень много. Конечно, написание кода — это не то же самое, что вычислительное мышление. Это немного похоже на отношение набора текста к написанию эссе. Для написания эссе вам будет нужно (вручную или с помощью компьютера) как-то фиксировать текст — но не это является интеллектуальным ядром вашей деятельности. Так как же обучать написанию кода?

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

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

Но как все это соотносится с обучением «традиционному» программированию? На данный момент существует два типа обучения программированию: то, что можно было бы назвать «уровень старшей школы» и «уровень начальной школы». На сегодняшний день «версия средней школы» — это C ++ и Java. Я был несколько шокирован тем, что даже среди детей, обучающихся в школах с техническим уклоном, очень редко можно найти тех, кто хоть сколько-нибудь серьезно изучал программирование в школе.

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




Процитировано 1 раз

[Перевод] Как сделано интро на 64k

Пятница, 02 Июня 2017 г. 16:18 + в цитатник

Введение в интро


Демосцена — это о создании классных штук, которые работают в реальном времени (как бы «крутятся в вашем компьютере»). Их называют демки. Некоторые из них по-настоящему маленькие, скажем, 64k или меньше — такие называются интро. Название происходит от рекламирования или представления взломанных программ (crack intro). Итак, интро — это просто маленькая демка.

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



Бинарник под Windows: guberniya_final.zip (61.8 kB) (немного ломается на картах AMD)

Guberniya в двух словах


Это 64k интро, выпущенное на демопати Revision 2017. Некоторые цифры:

  • C++ и OpenGL, dear imgui для GUI
  • 62976 байт бинарник под Windows, упакован kkrunchy
  • в основном, рейкастинг (raymarching)
  • группа из 6 человек
    • один художник :)
  • сделано за четыре месяца
  • ~8300 строк C++, не считая кода библиотеки и пробелов
  • 4840 строк шейдеров GLSL
  • ~350 коммитов git

Разработка


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


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

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

Наша команда состояла из шести человек: cce (это я), varko, noby, branch, msqrt и goatman.

Дизайн и влияние


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

Первые визуальные идеи вращались вокруг проводов и их использования. Мне действительно нравятся работы Виктора Антонова, так что первые наброски во многом скопированы из Half-Life 2:


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


Концептуальная работа Виктора Антонова для Half-Life 2: Raising the Bar

Сходства вполне очевидны. В ландшафтных сценах я также пытался передать настроение Eldion Passageway Энтони Шимеса.

Ландшафт создан под вдохновением этого славного видео об Исландии, а также «Койяанискаци», наверное. У меня имелись большие планы насчёт истории, изображённой на раскадровке:


Эта раскадровка отличается от окончательной версии интро. Например, брутальную архитектуру вырезали. Полная раскадровка.

Если я бы делал заново, то ограничился бы просто парой фотографий, которые задают настроение. Так меньше работы и больше пространства для воображения. Но по крайней мере рисование помогло мне упорядочить мысли.

Корабль


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


Космический корабль представляет собой рейкастинг поля расстояний, как и всё остальное.

У нас был ещё один шейдер корабля, который не вошёл в интро. Сейчас я смотрю на дизайн, он очень крут, и очень жаль, что для него не нашлось места.


Дизайн космического корабля от branch. Полный размер.

Реализация


Мы начали с кодовой базы нашего старого интро Pheromone (YouTube). Там была базовая функциональность кадрирования и библиотека стандартных функций OpenGL вместе с утилитой файловой системы, которая паковала файлы из директории с данными в исполняемый файл, используя bin2h.

Рабочий процесс


Для компиляции проекта мы использовали Visual Studio 2013, потому что он не скомпилировался в VS2015. Наша замена стандартной библиотеки не очень хорошо работала с обновлённым компилятором и выдавала забавные ошибки вроде таких:


Visual Studio 2015 не ужился с нашей кодовой базой

По какой-то причине мы всё равно застряли на VS2015 как редакторе и просто скомпилировали проект, используя инструментарий платформы v120.


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

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

// Listen to CTRL+S.
if (GetAsyncKeyState(VK_CONTROL) && GetAsyncKeyState('S'))
{
    // Wait for a while to let the file system finish the file write.
    if (system_get_millis() - last_load > 200) {
        Sleep(100);
        reloadShaders();
    }
    last_load = system_get_millis();
}

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

GNU Rocket


Для анимации и постановки мы использовали Ground Control, форк GNU Rocket. Rocket — это программа для редактирования анимационных кривых, она подключается к демке через сокет TCP. Опорные кадры отправляются по запросу демки. Это очень удобно, потому что вы можете редактировать и перекомпилировать демку, не закрывая редактор и не рискуя потерять позицию синхронизации. Для окончательной версии опорные кадры экспортируются в бинарный формат. Впрочем, там есть некоторые досадные ограничения.

Инструмент





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

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

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

    imgui::Begin("Postprocessing");
    imgui::SliderFloat("Bloom blur", &postproc_bloom_blur_steps, 1, 5);
    imgui::SliderFloat("Luminance", &postproc_luminance, 0.0, 1.0, "%.3f", 1.0);
    imgui::SliderFloat("Threshold", &postproc_threshold, 0.0, 1.0, "%.3f", 3.0);
    imgui::End();

Конечный результат:


Эти ползунки было легко добавить.

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

Делаем маленькие бинарники


Главное для минимизации бинарника — выбросить стандартную библиотеку и сжать скомпилированный бинарник. В качестве базы для нашей собственной реализации библиотеки мы использовали Tiny C Runtime Library от Mike_V.

Сжатием бинарников занимается kkrunchy — инструмент, сделанный именно для этой цели. Он работает с отдельными исполняемыми файлами, так что вы можете написать свою демку на C++, Rust, Object Pascal или чём угодно ещё. Если честно, размер для нас не был особой проблемой. Мы не хранили много бинарных данных вроде изображений, так что было пространство для манёвра. Даже не пришлось удалять комментарии из шейдеров!

Плавающие запятые


Код с плавающей запятой доставил некоторую головную боль, осуществляя вызовы к функциям несуществующей стандартной библиотеки. Большинство из них удалось устранить, отключив векторизацию SSE ключом компилятора /arch:IA32 и удалив вызовы к ftol с помощью флага /QIfst, который генерирует код, не сохраняющий флаги FPU для режима усечения. Это не проблема, потому что вы можете установить режим усечения с плавающей запятой в начале своей программы с помощью такого кода от Питера Шоффхаузера:

// set rounding mode to truncate
//  from http://www.musicdsp.org/showone.php?id=246
static short control_word;
static short control_word2;

inline void SetFloatingPointRoundingToTruncate()
{
    __asm
    {
        fstcw   control_word                // store fpu control word
        mov     dx, word ptr [control_word]
        or      dx, 0x0C00                  // rounding: truncate
        mov     control_word2, dx
        fldcw   control_word2               // load modfied control word
    }
}

Можете почитать больше о подобных вещах на benshoof.org.

POW

Вызов pow по-прежнему генерирует вызов к внутренней функции __CIpow, которая не существует. Я никак не мог сам выяснить её сигнатуру, но нашёл реализацию в ntdll.dll из Wine — стало ясно, что она ожидает в регистрах два числа двойной точности. После этого стало возможным сделать враппер, который вызывает нашу собственную реализацию pow:

double __cdecl _CIpow(void) {
    // Load the values from registers to local variables.
    double b, p;
    __asm {
        fstp qword ptr p
        fstp qword ptr b
    }

    // Implementation: http://www.mindspring.com/~pfilandr/C/fs_math/fs_math.c
    return fs_pow(b, p);
}

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

WinAPI


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


Обратите внимание, что в последнем примере мы загружаем указатели функций только для тех функций OpenGL, которые реально используются в деле. Хорошей идеей может быть автоматизировать это. К функциям нужно обращаться вместе со строковыми идентификаторами, которые хранятся в исполняемом файле, так что чем меньше функций загружается — тем больше экономия места. Опция Whole Program Optimization может убрать все неиспользуемые строковые литералы, но мы не будем её использовать из-за проблемы с memcpy.

Техники рендеринга


Рендеринг производится, в основном, методом рейкастинга, и для удобства мы использовали библиотеку hg_sdf. Иньиго Куилез (с этого момента именуемый просто iq) многое написал об этой и многих других техниках. Если вы когда-нибудь посещали ShaderToy, то должны быть знакомы с этим.

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

Шейдинг


Мы применили стандартный шейдинг Unreal Engine 4 (вот большой pdf с описанием) с капелькой GGX. Это не очень заметно, но имеет значение в основным моментах. С самого начала мы планировали сделать одинаковое освещение как для рейкастинга, так и для растеризированных форм. Идея была в использовании отложенного рендеринга и теневых карт, но это совершенно не получилось.


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

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

Местность


Рейкастинг местности производился численным шумом с аналитическими производными.1 Конечно, сгенерированные деривативы использовались для наложения теней, но также для управления шагом лучей для ускорения обхода лучами плавных контуров, как в примерах iq. Если хотите узнать больше, то читайте старую статью об этой технике или поиграйтесь с классной сценой тропического леса на ShaderToy. Карта высот ландшафта стала более реалистичной, когда msqrt реализовал экспоненциально распределённый шум.


Первые тесты моей собственной реализации численного шума.


Реализация местности от branch, которую решили не использовать. Не помню почему. Полный размер.

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


Рендеринг ландшафта улучшенными итерациями с фиксированной запятой (слева) по сравнению с обычным рейкастингом (справа). Обратите внимание на неприятные артефакты ряби на картинке справа.

Небо генерируется практически такими же техниками, как описано в behind elevated от iq, слайд 43. Несколько простых функций вектора направления луча. Солнце выдаёт довольно большие значения в кадровый буфер (выше 100), так что это тоже добавляет некоторой цветовой естественности.

Сцена с переулком


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


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


Добавлено немного тумана с экспоненциальным изменением расстояния. Полный размер.


Провода делают сцену более интересной и реалистичной. Полный размер.


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


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

Моделирование с полями расстояний


Бомбардироващики B-52 — хороший пример моделирования со знаковыми полями расстояний. Они были гораздо проще на этапе разработки, но мы довели их к финальному релизу. Издали выглядят довольно убедительно:


Бомбардировщики нормально выглядят на расстоянии. Полная версия.

Однако это просто кучка капсул. По общему признанию, было бы легче просто смоделировать их в каком-нибудь 3D-пакете, но у нас под рукой не было какого-нибудь инструмента для редактирования полигональных сеток, так что мы выбрали более быстрый способ. Просто для справки, вот как выглядит шейдер поля расстояния: bomber_sdf.glsl.


Однако они на самом деле очень простые. Полный размер.

Персонажи



Первые четыре кадра анимации козла.

Анимированные персонажи — это просто упакованные 1-битные растровые изображения. При воспроизведении кадры плавно переходят от одного к другому. Материал предоставил таинственный goatman.


Козопас со своими друзьями.

Пост-обработка


Эффекты пост-обработки написал varko. Система следующая:

  1. Наложить тени из G-буфера.
  2. Вычислить глубину резкости.
  3. Извлечь светлые части для цветности.
  4. Выполнить N отдельных операций гауссовского размытия.
  5. Вычислить блики фальшивого объектива и блики прожекторов.
  6. Составить всё вместе.
  7. Сделать плавные контуры с помощью FXAA (спасибо, mudlord).
  8. Цветовая коррекция.
  9. Гамма-коррекция и лёгкая зернистость.

Блики объектива во многом следуют технике, описанной Джоном Чэпмэном. С ними иногда было тяжело работать, но конечный результат доставляет.


Мы попытались эстетично использовать эффект глубины резкости. Полный размер.

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




Эффект глубины резкости в действии. На красной картинке показан рассчитанный кружок резкости для пятна DOF.

Цветовая коррекция


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

vec3 cl = getFinalColor();

if (u_GradeId == 1) {
    cl.gb *= UV.y * 0.7;
    cl = pow(cl, vec3(1.1));
} else if (u_GradeId == 2) {
    cl.gb *= UV.y * 0.6;
    cl.g = 0.0+0.6*smoothstep(-0.05,0.9,cl.g*2.0);
    cl = 0.005+pow(cl, vec3(1.2))*1.5;
} /* etc.. */

Он очень простой, но работает достаточно хорошо.

Физическое моделирование


В демке есть две моделируемые системы: провода и стая птиц. Их тоже написал varko.

Провода



Провода добавляют сцене реалистичности. Полный размер.

Провода рассматриваются как ряд пружин. Их моделируют на GPU с использованием вычислительных шейдеров. Мы делаем эту симуляцию во много маленьких шажков из-за нестабильности метода численного интегрирования Верле, который здесь используем. Вычислительный шейдер выдаёт также геометрию провода (ряд треугольных призм) в буфер вершин. К сожалению, по какой-то причине симуляция не работает на картах AMD.

Стая птиц





Птицы дают ощущение масштаба.

Модель стаи состоит из 512 птиц, где первые 128 считаются лидерами. Лидеры двигаются по шаблону вихревого шума, а остальные следуют за ними. Думаю, что в реальной жизни птицы следуют за движениями ближайших соседей, но и такое упрощение выглядит достаточно хорошо. Стая рендерилась как GL_POINTs, у которых модулировался размер, чтобы создать впечатление взмахов крыльев. Я думаю, такая техника рендеринга также использовалась в Half-Life 2.

Музыка


Обычно музыку для 64k интро делают с помощью VST-плагина: так музыканты могут использовать свои привычные инструменты для сочинения музыки. Классический пример такого подхода — V2 Synthesizer от farbrausch.

Это было проблемой. Я не хотел использовать какой-то готовый синтезатор, но из предыдущих неудачных экспериментов мне было известно, что изготовление собственного виртуального инструмента потребует много работы. Помню, как мне действительно понравилось настроение демки element/gesture 61%, которую сделал branch с музыкальной эмбиент-темой, подготовленной в paulstretched. Это натолкнуло меня на мысль реализовать такое в размере 4k или 64k.

Paulstretch


Paulstretch — великолепный инструмент для действительно сумасшедшего растягивания музыки. Если вы о нём не слышали, то вам определённо стоит послушать, что он может сделать из звука приветствия Windows 98. Его внутренние алгоритмы описаны в этом интервью с автором, и он к тому же open source.


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

По существу, вместе с растяжением исходного сигнала он ещё и взбалтывает его фазы в частотном пространстве, так что вместо металлических артефактов вы получаете неземное эхо. Это требует множества преобразований Фурье, и оригинальное приложение использует для этого библиотеку Kiss FFT. Я не хотел зависеть от внешней библиотеки, так что в итоге реализовал простое дискретное преобразование Фурье $O(N^2)$ на GPU. Потребовалось много времени, чтобы правильно это реализовать, но в конце концов оно стоило того. Реализация шейдера GLSL очень компактная и работает довольно быстро, несмотря на свою брутфорсовую природу.

Модуль трекера


Теперь стало возможным наматывать витки эмбиентного гудения, если в качестве исходных данных есть какой-то осмысленный звук. Так что я решил использовать проверенную и протестированную технологию: трекерную музыку. Оно во многом похожа на MIDI2, но упакована в файл вместе с сэмплами. Например, в демке kasparov от elitegroup (YouTube) используется модуль с дополнительной реверберацией. Если это работало 17 лет назад, то почему не будет сейчас?

Я использовал gm.dls — встроенный в Windows звуковой банк MIDI (опять старый трюк) и сделал песню с помощью MilkyTracker в формате модуля XM. Этот формат использовался ещё для многих демок под MS-DOS в 90-е годы.


Я использовал MilkyTracker для сочинения оригинальной песни. Окончательный файл модуля очищен от сэмплов инструментов, а вместо них поставлены параметры смещения и длин из gm.dls

Подвох с gm.dls в том, что инструменты Roland от 1996 года звучат очень архаично и некачественно. Но оказалось, что в этом нет никакой проблемы, если погрузить их в тонну ревербераций! Вот пример, в котором сначала играет короткая тестовая песня, а затем растянутая версия:




На удивление атмоферно, согласитесь? Так что да, я сделал песню, которая имитирует голливудскую музыку, и она классно получилась. Это в целом всё, что касается музыкальной стороны.

Благодарности


Спасибо varko за помощь в некоторых технических деталях этой статьи.

Дополнительные материалы





1. Вы можете вычислить аналитические производные и для градиентного шума: https://mobile.twitter.com/iquilezles/status/863692824100782080 ^

2. Первой мыслью было просто использовать MIDI вместо трекерного модуля, но не похоже, чтобы был способ простого рендеринга песни в аудиобуфер Windows. Видимо, каким-то образом такое возможно с помощью DirectMusic API, но я не смог найти как. ^
Original source: habrahabr.ru (comments, light).

https://habrahabr.ru/post/330090/


Метки:  

[Из песочницы] Поиск по дереву методом Монте-Карло и крестики-нолики

Пятница, 02 Июня 2017 г. 15:54 + в цитатник

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



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


Немного теории


Метод Монте-Карло для поиска по дереву достаточно давно применяется в играх для искусственного интеллекта. Задача алгоритма — выбрать наиболее выигрышный вариант развития событий. Дерево представляет из себя структуру, в которой помимо хода и указателей есть количество сыгранных и количество выигранных партий. На основе этих двух параметров метод выбирает следующий шаг. Следующее изображение наглядно продемонстрирует работу алгоритма:


image


Шаг 1: Выбор — Selection. На этом шаге алгоритм выбирает ход своего противника. Если такой ход существует — мы его выберем, если нет — добавим.
Шаг 2: Расширение — Expansion. К выбранному узлу с ходом противника мы добавим узел со своим ходом и с нулевыми результатами.
Шаг 3: Симуляция — Simulation. Отыграем партию от текущего состояния игрового поля до чей-либо победы. Отсюда мы возьмём только первый ход (т.е. свой ход) и результаты.
Шаг 4: Обратное распространение — Backpropagation. Результаты из симуляции мы будем распространять от текущего до корня. Ко всем родительским узлам мы добавим единицу в количество сыгранных партий, а если мы наткнёмся на узел победителя — то в такой узел мы добавим единицу в количество выигранных партий.


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


Собственно, алгоритм не такой сложный. Скорее, объёмный.


Реализация


Алгоритм я решил реализовать в качестве бота для игры Крестики-нолики. Игра простая и для примера подойдёт отлично. Но дьявол кроется в деталях...


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


Тогда был написан простейший бот, который умел только две вещи — мешать игроку и делать рандомные ходы. Для симуляции этого было более чем достаточно.


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


    // 0. add node with new move.
    bool exist = false;

    int enemyx = -1, enemyy = -1;
    this->FindNewStep ( __field, enemyx, enemyy );

    for ( MCBTreeNode * node : this->mCurrent->Nodes )
    {
        if ( node->MoveX == enemyx && node->MoveY == enemyy )
        {
            exist = true;
            this->mCurrent = node;
        }
    }

    if ( !exist )
    {
        MCBTreeNode * enemymove = new MCBTreeNode;
        enemymove->Parent = this->mCurrent;
        enemymove->MoveX = enemyx;
        enemymove->MoveY = enemyy;
        enemymove->Player = (this->mFigure == TTT_CROSS) ? TTT_CIRCLE : TTT_CROSS;
        this->mCurrent->Nodes.push_back ( enemymove );
        this->mCurrent = enemymove;
    }

Как видно, если есть такой ход противника в дереве, то мы выберем его. Если нет — добавим.


    // 1. selection
    // select node with more wins.
    MCBTreeNode * bestnode = this->mCurrent;
    for ( MCBTreeNode * node : this->mCurrent->Nodes )
    {
        if ( node->Wins > bestnode->Wins )
            bestnode = node;
    }

Здесь мы произведем выбор.


    // 2. expanding
    // create new node.
    MCBTreeNode * newnode = new MCBTreeNode;
    newnode->Parent = bestnode;
    newnode->Player = this->mFigure;
    this->mCurrent->Nodes.push_back ( newnode );

Расширим дерево.


    // 3. simulation
    // simulate game.
    TTTGame::Field field;
    for ( int y = 0; y < TTT_FIELDSIZE; y++ )
        for ( int x = 0; x < TTT_FIELDSIZE; x++ )
            field[y][x] = __field[y][x];

    Player * bot1 = new Bot ();
    bot1->SetFigure ( (this->mFigure == TTT_CROSS) ? TTT_CIRCLE : TTT_CROSS );
    Player * bot2 = new Bot ();
    bot2->SetFigure ( this->mFigure );

    Player * current = bot2;

    while ( TTTGame::IsPlayable ( field ) )
    {
        current->MakeMove ( field );

        if ( newnode->MoveX == -1 && newnode->MoveY == -1 )
            this->FindNewStep ( field, newnode->MoveX, newnode->MoveY );

        if ( current == bot1 )
            current = bot2;
        else
            current = bot1;
    }

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


    // 4. backpropagation.

    int winner = TTTGame::CheckWin ( field );

    MCBTreeNode * currentnode = newnode;
    while ( currentnode != nullptr )
    {
        currentnode->Attempts++;

        if ( currentnode->Player == winner )
            currentnode->Wins++;

        currentnode = currentnode->Parent;
    }

И последнее: получим результат и распространим его вверх по дереву.


    // make move...
    this->mCurrent = newnode;
    TTTGame::MakeMove ( __field, this->mFigure, mCurrent->MoveX, mCurrent->MoveY );

И в конце мы просто делаем ход и текущим узлом ставим наш новый узел из второго шага.


Заключение


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


Полный код доступен на моём GitHub.


Всем добра.

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

https://habrahabr.ru/post/330092/


Метки:  

All Flash Isilon NAS: масштабируемое хранилище для неструктурированных данных

Пятница, 02 Июня 2017 г. 15:40 + в цитатник
Еще недавно потенциал ИТ-инфраструктуры сдерживался зависимостью от механических жестких дисков. Но с появлением флеш-памяти у компаний возникла возможность повысить скорость обработки данных и усовершенствовать способ их хранения.
Флеш-память быстрее жесткого диска, но масштаб ее влияния на экосистему ЦОД еще шире. Благодаря высокой скорости она сокращает время, в течение которого другие элементы экосистемы ожидают ответа от хранилища. Это повышает эффективность работы приложений, серверов и сети передачи данных.

По мнению аналитиков Enterprise Strategy Group, увеличение эффективности работы при той же производительности снижает расходы на ряд компонентов ИТ-экосистемы — серверное оборудование и лицензии на ПО, а также сокращает общую стоимость владения и обслуживания центра обработки данных.

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


В 2016 году флеш-накопители сравнялись по соотношению цена/емкость с 15K HDD корпоративного класса.

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

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

Сегодня тема использования флеш-накопителей в центрах обработки данных — №1 в отрасли. Во-первых, специалисты отмечают тенденцию к постепенной замене традиционных вращающихся дисков (HDD) на твердотельные накопители (SSD). Это помогает компаниям повысить надежность систем хранения и снизить затраты на разных участках их обслуживания. Ведь плотность записи стремительно растет: у новейшей флеш-памяти она в восемь раз выше, чем у недавно выпускавшихся накопителей. Во-вторых, взрывной рост объема данных каждые два года удваивает требования к хранилищу, и 80% этих новых данных не структурированы.

Значение производительности в работе с неструктурированными данными


Обработка неструктурированной информации с помощью бизнес-аналитики или аналитики больших данных в режиме реального времени требует производительности уровня технологии AFA (all-flash array) — массивов, целиком построенных на флеш-памяти. Такие СХД разрабатываются специально под потребности неструктурированных данных.

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

Последний опрос ESG ИТ-руководителей, ответственных за сохранность данных в компаниях, показал, что 49% опрошенных уже используют твердотельную технологию, еще 20% ожидают развертывания флеш-систем в ближайшие 12 месяцев. Большинство респондентов подтвердили, что в результате использования систем на флеш-памяти компании получили эффективную ИТ-экосистему и снизили затраты на эксплуатацию. Другие плюсы твердотельных накопителей, согласно опросу, — повышение эффективности использования ресурсов, сокращение операционных расходов и снижение стоимости владения.
 

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

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

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

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

Флеш-технологии — хороший старт для цифровой трансформации


Для быстрой работы с неструктурированными данными и файловым контентом компания Dell EMC разработала All Flash Isilon — современную и недорогую сетевую систему хранения высокой плотности корпоративного класса с возможностями горизонтально-масштабируемого (scale-out) хранения файлов.


Система хранения данных All Flash Isilon использует возможности дешевеющих флеш-накопителей. Архитектура системы нацелена на функциональность корпоративного класса и масштабирование файловой системы. Это обеспечивает высокопроизводительный доступ к большим объемам данных.

Dell EMC — лидер на рынке хранения флеш-массивов, а Isilon — ведущая масштабируемая NAS. Новая разработка Dell EMC All Flash Isilon для хранения данных с высокой масштабируемостью сочетает в себе преимущества цены/производительности флеш-технологий с эффективностью, гибкостью и отказоустойчивостью ОС Isilon OneFS. Система Isilon All-Flash будет доступна для заказа в 2017 году.


Dell EMC — лидер на мировом рынке флеш-массивов. Источник: IDC.

Операционная система Isilon OneFS стала восьмым поколением программного обеспечения и насчитывает более 7 тыс. инсталляций. Сфера ее применения — аналитика, совместная работа с файлами, резервное копирование и архивирование. За счет модульной архитектуры Isilon динамически масштабируется с 16 до 68 Пбайт путем добавления узлов кластера.

Isilon All-Flash Scale-Out NAS с ОС Isilon OneFS


Система хранения Isilon All-Flash Scale-Out NAS нацелена на то, чтобы использовать флеш-память для всех критических неструктурированных данных и рабочих нагрузок. Флеш-массив позволяет достичь экстремальных характеристик. К сожалению, большинство подобных решений ориентированы на поддержку приложений с блочным доступом, но блочные данные сегодня составляют лишь 20% объема данных большинства компаний.


Эффективность высокопроизводительной и масштабируемой системы хранения корпоративного класса Dell EMC All Flash Isilon достигается за счет сочетания бездискового шасси высокой плотности с надежной и гибкой операционной системой Isilon OneFS.

Ряд производителей уже вывели на рынок флеш-массивы NAS. Но эти ранние версии продуктов не обладают средствами корпоративного класса, возможностями защиты данных, безопасности и эффективного управления. Это выгодно отличает решение EMC All Flash Isilon от аналогов — в нем все эти важные моменты учтены и реализованы.


Dell EMC All Flash Isilon сделает переход к бездисковым ЦОД реальным.

Сильная сторона и уникальность All Flash Isilon не в аппаратном, а в программном обеспечении. Решение работает на базе операционной системы Isilon OneFS, которая применяется на других платформах Isilon и используется в тысячах компаниях по всему миру. Современное восьмое поколение Isilon OneFS с его безграничными возможностями корпоративного уровня считается первой в мире масштабируемой платформой хранения NAS.

All Flash Isilon сочетает высокую производительность флеш-памяти с масштабируемостью и другими средствами корпоративного уровня:

  • Производительность: для поддержки самых сложных неструктурированных рабочих нагрузок All Flash Isilon обеспечивает до 250 000 IOPS (операций ввода-вывода в секунду) и пропускную способность 15 Гбайт/с на шасси, а общая производительность кластера составляет до 25 М IOPS и 1,5 Тбайт/с.

  • Масштабируемость: с All Flash Isilon можно увеличить емкость хранилища с 92 до 924 Тбайт в одном шасси 4U и до 92,4 Пбайт в одном кластере Isilon.

  • Операционная гибкость: решение работает под управлением операционной системы Isilon OneFS с поддержкой нескольких протоколов (включая NFS, SMB, FTP, HDFS, REST, SWIFT и HTTP). Это дает возможность на одной платформе поддерживать широкий спектр приложений и типов нагрузок.

  • Защита корпоративных данных: All Flash Isilon обеспечивает целостность неструктурированных данных и высокую доступность с резервированием до N + 4, а также резервное копирование и аварийное восстановление корпоративного уровня.

  • Безопасность: Варианты обеспечения безопасности включают управление доступом на основе ролей (RBAC), зоны безопасного доступа, защиту данных WORM согласно SEC, аудит файловой системы и шифрование данных.

  • Эффективность: Для All Flash Isilon характерна низкая совокупная стоимость хранения данных. Коэффициент использования хранилища может превышать 80%, а дедупликация SmartDedupe может увеличить эффективную емкость еще на 30%.

All Flash Isilon – это:

 
• 924 Tбайт флеш-памяти в шасси 4U;
• масштабируемость до более чем 92 Пбайт (100 шасси) с единой файловой системой;
• многопротокольная поддержка (NFS, SMB, HDFS, SWIFT, FTP, HTTP, NDMP);
• SmartPools и CloudPools: автоматическая миграция данных по уровням хранения, включая облако;
• управление данными: дедупликация, квотирование, SmartConnect, InsightIQ;
• защита данных: от N+1 до N+4 ECC, зеркалирование, снапшоты, репликация;
• безопасность: WORM, аудит, шифрование, зоны доступа, ролевая аутентификация.


С помощью ПО InsightIQ видны все изменения в среде хранения.

В едином семействе


Преимущество Dell EMC All Flash Isilon в том, что система построена на базе нового сверхплотного шасси с флеш-накопителями и масштабируемой файловой системы Isilon OneFS. Это совместимое расширение целого семейства продуктов, а не изолированная система хранения или еще один «островок данных».


Семейство продуктов Dell EMC Isilon (гибридных и флеш-массивов) с разными показателями емкости и производительности позволяет подобрать решение для любой задачи.

Преимущества решения:

  • Флеш-массив с полной функциональностью OneFS: при обслуживании и защите контента первостепенное значение имеют возможности корпоративного уровня. В All Flash Isilon реализованы те же функции OneFS, которые есть в дисковых массивах Isilon — поддержка нескольких протоколов, шифрование и безопасность, автоматическая миграция между уровнями хранения и облаком, полный набор функций отказоустойчивости.

  • Переход на флеш-память, когда это необходимо: All Flash Isilon с операционной системой Isilon OneFS можно объединять в пул хранения данных с существующими кластерами Isilon для создания гибридного решения. Гибкость развертывания позволяет переходить на флеш-накопители тогда, когда в этом есть потребность, но нет необходимости полностью заменять существующую инфраструктуру хранения. Это избавляет компанию от сложной и затратной миграции файлового хранилища большой емкости.

  • Высокая плотность с гранулярной масштабируемостью: Для All Flash Isilon характерна высокая плотность — 924 Тбайт флеш-памяти в шасси 4U. Архитектура All Flash Isilon поддерживает масштабирование системы с меньшим шагом — до 24 Тбайт на каждый узел: так емкость наращивается постепенно, что сокращает единовременные инвестиции.

Преимущество All Flash Isilon в опции автоматического копирования данных на подходящие по стоимости ресурсы хранения. С помощью ПО Isilon SmartPools и CloudPools решение использует автоматизированное многоуровневое хранение данных. Это делает возможной простую миграцию данных на более дешевые уровни, включая облачное хранилище, как только они становятся менее ценными. Компании это дает экономию на капитальных затратах и оптимизацию ресурсов хранения. Опция автоматического копирования данных освобождает место в хранилище All Flash Isilon для самых требовательных приложений.

В любой момент Isilon может быть расширена сервисами передачи данных и продуктами сторонних поставщиков ПО (ISV). Это расширит ее возможности и увеличит сферу применения от активного архивирования до аналитики больших данных и хранения записей систем видеонаблюдения.

Для разных задач и потребностей разработаны разные модели NAS-платформы Isilon: для интенсивных транзакционных нагрузок; экономичная; с высокой плотностью или исключительно программная. Но все они отвечают конкретным требованиям разных нагрузок к производительности и емкости СХД.

Последняя версия OneFS поддерживает CloudPools для хранения данных в облаке, программное обеспечение IsilonSD Edge и обновление системы без ее остановки.

Оценка аналитиков


Аналитики отдают Isilon звание лидера рынка масштабируемых файловых систем по нескольким причинам. Эксперты высоко оценили стабильность продукта, высокую эффективность работы с данными, простоту управления и мобильность данных, а также высокую удовлетворенность компаний, внедривших решение. Согласно оценке Gartner, Isilon — это зрелая, масштабируемая NAS-платформа, готовая к использованию во многих отраслях бизнеса.

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

В Gartner уверены, что пользователи, работающие с неструктурированными данными, оценят широкий спектр продуктов Dell EMC, активную ценовую политику, новые модели развертывания и использования СХД. В числе преимуществ названы возможность покупки исключительно программной версии системы, лизинг, подписка и оплата за фактически задействованные ресурсы.

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

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

Заключение


Сегодня скорость генерирования, анализа и обмена данными стала ключевым показателем конкурентоспособности предприятия. Чтобы отвечать требованию времени, им нужен оперативный высокопроизводительный доступ к данным. И задачи бизнес-аналитики — лишь один из примеров. Эксперты прогнозируют, что быстрый анализ генетической информации в здравоохранении способен спасти жизни людей и снизить расходы на охрану здоровья без потери качества услуг. В перспективе компании в индустрии медиа и развлечений увеличат разрешения видео и фото до 8K и 16K. В САПР высокопроизводительный доступ к цифровому контенту ускорит разработку продуктов. Качественный рывок в скорости обработки и способе хранения данных стал возможен благодаря технологии флеш-систем. Dell EMC предлагает ИТ-подразделениям компаний повысить конкурентоспособность и осуществить этот переход уже сегодня на выгодных условиях, без больших затрат и рисков.
Original source: habrahabr.ru (comments, light).

https://habrahabr.ru/post/330088/


Метки:  

Удалённая работа в цифрах и диаграммах

Пятница, 02 Июня 2017 г. 15:37 + в цитатник
image

На «Моём круге» ежемесячно размещается 35% вакансий, предлагающих удалённую работу в сфере ИТ. При этом, если изучить базу резюме сервиса, то увидим, что к удалённой работе готовы 67% специалистов. Налицо явный разрыв между спросом работодателей на удалённую работу и предложением со стороны соискателей на неё. Как следствие, откликов на вакансии с удалённой работой в среднем в 3-4 раза больше, чем на вакансии с офисной работой. В условиях растущего недостатка в ИТ-специалистах очевидно, что в более выигрышном положении оказываются те работодатели, которые готовы переходить на удалённую работу.

Мы решили разобраться, что сейчас собой представляет рынок удалённой работы в России. Для этого мы провели опрос среди пользователей «Моего круга» и «Хабрахабра», собрали почти 3000 ответов, все их обработали, визуализировали и прокомментировали.

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



Сколько сейчас работают удалённо и где


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

image



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

image



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

image



Доля удалённых сотрудников по отношению к офисным чуть выше в возрасте от 30 до 40 и заметно ниже в самых взрослых возрастах. Интересно, почему в более ранних возрастах доля удалёнщиков ниже, хотя эти люди погрузились в современные технологии в более раннем возрасте, чем предыдущие поколения? Наверное, это связано с тем, что человеку по-прежнему всё же нужно пройти некоторую изначальную социализацию, получить опыт очного рабочего взаимодействия с другими.

Если смотреть по сферам деятельности, то доля удалёнщиков выше среди контентщиков, маркетологов и дизайнеров, и ниже среди эйчаров, аналитиков, тестировщиков и администраторов.

image



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

image



Три мифа об удалённой работе


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

image

image

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



Преимущества и недостатки удалённой работы


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

image



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

image



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

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

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

image



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

image



Инструменты удалённой работы


Напоследок, мы решили выяснить, с помощью каких инструментов взаимодействуют люди, работающие удалённо, получился своеобразный топ-лист.

Фаворитом дистанционного корпоративного общения по-прежнему остаётся дедушка Skype (его указали 77% опрошенных) и прадедушка Email (64%). На вторых местах такие новички как Slack (40%) и Telegram (38%). И телефон, как ни крути, по прежнему популярен (38%).

image



Среди сервисов ведения задач нет безусловных лидеров. Первые места принадлежат Jira (37% опрошенных указали этот сервис для ведения задач) и всё тому же Email (36%). Вторые места занимают Trello (24%) и Redmine (18%).

image



Как выясняется, за учётом времени с помощью специальных средств почти никто не следит: 56% сказали об этом. 21% пользуются возможностями Jira и 11% — Redmine.

image



Все диаграммы подготовлены с помощью сервиса infogr.am
Original source: habrahabr.ru (comments, light).

https://habrahabr.ru/post/330076/


Метки:  

Анонс RamblerFront& #1

Пятница, 02 Июня 2017 г. 15:25 + в цитатник


8 июня на Мансарде Rambler&Co состоится первый внешний RamblerFront& meetup, на котором наши сотрудники поделятся прикладными знаниями в области frontend-разработки.

Темы докладов:

1. React Redux Adapter – Максим Чекрышов (ведущий инженер-разработчик клиентских приложений, RDS)
Максим расскажет о redux-rest-adapter — утилите, призванной облегчить работу с API в приложениях с Redux data flow.

2. Счетчик — это легко – Алексей Мелик-Заде (руководитель группы разработки интерфейсов, Рамблер/топ-100)
Речь пойдет о том, из чего состоит счетчик ТОП-100 и как мы собираем информацию о посетителях сайта. Также разберем, с какими проблемами мы столкнулись, разрабатывая инструмент для большой аудитории.

3. Разработка кросспроектной библиотеки компонент на React.js – Сергей Перескоков (руководитель группы фронтенд-разработки Платформы Rambler&Co)
Расскажем о том, как мы делали общую библиотеку компонент для сервисных вертикалей Рамблера. Речь пойдет о том, что там под капотом и как сделать так, чтобы разработчикам понравилось ей пользоваться.

4. SSP: Рефакторинг в боевых условиях – Сергей Ястребов (инженер-разработчик клиентских приложений, AdTech)
В презентации будет рассказываться об SSP — одном из проектов Рамблер Рекламные Технологии. О том, в каком состоянии этот проект был несколько месяцев назад, какие шаги по рефакторингу были сделаны за это время и что из этого получилось, какие есть планы по дальнейшему развитию проекта. Будут предоставлены справочные материалы для тех, кто хочет побольше узнать о рефакторинге, разработке, тестировании и т.д. на реальных высоконагруженных проектах.

Регистрация здесь — rambler-co-e-org.timepad.ru/event/504733

Сбор гостей в 18:30.
Начало первого доклада в 19:10.
Место проведения – Мансарда Rambler&Co, которая расположена по адресу ул. Варшавское шоссе д.9 стр.1

Приходите, будем рады пообщаться!
Original source: habrahabr.ru (comments, light).

https://habrahabr.ru/post/330086/


Метки:  

How old are you? I’m 11

Пятница, 02 Июня 2017 г. 15:21 + в цитатник
Привет, дорогие Хабрапользователи! На прошлой неделе настал тот самый день, который, к счастью, только раз в году. В прошлом раз мы рассказывали, как всё начиналось — с тех пор в истории Хабра мало чего поменялось. Поэтому в этот день хочется просто поздравить всех вас — тех, кто делает Хабр таким, какой он есть. И, конечно же, всем, кто его читает.  



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

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

Рост и вес Хабра


За этот год Хабрахабр посетили 56,7 млн уникальных пользователей; Гиктаймс — 29,4 млн. 32,8 млн посетивших Хабр пользователей были из России, 8,22 млн представляли Украину и 2,21 млн — из Белоруссии. На Гиктаймс россиян было 21,4 млн, украинцев — 3,75 млн и белорусов — 1 млн. Среди стран есть почти все страны мира, но на первых местах с перечисленными лидерами соседствуют Казахстан, Германия, США, Грузия и страны Восточной Европы. К сожалению, есть страны, из которых зашло меньше 100 человек — это Ямайка, Тонго, Сьерра-Леоне, Тринидад и Тобаго, Лихтенштейн, Кюрасао и Либерия.
 
И на Хабре, и на Гиктаймс среди российских регионов в лидерах посещений Москва и Московская область, Санкт-Петербург и Ленинградская область, Свердловская область, Новосибирская область, Краснодарский край, Нижегородская область, Самарская область, Республика Татарстан и Челябинская область. Хотя, конечно, сотни тысяч посетителей есть и из остальных субъектов РФ.
 
Почти ничего не меняется в гендерных структурах: на Хабре парней больше девушек в три раза без копеек, а на Гиктаймсе — в три раза с хвостиком. Хотя девушек, в соответствии с общим айтишным трендом, в последнее время немного приросло.

Пульс Хабра


Ниже на картинке можно увидеть динамику публикаций. Отчётливо видны новогодние праздники; в остальном пульс ровный:


 
А вот динамика комментариев:



Динамика голосования за публикации:





И, конечно же, комментирование:





Если хочется еще цифр, они у нас есть:

Всего за год пользователи разместили 11309 публикаций, из которых:

— 5610 от компаний
— 5139 от пользователей
— 560 редакционных постов
— 114 в хабах-оффтопиках

Распределение по потокам:

— Разработка: 6898
— Администрирование: 1603
— Дизайн: 348
— Управление: 1232
— Маркетинг: 423
— Разное: 804

В песочницу пользователи прислали 1641 публикацию, из которых 1349 было отклонено.

За год наши ряды пополнили 104144 пользователя. Всего Хабр сейчас — это 779628 пользователей, из которых:

— 83664 пользователей имеют «полноправный» аккаунт
— 679502 пользователя в режиме ReadOnly
— 16462 пользователей в режиме Read&Comment

Всего за год было написано 290416 комментариев, из которых:

— 255710 комментариев от «полноправных» пользователей
— 34706 от Read&Comment-пользователей (4130 комментариев было отклонено)

Компании, которые умеют рассказывать


За этот год мы приобрели новых друзей не только среди пользователей, но и среди компаний, которые с удовольствием рассказывают о своём опыте в корпоративных блогах: ГК ЛАНИТ с крутыми интеграционными историями, «Сбертех» с машинным обучением и Data Science, Программа ЕФС с захватывающими историями о своей платформе, Avito с тайнами главного хранилища объявлений, LEGO Education с умными системами для детей, Туту.ру с историями об обратной стороне сервиса, Клиника офтальмологии доктора Шиловой с честной историей о коррекции зрения, Лахта Центр со строительством высоток на питерской земле и многие другие.
 
Конечно, мы не забыли и о наших надёжных друзьях, с которыми мы вместе не первый год: Microsoft, JUG.RU Group, М.Видео, Positive Technologies, Parallels и все-все-все.
 
Мы не остались в стороне от конкурсов и событий и помогли провести «SAP Кодер — 2017»,«Продвижение» и конкурс статей  PostgreSQL. Мы сделали крутую трансляцию HighLoad++ и готовим нереально крутую с РИТ++. Мы протестировали несколько коробок устройств и несколько гигабайт софта. Мы провели три собственных семинара оффлайн и вплотную занялись изучением технического евангелизма.
 
Вы пока не знаете, а мы знаем, сколько крутых проектов впереди.

Гулять так гулять


В этом году день рождения Хабра мы отпразднуем 6 и 7 июня на конференции РИТ++, где будем рады всех видеть.
 
На РИТе у нас будет:
 
  • Прямая видеотрансляция от студии Хабрахабра из главного зала. Мы будем общаться с экспертами и вести текстовый онлайн;
  • Большой красивый стенд «Хабрахабра» и «Моего круга», где мы будем с вами общаться и играть в интересный квест;
  • Круглый стол про технический евангелизм — приходите на дискуссию 06.06 в 15:00;
  • А ещё весёлая вечеринка с тёмным властелиновым пивом и айтишной музыкой. Ну и НЛО с Бумбурумом и кальяном (но ещё согласуем)
В общем, записывайте себе в календарь: понедельник 5 июня и вторник 6 июня, с 10:00. Не забудьте включить телевизор трансляцию.
 
С днём рождения!
Original source: habrahabr.ru (comments, light).

https://habrahabr.ru/post/330084/


Метки:  

OpenTl.Server — серверная реализация мессенджера

Пятница, 02 Июня 2017 г. 15:05 + в цитатник
Добрый день, сегодня я хочу презентовать вам Проект OpenTl, который будет разработан в режиме реального времени. OpenTl.Server — это попытка создать открытый мессенджер с поддержкой шифрования между клиентами, поддерживающий открытое API мессенджера Telegram.



Разработка проекта будет разделена на 3 части:
  • OpenTl.Server. В проекте собрана вся серверная реализация менеджера. Этот стрим как раз о ней.
  • OpenTl.ClientApi. Реализация API для доступа как к мессенджеру OpenTl, так и Telegram.
  • OpenTl.Schema. Реализация контрактов между клиентом и сервером.

Логика OpenTl.Server будет поделена разделен на 2 части:
  • OpenTl.Server.Front — отвечает за подключение клиентов и маршрутизацию запросов. Используется библиотека DotNetty
  • OpenTl.Server.Back — отвечает за обработку запросов клиентов. Используется библиотека Orleans

Проект разрабатывается на dotnet core на языке C#. Поддерживается .net 4.61 (в связи с отсутствием порта библиотеки Orleans на dotnet core)

Используемые технологии и библиотеки:
  • dotnet core 1.1
  • DotNetty 0.4.5
  • Orleans 1.4.х
  • Autofac 4.6.x
  • xUnit.net 2.x
  • IDE и плагины
  • Основные IDE по настроению или Visual Studio 2017 + JetBrains Resharper, или JetBrains Rider
  • Основной редактор Visual Studio Code
  • Git клиент SmartGit

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

Этот проект подходит для тех кто интересуется языком C#, стремится познать глубины .Net и не боится сложных задач. Будет много как практики, так и теории. В проекте будет разобрана до мелочей архитектура серверных приложений.

Для того чтобы легче схватывать информацию вам понадобятся:
  • Знания C# \ .Net не менее уровня middle-разработчика
  • ООП (куда же без него)
  • Git базовое владение
  • Знание основных паттернов проектирование
  • SOLID, как минимум зачем нужен IoC

Об авторе: Виктор, 29 лет из них 8 лет занимается коммерческой разработкой ПО на платформе .Net. Работает в компании БАРС Груп в должности руководителя отдела разработки. Проживает в городе Новосибирск, Россия. Со всем проектами можете ознакомиться на GitHub.

Трансляции выходят каждую пятницу в 16-00 по МСК

Расписание:

  • 2 июня 16:00 Обзор проекта. Знакомство с архитектурой
  • 9 июня 16:00 Создание взаимосвязи между Front и Back серверами
  • 23 июня 16:00 Реализация протокола MTProto. Часть 1
  • 30 июня 16:00 Реализация протокола MTProto. Часть 2
  • 7 июля 16:00 Реализация протокола MTProto. Часть 3
  • 14 июля 16:00 Реализация аутентификации. Часть 1
  • 21 июля 16:00 Реализация аутентификации. Часть 2

~~Продолжение следует~~

Трансляции проекта и записи будут доступны здесь.
Original source: habrahabr.ru (comments, light).

https://habrahabr.ru/post/330032/


Метки:  

[Из песочницы] Переосмысливая JavaScript: break и функциональный подход

Пятница, 02 Июня 2017 г. 14:44 + в цитатник

Привет Хабр! Предлагаю вам статьи Rethinking JavaScript: Replace break by going functional.


image


В моей предыдущей статье Rethinking JavaScript: Death of the For Loop (есть перевод: Переосмысление JavaScript: Смерть for) я пытался убедить вас отказаться от for в пользу функционального подхода. И вы задали хороший вопрос "Что на счет break?".


break это GOTO циклов и его следует избегать


Нам следует отказаться от break также, как мы когда-то отказались от GOTO.


Вы можете думать, "Да ладно, Джо, ты преувеличиваешь. Как это break это GOTO?"



// плохой код. не копируй!
outer:
    for (var i in outerList) {
inner: 
        for (var j in innerList) {
            break outer;
        }
    }

Рассмотрим метки (прим. labels) для доказательства утверждения. В других языках метки работают в паре с GOTO. В JavaScript'e же метки работают вместе с break и continue, что сближает последних с GOTO.


JavaScript'вые метка, break и continue это пережиток GOTO и неструктурированного программирования


image


"Но break никому не мешает, почему бы не оставить возможность его использовать?"


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


Это может звучать нелогично, но ограничения это хорошая вещь. Запрет GOTO прекрасный тому пример. Мы также с удовольствием ограничиваем себя директивой "use strict", а иногда даже осуждаем игнорирующих её.


"Ограничения могут сделать вещи лучше. Намного лучше" — Чарльз Скалфани


Ограничения заставляют нас писать лучше.


Why Programmers Need Limits


Какие альтернативы у break?


Я не буду врать. Не существует простого и быстрого способа заменить break. Здесь нужен совершенно иной стиль программирования. Совершенно иной стиль мышления. Функциональный стиль мышления.


Хорошая новость в том, что существует много библиотек и инструментов, которые могут нам помочь, такие как Lodash, Ramda, lazy.js, рекурсия и другие.


Например, у нас есть коллекция котов и функция isKitten:


const cats = [
  { name: 'Mojo',    months: 84 },
  { name: 'Mao-Mao', months: 34 },
  { name: 'Waffles', months: 4 },
  { name: 'Pickles', months: 6 }
]
const isKitten = cat => cat.months < 7

Начнем со старого доброго цикла for. Мы проитерируем наших котов и выйдем из цикла, когда найдем первого котенка.


var firstKitten
for (var i = 0; i < cats.length; i++) {
  if (isKitten(cats[i])) {
    firstKitten = cats[i]
    break
  }
}

Сравним с аналогичным lodash вариантом


const firstKitten = _.find(cats, isKitten)

Этот был довольно простой пример, давайте попробуем что-нибудь по-серьезнее. Будем перебирать наших котов пока не найдем 5 котят.


var first5Kittens = []
// старый добрый for
for (var i = 0; i < cats.length; i++) {
  if (isKitten(cats[i])) {
    first5Kittens.push(cats[i])
    if (first5Kittens.length >= 5) {
      break
    }
  }
}

Легкий путь


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


Мы можем использовать стандартные методы массива JavaScript.


  const result = cats.filter(isKitten)
    .slice(0, 5);

Но это не очень функционально. Мы можем воспользоваться Lodash'ем.


  const result = _.take(_.filter(cats, isKitten), 5)

Это достаточно хорошее решение пока вы ищете котят в небольшой коллекции котов.


Lodash великолепен и умеет делать массу хороших вещей, но сейчас нам нужно что-то более специфичное. Тут нам поможет lazy.js. Он "Как underscore, но ленивый". Его ленивость нам и нужна.


const result = Lazy(cats)
  .filter(isKitten)
  .take(5)

Дело в том, что ленивые последовательности (которые предоставляет lazy.js) сделают ровно столько преобразований (filter, map и тд) сколько элементов вы хотите получить в конце.


Сложный путь


Библиотеки это весело, но иногда по настоящему весело сделать что-то самому!


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


Сначала обернем наш старый добрый цикл в функцию.


const get5Kittens = () => {
  const newList = []

  // старый добрый for
  for (var i = 0; i < cats.length; i++) {
    if (isKitten(cats[i])) {
      newList.push(cats[i])

      if (newList.length >= 5) {
        break
      }
    }
  }

  return newList
}

Теперь давайте обобщим функцию и вынесем всё котоспецифичное. Заменим 5 на limit, isKitten на predicate и cats на list и вынесем их в параметры функции.


const takeFirst = (limit, predicate, list) => {
  const newList = []

  for (var i = 0; i < list.length; i++) {
    if (predicate(list[i])) {
      newList.push(list[i])

      if (newList.length >= limit) {
        break
      }
    }
  }

  return newList
}

В итоге у нас получилась готовая для повторного использования функция takeFirst, которая полностью отделена от нашей кошачьей бизнес логики!


takeFirstчистая функция. Результат ее выполнения определяется только входными параметрами. Функция гарантированно вернет тот же результат получив те же параметры.


Функция до сих пор содержит противный for, так что продолжим рефакторинг. Следующим шагом переместим i и newList в параметры функции.


const takeFirst = (limit, predicate, list, i = 0, newList = []) => {
   // ...
}

Мы хотим закончить рекурсию (isDone) когда limit достигнет 0 (limit будет уменьшаться во время рекурсии) или когда закончится list.


Если мы не закончили, мы выполняем predicate. Если результат predicate истинен, мы вызываем takeFirst, уменьшаем limit и присоединяем элемент к newList.
Иначе берем следующий элемент списка.


const takeFirst = (limit, predicate, list, i = 0, newList = []) => {
  const isDone = limit <= 0 || i >= list.length
  const isMatch = isDone ? undefined : predicate(list[i])

  if (isDone) {
    return newList
  } else if (isMatch) {
    return takeFirst(limit - 1, predicate, list, i + 1, [...newList, list[i]])
  } else {
    return takeFirst(limit, predicate, list, i + 1, newList)
  }
}

Последний наш шаг замены if на тернарный оператор объяснен в моей статье Rethinking Javascript: the If Statement.


/*
 * takeFirst работает как `filter`, но поддерживает ограничение.
 *
 * @param {number} limit - Максимальное количество возвращаемых соответствий
 * @param {function} predicate - Функция соответствия, принимает item и возвращает true или false
 * @param {array} list - Список, который будет отфильтрован
 * @param {number} [i] - Индекс, с которого начать фильтрацию (по умолчанию 0)
 */
const takeFirst = (limit, predicate, list, i = 0, newList = []) => {
    const isDone = limit <= 0 || i >= list.length
    const isMatch = isDone ? undefined : predicate(list[i])

    return isDone  ? newList :
           isMatch ? takeFirst(limit - 1, predicate, list, i + 1, [...newList, list[i]])
                   : takeFirst(limit, predicate, list, i + 1, newList)
}

Теперь вызовем наш новый метод:


const first5Kittens = takeFirst(5, isKitten, cats)

Чтобы сделать takeFirst ещё полезнее мы могли бы её каррировать (прим. currying) и использовать для создания других функций. (больше о карировании в другой статье)


const first5 = takeFirst(5)
const getFirst5Kittens = first5(isKitten)
const first5Kittens = getFirst5Kittens(cats)

Итоги


Есть много хороших библиотек (например lodash, ramda, lazy.js), но будучи достаточно смелыми, мы можем воспользоваться силой рекурсии чтобы создавать собственные решения!


Я должен предупредить, что хотя takeFirst невероятно крутая, с рекурсией приходит великая сила, но также и большая ответственность. Рекурсия в мире JavaScript может быть очень опасной и легко привести к ошибке переполнения стека Maximum call stack size exceeded.


Я расскажу о рекурсии в JavaScript в следующей статьей.


Я знаю что это мелочь, но меня очень радует когда кто-то подписывается на меня на Медиуме и Твиттере @joelnet. Если же вы думаете что я дурак, скажите это мне в комментах ниже.


Связанные статьи


-> Functional JavaScript: Functional Composition For Every Day Use.
-> Rethinking JavaScript: Death of the For Loop
(есть перевод: Переосмысление JavaScript: Смерть for)
-> Rethinking JavaScript: Elliminate the switch statement for better code
-> Functional JavaScript: Resolving Promises Sequentially


Прим. переводчика: выражаю благодарность Глебу Фокину и Богдану Добровольскому в написании перевода, а также Джо Томсу, без которого перевод был бы невозможен.

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

https://habrahabr.ru/post/330082/


Метки:  

[Перевод] SystemTap в Oracle

Пятница, 02 Июня 2017 г. 14:27 + в цитатник
В этом году в рамках PG Day'17 Russia пройдет двухдневный поток докладов по Oraclе DB: Ярослав Киселев расскажет о мониторинге и диагностике производительности приложения с точки зрения Oracle DB, Николай Кудинов сделает технический ликбез о минимизации ожиданий log file sync и log file parallel write, Александр Халухин из Deutsche Bank готовит интенсивный мастер-класс о диагностике производительности Oracle Database. Полный список выступлений смотрите у нас на сайте!

Для специалистов, интересующихся коммерческими базами данных мы подготовили перевод публикаций от специалистов по базам данных из CERN. Сегодняшний материал открывает цикл из нескольких статей, посвященных трассировке и отладке производительности Oracle DB с помощью SystemTap.




Эта статья посвящена использованию SystemTap для поиска и устранения неполадок в СУБД Oracle. В частности, вы узнаете, как исследовать процессы Oracle и их функции userspace. Эти методы будут полезны и увлекательны для всех, кто заинтересован в том, чтобы заглядывать под капот технологий и повышать свою эффективность в поиске и устранении неисправностей, а также в исследованиях производительности.

Введение

Трассировка userspace — очень мощный метод, который может использоваться для дополнения доступной в Oracle информации о производительности и профилировании, таких как V$ views и файлы трассировки 'event 10046', а также для расширенной диагностики и изучения ядра Oracle. Подобные исследования уже несколько лет доступны, в основном, на Solaris с внедрением DTrace (см., например, блог Тэнела).

Инструменты динамической трассировки, которые позволяют профилировать ядро и userspace, также набирают обороты в мире Linux, благодаря недавним дополнениям к ядру. Существует несколько инструментов, предоставляющих интерфейс для сбора, агрегирования и вывода данных динамической трассировки. SystemTap является одним из наиболее развитых, но постоянно появляются новые инструменты, в том числе 2 порта DTrace. Для исследования этой темы посмотрите презентацию Брендана Грегга (Brendan Gregg) на LinuxCon 2014.

Я впервые узнал о том, что можно использовать SystemTap для трассировки userspace от Фрица Хугланда (Frits Hoogland), и был весьма впечатлен возможностями, которые открываются для расширенного поиска неисправностей, а именно, как это может помочь исследовать рабочие нагрузки Oracle с целью настройки производительности и продвинутой диагностики.

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

В документации SystemTap есть дополнительные сведения о реализации userspace probes: с ядрами Linux версии старше 3.5 (например, при использовании RHEL 7.0, OL 7.0 или OL6.5 с UEK3) SystemTap будет использовать модуль UPROBES для трассировки userspace, с более старыми ядрами SystemTap может использовать расширения ядра UTRACE, если они доступны. SystemTap в состоянии обеспечить трассировку userspace как с UTRACE, так и с UPROBES, другие инструменты динамической трассировки, по-видимому, работают только с UPROBES и, следовательно, только с более поздними версиями Linux. Как пишет Фриц в вышеупомянутой статье, вам понадобится SystemTap 2.5 и выше для трассировки userspace. На момент написания этой статьи вышел SystemTap 2.6.

Вот так можно проверить, настроены ли расширения UTRACE:

# grep CONFIG_UTRACE /boot/config-`uname -r`
CONFIG_UTRACE=y

А вот так проверяется, доступны ли UPROBES:

# grep CONFIG_UPROB /boot/config-`uname -r`
CONFIG_UPROBES=y
CONFIG_UPROBE_EVENT=y

Ниже вы найдете несколько примеров, идей и тестовый код, чтобы начать использовать трассировку userspace с помощью SystemTap в Oracle. Скрипты, обсуждаемые в данной статье, можно найти по этой ссылке.

Глубокое погружение: SystemTap читает данные интерфейса событий ожидания Oracle и таблиц X$

В этом параграфе вы узнаете, как подключить SystemTap к интерфейсу событий ожидания Oracle. Это дает возможность соединить два типа инструментария: данные, собранные с помощью SystemTap probes, и данные интерфейса событий ожидания Oracle. Таким образом мы прокладываем путь для более сложных исследований.

Основное, что нужно сделать, — создать SystemTap probe в «правильной точке» ядра Oracle и заставить ее читать необходимую нам информацию.

Как обсуждалось в предыдущей работе, посвященной DTrace и Oracle, для этой цели может быть использована функция ядра Oracle «kskthewt». Она вызывается ядром Oracle в конце каждого события ожидания, предположительно для обновления соответствующих счетчиков производительности. Нашим первым шагом является создание probe, которая запускается после того, как исполняемый файл Oracle входит в функцию kskthewt. Следующий шаг — заставить SystemTap читать информацию, которая нам нужна. Доступны регистры процессора и области памяти. Некоторые из регистров используются для передачи аргументов в функцию, как описано в соглашении x86 calling conventions. В других случаях регистры CPU могут содержать полезную информацию, «оставшуюся» после вызовов родительских функций. Чтение непосредственно из областей памяти и, в частности, из SGA открывает путь к большинству данных Oracle instrumentation.

Дополнительные факты, которые я недавно обнаружил в сотрудничестве с Фрицем Хугландом, помогающие при создании probe для функции Oracle kskthewt:
  • Когда выполнение переходит в функцию kskthewt, регистр CPU R13, оказывается, хранит указатель на структуру памяти X$KSUSE (со смещением). R12, похоже, указывает на тот же адрес большую часть времени, но бывали случаи, когда это было не так, поэтому я предпочитаю использовать R13.
  • X$KSUSE является “нижележащей” сервисной таблицей для V$SESSION и, следовательно, содержит много интересной информации. X$KSUSE выделяется в памяти как сегментированный массив в SGA, посмотрите презентацию Джулиана Дайка (Julian Dyke) о внутреннем устройстве SGA для более подробной информации по этой увлекательной теме.
  • V$SESSION.SADDR — базовый адрес данных текущей сессии в V$SESSION и X$KSUSE — может быть получен из значения R13 путем вычитания смещения. Значение смещения зависит от версии Oracle и порта, и может быть найдено «экспериментально» с помощью SystemTap или gdb (подробнее см. в каталоге скрипт: trace_oracle_events_debug.stp).
  • Поля X$KSUSE, представляющие интерес (то есть значения столбцов V$SESSION), можно найти из базового значения X$KSUSE со смещением, вычисленным с помощью запроса из X$KQFCO и X$KQFTA (см. скрипт: ksuse_find_offsets.sql).
  • Было обнаружено, что регистр RDI (который отображается в аргумент arg1 в SystemTap probe) установлен в значение метки времени. Это временная метка события ожидания — то же значение, которое можно увидеть в файле трассировки для события 10046, если оно активировано.
  • Регистр RSI (arg2 в SystemTap probes) оказывается установленным в номер события ожидания.

Если вы объедините всё это, то сможете написать скрипт SystemTap для сбора и вывода события ожидания и требуемых данных v$session. Пример такого скрипта показан на рисунке. Скрипты можно скачать здесь в виде zip-файла. Прямые ссылки: trace_oracle_events_11204.stp и trace_oracle_events_12102.stp. Эти скрипты были протестированы на версиях Oracle 11.2.0.4 на RHEL6.5 и Oracle 12.1.0.2 на OEL7, соответственно.


Рис. 1: Скрипт и пример выходных данных SystemTap probe, собирающей события ожидания и подробности V$SESSION из функций ядра Oracle и памяти SGA.

Примечание: В приведенном выше примере видно, что результат SystemTap передается в sed -f eventsname.sed. Это необходимо для преобразования номеров идентификаторов событий в строки. Файл eventsname.sed генерируется путем запуска скрипта eventsname.sql.

Агрегация и фильтрация данных событий ожидания в Systemtap

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

Один простой и впечатляющий результат вы можете легко воспроизвести: написать скрипт, фактически портирующий функциональность создания микросекундных гистограмм событий ожидания в 12c. Это может быть очень полезно при изучении коротких событий, таких как random disk reads с твердотельных устройств (SSD). С помощью настраиваемых фильтров вы можете агрегировать детали события ожидания для данного пользователя или для заданного файла, а также любого другого выбранного условия. В целом SystemTap предоставляет большую свободу и широкие возможности в разработке наших probes.

Два скрипта с примерами, которые можно скачать отсюда, прямые ссылки: histograms_oracle_events_11204.stp и histograms_oracle_events_12102.stp


Рис. 2: Скрипт и пример выходных данных SystemTap probe, вычисляющей гистограммы событий ожидания с точностью до микросекунды.

Рассмотрим альтернативный способ создания SystemTap probes для сбора, а также агрегирования и фильтрации данных о задержках событий ожидания Oracle. Для этого вам понадобится дополнительный фрагмент данных, получаемый после вызовов функций ядра Oracle: функция kews_update_wait_time вызывается непосредственно перед kskthewt, устанавливая значение регистра CPU RSI равным времени ожидания в микросекундах (регистр RSI доступен в SystemTap probes как arg2). Изучите также информацию, приведённую в предыдущей работе. Таким образом, вы можете создать probe, вычисляющую гистограммы событий независимо от версии Oracle. Пример скрипта: histograms_oracle_events_version_independent.stp.


Рис. 3: Скрипт и пример выходных данных SystemTap probe, вычисляющей гистограммы событий ожидания с точностью до микросекунды независимо от версии Oracle.

Трассировка логического ввода-вывода Oracle с помощью SystemTap userspace probes

Вы можете использовать Systemtap userspace probes в том числе и для трассировки логического ввода-вывода Oracle. В основе этой probe лежит исследование, проведенное Тэнелом Подером (Tanel Poder) (ищите скрипт qer_trace.sh, использующий DTrace), и обширная работа Александра Анохина.

Прицепившись к функции kcbgtcr ядра Oracle, мы можем получить информацию о logical reads или, скорее, cache consistent reads, как объяснил Александр Анохин; kcbgtcr = Kernel Cache Buffer Get Consistent Read, и первый аргумент вызываемой функции указывает на структуру памяти с информацией о tablespace, относительным номером файла, номером блока и номером объекта consistent read. Мы можем использовать все это для создания профилирующей probes trace_oracle_logical_io_basic.stp.

probe process("oracle").function("kcbgtcr") {
    printf("tbs#=%d, rfile=%d, block#=%d, obj#=%d\n",user_int32(u64_arg(1)), user_int32(u64_arg(1)+4) >> 22 & 0x003FFFFF, user_int32(u64_arg(1)+4) & 0x003FFFFF, user_int32(u64_arg(1)+8))
}

На основе этого вы также можете создавать probes, которые выполняют агрегации и вычисляют статистику операций logical reads, например: trace_oracle_logical_io_count.stp.


Рис. 4: Скрипт и пример выходных данных SystemTap probe для сбора и агрегации информации о логическом вводе-выводе (для операции consistent read) в Oracle.

Systemtap может интегрировать данные о событии ожидания Oracle с трассировкой OS

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

Ниже вашему вниманию предлагается пример, основанный на Oracle с использованием ASM, когда хранилище становится видимым со стороны OS как блочные устройства (asmlib в данном примере не используется). В этом случае вызовы функций ввода-вывода, осуществляемые процессами Oracle, как правило, будут представлять собой pread и pwrite для синхронных одноблочных операций ввода-вывода, io_submit и io_getevents для многоблочных и/или асинхронных операций ввода-вывода. На более низком уровне все операции ввода-вывода для блочных устройств могут отслеживаться как запросы ioblock.

Вы можете начать изучение взаимосвязи между событиями ожидания Oracle, системными вызовами ввода-вывода и блочным вводом-выводом, используя следующий скрипт: trace_oracle_iocalls_12102.stp.


Рис. 5: SystemTap probes для трассировки ввода-вывода OS и трассировки событий ожидания Oracle. Это позволяет получить объединенное представление о действиях, лежащих в основе события ввода-вывода Oracle и связанных с ними действий OS.

На рисунке 6, представленном ниже, вы можете увидеть пример трассировки ввода-вывода Oracle, где одноблочный (синхронный) ввод-вывод выполняется через вызов pread к OS. Это типичный сценарий доступа для операций случайного ввода-вывода Oracle. На стороне OS вызов pread передается в стек блочного устройства как io_block_request. В интерфейсе событий ожидания Oracle операция ввода-вывода учитывается как db file sequential read wait с указанием номера файла и номера блока (параметры p1 и p2)


Рис. 6: Oracle, выполняющий одноблочный ввод-вывод, профилируемый с использованием SystemTap probes. Это обеспечивает сквозную трассировку операции ввода-вывода: мы можем видеть детали вызова OS и соответствующие им данные события ожидания Oracle.

Интерфейс асинхронного ввода-вывода Linux часто используется Oracle для многоблочных операций ввода-вывода. Это делается, в первую очередь, из соображений производительности и может быть выполнено лишь в том случае, если допускается файловой системой (такой подход имеет место в примерах, приведенных здесь, поскольку мы используем ASM). Изучение асинхронного ввода-вывода Oracle уведет нас слишком далеко от основной темы, поэтому давайте ограничимся обсуждением некоторых основных наблюдений и примером того, как вы можете использовать SystemTap probes для дальнейшего изучения этого вопроса.

В случае с asynchronous IO ядро фактически выполняет ввод-вывод, пользовательский процесс только лишь запрашивает выполнение операции ввод-вывод и позднее запрашивает возврат требуемой информации. При исследовании асинхронного ввода-вывода вам необходимо трассировать, как минимум, два вызова: один для отправки запросов ввода-вывода (io_submit) и один для получения результатов (io_getevents). Запросы ввода-вывода затем передаются на уровень блочного ввода-вывода. На этом этапе они могут быть разделены на несколько операций меньшего размера, как показано в примерах на рисунке 7. Прочитайте также статью Мартина Баха (Martin Bach) на тему «Увеличение максимального размера ввода-вывода в Linux». Более подробные сведения о трассировке ввода-вывода Oracle можно найти в отличной работе Фрица Хугланда по профилированию Oracle с помощью gdb и его исследовании многоблочных операций ввода-вывода.


Рис. 7: Пример SytemTap probe, демонстрирующей профилирование ввода-вывода Oracle в случае multi-block read, когда Oracle решил выполнить асинхронный ввод-вывод. Запросы ввода-вывода на уровне ОС осуществляются с помощью io_submit, сбор результатов происходит с помощью io_getevents. SystemTap позволяет также увидеть, что происходит на уровне блочного устройства, когда операции ввода-вывода разбиваются на более мелкие куски с максимальным размером 512 КБ в системе, используемой для этого теста.

Настройка демонстрационного стенда и документация

Ниже вы найдете советы по настройке тестовой среды для экспериментов с методами и скриптами, рассмотренными выше:
— Скачайте и установите Oracle Virtual Box
— Скачайте OL 7.0 (or OL 6.x), например, отсюда https://edelivery.oracle.com/linux
— Также установите kernel-devel rpm

Если вы хотите использовать ОС probes в сочетании с SystemTap, загрузите и установите пакеты debuginfo и debuginfo-common для используемого вами ядра. RPM можно найти по адресу https://oss.oracle.com/ol7/debuginfo/ и https://oss.oracle.com/el6/debuginfo/ для OEL 7 и OEL 6, соответственно. Аналогичным образом установите libaio-debuginfo и libaio-devel, если хотите отслеживать вызовы ОС для асинхронного ввода-вывода.

Обратите внимание, что если вы хотите запускать probes только для функций Oracle userspace, установку пакетов kernel и libaio debuginfo можно пропустить.

Скрипты, обсуждаемые здесь, требуют systemtap 2.5 или выше. Подумайте о деинсталляции systemtap, если у вас уже стоит более старая версия.

Загрузите последнюю версию systemtap по адресу https://sourceware.org/systemtap/ftp/releases/ (версия 2.6 на момент написания этой статьи).

Чтобы установить SystemTap из загруженного исходного кода, запустите:

./configure
# вывод configure укажет, требуются ли дополнительные пакеты ОС; в этом случае, то установите их и повторите операцию
make
make install

В качестве проверки после инсталляции запустите:

stap --help

Хорошим началом для изучения документации SystemTap является руководство для начинающих, а также справочник по языку и tapset reference manual.

Скачайте и установите Oracle версии 12.1.0.2 или 11.2.0.4.

Программное обеспечение можно скачать здесь: https://edelivery.oracle.com/

Предустановленные виртуальные машины с базой данных Oracle можно скачать с OTN (например, по этой ссылке)

Руководства по установке, помимо документации Oracle, также доступны по адресу http://www.oracle-base.com/articles/12c/articles-12c.php и в вики-книге racattack.

Заключение

Динамическая трассировка делает доступными probes уровня userspace в ядре Oracle и Linux probes на уровне ядра ОС, которые могут быть использованы для дополнения информации о производительности Oracle (в частности, данных, поступающих от интерфейса событий ожидания и счетчиков статистики). Эти методы могут в значительной степени увеличить объем данных, доступный при изучении проблем производительности и диагностике неполадок, а, следовательно, помогают специалисту использовать системные подходы к решению проблем и оставаться в целом более успешным и последовательным в своих действиях.

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

Благодарности

Я хочу поблагодарить трех авторов, чьи оригинальные идеи вдохновили меня на написание этого материала: Брендана Грегга (Brendan Gregg), Тэнела Подера (Tanel Poder) и Фрица Хугланда (Frits Hoogland). Дополнительная благодарность Фрицу Хугланду за проверку этой статьи.



Надеемся, что этот выпуск оказался для вас полезным. В следующей части мы углубимся в тонкости трассировки logical и physical I/O Oracle, используя возможности SystemTap.
Original source: habrahabr.ru (comments, light).

https://habrahabr.ru/post/330024/


Метки:  

Поиск сообщений в rss_rss_hh_new
Страницы: 1437 ... 990 989 [988] 987 986 ..
.. 1 Календарь