Jupyter для .NET. «Как в питоне»

    Несколько месяцев назад Microsoft рассказали о Jupyter в .NET. Но активности по этому топику очень мало, а ведь тема очень интересная. Но что такое прикольное придумать? Я решил сделать удобный вывод класса Entity из библиотеки символьной алгебры:



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

    О Jupyter


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

    О dotnet/interactive


    Этот проект как раз позволяет встроить дотнет в юпитер. То есть вы буквально можете написать

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

    Причем некоторые фишки работают из коробки


    Об AngouriMath


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

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

    Встраиваем латех


    У нас есть возможность зарегистрировать собственный вывод для наших типов, что я и делаю:

    let magic() =
        let register (value : ILatexiseable) = $@"
                <script src='https://polyfill.io/v3/polyfill.min.js?features=es6'></script>
                <script id='MathJax-script' async src='https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-mml-chtml.js'></script>
                \[{value.Latexise()}\]
                "
    
        Formatter.Register<ILatexiseable>(register, "text/html")
    

    (хабр почему-то не поддерживает F#)

    То есть мы просто регистрируем, что тип ILatexiseable должен выводиться в html-формате, а сам код будет генерироваться нашей функцией. Для рендеринга я взял MathJax, хотя наверное имеет смысл кешировать js-скрипт, но это для будущих обновлений.

    Ну и собственно все, теперь все выражения, унаследованные от этого интерфейса, будут красиво рендериться. Вот как это выглядит в C#:



    Что именно тут происходит?
    1. В первом блоке мы вызываем extension-метод ToEntity(), который парсит выражение
    2. Во втором блоке мы создаем систему уравнений и сразу ее выводим
    3. В третьем создается матрица и сразу выводится


    Так как юпитер предзназначен для небольших участков кода, которые не обязаны следовать каким-то проектным требованиям, F# подходит лучше для этого. Поэтому, как это понятно из скриншота в начале статьи, он тоже поддерживается. Для примера, так выглядит решение школьного уравнения:



    Дальнейшие планы


    Я — очень большой любитель .NET-а, но я также очень люблю Jupyter. Поэтому Interactive меня очень порадовал, и я поспешил сделать поддержку Interactive для AngouriMath для вывода выражений в LaTeX. Но дальше — интереснее. Я думаю сделать что-то типа Entity.Plot(), который выводил бы сразу график функции. Для простых use-кейсов очень нужна штука, мне кажется.

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

    Спасибо за внимание! Такая вот короткая заметка.

    Ссылки


    1. Jupyter — удобная браузерная среда для интерактивного программирования
    2. .NET Interactive — та самая гениальная вещь, благодаря которой можно использовать дотнет в юпитере
    3. AngouriMath — математическая библиотека, для которой я написал оболочку для латеха
    4. MyBinder — демка для ленивых

    Комментарии 11

      +2
      О Jupyter
      Это что-то вроде IDE для создания интерактивных блокнотиков

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

        +1
        linqpad

        Только windows :(

          +3
          В линкпаде не получится сохранять результаты, они выводятся в окно типа консоли. Здесь же в результате получится чередование кода и его результатов, которую также можно разбавить текстом с пояснениями — и вот уже готовая презентация, например.
            0
            Это всё здоровому, но мне не хватает что сессия не сохраняется. В универе приходилось работать с GAP(и ныне неподдерживаемой для нее оболочкой GGAP), удобно было что всякие недельные расчеты сохранялись, просчитать на одном пк тяжелые данные, и потом уже быстро можно спокойно пользовать. Без прекручивания баз данных и прочего, здесь и сейчас сразу же из wysiwyg редактора. Или вернуться и поправить и пересчитатается весь набор данных который дальше потом используются.
            Ну может когда нибудь и в Jupyter это завезут.
          0

          Кто пользуется? Чем это удобнее локальной разработки?
          Просто даже визуализировать локальные данные проще (банально цеплянием либ) не говоря уже о разных дампах результатов.

            +2
            Кто пользуется?

            Юпитером — дофига кто, те, кто занимаются исследованиями


            Чем это удобнее локальной разработки?

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


            Просто даже визуализировать локальные данные проще (банально цеплянием либ)

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

            0
            Возможно это выглядит круче, чем в pyton (не знаю как там обстоят дела, примеров нет, утверждение со слов автора), но все равно плохо (и речь не о вкусовых предпочтениях, а о правилах набора и верстки, см. напр. Гиленсон П.Г. Справочник технического и художественного редактора), все перечислять не буду, там «многабукаф», главные проблемы в: отбивках, слипающихся линиях, курсивных греческих буквах.
              +2

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

              –5
              нахе.. зачем?
                +2
                Это круто, но в отличие от старого ядра ICSharp с этим у меня возникли проблемы в TensorFlow.

                Если вкратце, то ядро от Microsoft выполняет каждую команду в случайном потоке, поэтому никакой код, использующий thread local переменные, не работает как ожидается. Пока исправлять они это не хотят :(
                  0

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

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

                Самое читаемое