Обдурити Мігеля?

  
Якось раз Мігель…
  (Хоча ні, історія не зовсім про нього, спробую почати інакше)
Одного разу у світі 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 і може запускатися на будь-якому комп'ютері. Також проект підписується потрібними сертифікатами, забезпечується Enlistments, настройками 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. Всім комментирующим в ключі «бридке пірат відбирає гроші у шанованої людини» раджу не витрачати даремно нерви і не підвищувати ентропію світовій мережі.
 
  
Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.