Математический пакет для Android своими руками

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

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

Постановка проблемы


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

Каких-то особых ограничений не было, за свою научную карьеру я успел попользовать и Mathcad с MATLAB, и Математику, и FEM-системы (Ansys). Поэтому для начала стал смотреть все подряд.

Сложилась такая картина (я не буду приводить ссылки, желающие легко могут найти это на Play-маркете):
  • Matlab Mobile, как расширение лицензионной копии десктопного варианта. У меня таковой дома не оказалось, поэтому этот вариант, к сожалению, отпал;
  • Сервис Wolfram Alpha и туча обучалок от Wolfram Group — не совсем то, что у меня ассоциируется со словами «посчитать самостоятельно»;
  • Клоны «Матлаба» и «Октавы» под Android — уже теплей, но писать код на экране в 5 дюймов не очень-то удобно;
  • Огромное количество научных калькуляторов разной степени навороченности. Их всех объединяет одно — ввод и представление результатов организованы как в классическом (хардверном) графическом калькуляторе. Основной минус такой идеи — это отсутствие «документа», который можно сохранять, изменять и пересчитывать вновь и вновь;
  • Ничего, что походило бы на Маткад, тогда найти не удалось.


Почему я здесь и в начале поста упомянул про Mathcad? На мой взгляд, эта идея хорошо подходит под задачи мобильной математики:
  • На небольшом экране устройства с пальце-ориентированным интерфейсом все-же удобней работать с формулой, если она записана в естественном математическом виде, а не в виде кода на скриптовом языке;
  • Мобильное устройство хорошо подходит для того, чтобы что-то быстро попробовать. Поэтому от мобильной математической системы требуется удобный интерфейс, но не требуется серьезных вычислительных возможностей;
  • В идеале, в такой системе нужна функция «Я пиарюсь». То есть не только быстро записать сложную формулу и построить пару графиков, но и удобно опубликовать это во всех своих социальных сетях. Формулы в естественной математической нотации здесь тоже более удобны, чем скрипт.


То есть я бы с удовольствием установил бы Mathcad mobile на свой смартфон. Но вот его-то (в смысле «Маткада», а не смартфона) на Play-маркете и не оказалось. Отсюда и родилась идея разработать нечто подобное самостоятельно.

Формулировка задачи


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

Требования к приложению я сформулировал так:
  • Максимально широкий охват поддерживаемых устройств. Отсюда минимальный API level 8;
  • Поддержка экранов различных разрешений и ландшафтной/портретной ориентации;
  • Формат хранения документов — свой на основе XML;
  • Подробная документация. Чтобы не плодить сущностей, для документирования используется тот же самый формат, в котором хранятся сами документы;
  • Для создания печатной документации предусмотреть экспорт в LaTeX, так как он удобен для записи формул и дает возможность сгенерировать PDF;
  • Математика безгранична. Все не реализовать. Поэтому начальный функционал включает в себя функции многих переменных, графики (2D и 3D), численное интегрирование и дифференцирование, логический оператор. Далее в зависимости от хотелок пользователей;
  • Возможность вставки текста и изображений, но функционал редактирования текста для начала минимальный;
  • Удобность использования и качество имеют приоритет над функционалом;
  • Языки только те, что знаю сам и смогу развивать и поддерживать без обращения к переводчику.


И, наверное, самое главное. Это — хобби. Поэтому важно оставаться реалистом и не замахиваться на то, что невозможно реализовать одному человеку за разумное время в режиме 5-6 дней в неделю по 2 часа.

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


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


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

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

Метод решения


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

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

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

Начну с компоновки объектов в документе. Вариантов, на самом деле, не очень много:
  • Каждый объект имеет свои координаты и объекты могут располагаться относительно друг друга произвольно, как в векторном графическом редакторе. Именно этот вариант реализован в самом Маткаде. Под Андроидом можно использовать для этого устаревший AbsoluteLayout, но при этом необходимо реализовать выравнивание/распределение объектов и групп объектов. То есть в этом варианте нужен дополнительный пользовательский интерфейс, не относящийся к основной задаче. Для настольного компьютера это не критично, однако юзабилити мобильного приложения, на мой взгляд, от этого будет хуже;
  • Расположение в ячейках таблицы, как в MS Excel. Этот вариант я отмел сразу, так как математический документ — это все что угодно, но только не таблица;
  • Простой список, где каждый объект в своей строке. Именно так устроены большинство научных калькуляторов. Именно это я и реализовал в первой версии приложения. Дешево и сердито. На что получил вполне резонные замечания пользователей, что такой метод очень неудобен, так как есть объективная потребность группировать некоторые формулы по строкам;
  • В результате получилась упрощенная версия RelativeLayout, этакий двумерный список, где по умолчанию объекты добавляются вертикально (снизу выделенного объекта), но с помощью одного единственного окна можно добавить объект как справа, так и слева от выделенного:



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

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

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



В подтверждение этой идеи хочу процитировать отзыв одного из пользователей: «Beeing able to use shortcuts instead of symbolic buttons (but not beeing forced to do so) makes the app perfect».

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



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



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

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



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


Подводные камни


И вот здесь меня поджидала серьезная засада. Де-факто в Андроиде есть ограничение на количество вложенных лайаутов, связанное с размером стека вызова процедур. Компилятор в этом случае ничего не скажет, но во время работы (в методе android.view.View.draw одного из вложенных лайаутов) приложение валится с исключением типа StackOverflowErrors. Подробнее об этом здесь.

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

Экспериментально я подобрал следующие значения предельной глубины, считая от корневого RelativeLayout фрагмента:
  • если API level < 15 (Андроид 2.2.x — 4.0.x), то максимальная глубина составляет 7 вложенных уровней лайоутов;
  • если API level от 15 до 17 (4.1.x — 4.2.x), то 9 уровней;
  • если API level > 17 (4.3.x и выше), то 15 уровней.


Вторая проблема — отсутствие стандартной компоненты, которая бы сочетала в себе горизонтально-вертикальный скроллинг и масштабирование. Эти действия вроде как поддерживаются WebView, но вот сама WebView мне никак не подходит. Решение топорное, но работает — я взял исходники стандартных ScrollView и HorizontalScrollView, объединил их в одну компоненту и прикрутил детектирование и обработку изменения масштаба. Что я при этом так и не смог довести до ума — это корректное позиционирование в документе после изменения масштаба.

Документация и локализация


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





В приложении разделы документации хранятся в XML и открываются как отдельные фреймы. Имеется функция конвертации документа в LaTeX. Утилита pdfletx на рабочем месте довершает дело. Результат не стыдно выставить на всеобщее обозрение.

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

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




То есть Россия, Украина и Казахстан вместе обеспечивают более 40% загрузок. Платная версия дает другую картину: загрузки из России доминируют лишь с незначительным отрывом.

Заключение


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

Что касается ближайших задач, то пока основные пожелания пользователей касаются наращивания экспортных возможностей. К примеру, один из последних комментариев: «Интересует такой вопрос, есть хоть какая нибудь возможность связать документ с маткадом? Что бы была возможность доработать документ на ПК». По поводу Маткада лично я сомневаюсь, так как формат проприетарный, но такие вещи, как экспорт в HTML (буквально сегодня обнаружил фреймворк MathJax), в PDF, или какой-нибудь открытый офисный формат можно реализовать.

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

Ну. И что?
Реклама
Комментарии 26
  • +1
    Есть еще один интересный проект, который, как заверяют нас его разработчики быстрее чем MathJax — khan.github.io/KaTeX(Khan Academy).
    • 0
      Спасибо за ссылку, поизучаю.
    • +2
      Но тут возникает резонный вопрос — а надо ли это на телефоне?

      Считаю что надо. Эти девайсы и телефонами-то называть уже язык не поворачивается
      • +2
        Поддерживаю. По этой причине на своей железке пользуюсь Maxima.
      • +1
        smath.info/cloud

        SMath Studio изначально был для WinCE. Сейчас на Windows и Linux, для Android ждём. Попытка была, но там возникли проблемы.

        Я пишу дополнения к SMath Studio.

        Кстати, mcdx файлы можно распарсить частично. SMath Studio может это делать (импорт и экспорт). Я написал специальное дополнение, чтобы можно было подключать библиотеки пользователя из Mathcad.
        • 0
          Спасибо за информацию, я не знал об этом проекте. А что если нам скооперироваться и добавить в мое приложение экспорт/импорт файлов SMath?

          Насчет формата Mathcad — с технической точки зрения я не сомневаюсь, что его можно пропарсить. Вопрос в правовой плоскости. Ведь если PTC Inc решит, что ее права нарушены, не только приложение, но и аккаунт на Google Play окажутся заблокированными. Понятно, что с сайтом такого риска нет, но с приложением, которое распространяется через американский маркет, не все так просто, на мой взгляд.
          • 0
            Похоже на то, что некоторые проблемы, которые возникли при портировании SMath под Андроид, мне таки удалось решить :-)
            • Да, я обратил внимание, что прогресс есть. На форуме SMath Studio тема про Android находится тут: When version for Android

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

              Спасибо за информацию, я не знал об этом проекте.

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

              Я тоже пока слабо представляю удобство работы на планшете. Пока не видел ничего удобного (у самого iPad 2). Это и была одна из основных проблем для реализации на планшете. Вроде как и хочется, а с другой стороны — как пользоваться? Версия для ПК гораздо более функциональна.
              • 0
                В одном из комментариев ниже я высказал мысль, что «Андроид, начав свое развитие с телефонов, постепенно мигрирует на железо, которое в скором времени может вытеснить ПК из домашнего обихода». Поэтому мне кажется, что приложения «домашней» математики на планшете или телевизоре могут быть востребованы, как минимум школьниками и студентами. Вы правы, сделать такой интерфейс, чтобы было удобно, очень и очень сложно. Именно эту задачу я и пытаюсь порешать — нащупать и поиграться с интерфейсными решениями, которые бы позволили относительно легко оперировать математическими объектами хотя бы на уровне школьного курса, но на сенсорном экране.

                А проект у Вас действительно замечательный, жалко, что раньше его не нашел! Быть может, вместо Андроида присоединился бы к вашей команде.
          • +2
            Респект, конечно, за разработку, но ИМХО пакеты для математической вёрстки с тач-интерфейсом или виртуальной клавиатурой нецелесообразны.
            Скорость ввода по сравнению с клавиатурным вводом не просто ниже — катастрофически ниже. Поэтому по дороге домой или на работу разумнее использовать смарт/планшет для чтения, соцсетей ит.д., а в конце дороги всё равно вас ждёт или док-станция с нормальной клавиатурой, или полноценный ПК.
            • +2
              Согласен, в дороге такой математический функционал не нужен. Хотя можно себе представить, что студентам подобное приложение пригодилось бы для подготовки экзаменационных билетов и их повторение по дороге. Но это из области экзотики.

              На самом деле я думаю так. У меня самого планшет с хардверной клавиатурой, по сути нетбук на Андроиде. Подумываю о покупке Андроид-телевизора, естественно тоже с клавиатурой. То есть мы наблюдаем явление, когда ОС, начав свое развитие с телефонов, постепенно мигрирует на железо, которое в скором времени может вытеснить ПК из домашнего обихода. И вот тут-то подобное мат. обеспечение и может пригодиться, хотя бы для образовательных задач.
              • 0
                Помню в пору института решал задачи в метро с использованием матриц, а их перемножал на своем nokia e70 (symbian) в программе solutions. Было очень удобно.
              • +1
                Затея интересная и обыграно хорошо. У меня тоже первая мысль после покупки нового телефона была: «мать его, у меня и ПК слабее бывали». И тоже решил что-то посчитать, но подошёл к затее иначе, скачал из маркета JSTester и внутри него написал калькулятор как я его называю «мечта школьника» смысл в нем такой: он выдаёт не финальный результат, а все действия производимые с выражением. например: 1+2*3+-3 =
                1+6+-3 =
                7+-3 =
                4
                • 0
                  Я видел на маркете подобные калькуляторы. В принципе, пошаговые вычисления в мой код добавить очень легко, но я не уверен, что это надо. Хотя может именно из-за отсутствия подобной фишки я получаю низкие оценки от пользователей с явно школьным уровнем, судя по другим оцененным ими приложениям?
                  • +1
                    Обычно никому это не надо :) Я писал для развлекухи прямо на телефоне (никому не советую — экранная клавиатура очень не удобна для набора, особенно кода программ) пока в очереди или ещё где-то минутка выдавалась, как разминка для ума
                • +1
                  Посмотрите, как сделан ввод в My Script Calculator, если ещё не видели. Мне кажется, вам может быть интересно.
                  • 0
                    Я его видел, замечательная работа! Но у меня не только арифметика, но и ссылки на другие формулы, интегрирование, дифференцирование, ряды, логические опрераторы. Народ уже попросил простейший цикл добавить. То есть уже довольно много вещей, которые превосходят по сложности рукописный ввод. Хотя идея и реализация этого калькулятора действительно на высоком уровне!
                  • 0
                    Спасибо за работу. Я бы даже поставил, но задач таких уже нету… А жаль.
                    • 0
                      А просто ради экспериментов с кривыми в полярной системе координат и получения эстетического наслаждения от этих кривых :-)?
                    • 0
                      Интересную тему вы подняли. В свое время пользовался MathStudio.
                      • 0
                        Страшно представить сколько времени ушло на реализацию такого интерфейса.
                        • 0
                          В принципе не много, так как Гугл уже проделал всю основную работу в виде очень функциональных выджетов типа LinearLayout, TextView и EditText. Оказалось достаточным просто их немного расширить. Без этих компонент было бы намного сложнее.
                        • 0
                          Xcas Pad (легко гуглится) довольно неплох, кстати. Ввод там текстовый, но отображение команд и результатов сделано в привычном математическом виде. Как по мне, самый удобный вариант. При этом расчёты не численные, а символьные. Может, из его кода Вам что-то пригодится.
                          • +1
                            Спасибо за статью и прекрасный продукт! Маткад на планшете конечно нужен, об этом многие писали (В.Ф.Очков, в частности). Не знаю, появится ли когда-то сам Маткад от РТС на Андроиде или iOs (все же он сильно завязан на Windows).
                            К слову, на днях в Москве будет форум РТС — приходите, если интересно.
                            • 0
                              Спасибо за отзыв. Да, как человек, имеющий за плечами некоторый опыт разработки промышленных систем, в том числе и под Виндовс, я догадываюсь, что с портированием кода Маткада под Андроид не так все тривиально. А жаль, такой продукт под Андроидом действительно нужен. Быть может, через некоторое время я сам попробую связаться с PTC с предложением кооперации, чтобы сделать мое приложение ближе к Маткаду :-) Но пока, я думаю, такой примитив им просто неинтересен. Спасибо за инфу о форуме, но из Бремена до Москвы путь, к сожалению, не близкий.
                            • 0
                              Ах, Вы же в Германии… Кстати, форум РТС — типа глобального тура, 18 марта будет в Берлине, и 3-го что-то в Эссене (в Москве — 24.02). liveexchange.ptc.com. Но серьезно рассчитывать на поддержку я бы не стал, хотя все бывает. Насколько я понял, Вам интересен Интернет вещей — смотрите на РТС, для них это новая тема, которую сейчас активно двигают (ThingWorx).

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

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