Перевод поста Стивена Вольфрама (Stephen Wolfram) "Instant Apps for the Apple Watch with the Wolfram Language".
Выражаю огромную благодарность Кириллу Гузенко за помощь в переводе.


Моя цель — с помощью Wolfram Language вывести программирование на новый уровень. И за прошлый год (см. статью на Хабрахабре "Стивен Вольфрам: Рубежи вычислительного мышления (отчёт с фестиваля SXSW)") мы расширили способы использования и развёртывания языка — на рабочем компьютере, в облаке, мобильных и встраиваемых платформах и т. д. А что по поводу носимых гаджетов? И, в частности, насчет Apple Watch? Несколько дней назад я решил посмотреть, что тут можно сделать. Так что я освободил свой день под это дело и начал писать код.

Идея заключалась в написании кода с помощью Wolfram Programming Cloud, но вместо создания веб-приложения или web API мне нужно было получить приложение для Apple Watch. И, что достаточно удобно — первая, предварительная, версия нашего Wolfram Cloud app теперь доступна в App Store:



Оно позволяет выгружать приложения из Wolfram Cloud сразу на iPhone, iPad и Apple Watch.



В каком-то смысле это было программирование с приключениями. Apple Watch только выходили, а Wolfram Cloud app было ещё лишь предварительной версией. Однако последние почти 30 лет я создавал продвинутую среду разработки Wolfram Language. И я рад отметить тот факт, что Вам не потребуется много времени, чтобы начать получать интересные приложения на Wolfram Language, работающие на Apple Watch. И менее чем за день работы — с помощью небольшой команды — я разработал 25 приложений, совместимых с часами:



Все эти приложения я создал, пройдя несколько шагов — сначала программируя их в Wolfram Programming Cloud (на веб-сайте, либо в desktop версии), затем развертывая в Wolfram Cloud и подключаясь к Apple Watch через Wolfram Cloud app. И, хотя приложения были спроектированы для Apple Watch, Вы, фактически, также можете использовать их через браузер или на телефоне. Есть ссылки на веб-версии приложений, которые представлены в данном посте. Чтобы получить эти приложения на Ваш телефон или часы, просто перейдите на эту страницу и следуйте инструкциям.



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

Мое первое приложение для Apple Watch


Так как всё это работает? Для первого раза работы с Apple Watch я решил написать простое тестовое приложение, которое выдаёт одно случайное число. Основной код на Wolfram Language для этой задачи весьма прост:

In[1]:= RandomInteger[1000]

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

In[2]:= Style[RandomInteger[1000], Bold, 30, RandomColor[]]

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

In[3]:= CloudDeploy[Delayed[Style[RandomInteger[1000], Bold, 250, RandomColor[]], "PNG"], Permissions -> "Public"]

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

Как же всё это отправить в Apple Watch? Во-первых, всё это должно попасть сперва на iPhone. И это легко. Потому что всё, что Вы выгрузили в Wolfram Cloud, полностью доступно на iPhone через Wolfram Cloud app. Чтобы это приложение можно было легко найти, стоит добавить иконку и имя. И если в конечном итоге всё это будет работать на часах, то стоит разместить это на черном фоне:

In[4]:= CloudDeploy[Delayed[ExpressionCell[Style[RandomInteger[1000], Bold, 250, RandomColor[]], Background -> Black], "PNG"], "WatchApps/RandomNumber", IconRules -> WordCloud[RandomInteger[10, 20]]]

А сейчас, если Вы перейдёте по этой ссылке через браузер, Вы увидите там открытую версию приложения. Внутри Wolfram Cloud app на iPhone приложение появляется в папке WatchApps:

Deploy that RandomNumber app, and it will appear on your phone

Теперь, если нажать на иконку приложения, у Вас будет запускаться код Wolfram Language в Wolfram Cloud и снова будет выдано случайное число, отображаемое на телефоне:

The RandomNumber app works fine on the phone, but of course is sized for the Apple Watch screen

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

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

That's all it takes to get the app onto your watch

Теперь просто кликните RandomNumber app. При этом в Wolfram Cloud запустится код Wolfram Language, а после отобразится случайное число на часах:

And here it is running on the watch--it's that easy

Случайные приложения


С Wolfram Language очень просто создавать всякие «случайные» приложения. Вот ключевая часть приложения по подбрасыванию монетки Coin Flip app:

In[5]:= RandomChoice[{image:heads, image:tails}]

Это всё, что нужно для развертывания приложения в интернете, на мобильных устройствах и часах:

In[6]:= CloudDeploy[Delayed[ExpressionCell[RandomChoice[{image:heads, image:tails}], Background -> Black], "PNG"], "WatchApps/CoinFlip", IconRules -> image:heads]

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

Как насчёт игры в камень-ножницы-бумага со своими часами? Основной код для этой задачи опять довольно простой:

In[7]:= RandomChoice[{image:rock, image:paper, image:scissors}]

Существует огромное количество знаний, встроенных в Wolfram Language — и где-то в дальнем углу есть знания, позволяющее очень просто создать приложение с выводом случайных покемонов Random Pokemon app:

In[8]:= EntityValue[EntityValue["Pokemon", "RandomEntity"], {"Image", "Name"}]

Вот как оно работает на часах:

Stats pop quiz: How many random displays will it take, on average, before you catch 'em all?

Давайте теперь попробуем что-то с более сложным кодом Wolfram Language. Вот, к примеру, изобретатель слов Word Inventor app, который создает слово из случайных гласных и согласных, чередуя их (полученные слова часто звучат как названия покемонов или каких-то технических стартапов).

In[9]:= vowels = {"a", "e", "i", "o", "u"}; consonants = Complement[CharacterRange["a", "z"], vowels]; Style[StringJoin[Flatten[Table[{RandomChoice[consonants], RandomChoice[vowels]}, {3}]]], 40]

Часы, которые показывают время


За неимением прочего люди, предположительно, захотят пользоваться часами по их прямому назначению. И с тех пор, как мы находимся в современном мире с интернетом — даже в часах теперь не обойтись без пары-тройки котиков. Ниже представлен код Kitty Clock на Wolfram Language:

In[10]:= ClockGauge[Now, PlotTheme -> "Minimal", GaugeMarkers -> {image:graycat, image:orangecat, None}, Background -> Black, TicksStyle -> White]

А на самих часах это выглядит так:

You can has kitty clock...

С этими часами можно получать сумасшедшие вещи. По мотивам нашего недавнего (см. статью на Хабрахабре "3/14/15 9:26:53 Празднование «Дня числа Пи» века, а также рассказ о том, как получить свою очень личную частичку числа пи") и весьма популярного сайта My Pi Day, созданного в честь дня числа Пи, ниже представлен немного более сложный код для часов Пи, в которых текущее время отображается в контексте нахождения этих цифр в числе Пи:

In[11]:= pi = Characters[ToString[N[Pi, 65000]]]; time = Characters[DateString[{"Hour12", "Minute"}]]; pos = First[SequencePosition[pi, time]]; Style[Grid[Partition[Join[Take[pi, 14], Characters["..."], Take[pi, pos - {13, 1}], Style[#, Orange] & /@ Take[pi, pos], Take[pi, pos + {5, 4}]], 10], Spacings -> {0, 0}], 40, Background -> Black, FontColor -> White]

Или добавим ещё немного информации:

And now you can know exactly what digit of pi any time of day begins at

Где Вы находитесь?


Вы можете разрешить отслеживать с помощью GPS ваше текущее местоположение как в Apple Watch, так и на вашем телефоне для того, чтобы узнать Ваше местоположение. Это позволяет очень просто создавать приложения для геолокации Lat-Long app, которые показывают ширину и долготу Вашего местонахождения на часах (этот пример показывает координаты нашей штаб-квартиры):

In[12]:= Style[Column[{DMSString[Latitude[Here], {1, "NS"}], DMSString[Longitude[Here], {1, "EW"}]}], 30, White, Background -> Black]

Я не совсем уверен, что представленная ниже программа может быть чем-то полезной (доказать свое местонахождение через Skype?). Собственно, вот приложение Here & Now QR app, которое показывает Ваши текущие координаты и время в виде QR кода:

In[13]:= BarcodeImage[StringJoin[DMSString[Here], "|", DateString[Now]], "QR"]

Wolfram Language знает о многих вещах, и одна из них — география. Вот код, который позволяет найти 10 ближайших к Вам вулканов:

In[14]:= v = GeoNearest["Volcano", Here, 10]

Если добавить ещё немного кода, то они будут показаны на карте, а затем всё это дело можно собрать в приложение Nearest Volcanoes app:

In[15]:= GeoGraphics[{GeoPath[{Here, #}] & /@ v, GeoMarker[Here], GeoMarker[#, image:volcano-icon] & /@ v}, GeoRange -> 1.5 GeoDistance[Here, First[v]]]

Вот код приложения 3D Topography app, которое показывает трёхмерную масштабированную карту в радиусе 10 миль относительно Вашего местоположения:

In[16]:= ListPlot3D[GeoElevationData[GeoDisk[Here, Quantity[10, "Miles"]]], MeshFunctions -> {#3 &}, Mesh -> 30, Background -> Black, Axes -> False, ViewPoint -> {2, 0, 3}]

Данные, поступающие на устройство


Как только мы наладили связь с Wolfram Cloud, у нас появилась возможность использовать данные в реальном времени, которые содержатся в Wolfram Knowledgebase. Среди прочего, там есть данные о текущей позиции (x,y,z,t) Международной Космической Станции:

In[17]:= entity:International Space Station (satellite) ["Position"]

Учитывая мое местоположение и используя немного графики в Wolfram Language, можно создать МКС-локатор ISS Locator app:

In[18]:= Module[{pos, line, rise}, {pos, line, rise} = SatelliteData[entity:International Space Station (satellite), {"Position", "SatelliteLocationLine", "RiseTime"}]; Style[Labeled[GeoGraphics[{{Pink, AbsoluteThickness[3], GeoPath @@ line}, {Red, PointSize[.04], Point[pos]}, {Opacity[.1], Black, GeoVisibleRegion[pos]}}, GeoGridLines -> Automatic, GeoCenter -> pos, GeoRange -> "World", GeoProjection -> "Orthographic", ImageSize -> {272, 340 - 38}], Style[TemplateApply["Next rise: ``", NumberForm[ UnitConvert[DateDifference[Now, rise], "Minutes"], 3]], White, 20]], Background -> Black]]

В качестве другого примера использования данных реального времени, можно привести код приложения Apple Quanting app, которое выдает курс акций Apple:

In[19]:= Style[TradingChart[{"AAPL", DatePlus[-90]}, {"Volume", Style["MESASineWave", {RGBColor[1, 1, 1], RGBColor[0.46, 0.62, 0.8200000000000001]}], Style["BollingerBands", RGBColor[1, 1, 1]], Style["DoubleExponentialMovingAverage", RGBColor[1, 0.85, 0.21]]}, PerformanceGoal -> "Speed", Axes -> False, Frame -> False], Background -> Black]

Ниже приведён код приложения Market Word Cloud app, которое показывает символьное обозначение акций компании, размер которых задается согласно изменениям в цене за предыдущий день (сегодня курс акций Apple вырос, а курс акций Google упал):

In[20]:= WordCloud[With[{c = FinancialData[#, "FractionalChange"]}, Abs[c] -> Style[#, ColorData[{"RedGreenSplit", 0.01 {-1, 1}}, c]]] & /@ {"AAPL", "XOM", "GOOG", "MSFT", "BRK-A", "WFC", "JNJ", "GE", "WMT", "JPM"}, Background -> Black]

Ниже представлен полный код конвертации валют с учетом вашего текущего местоположения Currency Converter app/a>:

In[21]:= With[{home = $GeoLocationCountry["CurrencyUnit"]}, Style[QuantityForm[Grid[{#, "=", CurrencyConvert[#, home]} & /@ Cases[{Quantity[1, "USDollars"], Quantity[1, "Euros"], Quantity[1, "Yen"], Quantity[1, "BritishPounds"]}, Except[home]], Alignment -> Left], "Abbreviation"], White, Background -> Black, 30]]

С Wolfram Language совсем не сложно создавать самые разнообразные приложения. Вот код для приложения
Sunrise/Sunset app, отображающего информацию о закате и рассвете там, где вы находитесь:

In[22]:= {Sunrise[], Sunset[]}

Настройка более удобного отображения для часов требует чуть больше кода:

In[23]:= With[{sunfmt = Style[DateString[#, {#2, " ", "Hour12Short", ":", "Minute", "AMPMLowerCase"}], 54] &, tfmt = Round[DateDifference[Now, #, {"Hour", "Minute"}], 5] &}, Rasterize@Style[Column[{sunfmt[Sunrise[], "rise"], tfmt[Sunrise[]], sunfmt[Sunset[], "set"], tfmt[Sunset[]]}, Alignment -> Right], FontSize -> 32, Background -> Black, White]]

Wolfram Language содержит данные о погоде, получаемыми в режиме реального времени:

In[24]:= AirTemperatureData[]

Которые мы можем отображать в виде красивых встроенных иконок:

In[25]:= IconData["AirTemperature", AirTemperatureData[]]

Вот данные о температуре за последнюю неделю:

In[26]:= AirTemperatureData[Here, {Now - Quantity[1, "Weeks"], Now}]

А если добавить немного кода, мы сможем представить это в виде приложения с графиком изменения температуры Temperature History app:

In[27]:= With[{temps = DeleteMissing[AirTemperatureData[Here, {Now - Quantity[1, "Weeks"], Now}]["Values"]]}, QuantityForm[Style[Column[{Grid[{{"Current", Last[temps]},{"High", Max[temps]}, {"Low", Min[temps]}}, Alignment -> {{Right, Left}}], ListLinePlot[temps, ImageSize -> 312, PlotStyle -> None, Filling -> Bottom, FillingStyle -> Automatic, ColorFunction -> Function[{x, y}, Blend[{RGBColor[0.45, 0.72, 0], RGBColor[1, 0.85, 0]}, y]], PlotTheme -> "NoAxes"]}, Alignment -> Right], Background -> Black, 24, White], "Abbreviation"]]

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

Wolfram|Alpha recognizes your location, knows the current UV index there, and computes how long you could safely stay out in the sun depending on your skin type

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

In[28]:= times = Style[QuantityForm[#, {}], 24, White, FontFamily -> "Source Sans Pro"] & /@ Rest[WolframAlpha["sunburn time", {{"TypicalTimeToSunburn", 1}, "ComputableData"}][[All, 2]]]; In[29]:= Panel[Grid[Transpose[{{image:skintonesI, image:skintonesII, image:skintonesIII, image:skintonesIV, image:skintonesV, image:skintonesVI}, times}], Dividers -> {False, Center}, FrameStyle -> Gray, Spacings -> 5, Alignment -> {Center, Center}], Background -> Black]

Отчёты и загрузка данных


Wolfram Language имеет доступ не только к потокам данных из своих источников, но и к приватным; в частности — к данным из Wolfram Data Drop (см. статью на Хабрахабре "Wolfram Data Drop — новый сервис Wolfram Research")

Как любитель сбора и анализа личных данных, я сделал databin в Wolfram Data Drop, который сообщает мне количество необработанных и непрочитанных сообщений электронной почты. Я создал запланированное задание, которое запускается в облаке и создаёт отчёт о моих непрочитанных сообщениях. Создадим теперь приложение SW Email Backlog app, которое по требованию будет отправлять этот отчёт и отображать его на часах:

Lighter orange is total number of messages; darker orange is unread messages...

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

Теперь повсеместно можно встретить databin'ы Wolfram Data Drop и, конечно же, Вы можете сделать свой собственный. Из любого databin можно сразу сделать приложение для часов с панелью для вывода информации. Как, к примеру, приложение Company Fridge app, которое получает информацию от маленького термодатчика, который находится в холодильнике в нашей штаб-квартире (цикличность графика вызвана работой компрессора, а пики соответствуют открытию холодильника):

In[30]:= DateListPlot[Databin["4r4-gP4o", -300, "temp"], PlotStyle -> RGBColor[0, 0.501961, 1], Background -> Black, DateTicksFormat -> {"Hour12Short", "AMPMLowerCase"}, FrameStyle -> Directive[Black, FontColor -> White, 18], FrameLabel -> Automatic, TargetUnits -> Quantity[1, "DegreesFahrenheitDifference"], AspectRatio -> 1.11, ImageSize -> 312]["temp"]

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

В качестве простого примера давайте сделаем приложение, который просто показывает, где в мире запускалась это приложение. Вот полный код готового к выгрузке приложения Data Droplets app:

In[31]:= CloudDeploy[Delayed[With[{db = Databin[DatabinAdd["4rwD7T5G", 0], -20]["GeoLocations"]}, GeoGraphics[{Red, PointSize[.02], MapThread[{Opacity[#], Point[#2]} &, {Subdivide[0.15, 1, Length[db] - 1], db}]}, GeoRange -> All, GeoProjection -> "LambertAzimuthal", Background -> Black, PlotLabel -> Style["Recent Data Droplets", White, 24]]], "PNG"], "WatchApps/DataDroplets"]

Это приложение делает две вещи. Во-первых, когда оно запущено, оно добавляет местонахождение устройства, на котором запущено приложение, в центральный databin в Wolfram Data Drop. А во-вторых, оно отображает карту мира с метками 20 последних мест, из которых было запущено приложение:

Data Droplets app on the watch--just touch the screen...

Претворяя в жизнь приложение


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

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

In[32]:= CloudDeploy[Delayed[SendMail[GeoGraphics[{Opacity[.4, Red], PointSize[.05], Point[Here]}, GeoRange -> Quantity[1, "Miles"]]]; Style["Sent!", 200], "PNG"], "WatchApps/MailMyLocation", IconRules -> image:maillocationicon]

Email sent by the MailMyLocation app--log where you've been, share your location, remember where you parked...

Приложения для создания других приложений


До этого времени все приложения, о которых мы говорили, были созданы из фиксированных фрагментов кода на Wolfram Language, которые были развёрнуты на Apple Watch. Однако Wolfram Language является символьным языком, поэтому манипулировать кодом приложения так же просто, как и любыми другими данными. А это значит, что использовать Wolfram Language для создания и развертывания приложений на лету будет очень просто.

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

Ниже мы введем дату рождения в стандартное для Wolfram Language “умное поле”, которое работает с любыми форматами дат:

Run the generator app on your phone and enter your birthday...

И как только мы нажмём кнопку Submit (Отправить), это приложение запустит код на Wolfram Language в Wolfram Cloud, который сгенерирует новое приложение с указанной нами ранее датой, а потом это приложение будет развёрнуто и запущено уже на наших часах

...And it deploys the generated app to the watch, ready to run

Ниже представлен полный код, который требуется для создания приложения Birthday Countdown app, которое генерирует новые, кастомизированные, приложения.

In[33]:= CloudDeploy[FormFunction[{"Birthday" -> "Date"}, (CloudDeploy[Delayed[ExpressionCell[With[{count = Floor[UnitConvert[Mod[# - Today, ="1 yr"], "Day"]] &}, Style[Framed[Pane[QuantityForm[count[#Birthday], "Abbreviation"], {250, 250}, Alignment -> Center], RoundingRadius -> 50, FrameStyle -> Thick], 40, Hue[.52]]], Background -> Black], "PNG"], "WatchApps/BirthdayCountdown", IconRules -> image:cakeicon]; Style["BirthdayCountdown app generated & deployed", Larger, Background -> LightYellow]) &, "PNG"], "WatchApps/CountdownGenerator", IconRules -> image:cakeandgearicon]

А тут представлен результат работы сгенерированного приложения для обратного отсчета до моего дня рождения:

As of this writing, there are 123 days until my next birthday. How many days until your own?

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

Enter a list of cities on your phone, and get an array of clocks for them

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

In[34]:= CloudDeploy[FormFunction[{"image" -> "Image"}, (With[{hand = ImageRotate[ImagePad[ImageResize[#image, 100, Resampling -> "Gaussian"], {{0, 0}, {50, 0}}], -Pi/2]}, CloudDeploy[Delayed[ClockGauge[Now, PlotTheme -> "Minimal", GaugeMarkers -> {hand, hand, None}, Background -> Black, TicksStyle -> White, ImageSize -> 312], "PNG"], "WatchApps/YouClock", IconRules -> "YouClock"]]; Style["YouClock app deployed", 50]) &, "PNG"], "WatchApps/YouClockGenerator", IconRules -> "YCG"]

And here I am as the hands of a clock

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

Больше, чем я ожидал


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

Я рад сказать, что всё прошло намного лучше, чем я ожидал. Apple Watch появились совсем недавно, так что были некоторые вопросы по развёртыванию на них приложений, однако они решились весьма быстро. Но стало ясно, что множество хороших приложений для Apple Watch, могут быть созданы даже с небольшим количеством кода на языке Wolfram Language (tweet-a-watch-app? см. статью на Хабрахабре "Компания Wolfram Research открыла сервис Tweet-a-Program: интересных программ на языке Wolfram Language, длина которых не превышает 140 символов"). При этом, меня весьма впечатлил тот факт, что менее, чем за один день работы, мне удалось разработать 25 полноценных приложений.

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

Весьма здорово — программировать на Wolfram Language и наблюдать результаты того, что получилось — как в случае написания приложений для Apple Watch. Но в конечном итоге более важно то, насколько всё это удобно для реализации множества различных целей и идей. Код, представленный тут, является хорошим подспорьем для того, чтобы во всём разобраться. Есть множество направлений для деятельности. Можно создать множество полезных, да и просто забавных приложений. Важно то, что Wolfram Language позволяет создавать приложения для Apple Watch так легко, что это может превратиться в повседневную текучку — вот и ещё одно место, куда может быть привнесена функциональность Wolfram Language.

Комментарии (17)


  1. MAGNUS8
    03.05.2015 22:02

    Wolfram в очередной раз удивил — буквально пара строк кода и небольшое полезное приложение готово! Записал себе в таск-лист поизучать эту штуку.

    Роман, если позволите, несколько вопросов:
    1) Откуда Wolfram берет картографические данные? Я сравнил карты — вроде не с Bing/Google/Yandex.
    2) Когда планируется запуск Data Science Platform и Discovery Platform (и Finance Platform)?


    1. OsipovRoman Автор
      03.05.2015 22:34

      1) Сами карты основаны на OpenStreetMap, но весь функционал — разработка Wolfram Research.
      2) Finance Platform уже выпущена довольно давно. Про Data Science Platform и Discovery Platform пока что нельзя сказать точно. В этом году, безусловно, релиз должен быть. Произойдет он, по-видимому, сразу после перехода Wolfram Cloud из бета-версии в продакшн.


  1. Kanick
    04.05.2015 00:23
    +3

    Все это, конечно, круто и недооценено. У Вольфрама впечатляет портируемость стандартов: приложения для часов — а вот они в браузере. Хотя сайт в силу своей навороченности страдает глючностью — в моем Хроме страница www.wolframcloud.com/objects/c9576832-bd9a-4dd8-a9ed-7e8cccdf2b9a отображается косо-криво.

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

    И вообще все эти вылазки Wolfram как бы навстречу конечному пользователю выглядят вяло. Сухонько как-то. Хочется сказать — продолжайте и дальше продавать свой sophisticated stuff технологическим компаниям.

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

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

    В посте «Компания Wolfram Research открыла сервис Tweet-a-Program» 8-месячной давности Вольфрам предвкушал:

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


  1. Serg2DFX
    04.05.2015 01:02

    Идеальный DSL (предметно ориентированный язык).
    Интересно, можно ли использовать Wolfram Language как встраиваемый язык в приложение?


    1. OsipovRoman Автор
      04.05.2015 12:49

      Я бы не согласился, что Wolfram Language относится только к DSL. Это язык общего назначения, который также покрывает огромное количество предметных областей. В языке Wolfram Language выделяют Базовый подъязык — на основе него строятся все остальные подъязыки, скажем, Геометрический подъязык, Графический подъязык и пр. Но все подъязыки образуют цельный и отлаженный язык.

      Что касается встраивания. Тут есть много возможностей. Можно обращаться к ядру Wolfram через MathLink, можно использовать интеграцию с C, Java, R, Matlab. А можно встраивать любые коды в практически любое приложение через API (APIFunction), EmbedCode с помощью Wolfram Cloud.


  1. opckSheff
    04.05.2015 11:50

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

    Grid[
    {{InputField[Dynamic[name], String],
    Button[«Press», Print[«My name is », name, "!"]]}}]


    1. OsipovRoman Автор
      04.05.2015 12:50

      Для этих целей служит, по сути, FormFunction.


  1. chersanya
    04.05.2015 13:41

    А почему код в математике обычно оформляется «как попало», без адекватного style guide? Здесь тоже, например:
    image
    Отступы, переносы строк, структура — всё без видимой логики. И не только здесь, на хабре, но и почти везде где замечал код на Mathematica. В других языках как-то принято более аккуратно и понятно писать, пусть это и займёт в два раза больше строк. Особенно, кстати, это важно как раз для таких туториалов, которые рассчитаны на незнакомого с языком человека — очень сложно понять, что конкретно тут происходит, хотя я пару лет назад немного смотрел Mathematica.

    Ну и, опять же по сравнению с другими языками, много что выглядит не логично. Названия функций, Mod[a, b] вместо a % b, смесь из знаков равенства, двух видов стрелок ("->" и односимвольных) — в чём между ними разница, не ясно. Зачем было делать язык настолько сильно отличающимся от привычных всем?

    Ещё не понятно, работают ли такие приложения без интернета?


    1. OsipovRoman Автор
      04.05.2015 14:05

      Я могу говорить лично за себя и многих моих знакомых, но код читается легко. Для тех, кто привык к Python, скажем, код будет читать по-началу действительно не просто. Однако, для тех, кто хочет «структурированный» код, можно делать и такой в ячейках со стилем Code, а не Input.

      Концепция и устройство языка мне представляется на самом деле самым логичным из всех. Все структуры языка представляют собой символьные выражения, абсолютно все является функциональной конструкцией, скажем, тоже выражение a+b в полной форме будет иметь вид Plus[a,b]. Сам документ также является функциональной конструкцией, на самом деле, базирующейся на основе связки, в основном, Cell + Notebook.

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

      Думаю, вам будет полезно посмотреть видео (а также другие, приведенные на странице habrahabr.ru/company/wolfram/blog/244451):



      Что касается приложений, основанных на Wolfram Cloud, естественно, без интернета они работать не будут. Однако, можно сделать их standalone версию на основе Mathematica и CDF Player.


      1. blackstrip
        04.05.2015 15:54
        -1

        Дожили, без интернета проги не пашут) Кому они нужны тогда, если они лезут в очередной cloud чтоб там что-то делать, чтоб банально выбрать одну из двух картинок сторон монетки (сгенерить рандомное число и показать одну из картинок). Это получается «из пушки по воробьям».


        1. OsipovRoman Автор
          04.05.2015 16:07

          Вы прочили мой ответ?

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


      1. LeonidShifrin
        07.05.2015 06:01

        "Wolfram Language на самом деле один из самых старых языков программирования и поэтому он имеет свой собственный вид с минимумом сторонних влияний" — Роман, это заблуждение. WL — достаточно молодой язык, существенно моложе многих (Fortran, Lisp, C, APL, SmallTalk, etc), и он безусловно был создан под влиянием идей по крайней мере Lisp, APL, Fortran и C.


      1. LeonidShifrin
        07.05.2015 06:20

        "Большинству людей, как показывает опыт Русскоязычной поддержки, после детального знакомства с Wolfram Language, обычно как раз другие языки программирования кажутся странно и нелогично устроенными." Проблема в том, что для того, чтобы такое суждение было обоснованным, требуется не менее детальное знакомство с внутренним устройством тех других языков, плюс серьезный общий опыт решения различных задач программирования в разных языках. Очень многие языки программирования имеют превосходный дизайн (навскидку — С, Scheme, Python, Haskell, и др.). Некоторые внешние странности других объясняются их определенной «заточенностью» и областью применения.

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


    1. OsipovRoman Автор
      04.05.2015 14:25

      В дополнение напишу некоторые принципы языка Wolfram Language:
      1) Все встроенные функции называются в соответствии с тем, что они делают в виде одного слова или устоявшейся фразы на английском языке.
      2) Все встроенные функции начинаются с большой буквы.
      3) В языке действует несколько типов скобок:
      { } — списки — коллекции объектов,
      [ ] — аргументы функций записываются в квадратных скобках через запятую,
      [[ ]] — двойные квадратные скобки — для выделения элемента списка или ассоциации
      <| |> — ассоциации — встроенный формат баз данных в Wolfram Language на основе связки с Dataset.
      4) Десятичная часть от дробной отделяется точкой.
      5) Все числа, введенные с точкой по умолчанию имеют машинную точность.
      6) Система по умолчанию старается решать любую задачу с абсолютной точностью (символьно).
      7) Wolfram Labguage может решать задачи с любой точностью.
      8) В большинстве функций реализован принцип максимальной автоматизации (NDSolve, Integrate, Manipulate, Classify и т. д.)
      9) Любое выражение символьно. Все выражения представляют собой функции.
      10) Система имеет минимум сайд-эффектов (за исключением отдельных функций), по умолчанию просто производя модификации над выражениями, не меняя их самих.
      11) Система производит вычисления базируясь на правилах замены, которые в короткой форме имеют вид -> или отсроченных правилах замены :>.
      12) Все функции и их опции максимально стандартизованы и подогнаны под общий стандарт Wolfram Language, что делает язык очень цельным.


    1. LeonidShifrin
      07.05.2015 04:43

      Re: «почему оформляется как попало» — Вы просто вероятно не видели много профессионально написанного кода в Mathematica / WL. Я не претендую на истину в последней инстанции, но можете глянуть, например:

      LazyTuples

      или

      CodeFormatter

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

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

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

      Разработка больших приложений на Wolfram Mathematica / WL

      я в частности говорил об этих моментах (гранулярность кода).

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


    1. LeonidShifrin
      07.05.2015 05:02

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

      Programmatic formatting for Mathematica code — possible?


    1. LeonidShifrin
      07.05.2015 05:44

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

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

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

      Если вернуться к программированию, но начать смотреть на менее известные в mainstream (хотя это сейчас меняется) языки, в частности функциональные языки программирования — то Вы увидите, что у Mathematica с ними весьма много общего (возьмите например диалекты Lisp). Это не случайно. Абстракции, предоставляемые функциональными языками — и в частности, возможности метапрограммирования — не что иное, как средства автоматизации труда самого программиста (помимо средств имплементации). Более «привычные» языки не позволяют автоматизировать повторяющиеся действия самого программиста дальше определенного уровня, поэтому появляются монстры вроде шаблонов проектирования, Generics и иже с ними.

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

      Что тут можно ответить — наверно, каждому свое. Mathematica, как и Lisp, дает в руки программиста дополнительные мощные возможности писать программы по-другому, быстрее и продуктивнее, и получать код лучшего качества. Они платят за это своей некоторой «необычностью». Вы можете либо оценить эти новые возможности и научиться ими пользоваться, либо отмести их как несущественные для Вас и пользоваться тем арсеналом, к которому Вы привыкли. Думаю, это выбор глубоко индивидуален и тут нет единого правильного ответа. Кроме того, это зависит еще и от поставленных задач. Лично я предпочитаю функциональные языки (хотя работаю на всяких, включая C, Python, js, Java, Mathematica и еще несколько).