Сервис позволяет расшарить буфер обмена между компьютерами и/или 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 позволяет описать структуру С++ проекта и собирать его на различных платформах. Вот такая получилась
PS Про стек серверных технологий я рассказал здесь.
Комментарии (15)
denismaster
16.03.2016 20:12А что такого нетривиального и сложного в установке mono под OS X?)
outcoldman
16.03.2016 20:28+1Меня часто это останавливало от скачивания приложений. Точнее даже так — меня это всегда останавливало.
И тут не дело именно в Mono. Все что требует от меня скачать еще Java/QT/X11 или еще что-то — часто находились альтернативы работающие без них, либо в терминале.
Vankir
16.03.2016 22:34+1для программиста ничего нетривиального, но для простого пользователя… пугливые они :)
хотя, если честно, то я бы и сам не стал ставить, разве что если уж совсем уникальная и нужная программулина
ShadowsMind
17.03.2016 07:25Я вообще из JVM лагеря (Java/Scala), но по мне они не очень подходят для десктопа. Если надо что-то простое, то Go очень хорошо подойдет — учится за выходные, по перформенсу не отстает от JVM.
Еще можно посмотреть на Rust — тут уже сложне, зато будет так же шустро как на плюсах. Не спроста же Mozilla на нем свой новый движок для браузера пишет (https://github.com/servo/servo).
Daniyar94
17.03.2016 07:25Desktop приложения, да ещё мультиплатфооменное. Я бы выбрал NodeJD
frol
17.03.2016 09:18NodeJS не подошло по самому первому требованию автора: "Небольшая, лёгкая утилита". Ну и да, хватит пихать JS куда ему не свойственно быть впихнутым или, иными словами, перестаньте своим молотком забивать шурупы.
beaverBox
17.03.2016 08:24-2Столько времени затрачено на изучение кроссплатформенных библиотек, что можно было такую простую утилитку в нативе набросать, для каждой платформы.
Beholder
17.03.2016 16:26GTK+ рассматривали?
не каждый пользователь захочет ставить Java ради скаченной из инета программки
Ну если пользователю лень что-то качать, то зачем ему десктопный клиент? Пусть остаётся в браузере.Vankir
17.03.2016 18:30нет, GTK+ не смотрел...
суть программы сводится к тому, чтобы стоял клиент на системе, тогда он автоматом засылает буфер обмена на сервер и дальше на другие клиенты, кроме того показывает уведомления приходящие на телефон. С веб браузером такого удобства не добиться, там постоянно надо держать страницу открытой и что-то нажимать чтобы отправить...
dim_s
Java можно поставлять в виде embedded в отличии от .NET, что не требует установки самой Java. На Linux'e и Windows проверял — работает на ура. В качестве GUI на java можно использовать JavaFX, технология довольно неплохая, есть отличный порт на Android и iOS. Но все равно portable версия будет весить минимум 30-40мб в архиве.
Vankir
спасибо, обязательно поисследую
Nagg
.NET тоже можно и это будет гораздо меньше 30-40мб. К тому же непонятно что имел ввиду автор под портированием дотнет приложения под Мак — WinForms\WPF — невозможно, но можно писать нативный гуй для мака отдельно на C#.
dim_s
Имеется ввиду вот этот проект http://www.gnu.org/software/dotgnu/pnet.html? Из коробки такая возможность в .NET уже появилась? Я давно не вдавался в эту тему.
Nagg
Впервые вижу это. Да, из коробки в CoreCLR.