29 March 2014

Обмануть Мигеля?

Website developmentMono & MoonlightXamarin

Как-то раз Мигель…
(Хотя нет, история не совсем о нем, попробую начать иначе)
Однажды в мире Open Source…
(Тоже мимо, OSS в истории затронуто лишь частично)
Когда жажду наживы называют здравым смыслом, начинается обман.
(Почти афоризм)

Предыстория

Стукнуло мне в голову написать программу под Мак на C#. Я поблагодарил Мигеля де Икасу за отличный Open Source проект Mono, воздал хвалу за его же библиотеку MonoMac, чуть ругнулся на сыроватый MonoDevelop и принялся за работу. Через некое время был оплачен аккаунт в AppStore, программа была в шаге от завершения, когда начался большой проект по основной работе и ее пришлось отложить. И вот через год пришло сообщение, что пустующий аккаунт в AppStore будет закрыт через 30 дней — это был знак, что надо что-то делать. MonoDevelop, обновившийся сам до Xamarin Studio, предложил сразу проект MonoMac преобразовать в Xamarin.Mac и повел меня на сайт, где было предложено купить этот самый Xamarin.Mac всего за $999, иначе деплоймент в AppStore будет невозможен.

Сказать по правде, я был несколько ошарашен — начиная хобби-разработку в бесплатном продукте я и думать не мог об оплате тысячи долларов за возможность публикации, пусть и рассчитывал заработать на пиво. Даже больше — я смутно помнил посты и истории успеха на StackOverflow о публикации в маркете, каком-то пекеджере и пр. Но все нужные галочки в Xamarin Studio были намертво отключены и требовали покупки полной версии продукта. Тут я и понял, что где-то меня обманули, или выражаясь современным языком, изменили стратегию распространения продукта так, что премиум услуга публикации в маркет стала платной.

Все в своем праве

Если смотреть на отношения мои и Xamarin в лице Мигеля, то никто никого не обманывал — разработчик в праве делать со своим продуктом что-угодно, тем более менять лицензии или предоставлять премиум услуги за отдельные деньги. В случае Xamarin.Mac это услуга статической линковки с библиотеками Mono, в ходе чего программа перестает быть зависимой от Mono Runtime и может запускаться на любом компьютере. Также проект подписывается нужными сертификатами, снабжается Entitlements, настройками Sandboxing и пр. требованиями для публикации в AppStore:
As of December 12th 2012, Xamarin now offers a superset of MonoMac called Xamarin.Mac. It features broader API coverage, a commercial license for Mono's LGPL components, Mono embedding, license to publish to the Mac AppStore and support.

Сам Mono Runtime тоже распространяется по лицензии GNU Library GPL 2.0 , в которой вопрос статической линковки остается довольно спорным. Если опустить хитросплетение терминов, то выпуская проприетарный продукт, слинкованный с LGPL библиотекой, разработчик должен еще и дать возможность заменить эту LGPL библиотеку на другую версию. Обычно это подразумевает, что вместе с программой надо поставлять и исходный код, либо использовать другую лицензию. Сайт Xamarin придерживается того же мнения:
Or if you ship an application that requires to statically link the Mono runtime and you are not able to provide the object code to relink Mono, you must obtain a commercial license from Xamarin.


Обман

Меньше всего в жизни мне хотелось кого-либо обманывать, тем более такого уважаемого человека, как Мигель де Икаса, автора Gnome, Mono, основателя Xamarin и Ximian. Но по большому счету я уверен, что его маркетологи сделав продукт платным (и как по мне, непомерно платным), уже меня обманули прикрывшись буквой закона и нарушив его дух. Потому это же право я оставил за собой, формально ничего не нарушив, но в результате опубликовав свою программу в AppStore с бесплатной версией инструментария. Программа содержит кроме всего прочего .exe файл с .NET Bytecode и нужными библиотеками, который может быть выполнен с помощью актуальной .NET Framework и Mono Runtime, а также абсолютно достаточен для статической линковки c библиотеками Mono, AOT компиляции или других действий. Но лицензия LGPL не обязывает меня писать инструкцию для конечного пользователя, как это сделать (не говоря о том, что я и сам этого не знаю), только предоставить все необходимое для этого.


Технические нюансы

Мой MonoDevelop сам обновился до Xamarin Studio и создание .pkg пакетов там теперь заблокировано. Также на странице MonoMacPackager пропала инструкция по созданию пакетов и появились ссылки на Xamarin.Mac. Это неприятно, но не смертельно, ведь в природе есть и архивы, и более старые версии продукта. Я скачал MonoDevelop 3.0.6, адаптировал проект под него (пришлось убрать один несовместимый вызов API), выбрал параметр «Link All» и… так и не смог нормально откомпилировать программу. Сказать по правде, причины я не понял, упаковщик просто отказывается работать с разными версиями Mono Runtime, выдает ошибку линковки и дальше не проходит. Но все же, выбрав пункт «Don't link» можно создать проект, он будет на ~8 мегабайт больше, но работать будет без особых проблем. В проект при этом включаются полные версии сборок System.*.dll, а не только мета-данные, как было бы с «Link All» режимом. В моем случае это даже плюс, потому что такое же правило относится и к основному .exe проекта — в нем остается весь байткод.

Полученный таким образом инсталлятор отлично запускается, устанавливает продукт, но затем программа отказывается стартовать. Исследование гугла и системного лога показало, что Mono Develop включает в программу неверные Entitlements — keychain-access-groups, которые не совместимы с версией ОС 10.8, а может и вообще не валидны. Эта проблема решена в Xamarin.Mac, но я ведь пошел тернистым путем, потому решать ее тоже должен был сам. В результате я остановился на варианте выполнения post-build скрипта, который применяет корректные данные к сборке и заново подписывает ее.
Версия была отправлена в AppStore, но тут же вернулась с сообщениями о других проблемах с Entitlements, отсутствием подписи у файла libMonoPosixHelper.dylib, а заодно не разрешенном использовании Shared Memory. Первое решилось дополнительными правками plist файла, второе — доработкой post-build скрипта, а вот третья проблема поставила меня в тупик. Информация о проблеме была на Stackoverflow, но там говорилось, что она уже исправлена, а вообще решается установкой переменной окружения MONO_DISABLE_SHARED_AREA. Идея с переменной вполне хороша, но ставить-то ее надо не на этапе компиляции, а на этапе выполнения уже на компьютере клиента. Я не знаю, как это решается в Xamarin.Mac, но сам решил добавлением ключа в файл info.plist, который и ставит эту переменную при запуске программы:
    <key>LSEnvironment</key>
    <dict>
        <key>MONO_DISABLE_SHARED_AREA</key>
        <string>1</string>
    </dict>

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


Эпилог

Программа сейчас в маркете и честно приносит свои 1 доллар и 40 центов в день. Если ничего не изменится, то через 713 дней я смогу купить полную версию Xamarin.Mac, без учета платы за сам AppStore. Мигелю я написал в Твиттер об этой ситуации, но ответа не получил. Другому вопрошающему по этому же вопросу он ответил в ключе «пользуйтесь», но лучше купите Xamarin.Mac.
Скрытый текст

Тем временем мне ответили ребята из саппорта Xamarin, что как постоянный клиент Xamarin.iOS и действующий студент я могу купить продукт всего за $99. Это хорошее предложение и наверняка я на него соглашусь, пусть и не совсем солидарен с позицией компании.

P.S. Всем комментирующим в ключе «гадкий пират отбирает деньги у уважаемого человека» советую не тратить зря нервы и не повышать энтропию мировой сети.
Tags:monomonomacxamarinmac os xmiguel de icazaпиратствоapp store
Hubs: Website development Mono & Moonlight Xamarin
+88
39.1k 58
Comments 50
Popular right now
Старший SQL-разработчик / Senior SQL Developer
from 80,000 to 180,000 ₽iCertaintyСамараRemote job
Senior Frontend (React) Developer REMOTE
from 2,000 to 3,500 €AppFollowRemote job
Системный администратор в офис
from 80,000 to 120,000 ₽MindboxМосква
Senior iOS Developer
from 200,000 to 300,000 ₽AlfacashRemote job
Top of the last 24 hours