Опыт разработки свободного приложения для коллекционеров OpenNumismat

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

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

image

Описание


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

Приложение написано на языке Python, для хранения данных используется база данных на SQLite, для интерфейса, доступа к данным и многого другого — PyQt, для генерации отчетов — Jinja2, для построения графиков статистики — Matplotlib. Несмотря на мой первоначальный скепсис этого оказалось достаточно для обеспечения приемлемой производительности — несколько тысяч записей с изображениями обрабатываются без каких-либо заметных тормозов.
Поскольку все компоненты кроссплатформенные, то и OpenNumismat имеет сборки для Windows, Linux (Debian/Ubuntu), macOS.

Так же есть версия для Android, в настоящее время заброшенная. Ей на смену пришло PWA (Progressive Web App), позволяющее просматривать свою коллекцию в любом браузере — используется SQLite.js. Разработать PWA оказалось гораздо легче создания аналогичного по возможностям нативного Android-приложения. Кроме того, оно сразу доступна на всех платформах.

Конкуренты


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

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

Аналогичные возможности предоставляют мобильные приложения (большинство для Android) и веб-сервисы. OpenNumismat больше нацелен на создание каталога своей собственной уникальной коллекции, а не на «закрытие дырок в готовом альбоме», как выражаются некоторые нумизматы.

Но самый главный конкурент — это Microsoft. Подавляющая часть коллекционеров использует Excel не смотря на то, что он плохо работает с изображениями. Так же некоторые используют Access или 1С и создают свою базу данных коллекции со всем что им требуется. Но это все же требует некоторой подготовки.

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

Преимущества открытости


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

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

Используемое окружение


Изначально для распространения OpenNumismat был выбран Google Code, который предоставлял удобный баг-трекинг, мультиязычную вики для документации, загрузку бинарников и конечно git-репозиторий. Но начиная с 2013 Google Code начал умирать. Для переезда выбор стоял между SourceForge и GitHub. Оба сервиса предоставляют возможность создавать сайты проекта (документацию из вики пришлось переделать в статические страницы сайта), но скачивание бинарников с SourceForge выглядит страшновато для неподготовленного пользователя. Поэтому выбор пал на GitHub.

Баг-трекер GitHub требует регистрации, что не так удобно пользователям, далеким от программирования. Поэтому было решено использовать сторонний сервис. Был найден Idea.Informer (Реформал для русскоязычной аудитории) — бесплатный и удобный сервис, но в настоящее время не развивается и это вызывает ряд трудностей (Idea.Informer перестал отсылать письма и не поддерживает SSL).

Изначально OpenNumismat поддерживал английский и русский язык. Но уже через год после первого релиза из Венесуэлы поступило предложение перевести на испанский. Потом появились предложения перевода и на другие языки. Изначально перевод осуществлялся с помощью инструмента Qt Linguist. Для удобства волонтеров сейчас используется онлайн-сервис, предоставляющий удобную инфраструктуру для открытых проектов. В настоящее время OpenNumismat переведен уже на 15 языков.

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

Проблемы версий библиотек


В настоящее время для Windows версии используется PyQt версии 5.5.1. Переход на более свежую версию затруднен заменой Qt WebKit на Qt WebEngine, который до сих пор не умеет делать предпросмотр печатаемых страниц, используемый для работы с отчетами.

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

Также свежие версии Python не поддерживают Windows XP, который еще используется небольшим количеством пользователей.

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

Для сборки под macOS было два варианта: использовать официальную сборку Python с требуемыми пакетами или MacPorts. В первом варианте возникают описанные проблемы с отчетами, так же процесс сборки не удалось полностью настроить, во втором возникли проблемы с Matplotlib, но MacPorts имеет сборку свежей версии PyQt с Qt WebKit. В настоящее время используется вариант с MacPorts.

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

Обратная связь


Отзывы и обратная связь — это самая приятная часть работы. Лучше всего OpenNumismat был принят в испанском сообществе нумизматов. Русские же удивили меня отзывами вроде: «Программа ждет, когда коллекция заполнится максимально, а потом сообщает КУДА НАДО». Видимо опасаются «русских хакеров». Часто приходится оправдываться перед скептиками, которые даже не собираются использовать OpenNumismat — это порой расстраивает.

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

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

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

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

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

Заключение


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

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

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

    +2
    Осталось в графе персонализация вставить графу с адресом, телефоном и время работы
    — гениально!
    Реально программа красивая, простая, нужная! Одобряю все, кроме 6 лет разработки !)
      +3
      Версия для Linux вообще может использовать любую комбинация версий

      Для решения проблем зоопарка версий пакетов не поможет ли virtualenv?
      И соответственно pip freeze > requirements.txt для фиксации версий библиотек, pip install -r requirements.txt для установки?

        +2

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


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

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

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

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

          Место JS — браузер.
            0
            Есть простейшие средства профилирования памяти — например, в Хромовских dev tools можно построить таблицу, на что расходуется память (малопонятную, если честно). Как я понимаю, это приложение из статьи запускается не на долго, не работает постоянно и не обрабатывает большие объемы данных, значит производительности хватит. Я видел, как работает VS Code на не новом компе — очень впечатляет и даже не верится, что это
            HTML.

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

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


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

              PyQt является более лучшим решением, чем DOM в JS.

              Язык программирования, это инструмент, и выбирать его нужно разумно. В данном случае JS не является подходящим выбором. Особенно на фоне уже реализованного.
                0
                Если речь про работу в браузере, то у меня есть PWA-версия как раз на JS. Производительность работы с БД сильно страдает. Есть ли альтернатива SQLite.js чтобы добиться производительности сравнимой с реализацией движка на С/С++?
          +3

          Ещё такой вопрос. У вас там используются


          pyfirebirdsql 0.9.12 (for importing from Numizmat 2.1)
          pyodbc 3.0.10 (for importing from Cabinet 2.0.2.0, 2011 and CoinManage 2011)
          DBISAM ODBC-TRIAL 4.3 (for importing from Cabinet 2.0.2.0, 2011)
          Visual FoxPro ODBC Driver, Microsoft Access Database Engine, Microsoft Access or any other
          software with ODBC {Microsoft Access Driver (*.mdb)} (for importing from CoinManage 2011)

          Они точно необходимы, с учётом того, что в основной программе уже используется QSqlDatabase, который содержит некоторое количество драйверов? Или это не так всё просто, как пишут в документации к Qt?

            +1
            Не понимаю в чем плюс таких программ если есть Numista и Colnect. Единственный плюс, это то, что она оффлайновая, но давайте посмотрим правде в глаза, в наше время интернет есть везде.
            А у онлайн каталога плюсов куда больше:
            1) Все данный хранятся в облаке, не надо с собой таскать свою БД. С любого девайса который имеет доступ в интернет можно получить доступ к своей коллекции.
            2) При добавлении новой монеты не надо вбивать всю инфу, нужно лишь найти монету в каталоге и поставить галочки.
            3) Там же есть куча дополнительных плюшек для коллекционеров: обмены, обсуждения, статистика, много дополнительной инфы о монете, которую вы возможно сами не знаете и т.д. В общем много всего в одном месте.
              +3
              Я далек от нумизматики как от балета… Но да, вынужден признать что в онлайн и облачные хранилища сейчас уходит почти все, кроме может совсем тяжелых приложений типа CAD, а уж табличку-то вывести вообще проблем нет.
                +2
                Мне кажется некоторых людей напрягает, что сервис в любой момент может закрыться и результат их работы тю-тю
                  0
                  Этот момент я упомянул, но все же надо было раскрыть поподробнее. Недостатки Numista и Colnect в следующем:
                  1) у меня на даче и у людей «на копе» интернета почти нет, хотя тут и программа не очень нужна
                  2) в этих каталогах нет и, скорее всего, не будет античных монет и чешуи
                  3) информация о монете представлена не всегда корректно или не в том виде, сложно добавить свою, чтобы было возможно с ней работать
                    0
                    Античных монет это вроде таких? en.numista.com/catalogue/egypt-ancient-1.html
                    Посмотрите на их список древних стран, там много монет имеется: en.numista.com/catalogue/pays.php

                    Не скажу за Colnect, но на Numista нет никаких проблем отредактировать инфу монеты, если есть неточность. Модераторы довольно быстро все «апрувят».
                      0
                      Про Египет не скажу, но найти сходу отечественную денгу не смог (https://auction.conros.ru/lot/2230587/702/0/).
                      А можно на Numista получить весь интерфейс и описания на русском? А можно вывести только медную чешую, отсортировать по весу и распечатать? А с какого потолка берутся цены? А можно использовать для разновидностей штемпелей?
                      Представление в виде таблицы несет в себе массу возможностей, поэтому Excel так популярен.
                      Ну и как Вы сами упомянули, онлайновость несет в себе определенные риски.
                  +4

                  Спасибо, прочитал с интересом.


                  Не уверен, но в статье не увидел ссылок на исходники или хотя-бы на сайт, пришлось искать самому:


                  OpenNumismat


                  source


                  Первое что бросилось в глаза — readMe в txt формате. Перевести в md будет совсем не сложно, а визуально станет намного лучше.


                  Пару вопросов:


                  Почему выбрали GPL-3.0 лицензию?
                  Чем обоснован выбор языка программирования?

                    +1
                    Спасибо за интересный опыт.
                    Так же приходят письма от создателей нумизматических сайтов и электронных каталогов, которые пытаются произвести революцию, но заметных подвижек пока нет.
                    Можно раскрыть подробнее про революцию?
                      0
                      Например, CORPUS NUMMORUM — объединение официальных каталогов, архива аукционов, сайтов вроде Numista.
                      Так же есть работы по распознаванию фотографий монет и прочего антиквариата.
                      +1
                      Автору, расскажите лучше как вы получали бинарник для установки пользователями? Python, matplotlib и пр. хорошо работают из консоли или на сервере, а когда надо получить exe-файл чтобы отдать клиенту — насколько это надежно и стабильно, и каков размер дистрибутива получается? (как я понимаю, в exe упаковывается весь интерпретатор питона целиком?)

                      Я писал бесплатный софт под Linux, но там все проще, пользователи устанавливают пакеты сами (git clone, pip и пр), способ не совсем для массового юзера :)
                        0

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


                        Deploying:
                        Run python setup.py build_exe
                        Compile setup*.iss with Inno Setup
                          0
                          Я использую cx_Freeze для создания .exe и сопутствующих файлов. Иногда ему нужно подкрутить конфиг при задействовании какой-нибудь большой библиотеки.
                          Для инсталляции — Inno Setup. Результат выглядит не отличимо от любого коммерческого софта.
                          Под Linux так же cx_Freeze и его результат упаковываю в deb-пакет.
                          0
                          Сколько времени ушло на разработку приложения?
                            0
                            Чистое время подсчитать не возможно, а разработку начал в 2011.
                            0
                            У меня отец коллекционирует монеты, но у него только Андроид-планшет и эта программа не подойдёт. Хотелось бы ещё, чтобы можно было камерой навести на монету и приложение определяло есть ли эта монета уже в коллекции или ещё нет. Но это наверное нереально сложно сделать.
                              0
                              Спасибо за статью, как раз искал нечто подобное. Может сообщество подскажет подобный софт
                              с подобным функционалом, но с более гибкой настройкой параметров коллекции. Дело в том, что я бы хотел упорядочить свою коллекцию, но это не коллекция монет.
                                0
                                Что может быть гибче софта с открытым кодом?
                                Можно посмотреть на Collection Studio. Но вообще OpenNumismat подходит даже для фиалок, и я сам собираю не монеты.
                                0
                                У всех этих приложений нет главного: автоматического ввода. Сфоткал монету или иной предмет коллекции, она автоматом распозналась, определилась её ценность и при необходимости была внесена в каталог. Думаю с таким приложением не расставались бы работницы касс метрополитена и прочие монетоводы.
                                  0
                                  Не сработает. Я, например, помню, что 2 рубля 1999 года редки и стоят денег. Сколько займет времени взглянуть на монету и узнать ее и сколько займет времени сфотографировать ее? Те кто этим занимаются хорошо знают что именно надо искать и просматривают монеты мгновенно без технических ухищрений.
                                  Это не говоря о том, что в результате получится «пионерская» коллекция малой эстетической и финансовой стоимости.

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

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