Таким вопросом я задался, когда возникла необходимость написать Windows клиента для своего нового сервиса Hyrax.

Сервис позволяет расшарить буфер обмена между компьютерами и/или Android устройствами, а также получать на компьютере все уведомления, приходящие на телефон. Итак, в первую очередь были сформированы требования:



Небольшая, лёгкая утилита, которая работает на любой Windows системе
Размер программки имеет значение, так как распространяться она должна через интернет и, хотя, современные скорости позволяют качать гигабайтные фильмы, гораздо приятнее, когда небольшая тула качается мгновенно. Большое внимание следовало уделить библиотекам, которые способны раздуть любое ‘hello world’ приложение так, что оно будет весить несколько десятков МБ



Возможность портирования на Mac с минимальными усилиями – было вторым требованием
Из-за этого требования пришлось отказаться от наиболее очевидного варианта – использование MS .NET. Программирование на .NET занимает намного меньше времени, позволяет писать простой код и размер программы получается небольшой, потому что .NET Framework уже установлен на Windows. Но, увы… попытка запустить .NET приложение на Mac — занятие хоть и возможное теоретически, но нетривиальное и отпугнет 99% пользователей.



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

Получается, что, если отбросить .NET и Java (не каждый пользователь захочет ставить Java ради скаченной из инета программки) остается только С++. Начались поиски UI библиотек для С++. В свое время мне довелось писать UI и с помощью MFC и с помощью WTL, но, в настоящее время, больше всего на слуху библиотека QT. По отзывам и описанию она всем хороша, но бесплатная версия может использоваться только при динамической линковке, а мне очень хотелось, чтобы это был один единственный лёгкий EXE файл.

В итоге остановился на бесплатной кроссплатформенной open source библиотечке wxWidgets. Во время поисков очень удивлялся, что выбор весьма и весьма ограниченный, а хорошие UI библиотеки для С++ можно пересчитать по пальцам одной руки. Библиотека wxWidget позволяет создавать UI для любой платформы, будь то Windows, Mac или Linux правда выглядеть он при этом будет очень просто и ни в какое сравнение не идет с красотами, которые можно творить с использованием, скажем .NET WPF.
Для общения с сервисом поначалу я стал использовать библиотечки JsonCPP в связке с libcurl, на которой построена известная утилита curl (command line утилита, позволяющая отсылать данные по множеству сетевых протоколов), однако позднее узнал о прекрасной open source библиотеке от Microsoft (да, да, бывают и от них хорошие open source библиотеки) – cpprest (другое название – Casablanca) CppRest позволяет писать код для web service на современном С++, кроме того в ней уже есть поддержка Json, что избавляет от необходимости использовать другие json библиотеки.

Для того, чтобы собирать данный проект независимо от платформы используется CMake. CMake позволяет описать структуру С++ проекта и собирать его на различных платформах. Вот такая получилась солянка сборная, стек библиотек для простой программы облегчающей обмен данными между компами и Android устройствами.

PS Про стек серверных технологий я рассказал здесь.

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


  1. dim_s
    16.03.2016 18:37
    +1

    Java можно поставлять в виде embedded в отличии от .NET, что не требует установки самой Java. На Linux'e и Windows проверял — работает на ура. В качестве GUI на java можно использовать JavaFX, технология довольно неплохая, есть отличный порт на Android и iOS. Но все равно portable версия будет весить минимум 30-40мб в архиве.


    1. Vankir
      16.03.2016 18:40

      спасибо, обязательно поисследую


    1. Nagg
      17.03.2016 23:11
      +1

      .NET тоже можно и это будет гораздо меньше 30-40мб. К тому же непонятно что имел ввиду автор под портированием дотнет приложения под Мак — WinForms\WPF — невозможно, но можно писать нативный гуй для мака отдельно на C#.


      1. dim_s
        18.03.2016 00:25

        Имеется ввиду вот этот проект http://www.gnu.org/software/dotgnu/pnet.html? Из коробки такая возможность в .NET уже появилась? Я давно не вдавался в эту тему.


        1. Nagg
          18.03.2016 03:54

          Впервые вижу это. Да, из коробки в CoreCLR.


  1. beduin01
    16.03.2016 19:24
    +1

    D и Go сгодятся.


  1. denismaster
    16.03.2016 20:12

    А что такого нетривиального и сложного в установке mono под OS X?)


    1. outcoldman
      16.03.2016 20:28
      +1

      Меня часто это останавливало от скачивания приложений. Точнее даже так — меня это всегда останавливало.
      И тут не дело именно в Mono. Все что требует от меня скачать еще Java/QT/X11 или еще что-то — часто находились альтернативы работающие без них, либо в терминале.


    1. Vankir
      16.03.2016 22:34
      +1

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


  1. ShadowsMind
    17.03.2016 07:25

    Я вообще из JVM лагеря (Java/Scala), но по мне они не очень подходят для десктопа. Если надо что-то простое, то Go очень хорошо подойдет — учится за выходные, по перформенсу не отстает от JVM.
    Еще можно посмотреть на Rust — тут уже сложне, зато будет так же шустро как на плюсах. Не спроста же Mozilla на нем свой новый движок для браузера пишет (https://github.com/servo/servo).


  1. Daniyar94
    17.03.2016 07:25

    Desktop приложения, да ещё мультиплатфооменное. Я бы выбрал NodeJD


    1. frol
      17.03.2016 09:18

      NodeJS не подошло по самому первому требованию автора: "Небольшая, лёгкая утилита". Ну и да, хватит пихать JS куда ему не свойственно быть впихнутым или, иными словами, перестаньте своим молотком забивать шурупы.


  1. beaverBox
    17.03.2016 08:24
    -2

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


  1. Beholder
    17.03.2016 16:26

    GTK+ рассматривали?

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


    1. Vankir
      17.03.2016 18:30

      нет, GTK+ не смотрел...

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